diff --git a/.github/workflows/hugo.yaml b/.github/workflows/hugo-external-theme.yaml similarity index 64% rename from .github/workflows/hugo.yaml rename to .github/workflows/hugo-external-theme.yaml index 7d25dfd6..df75ff88 100644 --- a/.github/workflows/hugo.yaml +++ b/.github/workflows/hugo-external-theme.yaml @@ -1,10 +1,11 @@ # Sample workflow for building and deploying a Hugo site to GitHub Pages -name: Deploy Hugo site to Pages +name: Deploy Hugo site to Pages (v2) on: # Runs on pushes targeting the default branch push: branches: + - feature/auto-build - master # Allows you to run this workflow manually from the Actions tab @@ -38,18 +39,31 @@ jobs: run: | wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \ && sudo dpkg -i ${{ runner.temp }}/hugo.deb - - name: Install Dart Sass - run: sudo snap install dart-sass + # - name: Install Dart Sass + # run: sudo snap install dart-sass - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 + + - name: Checkout Theme + uses: actions/checkout@v4 + with: + repository: bemnlam/blowfish-mod.git + ref: 'hugo-new-version' + path: themes/blowfish + + # - name: Debug message + # run: | + # ls -al + # ls -al themes + ## get steps.pages.outputs.base_url - name: Setup Pages id: pages - uses: actions/configure-pages@v3 - - name: Install Node.js dependencies - run: "[[ -f package-lock.json || -f npm-shrinkwrap.json ]] && npm ci || true" + uses: actions/configure-pages@v4 + # - name: Install Node.js dependencies + # run: "[[ -f package-lock.json || -f npm-shrinkwrap.json ]] && npm ci || true" - name: Build with Hugo env: # For maximum backward compatibility with Hugo modules @@ -61,14 +75,17 @@ jobs: --gc \ --minify \ --baseURL "${{ steps.pages.outputs.base_url }}/" \ - --destination public + --contentDir ../content \ + --themesDir ../themes \ + --destination ../public - name: Upload artifact - uses: actions/upload-pages-artifact@v1 + uses: actions/upload-pages-artifact@v3 with: - path: ./blog/public + path: ./public - # Deployment job + # Deployment job (master branch only) deploy: + if: github.ref == 'refs/heads/master' environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} @@ -77,4 +94,4 @@ jobs: steps: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v2 \ No newline at end of file + uses: actions/deploy-pages@v4 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 5ba37ef0..4d3a61f3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,8 @@ drafts public +blog/public +.archived +.themes # General .DS_Store @@ -28,3 +31,7 @@ Icon Network Trash Folder Temporary Items .apdisk + +### keep +!content/.gitkeep +!themes/.gitkeep \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index e6e28c07..e69de29b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,7 +0,0 @@ -[submodule "blog/content"] - path = blog/content - url = https://github.com/bemnlam/blog_posts.git -[submodule "blog/themes/blowfish"] - path = blog/themes/blowfish - url = https://github.com/bemnlam/blowfish-mod.git - branch = main diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..b9a05456 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,13 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "dev", + "type": "node-terminal", + "request": "launch", + "command": "open http://localhost:1313", + "preLaunchTask": "Serve Drafts", + "postDebugTask": "Terminate All Tasks" + } + ] +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 15e2f2eb..69943ffe 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -5,24 +5,45 @@ "label": "Serve Drafts", "type": "shell", "command": "hugo", - "args": ["server", "-D"], + "args": [ + "serve", "-D", + "--source", "blog", + "--contentDir", "../content", + "--themesDir", "../.themes", + "--destination", "../public" + ], "group": { "kind": "build", "isDefault": true }, "isBackground": true, + "problemMatcher": { + "pattern": [ + { + "regexp": ".", + "file": 1, + "location": 2, + "message": 0 + } + ], + "background": { + "activeOnStart": true, + "beginsPattern": ".", + "endsPattern": "Web Server is available at .*" + } + }, "options": { - "cwd": "${workspaceFolder}/blog" + "cwd": "${workspaceFolder}" } }, { - "label": "Launch Mark Text", + "label": "Launch Obsidian", "type": "shell", "command": "open", "args": [ "-a", - "\"Mark Text\"", - "${workspaceFolder}/blog/content/posts", + "\"Obsidian\"", + "${workspaceFolder}/content", "&" ], "group": { @@ -31,7 +52,7 @@ }, "isBackground": true, "options": { - "cwd": "${workspaceFolder}/blog" + "cwd": "${workspaceFolder}" } }, { @@ -62,9 +83,22 @@ "options": { "cwd": "${workspaceFolder}/blog" } + }, + { + "label": "Terminate All Tasks", + "command": "echo ${input:terminate}", + "type": "shell", + "problemMatcher": [] } + ], "inputs": [ + { + "id": "terminate", + "type": "command", + "command": "workbench.action.tasks.terminate", + "args": "terminateAll" + }, { "id": "postTitlePrompt", "description": "Title of the new post", diff --git a/404.html b/404.html deleted file mode 100644 index 00deeff5..00000000 --- a/404.html +++ /dev/null @@ -1,198 +0,0 @@ - - - - - - - 404 Page not found - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-

404

-
-
- - - - - -
- - -
- - - - - - diff --git a/android-chrome-192x192.png b/android-chrome-192x192.png deleted file mode 100755 index e135017d..00000000 Binary files a/android-chrome-192x192.png and /dev/null differ diff --git a/android-chrome-512x512.png b/android-chrome-512x512.png deleted file mode 100755 index 4ffee57e..00000000 Binary files a/android-chrome-512x512.png and /dev/null differ diff --git a/apple-touch-icon.png b/apple-touch-icon.png deleted file mode 100755 index f8bc93a1..00000000 Binary files a/apple-touch-icon.png and /dev/null differ diff --git a/blog/archetypes/blog.md b/blog/archetypes/blog.md new file mode 100644 index 00000000..430160c2 --- /dev/null +++ b/blog/archetypes/blog.md @@ -0,0 +1,10 @@ +--- +title: "{{ replace .Name "-" " " | title }}" +date: {{ .Date }} +draft: true +summary: +categories: ["Draft"] +tags: ["draft"] +thumbnail: "/posts/{{ .Name }}/feature.png" +--- + diff --git a/blog/config/_default/config.toml b/blog/config/_default/config.toml index 512ab113..c9d3691a 100644 --- a/blog/config/_default/config.toml +++ b/blog/config/_default/config.toml @@ -17,6 +17,8 @@ buildFuture = false googleAnalytics = "G-W6W2GD998G" +ignoreFiles = [ "\\[template\\]\\.md$" ] + [imaging] anchor = 'Center' diff --git a/blog/content b/blog/content deleted file mode 160000 index 000c7cf4..00000000 --- a/blog/content +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 000c7cf4e40dc5770546af6c9fc4b53f74e8ecb6 diff --git a/blog/public/categories/index.xml b/blog/public/categories/index.xml deleted file mode 100644 index 7e0912e4..00000000 --- a/blog/public/categories/index.xml +++ /dev/null @@ -1 +0,0 @@ -Categories on log from homehttps://blog.lofibean.cc/categories/Recent content in Categories on log from homeHugo -- gohugo.ioen© 2024Mon, 30 Sep 2024 08:38:57 -0500Devhttps://blog.lofibean.cc/categories/dev/Mon, 30 Sep 2024 08:38:57 -0500https://blog.lofibean.cc/categories/dev/Readingshttps://blog.lofibean.cc/categories/readings/Thu, 25 Feb 2021 17:10:25 +0800https://blog.lofibean.cc/categories/readings/Leisurehttps://blog.lofibean.cc/categories/leisure/Fri, 05 Feb 2021 21:33:03 +0800https://blog.lofibean.cc/categories/leisure/Coffeehttps://blog.lofibean.cc/categories/coffee/Thu, 31 Dec 2020 20:58:21 +0800https://blog.lofibean.cc/categories/coffee/ \ No newline at end of file diff --git a/blog/public/index.xml b/blog/public/index.xml deleted file mode 100644 index 395639e0..00000000 --- a/blog/public/index.xml +++ /dev/null @@ -1 +0,0 @@ -log from homehttps://blog.lofibean.cc/Recent content on log from homeHugo -- gohugo.ioen© 2024Mon, 30 Sep 2024 08:38:57 -0500Debugging Nodejs applications using VSCodehttps://blog.lofibean.cc/posts/debugging-nodejs-apps-using-vscode/Mon, 30 Sep 2024 08:38:57 -0500https://blog.lofibean.cc/posts/debugging-nodejs-apps-using-vscode/Mastering Multi-App Debugging in VSCode for Node.js ProjectsLearning Angular: Note on Angular ESLinthttps://blog.lofibean.cc/posts/learning-angular--eslint/Thu, 16 May 2024 08:30:00 -0500https://blog.lofibean.cc/posts/learning-angular--eslint/A quick note on Angular ESLintAvoid Multiple Lifecycle Hooks in Azure Devops Deployment Jobhttps://blog.lofibean.cc/posts/avoid-multiple-lifecycle-hooks-in-azure-devops-deployment-job/Wed, 08 May 2024 08:53:47 -0500https://blog.lofibean.cc/posts/avoid-multiple-lifecycle-hooks-in-azure-devops-deployment-job/Optimizing Azure DevOps pipelines by minimizing lifecycle hooks improves variable consistency across deployment stages.Learning Angular: Template, Change Detection and ViewChildhttps://blog.lofibean.cc/posts/note-on-angular-template-change-detection-viewchild/Thu, 25 Apr 2024 08:37:02 -0500https://blog.lofibean.cc/posts/note-on-angular-template-change-detection-viewchild/Explore dynamic Angular component rendering with ngTemplateOutlet and efficient change detection strategies using OnPush and ViewChild.Understanding Content Security Policy (CSP) for Azure App Service and Angular Appshttps://blog.lofibean.cc/posts/understanding-csp-for-azure-app-service/Wed, 24 Apr 2024 08:30:58 -0500https://blog.lofibean.cc/posts/understanding-csp-for-azure-app-service/Securing Azure App Service and Angular Apps with CSP.Adding Audio to Your Web App: The Complete Guidehttps://blog.lofibean.cc/posts/adding-audio-to-your-web-app-the-complete-guide/Tue, 10 Oct 2023 22:31:27 -0500https://blog.lofibean.cc/posts/adding-audio-to-your-web-app-the-complete-guide/Sound, rhythm, and harmony find their way into the inward places of the soul.⚙️ Setting Up Nginx for Local Developmenthttps://blog.lofibean.cc/posts/setting-up-nginx-for-local-development/Thu, 17 Aug 2023 07:59:39 -0500https://blog.lofibean.cc/posts/setting-up-nginx-for-local-development/Let&rsquo;s have HTTPS all the way, locally.Learning React: Updating Component State in componentDidMount()https://blog.lofibean.cc/posts/learning-react-componentdidmount/Mon, 17 Jul 2023 08:12:01 -0500https://blog.lofibean.cc/posts/learning-react-componentdidmount/Hey I just met you and this is crazy. But here&rsquo;s my data so have a callback, maybe.VSCode tasks for Hugohttps://blog.lofibean.cc/posts/vs-code-task/Sun, 13 Feb 2022 14:56:15 +0800https://blog.lofibean.cc/posts/vs-code-task/This post shows some useful VSCode tasks I set up to run and build Hugo.【書摘】真確:扭轉十大直覺偏誤,發現事情比你想的美好https://blog.lofibean.cc/posts/reading-factfulness/Thu, 25 Feb 2021 17:10:25 +0800https://blog.lofibean.cc/posts/reading-factfulness/This is a note about the book &ldquo;FACTFULNESS:Ten Reasons We’re Wrong About the World&ndash;and Why Things Are Better Than You Think&rdquo; (真確:扭轉十大直覺偏誤,發現事情比你想的美好)🐞 Missing Cookie in iframehttps://blog.lofibean.cc/posts/missing-cookie-in-iframe/Tue, 16 Feb 2021 19:08:15 +0800https://blog.lofibean.cc/posts/missing-cookie-in-iframe/Adding an config in IIS to fix my iframe content.🐞 Fixing AjaxControlTookit Unexpected Page Reload in ASP.NET Web Form Applicationhttps://blog.lofibean.cc/posts/fixing-ajaxcontroltoolkit-unexpected-page-reload-in-aspnet-webform-application/Fri, 12 Feb 2021 12:44:24 +0800https://blog.lofibean.cc/posts/fixing-ajaxcontroltoolkit-unexpected-page-reload-in-aspnet-webform-application/ASP.NET Web Form Archaeology: What&rsquo;s wrong with my __doPostBack() on Firefox? Why my AjaxControlToolkit is out of Control?Improving My Blogging Workflowhttps://blog.lofibean.cc/posts/improving-my-blogging-workflow/Fri, 05 Feb 2021 21:33:03 +0800https://blog.lofibean.cc/posts/improving-my-blogging-workflow/It&rsquo;s time to do some refactoring and improvements for the blog!☕️ Notes on City & Guilds International Barista Examhttps://blog.lofibean.cc/posts/notes-on-city-n-guilds-barista-exam/Thu, 31 Dec 2020 20:58:21 +0800https://blog.lofibean.cc/posts/notes-on-city-n-guilds-barista-exam/A notebook for C&amp;G barista exam.Set Up Cloudflare for AWS Route 53 Domainshttps://blog.lofibean.cc/posts/set-up-cloudflare-for-route53-domains/Thu, 31 Dec 2020 17:46:38 +0800https://blog.lofibean.cc/posts/set-up-cloudflare-for-route53-domains/This article shows how to configure Cloudflare for an existing website using AWS Route 53.Set Up an AWS EC2 with Ubuntu GUI, RDP and morehttps://blog.lofibean.cc/posts/set-up-an-aws-ec2-with-ubuntu-gui-rdp-and-more/Sat, 03 Oct 2020 13:40:48 +0800https://blog.lofibean.cc/posts/set-up-an-aws-ec2-with-ubuntu-gui-rdp-and-more/A guide to set up a AWS EC2 with GUI and more.Atlassian Bamboo: an Opinionated Approachhttps://blog.lofibean.cc/posts/notes-on-atlassian-bamboo/Sun, 20 Sep 2020 14:45:18 +0800https://blog.lofibean.cc/posts/notes-on-atlassian-bamboo/Thoughs about using Atlassian Bamboo: the introduction.Ruby Cheatsheethttps://blog.lofibean.cc/posts/ruby-cheatsheet/Tue, 15 Sep 2020 08:40:48 +0800https://blog.lofibean.cc/posts/ruby-cheatsheet/I don&rsquo;t need ↑↑↓↓←→←→BA but I need this when writing Ruby scripts.Use Gravatar Everywherehttps://blog.lofibean.cc/posts/use-gravatar-everywhere/Sat, 18 Jul 2020 12:01:56 +0800https://blog.lofibean.cc/posts/use-gravatar-everywhere/Gravatar. Gravatar everywhere.Displaying the Full Content in Hugo's RSS feedhttps://blog.lofibean.cc/posts/displaying-the-full-content-in-hugo-rss-feed/Fri, 03 Jul 2020 09:53:38 +0800https://blog.lofibean.cc/posts/displaying-the-full-content-in-hugo-rss-feed/The default RSS feed in Hugo site shows article abstract only. But what should I do if I want to display full content of the articles in the feed?The Perks of Being a Mac (or FreeBSD) userhttps://blog.lofibean.cc/posts/the-perks-of-being-a-mac-or-freebsd-user/Sun, 28 Jun 2020 12:28:38 +0800https://blog.lofibean.cc/posts/the-perks-of-being-a-mac-or-freebsd-user/Your computer may know something you don&rsquo;t expected.🐞 Battling With Gulp and Nodehttps://blog.lofibean.cc/posts/battling-with-gulp-and-node/Sat, 27 Jun 2020 16:03:12 +0800https://blog.lofibean.cc/posts/battling-with-gulp-and-node/Tackling the generation gap between old Gulp and young Node when building my website.🐞 GitVersioning: 'ThisAssembly' Is Inaccessible Due to Its Protection Levelhttps://blog.lofibean.cc/posts/git-versioning-this-assembly-is-inaccessible-due-to-its-protection-level/Thu, 25 Jun 2020 17:10:24 +0800https://blog.lofibean.cc/posts/git-versioning-this-assembly-is-inaccessible-due-to-its-protection-level/I can&rsquo;t use &lsquo;ThisAssembly&rsquo; in my .NET MVC project. Here&rsquo;s why.Documentation Makes Easy With MkDocs and GitLab Pageshttps://blog.lofibean.cc/posts/documentation-makes-easy-with-mkdocs-and-gitlab-pages/Fri, 12 Jun 2020 19:37:00 +0800https://blog.lofibean.cc/posts/documentation-makes-easy-with-mkdocs-and-gitlab-pages/A guide to build a static website using MkDocs and deploy it to GitLab Pages.A Tale of Two Caches: Redis and the cache helperhttps://blog.lofibean.cc/posts/a-tale-of-two-caches-redis-and-cache-helper/Thu, 11 Jun 2020 21:06:59 +0800https://blog.lofibean.cc/posts/a-tale-of-two-caches-redis-and-cache-helper/A note on how to add Redis and the cache helper to a .NET core Mvc app.☕️ Fantastic Beans and Where to Find Themhttps://blog.lofibean.cc/posts/fantastic-beans-and-where-to-find-them/Thu, 11 Jun 2020 10:39:39 +0800https://blog.lofibean.cc/posts/fantastic-beans-and-where-to-find-them/I found some local shops which selling pretty good beans. In Hong Kong.A Note on SSL Certificatehttps://blog.lofibean.cc/posts/a-note-on-ssl/Sat, 23 May 2020 17:10:25 +0800https://blog.lofibean.cc/posts/a-note-on-ssl/This is a note about the Linkedin learning course SSL Certificates for Web Developers.☕️ Brewing Coffeehttps://blog.lofibean.cc/posts/brewing-coffee/Sun, 17 May 2020 21:10:25 +0800https://blog.lofibean.cc/posts/brewing-coffee/A note on how to brew coffeeWhy You Should Manage Your Energy, Not Your Timehttps://blog.lofibean.cc/posts/why-you-should-manage-your-energy-not-your-time/Sun, 17 May 2020 13:33:52 +0800https://blog.lofibean.cc/posts/why-you-should-manage-your-energy-not-your-time/As a human being, <strong>managing our energy is more important</strong> because this is a limited resources.佛雷德金悖論 Fredkin’s paradoxhttps://blog.lofibean.cc/posts/fredkins-paradox/Sun, 17 May 2020 12:41:12 +0800https://blog.lofibean.cc/posts/fredkins-paradox/好多時候難以取捨的選擇本身對自身所帶來的差異沒有想像中的嚴重。因為決策困難而不做決策反而會令自己損失更大。Creating a User With Limited Privileges in Postgreshttps://blog.lofibean.cc/posts/creating-a-user-with-limited-privileges-in-postgres/Thu, 16 Apr 2020 20:01:15 +0800https://blog.lofibean.cc/posts/creating-a-user-with-limited-privileges-in-postgres/This post showing how to create a user with limited privileges in PostgreSQL.How to add a new Hugo blog posthttps://blog.lofibean.cc/posts/welcome/Thu, 16 Apr 2020 10:55:25 +0800https://blog.lofibean.cc/posts/welcome/Go to blog folder \ No newline at end of file diff --git a/blog/public/posts/index.xml b/blog/public/posts/index.xml deleted file mode 100644 index cfe42aa6..00000000 --- a/blog/public/posts/index.xml +++ /dev/null @@ -1 +0,0 @@ -Posts on log from homehttps://blog.lofibean.cc/posts/Recent content in Posts on log from homeHugo -- gohugo.ioen© 2024Mon, 30 Sep 2024 08:38:57 -0500Debugging Nodejs applications using VSCodehttps://blog.lofibean.cc/posts/debugging-nodejs-apps-using-vscode/Mon, 30 Sep 2024 08:38:57 -0500https://blog.lofibean.cc/posts/debugging-nodejs-apps-using-vscode/Mastering Multi-App Debugging in VSCode for Node.js ProjectsLearning Angular: Note on Angular ESLinthttps://blog.lofibean.cc/posts/learning-angular--eslint/Thu, 16 May 2024 08:30:00 -0500https://blog.lofibean.cc/posts/learning-angular--eslint/A quick note on Angular ESLintAvoid Multiple Lifecycle Hooks in Azure Devops Deployment Jobhttps://blog.lofibean.cc/posts/avoid-multiple-lifecycle-hooks-in-azure-devops-deployment-job/Wed, 08 May 2024 08:53:47 -0500https://blog.lofibean.cc/posts/avoid-multiple-lifecycle-hooks-in-azure-devops-deployment-job/Optimizing Azure DevOps pipelines by minimizing lifecycle hooks improves variable consistency across deployment stages.Learning Angular: Template, Change Detection and ViewChildhttps://blog.lofibean.cc/posts/note-on-angular-template-change-detection-viewchild/Thu, 25 Apr 2024 08:37:02 -0500https://blog.lofibean.cc/posts/note-on-angular-template-change-detection-viewchild/Explore dynamic Angular component rendering with ngTemplateOutlet and efficient change detection strategies using OnPush and ViewChild.Understanding Content Security Policy (CSP) for Azure App Service and Angular Appshttps://blog.lofibean.cc/posts/understanding-csp-for-azure-app-service/Wed, 24 Apr 2024 08:30:58 -0500https://blog.lofibean.cc/posts/understanding-csp-for-azure-app-service/Securing Azure App Service and Angular Apps with CSP.Adding Audio to Your Web App: The Complete Guidehttps://blog.lofibean.cc/posts/adding-audio-to-your-web-app-the-complete-guide/Tue, 10 Oct 2023 22:31:27 -0500https://blog.lofibean.cc/posts/adding-audio-to-your-web-app-the-complete-guide/Sound, rhythm, and harmony find their way into the inward places of the soul.⚙️ Setting Up Nginx for Local Developmenthttps://blog.lofibean.cc/posts/setting-up-nginx-for-local-development/Thu, 17 Aug 2023 07:59:39 -0500https://blog.lofibean.cc/posts/setting-up-nginx-for-local-development/Let&rsquo;s have HTTPS all the way, locally.Learning React: Updating Component State in componentDidMount()https://blog.lofibean.cc/posts/learning-react-componentdidmount/Mon, 17 Jul 2023 08:12:01 -0500https://blog.lofibean.cc/posts/learning-react-componentdidmount/Hey I just met you and this is crazy. But here&rsquo;s my data so have a callback, maybe.VSCode tasks for Hugohttps://blog.lofibean.cc/posts/vs-code-task/Sun, 13 Feb 2022 14:56:15 +0800https://blog.lofibean.cc/posts/vs-code-task/This post shows some useful VSCode tasks I set up to run and build Hugo.【書摘】真確:扭轉十大直覺偏誤,發現事情比你想的美好https://blog.lofibean.cc/posts/reading-factfulness/Thu, 25 Feb 2021 17:10:25 +0800https://blog.lofibean.cc/posts/reading-factfulness/This is a note about the book &ldquo;FACTFULNESS:Ten Reasons We’re Wrong About the World&ndash;and Why Things Are Better Than You Think&rdquo; (真確:扭轉十大直覺偏誤,發現事情比你想的美好)🐞 Missing Cookie in iframehttps://blog.lofibean.cc/posts/missing-cookie-in-iframe/Tue, 16 Feb 2021 19:08:15 +0800https://blog.lofibean.cc/posts/missing-cookie-in-iframe/Adding an config in IIS to fix my iframe content.🐞 Fixing AjaxControlTookit Unexpected Page Reload in ASP.NET Web Form Applicationhttps://blog.lofibean.cc/posts/fixing-ajaxcontroltoolkit-unexpected-page-reload-in-aspnet-webform-application/Fri, 12 Feb 2021 12:44:24 +0800https://blog.lofibean.cc/posts/fixing-ajaxcontroltoolkit-unexpected-page-reload-in-aspnet-webform-application/ASP.NET Web Form Archaeology: What&rsquo;s wrong with my __doPostBack() on Firefox? Why my AjaxControlToolkit is out of Control?Improving My Blogging Workflowhttps://blog.lofibean.cc/posts/improving-my-blogging-workflow/Fri, 05 Feb 2021 21:33:03 +0800https://blog.lofibean.cc/posts/improving-my-blogging-workflow/It&rsquo;s time to do some refactoring and improvements for the blog!☕️ Notes on City & Guilds International Barista Examhttps://blog.lofibean.cc/posts/notes-on-city-n-guilds-barista-exam/Thu, 31 Dec 2020 20:58:21 +0800https://blog.lofibean.cc/posts/notes-on-city-n-guilds-barista-exam/A notebook for C&amp;G barista exam.Set Up Cloudflare for AWS Route 53 Domainshttps://blog.lofibean.cc/posts/set-up-cloudflare-for-route53-domains/Thu, 31 Dec 2020 17:46:38 +0800https://blog.lofibean.cc/posts/set-up-cloudflare-for-route53-domains/This article shows how to configure Cloudflare for an existing website using AWS Route 53.Set Up an AWS EC2 with Ubuntu GUI, RDP and morehttps://blog.lofibean.cc/posts/set-up-an-aws-ec2-with-ubuntu-gui-rdp-and-more/Sat, 03 Oct 2020 13:40:48 +0800https://blog.lofibean.cc/posts/set-up-an-aws-ec2-with-ubuntu-gui-rdp-and-more/A guide to set up a AWS EC2 with GUI and more.Atlassian Bamboo: an Opinionated Approachhttps://blog.lofibean.cc/posts/notes-on-atlassian-bamboo/Sun, 20 Sep 2020 14:45:18 +0800https://blog.lofibean.cc/posts/notes-on-atlassian-bamboo/Thoughs about using Atlassian Bamboo: the introduction.Ruby Cheatsheethttps://blog.lofibean.cc/posts/ruby-cheatsheet/Tue, 15 Sep 2020 08:40:48 +0800https://blog.lofibean.cc/posts/ruby-cheatsheet/I don&rsquo;t need ↑↑↓↓←→←→BA but I need this when writing Ruby scripts.Use Gravatar Everywherehttps://blog.lofibean.cc/posts/use-gravatar-everywhere/Sat, 18 Jul 2020 12:01:56 +0800https://blog.lofibean.cc/posts/use-gravatar-everywhere/Gravatar. Gravatar everywhere.Displaying the Full Content in Hugo's RSS feedhttps://blog.lofibean.cc/posts/displaying-the-full-content-in-hugo-rss-feed/Fri, 03 Jul 2020 09:53:38 +0800https://blog.lofibean.cc/posts/displaying-the-full-content-in-hugo-rss-feed/The default RSS feed in Hugo site shows article abstract only. But what should I do if I want to display full content of the articles in the feed?The Perks of Being a Mac (or FreeBSD) userhttps://blog.lofibean.cc/posts/the-perks-of-being-a-mac-or-freebsd-user/Sun, 28 Jun 2020 12:28:38 +0800https://blog.lofibean.cc/posts/the-perks-of-being-a-mac-or-freebsd-user/Your computer may know something you don&rsquo;t expected.🐞 Battling With Gulp and Nodehttps://blog.lofibean.cc/posts/battling-with-gulp-and-node/Sat, 27 Jun 2020 16:03:12 +0800https://blog.lofibean.cc/posts/battling-with-gulp-and-node/Tackling the generation gap between old Gulp and young Node when building my website.🐞 GitVersioning: 'ThisAssembly' Is Inaccessible Due to Its Protection Levelhttps://blog.lofibean.cc/posts/git-versioning-this-assembly-is-inaccessible-due-to-its-protection-level/Thu, 25 Jun 2020 17:10:24 +0800https://blog.lofibean.cc/posts/git-versioning-this-assembly-is-inaccessible-due-to-its-protection-level/I can&rsquo;t use &lsquo;ThisAssembly&rsquo; in my .NET MVC project. Here&rsquo;s why.Documentation Makes Easy With MkDocs and GitLab Pageshttps://blog.lofibean.cc/posts/documentation-makes-easy-with-mkdocs-and-gitlab-pages/Fri, 12 Jun 2020 19:37:00 +0800https://blog.lofibean.cc/posts/documentation-makes-easy-with-mkdocs-and-gitlab-pages/A guide to build a static website using MkDocs and deploy it to GitLab Pages.A Tale of Two Caches: Redis and the cache helperhttps://blog.lofibean.cc/posts/a-tale-of-two-caches-redis-and-cache-helper/Thu, 11 Jun 2020 21:06:59 +0800https://blog.lofibean.cc/posts/a-tale-of-two-caches-redis-and-cache-helper/A note on how to add Redis and the cache helper to a .NET core Mvc app.☕️ Fantastic Beans and Where to Find Themhttps://blog.lofibean.cc/posts/fantastic-beans-and-where-to-find-them/Thu, 11 Jun 2020 10:39:39 +0800https://blog.lofibean.cc/posts/fantastic-beans-and-where-to-find-them/I found some local shops which selling pretty good beans. In Hong Kong.A Note on SSL Certificatehttps://blog.lofibean.cc/posts/a-note-on-ssl/Sat, 23 May 2020 17:10:25 +0800https://blog.lofibean.cc/posts/a-note-on-ssl/This is a note about the Linkedin learning course SSL Certificates for Web Developers.☕️ Brewing Coffeehttps://blog.lofibean.cc/posts/brewing-coffee/Sun, 17 May 2020 21:10:25 +0800https://blog.lofibean.cc/posts/brewing-coffee/A note on how to brew coffeeWhy You Should Manage Your Energy, Not Your Timehttps://blog.lofibean.cc/posts/why-you-should-manage-your-energy-not-your-time/Sun, 17 May 2020 13:33:52 +0800https://blog.lofibean.cc/posts/why-you-should-manage-your-energy-not-your-time/As a human being, <strong>managing our energy is more important</strong> because this is a limited resources.佛雷德金悖論 Fredkin’s paradoxhttps://blog.lofibean.cc/posts/fredkins-paradox/Sun, 17 May 2020 12:41:12 +0800https://blog.lofibean.cc/posts/fredkins-paradox/好多時候難以取捨的選擇本身對自身所帶來的差異沒有想像中的嚴重。因為決策困難而不做決策反而會令自己損失更大。Creating a User With Limited Privileges in Postgreshttps://blog.lofibean.cc/posts/creating-a-user-with-limited-privileges-in-postgres/Thu, 16 Apr 2020 20:01:15 +0800https://blog.lofibean.cc/posts/creating-a-user-with-limited-privileges-in-postgres/This post showing how to create a user with limited privileges in PostgreSQL.How to add a new Hugo blog posthttps://blog.lofibean.cc/posts/welcome/Thu, 16 Apr 2020 10:55:25 +0800https://blog.lofibean.cc/posts/welcome/Go to blog folder \ No newline at end of file diff --git a/blog/public/sitemap.xml b/blog/public/sitemap.xml deleted file mode 100644 index 0289c58c..00000000 --- a/blog/public/sitemap.xml +++ /dev/null @@ -1 +0,0 @@ -https://blog.lofibean.cc/posts/debugging-nodejs-apps-using-vscode/2024-09-30T08:38:57-05:00daily0.5https://blog.lofibean.cc/2024-09-30T08:38:57-05:00daily0.5https://blog.lofibean.cc/posts/2024-09-30T08:38:57-05:00daily0.5https://blog.lofibean.cc/posts/learning-angular--eslint/2024-05-16T08:30:00-05:00daily0.5https://blog.lofibean.cc/posts/avoid-multiple-lifecycle-hooks-in-azure-devops-deployment-job/2024-05-15T09:00:00-05:00daily0.5https://blog.lofibean.cc/posts/note-on-angular-template-change-detection-viewchild/2024-04-25T08:37:02-05:00daily0.5https://blog.lofibean.cc/posts/understanding-csp-for-azure-app-service/2024-04-24T08:30:58-05:00daily0.5https://blog.lofibean.cc/posts/adding-audio-to-your-web-app-the-complete-guide/2023-10-10T22:31:27-05:00daily0.5https://blog.lofibean.cc/posts/setting-up-nginx-for-local-development/2023-08-17T07:59:39-05:00daily0.5https://blog.lofibean.cc/posts/learning-react-componentdidmount/2023-07-17T08:12:01-05:00daily0.5https://blog.lofibean.cc/posts/vs-code-task/2022-02-13T14:56:15+08:00daily0.5https://blog.lofibean.cc/posts/reading-factfulness/2021-02-25T17:10:25+08:00daily0.5https://blog.lofibean.cc/posts/missing-cookie-in-iframe/2021-02-16T19:08:15+08:00daily0.5https://blog.lofibean.cc/posts/fixing-ajaxcontroltoolkit-unexpected-page-reload-in-aspnet-webform-application/2021-02-17T19:25:24+08:00daily0.5https://blog.lofibean.cc/posts/improving-my-blogging-workflow/2021-02-05T21:33:03+08:00daily0.5https://blog.lofibean.cc/posts/notes-on-city-n-guilds-barista-exam/2021-02-13T20:43:21+08:00daily0.5https://blog.lofibean.cc/posts/set-up-cloudflare-for-route53-domains/2020-12-31T17:46:38+08:00daily0.5https://blog.lofibean.cc/posts/set-up-an-aws-ec2-with-ubuntu-gui-rdp-and-more/2020-10-03T13:40:48+08:00daily0.5https://blog.lofibean.cc/posts/notes-on-atlassian-bamboo/2021-02-05T21:06:24+08:00daily0.5https://blog.lofibean.cc/posts/ruby-cheatsheet/2020-09-15T08:40:48+08:00daily0.5https://blog.lofibean.cc/posts/use-gravatar-everywhere/2020-07-18T12:01:56+08:00daily0.5https://blog.lofibean.cc/posts/displaying-the-full-content-in-hugo-rss-feed/2020-07-03T09:53:38+08:00daily0.5https://blog.lofibean.cc/posts/the-perks-of-being-a-mac-or-freebsd-user/2020-06-28T22:30:38+08:00daily0.5https://blog.lofibean.cc/posts/battling-with-gulp-and-node/2020-06-27T16:28:24+08:00daily0.5https://blog.lofibean.cc/posts/git-versioning-this-assembly-is-inaccessible-due-to-its-protection-level/2020-06-28T11:10:24+08:00daily0.5https://blog.lofibean.cc/posts/documentation-makes-easy-with-mkdocs-and-gitlab-pages/2020-06-12T19:37:00+08:00daily0.5https://blog.lofibean.cc/posts/a-tale-of-two-caches-redis-and-cache-helper/2020-06-27T17:06:24+08:00daily0.5https://blog.lofibean.cc/posts/fantastic-beans-and-where-to-find-them/2020-09-18T08:39:00+08:00daily0.5https://blog.lofibean.cc/posts/a-note-on-ssl/2020-05-23T17:10:25+08:00daily0.5https://blog.lofibean.cc/posts/brewing-coffee/2020-05-17T21:10:25+08:00daily0.5https://blog.lofibean.cc/posts/why-you-should-manage-your-energy-not-your-time/2020-05-17T13:33:52+08:00daily0.5https://blog.lofibean.cc/posts/fredkins-paradox/2020-05-17T12:41:12+08:00daily0.5https://blog.lofibean.cc/posts/creating-a-user-with-limited-privileges-in-postgres/2020-04-16T20:01:15+08:00daily0.5https://blog.lofibean.cc/posts/welcome/2020-04-16T10:55:25+08:00daily0.5 \ No newline at end of file diff --git a/blog/public/tags/index.xml b/blog/public/tags/index.xml deleted file mode 100644 index 72cd8168..00000000 --- a/blog/public/tags/index.xml +++ /dev/null @@ -1 +0,0 @@ -Tags on log from homehttps://blog.lofibean.cc/tags/Recent content in Tags on log from homeHugo -- gohugo.ioen© 2024Mon, 30 Sep 2024 08:38:57 -0500debugginghttps://blog.lofibean.cc/tags/debugging/Mon, 30 Sep 2024 08:38:57 -0500https://blog.lofibean.cc/tags/debugging/nodejshttps://blog.lofibean.cc/tags/nodejs/Mon, 30 Sep 2024 08:38:57 -0500https://blog.lofibean.cc/tags/nodejs/obshttps://blog.lofibean.cc/tags/obs/Mon, 30 Sep 2024 08:38:57 -0500https://blog.lofibean.cc/tags/obs/vscodehttps://blog.lofibean.cc/tags/vscode/Mon, 30 Sep 2024 08:38:57 -0500https://blog.lofibean.cc/tags/vscode/webhttps://blog.lofibean.cc/tags/web/Mon, 30 Sep 2024 08:38:57 -0500https://blog.lofibean.cc/tags/web/angularhttps://blog.lofibean.cc/tags/angular/Thu, 16 May 2024 08:30:00 -0500https://blog.lofibean.cc/tags/angular/eslinthttps://blog.lofibean.cc/tags/eslint/Thu, 16 May 2024 08:30:00 -0500https://blog.lofibean.cc/tags/eslint/azurehttps://blog.lofibean.cc/tags/azure/Wed, 08 May 2024 08:53:47 -0500https://blog.lofibean.cc/tags/azure/azure-devopshttps://blog.lofibean.cc/tags/azure-devops/Wed, 08 May 2024 08:53:47 -0500https://blog.lofibean.cc/tags/azure-devops/cicdhttps://blog.lofibean.cc/tags/cicd/Wed, 08 May 2024 08:53:47 -0500https://blog.lofibean.cc/tags/cicd/audiohttps://blog.lofibean.cc/tags/audio/Tue, 10 Oct 2023 22:31:27 -0500https://blog.lofibean.cc/tags/audio/programminghttps://blog.lofibean.cc/tags/programming/Tue, 10 Oct 2023 22:31:27 -0500https://blog.lofibean.cc/tags/programming/nginxhttps://blog.lofibean.cc/tags/nginx/Thu, 17 Aug 2023 07:59:39 -0500https://blog.lofibean.cc/tags/nginx/setuphttps://blog.lofibean.cc/tags/setup/Thu, 17 Aug 2023 07:59:39 -0500https://blog.lofibean.cc/tags/setup/reacthttps://blog.lofibean.cc/tags/react/Mon, 17 Jul 2023 08:12:01 -0500https://blog.lofibean.cc/tags/react/hugohttps://blog.lofibean.cc/tags/hugo/Sun, 13 Feb 2022 14:56:15 +0800https://blog.lofibean.cc/tags/hugo/bookhttps://blog.lofibean.cc/tags/book/Thu, 25 Feb 2021 17:10:25 +0800https://blog.lofibean.cc/tags/book/factfulesshttps://blog.lofibean.cc/tags/factfuless/Thu, 25 Feb 2021 17:10:25 +0800https://blog.lofibean.cc/tags/factfuless/書摘https://blog.lofibean.cc/tags/%E6%9B%B8%E6%91%98/Thu, 25 Feb 2021 17:10:25 +0800https://blog.lofibean.cc/tags/%E6%9B%B8%E6%91%98/cookiehttps://blog.lofibean.cc/tags/cookie/Tue, 16 Feb 2021 19:08:15 +0800https://blog.lofibean.cc/tags/cookie/iframehttps://blog.lofibean.cc/tags/iframe/Tue, 16 Feb 2021 19:08:15 +0800https://blog.lofibean.cc/tags/iframe/iishttps://blog.lofibean.cc/tags/iis/Tue, 16 Feb 2021 19:08:15 +0800https://blog.lofibean.cc/tags/iis/pest-controlhttps://blog.lofibean.cc/tags/pest-control/Tue, 16 Feb 2021 19:08:15 +0800https://blog.lofibean.cc/tags/pest-control/AjaxControlToolkithttps://blog.lofibean.cc/tags/ajaxcontroltoolkit/Fri, 12 Feb 2021 12:44:24 +0800https://blog.lofibean.cc/tags/ajaxcontroltoolkit/aspnethttps://blog.lofibean.cc/tags/aspnet/Fri, 12 Feb 2021 12:44:24 +0800https://blog.lofibean.cc/tags/aspnet/AsyncPostBackTriggerhttps://blog.lofibean.cc/tags/asyncpostbacktrigger/Fri, 12 Feb 2021 12:44:24 +0800https://blog.lofibean.cc/tags/asyncpostbacktrigger/postbackhttps://blog.lofibean.cc/tags/postback/Fri, 12 Feb 2021 12:44:24 +0800https://blog.lofibean.cc/tags/postback/webformhttps://blog.lofibean.cc/tags/webform/Fri, 12 Feb 2021 12:44:24 +0800https://blog.lofibean.cc/tags/webform/baristahttps://blog.lofibean.cc/tags/barista/Thu, 31 Dec 2020 20:58:21 +0800https://blog.lofibean.cc/tags/barista/city-n-guildshttps://blog.lofibean.cc/tags/city-n-guilds/Thu, 31 Dec 2020 20:58:21 +0800https://blog.lofibean.cc/tags/city-n-guilds/coffeehttps://blog.lofibean.cc/tags/coffee/Thu, 31 Dec 2020 20:58:21 +0800https://blog.lofibean.cc/tags/coffee/awshttps://blog.lofibean.cc/tags/aws/Thu, 31 Dec 2020 17:46:38 +0800https://blog.lofibean.cc/tags/aws/cloudflarehttps://blog.lofibean.cc/tags/cloudflare/Thu, 31 Dec 2020 17:46:38 +0800https://blog.lofibean.cc/tags/cloudflare/route53https://blog.lofibean.cc/tags/route53/Thu, 31 Dec 2020 17:46:38 +0800https://blog.lofibean.cc/tags/route53/tutorialhttps://blog.lofibean.cc/tags/tutorial/Thu, 31 Dec 2020 17:46:38 +0800https://blog.lofibean.cc/tags/tutorial/ec2https://blog.lofibean.cc/tags/ec2/Sat, 03 Oct 2020 13:40:48 +0800https://blog.lofibean.cc/tags/ec2/ovpnhttps://blog.lofibean.cc/tags/ovpn/Sat, 03 Oct 2020 13:40:48 +0800https://blog.lofibean.cc/tags/ovpn/rdphttps://blog.lofibean.cc/tags/rdp/Sat, 03 Oct 2020 13:40:48 +0800https://blog.lofibean.cc/tags/rdp/Bamboohttps://blog.lofibean.cc/tags/bamboo/Sun, 20 Sep 2020 14:45:18 +0800https://blog.lofibean.cc/tags/bamboo/continuous deliveryhttps://blog.lofibean.cc/tags/continuous-delivery/Sun, 20 Sep 2020 14:45:18 +0800https://blog.lofibean.cc/tags/continuous-delivery/continuous integrationhttps://blog.lofibean.cc/tags/continuous-integration/Sun, 20 Sep 2020 14:45:18 +0800https://blog.lofibean.cc/tags/continuous-integration/cheatsheethttps://blog.lofibean.cc/tags/cheatsheet/Tue, 15 Sep 2020 08:40:48 +0800https://blog.lofibean.cc/tags/cheatsheet/rubyhttps://blog.lofibean.cc/tags/ruby/Tue, 15 Sep 2020 08:40:48 +0800https://blog.lofibean.cc/tags/ruby/gravatarhttps://blog.lofibean.cc/tags/gravatar/Sat, 18 Jul 2020 12:01:56 +0800https://blog.lofibean.cc/tags/gravatar/rsshttps://blog.lofibean.cc/tags/rss/Fri, 03 Jul 2020 09:53:38 +0800https://blog.lofibean.cc/tags/rss/easter-egghttps://blog.lofibean.cc/tags/easter-egg/Sun, 28 Jun 2020 12:28:38 +0800https://blog.lofibean.cc/tags/easter-egg/machttps://blog.lofibean.cc/tags/mac/Sun, 28 Jun 2020 12:28:38 +0800https://blog.lofibean.cc/tags/mac/gulphttps://blog.lofibean.cc/tags/gulp/Sat, 27 Jun 2020 16:03:12 +0800https://blog.lofibean.cc/tags/gulp/gulp-sasshttps://blog.lofibean.cc/tags/gulp-sass/Sat, 27 Jun 2020 16:03:12 +0800https://blog.lofibean.cc/tags/gulp-sass/node-sasshttps://blog.lofibean.cc/tags/node-sass/Sat, 27 Jun 2020 16:03:12 +0800https://blog.lofibean.cc/tags/node-sass/.NEThttps://blog.lofibean.cc/tags/.net/Thu, 25 Jun 2020 17:10:24 +0800https://blog.lofibean.cc/tags/.net/csharphttps://blog.lofibean.cc/tags/csharp/Thu, 25 Jun 2020 17:10:24 +0800https://blog.lofibean.cc/tags/csharp/nugethttps://blog.lofibean.cc/tags/nuget/Thu, 25 Jun 2020 17:10:24 +0800https://blog.lofibean.cc/tags/nuget/gitlabhttps://blog.lofibean.cc/tags/gitlab/Fri, 12 Jun 2020 19:37:00 +0800https://blog.lofibean.cc/tags/gitlab/markdownhttps://blog.lofibean.cc/tags/markdown/Fri, 12 Jun 2020 19:37:00 +0800https://blog.lofibean.cc/tags/markdown/mkdocshttps://blog.lofibean.cc/tags/mkdocs/Fri, 12 Jun 2020 19:37:00 +0800https://blog.lofibean.cc/tags/mkdocs/pythonhttps://blog.lofibean.cc/tags/python/Fri, 12 Jun 2020 19:37:00 +0800https://blog.lofibean.cc/tags/python/.NET Corehttps://blog.lofibean.cc/tags/.net-core/Thu, 11 Jun 2020 21:06:59 +0800https://blog.lofibean.cc/tags/.net-core/cachehttps://blog.lofibean.cc/tags/cache/Thu, 11 Jun 2020 21:06:59 +0800https://blog.lofibean.cc/tags/cache/redishttps://blog.lofibean.cc/tags/redis/Thu, 11 Jun 2020 21:06:59 +0800https://blog.lofibean.cc/tags/redis/tag-helpershttps://blog.lofibean.cc/tags/tag-helpers/Thu, 11 Jun 2020 21:06:59 +0800https://blog.lofibean.cc/tags/tag-helpers/cryptographyhttps://blog.lofibean.cc/tags/cryptography/Sat, 23 May 2020 17:10:25 +0800https://blog.lofibean.cc/tags/cryptography/httpshttps://blog.lofibean.cc/tags/https/Sat, 23 May 2020 17:10:25 +0800https://blog.lofibean.cc/tags/https/linkedin-digesthttps://blog.lofibean.cc/tags/linkedin-digest/Sat, 23 May 2020 17:10:25 +0800https://blog.lofibean.cc/tags/linkedin-digest/securityhttps://blog.lofibean.cc/tags/security/Sat, 23 May 2020 17:10:25 +0800https://blog.lofibean.cc/tags/security/sslhttps://blog.lofibean.cc/tags/ssl/Sat, 23 May 2020 17:10:25 +0800https://blog.lofibean.cc/tags/ssl/v60https://blog.lofibean.cc/tags/v60/Sun, 17 May 2020 21:10:25 +0800https://blog.lofibean.cc/tags/v60/pocket-digesthttps://blog.lofibean.cc/tags/pocket-digest/Sun, 17 May 2020 13:33:52 +0800https://blog.lofibean.cc/tags/pocket-digest/self managementhttps://blog.lofibean.cc/tags/self-management/Sun, 17 May 2020 13:33:52 +0800https://blog.lofibean.cc/tags/self-management/workhttps://blog.lofibean.cc/tags/work/Sun, 17 May 2020 13:33:52 +0800https://blog.lofibean.cc/tags/work/Fredkin's paradoxhttps://blog.lofibean.cc/tags/fredkins-paradox/Sun, 17 May 2020 12:41:12 +0800https://blog.lofibean.cc/tags/fredkins-paradox/佛雷德金悖論https://blog.lofibean.cc/tags/%E4%BD%9B%E9%9B%B7%E5%BE%B7%E9%87%91%E6%82%96%E8%AB%96/Sun, 17 May 2020 12:41:12 +0800https://blog.lofibean.cc/tags/%E4%BD%9B%E9%9B%B7%E5%BE%B7%E9%87%91%E6%82%96%E8%AB%96/選擇困難https://blog.lofibean.cc/tags/%E9%81%B8%E6%93%87%E5%9B%B0%E9%9B%A3/Sun, 17 May 2020 12:41:12 +0800https://blog.lofibean.cc/tags/%E9%81%B8%E6%93%87%E5%9B%B0%E9%9B%A3/postgreshttps://blog.lofibean.cc/tags/postgres/Thu, 16 Apr 2020 20:01:15 +0800https://blog.lofibean.cc/tags/postgres/ \ No newline at end of file diff --git a/blog/themes/blowfish b/blog/themes/blowfish deleted file mode 160000 index b1f09831..00000000 --- a/blog/themes/blowfish +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b1f0983199671942c922ec25e36d027ac192e9c3 diff --git a/categories/coffee/index.html b/categories/coffee/index.html deleted file mode 100644 index c47ae8cf..00000000 --- a/categories/coffee/index.html +++ /dev/null @@ -1,293 +0,0 @@ - - - - - - - Coffee - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -

Coffee

- - - - -
-
-

☕️ Notes on City & Guilds International Barista Exam

- -
-
- A notebook for C&G barista exam. -
- Read more - -
- - - - -
-
-

☕️ Fantastic Beans and Where to Find Them

- -
-
- I found some local shops which selling pretty good beans. In Hong Kong. -
- Read more - - -
- - - - -
-
-

☕️ Brewing Coffee

- -
-
- A note on how to brew coffee -
- Read more - -
- - - - - - - - - -
- - - - - -
- - -
- - - - - - diff --git a/categories/coffee/index.xml b/categories/coffee/index.xml deleted file mode 100644 index 54dfc4de..00000000 --- a/categories/coffee/index.xml +++ /dev/null @@ -1,190 +0,0 @@ - - - - Coffee on log from home - https://blog.lofibean.cc/categories/coffee/ - Recent content in Coffee on log from home - - - https://blog.lofibean.cc/android-chrome-512x512.png?v=20201231 - - Favicon of Coffee on log from home - https://blog.lofibean.cc/ - - Hugo -- gohugo.io - en-us - &copy; bemnlam - Thu, 31 Dec 2020 20:58:21 +0800 - - - - - - ☕️ Notes on City & Guilds International Barista Exam - https://blog.lofibean.cc/posts/notes-on-city-n-guilds-barista-exam/ - Thu, 31 Dec 2020 20:58:21 +0800 - - https://blog.lofibean.cc/posts/notes-on-city-n-guilds-barista-exam/ - - <img src="https://images.unsplash.com/photo-1562771335-b1fe8b4ea78f?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1000&q=80" /><h2 id="the-exam">The Exam</h2> -<p>I passed the <a href="https://www.cityandguilds.com/qualifications-and-apprenticeships/hospitality-and-catering/hospitality-and-catering/7102-barista-skills"><strong>City &amp; Guilds International Barista Skills</strong></a> exam this December and I think that will be a good idea to write down what I&rsquo;ve learnt.</p> -<h2 id="the-notebook">The Notebook</h2> -<p>As a result, this notebook is created 👉 <a href="https://coffeelab.lofibean.cc/">https://coffeelab.lofibean.cc/</a>.</p> -<p>(The notebook is powered by <a href="https://www.mkdocs.org/">MkDocs</a> and you can find out how to create a site like that <a href="https://blog.lofibean.cc/posts/documentation-makes-easy-with-mkdocs-and-gitlab-pages/">here</a>.)</p> -<p>Enjoy ☕️</p> - - - - - - ☕️ Fantastic Beans and Where to Find Them - https://blog.lofibean.cc/posts/fantastic-beans-and-where-to-find-them/ - Thu, 11 Jun 2020 10:39:39 +0800 - - https://blog.lofibean.cc/posts/fantastic-beans-and-where-to-find-them/ - - <h2 id="background">Background</h2> -<p><em>In short: I found some local shops which selling pretty good beans. In Hong Kong.</em></p> -<p>During the 2020 pandamic, it&rsquo;s not easy to buy beans overseas. However, it gave me a great opportunity to search for some good beans in Hong Kong. Plus, I have more time to stay at home and brew coffee as the company started the WFH policy from Feb.</p> -<aside class="c-toc"> - <details open> - <summary title="click to toggle table of contents.">Table of Contents</summary> - <nav id="TableOfContents"> - <ul> - <li><a href="#background">Background</a> - <ul> - <li><a href="#update-history">Update history</a></li> - </ul> - </li> - <li><a href="#1-my-little-coffee">1. My Little Coffee</a> - <ul> - <li><a href="#beans">Beans</a></li> - <li><a href="#drip-bags">Drip bags</a></li> - <li><a href="#equipments">Equipments</a></li> - </ul> - </li> - <li><a href="#2-brew-note-coffee-roaster">2. Brew Note Coffee Roaster</a> - <ul> - <li><a href="#beans-1">Beans</a></li> - <li><a href="#subscription-plans">Subscription plans</a></li> - </ul> - </li> - </ul> -</nav> - </details> -</aside> - -<h3 id="update-history">Update history</h3> -<p>🏷 2020-09-12:</p> -<ul> -<li>Added new beans I tried.</li> -<li>Added new equipments.</li> -</ul> -<p><em>I will keep searching for new beans and new local shops in the coming days.</em></p> -<hr> -<h2 id="1-my-little-coffee">1. My Little Coffee</h2> -<p>📍: Shop 102, Ho King Shopping Centre, Mong Kok, Kowloon, Hong Kong <a href="https://goo.gl/maps/tmvvYoYdbwdXHT1Q8">(map)</a></p> -<p>🕑: 14:00 - 21:00</p> -<p>🔗: <a href="https://www.instagram.com/mylittlecoffee/" title="@mylittlecoffee">IG</a> | <a href="https://www.facebook.com/MYLITTLECOFFEE.HK" title="@MYLITTLECOFFEE.HK">FB</a></p> -<iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3690.994368201023!2d114.16981291454812!3d22.31605274796321!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x340400c6eba8f7f1%3A0xcda642d8b7eb4c2e!2z5aW95pmv5ZWG5qWt5Lit5b-D!5e0!3m2!1szh-TW!2ses!4v1591843734940!5m2!1szh-TW!2ses" width="720" height="300" frameborder="0" style="border:0;" allowfullscreen="true" aria-hidden="false" tabindex="0"></iframe> -<p>The shop sells whole beans, drip bags and a lot of coffee equipment. You can also request the shopkeeper to gring the beans too.</p> -<p>I bought their beans twice a week. Here are some beans that I&rsquo;ve tried and the labels of each kind of bean.</p> -<h3 id="beans">Beans</h3> -<p><strong>🌞 El Salvador, Finca La Primera</strong></p> -<ul> -<li>Nutty, brown sugar, citrus, sweet aftertaste.</li> -<li>Variety: Bourbon, 1200m ~ 1600m</li> -</ul> -<p><strong>🌊 Ethiopia Guji Shakisso Abiyot Boru Galle Dagaa Grade 1</strong></p> -<ul> -<li>Great acidity &amp; full mouth feel with notes like raisin, blackberry, dark choco., plum &amp; honey-like sweetness.</li> -</ul> -<p><strong>🌊 Colombia Hulla Mariano Leal Bourbon</strong></p> -<ul> -<li>Strong &amp; vibrant aroma, good structure with tasting notes like green apple, vanilla, dark choco. &amp; apricot.</li> -</ul> -<p><strong>🌊 Kenya Nyala AB Top Microlot</strong></p> -<ul> -<li>Pleasant &amp; complex acidity, brown sugar in aroma, pomegranate, apple citrus &amp; black currant finish.</li> -</ul> -<p><strong>🌊 Yirgacheffe Dumerso G1</strong></p> -<ul> -<li>Tangerine, grape, Earl Grey, smooth, long-lasting</li> -</ul> -<p><strong>(?) Bohemian Rhapsody</strong></p> -<ul> -<li>Nutty, winy, berries, cranberry, balance, sweet, rich &amp; mellow. Smooth</li> -</ul> -<p><strong>🍷 Yunnan (Brandy Fermentation)</strong> : This one is super interesting and addictive. Strong brandy / rum taste.</p> -<ul> -<li>Foral, brandy winey, black berry</li> -</ul> -<h3 id="drip-bags">Drip bags</h3> -<ul> -<li>The shop also grinds their beans and sell it as drop bags (~$75/10 bags). Suitable for people who want to drink their own choice in the office.</li> -</ul> -<h3 id="equipments">Equipments</h3> -<h4 id="coffee-filter">Coffee filter</h4> -<p><strong>KONO</strong></p> -<p>While V60 is dominating the market (I also using plastic V60. Cheap, robust, simple), this shop don&rsquo;t sell V60. Instead, KONO filter is all over the shop.</p> -<p><img src="https://shop.r10s.jp/ultramix/cabinet/item17/md-41_1.jpg" alt="a typical KONO filter"></p> -<p><strong>Clever Cup</strong></p> -<p>They sold clever cup recently. In my opinion, it is a french press but looks like a drip coffee filter. You can also use it as a typical coffee filter if you want.</p> -<p><img src="https://cdn.hiconsumption.com/wp-content/uploads/2015/04/Clever-Coffee-Maker.jpg" alt="a typical clever cup"></p> -<p><strong>The Vietnamese</strong></p> -<p>Once apon a time I drank the vietnamese coffee from a local restaurant and it used this coffee filter to brew a dark and strong coffee and mixed with condensed milk. (So strong that I got a headache afterwards X.X)</p> -<p><img src="https://www.webstaurantstore.com/images/products/extra_large/58984/99644.jpg" alt="a typical vietnamese coffee filter"></p> -<h4 id="grinders">Grinders</h4> -<p>(TBC)</p> -<hr> -<h2 id="2-brew-note-coffee-roaster">2. Brew Note Coffee Roaster</h2> -<p>📍: G/F, 19 Fort Street, North Point, Hong Kong Island, Hong Kong <a href="https://goo.gl/maps/FH97kAU441xBLEsv5">(map)</a></p> -<p>🕑: 08:30 - 19:00</p> -<p>🔗: <a href="https://brewnotecoffee.com/">Website</a> | <a href="https://www.instagram.com/brewnotecoffee/," title="@brewnotecoffee">IG</a> | <a href="https://www.facebook.com/brewnotecoffee/" title="@brewnotecoffee">FB</a></p> -<iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d1935.6125276425794!2d114.19573503377934!3d22.29003915191319!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x3404010391cc2fef%3A0xca430d4451503bfe!2sBrew%20Note%20Coffee%20Roaster!5e0!3m2!1szh-TW!2ses!4v1591849727090!5m2!1szh-TW!2ses" width="720" height="300" frameborder="0" style="border:0;" allowfullscreen="" aria-hidden="false" tabindex="0"></iframe> -<p>This is also a restaurant so you can taste their coffee with delicious food. Ocassionally the shop will held cultural talks.</p> -<p>The shop is selling one of the lightest roasted whole beans in the city. I bought the Ethiopia Guji beans a long time ago and tasted the Americano in the shop. Both stunning.</p> -<h3 id="beans-1">Beans</h3> -<p><strong>🌞 Ethiopia Guji Oxygen Free</strong></p> -<ul> -<li>Floral, berries, tropical, citrus, sweet</li> -</ul> -<figure><img src="./img/01_flavor-wheel.JPG" - alt="01_flavor-wheel"/><figcaption> - <h4>Note: they have a simple wheel indicates the taste on their bean bags!</h4> - </figcaption> -</figure> - -<h3 id="subscription-plans">Subscription plans</h3> -<p>It also provides different coffee subscription plans. The <a href="https://brewnotecoffee.com/">website</a> shows the details of the beans and the plans.</p> - - - - - - ☕️ Brewing Coffee - https://blog.lofibean.cc/posts/brewing-coffee/ - Sun, 17 May 2020 21:10:25 +0800 - - https://blog.lofibean.cc/posts/brewing-coffee/ - - <p>A note on how to brew coffee.</p> -<h2 id="v60">V60</h2> -<p>☕️ <a href="https://www.youtube.com/watch?v=LmGKqzV7hQE">How to Brew V60 with UK Brewers Cup Champion, Sang Ho Park | Comprehensive Guide</a></p> - -<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"> - <iframe src="https://www.youtube.com/embed/LmGKqzV7hQE" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video"></iframe> -</div> - -<p>☕️ <a href="https://www.youtube.com/watch?v=wmCW8xSWGZY">A Coffee Brewing Theory &ldquo;4:6 method&rdquo; Invented by Tetsu Kasuya_ World Brewers Cup 2016 Champion</a></p> - -<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"> - <iframe src="https://www.youtube.com/embed/wmCW8xSWGZY" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video"></iframe> -</div> - - - - - - - diff --git a/categories/coffee/page/1/index.html b/categories/coffee/page/1/index.html deleted file mode 100644 index 84589143..00000000 --- a/categories/coffee/page/1/index.html +++ /dev/null @@ -1 +0,0 @@ -https://blog.lofibean.cc/categories/coffee/ \ No newline at end of file diff --git a/categories/dev/index.html b/categories/dev/index.html deleted file mode 100644 index f8910879..00000000 --- a/categories/dev/index.html +++ /dev/null @@ -1,444 +0,0 @@ - - - - - - - Dev - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -

Dev

- - - - -
-
-

🐞 Missing Cookie in iframe

- -
-
- Adding an config in IIS to fix my iframe content. -
- Read more - - -
- - - - -
-
-

🐞 Fixing AjaxControlTookit Unexpected Page Reload in ASP.NET Web Form Application

- -
-
- ASP.NET Web Form Archaeology: What's wrong with my __doPostBack() on Firefox? Why my AjaxControlToolkit is out of Control? -
- Read more - - -
- - - - -
-
-

Set Up Cloudflare for AWS Route 53 Domains

- -
-
- This article shows how to configure Cloudflare for an existing website using AWS Route 53. -
- Read more - - -
- - - - -
-
-

Set Up an AWS EC2 with Ubuntu GUI, RDP and more

- -
-
- A guide to set up a AWS EC2 with GUI and more. -
- Read more - - -
- - - - -
-
-

Atlassian Bamboo: an Opinionated Approach

- -
-
- Thoughs about using Atlassian Bamboo: the introduction. -
- Read more - - -
- - - - -
-
-

Ruby Cheatsheet

- -
-
- I don't need ↑↑↓↓←→←→BA but I need this when writing Ruby scripts. -
- Read more - - -
- - - - -
-
-

Use Gravatar Everywhere

- -
-
- Gravatar. Gravatar everywhere. -
- Read more - - -
- - - - -
-
-

Displaying the Full Content in Hugo's RSS feed

- -
-
- The default RSS feed in Hugo site shows article abstract only. But what should I do if I want to display full content of the articles in the feed? -
- Read more - - -
- - - - -
-
-

🐞 Battling With Gulp and Node

- -
-
- Tackling the generation gap between old Gulp and young Node when building my website. -
- Read more - - -
- - - - -
-
-

🐞 GitVersioning: 'ThisAssembly' Is Inaccessible Due to Its Protection Level

- -
-
- I can't use 'ThisAssembly' in my .NET MVC project. Here's why. -
- Read more - - -
- - - - - - - - - -
- - - - - -
- - -
- - - - - - diff --git a/categories/dev/index.xml b/categories/dev/index.xml deleted file mode 100644 index bc2d2f2a..00000000 --- a/categories/dev/index.xml +++ /dev/null @@ -1,1825 +0,0 @@ - - - - Dev on log from home - https://blog.lofibean.cc/categories/dev/ - Recent content in Dev on log from home - - - https://blog.lofibean.cc/android-chrome-512x512.png?v=20201231 - - Favicon of Dev on log from home - https://blog.lofibean.cc/ - - Hugo -- gohugo.io - en-us - &copy; bemnlam - Tue, 16 Feb 2021 19:08:15 +0800 - - - - - - 🐞 Missing Cookie in iframe - https://blog.lofibean.cc/posts/missing-cookie-in-iframe/ - Tue, 16 Feb 2021 19:08:15 +0800 - - https://blog.lofibean.cc/posts/missing-cookie-in-iframe/ - - <img src="https://images.unsplash.com/photo-1596872907520-07fa00b9aa68?ixid=MXwxMjA3fDB8MHxzZWFyY2h8NTZ8fGNvb2tpZXxlbnwwfHwwfA%3D%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=720&q=80" /><aside class="c-toc"> - <details open> - <summary title="click to toggle table of contents.">Table of Contents</summary> - <nav id="TableOfContents"> - <ul> - <li><a href="#-problem">😨 Problem</a></li> - <li><a href="#its-emptydocumentcookie">It&rsquo;s empty: <code>Document.cookie</code></a></li> - <li><a href="#the-cookie-policy">The cookie policy</a> - <ul> - <li><a href="#samesite"><code>SameSite</code></a></li> - <li><a href="#secure-and-httponly"><code>Secure</code> and  <code>HttpOnly</code></a></li> - </ul> - </li> - <li><a href="#-solution-enforcing-cookie-responses-on-iis">😀 Solution: Enforcing cookie responses on IIS</a> - <ul> - <li><a href="#advanced-change-the-config-file-directly">Advanced: change the config file directly</a></li> - <li><a href="#easy-add-an-outbound-rule-in-iis-manager">Easy: Add an outbound rule in IIS Manager</a></li> - </ul> - </li> - <li><a href="#-conslusion">🎯 Conslusion</a></li> - </ul> -</nav> - </details> -</aside> - -<h2 id="-problem">😨 Problem</h2> -<p>There is a internal web application which showing an article from another website in an <code>&lt;iframe&gt;</code>. In order to read the full article the user has to login to the website (i.e. a special Form cookie is required.)</p> -<p>A user reported:</p> -<blockquote> -<p>I login to the website in a separated browser tab. I can read the full article. However, when I browing the same item in the internal web app, it requires me to login and I am failed to login (in that <code>&lt;iframe&gt;</code>).</p> -</blockquote> -<p>I cannot reproduce this using my browser (Firefox v85). This issue happens on Chrome v88.</p> -<p><img src="img/image-20210216190506550.png" alt="image-20210216190506550"></p> -<h2 id="its-emptydocumentcookie">It&rsquo;s empty: <code>Document.cookie</code></h2> -<p>I suspect this is something related to my cookie. I check the cookie using <code>document.cookie</code> in Dev tool&rsquo;s console. It&rsquo;s empty when I load the website inside the <code>&lt;iframe&gt;</code>.</p> -<p>However, <code>document.cookie</code> should contain something after I login to the website, right?</p> -<p><a href="https://bugs.chromium.org/p/chromium/issues/detail?id=1062162">Here</a> and <a href="https://support.google.com/chrome/thread/33543699?hl=en">here</a> show the exact same issue reported by other chromium user. Turns out it&rsquo;s about the <strong>updated cookie policy in Chrome</strong>.</p> -<h2 id="the-cookie-policy">The cookie policy</h2> -<p>I inspected the cookie of the website: it&rsquo;s just a cookie with <code>HttpOnly</code> attribute and othing else. So, something else is missing in the cookie response, right?</p> -<h3 id="samesite"><code>SameSite</code></h3> -<p>The modern browsers (e.g. latest Chrome and coming versions of Firefox) require the developer to define an explicit <code>SameSite</code> policy. You can see <a href="https://web.dev/samesite-cookies-explained/">SameSite cookies explained</a> for details and choose the suiteable value.</p> -<h3 id="secure-and-httponly"><code>Secure</code> and  <code>HttpOnly</code></h3> -<p>The cookie has to be served via <code>HTTPS</code>. Hence, those attributes are also required.</p> -<p>I found that <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie">Set-Cookie - HTTP | MDN</a> is a good documentation for you to check all the available attributes related to the <code>Set-Cookie</code>HTTP response header.</p> -<p>I know what might be missing now but how can I fix it? The websites are running on <strong>IIS</strong> and there are <strong>multiple sites</strong> has the same cookie problem. A quick fix is required and <strong>better don&rsquo;t alter the code</strong>.</p> -<h2 id="-solution-enforcing-cookie-responses-on-iis">😀 Solution: Enforcing cookie responses on IIS</h2> -<h3 id="advanced-change-the-config-file-directly">Advanced: change the config file directly</h3> -<p>If you feel confident to modify the server config directly, open this file:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-batch" data-lang="batch">%windir%\System32\inetsrv\config\applicationHost.config -</code></pre></div><p>It&rsquo;s a XML file containing the server-level configs.</p> -<p>Find the <outboundRules> section under <code>system.webServer &gt; rewrite</code> If no, create one:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-xml" data-lang="xml"><span style="color:#f92672">&lt;system.webServer&gt;</span> - <span style="color:#f92672">&lt;rewrite&gt;</span> - <span style="color:#f92672">&lt;outboundRules&gt;</span> - <span style="color:#f92672">&lt;rule</span> <span style="color:#a6e22e">name=</span><span style="color:#e6db74">&#34;AddCookiePolicy&#34;</span><span style="color:#f92672">&gt;</span> - <span style="color:#f92672">&lt;match</span> <span style="color:#a6e22e">serverVariable=</span><span style="color:#e6db74">&#34;RESPONSE_Set-Cookie&#34;</span> <span style="color:#a6e22e">pattern=</span><span style="color:#e6db74">&#34;^(.*)(AUTH)(=.*)$&#34;</span> <span style="color:#f92672">/&gt;</span> - <span style="color:#f92672">&lt;action</span> <span style="color:#a6e22e">type=</span><span style="color:#e6db74">&#34;Rewrite&#34;</span> <span style="color:#a6e22e">value=</span><span style="color:#e6db74">&#34;{R:0};SameSite=None;Secure;HttpOnly&#34;</span><span style="color:#f92672">&gt;</span> - <span style="color:#f92672">&lt;/rule&gt;</span> - <span style="color:#f92672">&lt;/outboundRules&gt;</span> - <span style="color:#f92672">&lt;/rewrite&gt;</span> -<span style="color:#f92672">&lt;/system.webServer&gt;</span> -</code></pre></div><blockquote> -<p>You need to change the regex of the <code>pattern</code> attribute. I use <code>^(.*)(AUTH)(=.*)$</code> because there are multiple websites and all the auth cookie names are ended with <code>AUTH</code>.</p> -</blockquote> -<blockquote> -<p>Make sure that your regex should have a matching group so that you can make use of it in the <code>action</code> section (i.e. the <code>{R:0}</code>)</p> -</blockquote> -<p>Save the file and it&rsquo;s done.</p> -<h4 id="verify-the-config">Verify the config</h4> -<p>Launch the <strong>IIS manager</strong> and choose the <strong>Configuration Editor</strong> on the Server level (not website level). Check the configuration collection under <code>system.webServer/rewrite/outboundRules</code> . You should see the config named <code>AddCookiePolicy</code>.</p> -<h3 id="easy-add-an-outbound-rule-in-iis-manager">Easy: Add an outbound rule in IIS Manager</h3> -<p>If you want to be safe, launch the <strong>IIS Manager</strong> and set the rule.</p> -<ol> -<li> -<p>Select the <strong>URL Rewrite</strong> option at the <strong>Server</strong> level:</p> -<p><img src="./img/2039ae6d172ddeba53124f671a3b73eb5ffe8c3c.jpg" alt="URL Rewrite"></p> -</li> -<li> -<p>Choose <strong>Blank rule</strong> under <strong>Outbound rules</strong> section. Click <strong>OK</strong>.</p> -<p><img src="./img/93bc4349fa2deb106e44399add0e3f87232f690e.jpg" alt="Blank rule"></p> -</li> -<li> -<p>Set the matching criteria:</p> -<ul> -<li> -<p>Matching scope: <strong>Server Variable</strong>.</p> -</li> -<li> -<p>Variable name: <code>RESPONSE_Set-Cookie</code>.</p> -</li> -<li> -<p>Variable value: <strong>Matches the Pattern</strong> using <strong>Regular Expressions</strong>.</p> -</li> -<li> -<p>Pattern: <code>^(.*)(AUTH)(=.*)$&quot; /&gt;</code>. You should change this regex in order to match your use case.</p> -</li> -<li> -<p><strong>Ignore case</strong>.</p> -</li> -</ul> -<p><img src="./img/fd001a4e74cd55507e2faf063f26f34f770daf61.jpg" alt="Matching Criteria"></p> -</li> -<li> -<p>Set the <strong>Action</strong>:</p> -<ul> -<li> -<p>Value: <code>{R:0};Secure;SameSite=None;HttpOnly</code></p> -</li> -<li> -<p><strong>Replace existing server variable value</strong></p> -</li> -</ul> -<p><img src="./img/97bd46b9980b6de3927f8a2b0f2b528b900a00ce.jpg" alt="Action"></p> -</li> -<li> -<p>Click <strong>Apply</strong> to enable the rule.</p> -</li> -<li> -<p>Done.</p> -</li> -</ol> -<p>After I set this outbound rewrite rule for the cookies, I can see the full article loaded inside the <code>&lt;iframe&gt;</code>. Problem solved.</p> -<h2 id="-conslusion">🎯 Conslusion</h2> -<p>When you dealing with cookies in modern browsers, set the <strong>correct cookie response attributes</strong> including an explicit <code>SameSite</code> policy, a <code>HttpOnly</code> and <code>Secure</code>:</p> -<pre tabindex="0"><code>Set-Cookie: {name}={value}; SameSite=None;HttpOnly;Secure -</code></pre><p>In order to add those attributes in a <strong>.NET Framework web app running on IIS</strong>, you can simply define an <strong>outbound rule</strong> rewrite rule on the server level of the <strong>IIS Manager</strong>.</p> - - - - - - 🐞 Fixing AjaxControlTookit Unexpected Page Reload in ASP.NET Web Form Application - https://blog.lofibean.cc/posts/fixing-ajaxcontroltoolkit-unexpected-page-reload-in-aspnet-webform-application/ - Fri, 12 Feb 2021 12:44:24 +0800 - - https://blog.lofibean.cc/posts/fixing-ajaxcontroltoolkit-unexpected-page-reload-in-aspnet-webform-application/ - - <img src="https://blog.lofibean.cc/posts/fixing-ajaxcontroltoolkit-unexpected-page-reload-in-aspnet-webform-application/thumbnail.jpg" /><aside class="c-toc"> - <details open> - <summary title="click to toggle table of contents.">Table of Contents</summary> - <nav id="TableOfContents"> - <ul> - <li><a href="#-problem">😨 Problem</a></li> - <li><a href="#expected-vs-actual-behavior">Expected vs Actual Behavior</a> - <ul> - <li><a href="#expected">Expected</a></li> - <li><a href="#actual">Actual</a></li> - </ul> - </li> - <li><a href="#-solution-part-1-updating-ajaxcontroltoolkit">😀 Solution (Part 1): Updating <code>AjaxControlToolkit</code></a> - <ul> - <li><a href="#nuget-package-update">Nuget Package Update</a></li> - <li><a href="#some-breaking-changes">Some Breaking Changes</a></li> - <li><a href="#different-__dopostback-in-firefox">Different <code>__doPostBack()</code> in Firefox?</a></li> - </ul> - </li> - <li><a href="#-solution-part-2-adding--aspasyncpostbacktrigger">😀 Solution (Part 2): Adding <code>&lt;asp:AsyncPostBackTrigger&gt;</code></a> - <ul> - <li><a href="#the-working-code-snippet">The Working Code Snippet</a></li> - </ul> - </li> - <li><a href="#summary">Summary</a></li> - </ul> -</nav> - </details> -</aside> - -<h2 id="-problem">😨 Problem</h2> -<blockquote> -<p>TL;DR: see <a href="#summary">Summary</a> and <a href="#the-working-code-snippet">the working code snippet</a> if you want to try it right away.</p> -</blockquote> -<p>In my company there is an old Web Form Website running .NET Framework 3.5. I migrated it to an ASP.NET Web Form Application running .NET Framework 4.7.2 few months ago. The website is running just like the old one but recently a user reported that:</p> -<blockquote> -<p><strong>a <code>&lt;select&gt;</code> list which should triggers an AJAX call and refresh part of the page does not work. Instead, the page is reloaded everytime when the item in the <code>&lt;select&gt;</code> list is changed.</strong></p> -</blockquote> -<p>I used almost a day to figure out what&rsquo;s (probably) happened and I hope that this article will be helpful to someone in the future who (still) encounter this problem.</p> -<h2 id="expected-vs-actual-behavior">Expected vs Actual Behavior</h2> -<p>There is a <code>&lt;form&gt;</code> containing a <code>&lt;select&gt;</code> list (generated by <a href="https://docs.microsoft.com/en-us/dotnet/api/system.web.ui.webcontrols.dropdownlist?view=netframework-4.8"> <code>&lt;asp:DropDownList&gt;</code></a>). When the selected option is changed, an AJAX call will be fired and new items will be fetched. Besides, there is a text area for user to input remarks. A submit button will submit the form.</p> -<p><img src="img/image-20210212150215986.png" alt="image-20210212150215986"></p> -<h3 id="expected">Expected</h3> -<p>The page will not be reloaded when the selected option is changed. The content in the text area retains.</p> -<h3 id="actual">Actual</h3> -<p>Once the selected option is changed, a form POST is fired (instead of an AJAX call). The content in the text area is therefore being cleaned.</p> -<p>This is related to AJAX calls so the first thing I checked was how the AJAX call was initiated.</p> -<h2 id="-solution-part-1-updating-ajaxcontroltoolkit">😀 Solution (Part 1): Updating <code>AjaxControlToolkit</code></h2> -<p>In the <code>.aspx</code> file I saw a <code>&lt;asp:UpdatePanel&gt;</code> and a <code>&lt;asp:DropDownList&gt;</code>. This is the simplified structure of that part:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-xml" data-lang="xml"><span style="color:#f92672">&lt;asp:UpdatePanel</span> <span style="color:#a6e22e">runat=</span><span style="color:#e6db74">&#34;server&#34;</span> <span style="color:#a6e22e">ID=</span><span style="color:#e6db74">&#34;UpdatePanel2&#34;</span> <span style="color:#a6e22e">UpdateMode=</span><span style="color:#e6db74">&#34;Conditional&#34;</span> <span style="color:#a6e22e">ChildrenAsTriggers=</span><span style="color:#e6db74">&#34;true&#34;</span><span style="color:#f92672">&gt;</span> - <span style="color:#f92672">&lt;ContentTemplate&gt;</span> - <span style="color:#f92672">&lt;asp:DropDownList</span> <span style="color:#a6e22e">runat=</span><span style="color:#e6db74">&#34;server&#34;</span> <span style="color:#a6e22e">ID=</span><span style="color:#e6db74">&#34;ddItemTypes&#34;</span> <span style="color:#a6e22e">AutoPostBack=</span><span style="color:#e6db74">&#34;true&#34;</span> <span style="color:#a6e22e">OnSelectedIndexChanged=</span><span style="color:#e6db74">&#34;ddItemTypes_OnSelectedIndexChanged&#34;</span> <span style="color:#f92672">/&gt;</span> - <span style="color:#f92672">&lt;/ContentTemplate&gt;</span> -<span style="color:#f92672">&lt;/asp:UpdatePanel&gt;</span> -</code></pre></div><p><code>AutoPostBack</code> is there so the app should use <code>AjaxControlToolkit</code> to make AJAX calls (I guess that&rsquo;s the standard right?).</p> -<h3 id="nuget-package-update">Nuget Package Update</h3> -<p>I checked the <code>package.config</code>:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-xml" data-lang="xml"><span style="color:#f92672">&lt;package</span> <span style="color:#a6e22e">id=</span><span style="color:#e6db74">&#34;AjaxControlToolkit&#34;</span> <span style="color:#a6e22e">version=</span><span style="color:#e6db74">&#34;4.1.50508&#34;</span> <span style="color:#a6e22e">targetFramework=</span><span style="color:#e6db74">&#34;net35&#34;</span> <span style="color:#f92672">/&gt;</span> -</code></pre></div><p>Looks like the <code>targetFramework</code> is not right. Maybe it&rsquo;s time to update the package too.</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-xml" data-lang="xml"><span style="color:#f92672">&lt;package</span> <span style="color:#a6e22e">id=</span><span style="color:#e6db74">&#34;AjaxControlToolkit&#34;</span> <span style="color:#a6e22e">version=</span><span style="color:#e6db74">&#34;20.1.0&#34;</span> <span style="color:#a6e22e">targetFramework=</span><span style="color:#e6db74">&#34;net472&#34;</span> <span style="color:#f92672">/&gt;</span> -</code></pre></div><h3 id="some-breaking-changes">Some Breaking Changes</h3> -<p><a href="https://github.com/DevExpress/AjaxControlToolkit">AjaxControlToolkit</a> has some breaking changes since version 15+. In short, you need to:</p> -<ol> -<li> -<p>Uninstall the old version and install the new version of <a href="https://www.nuget.org/packages/AjaxControlToolkit"><code>AjaxControlToolkit</code></a>.</p> -</li> -<li> -<p>Change <code>&lt;asp:ToolkitScriptManager&gt;</code> to <code>&lt;asp:ScriptManager&gt;</code></p> -</li> -<li> -<p>Remove some unused configs in <code>web.config</code> (see <a href="https://github.com/DevExpress/AjaxControlToolkit/wiki/Upgrading-from-v7.x-and-below#3---clean-up-webconfig">this</a>)</p> -</li> -<li> -<p>[Optional] Install <a href="https://www.nuget.org/packages/AjaxControlToolkit.HtmlEditor.Sanitizer/"><code>AjaxControlToolkit.HtmlEditor.Sanitizer</code></a></p> -<ul> -<li> -<p>Change the namespace <code>AjaxControlToolkit.HTMLEditor</code> to <code>AjaxControlToolkit.HtmlEditor</code></p> -</li> -<li> -<p>Change the namespace <code>AjaxControlToolkit.HTMLEditor.ToolbarButton</code> to <code>AjaxControlToolkit.HtmlEditor.ToolbarButtons</code></p> -</li> -</ul> -</li> -</ol> -<p>You may also read<a href="https://github.com/DevExpress/AjaxControlToolkit/wiki/Upgrading-from-v7.x-and-below#3---clean-up-webconfig"> the official complete migration guide</a>.</p> -<p>After I upgrade the Nuget package, the AJAX calls was working partially: It only works on Chromium-base browsers like Chrome and Edge. However, <strong>it does not work on Firefox (85.0) and Safari (14.0.1)</strong>.</p> -<p>😐 😐 😐</p> -<h3 id="different-__dopostback-in-firefox">Different <code>__doPostBack()</code> in Firefox?</h3> -<p>This is what I got from Firefox&rsquo;s dev tool:</p> -<p><img src="img/image-20210212140706748.png" alt="call stack form Firefox image-20210212140706748"></p> -<p>The initiator is from <code>__doPostBack()</code> in the <code>.aspx</code> page. In Chrome, it&rsquo;s from <code>ScriptResource.axd</code>. Below is the expected call stack: the call is an XHR request fired from <code>ScriptResource.axd</code>.</p> -<p><img src="img/image-20210212141300293.png" alt="Expected call stack image-20210212141300293"></p> -<p>Looks like the stack items from bottom to <code>_doPostBack()</code> are the same. I therefore dug into <code>_doPostBack()</code> and eventually found this piece of code in <code>ScriptResource.axd</code>:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-js" data-lang="js"><span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span><span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">_postBackSettings</span>.<span style="color:#66d9ef">async</span>) { - <span style="color:#a6e22e">form</span>.<span style="color:#a6e22e">onsubmit</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">_onsubmit</span>; - <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">_originalDoPostBack</span>(<span style="color:#a6e22e">eventTarget</span>, <span style="color:#a6e22e">eventArgument</span>); - <span style="color:#a6e22e">form</span>.<span style="color:#a6e22e">onsubmit</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">null</span>; - <span style="color:#66d9ef">return</span>; -} -</code></pre></div><p>if <code>this._postBackSettings.async</code> is <code>false</code>, <code>_originaldoPostBack()</code> will be called and that is the <code>__doPostBack()</code> function defined in the <code>.aspx</code> page. <strong>This will trigger a page reload instead of an AJAX call</strong>.</p> -<p>Furthermore, I found that the <code>asyncTarget</code> in <code>_postBackSettings </code> is <code>null</code> but in Chrome that target is the <code>&lt;select&gt;</code> list.</p> -<blockquote> -<p>In Firefox (v85.0) the javascript event initiated is somehow keep propagating to a higher level than the <code>&lt;select&gt;</code> list (probably to the form&rsquo;s level) and therefore being treated as a form POST instead of an AJAX call.</p> -</blockquote> -<h2 id="-solution-part-2-adding--aspasyncpostbacktrigger">😀 Solution (Part 2): Adding <code>&lt;asp:AsyncPostBackTrigger&gt;</code></h2> -<p>I did some research related to the Firefox-specific page reload and seems none of them were talking about the issue I met. I tried to study the fundamentals of this <strong>PostBack</strong> behaviour.</p> -<p>Finally I got this article <a href="https://www.aspsnippets.com/Articles/Avoid-Prevent-Page-refresh-PostBack-after-SelectedIndexChanged-is-fired-in-ASPNet-DropDownList.aspx"><strong>Avoid (Prevent) Page refresh (PostBack) after SelectedIndexChanged is fired in ASP.Net DropDownList</strong></a>. It suggested what I might missing is an <code>asp:AsyncPostBackTrigger</code>.</p> -<p>Also, <a href="https://stackoverflow.com/questions/728043/how-to-stop-updatepanel-from-causing-whole-page-postback/728061#728061">this StackOverflow answer</a> menitoned the <code>asp:AsyncPostBackTrigger</code> thing.</p> -<p>So my understanding is:</p> -<blockquote> -<p>When using the <code>ScriptManager</code> (i.e. the one we introduced when updating the <code>AjaxControlToolkit</code>), we need to define an <code>asp:AsyncPostBackTrigger</code> <code>Trigger</code> in order to make the call AJAX.</p> -</blockquote> -<p>Therefore, I added a <code>Trigger</code> section to the <code>.aspx</code> file:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-xml" data-lang="xml"><span style="color:#f92672">&lt;Triggers&gt;</span> - <span style="color:#f92672">&lt;asp:AsyncPostBackTrigger</span> <span style="color:#a6e22e">ControlID=</span><span style="color:#e6db74">&#34;ddItemTypes&#34;</span> <span style="color:#a6e22e">EventName=</span><span style="color:#e6db74">&#34;SelectedIndexChanged&#34;</span> <span style="color:#f92672">/&gt;</span> -<span style="color:#f92672">&lt;/Triggers&gt;</span> -</code></pre></div><p>This <code>Trigger</code> section should be placed under the same <code>&lt;asp:UpdatePanel&gt;</code> with the <code>&lt;asp:DropDownList&gt;</code>. Here is the complete snippet:</p> -<h3 id="the-working-code-snippet">The Working Code Snippet</h3> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-xml" data-lang="xml"><span style="color:#f92672">&lt;asp:UpdatePanel</span> <span style="color:#a6e22e">runat=</span><span style="color:#e6db74">&#34;server&#34;</span> <span style="color:#a6e22e">ID=</span><span style="color:#e6db74">&#34;UpdatePanel2&#34;</span> <span style="color:#a6e22e">UpdateMode=</span><span style="color:#e6db74">&#34;Conditional&#34;</span> <span style="color:#a6e22e">ChildrenAsTriggers=</span><span style="color:#e6db74">&#34;true&#34;</span><span style="color:#f92672">&gt;</span> - <span style="color:#f92672">&lt;ContentTemplate&gt;</span> - <span style="color:#f92672">&lt;asp:DropDownList</span> <span style="color:#a6e22e">runat=</span><span style="color:#e6db74">&#34;server&#34;</span> <span style="color:#a6e22e">ID=</span><span style="color:#e6db74">&#34;ddItemTypes&#34;</span> <span style="color:#a6e22e">AutoPostBack=</span><span style="color:#e6db74">&#34;true&#34;</span> <span style="color:#a6e22e">OnSelectedIndexChanged=</span><span style="color:#e6db74">&#34;ddItemTypes_OnSelectedIndexChanged&#34;</span> <span style="color:#f92672">/&gt;</span> - <span style="color:#f92672">&lt;/ContentTemplate&gt;</span> - <span style="color:#f92672">&lt;Triggers&gt;</span> - <span style="color:#f92672">&lt;asp:AsyncPostBackTrigger</span> <span style="color:#a6e22e">ControlID=</span><span style="color:#e6db74">&#34;ddItemTypes&#34;</span> <span style="color:#a6e22e">EventName=</span><span style="color:#e6db74">&#34;SelectedIndexChanged&#34;</span> <span style="color:#f92672">/&gt;</span> - <span style="color:#f92672">&lt;/Triggers&gt;</span> -<span style="color:#f92672">&lt;/asp:UpdatePanel&gt;</span> -</code></pre></div><p>Note:</p> -<ol> -<li> -<p><code>EventName</code> is optional here but since I just want this trigger to listen the <code>SelectedIndexChanged</code> event, I add them all.</p> -</li> -<li> -<p>The <code>ControlID</code> has to be an exact match with the <code>ID</code> of <code>&lt;asp:DropDownList&gt;</code>.</p> -</li> -</ol> -<p>After I added the <code>&lt;asp:AsyncPostBackTrigger&gt;</code>, all the browsers including Chrome, Edge, Firefox (85.0) and Safari (14.0.1) are working.</p> -<h2 id="summary">Summary</h2> -<p>When your .NET 4.5+ ASP.NET Web Form Application using <code>AjaxControlToolkit</code> does not work as expected and cause the controls like <code>&lt;asp:DropDownList&gt;</code> cannot fire an AJAX call (but triggers a form POST), make sure that:</p> -<ol> -<li> -<p>The <code>AjaxControlToolkit</code> Nuget package is up to date (and did the proper migration steps <a href="https://github.com/DevExpress/AjaxControlToolkit/wiki/Upgrading-from-v7.x-and-below#3---clean-up-webconfig">here</a>).</p> -</li> -<li> -<p>The <code>&lt;asp:UpdatePanel&gt;</code> section should contain a <code>&lt;Triggers&gt;</code> section. In that section there is an <code>&lt;asp:AsyncPostBackTrigger&gt;</code> with <code>ControlID</code> same as the <code>ID</code> of your control (which is also placed under the same UpdatePanel section).</p> -</li> -</ol> - - - - - - Set Up Cloudflare for AWS Route 53 Domains - https://blog.lofibean.cc/posts/set-up-cloudflare-for-route53-domains/ - Thu, 31 Dec 2020 17:46:38 +0800 - - https://blog.lofibean.cc/posts/set-up-cloudflare-for-route53-domains/ - - <img src="https://blog.lofibean.cc/posts/set-up-cloudflare-for-route53-domains/thumbnail.jpg" /><h2 id="overview">Overview</h2> -<p>This article shows how to configure Cloudflare for an existing website using AWS Route53.</p> -<aside class="c-toc"> - <details open> - <summary title="click to toggle table of contents.">Table of Contents</summary> - <nav id="TableOfContents"> - <ul> - <li><a href="#overview">Overview</a></li> - <li><a href="#domain-registrar">Domain Registrar</a> - <ul> - <li><a href="#what-about-aws-route53">What about AWS Route53?</a></li> - </ul> - </li> - <li><a href="#cloudflare-account">Cloudflare Account</a> - <ul> - <li><a href="#add-a-domain">Add a domain</a></li> - <li><a href="#change-your-nameservers">Change your nameservers</a></li> - <li><a href="#verify-nameservers">Verify nameservers</a></li> - </ul> - </li> - <li><a href="#updating-dns-records">Updating DNS Records</a> - <ul> - <li><a href="#application-load-balancers">(Application) Load Balancers</a></li> - <li><a href="#amazon-ses">Amazon SES</a></li> - </ul> - </li> - <li><a href="#summary">Summary</a></li> - </ul> -</nav> - </details> -</aside> - -<h2 id="domain-registrar">Domain Registrar</h2> -<p>In my opinion, <strong>domain registrar is the most confusing part when you configure Cloudflare</strong>. To check the details of your domain, use the <a href="https://lookup.icann.org/lookup"><strong>Domain Name Registration Data Lookup</strong></a>. Here is the lookup result of <code>gitlab.com</code>:</p> -<p><img src="./img/image-20201231180715529.png" alt="image-20201231180715529"></p> -<p>The Registrar Information section contains the information where you should change the nameservers in the next step.</p> -<h3 id="what-about-aws-route53">What about AWS Route53?</h3> -<p>Route53 can be a domain registrar OR just managing the hosted zone. If you see AWS is the Registrar in this lookup, then you should update the config in AWS Route53.</p> -<h5 id="example-1-domain-purchased-from-godaddy">Example 1: Domain purchased from GoDaddy</h5> -<p>For example, if you purchased your domain in <strong>GoDaddy</strong> and having a <strong>hosted zone</strong> in <strong>AWS Route 53</strong> (That&rsquo;s my case), <strong>GoDaddy is therefore your domain registrar and you should login GoDaddy&rsquo;s account to change the nameserver, NOT AWS Route 53</strong></p> -<h5 id="example-2-domain-purchased-from-aws-route-53">Example 2: Domain purchased from AWS Route 53</h5> -<p>Unfortunately, You can purchased a domain in AWS Route 53 too. In this case, <strong>AWS Route 53 is your domain registrar</strong>.</p> -<p>You should change the nameservers in <a href="https://console.aws.amazon.com/route53/">the Route 53 console</a> &gt; <strong>Registered Domains</strong>.</p> -<h4 id="what-about-ns-record">What about NS Record?</h4> -<p>Changing a <code>NS Record</code> is not the same as changing a <code>nameserver</code>. From the article <a href="https://www.cloudflare.com/learning/dns/dns-records/dns-ns-record/">DNS NS record</a>:</p> -<blockquote> -<p>The NS record indicates which DNS server is authoritative.</p> -</blockquote> -<p>So, a <code>NS Record</code> is similar to <code>MX Record</code>, <code>CNAME Record</code>, <code>A Record</code>, etc. They are all the items under the domain.</p> -<p>Nameserver of the domain is at a higher level and it&rsquo;s controled by the domain registrar.</p> -<h2 id="cloudflare-account">Cloudflare Account</h2> -<h3 id="add-a-domain">Add a domain</h3> -<p>It&rsquo;s free to create a Cloudflare account: <a href="https://dash.cloudflare.com/sign-up">https://dash.cloudflare.com/sign-up</a>. Cloudflare also offer paid plans and I won&rsquo;t discuss them in this article.</p> -<p><img src="./img/image-20201231175523687.png" alt="image-20201231175523687"></p> -<p><img src="./img/image-20201231175540349.png" alt="image-20201231175540349"></p> -<p>Choose the free plan and then click <strong>Continue</strong></p> -<p>After that, Cloudflare will do a DNS scan for the domain you&rsquo;ve entered. Click <strong>Continue</strong>.</p> -<blockquote> -<p><strong>Note:</strong> Not all the recoreds captured are correct. You will need to add/delete/update some of them later.</p> -</blockquote> -<h3 id="change-your-nameservers">Change your nameservers</h3> -<p>The last step of setup is changing the nameservers. You will see the following instruction:</p> -<p><img src="./img/image-20201231182416379.png" alt="image-20201231182416379"></p> -<h4 id="1-log-in-to-your-registrar-account">1. Log in to your registrar account</h4> -<p>In the previous section, you should know which service provider is your domain registrar. Login to your domain registrar and find out the nameserver config. Then, remove the existing nameservers (the entries shown in step 1). For example:</p> -<pre tabindex="0"><code>ns1.mydomain.com -ns2.mydomain.com -ns3.mydomain.com -ns4.mydomain.com -</code></pre><h4 id="2-replace-with-cloudflares-nameservers">2. Replace with Cloudflare&rsquo;s nameservers:</h4> -<p>When all the existing nameservers are removed, you have to add the Cloudflare nameservers in the domain registrar. For example:</p> -<pre tabindex="0"><code>autumn.ns.cloudflare.com -hans.ns.cloudflare.com -</code></pre><p>Note: you have to enter the 2 nameservers shown in step 2. Other (Cloudflare) nameservers won&rsquo;t work.</p> -<h3 id="verify-nameservers">Verify nameservers</h3> -<p>Again, lookup the domain details using <a href="https://lookup.icann.org/lookup"><strong>Domain Name Registration Data Lookup</strong></a>. This time you should check the details in the <strong>Domain Information</strong> section.</p> -<p>You should see the nameservers are replaced with the Cloudflare&rsquo;s nameservers.</p> -<blockquote> -<p><strong>Note:</strong> <strong>Changing nameservers is quick</strong> and you should be able to see the updated records within 5 minutes.</p> -<p>On the other hand, changing the <strong>records</strong> under this domain may take a longer time (e.g. 24-48 hours).</p> -<p><strong>Do not mix them up</strong>.</p> -</blockquote> -<p>You may click the <strong>Done, check nameservers</strong> button once you finished changing the nameservers in your domain registrar.</p> -<h2 id="updating-dns-records">Updating DNS Records</h2> -<p>As mentioned in the above, we have to change some of the records in Cloudflare.</p> -<h3 id="application-load-balancers">(Application) Load Balancers</h3> -<p>You need to replace those A Records into CNAME Records.</p> -<p>In AWS Route 53 the load balancer records are in the forms of alias. Cloudflare will fetch the A Records of the load balancers.</p> -<p>Get the CNAME of your load balancer under <strong>AWS EC2 Console</strong> &gt; <strong>Load balancers</strong> &gt; Select your load balancer and see the details. After that, delete the A Record in Cloudflare and add a new CNAME record for your load balancer.</p> -<p>I used to keep the A Record in Cloudflare and it does work for few days. After that, the IP of that load balancer changed and the website cannot be connected.</p> -<h3 id="amazon-ses">Amazon SES</h3> -<p>I also found that the SPF and DKIM records for Amazon SES does not created in Cloudflare too. In this case you need to create those records manually in Cloudflare. Just follow the instruction provided by Amazon then you will know how to do:</p> -<ul> -<li> -<p><a href="https://docs.aws.amazon.com/ses/latest/DeveloperGuide/send-email-authentication-spf.html">Authenticating Email with SPF in Amazon SES</a></p> -</li> -<li> -<p><a href="https://docs.aws.amazon.com/ses/latest/DeveloperGuide/send-email-authentication-dkim.html">Authenticating Email with DKIM in Amazon SES</a></p> -</li> -</ul> -<h2 id="summary">Summary</h2> -<p>To use <strong>Cloudflare</strong>, you need to understand what a <strong>domain registrar</strong> is. By changing <strong>nameservers</strong> in a domain registrar and updating some records related to AWS&rsquo;s infrastructure, we can set up the Cloudflare domain for an existing website using <strong>AWS Route 53</strong>.</p> -<p><em>This is the end of this article (as well as the year 2020).</em></p> - - - - - - Set Up an AWS EC2 with Ubuntu GUI, RDP and more - https://blog.lofibean.cc/posts/set-up-an-aws-ec2-with-ubuntu-gui-rdp-and-more/ - Sat, 03 Oct 2020 13:40:48 +0800 - - https://blog.lofibean.cc/posts/set-up-an-aws-ec2-with-ubuntu-gui-rdp-and-more/ - - <img src="https://blog.lofibean.cc/posts/set-up-an-aws-ec2-with-ubuntu-gui-rdp-and-more/thumbnail.jpg" /><h2 id="overview">Overview</h2> -<p>This is an guide on how to set up a AWS EC2 free tier with GUI. The EC2 instance will be able to connect via Remote Desktop Protocol (RDP) or SSH.</p> -<p>You need to create a AWS account: <a href="https://portal.aws.amazon.com/billing/signup">https://portal.aws.amazon.com/billing/signup</a>. You may need to provide your credit card information during the signup process.</p> -<p>Sign in to your AWS Account and go to the AWS EC2 Console: <a href="https://aws.amazon.com/console/">https://aws.amazon.com/console/</a></p> -<aside class="c-toc"> - <details open> - <summary title="click to toggle table of contents.">Table of Contents</summary> - <nav id="TableOfContents"> - <ul> - <li><a href="#overview">Overview</a></li> - <li><a href="#create-an-aws-ec2">Create an AWS EC2</a> - <ul> - <li><a href="#set-up-the-security-groups">Set up the security groups</a></li> - <li><a href="#choose-the-os-instance-type-and-storage">Choose the OS, instance type and storage</a></li> - <li><a href="#create-and-download-a-pem-key-file">Create and download a <code>.pem</code> key file</a></li> - </ul> - </li> - <li><a href="#connect-to-ec2-via-ssh">Connect to EC2 via SSH</a></li> - <li><a href="#install-a-gui-and-rdp">Install a GUI and RDP</a> - <ul> - <li><a href="#gui-lxde">GUI: <code>LXDE</code></a></li> - <li><a href="#rdp-xrdp">RDP: <code>XRDP</code></a></li> - <li><a href="#connect-to-ec2-via-remote-desktop">Connect to EC2 via remote desktop</a></li> - </ul> - </li> - <li><a href="#bonus-materials">Bonus Materials</a> - <ul> - <li><a href="#1-install-additional-ibus-input-method">1. Install additional IBus input method</a></li> - <li><a href="#2-install-midori-browser-from-deb-package">2. Install Midori browser from <code>.deb</code> package</a></li> - <li><a href="#3-set-up-a-swapfile-for-better-performance">3. Set up a <code>swapfile</code> for better performance</a></li> - <li><a href="#4-use-ec2-as-a-vpn-server">4. Use EC2 as a VPN server</a></li> - </ul> - </li> - </ul> -</nav> - </details> -</aside> - -<h2 id="create-an-aws-ec2">Create an AWS EC2</h2> -<h3 id="set-up-the-security-groups">Set up the security groups</h3> -<p>I suggest you define the security groups before setting up the instance. Setting up the security groups will give you a better understanding on what inbound/outbound traffic is allowed in the instances you are going to create.</p> -<p>Choose <strong>Security Groups</strong> at the left menu of your <strong>EC2 Dashboard</strong>. Create 2 security groups:</p> -<ol> -<li><code>rdp</code>: Allow inbound traffic via port <code>3389</code></li> -<li><code>ssh</code>: Allow inbound traffic via port <code>22</code></li> -<li>Allow all outbound traffic</li> -</ol> -<h3 id="choose-the-os-instance-type-and-storage">Choose the OS, instance type and storage</h3> -<p>Choose <strong>Services</strong> &gt; <strong>EC2</strong> from the menu. At the <strong>EC2 Dashboard</strong>, choose <strong>Instances</strong>.</p> -<p>Click the <strong>Launch Instance</strong> and choose the suitable AMI (Amazon Machine Image). Here I choose a <code>t2.micro</code> instance with <code>Ubuntu Server 18.04 LTS</code> image. <strong>Remember also choose the suitable Storage</strong> as not all kinds of storage are free. In this example I set up a <code>30GB General Purpose</code> storage.</p> -<p><img src="./img/image-20200702183719536.png" alt="Image: Ubuntu Server 18.04 LTS"></p> -<p><img src="./img/image-20200702183754512.png" alt="Instance Type: t2.micro"></p> -<p><img src="./img/image-20200702183909326.png" alt="Click Review and Launch"></p> -<p><img src="./img/image-20200702183922739.png" alt="Storage: 30GB General Purpose"></p> -<h4 id="allow-ssh-and-rdp-connections">Allow SSH and RDP connections</h4> -<p>Choose the security groups created in the previous step:</p> -<p><img src="./img/image-20200702184007198.png" alt="Security Group: allow SSH and RDP"></p> -<p><img src="./img/image-20200702184046233.png" alt="image-20200702184046233"></p> -<h3 id="create-and-download-a-pem-key-file">Create and download a <code>.pem</code> key file</h3> -<p>You should create this key file. If you don&rsquo;t create this and link it to the instance, you will not be able to connect to the instance via SSH or RDP. Here we create a new key file named <code>ssh_private_key</code>.</p> -<p>After that, click <strong>Download Key Pair</strong> and keep the key file save.</p> -<p><img src="./img/image-20200702184135610.png" alt="image-20200702184135610"></p> -<h5 id="do-a-chmod-on-the-key-file">Do a <code>chmod</code> on the key file</h5> -<p>You need to make sure that the <code>ssh_private_key.pem</code> downloaded is able to execute. Run <code>chmod</code> to change the permission:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">❯ ll ~/Downloads/ | grep <span style="color:#e6db74">&#34;ssh_private_key.pem&#34;</span> --rw-r--r--@ <span style="color:#ae81ff">1</span> BEN staff 1.7K Jul <span style="color:#ae81ff">2</span> 18:41 ssh_private_key.pem - -❯ chmod <span style="color:#ae81ff">400</span> ~/Downloads/ssh_private_key.pem - -❯ ll ~/Downloads/ | grep <span style="color:#e6db74">&#34;ssh_private_key.pem&#34;</span> --r--------@ <span style="color:#ae81ff">1</span> BEN staff 1.7K Jul <span style="color:#ae81ff">2</span> 18:41 ssh_private_key.pem -</code></pre></div><h2 id="connect-to-ec2-via-ssh">Connect to EC2 via SSH</h2> -<p>Once you click the <strong>Launch instance</strong> , you should be able to see your instance in <strong>running</strong> state in the web console. Then, you can connect to the EC2 via ssh using the <code>pem</code> key file. Assuming that your DNS name of your EC2 is <code>ec2-0-1-2-3.ap-northeast-1.compute.amazonaws.com</code> and it is running at <code>ap-northeast-1</code> region, you can connect to it using user <code>ubuntu</code>:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">❯ ssh -i ~/Downloads/ssh_private_key.pem ubuntu@ec2-0-1-2-3.region-name.compute.amazonaws.com -The authenticity of host <span style="color:#e6db74">&#39;ec2-0-1-2-3.region-name.compute.amazonaws.com (0.1.2.3)&#39;</span> can<span style="color:#960050;background-color:#1e0010">&#39;</span>t be established. -ECDSA key fingerprint is SHA256:8t8ey5IqoiGOKGc9WuDc5SXaYqFHPnKph1mRtzbQNTc. -Are you sure you want to <span style="color:#66d9ef">continue</span> connecting <span style="color:#f92672">(</span>yes/no/<span style="color:#f92672">[</span>fingerprint<span style="color:#f92672">])</span>? -</code></pre></div><p>You need to confirm your fingerprint at the first connection attempt.</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">Welcome to Ubuntu 18.04.4 LTS <span style="color:#f92672">(</span>GNU/Linux 5.3.0-1023-aws x86_64<span style="color:#f92672">)</span> - - - * Documentation: https://help.ubuntu.com - * Management: https://landscape.canonical.com - * Support: https://ubuntu.com/advantage - - System information as of Thu Jul <span style="color:#ae81ff">2</span> 10:54:37 UTC <span style="color:#ae81ff">2020</span> - - System load: 0.0 Processes: <span style="color:#ae81ff">90</span> - Usage of /: 3.7% of 29.02GB Users logged in: <span style="color:#ae81ff">0</span> - Memory usage: 16% IP address <span style="color:#66d9ef">for</span> eth0: 172.31.4.8 - Swap usage: 0% - -<span style="color:#ae81ff">0</span> packages can be updated. -<span style="color:#ae81ff">0</span> updates are security updates. - -The programs included with the Ubuntu system are free software; -the exact distribution terms <span style="color:#66d9ef">for</span> each program are described in the -individual files in /usr/share/doc/*/copyright. - -Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by -applicable law. - -To run a command as administrator <span style="color:#f92672">(</span>user <span style="color:#e6db74">&#34;root&#34;</span><span style="color:#f92672">)</span>, use <span style="color:#e6db74">&#34;sudo &lt;command&gt;&#34;</span>. -See <span style="color:#e6db74">&#34;man sudo_root&#34;</span> <span style="color:#66d9ef">for</span> details. - -ubuntu@ip-172-31-4-8:~$ -</code></pre></div><h2 id="install-a-gui-and-rdp">Install a GUI and RDP</h2> -<h3 id="gui-lxde">GUI: <code>LXDE</code></h3> -<p>I choose <strong>LXDE</strong> as the GUI of the ubuntu server: <a href="https://lxde.sourceforge.net/about.html">https://lxde.sourceforge.net/about.html</a>.</p> -<blockquote> -<p>LXDE is a new project aimed to provide a new desktop environment which is lightweight and fast</p> -</blockquote> -<h3 id="rdp-xrdp">RDP: <code>XRDP</code></h3> -<p>xrdp is an open-source Remote Desktop Protocol server: <a href="http://xrdp.org">http://xrdp.org</a></p> -<blockquote> -<p>xrdp provides a graphical login to remote machines using RDP (Microsoft Remote Desktop Protocol)</p> -</blockquote> -<p>Install the packages:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">sudo apt-get update -y -sudo apt-get install lxde -y -sudo apt-get install xrdp -y -</code></pre></div><h4 id="set-a-password-for-your-accout">Set a password for your accout</h4> -<p>You need to also set up a password for the <em>ubuntu</em>. This is for your later use in RDP as RDP only allows you to login an password-protected account.</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">sudo passwd ubuntu -</code></pre></div><h3 id="connect-to-ec2-via-remote-desktop">Connect to EC2 via remote desktop</h3> -<p>For mac user, you need to download the <a href="https://apps.apple.com/us/app/microsoft-remote-desktop/id1295203466?mt=12">Microsoft Remote Desktop</a>. If you are using Windows, you should already have the Remote Desktop application preinstalled.</p> -<p><a href="https://apps.apple.com/us/app/microsoft-remote-desktop/id1295203466?mt=12"><img src="./img/image-20201003143752732.png" alt="Download Microsoft Remote Desktop"></a></p> -<p>Launch the app and click <strong>Add PC</strong>:</p> -<p><img src="./img/image-20200702192027044.png" alt="Add PC in Microsoft Remote Desktop"></p> -<p>Set the PC name (i.e. the DNS name of your machine):<img src="./img/image-20200702192128973.png" alt="Set PC name"></p> -<p>Login with user <code>ubuntu</code> and the password you set in the previous step.</p> -<p><img src="./img/image-20200702192239827.png" alt="Connect"></p> -<hr> -<h2 id="bonus-materials">Bonus Materials</h2> -<h3 id="1-install-additional-ibus-input-method">1. Install additional IBus input method</h3> -<p>If you want to type Japanese, Chinese, etc. you may need to install an input method. For cangjie, you can install <a href="http://cangjians.github.io/projects/ibus-cangjie/install.html"><strong>Cangjians</strong></a> via the terminal:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">sudo apt-get install ibus-cangjie -</code></pre></div><h3 id="2-install-midori-browser-from-deb-package">2. Install Midori browser from <code>.deb</code> package</h3> -<blockquote> -<p><strong>Midori Browser</strong> is a browser web light, fast, secure, free software &amp; open source</p> -</blockquote> -<p>Download .deb file: <a href="https://astian.org/en/midori-browser/download/">https://astian.org/en/midori-browser/download/</a> or using <code>wget</code>:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">cd ~/Downloads -sudo wget -qnc https://packages.astian.org/pool/main/m/midori/midori_9.0.0-1_amd64.deb -</code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">ubuntu@ip-172-31-4-8:~/Downloads$ ll -total <span style="color:#ae81ff">1492</span> -drwxr-xr-x <span style="color:#ae81ff">2</span> ubuntu ubuntu <span style="color:#ae81ff">4096</span> Jul <span style="color:#ae81ff">2</span> 11:29 ./ -drwxr-xr-x <span style="color:#ae81ff">17</span> ubuntu ubuntu <span style="color:#ae81ff">4096</span> Jul <span style="color:#ae81ff">2</span> 11:22 ../ --rw-r--r-- <span style="color:#ae81ff">1</span> root root <span style="color:#ae81ff">1517328</span> Jan <span style="color:#ae81ff">11</span> 23:26 midori_9.0.0-1_amd64.deb -</code></pre></div><p>After that, install the <code>deb</code> package using <code>dpkg</code></p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">sudo dpkg -i midori_9.0.0-1_amd64.deb -</code></pre></div><p>You may see the <code>dependency problems</code> like the following:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">ubuntu@ip-172-31-4-8:~/Downloads$ sudo dpkg --configure -a -dpkg: dependency problems prevent configuration of midori: - midori depends on libpeas-1.0-0 <span style="color:#f92672">(</span>&gt;<span style="color:#f92672">=</span> 1.15<span style="color:#f92672">)</span>; however: - Package libpeas-1.0-0 is not installed. - midori depends on libxml2-utils; however: - Package libxml2-utils is not installed. - midori depends on gstreamer1.0-plugins-bad; however: - Package gstreamer1.0-plugins-bad is not installed. - midori depends on gstreamer1.0-libav; however: - Package gstreamer1.0-libav is not installed. - -dpkg: error processing package midori <span style="color:#f92672">(</span>--configure<span style="color:#f92672">)</span>: - dependency problems - leaving unconfigured -Errors were encountered <span style="color:#66d9ef">while</span> processing: - midori -</code></pre></div><p>In this case, update the packages and reinstall midori:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">sudo dpkg --configure -a -sudo apt-get -f install -sudo apt-get update -sudo apt-get install midori -</code></pre></div><h3 id="3-set-up-a-swapfile-for-better-performance">3. Set up a <code>swapfile</code> for better performance</h3> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">ubuntu@ip-172-31-4-8:~$ sudo fallocate -l 1G /swapfile -ubuntu@ip-172-31-4-8:~$ sudo chmod <span style="color:#ae81ff">600</span> /swapfile -ubuntu@ip-172-31-4-8:~$ sudo mkswap /swapfile -Setting up swapspace version 1, size <span style="color:#f92672">=</span> <span style="color:#ae81ff">1024</span> MiB <span style="color:#f92672">(</span><span style="color:#ae81ff">1073737728</span> bytes<span style="color:#f92672">)</span> -no label, UUID<span style="color:#f92672">=</span>9a121c2c-cd6f-48bf-b928-e550095a3efd -ubuntu@ip-172-31-4-8:~$ sudo swapon /swapfile -ubuntu@ip-172-31-4-8:~$ sudo swapon --show -NAME TYPE SIZE USED PRIO -/swapfile file 1024M 0B -2 -ubuntu@ip-172-31-4-8:~$ -</code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">sudo nano /etc/fstab -</code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">/swapfile swap swap defaults <span style="color:#ae81ff">0</span> <span style="color:#ae81ff">0</span> -</code></pre></div><p>After that, reboot the machine.</p> -<h3 id="4-use-ec2-as-a-vpn-server">4. Use EC2 as a VPN server</h3> -<p>Create a new security group allows all TCP and UDP inbound connections and add this security group to the EC2 instance:</p> -<p><img src="./img/image-20200702200459525.png" alt="EC2 instance inbound rules"></p> -<p><img src="./img/image-20200702200555846.png" alt="Assign a security group"></p> -<h4 id="install-openvpn-scripts">Install openvpn scripts</h4> -<p><a href="https://github.com/Nyr/openvpn-install">This repo</a> contains scripts for VPN server set up and profile management. Install it into your EC2:</p> -<p>Download the script:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">sudo apt update -sudo apt upgrade -y -mkdir ~/vpn <span style="color:#f92672">&amp;&amp;</span> cd ~/vpn -wget https://git.io/vpn -O openvpn-install.sh -</code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">ubuntu@ip-172-31-4-8:~/vpn$ ll -total <span style="color:#ae81ff">32</span> -drwxrwxr-x <span style="color:#ae81ff">2</span> ubuntu ubuntu <span style="color:#ae81ff">4096</span> Jul <span style="color:#ae81ff">2</span> 12:11 ./ -drwxr-xr-x <span style="color:#ae81ff">19</span> ubuntu ubuntu <span style="color:#ae81ff">4096</span> Jul <span style="color:#ae81ff">2</span> 12:11 ../ --rw-rw-r-- <span style="color:#ae81ff">1</span> ubuntu ubuntu <span style="color:#ae81ff">23085</span> Jul <span style="color:#ae81ff">2</span> 12:11 openvpn-install.sh -</code></pre></div><p>Make the <code>openvpn-install.sh</code> exectable in your EC2:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">chmod +x openvpn-install.sh -sudo ./openvpn-install.sh -</code></pre></div><p>Add a new profile by running <code>openvpn-install.sh</code>:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">Welcome to this OpenVPN road warrior installer! - -This server is behind NAT. What is the public IPv4 address or hostname? -Public IPv4 address / hostname <span style="color:#f92672">[</span>18.183.12.213<span style="color:#f92672">]</span>: - -Which protocol should OpenVPN use? - 1<span style="color:#f92672">)</span> UDP <span style="color:#f92672">(</span>recommended<span style="color:#f92672">)</span> - 2<span style="color:#f92672">)</span> TCP -Protocol <span style="color:#f92672">[</span>1<span style="color:#f92672">]</span>: <span style="color:#ae81ff">1</span> - -What port should OpenVPN listen to? -Port <span style="color:#f92672">[</span>1194<span style="color:#f92672">]</span>: - -Select a DNS server <span style="color:#66d9ef">for</span> the clients: - 1<span style="color:#f92672">)</span> Current system resolvers - 2<span style="color:#f92672">)</span> Google - 3<span style="color:#f92672">)</span> 1.1.1.1 - 4<span style="color:#f92672">)</span> OpenDNS - 5<span style="color:#f92672">)</span> Quad9 - 6<span style="color:#f92672">)</span> AdGuard -DNS server <span style="color:#f92672">[</span>1<span style="color:#f92672">]</span>: <span style="color:#ae81ff">1</span> - -Enter a name <span style="color:#66d9ef">for</span> the first client: -Name <span style="color:#f92672">[</span>client<span style="color:#f92672">]</span>: demo-ec2-client - -OpenVPN installation is ready to begin. -Press any key to <span style="color:#66d9ef">continue</span>... -</code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">Finished! - -The client configuration is available in: /home/ubuntu/demo-ec2-client.ovpn -New clients can be added by running this script again. -</code></pre></div><p>Use another Terminal to download the <code>.ovpn</code> file. Assuming that the machine name is <code>ec2-0-1-2-3.ap-northeast-1.compute.amazonaws.com</code> and the generated <code>.ovpn</code> file is place under <code>~/</code>:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">scp -i sparkle.pem ubuntu@ec2-0-1-2-3.ap-northeast-1.compute.amazonaws.com:~/demo-ec2-client.ovpn ~/Downloads/demo-ec2-client.ovpn -</code></pre></div><h4 id="connect-to-the-vpn">Connect to the VPN</h4> -<p><a href="https://client.pritunl.com/">Pritunl Client</a> is a easy-to-use OpenVPN client. Downlaod and install it.</p> -<p>Launch the client and click <strong>Import Profile</strong>:</p> -<p><img src="./img/screenshot.png" alt="Import ovpn profile"></p> -<p>After that, click the burger menu of the profile and <strong>Connect</strong>.</p> -<hr> -<p>Reference:</p> -<p><a href="https://comtechies.com/how-to-set-up-gui-on-amazon-ec2-ubuntu-server.html">https://comtechies.com/how-to-set-up-gui-on-amazon-ec2-ubuntu-server.html</a></p> - - - - - - Atlassian Bamboo: an Opinionated Approach - https://blog.lofibean.cc/posts/notes-on-atlassian-bamboo/ - Sun, 20 Sep 2020 14:45:18 +0800 - - https://blog.lofibean.cc/posts/notes-on-atlassian-bamboo/ - - <img src="https://images.unsplash.com/photo-1510707421852-103d8d97c090?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1280&h=630&q=80" /><blockquote> -<p>This is the introduction related to my experience on using Atlassian Bamboo / MSBuild / MSDeploy / IIS, I will cover the build process / setup in the coming articles.</p> -</blockquote> -<h1 id="preface">Preface</h1> -<p>This is an article talking about <strong>my experience (≠ 100% solution. ≠ golden rule on CI/CD)</strong> on using <a href="https://www.atlassian.com/software/bamboo">Atlassian Bamboo</a>. It is <strong>a tool for <a href="https://www.atlassian.com/continuous-delivery/principles/continuous-integration-vs-delivery-vs-deployment">continuous integration, deployment, and delivery</a></strong>. I use this tool for all the <strong>.NET-based web applications running on the Windows ecosystem</strong>.</p> -<blockquote> -<p>Note on 2020: <a href="https://bitbucket.org/product/features/pipelines">Bitbucket Pipelines</a> is a newer service created by Atlassian. If you are building applications other then <a href="https://bitbucket.org/site/master/issues/13452/support-for-native-windows-net-builds-on">Windows</a>, <a href="https://bitbucket.org/site/master/issues/13719/support-for-macos-ios-in-pipelines">macOS, or iOS</a> applications then I strongly recommend you to use this instead of Bamboo.</p> -</blockquote> -<aside class="c-toc"> - <details open> - <summary title="click to toggle table of contents.">Table of Contents</summary> - <nav id="TableOfContents"> - <ul> - <li><a href="#deployment-cd">Deployment (CD)</a> - <ul> - <li><a href="#glossary">Glossary</a></li> - </ul> - </li> - <li><a href="#build-ci">Build (CI)</a> - <ul> - <li><a href="#glossary-1">Glossary</a></li> - </ul> - </li> - <li><a href="#git">Git</a></li> - </ul> - - <ul> - <li><a href="#deployment-cd-1">Deployment (CD)</a> - <ul> - <li><a href="#nuget-packages">Nuget Packages</a></li> - <li><a href="#websites">Websites</a></li> - </ul> - </li> - <li><a href="#build-ci-1">Build (CI)</a> - <ul> - <li><a href="#nuget-packages-1">Nuget Packages</a></li> - <li><a href="#websites-1">Websites</a></li> - </ul> - </li> - </ul> -</nav> - </details> -</aside> - -<h1 id="cicd-principles">CI/CD principles</h1> -<p><strong>In my opinion</strong>, when you start designing your CI/CD workflows:</p> -<ol> -<li>Make things <strong>predictable</strong>.</li> -<li>Think of the <strong>deployment (CD) first</strong>, then work backward to the <strong>integration (CI)</strong> part.</li> -<li>Use <em><strong>Gitflow</strong></em> in your source code.</li> -</ol> -<h1 id="fundamentals-of-bamboo">Fundamentals of Bamboo</h1> -<p>The menu in Bamboo (version 6.5.0) contains 3 parts:</p> -<ul> -<li><em>Projects</em>,</li> -<li><em>Build</em> and</li> -<li><em>Deploy</em>.</li> -</ul> -<p><img src="./img/image-20200913141147305.png" alt="Build dropdown menu"></p> -<p><img src="./img/image-20200913141246490.png" alt="Deploy dropdown menu"></p> -<h2 id="deployment-cd">Deployment (CD)</h2> -<p>Here is a typical <strong>deployment project summary</strong> looks like:</p> -<p><img src="./img/image-20200913132645203.png" alt="A typical deployment project"></p> -<p>You can check this out by clicking <strong>Deploy</strong> &gt; <strong>All Deployment Projects</strong>. After that, choose one of the item on the list.</p> -<h3 id="glossary">Glossary</h3> -<p><em>Artifact</em>: The content built in the CI part.</p> -<p><em>Deployment Environment</em>: The place the <em>artifacts</em> should go to.</p> -<p><em>Release</em>: A unique (and usually auto-increment) identifier of this deployment.</p> -<p><em>Deployment Project</em>: A collection of build plans.</p> -<h2 id="build-ci">Build (CI)</h2> -<p>Here is a typical build dashboard:</p> -<p><img src="./img/image-20200913130048805.png" alt="A typical build dashboard"></p> -<p>This is the default front page of Bamboo. You can also check this out by clicking <strong>Build</strong> &gt; <strong>All Build Plans</strong>.</p> -<h3 id="glossary-1">Glossary</h3> -<p><em>Build</em>: The build result of the default plan.</p> -<p><em>Build Plan</em>: Usually it refers to the definitions of all build-related configuratoins. However, sometimes it <em>also</em> refers to the <strong>default build barnch</strong> or the <strong>default branch configurations</strong>.</p> -<p>I will try to avoid using the term <em>build plan</em> in this article as it is a bit confusing. I will use :</p> -<ul> -<li> -<p><em>default branch configuratoins</em> to indicate the default settings of a <em>build plan</em>;</p> -</li> -<li> -<p><em>default build branch</em> to indicate the branch associated to the <em>default branch configuratoins</em>.</p> -</li> -<li> -<p>When I use the word <em>build plan</em>, it refers to the item listed under <strong>Plan</strong> column in the build dashboard.</p> -</li> -</ul> -<p><em>Build Project</em>: Similar to <em>Deployment Project</em>, it&rsquo;s a collection of <em>build plans</em>.</p> -<h2 id="git">Git</h2> -<p>From the basic assumption in the <a href="#cicd-principles">CI/CD principles, pt. 3</a> all the repositories are using <a href="https://nvie.com/posts/a-successful-git-branching-model/">Gitflow</a>. I will use the following conventions when talking about the CI settings.</p> -<p><em>Default build branch</em>: git&rsquo;s <code>develop</code> branch.</p> -<p><em>Build branch</em>: All the other git&rsquo;s branches, including <code>feature/*</code>, <code>release/*</code>, <code>hotfix/*</code>, <code>master</code></p> -<p><em>Master branch</em>: git&rsquo;s <code>master</code> branch</p> -<p><em>Linked Repository</em>: Store all the git repository connection setups for later user in CI/CD steps. It&rsquo;s under <strong>⚙️ (Bamboo Administration)</strong> &gt; <strong>Linked repositories</strong>.</p> -<p><img src="./img/image-20200919094705047.png" alt="Bamboo Administration > Linked repositories"></p> -<p>This is an example for a class library:</p> -<p><img src="./img/image-20200919093103200.png" alt="Plan branches in a class library build plan"></p> -<p>And this is an example for website:</p> -<p><img src="./img/image-20200919093317277.png" alt="Plan branches in a website build plan"></p> -<p>Next, I will talk about how to <strong>design</strong> a CD flow, then a CI flow.</p> -<h1 id="designing-a-cicd-workflow">Designing a CI/CD workflow</h1> -<blockquote> -<p>Assumption: you are using <a href="https://datasift.github.io/gitflow/IntroducingGitFlow.html"><em>gitflow</em></a> to manage your git repository.</p> -</blockquote> -<p>In short:</p> -<p><strong>Deployment</strong></p> -<ul> -<li>1 <em>deoloyment project</em>, many <em>deployment plans</em>.</li> -<li>1 destination, 1 <em>deployment plan</em>.</li> -</ul> -<p><strong>Integration</strong></p> -<ul> -<li>1 Bitbucket git repository, (usually) 1 Bamboo <em>build plan</em> -<ul> -<li>build the <code>develop</code> branch using <strong>default plan configuration</strong></li> -<li>git branch &lt;&ndash;&gt; <em>Branch config</em> of a build plan</li> -</ul> -</li> -<li>1 Bitbucket project, 1Bamboo <em>build project</em></li> -</ul> -<h2 id="deployment-cd-1">Deployment (CD)</h2> -<p>All the deployments in my team can be categorized in to 2 types: either a <strong>library</strong> (i.e. a nuget package) or a <strong>website</strong> (i.e. an IIS website).</p> -<h3 id="nuget-packages">Nuget Packages</h3> -<p>My team is using <a href="https://myget.org/">MyGet</a> to host private packages. So, there is only 1 destination for my <em>artifact</em> goes.</p> -<p><img src="./img/image-20200913153116958.png" alt="Bamboo class library CD flow"></p> -<p>This is how I organize the <em>deployment project</em>:</p> -<p><img src="./img/image-20200913154357682.png" alt="Class library deployment project setup"></p> -<pre tabindex="0"><code>Deployment Project -├── Production environment: for builds from master -└── Pre-release environment: all other branches -</code></pre><h3 id="websites">Websites</h3> -<p>We have 2 web servers for production and other environments has a corresponding web server. All running IIS. On the other hand, some of the websites are hosting under a sub-directory (as a sub-site).</p> -<p>Therefore, an <em>artifact</em> may goes to multiple destinations.</p> -<p>In my design, 1 <em>deployment environment</em> responsibles for 1 destination (i.e. 1 IIS web server).</p> -<p><img src="./img/image-20200913190536806.png" alt="Bamboo website CD flow"></p> -<p>So you may ask: why not 1 deployment environment for 1 environment? Here&rsquo;s why:</p> -<h4 id="1-to-1-mapping-of-deployment-environment-and-iis-website">1-to-1 mapping of <em>deployment environment</em> and <em>IIS website</em></h4> -<h5 id="the-bad">The bad</h5> -<p>One of the downside is: It takes longer time to deploy all websites. Consider the case of deploying 2 <em>deployment projects</em> at the same time, and each project has multiple <em>deployment environments</em>. The sequence of deployment activities can be:</p> -<ol> -<li>deploy site A to environment A</li> -<li>deploy site B to environment A</li> -<li>deploy site A to environment B (triggered by activity 1.)</li> -<li>deploy site B to environment B (triggered by activity 2.)</li> -</ol> -<p>Which means I have to wait for the deployment of another website.</p> -<h5 id="the-good">The good</h5> -<p>The biggest advantage of doing so is that modefying one <em>deployment environment</em> does not affect any settings of the other <em>deployment environments</em>. Then, I can do the following things:</p> -<ul> -<li>A/B testing</li> -<li>Rollback the version of a specific web server</li> -<li>Check out the audit log / deployment history for a particular web server</li> -</ul> -<p>Moreover, you can see the status of all environments in the <strong>All Deployment Projects</strong> page (<strong>Deploy</strong> &gt; <strong>All Deployment Projects</strong>).</p> -<ul> -<li>If deployment of a particular web server is failed, I am able to find out which server is it easily</li> -<li>Plus, I can just re-deploy to that particuler web server</li> -</ul> -<p>You can create a new <em>deployment environment</em> by cloning an existing one (from the same <em>deployment project</em> or from another one). Thus, this is not a tedious task.</p> -<p>(I am not sure about the above observation and please do let me know if I got something wrong or there are any better solutions.)</p> -<h5 id="my-decision">My decision</h5> -<p>This is how I organize the <em>deployment project</em>:</p> -<p><img src="./img/image-20200913154337848.png" alt="Website deployment project setup"></p> -<pre tabindex="0"><code>Deployment Project -├── Production (A) environment: for builds from master / release -├── Production (B) environment: for builds from master / release -├── Staging environment: all other branches -└── UAT environment: all other branches -</code></pre><h2 id="build-ci-1">Build (CI)</h2> -<p>Similarly, my team has to build nuget packages, .NET Framework and .NET Core web applications.</p> -<p>In my case, the CI part has a close relationship with the <strong>gitflow</strong>.</p> -<h3 id="nuget-packages-1">Nuget Packages</h3> -<p>I need to build 2 kinds of <em>artifacts</em>:</p> -<ul> -<li>Testing package: <strong>Prerelease</strong>;</li> -<li>Production package; <strong>Release</strong> (used by other solutions/projects in production) deployment.</li> -</ul> -<h4 id="planbranch-configurations">Plan/Branch configurations</h4> -<p>(See the <a href="#default-configurations-develop">Websites</a> section.)</p> -<p><img src="./img/ci-cd-CI-Nuget.png" alt="Bamboo class library CI flow"></p> -<h3 id="websites-1">Websites</h3> -<p>I need to build 2-3 kinds of <em>artifacts</em>:</p> -<ul> -<li>For <strong>UAT</strong> environment;</li> -<li>For <strong>Staging</strong> environment (this environment is not 24/7 and will be set up when necessary);</li> -<li>For <strong>Production</strong> environment.</li> -</ul> -<p><img src="./img/ci-cd-CI-IIS.png" alt="Bamboo website CI flow"></p> -<h4 id="default-configurations-develop">Default configurations: <code>develop</code></h4> -<p>For the default settings in a <em>build plan</em>, always choose the <code>develop</code> as the main branch and allow Bamboo to create/remove all the <code>feature/*</code>, <code>hotfix/*</code> branches.</p> -<h4 id="production-configurations-master">Production configurations: <code>master</code></h4> -<p>Define a build plan for <code>master</code> branch. Uncheck <strong>Clean up plan branch automatically</strong> under <strong>Branch details</strong> tab to prevent this branch being deleted by Bamboo.</p> -<h5 id="note-on-release-branches">Note on <code>release</code> branches</h5> -<p>I ususlly not using <code>release</code> branch. When I use that, I will set up a build branch <strong>manually</strong>, just like the <code>master</code>.</p> -<h4 id="staging-configurations-staging">Staging configurations: <code>staging</code></h4> -<p>Just like the set up of <strong>production configurations</strong>. However, change the variables for the staging environment.</p> -<p><img src="./img/image-20200920110535916.png" alt="Build branch configuration - Branch details"></p> -<p>You may also need to override the <em>default branch configurations</em> under the <strong>Variables</strong> tab.</p> -<p><img src="./img/image-20200920110548520.png" alt="Build branch configuration - Variables"></p> -<p>You can find these tabs under form the top menu: <strong>Build</strong> &gt; <strong>All build plans</strong> &gt; <strong>🖋</strong> (right end of the plan) &gt; (Choose the plan branch name).</p> - - - - - - Ruby Cheatsheet - https://blog.lofibean.cc/posts/ruby-cheatsheet/ - Tue, 15 Sep 2020 08:40:48 +0800 - - https://blog.lofibean.cc/posts/ruby-cheatsheet/ - - <img src="https://static.dribbble.com/users/79571/screenshots/2232375/ruby.png" /><p>This post contains many useful snippets for me when writing <strong>Ruby</strong> scripts. I will keep updating this note in the future.</p> -<aside class="c-toc"> - <details open> - <summary title="click to toggle table of contents.">Table of Contents</summary> - <nav id="TableOfContents"> - <ul> - <li><a href="#-about-file">🏷 About File</a> - <ul> - <li><a href="#absolute-path">Absolute Path</a></li> - <li><a href="#read--write-a-file">Read / Write a file</a></li> - </ul> - </li> - <li><a href="#-about-string">🏷 About String</a> - <ul> - <li><a href="#string-template">String template</a></li> - <li><a href="#string-interpolation">String Interpolation</a></li> - <li><a href="#trim-a-string">Trim a String</a></li> - <li><a href="#null-or-empty">Null Or Empty</a></li> - <li><a href="#titlecase--uppercase--lowercase--capitalize">Titlecase / UPPERCASE / lowercase / Capitalize</a></li> - </ul> - </li> - <li><a href="#-about-input">🏷 About Input</a> - <ul> - <li><a href="#console-input">Console Input</a></li> - </ul> - </li> - <li><a href="#-about-regex">🏷 About Regex</a> - <ul> - <li><a href="#named-regex-capturing-group">Named regex capturing group</a></li> - </ul> - </li> - <li><a href="#-about-bundler-and-gemfile">🏷 About Bundler and Gemfile</a> - <ul> - <li><a href="#install-bundler">Install bundler</a></li> - <li><a href="#setup-and-restore-dependencies">Setup and restore dependencies</a></li> - <li><a href="#check-the-info-of-a-installed-gem">Check the info of a installed gem</a></li> - </ul> - </li> - </ul> -</nav> - </details> -</aside> - -<h2 id="-about-file">🏷 About File</h2> -<h3 id="absolute-path">Absolute Path</h3> -<p><code>__dir__</code> returns the current path.</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-ruby" data-lang="ruby"><span style="color:#66d9ef">File</span><span style="color:#f92672">.</span>join(__dir__, file_name_no_path ) -</code></pre></div><h3 id="read--write-a-file">Read / Write a file</h3> -<p>Read the content of <code>file_name</code> to <code>buffer</code></p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-ruby" data-lang="ruby">buffer <span style="color:#f92672">=</span> <span style="color:#66d9ef">File</span><span style="color:#f92672">.</span>read( file_name ) -</code></pre></div><p>Write <code>content</code> to <code>file_name</code>. File will be created when it does not exist.</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-ruby" data-lang="ruby"><span style="color:#66d9ef">File</span><span style="color:#f92672">.</span>open( file_name , <span style="color:#e6db74">&#34;w&#34;</span>) { <span style="color:#f92672">|</span>f<span style="color:#f92672">|</span> f<span style="color:#f92672">.</span>write( content ) } -</code></pre></div><h2 id="-about-string">🏷 About String</h2> -<h3 id="string-template">String template</h3> -<p>To create a multiline string template:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">template <span style="color:#f92672">=</span> <span style="color:#e6db74">&lt;&lt;-EOCONTENT -</span><span style="color:#e6db74">Your -</span><span style="color:#e6db74">Multiline -</span><span style="color:#e6db74">Text -</span><span style="color:#e6db74">Content -</span><span style="color:#e6db74">EOCONTENT</span> -</code></pre></div><h3 id="string-interpolation">String Interpolation</h3> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-ruby" data-lang="ruby">str <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;This is a string with </span><span style="color:#e6db74">#{</span>variable_name<span style="color:#e6db74">}</span><span style="color:#e6db74">.&#34;</span> -</code></pre></div><h3 id="trim-a-string">Trim a String</h3> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-ruby" data-lang="ruby"><span style="color:#e6db74">&#34; Hello James &#34;</span><span style="color:#f92672">.</span>strip <span style="color:#75715e">#=&gt; &#34;Hello James&#34;</span> -</code></pre></div><h3 id="null-or-empty">Null Or Empty</h3> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-ruby" data-lang="ruby">str<span style="color:#f92672">.</span>nil? ? <span style="color:#e6db74">&#34;null&#34;</span> : <span style="color:#e6db74">&#34;not_null&#34;</span> -str<span style="color:#f92672">.</span>empty? ? <span style="color:#e6db74">&#34;empty&#34;</span> : <span style="color:#e6db74">&#34;not_empty&#34;</span> -</code></pre></div><h3 id="titlecase--uppercase--lowercase--capitalize">Titlecase / UPPERCASE / lowercase / Capitalize</h3> -<p>All returns a new copy. Examples from <a href="https://stackoverflow.com/a/1020571/13742790">this answer in StackOverflow</a>.</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-ruby" data-lang="ruby"><span style="color:#e6db74">&#34;hello James&#34;</span><span style="color:#f92672">.</span>titleize <span style="color:#75715e">#=&gt; &#34;Hello James&#34;</span> -<span style="color:#e6db74">&#34;hello James&#34;</span><span style="color:#f92672">.</span>upcase <span style="color:#75715e">#=&gt; &#34;HELLO JAMES&#34;</span> -<span style="color:#e6db74">&#34;hello James&#34;</span><span style="color:#f92672">.</span>downcase <span style="color:#75715e">#=&gt; &#34;hello james&#34;</span> -<span style="color:#e6db74">&#34;hello James&#34;</span><span style="color:#f92672">.</span>capitalize <span style="color:#75715e">#=&gt; &#34;Hello james&#34;</span> -</code></pre></div><p>Note: <strong>Alter the original string</strong> by adding <code>!</code> right after the method.</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-ruby" data-lang="ruby"><span style="color:#e6db74">&#34;hello James&#34;</span><span style="color:#f92672">.</span>downcase! -</code></pre></div><h2 id="-about-input">🏷 About Input</h2> -<h3 id="console-input">Console Input</h3> -<p>Ask a question and wait for user input:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-ruby" data-lang="ruby">print <span style="color:#e6db74">&#34;Your question: &#34;</span> -user_input <span style="color:#f92672">=</span> gets -</code></pre></div><p>(you may need to <code>strip</code> the <code>user_input</code> to ger rid of a tailing newline.)</p> -<h2 id="-about-regex">🏷 About Regex</h2> -<p>Test a ruby regex: <a href="https://rubular.com/">https://rubular.com/</a></p> -<h3 id="named-regex-capturing-group">Named regex capturing group</h3> -<p>Steps:</p> -<ol> -<li>Prepare the regex: <code>^(\w+)(Query|Command)$</code>.</li> -<li>Add <code>?&lt;named_group&gt;</code> at the beginning <strong>inside</strong> that capturing group.</li> -<li>Do the regex <code>match()</code></li> -<li>Retrieve the named group: <code>[:named_group]</code></li> -</ol> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-ruby" data-lang="ruby"><span style="color:#75715e">## name: SomeStuffQuery ; result: SomeStuff</span> -result <span style="color:#f92672">=</span> <span style="color:#e6db74">/^(?&lt;named_group&gt;\w+)(Query|Command)$/</span><span style="color:#f92672">.</span>match(name)<span style="color:#f92672">[</span><span style="color:#e6db74">:named_group</span><span style="color:#f92672">]</span> -</code></pre></div><p>If your regex is valid, you should be able to see the captured group and related content:</p> -<p><img src="https://blog.lofibean.cc/img/image-20200915091031591.png" alt="image-20200915091031591"></p> -<h2 id="-about-bundler-and-gemfile">🏷 About Bundler and Gemfile</h2> -<p><a href="https://bundler.io/">Bundler</a> helps you to manage gem denendencies in your project.</p> -<h3 id="install-bundler">Install bundler</h3> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-zsh" data-lang="zsh">gem install bundler -bundler -v -</code></pre></div><h3 id="setup-and-restore-dependencies">Setup and restore dependencies</h3> -<p>Create a <code>Gemfile</code>:</p> -<pre tabindex="0"><code class="language-gemfile" data-lang="gemfile">source 'https://rubygems.org' -gem 'dotenv', '~&gt; 2.7', '&gt;= 2.7.5' -gem &quot;mustache&quot;, &quot;~&gt; 1.0&quot; -</code></pre><h4 id="globally">Globally</h4> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">bundle <span style="color:#75715e"># may requires sudo</span> -</code></pre></div><h4 id="locally">Locally</h4> -<p>To install gems at a relative path e.g. at the <code>lib</code> folder:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">bundle install --path<span style="color:#f92672">=</span>./lib -</code></pre></div><p>a <code>.bundle</code> folder will be generated, together with your <code>Gemfile.lock</code>.</p> -<h3 id="check-the-info-of-a-installed-gem">Check the info of a installed gem</h3> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">❯ bundle info ruby_http_client - * ruby_http_client <span style="color:#f92672">(</span>3.5.1<span style="color:#f92672">)</span> - Summary: A simple REST client - Homepage: http://github.com/sendgrid/ruby-http-client - Path: ~/git/my-folder/lib/ruby/2.6.0/gems/ruby_http_client-3.5.1 -</code></pre></div><hr> -<p><em>(cover image from <a href="https://dribbble.com/shots/2232375-Ruby">this dribble</a>)</em></p> - - - - - - Use Gravatar Everywhere - https://blog.lofibean.cc/posts/use-gravatar-everywhere/ - Sat, 18 Jul 2020 12:01:56 +0800 - - https://blog.lofibean.cc/posts/use-gravatar-everywhere/ - - <h3 id="what-is-gravatar">What is Gravatar</h3> -<p>Your public profile on the internet, provided by Wordpress. See <a href="https://en.gravatar.com/">https://en.gravatar.com/</a>.</p> -<h3 id="1-upload-an-image-to-your-gravatar-account">1. Upload an image to your gravatar account</h3> -<p>If you don&rsquo;t have the gravatar account, create one. Make sure that the email you used to create the account will be the email account you want to link your profile picture.</p> -<p>After that, upload your profile picture to gravatar.</p> -<h3 id="2-use-the-image-everywhere">2. Use the image everywhere</h3> -<h4 id="get-your-md5-hash-of-email-address">Get your md5 hash of email address</h4> -<p>For MacOS user, you should have the md5 utility installed, go to the terminal and check:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">❯ which md5 -/sbin/md5 -</code></pre></div><p>After that, generate the md5 has of your email address:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">❯ md5 -s <span style="color:#e6db74">&#34;myemall@address.com&#34;</span> -MD5 <span style="color:#f92672">(</span><span style="color:#e6db74">&#34;myemall@address.com&#34;</span><span style="color:#f92672">)</span> <span style="color:#f92672">=</span> ca49930cff2f87bd37bfe71ce21467f -</code></pre></div><p>The gravatar image url is in this format:</p> -<pre tabindex="0"><code>https://gravatar.com/avatar/{your md5 hash}?s={size} -</code></pre><p>If you want to have a 200px avatar, use <code>https://gravatar.com/avatar/ca49930cff2f87bd37bfe71ce21467f?s=200</code></p> -<p>use this image url in <code>&lt;img&gt;</code> tag:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-html" data-lang="html">&lt;<span style="color:#f92672">img</span> <span style="color:#a6e22e">src</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://gravatar.com/avatar/ca49930cff2f87bd37bfe71ce21467f?s=200&#34;</span> /&gt; -</code></pre></div><p>And you are good to go!</p> - - - - - - Displaying the Full Content in Hugo's RSS feed - https://blog.lofibean.cc/posts/displaying-the-full-content-in-hugo-rss-feed/ - Fri, 03 Jul 2020 09:53:38 +0800 - - https://blog.lofibean.cc/posts/displaying-the-full-content-in-hugo-rss-feed/ - - <h2 id="background">Background</h2> -<p>Recently I created a hugo blog and started writing articles (yes, that&rsquo;s the blog you are reading). Later, I found that dev.to can <a href="https://dev.to/settings/publishing-from-rss">publish articles (as draft) from a RSS feed</a>. In that way I don&rsquo;t have to copy-and-paste my articles manually in order to publish the same item on dev.to!</p> -<aside class="c-toc"> - <details open> - <summary title="click to toggle table of contents.">Table of Contents</summary> - <nav id="TableOfContents"> - <ul> - <li><a href="#background">Background</a></li> - <li><a href="#problem">😨 Problem</a></li> - <li><a href="#solution">😀 Solution</a> - <ul> - <li><a href="#locating-rssxml">Locating <code>rss.xml</code></a></li> - <li><a href="#rendering-the-full-content">Rendering the full content</a></li> - <li><a href="#regenerating-the-site">Regenerating the site</a></li> - </ul> - </li> - <li><a href="#bonus-the-difference-between--and---in-hugo">Bonus: The difference between <code>{{</code> and <code>{{-</code> in Hugo</a></li> - <li><a href="#conclusion">Conclusion</a></li> - </ul> -</nav> - </details> -</aside> - -<h2 id="problem">😨 Problem</h2> -<p>Although dev.to&rsquo;s puslishing from RSS feed service is great, my Hugo site is not that great (with the basic settings). <strong>When I was trying to sync my RSS feed items to dev.to, all items can be imported but only the beginning part of the content was fetched.</strong></p> -<p>I know that should be something wrong with the RSS feeds generated by Hugo. The <a href="https://github.com/gohugoio/hugo/blob/master/tpl/tplimpl/embedded/templates/_default/rss.xml">default Hugo RSS template</a> only renders <code>Summary</code> of an article and my Hugo theme is using that:</p> -<script type="application/javascript" src="https://gist.github.com/bemnlam/83b253aef5526c30ca5535c72bd861cc.js"></script> - -<p>As you can see in <strong>line 73</strong>, the <a href="https://validator.w3.org/feed/docs/rss2.html"><code>&lt;description&gt;</code></a> in my RSS feeds contain article summary only but not the full content. Is there any ways to change the <code>Summary</code> here into something else? Something else that represents the <strong>full content</strong>?</p> -<h2 id="solution">😀 Solution</h2> -<h3 id="locating-rssxml">Locating <code>rss.xml</code></h3> -<p>Usually, Hugo templates are placed under <code>{your hugo theme}/layouts/_defualt/</code>. If such file does not exist, it&rsquo;s time to create one. You can copy-and-paste the code from <a href="https://github.com/gohugoio/hugo/blob/master/tpl/tplimpl/embedded/templates/_default/rss.xml">Hugo&rsquo;s github</a> or run the following <code>curl</code> command under <code>/layouts/_default</code> to download it:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">curl <span style="color:#e6db74">&#34;https://raw.githubusercontent.com/gohugoio/hugo/master/tpl/tplimpl/embedded/templates/_default/rss.xml&#34;</span> &gt; rss.xml -</code></pre></div><h3 id="rendering-the-full-content">Rendering the full content</h3> -<p>Rendering the full content of is really simple and straight-forward. What you need to do is just replacing this:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-go-html-template" data-lang="go-html-template">&lt;<span style="color:#f92672">description</span>&gt;<span style="color:#75715e">{{</span> <span style="color:#a6e22e">.Summary</span> <span style="color:#f92672">|</span> <span style="color:#66d9ef">html</span> <span style="color:#75715e">}}</span>&lt;/<span style="color:#f92672">description</span>&gt; -</code></pre></div><p>With this:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-go-html-template" data-lang="go-html-template">&lt;<span style="color:#f92672">description</span>&gt;<span style="color:#75715e">{{-</span> <span style="color:#a6e22e">.Content</span> <span style="color:#f92672">|</span> <span style="color:#66d9ef">html</span> <span style="color:#75715e">-}}</span>&lt;/<span style="color:#f92672">description</span>&gt; -</code></pre></div><p>Caution: use <code>{{-</code> instead of <code>{{</code>. Read <a href="#bonus-the-difference-between--and---in-hugo">the bonus part</a> if you want to know what is the difference.</p> -<h3 id="regenerating-the-site">Regenerating the site</h3> -<p>Updating the RSS template <strong>will not</strong> update your <strong>generated content</strong> automatically. Therefore, you need to re-generate your Hugo site:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">hugo -</code></pre></div><p>You should see the changes in all RSS xml files (from git). After that, push all the code changes, remove all the fetched posts in dev.to and re-fetch them. That&rsquo;s it.</p> -<h2 id="bonus-the-difference-between--and---in-hugo">Bonus: The difference between <code>{{</code> and <code>{{-</code> in Hugo</h2> -<p>You may notice that the template code is changed into <code>{{-</code> from <code>{{</code>. As a newbie in Hugo I checked <a href="https://gohugo.io/templates/introduction/#whitespace">the Hugo&rsquo;s official documentation about <em>whitespace</em></a>.</p> -<blockquote> -<p>&hellip; the ability to trim the whitespace from either side of a Go tag &hellip;</p> -</blockquote> -<p>This <code>-</code> notation is introduced in Go 1.6.</p> -<p>The following example (from the documentation):</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-go-html-template" data-lang="go-html-template">&lt;<span style="color:#f92672">div</span>&gt; - <span style="color:#75715e">{{</span> <span style="color:#a6e22e">.Title</span> <span style="color:#75715e">}}</span> -&lt;/<span style="color:#f92672">div</span>&gt; -&lt;<span style="color:#f92672">div</span>&gt; - <span style="color:#75715e">{{-</span> <span style="color:#a6e22e">.Title</span> <span style="color:#75715e">-}}</span> -&lt;/<span style="color:#f92672">div</span>&gt; -</code></pre></div><p>Which will output:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-html" data-lang="html">&lt;<span style="color:#f92672">div</span>&gt; - Hello, World! -&lt;/<span style="color:#f92672">div</span>&gt; -&lt;<span style="color:#f92672">div</span>&gt;Hello, World!&lt;/<span style="color:#f92672">div</span>&gt; -</code></pre></div><p>In other words, that&rsquo;s the <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim"><code>trim()</code></a> in JavaScript. That&rsquo;s the <a href="https://docs.microsoft.com/en-us/dotnet/api/system.string.trim"><code>String.Trim()</code></a> in C#.</p> -<h2 id="conclusion">Conclusion</h2> -<p>The default RSS feed in Hugo site shows <em>article abstract</em> only. By defining a custom <code>rss.xml</code> template and replacing <code>{{ .Summary | html }}</code> with <code>{{- .Content | html -}}</code> in the <code>&lt;description&gt;</code> tag you will get the article&rsquo;s full content in the re-generated RSS xml files.</p> - - - - - - 🐞 Battling With Gulp and Node - https://blog.lofibean.cc/posts/battling-with-gulp-and-node/ - Sat, 27 Jun 2020 16:03:12 +0800 - - https://blog.lofibean.cc/posts/battling-with-gulp-and-node/ - - <h2 id="-problem">😨 Problem</h2> -<p>When I was building a website using <code>gulp@^3.9.0</code> to compile sass on the build server with Node.js v12 installed, it failed.</p> -<p>Here are (part of) the errors shown in the console:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-systemverilog" data-lang="systemverilog">error <span style="color:#ae81ff">26</span><span style="color:#f92672">-</span>Jun<span style="color:#f92672">-</span><span style="color:#ae81ff">2020</span> <span style="color:#ae81ff">08</span><span style="color:#f92672">:</span><span style="color:#ae81ff">35</span><span style="color:#f92672">:</span><span style="color:#ae81ff">02</span> gyp ERR<span style="color:#f92672">!</span> node <span style="color:#f92672">-</span>v v12<span style="color:#ae81ff">.18.0</span> -error <span style="color:#ae81ff">26</span><span style="color:#f92672">-</span>Jun<span style="color:#f92672">-</span><span style="color:#ae81ff">2020</span> <span style="color:#ae81ff">08</span><span style="color:#f92672">:</span><span style="color:#ae81ff">35</span><span style="color:#f92672">:</span><span style="color:#ae81ff">02</span> gyp ERR<span style="color:#f92672">!</span> node<span style="color:#f92672">-</span>gyp <span style="color:#f92672">-</span>v v3<span style="color:#ae81ff">.8.0</span> -error <span style="color:#ae81ff">26</span><span style="color:#f92672">-</span>Jun<span style="color:#f92672">-</span><span style="color:#ae81ff">2020</span> <span style="color:#ae81ff">08</span><span style="color:#f92672">:</span><span style="color:#ae81ff">35</span><span style="color:#f92672">:</span><span style="color:#ae81ff">02</span> gyp ERR<span style="color:#f92672">!</span> <span style="color:#66d9ef">not</span> ok -error <span style="color:#ae81ff">26</span><span style="color:#f92672">-</span>Jun<span style="color:#f92672">-</span><span style="color:#ae81ff">2020</span> <span style="color:#ae81ff">08</span><span style="color:#f92672">:</span><span style="color:#ae81ff">35</span><span style="color:#f92672">:</span><span style="color:#ae81ff">02</span> Build failed <span style="color:#66d9ef">with</span> error code: <span style="color:#ae81ff">1</span> -error <span style="color:#ae81ff">26</span><span style="color:#f92672">-</span>Jun<span style="color:#f92672">-</span><span style="color:#ae81ff">2020</span> <span style="color:#ae81ff">08</span><span style="color:#f92672">:</span><span style="color:#ae81ff">35</span><span style="color:#f92672">:</span><span style="color:#ae81ff">05</span> -error <span style="color:#ae81ff">26</span><span style="color:#f92672">-</span>Jun<span style="color:#f92672">-</span><span style="color:#ae81ff">2020</span> <span style="color:#ae81ff">08</span><span style="color:#f92672">:</span><span style="color:#ae81ff">35</span><span style="color:#f92672">:</span><span style="color:#ae81ff">05</span> npm ERR<span style="color:#f92672">!</span> code ELIFECYCLE -error <span style="color:#ae81ff">26</span><span style="color:#f92672">-</span>Jun<span style="color:#f92672">-</span><span style="color:#ae81ff">2020</span> <span style="color:#ae81ff">08</span><span style="color:#f92672">:</span><span style="color:#ae81ff">35</span><span style="color:#f92672">:</span><span style="color:#ae81ff">05</span> npm ERR<span style="color:#f92672">!</span> errno <span style="color:#ae81ff">1</span> -error <span style="color:#ae81ff">26</span><span style="color:#f92672">-</span>Jun<span style="color:#f92672">-</span><span style="color:#ae81ff">2020</span> <span style="color:#ae81ff">08</span><span style="color:#f92672">:</span><span style="color:#ae81ff">35</span><span style="color:#f92672">:</span><span style="color:#ae81ff">05</span> npm ERR<span style="color:#f92672">!</span> node<span style="color:#f92672">-</span>sass@<span style="color:#ae81ff">4.9.3</span> postinstall: <span style="color:#66d9ef">`node</span> scripts<span style="color:#f92672">/</span>build.js<span style="color:#960050;background-color:#1e0010">`</span> -error <span style="color:#ae81ff">26</span><span style="color:#f92672">-</span>Jun<span style="color:#f92672">-</span><span style="color:#ae81ff">2020</span> <span style="color:#ae81ff">08</span><span style="color:#f92672">:</span><span style="color:#ae81ff">35</span><span style="color:#f92672">:</span><span style="color:#ae81ff">05</span> npm ERR<span style="color:#f92672">!</span> Exit status <span style="color:#ae81ff">1</span> -error <span style="color:#ae81ff">26</span><span style="color:#f92672">-</span>Jun<span style="color:#f92672">-</span><span style="color:#ae81ff">2020</span> <span style="color:#ae81ff">08</span><span style="color:#f92672">:</span><span style="color:#ae81ff">35</span><span style="color:#f92672">:</span><span style="color:#ae81ff">05</span> npm ERR<span style="color:#f92672">!</span> -error <span style="color:#ae81ff">26</span><span style="color:#f92672">-</span>Jun<span style="color:#f92672">-</span><span style="color:#ae81ff">2020</span> <span style="color:#ae81ff">08</span><span style="color:#f92672">:</span><span style="color:#ae81ff">35</span><span style="color:#f92672">:</span><span style="color:#ae81ff">05</span> npm ERR<span style="color:#f92672">!</span> Failed at the node<span style="color:#f92672">-</span>sass@<span style="color:#ae81ff">4.9.3</span> postinstall script. -error <span style="color:#ae81ff">26</span><span style="color:#f92672">-</span>Jun<span style="color:#f92672">-</span><span style="color:#ae81ff">2020</span> <span style="color:#ae81ff">08</span><span style="color:#f92672">:</span><span style="color:#ae81ff">35</span><span style="color:#f92672">:</span><span style="color:#ae81ff">05</span> npm ERR<span style="color:#f92672">!</span> This is probably <span style="color:#66d9ef">not</span> a problem <span style="color:#66d9ef">with</span> npm. There is likely additional logging <span style="color:#66d9ef">output</span> above. -</code></pre></div><p>(OK I know that&rsquo;s not your fault, <code>npm</code>.) Here is my <code>package.json</code>:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-json" data-lang="json">{ - <span style="color:#f92672">&#34;devDependencies&#34;</span>: { - <span style="color:#f92672">&#34;gulp&#34;</span>: <span style="color:#e6db74">&#34;^3.9.0&#34;</span>, - <span style="color:#f92672">&#34;gulp-concat&#34;</span>: <span style="color:#e6db74">&#34;^2.6.0&#34;</span>, - <span style="color:#f92672">&#34;gulp-minify-css&#34;</span>: <span style="color:#e6db74">&#34;^1.2.4&#34;</span>, - <span style="color:#f92672">&#34;gulp-rename&#34;</span>: <span style="color:#e6db74">&#34;^1.2.2&#34;</span>, - <span style="color:#f92672">&#34;gulp-sass&#34;</span>: <span style="color:#e6db74">&#34;^4.0.2&#34;</span>, - <span style="color:#f92672">&#34;gulp-sourcemaps&#34;</span>: <span style="color:#e6db74">&#34;*&#34;</span> - } -} -</code></pre></div><h3 id="-node-sass">😐 <code>node-sass</code></h3> -<p>I noticed that should be something wrong with <code>node-sass</code>, which being used in <code>gulp-sass</code>. I met this issues before and from my experience, <a href="https://stackoverflow.com/a/45807410/13742790"><code>node-sass</code> will try to download the corresponding prebuilt binary</a> base on your OS or build it locally using <code>python</code>, <code>MSBuild</code>, etc&hellip; (That&rsquo;s why you will met lots of questions in Stack Overflow asking <strong><code>python2</code> not found when installing <code>node-sass</code></strong> , <strong>what&rsquo;s wrong with my <code>node-sass</code></strong> or <strong>I got a panic attack when dealing with <code>node-sass</code> should I consult a developer or a doctor first?</strong>).</p> -<p>For this <code>node-sass</code> issue, <a href="https://hisk.io/how-to-fix-node-js-gyp-err-cant-find-python-executable-python-on-windows/">you can try to run this on Windows</a>:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-sh" data-lang="sh">npm install --global --production windows-build-tools -npm install node-gyp -</code></pre></div><p>Or try to delete <code>package-lock.json</code> and <code>node_modules</code> first and do a <code>npm install</code> if you can install all packages successfully on let say Mac OS but failed on Windows.</p> -<p>👆Those tricks saved me most of the time.</p> -<h4 id="i-just-want-to-get-my-css-files-back-and-you-told-me-i-have-to-install-this-and-that-and-download-node-npm-python-ms-build-tools-some-prebuilt-binaries-are-you-serious-node-sass"><del>I just want to get my css files back and you told me I have to install this and that and download node npm python ms build tools some prebuilt binaries? Are you serious, node-sass?</del></h4> -<h3 id="-referenceerror-primordials-is-not-defined">😑 ReferenceError: primordials is not defined</h3> -<p>After the <code>node-sass</code> issue was solved, the build server ran the build jobs again and got these errors:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-systemverilog" data-lang="systemverilog">error <span style="color:#ae81ff">26</span><span style="color:#f92672">-</span>Jun<span style="color:#f92672">-</span><span style="color:#ae81ff">2020</span> <span style="color:#ae81ff">08</span><span style="color:#f92672">:</span><span style="color:#ae81ff">53</span><span style="color:#f92672">:</span><span style="color:#ae81ff">06</span> fs.js:<span style="color:#ae81ff">35</span> -error <span style="color:#ae81ff">26</span><span style="color:#f92672">-</span>Jun<span style="color:#f92672">-</span><span style="color:#ae81ff">2020</span> <span style="color:#ae81ff">08</span><span style="color:#f92672">:</span><span style="color:#ae81ff">53</span><span style="color:#f92672">:</span><span style="color:#ae81ff">06</span> } <span style="color:#f92672">=</span> primordials; -error <span style="color:#ae81ff">26</span><span style="color:#f92672">-</span>Jun<span style="color:#f92672">-</span><span style="color:#ae81ff">2020</span> <span style="color:#ae81ff">08</span><span style="color:#f92672">:</span><span style="color:#ae81ff">53</span><span style="color:#f92672">:</span><span style="color:#ae81ff">06</span> <span style="color:#f92672">^</span> -error <span style="color:#ae81ff">26</span><span style="color:#f92672">-</span>Jun<span style="color:#f92672">-</span><span style="color:#ae81ff">2020</span> <span style="color:#ae81ff">08</span><span style="color:#f92672">:</span><span style="color:#ae81ff">53</span><span style="color:#f92672">:</span><span style="color:#ae81ff">06</span> -error <span style="color:#ae81ff">26</span><span style="color:#f92672">-</span>Jun<span style="color:#f92672">-</span><span style="color:#ae81ff">2020</span> <span style="color:#ae81ff">08</span><span style="color:#f92672">:</span><span style="color:#ae81ff">53</span><span style="color:#f92672">:</span><span style="color:#ae81ff">06</span> ReferenceError: primordials is <span style="color:#66d9ef">not</span> defined -error <span style="color:#ae81ff">26</span><span style="color:#f92672">-</span>Jun<span style="color:#f92672">-</span><span style="color:#ae81ff">2020</span> <span style="color:#ae81ff">08</span><span style="color:#f92672">:</span><span style="color:#ae81ff">53</span><span style="color:#f92672">:</span><span style="color:#ae81ff">06</span> at fs.js:<span style="color:#ae81ff">35</span><span style="color:#f92672">:</span><span style="color:#ae81ff">5</span> -## ( blah blah blah ) ## -error <span style="color:#ae81ff">26</span><span style="color:#f92672">-</span>Jun<span style="color:#f92672">-</span><span style="color:#ae81ff">2020</span> <span style="color:#ae81ff">08</span><span style="color:#f92672">:</span><span style="color:#ae81ff">53</span><span style="color:#f92672">:</span><span style="color:#ae81ff">06</span> at Module._compile (internal<span style="color:#f92672">/</span>modules<span style="color:#f92672">/</span>cjs<span style="color:#f92672">/</span>loader.js:<span style="color:#ae81ff">1138</span><span style="color:#f92672">:</span><span style="color:#ae81ff">30</span>) -error <span style="color:#ae81ff">26</span><span style="color:#f92672">-</span>Jun<span style="color:#f92672">-</span><span style="color:#ae81ff">2020</span> <span style="color:#ae81ff">08</span><span style="color:#f92672">:</span><span style="color:#ae81ff">53</span><span style="color:#f92672">:</span><span style="color:#ae81ff">06</span> at Object.Module._extensions..js (internal<span style="color:#f92672">/</span>modules<span style="color:#f92672">/</span>cjs<span style="color:#f92672">/</span>loader.js:<span style="color:#ae81ff">1158</span><span style="color:#f92672">:</span><span style="color:#ae81ff">10</span>) -error <span style="color:#ae81ff">26</span><span style="color:#f92672">-</span>Jun<span style="color:#f92672">-</span><span style="color:#ae81ff">2020</span> <span style="color:#ae81ff">08</span><span style="color:#f92672">:</span><span style="color:#ae81ff">53</span><span style="color:#f92672">:</span><span style="color:#ae81ff">06</span> at Module.load (internal<span style="color:#f92672">/</span>modules<span style="color:#f92672">/</span>cjs<span style="color:#f92672">/</span>loader.js:<span style="color:#ae81ff">986</span><span style="color:#f92672">:</span><span style="color:#ae81ff">32</span>) -error <span style="color:#ae81ff">26</span><span style="color:#f92672">-</span>Jun<span style="color:#f92672">-</span><span style="color:#ae81ff">2020</span> <span style="color:#ae81ff">08</span><span style="color:#f92672">:</span><span style="color:#ae81ff">53</span><span style="color:#f92672">:</span><span style="color:#ae81ff">06</span> at Function.Module._load (internal<span style="color:#f92672">/</span>modules<span style="color:#f92672">/</span>cjs<span style="color:#f92672">/</span>loader.js:<span style="color:#ae81ff">879</span><span style="color:#f92672">:</span><span style="color:#ae81ff">14</span>) -error <span style="color:#ae81ff">26</span><span style="color:#f92672">-</span>Jun<span style="color:#f92672">-</span><span style="color:#ae81ff">2020</span> <span style="color:#ae81ff">08</span><span style="color:#f92672">:</span><span style="color:#ae81ff">53</span><span style="color:#f92672">:</span><span style="color:#ae81ff">06</span> at Module.require (internal<span style="color:#f92672">/</span>modules<span style="color:#f92672">/</span>cjs<span style="color:#f92672">/</span>loader.js:<span style="color:#ae81ff">1026</span><span style="color:#f92672">:</span><span style="color:#ae81ff">19</span>) -error <span style="color:#ae81ff">26</span><span style="color:#f92672">-</span>Jun<span style="color:#f92672">-</span><span style="color:#ae81ff">2020</span> <span style="color:#ae81ff">08</span><span style="color:#f92672">:</span><span style="color:#ae81ff">53</span><span style="color:#f92672">:</span><span style="color:#ae81ff">06</span> at require (internal<span style="color:#f92672">/</span>modules<span style="color:#f92672">/</span>cjs<span style="color:#f92672">/</span>helpers.js:<span style="color:#ae81ff">72</span><span style="color:#f92672">:</span><span style="color:#ae81ff">18</span>) -</code></pre></div><p><a href="https://stackoverflow.com/a/55926692/13742790">This answer from Stack Overflow</a> states that it is due to Node.js v12 does not compatible with Gulp v3 <strong>and you need to upgrade Gulp to v4</strong>. I know <strong>I should</strong> do that but I also know that I will meet the <a href="https://github.com/sindresorhus/del/issues/45">Did you forget to signal async completion?</a> issue which also will cause an epic fail of the build <strong>unless I re-write the gulp tasks</strong>.</p> -<p>I don&rsquo;t want to change my <code>gulpfile.js</code> and I don&rsquo;t want to upgrade <code>gulp</code>. Not now. That&rsquo;s why I started searching for a solution without changing any configurations of the build server as well as the gulp setup in the project.</p> -<h2 id="-solution-adding-a-npm-shrinkwrapjson">😀 Solution: adding a <code>npm-shrinkwrap.json</code></h2> -<p>Eventually I <a href="https://stackoverflow.com/questions/55921442/how-to-fix-referenceerror-primordials-is-not-defined-in-node/58394828#58394828">found a solution</a> on how to handle this &ldquo;Gulp VS Node&rdquo; situation. What we need is create a <code>npm-shrinkwrap.json</code> file under the same directory with <code>package.json</code>.</p> -<p>The content of the json file:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-json" data-lang="json">{ - <span style="color:#f92672">&#34;dependencies&#34;</span>: { - <span style="color:#f92672">&#34;graceful-fs&#34;</span>: { - <span style="color:#f92672">&#34;version&#34;</span>: <span style="color:#e6db74">&#34;4.2.3&#34;</span> - } - } -} -</code></pre></div><p>After that I can build the project and finish all the gulp tasks without errors 🎉.</p> -<h3 id="-so-whats-going-on">🤔 So, what&rsquo;s going on?</h3> -<p>From the npm&rsquo;s official documentation on the <a href="https://docs.npmjs.com/cli/shrinkwrap"><code>npm-shrinkwrap</code> command</a>:</p> -<blockquote> -<p>This command repurposes package-lock.json into a publishable npm-shrinkwrap.json or simply creates a new one. The file created and updated by this command will then take precedence over any other existing or future package-lock.json files.</p> -</blockquote> -<p>And from the documentation on the <a href="https://docs.npmjs.com/files/shrinkwrap.json"><code>npm-shrinkwrap.json</code></a>:</p> -<blockquote> -<p>&hellip; Additionally, if both <code>package-lock.json</code> and <code>npm-shrinkwrap.json</code> are present in a package root, <code>package-lock.json</code> will be ignored in favor of this file.</p> -</blockquote> -<p>In other words, this file has a <em>higher priority</em> then <code>package-lock.json</code>. However, why this file can solve the build error?</p> -<h4 id="thefs-module">The<code>fs</code> module</h4> -<p>Node&rsquo;s <code>fs</code> module got some changes since <strong>v11.15</strong> which cause the <code>graceful-fs@^3.0.0</code> package does not work anymore. Unfortunately, <code>gulp@3.9.1</code> depends on <code>graceful-fs@^3.0.0</code>. As a result, running the gulp tasks on Node.js v12 will cause the <code>primordials is not defined</code> error.</p> -<h4 id="the-fix">The fix</h4> -<p>After we added the <code>npm-shrinkwrap.json</code>, from my understanding it locked down the version of package(s) used by the execution environment to the version stated in that file (and ignore the setup in <code>package-lock.json</code>.In the above case, the <code>npm-shrinkwrap.json</code> tells Node.js 12 use <code>graceful-fs@4.2.3</code> instead of <code>graceful-fs@^3.0.0</code>. This combination works. Meanwhile, the <code>gulp</code> package will still reference to the <code>package.json</code> and <code>package-lock.json</code> file and use the <code>graceful-fs@^3.0.0</code> package. This combination also works.</p> -<h2 id="-conclusion">🎯 Conclusion</h2> -<p>I got some build errors when using <code>gulp@^3.9.0</code> and <code>gulp-sass</code> under Node.js 12. After I delete the <code>package-lock.json</code> and re-run <code>npm install</code>, the sass problem solved. Next, I added a <code>npm-shrinkwrap.json</code> to (temporarily) solve the incompatable issue with old gulp running on new Node.js.</p> -<h4 id="can-i-call-this-the-node-version-of-dependency-hell1"><del>Can I call this the Node version of <strong>dependency hell</strong><sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>?</del></h4> -<h6 id="-references">🔗 references:</h6> -<ul> -<li><a href="https://mejiblog.com/gulp-error/">ReferenceError: primordials is not defined の解決方法【備忘録】</a></li> -<li><a href="https://mejiblog.com/gulpfile-change/">Task function must be specified 解決方法【備忘録】</a></li> -<li><a href="https://github.com/mafintosh/prebuildify-ci/issues/5#issuecomment-550867124">Node 12: Errors with &lsquo;primordials is not defined&rsquo; #5</a></li> -<li><a href="https://blog.icetutor.com/how-to-fix-referenceerror-primordials-is-not-defined-error/">How to fix “ReferenceError: primordials is not defined” error</a></li> -</ul> -<section class="footnotes" role="doc-endnotes"> -<hr> -<ol> -<li id="fn:1" role="doc-endnote"> -<p><a href="https://en.m.wikipedia.org/wiki/Dependency_hell">https://en.m.wikipedia.org/wiki/Dependency_hell</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> -</li> -</ol> -</section> - - - - - - 🐞 GitVersioning: 'ThisAssembly' Is Inaccessible Due to Its Protection Level - https://blog.lofibean.cc/posts/git-versioning-this-assembly-is-inaccessible-due-to-its-protection-level/ - Thu, 25 Jun 2020 17:10:24 +0800 - - https://blog.lofibean.cc/posts/git-versioning-this-assembly-is-inaccessible-due-to-its-protection-level/ - - <h2 id="-problem">😨 Problem</h2> -<p>After I installed the <strong><a href="https://www.nuget.org/packages/Nerdbank.GitVersioning">Nerdbank.GitVersioning</a></strong> Nuget package in my .NET MVC app, the following error came out when I want to get the version using <code>ThisAssembly.AssemblyInformationalVersion</code>:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">error CS0122: <span style="color:#e6db74">&#39;ThisAssembly&#39;</span> is inaccessible due to its protection level -</code></pre></div><p>I tried to install the package across all the projects in the same solution. It didn&rsquo;t work.</p> -<p>I tried to uninstall and re-ininstall the package. It didn&rsquo;t work.</p> -<h2 id="-solution">😀 Solution</h2> -<h3 id="csproj">.csproj</h3> -<p>Turns out there is something missing in my <code>.csproj</code> file. I missed an <code>&lt;Import&gt;</code> tag at the end of the file, just before the <code>&lt;/Target&gt;</code> tag:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-xml" data-lang="xml"><span style="color:#f92672">&lt;Import</span> <span style="color:#a6e22e">Project=</span><span style="color:#e6db74">&#34;..\packages\Nerdbank.GitVersioning.3.1.91\build\Nerdbank.GitVersioning.targets&#34;</span> <span style="color:#a6e22e">Condition=</span><span style="color:#e6db74">&#34;Exists(&#39;..\packages\Nerdbank.GitVersioning.3.1.91\build\Nerdbank.GitVersioning.targets&#39;)&#34;</span> <span style="color:#f92672">/&gt;</span> -</code></pre></div><p>And in the <code>EnsureNuGetPackageBuildImports</code> target, add the following line:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-xml" data-lang="xml"><span style="color:#f92672">&lt;Error</span> <span style="color:#a6e22e">Condition=</span><span style="color:#e6db74">&#34;!Exists(&#39;..\packages\Nerdbank.GitVersioning.3.1.91\build\Nerdbank.GitVersioning.targets&#39;)&#34;</span> <span style="color:#a6e22e">Text=</span><span style="color:#e6db74">&#34;$([System.String]::Format(&#39;$(ErrorText)&#39;, &#39;..\packages\Nerdbank.GitVersioning.3.1.91\build\Nerdbank.GitVersioning.targets&#39;))&#34;</span> <span style="color:#f92672">/&gt;</span> -</code></pre></div><p>In addition, the 1st <code>&lt;PropertyGroup&gt;</code> should contain a pair of <code>NuGetPackageImportStamp</code> tag:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-xml" data-lang="xml"><span style="color:#f92672">&lt;NuGetPackageImportStamp&gt;</span> -<span style="color:#f92672">&lt;/NuGetPackageImportStamp&gt;</span> -</code></pre></div><h3 id="assemblyinfocs"><code>AssemblyInfo.cs</code></h3> -<p>I also removed the following lines in <code>Properties/AssemblyInfo.cs</code>:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-c#" data-lang="c#"><span style="color:#a6e22e">[assembly: AssemblyVersion(&#34;1.0.0.0&#34;)]</span> -<span style="color:#a6e22e">[assembly: AssemblyFileVersion(&#34;1.0.0.0&#34;)]</span> -</code></pre></div><h3 id="versionjson"><code>version.json</code></h3> -<p>At the root directory of the <strong>project</strong>, I added a <code>version.json</code> file with the following content:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-json" data-lang="json">{ - <span style="color:#f92672">&#34;$schema&#34;</span>: <span style="color:#e6db74">&#34;https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json&#34;</span>, - <span style="color:#f92672">&#34;version&#34;</span>: <span style="color:#e6db74">&#34;1.0.0&#34;</span> -} -</code></pre></div><p>After that, <code>ThisAssembly</code> is back and I can read the git version info successfully.</p> -<h6 id="-references">🔗 references:</h6> -<ul> -<li><a href="https://github.com/dotnet/Nerdbank.GitVersioning/blob/master/doc/dotnet.md">https://github.com/dotnet/Nerdbank.GitVersioning/blob/master/doc/dotnet.md</a></li> -<li><a href="https://github.com/dotnet/Nerdbank.GitVersioning/issues/449">https://github.com/dotnet/Nerdbank.GitVersioning/issues/449</a></li> -<li><a href="https://github.com/dotnet/Nerdbank.GitVersioning/issues/404">https://github.com/dotnet/Nerdbank.GitVersioning/issues/404</a></li> -</ul> -<h6 id="-cover-image-grace-hoppers-operational-logbook-for-the-harvard-mark-ii-computerhttpswwwbusinessinsidercomauharvard-mark-i-grace-hopper-bug-2015-7">🖼 cover image: <a href="https://www.businessinsider.com.au/harvard-mark-i-grace-hopper-bug-2015-7">Grace Hopper’s operational logbook for the Harvard Mark II computer</a></h6> - - - - - - Documentation Makes Easy With MkDocs and GitLab Pages - https://blog.lofibean.cc/posts/documentation-makes-easy-with-mkdocs-and-gitlab-pages/ - Fri, 12 Jun 2020 19:37:00 +0800 - - https://blog.lofibean.cc/posts/documentation-makes-easy-with-mkdocs-and-gitlab-pages/ - - <h2 id="overview">Overview</h2> -<p>I created a static website using <strong>MkDocs</strong> and deployed to <a href="https://docs.gitlab.com/ee/user/project/pages/"><strong>GitLab Pages</strong></a>. This is what I did: <a href="https://bemn-proof-of-concept.gitlab.io/mkdoc/">https://bemn-proof-of-concept.gitlab.io/mkdoc/</a>.</p> -<h3 id="table-of-contents">Table of Contents</h3> -<ul> -<li><a href="#intro">MkDocs</a> -<ul> -<li><a href="#preparation">Preparation</a></li> -<li><a href="#up-and-run">Up and Run</a></li> -<li><a href="#add-a-new-page">Add a new page</a></li> -<li><a href="#theming">Theming</a></li> -<li><a href="#custom-resources">Custom Resources</a></li> -</ul> -</li> -<li><a href="#gitlab-pages">GitLab Pages</a> -<ul> -<li><a href="#gitlab-ci-yml">.gitlab-ci.yml</a></li> -<li><a href="#build-and-deploy">Build and Deploy</a></li> -</ul> -</li> -<li><a href="#conclusion">Conclusion</a></li> -</ul> -<hr> -<h2 id="intro">MkDocs</h2> -<p>From <a href="https://www.mkdocs.org/">MkDocs' official website</a>:</p> -<blockquote> -<p>MkDocs is a <strong>fast</strong>, <strong>simple</strong> and <strong>downright gorgeous</strong> static site generator that&rsquo;s geared towards building project documentation. Documentation source files are written in Markdown, and configured with a single YAML configuration file.</p> -</blockquote> -<p>In my opinion, setting up a static site using MkDocs is really straightforward. It&rsquo;s easy to change the theme and insert custom styles/scripts. <a href="https://en.m.wikipedia.org/wiki/KISS_principle">Keep it simple, stupid</a>. That&rsquo;s what I need.</p> -<h3 id="preparation">Preparation</h3> -<p>Make sure that you have the following tools:</p> -<ol> -<li><strong>python 3.x</strong> and <strong>pip</strong>. Install it via <a href="https://www.python.org/downloads/">executable</a> from the official website, or using tools like <a href="https://brew.sh/">Homebrew</a>.</li> -</ol> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ python --version -Python 3.8.2 -$ pip --version -pip 20.0.2 from /usr/local/lib/python3.8/site-packages/pip <span style="color:#f92672">(</span>python 3.8<span style="color:#f92672">)</span> -</code></pre></div><ol start="2"> -<li>a <strong>GitLab</strong> account. You can use other service like <a href="https://pages.github.com/">Github Pages</a>, Amazon S3, etc.</li> -<li>(optional) <a href="https://www.markdownguide.org/cheat-sheet/">a markdown cheatsheet</a>.</li> -</ol> -<p>(For me, the most difficult part is how to get the python and pip versions right. In Mac the built-in python version is 2.7 but we need python 3 to install <code>pip</code>.)</p> -<h3 id="up-and-run">Up and Run</h3> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ pip install mkdocs -$ mkdocs --version -mkdocs, version 1.1.2 -</code></pre></div><p>Assuming that your project folder is <code>doc-project</code>:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ mkdocs new doc-project -$ cd doc-project -</code></pre></div><p>A MkDocs project is then created with the following folder structure:</p> -<pre tabindex="0"><code>doc-project -├── docs -│   └── index.md -├── img -│   └── favicon.ico -└── mkdocs.yml -</code></pre><p>Let&rsquo;s run the site:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ mkdocs serve -INFO - Building documentation... -INFO - Cleaning site directory -INFO - Documentation built in 1.65 seconds -<span style="color:#f92672">[</span>I <span style="color:#ae81ff">200612</span> 23:30:19 server:334<span style="color:#f92672">]</span> Serving on http://127.0.0.1:8000 -</code></pre></div><p>And check it out at <a href="http://127.0.0.1:8000">http://127.0.0.1:8000</a>!</p> -<p><img src="./img/01_welcome.png" alt="Running MkDocs"></p> -<h3 id="add-a-new-page">Add a new page</h3> -<h4 id="the-content">The content</h4> -<p>Remember, all the documents should place under <code>docs</code>. Let&rsquo;s create an Overview page:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ cd docs -$ touch overview.md -</code></pre></div><p>After that, add some content to <code>overview.md</code>.</p> -<h4 id="the-menu">The menu</h4> -<p>If you want the visitors to reach the overview page, you need to add an url in the menu. Let&rsquo;s edit <code>mkdocs.yml</code>, the site config file:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yml" data-lang="yml"><span style="color:#75715e"># In mkdocs.yml...</span> -<span style="color:#f92672">site_name</span>: <span style="color:#ae81ff">Doc Project</span> <span style="color:#75715e">## change your site name here.</span> -<span style="color:#f92672">nav</span>: - - <span style="color:#f92672">Home</span>: <span style="color:#ae81ff">index.md</span> - - <span style="color:#f92672">Overview</span>: <span style="color:#ae81ff">overview.md</span> <span style="color:#75715e">## add this line.</span> -</code></pre></div><p>You will see a new link called <em>Overview</em> in the menu. If you want to set your site name now, change the value of <code>site_name</code>.</p> -<p>So that&rsquo;s it. That&rsquo;s how to add a new page.</p> -<h3 id="theming">Theming</h3> -<p>You can apply a custom theme to MkDocs. <a href="https://github.com/mkdocs/mkdocs/wiki/MkDocs-Themes">This page</a> contains many themes contributed by the community.</p> -<p>In this section, I will apply the <a href="https://github.com/squidfunk/mkdocs-material">Material Design theme</a> to my MkDocs site.</p> -<p>Stop running your site and install the theme by:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ pip install mkdocs-material -</code></pre></div><p>Update the <code>mkdocs.yml</code> again:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yml" data-lang="yml"><span style="color:#75715e"># In mkdocs.yml...</span> -<span style="color:#f92672">site_name</span>: <span style="color:#ae81ff">Doc Project</span> - -<span style="color:#f92672">nav</span>: - - <span style="color:#f92672">Home</span>: <span style="color:#ae81ff">index.md</span> - - <span style="color:#f92672">Overview</span>: <span style="color:#ae81ff">overview.md</span> - -<span style="color:#75715e">## Add this section</span> -<span style="color:#f92672">theme</span>: - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">material</span> - <span style="color:#f92672">palette</span>: <span style="color:#75715e">## Add this sub-section if you want to change the theme color</span> - <span style="color:#f92672">scheme</span>: <span style="color:#ae81ff">amber</span> - <span style="color:#f92672">primary</span>: <span style="color:#ae81ff">amber</span> - <span style="color:#f92672">accent</span>: <span style="color:#ae81ff">orange</span> -</code></pre></div><p>Start the site:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ mkdocs serve -</code></pre></div><p>You will see MkDocs is dressing the amber Material Design theme.</p> -<p><img src="./img/02_theming.png" alt="Material Design theme with amber scheme"></p> -<h3 id="custom-resources">Custom Resources</h3> -<p>Sometimes you may want to add custom CSS or JS. In MkDocs, you can do it by adding <code>extra_css</code> and <code>extra_javascript</code> sections in <code>mkdocs.yml</code>.</p> -<p>I created a <code>catalog</code> page which contains a table written in markdown. Also, I want to apply <a href="https://www.datatables.net/">jQuery DataTables</a> to make the table more interactive. Therefore, I added the related js libraries and related css file to MkDocs. You can see the result <a href="https://bemn-proof-of-concept.gitlab.io/mkdoc/catalog/">here</a>.</p> -<p><strong>Exercice:</strong> create a <code>catalog.md</code> file and add a markdown table in it.</p> -<p>Next, add the custom resource sections to the config file:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yml" data-lang="yml"><span style="color:#75715e"># In mkdocs.yml...</span> -<span style="color:#f92672">site_name</span>: <span style="color:#ae81ff">Doc Project</span> -<span style="color:#f92672">nav</span>: - - <span style="color:#f92672">Home</span>: <span style="color:#ae81ff">index.md</span> - - <span style="color:#f92672">Catalog</span>: <span style="color:#ae81ff">catalog.md</span> <span style="color:#75715e">## The catalog page you created in the exercise.</span> - -<span style="color:#f92672">theme</span>: - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">material</span> - <span style="color:#f92672">palette</span>: - <span style="color:#f92672">scheme</span>: <span style="color:#ae81ff">amber</span> - <span style="color:#f92672">primary</span>: <span style="color:#ae81ff">amber</span> - <span style="color:#f92672">accent</span>: <span style="color:#ae81ff">orange</span> - -<span style="color:#75715e">## Custom js files.</span> -<span style="color:#f92672">extra_javascript</span>: - - <span style="color:#ae81ff">https://code.jquery.com/jquery-3.5.1.min.js</span> - - <span style="color:#ae81ff">https://cdn.datatables.net/1.10.21/js/jquery.dataTables.min.js</span> - - <span style="color:#ae81ff">scripts/site.js</span> - -<span style="color:#75715e">## Custom css files.</span> -<span style="color:#f92672">extra_css</span>: - - <span style="color:#ae81ff">https://cdn.datatables.net/1.10.21/css/jquery.dataTables.min.css</span> -</code></pre></div><p>Create a custom js file:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ cd docs -$ mkdir scripts -$ cd scripts -$ touch site.js -</code></pre></div><p>Now in your <code>site.js</code> file:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-js" data-lang="js"><span style="color:#a6e22e">$</span>(document).<span style="color:#a6e22e">ready</span>( <span style="color:#66d9ef">function</span> () { - <span style="color:#a6e22e">$</span>(<span style="color:#e6db74">&#39;table&#39;</span>).<span style="color:#a6e22e">DataTable</span>(); -}); -</code></pre></div><p>Afer that, you should be able to see an interactive table in the catalog page.</p> -<p><img src="./img/03_with-custom-resources.png" alt="With jQuery Datatables"></p> -<hr> -<h2 id="gitlab-pages">GitLab Pages</h2> -<p>Create a GitLab repository under your personal space or a project group. The url will be something like <code>https://gitlab.com/{username or project group name}/{repo name}</code>.</p> -<p>Clone the repo you created and create the following items:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ mkdir src -$ touch .gitlab-ci.yml -</code></pre></div><p>Place your MkDoc items (i.e. the <code>doc-project</code> folder) under <code>src</code>. See the following folder structure:</p> -<pre tabindex="0"><code>(root of the repo) -├── .gitlab-ci.yml -└── src - └── doc-project -</code></pre><h3 id="gitlab-ci-yml">.gitlab-ci.yml</h3> -<p>The <code>.gitlab-ci.yml</code> is a GitLab-specific file. GitLab will read and run the steps in the file. We need to tell GitLab how to generate and deploy our static MkDocs website. In this file:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yml" data-lang="yml"><span style="color:#75715e"># In .gitlab-ci.yml...</span> -<span style="color:#f92672">image</span>: <span style="color:#ae81ff">python:3.8-buster</span> <span style="color:#75715e">## MkDocs requies python.</span> - -<span style="color:#f92672">pages</span>: - <span style="color:#f92672">stage</span>: <span style="color:#ae81ff">deploy</span> <span style="color:#75715e">## tell GitLab to deploy the website in this step.</span> - <span style="color:#f92672">before_script</span>: - - <span style="color:#ae81ff">pip install mkdocs</span> <span style="color:#75715e">## install MkDocs.</span> - - <span style="color:#ae81ff">pip install mkdocs-material</span> <span style="color:#75715e">## install the theme.</span> - <span style="color:#f92672">script</span>: - - <span style="color:#ae81ff">cd ./src/doc-project</span> - - <span style="color:#ae81ff">mkdocs build</span> <span style="color:#75715e">## built the site.</span> - - <span style="color:#ae81ff">mv site ../../public</span> - <span style="color:#f92672">artifacts</span>: - <span style="color:#f92672">paths</span>: - - <span style="color:#ae81ff">public</span> - <span style="color:#75715e">## Uncomment the following section if you want to run this step under master branch only.</span> - <span style="color:#75715e"># only:</span> - <span style="color:#75715e"># - master </span> -</code></pre></div><p>So basically it tells GitLab to install the tools required under python 3.8 environment and deploy the website after the site is generated.</p> -<p>Try to run the following command if you want to generate the site locally:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">$ mkdocs build -</code></pre></div><p>The generated site is located under <code>doc-project/site/</code> .</p> -<p>In order to display the website properly, you need to place the generated site under the <code>public</code> folder and let GitLab knows the <strong>artifact</strong> inside is the website you want to deploy.</p> -<h3 id="build-and-deploy">Build and Deploy</h3> -<p>Push the code to GitLab and the site should build automatically. Check out the status of the build under <strong>CI/CD</strong> &ndash;&gt; <strong>Pipelines</strong>.</p> -<figure><img src="./img/04_gitlab-ci-cd-panel.png" - alt="CI/CD panel in GitLab"/><figcaption> - <h4>A green tag showing passed for each successfully build.</h4> - </figcaption> -</figure> - -<p>Check out your website now. The url is <code>https://{username or project group name}.gitlab.io/{repo name}/</code>.</p> -<hr> -<h2 id="conclusion">Conclusion</h2> -<p>In this tutorial, we created a static site with custom theme, styles and js library by using MkDocs. After that, we set up a CI/CD pipeline on GitLab for building and deploying this static site to GitLab Pages.</p> - - - - - - A Tale of Two Caches: Redis and the cache helper - https://blog.lofibean.cc/posts/a-tale-of-two-caches-redis-and-cache-helper/ - Thu, 11 Jun 2020 21:06:59 +0800 - - https://blog.lofibean.cc/posts/a-tale-of-two-caches-redis-and-cache-helper/ - - <h2 id="background">Background</h2> -<p>Recently our team started a new project: a showcase page under our main website. The website is read-only and the content won&rsquo;t change frequently so we can have an aggressive caching policy.</p> -<p>I built this <strong>MVC</strong> web app using <strong>.NET Core 3.1</strong> and deploy it as an IIS sub-site under the main website (which is a <strong>.NET Framework</strong> web app running on the IIS).</p> -<h3 id="table-of-contents">Table of Contents</h3> -<ul> -<li><a href="#redis">Redis</a> -<ul> -<li><a href="#redis-nuget">NuGet package</a></li> -<li><a href="#redis-appsettings">appsettings.json</a></li> -<li><a href="#redis-startup">Startup.cs</a></li> -<li><a href="#redis-cache-service">CacheService</a></li> -<li><a href="#redis-controller">Controller</a></li> -</ul> -</li> -<li><a href="#cache-tag-helper">Cache Tag Helper</a> -<ul> -<li><a href="#cache-tag-helper-example">Example</a></li> -<li><a href="#cache-tag-helper-exaplain">Explaination</a></li> -</ul> -</li> -<li><a href="#bonus">Bonus: A note on @helper and other HTML helpers</a></li> -</ul> -<hr> -<h2 id="redis">Redis</h2> -<h3 id="why">Why?</h3> -<p>We are using <a href="https://redis.io/">Redis</a> because it is simple, fast and we are already using it across all the main websites.</p> -<h3 id="how">How?</h3> -<p>Here are some highlights:</p> -<h4 id="redis-nuget">1. NuGet packages</h4> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-xml" data-lang="xml"><span style="color:#f92672">&lt;PackageReference</span> <span style="color:#a6e22e">Include=</span><span style="color:#e6db74">&#34;StackExchange.Redis&#34;</span> <span style="color:#a6e22e">Version=</span><span style="color:#e6db74">&#34;2.1.30&#34;</span> <span style="color:#f92672">/&gt;</span> -<span style="color:#f92672">&lt;PackageReference</span> <span style="color:#a6e22e">Include=</span><span style="color:#e6db74">&#34;StackExchange.Redis.Extensions.Core&#34;</span> <span style="color:#a6e22e">Version=</span><span style="color:#e6db74">&#34;6.1.7&#34;</span> <span style="color:#f92672">/&gt;</span> -<span style="color:#f92672">&lt;PackageReference</span> <span style="color:#a6e22e">Include=</span><span style="color:#e6db74">&#34;StackExchange.Redis.Extensions.Newtonsoft&#34;</span> <span style="color:#a6e22e">Version=</span><span style="color:#e6db74">&#34;6.1.7&#34;</span> <span style="color:#f92672">/&gt;</span> -<span style="color:#f92672">&lt;PackageReference</span> <span style="color:#a6e22e">Include=</span><span style="color:#e6db74">&#34;StackExchange.Redis.Extensions.AspNetCore&#34;</span> <span style="color:#a6e22e">Version=</span><span style="color:#e6db74">&#34;6.1.7&#34;</span> <span style="color:#f92672">/&gt;</span> -</code></pre></div><p><code>StackExchange.Redis.Extensions.Newtonsoft</code> is optional. <a href="https://devblogs.microsoft.com/dotnet/try-the-new-system-text-json-apis/">Start from .NET Core 3.0</a> the default Json serializer will be <code>System.Text.Json</code>. If you want to use <code>Newtonsoft.Json</code> then you will need this package in your project.</p> -<p><code>StackExchange.Redis.Extensions.Core</code> and <code>StackExchange.Redis.Extensions.AspNetCore</code> are the useful package to connect/read/write Redis easier. Read <a href="https://stackexchange-redis-extensinos.gitbook.io/stackexchange-redis-extensions/">this documentation</a> for more details.</p> -<h4 id="redis-appsettings">2. appsettings.json</h4> -<p>A typical .NET Core project should have an <code>appsettings.json</code>. Add the following section:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-json" data-lang="json">{ - <span style="color:#f92672">&#34;Redis&#34;</span>: { - <span style="color:#f92672">&#34;AllowAdmin&#34;</span>: <span style="color:#66d9ef">false</span>, - <span style="color:#f92672">&#34;Ssl&#34;</span>: <span style="color:#66d9ef">false</span>, - <span style="color:#f92672">&#34;ConnectTimeout&#34;</span>: <span style="color:#ae81ff">6000</span>, - <span style="color:#f92672">&#34;ConnectRetry&#34;</span>: <span style="color:#ae81ff">2</span>, - <span style="color:#f92672">&#34;Database&#34;</span>: <span style="color:#ae81ff">0</span>, - <span style="color:#f92672">&#34;Hosts&#34;</span>: [ - { - <span style="color:#f92672">&#34;Host&#34;</span>: <span style="color:#e6db74">&#34;my-secret-redis-host.com&#34;</span>, - <span style="color:#f92672">&#34;Port&#34;</span>: <span style="color:#e6db74">&#34;6379&#34;</span> - } - ] - } -} -</code></pre></div><p>Here, <code>my-secret-redis-host.com</code> is the Redis host and We are using the database no. <code>0</code>. You can set multiple hosts. You can see a detailed configuration <a href="https://stackexchange-redis-extensinos.gitbook.io/stackexchange-redis-extensions/configuration/json-configuration">here</a>.</p> -<h4 id="redis-startup">3. Startup.cs</h4> -<p>Add the following code in <code>ConfigureServices()</code></p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cs" data-lang="cs"><span style="color:#66d9ef">var</span> redisConfiguration = Configuration.GetSection(<span style="color:#e6db74">&#34;Redis&#34;</span>).Get&lt;RedisConfiguration&gt;(); -services.AddStackExchangeRedisExtensions&lt;NewtonsoftSerializer&gt;(redisConfiguration); -</code></pre></div><h4 id="redis-cache-service">5. CacheService</h4> -<p>I created a <code>CacheService.cs</code> to help me reading/writing data in Redis. In this service:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cs" data-lang="cs"><span style="color:#66d9ef">public</span> CacheService(RedisConfiguration redisConfiguration, ILogger&lt;RedisCacheConnectionPoolManager&gt; poolLogger) -{ - <span style="color:#66d9ef">try</span> - { - <span style="color:#66d9ef">var</span> connectionPoolManager = <span style="color:#66d9ef">new</span> RedisCacheConnectionPoolManager(redisConfiguration, poolLogger); - <span style="color:#ae81ff">_</span>redisClient = <span style="color:#66d9ef">new</span> RedisCacheClient(connectionPoolManager, serializer, redisConfiguration); - } - <span style="color:#66d9ef">catch</span>(Exception ex) - { - <span style="color:#75715e">/* something wrong when connection to Redis servers. */</span> - } - <span style="color:#ae81ff">_</span>cacheDuration = <span style="color:#ae81ff">300</span>; <span style="color:#75715e">// cache period in seconds -</span><span style="color:#75715e"></span>} -</code></pre></div><p>We need a method to write data:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-csharp" data-lang="csharp"><span style="color:#66d9ef">public</span> <span style="color:#66d9ef">async</span> Task&lt;<span style="color:#66d9ef">bool</span>&gt; AddAsync(<span style="color:#66d9ef">string</span> key, <span style="color:#66d9ef">object</span> <span style="color:#66d9ef">value</span>) -{ - <span style="color:#66d9ef">try</span> - { - <span style="color:#66d9ef">bool</span> added = <span style="color:#66d9ef">await</span> <span style="color:#ae81ff">_</span>redisClient.GetDbFromConfiguration().AddAsync(key, <span style="color:#66d9ef">value</span>, DateTimeOffset.Now.AddSeconds(<span style="color:#ae81ff">_</span>cacheDuration)); - <span style="color:#66d9ef">return</span> added; - } - <span style="color:#66d9ef">catch</span> (Exception ex) - { - <span style="color:#75715e">/* something wrong when writing data to Redis */</span> - <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">false</span>; - } -} -</code></pre></div><p>And we need a method to get cached data:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-csharp" data-lang="csharp"><span style="color:#66d9ef">public</span> <span style="color:#66d9ef">async</span> Task&lt;T&gt; TryGetAsync&lt;T&gt;(<span style="color:#66d9ef">string</span> key) -{ - <span style="color:#66d9ef">try</span> - { - <span style="color:#66d9ef">if</span>(<span style="color:#66d9ef">await</span> <span style="color:#ae81ff">_</span>redisClient.GetDbFromConfiguration().ExistsAsync(key)) - { - <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">await</span> <span style="color:#ae81ff">_</span>redisClient.GetDbFromConfiguration().GetAsync&lt;T&gt;(key); - } - <span style="color:#66d9ef">else</span> - { - <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">default</span>; - } - } - <span style="color:#66d9ef">catch</span>(Exception ex) - { - <span style="color:#75715e">/* something wrong when writing data to Redis */</span> - <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">default</span>; - } -} -</code></pre></div><p>I intentionally name this method <code>TryGetAsync()</code> because the cache may not exist or already expired when you try to get it from Redis.</p> -<p>After that, let&rsquo;s go back to <code>Startup.cs</code> and register this service in <code>ConfigureService()</code>:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cs" data-lang="cs">services.AddTransient&lt;CacheService&gt;(); -</code></pre></div><p>Remember to register this service <strong>after</strong> <code>services.AddStackExchangeRedisExtensions()</code>.</p> -<h4 id="redis-controller">5. Controller</h4> -<p>Inject the <code>CacheService</code> to the controller:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-csharp" data-lang="csharp"><span style="color:#66d9ef">public</span> DemoController(CacheService cacheService) -{ - <span style="color:#ae81ff">_</span>cacheService = cacheService; -} - - -<span style="color:#66d9ef">public</span> <span style="color:#66d9ef">async</span> Task&lt;IActionResult&gt; Demo(<span style="color:#66d9ef">string</span> name) -{ - <span style="color:#66d9ef">var</span> cacheKey = <span style="color:#e6db74">$&#34;DemoApp:{name}&#34;</span>; - - <span style="color:#75715e">// Try to get cached value from Redis. -</span><span style="color:#75715e"></span> <span style="color:#66d9ef">string</span> cachedResult = <span style="color:#66d9ef">await</span> <span style="color:#ae81ff">_</span>cacheService.TryGetAsync&lt;<span style="color:#66d9ef">string</span>&gt;(cacheKey); - <span style="color:#66d9ef">if</span>(<span style="color:#66d9ef">default</span> != cachedResult) - { - <span style="color:#66d9ef">return</span> View(cachedResult); - } - - <span style="color:#75715e">// Add a new entry to Redis before returning the message. -</span><span style="color:#75715e"></span> <span style="color:#66d9ef">var</span> message = <span style="color:#e6db74">$&#34;Hello, {name}&#34;</span>; - <span style="color:#66d9ef">if</span>(<span style="color:#66d9ef">null</span> != sections &amp;&amp; sections.Any()) - { - <span style="color:#66d9ef">await</span> <span style="color:#ae81ff">_</span>cacheService.AddAsync(cacheKey, message); - } - - <span style="color:#66d9ef">return</span> View(message); -} -</code></pre></div><blockquote> -<p><strong>Explain Like I&rsquo;m Five</strong>:</p> -<p>You ask the shopkeeper in <code>Demo</code> bookstore do they have a specific book <code>name</code>. First, the shopkeeper looks for the book on the bookshelf named <code>Redis</code>. If he finds that book, he takes it out and gives it to you.</p> -<p>If your book does not exist in the <code>Redis</code> bookstore, he has to go out and buy that book for you(!). However, he buys 2 identical copies. He gives you one and puts the other one on the <code>Redis</code> bookshelf, just in case another customer want that book later.</p> -</blockquote> -<hr> -<h2 id="cache-tag-helper">Cache Tag Helper</h2> -<p>The <a href="https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/built-in/cache-tag-helper?view=aspnetcore-3.1">Cache Tag Helper</a> is a tag that you can use in a <strong>.NET Core MVC</strong> app. Content encolsed by this <code>&lt;cache&gt;</code> tag will be cached in the internal cache provider.</p> -<h3 id="cache-tag-helper-example">Example</h3> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-html" data-lang="html">&lt;<span style="color:#f92672">cache</span> <span style="color:#a6e22e">expires-after</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;@TimeSpan.FromSeconds(60)&#34;</span> - <span style="color:#a6e22e">vary-by-route</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;name&#34;</span> - <span style="color:#a6e22e">vary-by-user</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;false&#34;</span>&gt; - @System.DateTime.Now -&lt;/<span style="color:#f92672">cache</span>&gt; -</code></pre></div><h3 id="cache-tag-helper-exaplain">Explaination</h3> -<p>In the above example, some attributes is set in the <code>&lt;cache&gt;</code> tag:</p> -<ul> -<li><code>expires-after</code>: how long (in seconds) will this cache last for.</li> -<li><code>vary-by-route</code>: different copy will be cached when the route has a different value in the <code>name</code>param.</li> -<li><code>vary-by-user</code>: different user will see different cached copies.</li> -</ul> -<h3 id="how-can-i-know-if-it-is-working">How can I know if it is working?</h3> -<p>You will see the value rendered in the above example won&rsquo;t change for 60 seconds even <code>System.DateTime.Now</code> should show the current time.</p> -<hr> -<h2 id="bonus">Bonus: A note on <code>@helper</code> and other HTML helpers</h2> -<p>In the old days we can define some <code>@helper</code> functions in the razor view and (re)use it in the view. It&rsquo;s being removed since .NET Core 3.0 because the design of <code>@helper</code> function does not compatible with async Razor content anymore.</p> -<h3 id="successor-of-the-html-helpers">Successor of the HTML helpers?</h3> -<p>You can use the <a href="https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/intro?view=aspnetcore-3.1"><strong>Tag Helpers in ASP.NET Core</strong></a>. Yes, the <code>&lt;cache&gt;</code> Tag Helper is one of the <a href="https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/intro?view=aspnetcore-3.1#built-in-aspnet-core-tag-helpers">built-in Tag Helpers in .NET Core</a>.</p> -<p>In addition, you can use the <a href="https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.rendering.htmlhelperpartialextensions.partialasync?view=aspnetcore-3.1"><code>PartialAsync()</code> method</a> to render the partial HTML markup <strong>asynchronously</strong>.</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-csharp" data-lang="csharp">@await Html.PartialAsync(<span style="color:#e6db74">&#34;_PartialName&#34;</span>) -</code></pre></div><hr> -<p><strong>More references on the HTML helpers and Tag Helpers:</strong></p> -<p><a href="https://github.com/aspnet/Mvc/issues/4127">What happened to the @helper directive in Razor ?</a></p> -<p><a href="https://github.com/aspnet/Razor/issues/281">Remove the @helper directive from Razor</a></p> -<p><a href="https://dannyvanderkraan.wordpress.com/2016/04/19/asp-net-core-1-0-goodbye-html-helpers-and-hello-taghelpers/">ASP.NET Core 1.0: Goodbye HTML helpers and hello TagHelpers!</a></p> - - - - - - A Note on SSL Certificate - https://blog.lofibean.cc/posts/a-note-on-ssl/ - Sat, 23 May 2020 17:10:25 +0800 - - https://blog.lofibean.cc/posts/a-note-on-ssl/ - - <p>This is a note about the Linkedin learning course <a href="https://www.linkedin.com/learning/ssl-certificates-for-web-developers">SSL Certificates for Web Developers</a>.</p> -<h2 id="certificate-and-protocol">Certificate and protocol</h2> -<h3 id="what-are-ssltls-stands-for">What are SSL/TLS stands for?</h3> -<p>They stands for <em>Secure Socket Layer</em> and <em>Transport Layer Security</em>. They are the protocol names.</p> -<h3 id="what-is-https-and-why-we-are-using-it">What is HTTPS, and why we are using it?</h3> -<p>Https[ecure], a protocol on top of HTTP to secure the integrity of the data sending form the user to server.</p> -<h3 id="what-is-a-certificate-and-what-is-it-for">What is a certificate, and what is it for?</h3> -<p>A certificate <sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> (<code>.crt</code>, <code>.cer</code>) certifies <strong>the ownership of a public key</strong>. A certificate contains:</p> -<ul> -<li>organization,</li> -<li>issuer (e.g. the Certificate Authority / Self-signed),</li> -<li>valid period,</li> -<li>url,</li> -<li><strong>state / country</strong></li> -</ul> -<p>These information can be used to identify the certificate owner.</p> -<p>The public key is used to <strong>encrypt</strong>/<del>decrypt</del> the communication between computers.</p> -<hr> -<h2 id="cryptography">Cryptography</h2> -<h3 id="asymmetric-vs-symmetric">Asymmetric VS. Symmetric</h3> -<p>Asymmetric cryptography requies a pair of keys. The <em>Public key</em> is used to encrypt messages while the <em>private key</em> is for decryption.</p> -<p>In symmetric cryptography, both ends use the same password to encrypt + decrypt messages.</p> -<h3 id="why-are-we-using-both-technologies-and-how">Why are we using both technologies? And how?</h3> -<p>In short: For the balance of security and speed, we use asymmetric cryptography to establish secure connection (<em>handshake</em>) and use symmetric cryptography for the data transmission.</p> -<h4 id="the-handshake">The Handshake</h4> -<p>The end user and the server use the same password to encrypt + decrypt the messages. This password is sent from a server to a user by following steps:</p> -<ul> -<li>Validate the certificate&hellip; -<ol> -<li>User makes a request to a web server.</li> -<li>Web server responds with its <em>public key</em> certificate.</li> -<li>User checks if the <em>public key</em> certificate is valid.</li> -</ol> -</li> -<li>If the certificate from web server is valid&hellip; -<ol> -<li>User encrypts the password using server&rsquo;s public key, and send to web server.</li> -<li>Server decrypts with its private key.</li> -</ol> -</li> -</ul> -<p>After that, a secure connection is established and they shared the <em>same</em> password <sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>.</p> -<hr> -<h2 id="types-of-certificate">Types of certificate</h2> -<h3 id="self-signed">Self-signed</h3> -<ul> -<li>Intra-communications between systems under same organization.</li> -<li>Local development</li> -</ul> -<h3 id="ca">CA</h3> -<ul> -<li>Subdomain: tied to 1 domain (e.g. <code>www.mydoma.in</code>)</li> -<li>Wildcard: tied to a groups of subdomains (e.g. <code>*.mydoma.in</code>)</li> -<li>Multi-domain: (e.g. <code>mydoma.in</code>, <code>myweb.site</code>, &hellip;)</li> -</ul> -<hr> -<h2 id="acme-automatic-certificate-management-environment">ACME (Automatic Certificate Management Environment)</h2> -<p>To configuring Let&rsquo;s Encrypt&rsquo;s ACME on server, we can make use of the <a href="https://certbot.eff.org/">CertBot</a>. For IIS, use <a href="https://certifytheweb.com/">Certify</a>.</p> -<h3 id="heading"></h3> -<hr> -<h2 id="hsts">HSTS</h2> -<p>This can instruct the browser to interact with the server with HTTPS only. Redirect from HTTP to HTTPS is not required. This is achieved by adding a response header (<code>Strict-Transport-Security</code>).</p> -<p>Example response header:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-ini" data-lang="ini"><span style="color:#a6e22e">Strict-Transport-Security: max-age</span><span style="color:#f92672">=</span><span style="color:#e6db74">63072000; includeSubDomains; preload</span> -</code></pre></div><h3 id="what-hsts-is-protecting-us-from">What HSTS is protecting us from?</h3> -<p>The <strong>Man-in-the-Middle TLS Protocol Downgrade Attack.</strong><sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup> In <a href="https://www.praetorian.com/blog/man-in-the-middle-tls-ssl-protocol-downgrade-attack">this example</a>, the hacker C sends a ARP cache table request to both the client A and server B: -<img src="https://assets.website-files.com/58866caeabc83d5e7c574c74/5cdc9328fcbd747340785c63_20140811-mitm-attack.png" alt="Manipulating Device ARP Cache Tables"></p> -<p>Now the traffic from A to B is going through C, a typical <strong>Man-in-the-Middle attack</strong>.</p> -<p>The next step is C try to have a <strong>downgrade</strong> on the TLS version. Since the browsers are backward-compatible on older TLS versions, C can therefore to make the version downgraded to the negotiated version in the handshake process. C can then intercept and decrypt the messages by making use of the security vulnerabilities of eariler TLS.</p> -<h3 id="hsts-preloading">HSTS Preloading</h3> -<p>Avoid redirection of the first request too: <a href="https://hstspreload.org/">https://hstspreload.org/</a></p> -<section class="footnotes" role="doc-endnotes"> -<hr> -<ol> -<li id="fn:1" role="doc-endnote"> -<p>the certificate does not depends on the protocol we use&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> -</li> -<li id="fn:2" role="doc-endnote"> -<p>password is just for the same browsing session.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> -</li> -<li id="fn:3" role="doc-endnote"> -<p>I am not an expert on this area and I tried by best to digest that article and <a href="https://en.m.wikipedia.org/wiki/Downgrade_attack">this wiki</a> to write the summary.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> -</li> -</ol> -</section> - - - - - - Creating a User With Limited Privileges in Postgres - https://blog.lofibean.cc/posts/creating-a-user-with-limited-privileges-in-postgres/ - Thu, 16 Apr 2020 20:01:15 +0800 - - https://blog.lofibean.cc/posts/creating-a-user-with-limited-privileges-in-postgres/ - - <p>This post showing how to create a user with limited privileges in PostgreSQL.</p> -<h2 id="situation">Situation</h2> -<p>I created a web app. It reads data from a PostgreSQL database. I want to create a user with read-only privilege and connect to the database.</p> -<h3 id="code">Code</h3> -<p>Let say the user you want to create is <code>webapp_user</code>:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-sql" data-lang="sql"><span style="color:#66d9ef">CREATE</span> <span style="color:#66d9ef">USER</span> webapp_user <span style="color:#66d9ef">WITH</span> <span style="color:#66d9ef">ENCRYPTED</span> PASSWORD <span style="color:#e6db74">&#39;secure_passw0rd&#39;</span>; -</code></pre></div><p>Grant the right to all public tables:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-sql" data-lang="sql"><span style="color:#66d9ef">GRANT</span> <span style="color:#66d9ef">SELECT</span> <span style="color:#66d9ef">ON</span> <span style="color:#66d9ef">ALL</span> TABLES <span style="color:#66d9ef">IN</span> <span style="color:#66d9ef">SCHEMA</span> <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">TO</span> webapp_user; -</code></pre></div><p>Connect the database using <code>webapp_user</code> in the web app.</p> -<h2 id="i-want-more-power">I want more power&hellip;</h2> -<p>Now my web app is not read-only anymore. Users can create/delete some entries in the tables too.</p> -<h3 id="code-1">Code</h3> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-sql" data-lang="sql"><span style="color:#66d9ef">GRANT</span> <span style="color:#66d9ef">SELECT</span>, <span style="color:#66d9ef">INSERT</span>, <span style="color:#66d9ef">UPDATE</span>, <span style="color:#66d9ef">DELETE</span> <span style="color:#66d9ef">ON</span> <span style="color:#66d9ef">ALL</span> TABLES <span style="color:#66d9ef">IN</span> <span style="color:#66d9ef">SCHEMA</span> <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">TO</span> webapp_user; -</code></pre></div><p>Looks simple and cool! But why I got the <strong><code>permission denied for sequence XXX_id_seq to YYY</code></strong> error while inserting new records to the tables?</p> -<p>If your table has an <em>auto-increment</em> field then you need some extra privileges: the privileges to use the sequence-related functions (e.g. <code>currval</code> and <code>nextval</code>)</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-sql" data-lang="sql"><span style="color:#66d9ef">GRANT</span> <span style="color:#66d9ef">USAGE</span>, <span style="color:#66d9ef">SELECT</span> <span style="color:#66d9ef">ON</span> <span style="color:#66d9ef">ALL</span> SEQUENCES <span style="color:#66d9ef">IN</span> <span style="color:#66d9ef">SCHEMA</span> <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">to</span> webapp_user; -</code></pre></div><p>Example of an <em>auto-increment</em> field: the id of the table</p> -<h3 id="extra">Extra</h3> -<p>What if I just want to apply the privilege(s) to a special table?</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-sql" data-lang="sql"><span style="color:#66d9ef">GRANT</span> <span style="color:#66d9ef">SELECT</span>, <span style="color:#66d9ef">INSERT</span>, <span style="color:#66d9ef">UPDATE</span>, <span style="color:#66d9ef">DELETE</span> <span style="color:#66d9ef">ON</span> special_table <span style="color:#66d9ef">TO</span> webapp_user; -</code></pre></div><hr> -<p>Reference:</p> -<ul> -<li><a href="https://www.techonthenet.com/postgresql/grant_revoke.php">Grant Privileges on Table</a></li> -<li><a href="https://stackoverflow.com/q/9325017">ERROR: permission denied for sequence cities_id_seq using Postgres</a></li> -</ul> -<hr> -<p><em>(this blog post also available on <a href="https://dev.to/bemnlam/creating-a-user-with-limited-privileges-in-postgres-5ee7/edit">dev.to</a>)</em></p> - - - - - - How to add a new Hugo blog post - https://blog.lofibean.cc/posts/welcome/ - Thu, 16 Apr 2020 10:55:25 +0800 - - https://blog.lofibean.cc/posts/welcome/ - - <p>Go to <code>blog</code> folder</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">hugo new posts/name-of-the-new-post.md -</code></pre></div><p>Write your post. Back to <code>blog</code> folder and then</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">hugo server -D -</code></pre></div><p>Then you can preview your blog locally.</p> -<h3 id="deploy-production">Deploy production</h3> -<p>Change <code>draft=true</code> in the blog post and then</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">hugo -</code></pre></div><p>Push to remote <code>master</code>.</p> -<p>Done.</p> - - - - - - diff --git a/categories/dev/page/1/index.html b/categories/dev/page/1/index.html deleted file mode 100644 index 803e1c89..00000000 --- a/categories/dev/page/1/index.html +++ /dev/null @@ -1 +0,0 @@ -https://blog.lofibean.cc/categories/dev/ \ No newline at end of file diff --git a/categories/dev/page/2/index.html b/categories/dev/page/2/index.html deleted file mode 100644 index 2b1aa04e..00000000 --- a/categories/dev/page/2/index.html +++ /dev/null @@ -1,338 +0,0 @@ - - - - - - - Dev - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -

Dev

- - - - -
-
-

Documentation Makes Easy With MkDocs and GitLab Pages

- -
-
- A guide to build a static website using MkDocs and deploy it to GitLab Pages. -
- Read more - - -
- - - - -
-
-

A Tale of Two Caches: Redis and the cache helper

- -
-
- A note on how to add Redis and the cache helper to a .NET core Mvc app. -
- Read more - - -
- - - - -
-
-

A Note on SSL Certificate

- -
-
- This is a note about the Linkedin learning course SSL Certificates for Web Developers. -
- Read more - - -
- - - - -
-
-

Creating a User With Limited Privileges in Postgres

- -
-
- This post showing how to create a user with limited privileges in PostgreSQL. -
- Read more - - -
- - - - -
-
-

How to add a new Hugo blog post

- -
-
- -
- Read more - -
- - - - - - - - - -
- - - - - -
- - -
- - - - - - diff --git a/categories/index.html b/categories/index.html deleted file mode 100644 index c963d89b..00000000 --- a/categories/index.html +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - - Categories - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-

Categories

- -
-
- - - - - -
- - -
- - - - - - diff --git a/categories/index.xml b/categories/index.xml deleted file mode 100644 index 196ce577..00000000 --- a/categories/index.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - - Categories on log from home - https://blog.lofibean.cc/categories/ - Recent content in Categories on log from home - - - https://blog.lofibean.cc/android-chrome-512x512.png?v=20201231 - - Favicon of Categories on log from home - https://blog.lofibean.cc/ - - Hugo -- gohugo.io - en-us - &copy; bemnlam - Thu, 25 Feb 2021 17:10:25 +0800 - - - - - - Readings - https://blog.lofibean.cc/categories/readings/ - Thu, 25 Feb 2021 17:10:25 +0800 - - https://blog.lofibean.cc/categories/readings/ - - - - - - - Dev - https://blog.lofibean.cc/categories/dev/ - Tue, 16 Feb 2021 19:08:15 +0800 - - https://blog.lofibean.cc/categories/dev/ - - - - - - - Leisure - https://blog.lofibean.cc/categories/leisure/ - Fri, 05 Feb 2021 21:33:03 +0800 - - https://blog.lofibean.cc/categories/leisure/ - - - - - - - Coffee - https://blog.lofibean.cc/categories/coffee/ - Thu, 31 Dec 2020 20:58:21 +0800 - - https://blog.lofibean.cc/categories/coffee/ - - - - - - - diff --git a/categories/leisure/index.html b/categories/leisure/index.html deleted file mode 100644 index f39beaa2..00000000 --- a/categories/leisure/index.html +++ /dev/null @@ -1,274 +0,0 @@ - - - - - - - Leisure - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -

Leisure

- - - - -
-
-

Improving My Blogging Workflow

- -
-
- It's time to do some refactoring and improvements for the blog! -
- Read more - - -
- - - - -
-
-

The Perks of Being a Mac (or FreeBSD) user

- -
-
- Your computer may know something you don't expected. -
- Read more - - -
- - - - - - - - - -
- - - - - -
- - -
- - - - - - diff --git a/categories/leisure/index.xml b/categories/leisure/index.xml deleted file mode 100644 index 1bf0e083..00000000 --- a/categories/leisure/index.xml +++ /dev/null @@ -1,313 +0,0 @@ - - - - Leisure on log from home - https://blog.lofibean.cc/categories/leisure/ - Recent content in Leisure on log from home - - - https://blog.lofibean.cc/android-chrome-512x512.png?v=20201231 - - Favicon of Leisure on log from home - https://blog.lofibean.cc/ - - Hugo -- gohugo.io - en-us - &copy; bemnlam - Fri, 05 Feb 2021 21:33:03 +0800 - - - - - - Improving My Blogging Workflow - https://blog.lofibean.cc/posts/improving-my-blogging-workflow/ - Fri, 05 Feb 2021 21:33:03 +0800 - - https://blog.lofibean.cc/posts/improving-my-blogging-workflow/ - - <img src="https://images.unsplash.com/photo-1578861377460-c4536383d637?ixlib=rb-1.2.1&ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&auto=format&fit=crop&w=1280&h=630&q=80" /><h2 id="overview">Overview</h2> -<aside class="c-toc"> - <details open> - <summary title="click to toggle table of contents.">Table of Contents</summary> - <nav id="TableOfContents"> - <ul> - <li><a href="#overview">Overview</a></li> - <li><a href="#using-page-bundle-to-group-resouces">Using Page Bundle to Group resouces</a> - <ul> - <li><a href="#insert-an-image">Insert an Image</a></li> - <li><a href="#cover-image">Cover Image</a></li> - <li><a href="#bonus-git-repository">Bonus: Git Repository</a></li> - </ul> - </li> - <li><a href="#script-to-start-a-new-post">Script to start a new post</a> - <ul> - <li><a href="#insert-images-to-typora">Insert Images to Typora</a></li> - <li><a href="#shell-script-to-launch-everything">Shell Script to launch everything</a></li> - </ul> - </li> - </ul> -</nav> - </details> -</aside> - -<p>I set up this hugo blog and hosted it on GitHub page. At first, I just want to make it work: <strong>showing some text and images</strong>. However, I realized that:</p> -<ol> -<li>placing the <strong>images and posts place under different directories</strong> will make this blog become unmanagable.</li> -<li>I cannot see the images while writing a post because of (1). I have to switch to my browser when I want to see if the image has been inserted correctly.</li> -<li><strong>launching the markdown editor and start hugo</strong> after creating a new file will be a very good idea.</li> -</ol> -<p>Therefore I use some time to re-organize the image and posts and created a script to help me to start writing a new post.</p> -<h2 id="using-page-bundle-to-group-resouces">Using Page Bundle to Group resouces</h2> -<p>After reading the Hugo&rsquo;s documentation I think the <a href="https://gohugo.io/content-management/organization/#page-bundles">page-bundles</a> feature is what I need. For each post with images, I will create a <a href="https://gohugo.io/content-management/page-bundles/">Leaf Bundle</a> like the following:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">my-blog-post -├── img -│ ├── image-1.png -│ ├── image-2.png -│ └── image-n.png -├── index.md -└── thumbnail.jpg -</code></pre></div><h3 id="insert-an-image">Insert an Image</h3> -<p>For example, the blog post will have a relative url <code>/posts/my-blog-post/</code>. When I using a markdown editor to write the post, I can place all the images under <code>/img</code> and use the relative url:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-markdown" data-lang="markdown">I can insert an image like this: ![<span style="color:#f92672">image-alt</span>](<span style="color:#a6e22e">./img/image-2.png</span>) -</code></pre></div><p>By doing so, I can see the image right away and I don&rsquo;t need to do special handling when generating the blog post using Hugo.</p> -<h3 id="cover-image">Cover Image</h3> -<p>Since the cover image will be placed in the front matter and can be seen in browser only, I place it under the same directory with the blog post (i.e. <code>index.md</code>). In the blog post:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">--- -<span style="color:#f92672">title</span>: <span style="color:#ae81ff">My Blog Post</span> -<span style="color:#f92672">cover_image</span>: <span style="color:#ae81ff">/posts/my-blog-post/thumbnail.jpg</span> ---- -</code></pre></div><p>I will make use of the value in thumbnail and combine with the site root to generate an absolute url. The absolute url can then be used in meta data like <code>og:image</code>. Good for SEO.</p> -<h3 id="bonus-git-repository">Bonus: Git Repository</h3> -<p>I know this is weird but I split my GitHub page into 2 repositories: the main repo, and a submodule contains all my raw markdown files of my blog posts. I think that will be more organized and I can get all the text files only. Placing the image out of the <code>posts/</code> folder is kinda breaking this purpose.</p> -<p>Once I grouped the image with the markdown files, I can finally keep my content organized again! In short, I created a problem and then solved it 😅</p> -<h2 id="script-to-start-a-new-post">Script to start a new post</h2> -<p>I love to use <a href="https://typora.io/">Typora</a> to write my posts. However, it&rsquo;s vary painful to manage the images. If I pasting an image to Typora it will store my image into somewhere out of the git repository. Moving the images back to the repository and changing the image pathes is purly a waste of time.</p> -<h3 id="insert-images-to-typora">Insert Images to Typora</h3> -<p>Luckily, the image issue is solved once I group the post and image under the same folder. What I have to do is change the image setting in Typora:</p> -<p><img src="./img/image-20210205221146175.png" alt="image-20210205221146175"></p> -<p>Choose <strong>Copy image to custom folder</strong> and set the value as <code>./img</code>.</p> -<h3 id="shell-script-to-launch-everything">Shell Script to launch everything</h3> -<p>My current workflow to start a new post:</p> -<ol> -<li>launch Terminal and go to the blog post&rsquo;s repo.</li> -<li>create a new markdown file.</li> -<li>launch Typora.</li> -<li>launch Hugo to see the result.</li> -</ol> -<p>I automated the above steps using the following script:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-zsh" data-lang="zsh"><span style="color:#75715e">#!/bin/zsh -</span><span style="color:#75715e"></span>read -p <span style="color:#e6db74">&#34;Create a new buldled post (e.g. hello-world): &#34;</span> filename - -<span style="color:#66d9ef">if</span> <span style="color:#f92672">[</span> -z <span style="color:#e6db74">&#34;</span>$filename<span style="color:#e6db74">&#34;</span> <span style="color:#f92672">]</span> -<span style="color:#66d9ef">then</span> - echo <span style="color:#e6db74">&#34;Filename cannot be empty. Try again.&#34;</span> -<span style="color:#66d9ef">else</span> - cd ./blog - echo <span style="color:#e6db74">&#34; 1. Creating new post... &#34;</span> - hugo new posts/<span style="color:#e6db74">${</span>filename<span style="color:#e6db74">}</span>/index.md - - echo <span style="color:#e6db74">&#34; 2. Launching Typora... &#34;</span> - open -a Typora ./content/posts/<span style="color:#e6db74">${</span>filename<span style="color:#e6db74">}</span>/index.md &amp; - - echo <span style="color:#e6db74">&#34; 3. Launching browser... &#34;</span> - open http://localhost:1313/posts/<span style="color:#e6db74">${</span>filename<span style="color:#e6db74">}</span> - - echo <span style="color:#e6db74">&#34; 4. Starting dev server... &#34;</span> - hugo serve -D -<span style="color:#66d9ef">fi</span>% -</code></pre></div><p>To launch an app from Terminal, you can do this:</p> -<pre tabindex="0"><code>open -a Typora &amp; -</code></pre><p>Remember to have a <code>&amp;</code> at the end. Otherwise the application will be closed once you close the Terminal!</p> - - - - - - The Perks of Being a Mac (or FreeBSD) user - https://blog.lofibean.cc/posts/the-perks-of-being-a-mac-or-freebsd-user/ - Sun, 28 Jun 2020 12:28:38 +0800 - - https://blog.lofibean.cc/posts/the-perks-of-being-a-mac-or-freebsd-user/ - - <blockquote> -<p>🚨 Note: This is not a technical reading. If you want to have some fun and practice your <code>ls</code> and <code>cat</code> skills, this article may suit you.</p> -</blockquote> -<h2 id="table-of-contents">Table of Contents</h2> -<ul> -<li><a href="#misc-file">Misc. files of the OS</a> -<ul> -<li><a href="#meaning-of-flowers">The meaning of flowers</a></li> -<li><a href="#the-bday-guide">The birthday present guide</a></li> -</ul> -</li> -<li><a href="#mac-is-a-secret-fan-of">Mac is a secret fan of&hellip;</a></li> -<li><a href="#bonus-recipe">Bonus: the missing recipe</a></li> -</ul> -<hr> -<h2 id="misc-file">Misc. Files of the OS</h2> -<p>I found some interesting files under <code>/usr/share/misc</code> of my MacBook:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">-r--r--r-- <span style="color:#ae81ff">1</span> root wheel 3.1K Dec <span style="color:#ae81ff">14</span> <span style="color:#ae81ff">2019</span> ascii --r--r--r-- <span style="color:#ae81ff">1</span> root wheel 374B Dec <span style="color:#ae81ff">14</span> <span style="color:#ae81ff">2019</span> birthtoken --r--r--r-- <span style="color:#ae81ff">1</span> root wheel 2.9K Dec <span style="color:#ae81ff">14</span> <span style="color:#ae81ff">2019</span> eqnchar --r--r--r-- <span style="color:#ae81ff">1</span> root wheel 1.4K Dec <span style="color:#ae81ff">14</span> <span style="color:#ae81ff">2019</span> flowers --r--r--r-- <span style="color:#ae81ff">1</span> root wheel 508B Dec <span style="color:#ae81ff">14</span> <span style="color:#ae81ff">2019</span> getopt --rw-r--r-- <span style="color:#ae81ff">1</span> root wheel 941B Dec <span style="color:#ae81ff">14</span> <span style="color:#ae81ff">2019</span> mail.help --rw-r--r-- <span style="color:#ae81ff">1</span> root wheel 1.3K Dec <span style="color:#ae81ff">14</span> <span style="color:#ae81ff">2019</span> mail.tildehelp --r--r--r-- <span style="color:#ae81ff">1</span> root wheel 310B Dec <span style="color:#ae81ff">14</span> <span style="color:#ae81ff">2019</span> man.template --r--r--r-- <span style="color:#ae81ff">1</span> root wheel 948B Dec <span style="color:#ae81ff">14</span> <span style="color:#ae81ff">2019</span> mdoc.template --r--r--r-- <span style="color:#ae81ff">1</span> root wheel 425B Dec <span style="color:#ae81ff">14</span> <span style="color:#ae81ff">2019</span> operator --r--r--r-- <span style="color:#ae81ff">1</span> root wheel 78K May <span style="color:#ae81ff">27</span> 11:38 trace.codes --rw-r--r-- <span style="color:#ae81ff">1</span> root wheel 13K Dec <span style="color:#ae81ff">14</span> <span style="color:#ae81ff">2019</span> units.lib -</code></pre></div><h2 id="meaning-of-flowers">The Meaning of Flowers</h2> -<p><code>/usr/share/misc/flowers</code> lists out the meaning of flowers<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. Check this out if you are going to buy some flowers but you don&rsquo;t know what you should buy.</p> -<pre tabindex="0"><code># Flower : Meaning -# @(#)flowers 8.1 (Berkeley) 6/8/93 -# -# Upside down reverses the meaning. -African violet:Such worth is rare. -Apple blossom:Preference. -Bachelor's button:Celibacy. -Bay leaf:I change but in death. -Camelia:Reflected loveliness. -Chrysanthemum, other color:Slighted love. -Chrysanthemum, red:I love. -Chrysanthemum, white:Truth. -Clover:Be mine. -Crocus:Abuse not. -Daffodil:Innocence. -Forget-me-not:True love. -Fuchsia:Fast. -Gardenia:Secret, untold love. -Honeysuckle:Bonds of love. -Ivy:Friendship, fidelity, marriage. -Jasmine:Amiability, transports of joy, sensuality. -Leaves (dead):Melancholy. -Lilac:Youthful innocence. -Lilly of the valley:Return of happiness. -Lilly:Purity, sweetness. -Magnolia:Dignity, perseverance. -Marigold:Jealousy. -Mint:Virtue. -Orange blossom:Your purity equals your loveliness. -Orchid:Beauty, magnificence. -Pansy:Thoughts. -Peach blossom:I am your captive. -Petunia:Your presence soothes me. -Poppy:Sleep. -Rose, any color:Love. -Rose, deep red:Bashful shame. -Rose, single, pink:Simplicity. -Rose, thornless, any color:Early attachment. -Rose, white:I am worthy of you. -Rose, yellow:Decrease of love, rise of jealousy. -Rosebud, white:Girlhood, and a heart ignorant of love. -Rosemary:Remembrance. -Sunflower:Haughtiness. -Tulip, red:Declaration of love. -Tulip, yellow:Hopeless love. -Violet, blue:Faithfulness. -Violet, white:Modesty. -Zinnia:Thoughts of absent friends. -</code></pre><h2 id="the-bday-guide">The Birthday Present Guide</h2> -<p>Check out the <code>/usr/share/misc/birthtoken</code><sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> and see which gem and flower (looks like someone in Berkeley knows about the flowers really well) you should buy for your friends!</p> -<blockquote> -<p><em>&ldquo;Oh why you choose this gem and that flower as the present?&quot;</em></p> -<p><em>&ldquo;Um&hellip; that&rsquo;s my computer&rsquo;s idea&hellip;&quot;</em></p> -</blockquote> -<h3 id="more-about-perl-and-ruby">More About Perl and Ruby</h3> -<p>The creator of <a href="https://www.ruby-lang.org">Ruby</a> chose the name <em>Ruby</em> because it was <a href="https://ruby-doc.org/docs/ruby-doc-bundle/FAQ/FAQ.html">the birthstone of one of his colleagues</a> and that is the gem right after Pearl (<a href="https://www.perl.org/">Perl</a>).</p> -<p><strong>Lesson learnt:</strong> when you try to name a new language you invented, you should check this file out!</p> -<pre tabindex="0"><code># Birthday : Birth Stone : Birth Flower -# @(#)birthtoken 8.1 (Berkeley) 6/8/93 -January:Garnet:Carnation -February:Amethyst:Violet -March:Aquamarine:Jonquil -April:Diamond:Sweetpea -May:Emerald:Lily Of The Valley -June:Pearl:Rose -July:Ruby:Larkspur -August:Peridot:Gladiolus -September:Sapphire:Aster -October:Opal:Calendula -November:Topaz:Chrysanthemum -December:Turquoise:Narcissus -</code></pre><h2 id="mac-is-a-secret-fan-of">Mac is a Secret Fan of&hellip;</h2> -<p>The <code>/usr/share/calendar</code> folder contains some useful calendars but this one really catches my eye:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">-rw-r--r-- <span style="color:#ae81ff">1</span> root wheel 1.4K Dec <span style="color:#ae81ff">14</span> <span style="color:#ae81ff">2019</span> calendar.lotr -</code></pre></div><p>This is a timeline of the important events happened in <em>The Lord Of The Rings</em><sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>:</p> -<pre tabindex="0"><code>/* - * Lord Of The Rings - * - * $FreeBSD: src/usr.bin/calendar/calendars/calendar.lotr,v 1.2 2003/10/09 00:31:48 grog Exp $ - */ - -#ifndef _calendar_lotr_ -#define _calendar_lotr_ - -01/05 Fellowship enters Moria -01/09 Fellowship reaches Lorien -01/17 Passing of Gandalf -02/07 Fellowship leaves Lorien -02/17 Death of Boromir -02/20 Meriadoc &amp; Pippin meet Treebeard -02/22 Passing of King Elessar -02/24 Ents destroy Isengard -02/26 Aragorn takes the Paths of the Dead -03/05 Frodo &amp; Samwise encounter Shelob -03/08 Deaths of Denethor &amp; Theoden -03/18 Destruction of the Ring -03/29 Flowering of the Mallorn -04/04 Gandalf visits Bilbo -04/17 An unexpected party -04/23 Crowning of King Elessar -05/19 Arwen leaves Lorien to wed King Elessar -06/11 Sauron attacks Osgiliath -06/13 Bilbo returns to Bag End -06/23 Wedding of Elessar &amp; Arwen -07/04 Gandalf imprisoned by Saruman -07/24 The ring comes to Bilbo -07/26 Bilbo rescued from Wargs by Eagles -08/03 Funeral of King Theoden -08/29 Saruman enters the Shire -09/10 Gandalf escapes from Orthanc -09/14 Frodo &amp; Bilbo's birthday -09/15 Black riders enter the Shire -09/18 Frodo and company rescued by Bombadil -09/28 Frodo wounded at Weathertop -10/05 Frodo crosses bridge of Mitheithel -10/16 Boromir reaches Rivendell -10/17 Council of Elrond -10/25 End of War of the Ring -11/16 Bilbo reaches the Lonely Mountain -12/05 Death of Smaug -12/16 Fellowship begins Quest - -#endif /* !_calendar_lotr_ */ -</code></pre><h2 id="bonus-recipe">Bonus: the missing recipe</h2> -<p>In the eariler versions of the macOS, <strong>a hidden cookie recipe</strong> can be found by typing this command in the Terminal:</p> -<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">Open /usr/share/emacs/22.1/etc/COOKIES -</code></pre></div><p>Unforrunately in the latest macOS this file is gone (together with <code>/usr/share/emacs</code>). We can only check this out <a href="https://opensource.apple.com/source/emacs/emacs-96/emacs/etc/COOKIES.auto.html">on the Apple Open Source website</a><sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup>.</p> -<section class="footnotes" role="doc-endnotes"> -<hr> -<ol> -<li id="fn:1" role="doc-endnote"> -<p><a href="https://github.com/lattera/freebsd/blob/master/share/misc/flowers">https://github.com/lattera/freebsd/blob/master/share/misc/flowers</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> -</li> -<li id="fn:2" role="doc-endnote"> -<p><a href="https://github.com/lattera/freebsd/blob/master/share/misc/birthtoken">https://github.com/lattera/freebsd/blob/master/share/misc/birthtoken</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> -</li> -<li id="fn:3" role="doc-endnote"> -<p><a href="https://opensource.apple.com/source/misc_cmds/misc_cmds-31/calendar/calendars/calendar.lotr.auto.html">https://opensource.apple.com/source/misc_cmds/misc_cmds-31/calendar/calendars/calendar.lotr.auto.html</a>&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> -</li> -<li id="fn:4" role="doc-endnote"> -<p><a href="https://opensource.apple.com/source/emacs/emacs-96/emacs/etc/COOKIES.auto.html">https://opensource.apple.com/source/emacs/emacs-96/emacs/etc/COOKIES.auto.html</a>&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> -</li> -</ol> -</section> - - - - - - diff --git a/categories/leisure/page/1/index.html b/categories/leisure/page/1/index.html deleted file mode 100644 index 03915e85..00000000 --- a/categories/leisure/page/1/index.html +++ /dev/null @@ -1 +0,0 @@ -https://blog.lofibean.cc/categories/leisure/ \ No newline at end of file diff --git a/categories/readings/index.html b/categories/readings/index.html deleted file mode 100644 index d14d04e3..00000000 --- a/categories/readings/index.html +++ /dev/null @@ -1,294 +0,0 @@ - - - - - - - Readings - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -

Readings

- - - - -
-
-

【書摘】真確:扭轉十大直覺偏誤,發現事情比你想的美好

- -
-
- This is a note about the book "FACTFULNESS:Ten Reasons We’re Wrong About the World--and Why Things Are Better Than You Think" (真確:扭轉十大直覺偏誤,發現事情比你想的美好) -
- Read more - - -
- - - - -
-
-

Why You Should Manage Your Energy, Not Your Time

- -
-
- As a human being, **managing our energy is more important** because this is a limited resources. -
- Read more - - -
- - - - -
-
-

佛雷德金悖論 Fredkin’s paradox

- -
-
- 好多時候難以取捨的選擇本身對自身所帶來的差異沒有想像中的嚴重。因為決策困難而不做決策反而會令自己損失更大。 -
- Read more - -
- - - - - - - - - -
- - - - - -
- - -
- - - - - - diff --git a/categories/readings/index.xml b/categories/readings/index.xml deleted file mode 100644 index a8ef77b0..00000000 --- a/categories/readings/index.xml +++ /dev/null @@ -1,285 +0,0 @@ - - - - Readings on log from home - https://blog.lofibean.cc/categories/readings/ - Recent content in Readings on log from home - - - https://blog.lofibean.cc/android-chrome-512x512.png?v=20201231 - - Favicon of Readings on log from home - https://blog.lofibean.cc/ - - Hugo -- gohugo.io - en-us - &copy; bemnlam - Thu, 25 Feb 2021 17:10:25 +0800 - - - - - - 【書摘】真確:扭轉十大直覺偏誤,發現事情比你想的美好 - https://blog.lofibean.cc/posts/reading-factfulness/ - Thu, 25 Feb 2021 17:10:25 +0800 - - https://blog.lofibean.cc/posts/reading-factfulness/ - - <img src="https://im2.book.com.tw/image/getImage?i=https://www.books.com.tw/img/001/079/04/0010790443_bc_01.jpg&v=5b2243fb&w=1200&h=630" /><blockquote> -<p>可不可能有一天所有人都有基於事實的世界觀呢?巨大的改變總是難以想像,但絕對有可能,我也相信有一天會實現,原因有兩個:第一,<strong>基於現實的世界觀更有助把人生走好</strong>,就像準確的導航系統更有助你在城裡找路;第二,大概更重要的是,<strong>基於現實的世界觀讓人更安心</strong>,比誇大的世界觀來得不會造成壓力與絕望,畢竟誇大的世界觀太負面也太嚇人了。</p> -</blockquote> -<blockquote> -<p>我們有了基於現實的世界觀之後,可以看到世界不如表面上那麼糟──而且可以知道我們該怎麼<strong>讓世界變得愈來愈好</strong>。</p> -</blockquote> -<aside class="c-toc"> - <details open> - <summary title="click to toggle table of contents.">Table of Contents</summary> - <nav id="TableOfContents"> - <ul> - <li><a href="#1-二分化直覺偏誤">1: 二分化直覺偏誤</a></li> - <li><a href="#2-負面型直覺偏誤">2: 負面型直覺偏誤</a></li> - <li><a href="#3-扭轉直線型直覺偏誤">3: 扭轉直線型直覺偏誤</a></li> - <li><a href="#4-恐懼型直覺偏誤">4: 恐懼型直覺偏誤</a></li> - <li><a href="#5-失真型直覺偏誤">5: 失真型直覺偏誤</a></li> - <li><a href="#6-概括型直覺偏誤">6: 概括型直覺偏誤</a></li> - <li><a href="#7-宿命型直覺偏誤">7: 宿命型直覺偏誤</a></li> - <li><a href="#8-單一觀點直覺偏誤">8: 單一觀點直覺偏誤</a></li> - <li><a href="#9-怪罪型直覺偏誤">9: 怪罪型直覺偏誤</a></li> - <li><a href="#10-急迫型直覺偏誤">10: 急迫型直覺偏誤</a></li> - </ul> -</nav> - </details> -</aside> - -<h2 id="1-二分化直覺偏誤">1: 二分化直覺偏誤</h2> -<blockquote> -<p>為了扭轉二分化直覺偏誤,你要尋找多數是落在哪裡。懂得察覺我們遇到了一個將事情區分成兩類的說法,中間隔著一條鴻溝。但真實世界往往不是斷然二分,多數人通常是落在中間,鴻溝並不存在。</p> -</blockquote> -<ul> -<li>留意對<strong>平均值</strong>的比較:如果你能檢視分布狀況,大概會發現個體間有所重疊,鴻溝並不存在。</li> -<li>留意對<strong>極值</strong>的比較:無論任何國家或群體,總有上層與下層,有時涉及高度不公,但即使如此,多數通常仍是落在中間,原本你以為鴻溝所在的地方。</li> -<li>留意自己的<strong>上層目光</strong>:切記,從上層俯瞰的目光不準,底下其他東西看起來都一樣矮,但其實不然。</li> -</ul> -<h2 id="2-負面型直覺偏誤">2: 負面型直覺偏誤</h2> -<blockquote> -<p>為了扭轉負面型直覺偏誤,你該預期壞消息會被大肆報導。</p> -</blockquote> -<ul> -<li>既是糟糕也<strong>在變好</strong>:練習區分狀態(比如「糟糕」)與改變的趨勢(比如「變好」),明白事情可以既是糟糕也在變好。</li> -<li><strong>好消息</strong>不成新聞:好消息絕少會報導,所以新聞大多是壞消息。當你看到壞消息,問一問自己,好消息是否也會獲得報導。</li> -<li><strong>逐漸進步</strong>不成新聞:當事情逐漸進步,只是有時退步一下,你往往會注意到一時的退步,而非整體的進步。</li> -<li>新聞多不代表壞事多:壞新聞多,有時只代表各界對壞事的監控度有所提升,不代表世界正在變糟。</li> -<li>小心對過往的美化:人時常會<strong>美化過去</strong>,國家時常會歌頌歷史。</li> -</ul> -<h2 id="3-扭轉直線型直覺偏誤">3: 扭轉直線型直覺偏誤</h2> -<blockquote> -<p>為了扭轉直線型直覺偏誤,切記「線有各種形狀」,事情不會只有一種發展方向。</p> -</blockquote> -<ul> -<li>別假定會是直線:許多趨勢不是呈直線,而是呈<strong>S型</strong>、<strong>滑梯型</strong>、<strong>駝峰型</strong>或<strong>倍增型</strong>發展。天底下沒有哪個幼兒會以出生前6個月的生長速度繼續長大,也沒有父母樂見如此。</li> -</ul> -<h2 id="4-恐懼型直覺偏誤">4: 恐懼型直覺偏誤</h2> -<blockquote> -<p>為了扭轉恐懼型直覺偏誤,你應該評估風險。懂得察覺可怕事物正在吸引我們的注意力,然後意識到這些不見得是最危險的事物。我們生來害怕衝突、受困與汙染,高估了相關危害。</p> -</blockquote> -<ul> -<li> -<p><strong>恐懼</strong>vs.現實:世界顯得比實際上更可怕,原因是新聞媒體與你自己的注意力過濾器把資訊篩選過了,留下恐怖的消息。</p> -</li> -<li> -<p>風險=危險x暴露:風險程度不是取決於你<strong>感覺</strong>多害怕,而是關乎兩件事:有多危險?你暴露在多少危險中?</p> -</li> -<li> -<p>先冷靜再說:你害怕時看見的世界會不一樣。<strong>在驚恐消退之前,盡量少做決定</strong>。</p> -</li> -</ul> -<h2 id="5-失真型直覺偏誤">5: 失真型直覺偏誤</h2> -<blockquote> -<p>為了克制失真型直覺偏誤,你得按比例認知事物。如果看到某個單獨的數字顯得很驚人(數字很大或很小),不妨試著拿來跟相關數字比對或相除,也許會有截然不同的感受。</p> -</blockquote> -<ul> -<li> -<p>比對:巨大的數字總是驚人。<strong>單獨出現的數字會造成誤導</strong>,你該謹慎看待,永遠要找相關數字互相比對,最好還要找某個數字相除。</p> -</li> -<li> -<p><strong>80/20法則</strong>:你是否曾經需要檢視一大堆項目?不妨找少數最大的項目,優先處理,那些往往比其他全部加起來更重要。</p> -</li> -<li> -<p>除法:數字與比例可能透露天差地別的資訊。<strong>比例較有意義</strong>,在比較不同大小的群體時尤其是這樣。在比較國家或地區時,特別得看人均比例。</p> -</li> -</ul> -<h2 id="6-概括型直覺偏誤">6: 概括型直覺偏誤</h2> -<blockquote> -<p>為了扭轉概括型直覺偏誤,你要質疑分類。懂得察覺某個解釋當中用了概括分類,然後意識到分類可能會誤導。我們無法不概括分類,也不該設法不再分類,但該避免錯用。</p> -</blockquote> -<ul> -<li> -<p><strong>尋找一個群體「裡面」的不同之處</strong>:在群體很大時尤需如此,你得設法切分成更準確的小分類,然後……</p> -</li> -<li> -<p><strong>尋找不同群體「之間」的相似之處</strong>:如果你在不同群體之間找到非常相似之處,你要思考群體之間是否有關,但也……</p> -</li> -<li> -<p>尋找各個群體之間的「差異」:別假定這個群體(例如你和其他第四級的人或昏迷的士兵)裡適用的東西,也能套用到另一個群體(例如非第四級的人或睡覺的嬰兒)。</p> -</li> -<li> -<p>當心「多數」:多數只代表超過半數。你該問這個所謂多數是51%、99%或在中間哪裡。</p> -</li> -<li> -<p>當心<strong>鮮明例子</strong>:鮮明的例子容易回想,卻可能是特例而非通則。</p> -</li> -<li> -<p><strong>假定別人不是笨蛋</strong>:當某個事物看起來怪怪的,你要抱持好奇與謙虛,思考這從哪方面看是一個好辦法?</p> -</li> -</ul> -<h2 id="7-宿命型直覺偏誤">7: 宿命型直覺偏誤</h2> -<blockquote> -<p>為了扭轉宿命型直覺偏誤,你要切記緩慢改變也是改變。懂得察覺許多事物(包括個人、國家、宗教和文化)雖然看似沒有改變,其實只是改變得很慢,然後想到滴水可以穿石,緩慢的小改變可以日積月累成大變化。</p> -</blockquote> -<ul> -<li> -<p>留意<strong>逐漸的進步</strong>:每年進步一點點,幾十年後就是巨大的改變。</p> -</li> -<li> -<p>更新你的知識:有些知識轉眼過時,科技、國家、社會、文化和宗教時時在變。</p> -</li> -<li> -<p>跟爺爺聊一聊:如果你想複習價值觀確已改變這件事,不妨想一想你祖父母的<strong>價值觀</strong>和你是多麼迥異。</p> -</li> -<li> -<p>蒐集文化改變的例子:質疑今天的文化不會跟昨天相同,也不會跟明天一樣。</p> -</li> -</ul> -<h2 id="8-單一觀點直覺偏誤">8: 單一觀點直覺偏誤</h2> -<blockquote> -<p>為了扭轉單一觀點直覺偏誤,你要有整個工具箱而非一把槌子。懂得察覺單一觀點可能局限自已的想像,然後想到不妨試著從許多角度來看問題,方能獲得更準確的了解,提出更實際的解方。</p> -</blockquote> -<ul> -<li> -<p>檢驗你的想法:<strong>別只看支持自身觀點的正面佐證</strong>,而是請不同意你的人檢驗你的想法,並找出他們的漏洞。</p> -</li> -<li> -<p>專業有局限:別對專業以外的領域撈過界:<strong>對不懂的事物要虛心</strong>。此外,別人的專業也有局限,你同樣得小心留意。</p> -</li> -<li> -<p>槌子與釘子:如果你擅長使用某個工具,你會太常想去用它。如果你深入了解了某個問題,你容易誇大那個問題或解方的重要性。切記,沒有哪個工具處處適用。如果你最愛的點子是槌子,記得找其他有螺絲起子、扳手和捲尺的同事,對其他領域的想法<strong>抱持開放態度</strong>。</p> -</li> -<li> -<p>看數據,但別「只」看數據:不靠數字不能了解世界,單靠數字同樣不能。要看到<strong>數字背後的現實世界</strong>。</p> -</li> -<li> -<p>當心簡單的想法與解法:歷史上不乏許多空想家,憑一個烏托邦願景替恐怖惡行辯護。你要歡迎複雜的思考,對照不同的想法,尋求折衷,視情況決定怎樣解決問題。</p> -</li> -</ul> -<h2 id="9-怪罪型直覺偏誤">9: 怪罪型直覺偏誤</h2> -<blockquote> -<p>為了扭轉怪罪型直覺偏誤,你要忍住尋找代罪羔羊。懂得察覺到自己在怪罪於他人,然後想到對個人的指責,往往導致看不到其他可能的解釋方式,且對防止壞事重演並無助益。</p> -</blockquote> -<ul> -<li> -<p><strong>尋找原因而非戰犯</strong>:當壞事發生,別找特定的個人或群體來怪罪,而是想到這背後可能不是有誰故意為之,轉為把精力放在釐清環環相扣的各個原因或整個系統。</p> -</li> -<li> -<p><strong>尋找體制而非英雄</strong>:當有人自稱促成某件好事,你要想一想是否即使沒有特定的誰做些什麼,這件事仍會發生。你要給整個體制一點掌聲。</p> -</li> -</ul> -<h2 id="10-急迫型直覺偏誤">10: 急迫型直覺偏誤</h2> -<blockquote> -<p>為了扭轉急迫型直覺偏誤,你要小步前行。懂得察覺某個決定看似急迫,然後意識到其實絕少真是這麼緊急。</p> -</blockquote> -<ul> -<li> -<p>深呼吸:當急迫型直覺反應出現,其他直覺也會跟進,分析能力形同關機。這時你得尋求更多時間和資訊。<strong>事情很少是現在再不做就沒機會了,也很少是非得二擇一不可</strong>。</p> -</li> -<li> -<p><strong>堅守數據</strong>:如果某件事顯得急迫與重要,則該經過衡量。有些數據相關但錯誤,有些數據正確但無關,你得留心分辨。只有相關且正確的數據才有用。</p> -</li> -<li> -<p>當心算命仙:任何對未來的預測都不是鐵口直斷,而是有不確定性。如果誰不承認這一點,你得提防當心。此外,你得要求對方提供所有預測情況,不只是最壞或最好的情況,並詢問這類預測在先前的準確度。</p> -</li> -<li> -<p>當心激進行動:你要問有什麼副作用,<strong>問這想法經過哪些檢驗</strong>。雖然逐步的實際提升加成效評估看似不夠大刀闊斧,卻通常更為有效。</p> -</li> -</ul> -<hr> -<figure><img src="./img/image-20210225211425321.png"/><figcaption> - <h4>求真習慣的守則</h4> - </figcaption> -</figure> - -<p><a href="https://www.dollarstreet.org">Dollar Street: See how people really live</a></p> - - - - - - Why You Should Manage Your Energy, Not Your Time - https://blog.lofibean.cc/posts/why-you-should-manage-your-energy-not-your-time/ - Sun, 17 May 2020 13:33:52 +0800 - - https://blog.lofibean.cc/posts/why-you-should-manage-your-energy-not-your-time/ - - <h2 id="-summary">🎯 Summary</h2> -<p>As a human being, <strong>managing our energy is more important</strong> because this is a limited resources.</p> -<p>We may wrongly think that increasing working hours can do more. However, longer working hours leads more <strong>unfocus</strong> time and brings negative effect to your work.</p> -<p>Surprisingly, having a monthly plan is better then a detailed daily plan. The later one demotivated people because we face <strong>inevitable distractions</strong> daily.</p> -<h2 id="-thoughts">💡 Thoughts</h2> -<ul> -<li>Stay focus on work by taking regular breaks. (e.g <a href="https://en.m.wikipedia.org/wiki/Pomodoro_Technique">Pomodoro Technique</a>)</li> -<li>In the article, top 10% productive employees <strong>work 52-mins work and take 17-mins break</strong>.</li> -<li>Regularly schedule some time for work individually without distraction.</li> -</ul> -<h2 id="--highlights">⭐️ Highlights</h2> -<blockquote> -<p>A workplace study found an average working professional experiences 87 interruptions per day, making it difficult to remain productive and focused for a full day.</p> -</blockquote> -<blockquote> -<p>Surprisingly, the top 10 percent of employees with the highest productivity didn’t put in longer hours than anyone else – often they didn&rsquo;t even work eight-hour days. Instead, the key to their productivity was that for every 52 minutes of focused work, they took a 17-minute break.</p> -</blockquote> -<blockquote> -<p>“At any given point, I should have deep work scheduled for roughly the next month. Once on the calendar, I protect this time like I would a doctor’s appointment or important meeting,”</p> -</blockquote> -<blockquote> -<p>While the researchers assumed that the well-structured daily plans would be most effective when it came to the execution of tasks, they were wrong: the detailed daily plans demotivated students. Harford argues that inevitable distractions often render the daily to-do list ineffective, while leaving room for improvisation in such a list can reap the best results.</p> -</blockquote> -<h6 id="-reference">🔗 reference:</h6> -<p><a href="https://getpocket.com/explore/item/why-you-should-manage-your-energy-not-your-time">Why You Should Manage Your Energy, Not Your Time</a></p> - - - - - - 佛雷德金悖論 Fredkin’s paradox - https://blog.lofibean.cc/posts/fredkins-paradox/ - Sun, 17 May 2020 12:41:12 +0800 - - https://blog.lofibean.cc/posts/fredkins-paradox/ - - <h2 id="-summary">🎯 Summary</h2> -<p>好多時候難以取捨的選擇本身對自身所帶來的差異沒有想像中的嚴重。因為決策困難而不做決策反而會令自己損失更大。</p> -<h2 id="-thoughts">💡 Thoughts</h2> -<p>文章的總結提出了面對選擇困難的其中一個解決方向:以後悔/遺憾去做決定的考慮。</p> -<blockquote> -<p>在避免後悔的基礎上優化你的決定,而不是基於成功/失敗或快樂/痛苦做出重大決定。</p> -</blockquote> -<blockquote> -<p>當你基於一條讓你最不會後悔的路徑來優化你的生活時,你可以設想未來的自己處於一個模擬未來狀態,並試著感受你可能將經歷哪些遺憾</p> -</blockquote> -<h2 id="-highlights">⭐️ Highlights</h2> -<blockquote> -<p>兩個選項的吸引力越相似,在二者之間做出選擇的難度越大——儘管在同樣程度上,這個選擇本身並不是太重要。</p> -</blockquote> -<blockquote> -<p>佛雷德金悖論指出:「在必須做出選擇的情況下,隨著兩種選擇的效果越來越接近,決策就會變得更加困難,但結果就更沒那麼重要了。」</p> -</blockquote> -<h6 id="-reference">🔗 Reference:</h6> -<ul> -<li><a href="https://www.techbang.com/posts/78437-fredkin-paradox-why-do-we-always-waste-time-on-inconsequential-decisions">佛雷德金悖論:為什麼我們總浪費時間在無關緊要的決定上?</a></li> -</ul> - - - - - - diff --git a/categories/readings/page/1/index.html b/categories/readings/page/1/index.html deleted file mode 100644 index 82c6bfc3..00000000 --- a/categories/readings/page/1/index.html +++ /dev/null @@ -1 +0,0 @@ -https://blog.lofibean.cc/categories/readings/ \ No newline at end of file diff --git a/ci-cd.drawio b/ci-cd.drawio deleted file mode 100644 index 4fbba83d..00000000 --- a/ci-cd.drawio +++ /dev/null @@ -1 +0,0 @@ -7Vzrb+I4EP9rkHZPApEXj4/Qbvd66umqo3e7+wmZxATvJnHkmAL31984sfPAaYGW5y6tVJKJ48fvN57xeEwb1k24/MxQPPuTejhomG1v2bBuG6ZpdHoOfAjJKpPYfTsT+Ix4slAhGJH/sBS2pXROPJxUCnJKA07iqtClUYRdXpEhxuiiWmxKg2qrMfKxJhi5KNClX4jHZ5m057QL+e+Y+DPVstGWT0KkCktBMkMeXZRE1qeGdcMo5dlVuLzBgQBP4ZK9d/fC0z+aYf/vf5+fPjcf/+r9WE0enpa42cmaekbBXPZ/BKAQGiWyD3ylBqb6z3DE39xeV2vvFscBXYWiUrP9GKBIazhZkBDkcDfU+/DqqDDjeFmiRXb0M6Yh5mwFReRTsycxl0qnbhcFg4YjFXNWYs9WXCGpNX5edYEMXEhwdgCqpwF1fz8CwQgzGJbOTgmkhCPG5cQwrQOiZnc3o6amZRk1q3so1CxDg204JzCDT6dazmaM+rtiJBv7G6YqinwYzC6tWTWtgZpUGkMBxyxCHA/pPPISjZd8mO+gynmZKka/C9N8Araahl1F0NERtOr4so2fhy99Et1zHCZ7cQB63Q2zE0B9Q488w6UvLv8ZPCkpVF96oKkESuLMiU/JEkO7wxgzAkPFDGTQHfD6+LEQDWc8hFHfGnCJAuJHcO3CcNJnub9ti96gZCYqTG+SGLkk8p9oDAJhUUmYrgLU5y0JfehoQCbwF4H/fMZjjzDoGRUKcLcgEdScjJPUeI/NVvLs1yqxQmcH61JVIMPUNciuUSDnUBbY3IZfmODePF1mQNEPg49Xst9Edp25OCrZ1jZkjzjyAc8rx2/juH1ijpVfK5Gcmuc13phwPDm+ixnheAQgi6cLCPSqTO0BJ7PfrRq+GkedG8MyUJ2DAaWbvlz1zwys2nXGccHaynS80U+cGl7r9Lpo7w7v8OqG32airc6pTbS+i7M/tk89meyaFe1xJ5Npa6Bgz8cjeUsZn1GfRij4VEiHVdiKMg80VWgB1nfM+Uru06A5p1Uo8ZLwr+L1lunI22+lR7dLWXV6s1I3EQz4a/nmW1qFo26L19I79d6LvCV0zlz8GjiSLY6Yj18LxU25oyWge1UPGA6QmM2VfuyfVOdK6h5I7Z8XqZ0rqe8nVW04nQupes6gzrul27v1Hk0r/MHDzzigce4DJ2y99Jl5xc7mbZ4jO0U9QVED9JChyJ1tz8sUIz5nGAr+tvv6xDgKE3lG45UA/chU9A9BRZLFrhdDw8lDWkvfKNkDDSFKIFK6FBbqQqHjsmDrLHxAEeUzCDfN9kRmmOIsw/RRA/DVFNPO8GjZpDxjujGd9PNkk+pp0vNAdTQBFcnhSTLXnGtt9v9XJMk8X5JM60pSRpK+kzr4MtIhf0Ou1tZ3EQdxHBAXyV2kB4qEBgwREO0KpVjTATrnAYnwTX7USiyWpzTiNzSgLC1jwe+d6NPQZ8gjuHgWUXmahdEfuPTCNP0RFZEgqKuoso0oVAw6HDygCQ4eaULSrlu3IfG8NPxTBQZya3JCOadh3V5lyXXWeVYxLhkjGmqcKvI0ig3NRrabmcxQLJ6ES1+cg2uhRWK34myL7t4VXRzGLLuolkEFA+MA8B9PFPpbn4rIVWb78GNtPph9fUL0auaD8dqpiPf5+ZPs3+wI8OaYvLFdSK5m4pmE5PZJ9ln2Db5Kklwa+k7ddv8aHT6gHb/XHOSHZNFE1duuH7h8q7dFbNy3Wh2rxnP2DoVWXVi2vlaRxlilmEpKt+4euFDWF71K7jwC8WCI3B9+qvZ17ittbKByaWJOaIk1leqacS5OLw8EEuad60VmiwA1UwITirVcaBHCQsQRfAh5IvJiMLmS5gSiTS9pgv7eiSxGKh2nwuxvMk7LjaeE4Sldwiqr14pVwnqj4uSKuNmPlBRAMX0c9usSoZfOvrWR/YS6BAXNEHsENU2j2weZDRjfGe3mCE0RI4ejOl8ytDri2Lvd6Zq9ftfUDMFx9UA/bXr5emBsZQX4Ksbi2hIQujMGiB6cfMts9QzbdEzL6th2r3Ni8vUMwjWOucYxonTNftxx4xind4qltEpZqutS7vHFjOW+l9/WlqtvNXvPZfWtZ1uuxuRqTBq1XxU5ri1RSZVfz5aoL3putCXndV6lc5pDSHs7evLOza/+lqypk9Xnwlr3UqbZuTCtUiWbmbbOi+lfdnG29WEx5cz2x1j66oAxtCoViCmJeFKq+VEICl+sHZBy1vJdm8r32mvakvVgr6m6Tv9S1OlcDIfaErhUNVRZ6iOpIdwW/x4iK178kw3r0/8=7Vpbb+I4FP41SLMPoFwhfeRSutW22mq6q32sTGKCZ0ycdQyB+fV7HOyQ4JSLCr1sC1LrHDuO/Z3vXHxCyx3OVzccpbN7FmHacqxo1XJHLccJXB/+SsF6I7D9K28jiTmJlGwreCS/sBJaSrogEc5qAwVjVJC0LgxZkuBQ1GSIc5bXh00ZrT81RTE2BI8hoqb0HxKJmdqXb23lv2MSz/STbUv1zJEerATZDEUsr4jc65Y75IyJTWu+GmIqwdO4fP8jRywSwTAY/pmjZE3Y0G9vJhufcoujdLBEdKF29XciiKA4AukdWmOuVijWett6dxwn4syr6RqrMZ7O2SKJsJzFarmDfEYEfkxRKHtzoBnIZmJO4cqGZiY4+4mHjDIOkoQlMGxw5PpLaDAXeFXRuNrQDWZzLPgahqjeUp2K0G1bMzXf0sP1lGxWoYarmYEUJeNy8i2G0FAwNkOar/76l90G33/Zy143vg/Su1G/bQeHIY0B0/SlqJRmhiZ6XmsvWiUQCi2n1wCW3wSWfTGwehfhn3YOzvGM3K/Lw4x8OwwtA8L79Q0Wcn+cLJHA0tNi6V52gAUfmMommRdutwqj3DABv9unJE5AJlhakd6hCaYPLCOCMNk7YUKwOQygsmOAwp9xoTQNestxp8UHhhQP62fpJjxIjSJ9MSUrqeaBWs9oJoSMK30JjzMOo8TrEKD8lAAdeCeEJzrjCAkE/6Q8g/+UxSxrTzhKoqwNhjN2IMCNk0WMRdt2gk6axBfR/jP+yLZtw8KuApMcWnZ++/INreMIQqq6ZFzMALEE0eutdFA3uO2YOyZZUPDjBxZirfIDtBDskBGeiHjGFjzEewaqsCUQB80etg25573645giQZb1NOPs2jCDbcoxPBqjDH9863QOWueUJaKNcpwBnnBp964koFNCcTuEXLXNShu9lIH6dfvsmgGw12CevYuZZ/f/aZ69D2meZi6SchYtwsKOvszz9c3TDt7aPj2DEiOcUraey5071gNnPyT8BjlyMqeoyDQBPlpVpS+/RloKPd3iI+8ANVTkm885zPaEPMbu+PWjgqkIW1cTqpoojxQvUUXjMcg2QDZ3f65TsT6VvK5bPnI/GoiKD24e55pOuPmA+VZOuHk13mfCPnhX2OtlV9zdt9tEYA5Q/tZyuhS2MojIEpqxbN4xJItWAwS+LpR1q80IGVm2gxru+xZhaFtFaAJFo5gkcTn/hO/euTvfDj3YQlCSgCvVNUfLdKLwHUsgBjFHEcHbPlUPMLxxGXJ3/Hc5UYSyWcm452L7nERRQdDdlKAM+kgJQixxrpOyqdQh96VYbOt9atsocjsYTuQhd1SEDJWkzFexLAh3UJ55HZXU3IZyiYOUbxr1MShNKaxXbuOJgpafJlrHp9rKCUGnt1PMa4j+QUNlxXYuFXMailEf0Bd5R/oi7135Isf9TNj77wr7hrT3nN5/e6r6cvqf3el7u29wjnX65yin70uH93P/cZO0HEnWlBGp6OslgJdpnekXkNYurypk2OGhb8mvLhVUKFcS6WCRobk20WhNBkt3icWmUxLiToY5zJp1cjx52rSfJgV2L3oZeDKTXLfOpCuTSF5D7cDvXYhHTa8BDR6NZCJ8WQ41KuGDEuuS2af/vuijg/u5XiM/B8jJb5E9+yBQtn31ikiZycoDBLsOiPpfVtTonmOOcXK8LTnHG9NbWYv5oxrNgS9P+tocUL0989X3mSgBl9sfahV9lZ+7udf/AQ==7VpZc+I4EP41ftkqUj64/MgRT7Ymu8tOanaOF0pggRWExcoiwPz6bdkStrGAECCZ2QqpClZLsqTur09heb35+gNHi+gPFmJquXa4try+5bquXffgS1I2GaVlNzPClJMwIzk54YH8wIpoK+qShDgpDRSMUUEWZeKYxTEeixINcc5W5WETRsurLtAUVwgPY0Sr1C8kFFFGbTfsnH6HyTTSKzu26pkjPVgRkgiFbFUgebeW1+OMiexpvu5hKpmn+fLY/lJzfT5gvdbHH19mH4ff+3/VspcFp0xx1BkSsdGn0pvnOBYvXuwBrdbJbHrbfhyIu4G9GHzHdTXFfkJ0WVqrsDhnyzjE8iW25XVXERH4YYHGsncFIAJaJOYUWg48JjMsxpEamwjOZls5AAe7ExaLAM0JlfC6w/QJCzJG0IEomcZAG8MJMd/O7THKoNWPWQzrddVmMRd4vSPvI6zJmKoY8wGzORZ8AxPVa2oavwr2Tlu1VzmI/KaiRQUA1TWykALudPvuXBTwoKRxAgw8tyKaz7EggoIoXPsebYBNl4CFefGGARdNCqt0Q/IEj1P5eE/imdxN1gFLFPoMwz/hBUuIYJI55ik7yMMh6LZqMi4iNmUxorc5tVvGZj7mnrGFQuQjFmKjDBVaClbGK3COb76q+Wnjm2zcNHSzvy529jd7oZ3tXm75NGRqOSdsycdqbuPj8vdW32+4zTv0z98s+t4WjzVtThGf4oMvbJmhzjFFgjyVt2eCrZo6YAQ2vlWRraVUKlL3d5CfHUDN2gH/dhtn6EOrAsnuklCpDAOK4gp4khWZA12iZEIo1ZbEcr1JQ/5VbAz0NNOPslMFevY5IPaXmKRM8HtNkuOX+b11sQWT1HAMJsnbFYxBtp/A96J4CrzK12vsrOdX13NM67leeTlEwYLHSOCuVM7kGliom9xWxd5o0miXIKUrgwuk9K3571J69W4PEEykWbX/xKucvJ1+61p+x/J96zawum2rHciXYCSWHPgY/Ga5vYJhyxYpLwzkymYOmE1be8V8LxRPhGFnlz6p20Rz6dnjUbIwtu2IiQlZZ8dWi3PD0V7KhV1ljtBCPpJ5Gv8VLbhUPYghaEfxSkjLv6XeoxGmA+l2CJO9IyYEm0tGyo4uGs+mqQ8pmof0A0PSxTrJIotTpdVHugFHl16nq/bTj4SQAW5HIt0NxmHs3hAIcScEvBO/GcOKcD4kEHxJeqI4U0MrnIA2QNNp+VJPwFTh2hjC8hqrOW77ZhFPTdHRGVZnj3fQr3Gb5UCoXrUCrXbVCGjaxcOgulNV9cC2/MDqtCzfkToJsVq7r4jAxG43DecToQOkdxxpHJWi81IsXjYIWacOvZxXQxukm2+MNu+wYznZIi/pLoUSTenjCVpSaZ9HKpAZcRRL+YD87fNNeNklhPgJU8D0YSNsstdGw54f4+DBsgOl+f6ETJccSf1JnvmeTiqwMnNwIqsMOMbwqjQTGkk8ddF8xFgKnEzIcYQ5kTsQEUm26594IiBW5XfEU4GKiH3pazEOVaSCATJl1rtGaU7CME18GPRMaFqfiICG413t1kBN4XlFh+E3yllBVYFdzxA0tq+VNtfbb5JGron4mieO0PpW6MlzSNnQKeRPkHq2qqmneaD/zNyzbpvB8uzc87ySiW+w3r96BOAdjwDA1yc1FIc1WS7FPEnFEMj8Mghk3xD6hkHWN8zGDDODOCzZ5UKkkB2KcRhaOJCdfiQGwUwROfDcHPiwcXHLKalnyEhtg3HZEi+OsMZrxgcdMDO1MccmR/cs//k5kTKSPhAXAopCRKDctCkiONd1SxMJcylG8XLx7ncvHzq3dyrWnnfTqPrelkE9/GvZ32a1ZH097ehtFWMOEEOUbi6jFTpzNCrFi3ShTxI0SkttKNVoqRPQeFeLa6jFbtW0aVQLU0h6CbU4VLg3aMW+3C6/GauohkbvByICyfB9qduvHvbUj4Y9FGL0LOyRripMJJ+DhiOF5dSdITBoKIcMs3EvKYLsuZQsht4LSDMBJZg/bCMi+zx8H7kVKBdMvGYV3O0rpVtmbFfB3QHgAKJFUgVhfiVzztXw4csZ43XOngugq4mp5R6/vHFNoevBy5vzJFUNXQechctxqti/vL1wjqdJEC9EmNckH906/AONncHb9pmGcyF6Wvn0gHbtRVnTKYPsFaun5u1Wr2gHHEPuj1GC3yH2P4CYvo15M4TVKzB6xeqefi7U6fZW904QrfXS8p2ubh0r3+m8rFi+O+AjXqF8Z179TUq3P5Og9PXTcUGd+xufPYKCZv4Lx+zXGvnvRL3b/wA=7Vxfc+I2EP80fukMGVvGYB4hhGtncm166c21fckILIwaYXG2COE+fVe2bGwk/gQwXO4gD+CVbEm7+9tdrdax3Nvp64cYzyYfeUCYhezg1XL7FkLIQzZ8Scoyo3R8PyOEMQ0ykrMiPNJvRBHVfeGcBiSpdBScM0FnVeKIRxEZiQoNxzFfVLuNOauOOsMh0QiPI8x06hcaiElG9T17Rf+V0HCSj+zYqmWK886KkExwwBclkntnubcx5yL7NX29JUwyL+fLvT+cx9/+/aM1Cr+FjP+GPn7+2sgeNnjLLWoJL5jN1aI+R4IKRgKg3uMlidUExTJfNeOjZyKf6VhuT91OEzrM24vVxyQSp50t0marzS6M+XymupFYkFeTJuA3T9YphALaTPiUiHgJ96mnu031HKXIqK2uFyu1cHO1mJRUws1VGStVDItnr3gDPxR73sAqdzergFNRkErSBkkuJlSQxxkeydYFABZoEzFlStCJiPlzoeaooNxyxmOgRDwiK33QOb+Tw8jM4ctxsKlx8OPyAxFyLTF9wYJIk0EkUNb4CmCeyZ90mtqPMhclYygYkC6jYQQ0wWcl6j0eEvbAEyool61DLgSfQgcmG3p49BymMst5biF3nH6gSzpYN5lldk4KFOcXY/oqpdxT8+lPhJAGsivZgwajIGreUADGmII2xDcjGBENAiwwfEl6At+MhzxpDGMcBUnDAwIC7gyieUhEw0H+zSwK6xB+7ilQFV6O42jw6vi6buS0k6uGp8mcBOAZ1CWPxQT4FWF2t6L2qmhb9bnnUgdS7fiPCLFUbg7PBd+FwGwWcugDuA3T5/N4RLb0aymfimOQ8y6k6NKLCcOCvlQnd3JZtDSYzmICQxOckPcPTbQTmmMeiQZekAT4CZdOuyMZOqaMNEYQcTV4AdCa0OlVwdnSXV/bgM12Xdhs/xzY9N8DNn0DNnkwH6UgumLz7Nh0/AuDs6MpRJ/MGF9O5SKR/RDz/yTzNdVY0CnDaYAJzGNlQXryT4tGoaWVfuQdIIQSPftswWwN8Ytz41X3B7oYHNfT5VDsI04uiDxqLjF5z6Vu37bZXz99+aPfcF8+LT6E/Zb3p0cm6pYT7kWeiRhNVF9djFLgAzylTHL7V8JeiDQTEtrKfIxghbCxPfkWxrG3qkHB9C1o7LQMe5wWqk0N9t3/17Gbd0zb+RaDUXoBfYGfofx5TyOZblAN0sau2gzdP5GZ9ARcMsd8y/mjA+BcvPxb3Z9e/CMvbrz8sv9abuwvN6r2oVFFLuedYQXaN+Z33CMDC3XrA6ep6c+hZlcx0uysqX62AnXXmvYX0zgCEHrepDenTKLhATzQ+/NMzvbMldNZy1w5uk3yHINN8lpbbJIa7pNMtUUhI6Xx1iIS1DG4QtN4yK0OhxmY8AgL0pPoTGrRBT0DZA1sqzOwum2r41h3yAIL7vcVEWK7Xi/VDhzSPKS7xrd5cqjilW8BxVT6Fvt3slCNuRF2jlD2DUYpf0xu3XLlu/Re1fH28YA5abhOkFyTSUisTHrr61weGPSq3C3Ixe2guJ2u1elYdwOr51v+IM1kYjGPpRR/sdBtyXdmg1QHBrI2mS2e2c4Dr9VcGBkLw8xOvVLUwlMJpWiYzIzX9oQLAEK2bDV4bFjaoVy42oCyDdAC8LNB3WleGuqti0Ser1T8vYo14eqfUssq7JQXedR5aLR6cGzq7hmbOu09Y1O0YTt+nqRXPs03hg1TnAjDaetPbjEqW/3vMIRwDSe957Ureo71ON87Z+sURnNKn4zxnElPPFSbInkkKOUD8rePd9ZV5x+QF8JAp7e7W5NnNrrw1TK2LixbUFoqMKbhPMYSP8mez+mmAqsyh8DNdkgiAo9K0ypDqU89PB1ynipOJuRoQmIqZyAmNCnGf+OKgKjLb0dMAhAR2jZV5cLKe1pFKhkgU5pu3ShNaRCkvoxDy5ilRS4ToJFoHd25oqbqWWNo0KnmYg2BAXING1C/thxc50ePDE6Yx9o3VsgzprvzWN4lYwW0R2r83UUA7u4IAHx90sBR0JA1dyROGhKFA1dycyDbnqDtaZC1PWV9njKD+FSxy6VIIVsUj6FraUF2+pE6CGZKZmWOzqdtNy5rlSquIbtlG4xLQTy9hukZ/vrigy6YmcYoJiZHt5f//JykmTPwgaQUUJQiAuWmTRHBsa5bmki4lxEczWdXv3v60NlfO/5y3fxYtOx72wZ4dGqzv4YjqD32akV5kcwavXdzXfOGbbUn27GB49JCC9ni23XqIbKb1QCw6V92C4dMtbp1mejbwjpPwc5hxpanMc3FqYfRNB9kkfs0SQu1gQEl2wzfV/N8BvOMPKN5Nm2N6jPPhhO4d4eMPLFXFzAaV1jUCYu1A3K39R3AYsex4RUWV1jUDAvU2h1EoTxXfh5Q6C8C5LLblJBe1QZqyMiV9wMVA8nvTfnm9x787/vqj8zVqNd/QIADT9buDZym8wQMepJdnrJ+h5zcbCjLLOcLZySmoCYkfizSOEfuEXaURVVPeZqensfxz5kjRvqZYhcUBzRaJLoSrmrSjimO3V6dZqxn21ABV5uY2mvpNlP1GjLl27ZWrx0nqc3ncYWDe9y2V3rvFsXZnU6AgGJCYlk0n71HCJh+hqdtMh7HKPHhqpdBbqPqtZyq5l26lAzpr1Y8/EDv2nxfWnWiWoO3qdjFSw1c/bDqc/evq279ALrV1F+oPq9qOZoaXeStzY1isg49sN77xQuVBN5d3OabBXueA2tXP58+Y7FC/rtUdrCxWOG7Em5zX+F2Lipc92dHobPva9Xuhlf9jhUUXK7+60/aVvrfSe7d/w==7Vrbcto6FP0aZk4fyIAMBh65hDYzvaRD2zTn5Yywha1GWB5Z3Pr13bIlXxCTQgMJ6cGZAWlZW7e1try3Q80ZztdvBY7DD9wnrIYa/rrmjGoIdZ02fCpgkwGtXisDAkH9DGoWwIT+JBpsaHRBfZJUGkrOmaRxFfR4FBFPVjAsBF9Vm804q44a44BYwMTDzEbvqC9Dvax2o8DfERqEZuRmQ9+ZY9NYA0mIfb4qQc51zRkKzmVWmq+HhKm9y/dl/F8/ZB+XHz6Rqf/zG719Rx/qWWfjQ0yaKJvAErOFXtUUew++4LGemdyY5ZpVCRLJP57Fvd+eteg9cb/eff7cIZ8e8L832qQ8CWtwwReRT1QnjZozWIVUkkmMPXV3BeICLJRzBrUmFBMp+EPOCcqRIWdcABLxCAwHey4o3yMiJFmXqNcrfEv4nEixgSbmbkuvyAjbEL8qZOIaFYcliTgdDWItzSDvu9hTKOhtPYTo09C508RxLT5HJGZ8M1dDocat4D+UP27PKFnROcMpNTPKmGGrhpxZW/1ZPMIdN72UBY9kCc+unVrYl/aDWXe3WEc26+3ODtZzw6Oz7nQsJqSgQUBEYu0+8eFw01UuZMgDHmF2XaCDqg8Wbd5zOC0yz/tBpNzokxovJK/6JVlT+b1UvlddXbV1bbTWPaeVjalEsBHfy5WSlaoWZmnN2Nm8+zgJ09mnRwQcHjQKvmQzdw+WRcIXwiOPbb12MIlFQB7r0DwF1f4/KjNBGJZ0WX34HF8y3ZdQxlO99Hh0oN550dF7SUctnPO+dGe3o56ewva+HtU4KwpNMPD3U/h75+oemxltestpGlqsTRzlVh7FbeNGpotMbNpqi998Gk+g3A63/reUd56HcmQO7hei3My4FGrFEMzacdYJ4247mYsF9xeepDwCvG9H3CGOVZHO01S3LCYV91LIdfuMBhFgUokwR9/jKWG3PKFp185oyqXkc2jA1I0BpJBBKudyDJ9e0CQdrJ/EWUquRIhNZUbXygEGej6jUEqVy/fVRqCx50foikI2P6PgKOLKgxHR2McSw5fCYbPHKg+o4xVJgFGoNjs9tY2QT5C6x31S55DPda/iKNiTB3RwHtDqOtU8wG1aeUCna6cBBjt+DNF+XBeDiy6eQxeu0zgvXbTs8yKROKBmDy6COK0gHJOen40gHEsQX/tfLmJ4DjE0e2d2OiD7LV5CxHLXq6PThTTIfoFVQy6T6nUOXUIxUMWbmwm0uSNT+JykczSNFNNFux2m/4DA3xh8KrZbbtu/dk9o/dYTSJIAixSzOo5jFeWPmyCEcUZ9fUWm9ZAnEp4R9URyAcPUVQe5ezwho8gFt7/PdKs+k79TL/lMb4fP9E7mM91Ty1U/oC+SfaWSdVDnzCTbO7Vky7nGUKWhF/G+UvG2Os55idfZ9Z/jk4p3cBHvKxWvi54tWIBq8duN7AVj8QMY5/oX \ No newline at end of file diff --git a/content/.obsidian/app.json b/content/.obsidian/app.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/content/.obsidian/app.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/content/.obsidian/appearance.json b/content/.obsidian/appearance.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/content/.obsidian/appearance.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/content/.obsidian/community-plugins.json b/content/.obsidian/community-plugins.json new file mode 100644 index 00000000..d3f66fab --- /dev/null +++ b/content/.obsidian/community-plugins.json @@ -0,0 +1,3 @@ +[ + "obsidian-git" +] \ No newline at end of file diff --git a/content/.obsidian/core-plugins.json b/content/.obsidian/core-plugins.json new file mode 100644 index 00000000..c89a841a --- /dev/null +++ b/content/.obsidian/core-plugins.json @@ -0,0 +1,31 @@ +{ + "file-explorer": true, + "global-search": true, + "switcher": true, + "graph": true, + "backlink": true, + "canvas": true, + "outgoing-link": true, + "tag-pane": true, + "properties": false, + "page-preview": true, + "daily-notes": true, + "templates": true, + "note-composer": true, + "command-palette": true, + "slash-command": false, + "editor-status": true, + "bookmarks": true, + "markdown-importer": false, + "zk-prefixer": false, + "random-note": false, + "outline": true, + "word-count": true, + "slides": false, + "audio-recorder": false, + "workspaces": false, + "file-recovery": true, + "publish": false, + "sync": false, + "webviewer": false +} \ No newline at end of file diff --git a/content/.obsidian/plugins/obsidian-git/main.js b/content/.obsidian/plugins/obsidian-git/main.js new file mode 100644 index 00000000..b780486b --- /dev/null +++ b/content/.obsidian/plugins/obsidian-git/main.js @@ -0,0 +1,418 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source visit the plugins github repository (https://github.com/denolehov/obsidian-git) +*/ + +var WP=Object.create;var $o=Object.defineProperty;var qP=Object.getOwnPropertyDescriptor;var YP=Object.getOwnPropertyNames;var XP=Object.getPrototypeOf,ZP=Object.prototype.hasOwnProperty;var Uv=e=>{throw TypeError(e)};var KP=(e,t,r)=>t in e?$o(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var JP=(e,t)=>()=>(e&&(t=e(e=0)),t);var F=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),QP=(e,t)=>{for(var r in t)$o(e,r,{get:t[r],enumerable:!0})},Gv=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of YP(t))!ZP.call(e,i)&&i!==r&&$o(e,i,{get:()=>t[i],enumerable:!(n=qP(t,i))||n.enumerable});return e};var ze=(e,t,r)=>(r=e!=null?WP(XP(e)):{},Gv(t||!e||!e.__esModule?$o(r,"default",{value:e,enumerable:!0}):r,e)),eR=e=>Gv($o({},"__esModule",{value:!0}),e);var Pr=(e,t,r)=>KP(e,typeof t!="symbol"?t+"":t,r),zv=(e,t,r)=>t.has(e)||Uv("Cannot "+r);var Ht=(e,t,r)=>(zv(e,t,"read from private field"),r?r.call(e):t.get(e)),Tc=(e,t,r)=>t.has(e)?Uv("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,r),Cc=(e,t,r,n)=>(zv(e,t,"write to private field"),n?n.call(e,r):t.set(e,r),r);var qv=F(Pc=>{"use strict";g();Pc.byteLength=rR;Pc.toByteArray=iR;Pc.fromByteArray=oR;var hn=[],Rr=[],tR=typeof Uint8Array!="undefined"?Uint8Array:Array,eh="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";for(Ki=0,Vv=eh.length;Ki0)throw new Error("Invalid string. Length must be a multiple of 4");var r=e.indexOf("=");r===-1&&(r=t);var n=r===t?0:4-r%4;return[r,n]}function rR(e){var t=Wv(e),r=t[0],n=t[1];return(r+n)*3/4-n}function nR(e,t,r){return(t+r)*3/4-r}function iR(e){var t,r=Wv(e),n=r[0],i=r[1],a=new tR(nR(e,n,i)),s=0,o=i>0?n-4:n,l;for(l=0;l>16&255,a[s++]=t>>8&255,a[s++]=t&255;return i===2&&(t=Rr[e.charCodeAt(l)]<<2|Rr[e.charCodeAt(l+1)]>>4,a[s++]=t&255),i===1&&(t=Rr[e.charCodeAt(l)]<<10|Rr[e.charCodeAt(l+1)]<<4|Rr[e.charCodeAt(l+2)]>>2,a[s++]=t>>8&255,a[s++]=t&255),a}function aR(e){return hn[e>>18&63]+hn[e>>12&63]+hn[e>>6&63]+hn[e&63]}function sR(e,t,r){for(var n,i=[],a=t;ao?o:s+a));return n===1?(t=e[r-1],i.push(hn[t>>2]+hn[t<<4&63]+"==")):n===2&&(t=(e[r-2]<<8)+e[r-1],i.push(hn[t>>10]+hn[t>>4&63]+hn[t<<2&63]+"=")),i.join("")}});var Yv=F(th=>{g();th.read=function(e,t,r,n,i){var a,s,o=i*8-n-1,l=(1<>1,u=-7,f=r?i-1:0,d=r?-1:1,h=e[t+f];for(f+=d,a=h&(1<<-u)-1,h>>=-u,u+=o;u>0;a=a*256+e[t+f],f+=d,u-=8);for(s=a&(1<<-u)-1,a>>=-u,u+=n;u>0;s=s*256+e[t+f],f+=d,u-=8);if(a===0)a=1-c;else{if(a===l)return s?NaN:(h?-1:1)*(1/0);s=s+Math.pow(2,n),a=a-c}return(h?-1:1)*s*Math.pow(2,a-n)};th.write=function(e,t,r,n,i,a){var s,o,l,c=a*8-i-1,u=(1<>1,d=i===23?Math.pow(2,-24)-Math.pow(2,-77):0,h=n?0:a-1,p=n?1:-1,m=t<0||t===0&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(o=isNaN(t)?1:0,s=u):(s=Math.floor(Math.log(t)/Math.LN2),t*(l=Math.pow(2,-s))<1&&(s--,l*=2),s+f>=1?t+=d/l:t+=d*Math.pow(2,1-f),t*l>=2&&(s++,l/=2),s+f>=u?(o=0,s=u):s+f>=1?(o=(t*l-1)*Math.pow(2,i),s=s+f):(o=t*Math.pow(2,f-1)*Math.pow(2,i),s=0));i>=8;e[r+h]=o&255,h+=p,o/=256,i-=8);for(s=s<0;e[r+h]=s&255,h+=p,s/=256,c-=8);e[r+h-p]|=m*128}});var uh=F(Qa=>{"use strict";g();var rh=qv(),Ka=Yv(),Xv=typeof Symbol=="function"&&typeof Symbol.for=="function"?Symbol.for("nodejs.util.inspect.custom"):null;Qa.Buffer=M;Qa.SlowBuffer=hR;Qa.INSPECT_MAX_BYTES=50;var Rc=2147483647;Qa.kMaxLength=Rc;M.TYPED_ARRAY_SUPPORT=lR();!M.TYPED_ARRAY_SUPPORT&&typeof console!="undefined"&&typeof console.error=="function"&&console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support.");function lR(){try{let e=new Uint8Array(1),t={foo:function(){return 42}};return Object.setPrototypeOf(t,Uint8Array.prototype),Object.setPrototypeOf(e,t),e.foo()===42}catch(e){return!1}}Object.defineProperty(M.prototype,"parent",{enumerable:!0,get:function(){if(M.isBuffer(this))return this.buffer}});Object.defineProperty(M.prototype,"offset",{enumerable:!0,get:function(){if(M.isBuffer(this))return this.byteOffset}});function Nn(e){if(e>Rc)throw new RangeError('The value "'+e+'" is invalid for option "size"');let t=new Uint8Array(e);return Object.setPrototypeOf(t,M.prototype),t}function M(e,t,r){if(typeof e=="number"){if(typeof t=="string")throw new TypeError('The "string" argument must be of type string. Received type number');return sh(e)}return Qv(e,t,r)}M.poolSize=8192;function Qv(e,t,r){if(typeof e=="string")return uR(e,t);if(ArrayBuffer.isView(e))return fR(e);if(e==null)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof e);if(pn(e,ArrayBuffer)||e&&pn(e.buffer,ArrayBuffer)||typeof SharedArrayBuffer!="undefined"&&(pn(e,SharedArrayBuffer)||e&&pn(e.buffer,SharedArrayBuffer)))return ih(e,t,r);if(typeof e=="number")throw new TypeError('The "value" argument must not be of type number. Received type number');let n=e.valueOf&&e.valueOf();if(n!=null&&n!==e)return M.from(n,t,r);let i=dR(e);if(i)return i;if(typeof Symbol!="undefined"&&Symbol.toPrimitive!=null&&typeof e[Symbol.toPrimitive]=="function")return M.from(e[Symbol.toPrimitive]("string"),t,r);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof e)}M.from=function(e,t,r){return Qv(e,t,r)};Object.setPrototypeOf(M.prototype,Uint8Array.prototype);Object.setPrototypeOf(M,Uint8Array);function e1(e){if(typeof e!="number")throw new TypeError('"size" argument must be of type number');if(e<0)throw new RangeError('The value "'+e+'" is invalid for option "size"')}function cR(e,t,r){return e1(e),e<=0?Nn(e):t!==void 0?typeof r=="string"?Nn(e).fill(t,r):Nn(e).fill(t):Nn(e)}M.alloc=function(e,t,r){return cR(e,t,r)};function sh(e){return e1(e),Nn(e<0?0:oh(e)|0)}M.allocUnsafe=function(e){return sh(e)};M.allocUnsafeSlow=function(e){return sh(e)};function uR(e,t){if((typeof t!="string"||t==="")&&(t="utf8"),!M.isEncoding(t))throw new TypeError("Unknown encoding: "+t);let r=t1(e,t)|0,n=Nn(r),i=n.write(e,t);return i!==r&&(n=n.slice(0,i)),n}function nh(e){let t=e.length<0?0:oh(e.length)|0,r=Nn(t);for(let n=0;n=Rc)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+Rc.toString(16)+" bytes");return e|0}function hR(e){return+e!=e&&(e=0),M.alloc(+e)}M.isBuffer=function(t){return t!=null&&t._isBuffer===!0&&t!==M.prototype};M.compare=function(t,r){if(pn(t,Uint8Array)&&(t=M.from(t,t.offset,t.byteLength)),pn(r,Uint8Array)&&(r=M.from(r,r.offset,r.byteLength)),!M.isBuffer(t)||!M.isBuffer(r))throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');if(t===r)return 0;let n=t.length,i=r.length;for(let a=0,s=Math.min(n,i);ai.length?(M.isBuffer(s)||(s=M.from(s)),s.copy(i,a)):Uint8Array.prototype.set.call(i,s,a);else if(M.isBuffer(s))s.copy(i,a);else throw new TypeError('"list" argument must be an Array of Buffers');a+=s.length}return i};function t1(e,t){if(M.isBuffer(e))return e.length;if(ArrayBuffer.isView(e)||pn(e,ArrayBuffer))return e.byteLength;if(typeof e!="string")throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof e);let r=e.length,n=arguments.length>2&&arguments[2]===!0;if(!n&&r===0)return 0;let i=!1;for(;;)switch(t){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":return ah(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return r*2;case"hex":return r>>>1;case"base64":return u1(e).length;default:if(i)return n?-1:ah(e).length;t=(""+t).toLowerCase(),i=!0}}M.byteLength=t1;function pR(e,t,r){let n=!1;if((t===void 0||t<0)&&(t=0),t>this.length||((r===void 0||r>this.length)&&(r=this.length),r<=0)||(r>>>=0,t>>>=0,r<=t))return"";for(e||(e="utf8");;)switch(e){case"hex":return ER(this,t,r);case"utf8":case"utf-8":return n1(this,t,r);case"ascii":return xR(this,t,r);case"latin1":case"binary":return SR(this,t,r);case"base64":return bR(this,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return AR(this,t,r);default:if(n)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),n=!0}}M.prototype._isBuffer=!0;function Ji(e,t,r){let n=e[t];e[t]=e[r],e[r]=n}M.prototype.swap16=function(){let t=this.length;if(t%2!==0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let r=0;rr&&(t+=" ... "),""};Xv&&(M.prototype[Xv]=M.prototype.inspect);M.prototype.compare=function(t,r,n,i,a){if(pn(t,Uint8Array)&&(t=M.from(t,t.offset,t.byteLength)),!M.isBuffer(t))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof t);if(r===void 0&&(r=0),n===void 0&&(n=t?t.length:0),i===void 0&&(i=0),a===void 0&&(a=this.length),r<0||n>t.length||i<0||a>this.length)throw new RangeError("out of range index");if(i>=a&&r>=n)return 0;if(i>=a)return-1;if(r>=n)return 1;if(r>>>=0,n>>>=0,i>>>=0,a>>>=0,this===t)return 0;let s=a-i,o=n-r,l=Math.min(s,o),c=this.slice(i,a),u=t.slice(r,n);for(let f=0;f2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,ch(r)&&(r=i?0:e.length-1),r<0&&(r=e.length+r),r>=e.length){if(i)return-1;r=e.length-1}else if(r<0)if(i)r=0;else return-1;if(typeof t=="string"&&(t=M.from(t,n)),M.isBuffer(t))return t.length===0?-1:Zv(e,t,r,n,i);if(typeof t=="number")return t=t&255,typeof Uint8Array.prototype.indexOf=="function"?i?Uint8Array.prototype.indexOf.call(e,t,r):Uint8Array.prototype.lastIndexOf.call(e,t,r):Zv(e,[t],r,n,i);throw new TypeError("val must be string, number or Buffer")}function Zv(e,t,r,n,i){let a=1,s=e.length,o=t.length;if(n!==void 0&&(n=String(n).toLowerCase(),n==="ucs2"||n==="ucs-2"||n==="utf16le"||n==="utf-16le")){if(e.length<2||t.length<2)return-1;a=2,s/=2,o/=2,r/=2}function l(u,f){return a===1?u[f]:u.readUInt16BE(f*a)}let c;if(i){let u=-1;for(c=r;cs&&(r=s-o),c=r;c>=0;c--){let u=!0;for(let f=0;fi&&(n=i)):n=i;let a=t.length;n>a/2&&(n=a/2);let s;for(s=0;s>>0,isFinite(n)?(n=n>>>0,i===void 0&&(i="utf8")):(i=n,n=void 0);else throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");let a=this.length-r;if((n===void 0||n>a)&&(n=a),t.length>0&&(n<0||r<0)||r>this.length)throw new RangeError("Attempt to write outside buffer bounds");i||(i="utf8");let s=!1;for(;;)switch(i){case"hex":return mR(this,t,r,n);case"utf8":case"utf-8":return gR(this,t,r,n);case"ascii":case"latin1":case"binary":return vR(this,t,r,n);case"base64":return yR(this,t,r,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return wR(this,t,r,n);default:if(s)throw new TypeError("Unknown encoding: "+i);i=(""+i).toLowerCase(),s=!0}};M.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function bR(e,t,r){return t===0&&r===e.length?rh.fromByteArray(e):rh.fromByteArray(e.slice(t,r))}function n1(e,t,r){r=Math.min(e.length,r);let n=[],i=t;for(;i239?4:a>223?3:a>191?2:1;if(i+o<=r){let l,c,u,f;switch(o){case 1:a<128&&(s=a);break;case 2:l=e[i+1],(l&192)===128&&(f=(a&31)<<6|l&63,f>127&&(s=f));break;case 3:l=e[i+1],c=e[i+2],(l&192)===128&&(c&192)===128&&(f=(a&15)<<12|(l&63)<<6|c&63,f>2047&&(f<55296||f>57343)&&(s=f));break;case 4:l=e[i+1],c=e[i+2],u=e[i+3],(l&192)===128&&(c&192)===128&&(u&192)===128&&(f=(a&15)<<18|(l&63)<<12|(c&63)<<6|u&63,f>65535&&f<1114112&&(s=f))}}s===null?(s=65533,o=1):s>65535&&(s-=65536,n.push(s>>>10&1023|55296),s=56320|s&1023),n.push(s),i+=o}return _R(n)}var Kv=4096;function _R(e){let t=e.length;if(t<=Kv)return String.fromCharCode.apply(String,e);let r="",n=0;for(;nn)&&(r=n);let i="";for(let a=t;an&&(t=n),r<0?(r+=n,r<0&&(r=0)):r>n&&(r=n),rr)throw new RangeError("Trying to access beyond buffer length")}M.prototype.readUintLE=M.prototype.readUIntLE=function(t,r,n){t=t>>>0,r=r>>>0,n||_t(t,r,this.length);let i=this[t],a=1,s=0;for(;++s>>0,r=r>>>0,n||_t(t,r,this.length);let i=this[t+--r],a=1;for(;r>0&&(a*=256);)i+=this[t+--r]*a;return i};M.prototype.readUint8=M.prototype.readUInt8=function(t,r){return t=t>>>0,r||_t(t,1,this.length),this[t]};M.prototype.readUint16LE=M.prototype.readUInt16LE=function(t,r){return t=t>>>0,r||_t(t,2,this.length),this[t]|this[t+1]<<8};M.prototype.readUint16BE=M.prototype.readUInt16BE=function(t,r){return t=t>>>0,r||_t(t,2,this.length),this[t]<<8|this[t+1]};M.prototype.readUint32LE=M.prototype.readUInt32LE=function(t,r){return t=t>>>0,r||_t(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+this[t+3]*16777216};M.prototype.readUint32BE=M.prototype.readUInt32BE=function(t,r){return t=t>>>0,r||_t(t,4,this.length),this[t]*16777216+(this[t+1]<<16|this[t+2]<<8|this[t+3])};M.prototype.readBigUInt64LE=fi(function(t){t=t>>>0,Ja(t,"offset");let r=this[t],n=this[t+7];(r===void 0||n===void 0)&&Lo(t,this.length-8);let i=r+this[++t]*2**8+this[++t]*2**16+this[++t]*2**24,a=this[++t]+this[++t]*2**8+this[++t]*2**16+n*2**24;return BigInt(i)+(BigInt(a)<>>0,Ja(t,"offset");let r=this[t],n=this[t+7];(r===void 0||n===void 0)&&Lo(t,this.length-8);let i=r*2**24+this[++t]*2**16+this[++t]*2**8+this[++t],a=this[++t]*2**24+this[++t]*2**16+this[++t]*2**8+n;return(BigInt(i)<>>0,r=r>>>0,n||_t(t,r,this.length);let i=this[t],a=1,s=0;for(;++s=a&&(i-=Math.pow(2,8*r)),i};M.prototype.readIntBE=function(t,r,n){t=t>>>0,r=r>>>0,n||_t(t,r,this.length);let i=r,a=1,s=this[t+--i];for(;i>0&&(a*=256);)s+=this[t+--i]*a;return a*=128,s>=a&&(s-=Math.pow(2,8*r)),s};M.prototype.readInt8=function(t,r){return t=t>>>0,r||_t(t,1,this.length),this[t]&128?(255-this[t]+1)*-1:this[t]};M.prototype.readInt16LE=function(t,r){t=t>>>0,r||_t(t,2,this.length);let n=this[t]|this[t+1]<<8;return n&32768?n|4294901760:n};M.prototype.readInt16BE=function(t,r){t=t>>>0,r||_t(t,2,this.length);let n=this[t+1]|this[t]<<8;return n&32768?n|4294901760:n};M.prototype.readInt32LE=function(t,r){return t=t>>>0,r||_t(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24};M.prototype.readInt32BE=function(t,r){return t=t>>>0,r||_t(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]};M.prototype.readBigInt64LE=fi(function(t){t=t>>>0,Ja(t,"offset");let r=this[t],n=this[t+7];(r===void 0||n===void 0)&&Lo(t,this.length-8);let i=this[t+4]+this[t+5]*2**8+this[t+6]*2**16+(n<<24);return(BigInt(i)<>>0,Ja(t,"offset");let r=this[t],n=this[t+7];(r===void 0||n===void 0)&&Lo(t,this.length-8);let i=(r<<24)+this[++t]*2**16+this[++t]*2**8+this[++t];return(BigInt(i)<>>0,r||_t(t,4,this.length),Ka.read(this,t,!0,23,4)};M.prototype.readFloatBE=function(t,r){return t=t>>>0,r||_t(t,4,this.length),Ka.read(this,t,!1,23,4)};M.prototype.readDoubleLE=function(t,r){return t=t>>>0,r||_t(t,8,this.length),Ka.read(this,t,!0,52,8)};M.prototype.readDoubleBE=function(t,r){return t=t>>>0,r||_t(t,8,this.length),Ka.read(this,t,!1,52,8)};function Jt(e,t,r,n,i,a){if(!M.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>i||te.length)throw new RangeError("Index out of range")}M.prototype.writeUintLE=M.prototype.writeUIntLE=function(t,r,n,i){if(t=+t,r=r>>>0,n=n>>>0,!i){let o=Math.pow(2,8*n)-1;Jt(this,t,r,n,o,0)}let a=1,s=0;for(this[r]=t&255;++s>>0,n=n>>>0,!i){let o=Math.pow(2,8*n)-1;Jt(this,t,r,n,o,0)}let a=n-1,s=1;for(this[r+a]=t&255;--a>=0&&(s*=256);)this[r+a]=t/s&255;return r+n};M.prototype.writeUint8=M.prototype.writeUInt8=function(t,r,n){return t=+t,r=r>>>0,n||Jt(this,t,r,1,255,0),this[r]=t&255,r+1};M.prototype.writeUint16LE=M.prototype.writeUInt16LE=function(t,r,n){return t=+t,r=r>>>0,n||Jt(this,t,r,2,65535,0),this[r]=t&255,this[r+1]=t>>>8,r+2};M.prototype.writeUint16BE=M.prototype.writeUInt16BE=function(t,r,n){return t=+t,r=r>>>0,n||Jt(this,t,r,2,65535,0),this[r]=t>>>8,this[r+1]=t&255,r+2};M.prototype.writeUint32LE=M.prototype.writeUInt32LE=function(t,r,n){return t=+t,r=r>>>0,n||Jt(this,t,r,4,4294967295,0),this[r+3]=t>>>24,this[r+2]=t>>>16,this[r+1]=t>>>8,this[r]=t&255,r+4};M.prototype.writeUint32BE=M.prototype.writeUInt32BE=function(t,r,n){return t=+t,r=r>>>0,n||Jt(this,t,r,4,4294967295,0),this[r]=t>>>24,this[r+1]=t>>>16,this[r+2]=t>>>8,this[r+3]=t&255,r+4};function i1(e,t,r,n,i){c1(t,n,i,e,r,7);let a=Number(t&BigInt(4294967295));e[r++]=a,a=a>>8,e[r++]=a,a=a>>8,e[r++]=a,a=a>>8,e[r++]=a;let s=Number(t>>BigInt(32)&BigInt(4294967295));return e[r++]=s,s=s>>8,e[r++]=s,s=s>>8,e[r++]=s,s=s>>8,e[r++]=s,r}function a1(e,t,r,n,i){c1(t,n,i,e,r,7);let a=Number(t&BigInt(4294967295));e[r+7]=a,a=a>>8,e[r+6]=a,a=a>>8,e[r+5]=a,a=a>>8,e[r+4]=a;let s=Number(t>>BigInt(32)&BigInt(4294967295));return e[r+3]=s,s=s>>8,e[r+2]=s,s=s>>8,e[r+1]=s,s=s>>8,e[r]=s,r+8}M.prototype.writeBigUInt64LE=fi(function(t,r=0){return i1(this,t,r,BigInt(0),BigInt("0xffffffffffffffff"))});M.prototype.writeBigUInt64BE=fi(function(t,r=0){return a1(this,t,r,BigInt(0),BigInt("0xffffffffffffffff"))});M.prototype.writeIntLE=function(t,r,n,i){if(t=+t,r=r>>>0,!i){let l=Math.pow(2,8*n-1);Jt(this,t,r,n,l-1,-l)}let a=0,s=1,o=0;for(this[r]=t&255;++a>0)-o&255;return r+n};M.prototype.writeIntBE=function(t,r,n,i){if(t=+t,r=r>>>0,!i){let l=Math.pow(2,8*n-1);Jt(this,t,r,n,l-1,-l)}let a=n-1,s=1,o=0;for(this[r+a]=t&255;--a>=0&&(s*=256);)t<0&&o===0&&this[r+a+1]!==0&&(o=1),this[r+a]=(t/s>>0)-o&255;return r+n};M.prototype.writeInt8=function(t,r,n){return t=+t,r=r>>>0,n||Jt(this,t,r,1,127,-128),t<0&&(t=255+t+1),this[r]=t&255,r+1};M.prototype.writeInt16LE=function(t,r,n){return t=+t,r=r>>>0,n||Jt(this,t,r,2,32767,-32768),this[r]=t&255,this[r+1]=t>>>8,r+2};M.prototype.writeInt16BE=function(t,r,n){return t=+t,r=r>>>0,n||Jt(this,t,r,2,32767,-32768),this[r]=t>>>8,this[r+1]=t&255,r+2};M.prototype.writeInt32LE=function(t,r,n){return t=+t,r=r>>>0,n||Jt(this,t,r,4,2147483647,-2147483648),this[r]=t&255,this[r+1]=t>>>8,this[r+2]=t>>>16,this[r+3]=t>>>24,r+4};M.prototype.writeInt32BE=function(t,r,n){return t=+t,r=r>>>0,n||Jt(this,t,r,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[r]=t>>>24,this[r+1]=t>>>16,this[r+2]=t>>>8,this[r+3]=t&255,r+4};M.prototype.writeBigInt64LE=fi(function(t,r=0){return i1(this,t,r,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))});M.prototype.writeBigInt64BE=fi(function(t,r=0){return a1(this,t,r,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))});function s1(e,t,r,n,i,a){if(r+n>e.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function o1(e,t,r,n,i){return t=+t,r=r>>>0,i||s1(e,t,r,4,34028234663852886e22,-34028234663852886e22),Ka.write(e,t,r,n,23,4),r+4}M.prototype.writeFloatLE=function(t,r,n){return o1(this,t,r,!0,n)};M.prototype.writeFloatBE=function(t,r,n){return o1(this,t,r,!1,n)};function l1(e,t,r,n,i){return t=+t,r=r>>>0,i||s1(e,t,r,8,17976931348623157e292,-17976931348623157e292),Ka.write(e,t,r,n,52,8),r+8}M.prototype.writeDoubleLE=function(t,r,n){return l1(this,t,r,!0,n)};M.prototype.writeDoubleBE=function(t,r,n){return l1(this,t,r,!1,n)};M.prototype.copy=function(t,r,n,i){if(!M.isBuffer(t))throw new TypeError("argument should be a Buffer");if(n||(n=0),!i&&i!==0&&(i=this.length),r>=t.length&&(r=t.length),r||(r=0),i>0&&i=this.length)throw new RangeError("Index out of range");if(i<0)throw new RangeError("sourceEnd out of bounds");i>this.length&&(i=this.length),t.length-r>>0,n=n===void 0?this.length:n>>>0,t||(t=0);let a;if(typeof t=="number")for(a=r;a2**32?i=Jv(String(r)):typeof r=="bigint"&&(i=String(r),(r>BigInt(2)**BigInt(32)||r<-(BigInt(2)**BigInt(32)))&&(i=Jv(i)),i+="n"),n+=` It must be ${t}. Received ${i}`,n},RangeError);function Jv(e){let t="",r=e.length,n=e[0]==="-"?1:0;for(;r>=n+4;r-=3)t=`_${e.slice(r-3,r)}${t}`;return`${e.slice(0,r)}${t}`}function kR(e,t,r){Ja(t,"offset"),(e[t]===void 0||e[t+r]===void 0)&&Lo(t,e.length-(r+1))}function c1(e,t,r,n,i,a){if(e>r||e3?t===0||t===BigInt(0)?o=`>= 0${s} and < 2${s} ** ${(a+1)*8}${s}`:o=`>= -(2${s} ** ${(a+1)*8-1}${s}) and < 2 ** ${(a+1)*8-1}${s}`:o=`>= ${t}${s} and <= ${r}${s}`,new Za.ERR_OUT_OF_RANGE("value",o,e)}kR(n,i,a)}function Ja(e,t){if(typeof e!="number")throw new Za.ERR_INVALID_ARG_TYPE(t,"number",e)}function Lo(e,t,r){throw Math.floor(e)!==e?(Ja(e,r),new Za.ERR_OUT_OF_RANGE(r||"offset","an integer",e)):t<0?new Za.ERR_BUFFER_OUT_OF_BOUNDS:new Za.ERR_OUT_OF_RANGE(r||"offset",`>= ${r?1:0} and <= ${t}`,e)}var TR=/[^+/0-9A-Za-z-_]/g;function CR(e){if(e=e.split("=")[0],e=e.trim().replace(TR,""),e.length<2)return"";for(;e.length%4!==0;)e=e+"=";return e}function ah(e,t){t=t||1/0;let r,n=e.length,i=null,a=[];for(let s=0;s55295&&r<57344){if(!i){if(r>56319){(t-=3)>-1&&a.push(239,191,189);continue}else if(s+1===n){(t-=3)>-1&&a.push(239,191,189);continue}i=r;continue}if(r<56320){(t-=3)>-1&&a.push(239,191,189),i=r;continue}r=(i-55296<<10|r-56320)+65536}else i&&(t-=3)>-1&&a.push(239,191,189);if(i=null,r<128){if((t-=1)<0)break;a.push(r)}else if(r<2048){if((t-=2)<0)break;a.push(r>>6|192,r&63|128)}else if(r<65536){if((t-=3)<0)break;a.push(r>>12|224,r>>6&63|128,r&63|128)}else if(r<1114112){if((t-=4)<0)break;a.push(r>>18|240,r>>12&63|128,r>>6&63|128,r&63|128)}else throw new Error("Invalid code point")}return a}function PR(e){let t=[];for(let r=0;r>8,i=r%256,a.push(i),a.push(n);return a}function u1(e){return rh.toByteArray(CR(e))}function Mc(e,t,r,n){let i;for(i=0;i=t.length||i>=e.length);++i)t[i+r]=e[i];return i}function pn(e,t){return e instanceof t||e!=null&&e.constructor!=null&&e.constructor.name!=null&&e.constructor.name===t.name}function ch(e){return e!==e}var MR=function(){let e="0123456789abcdef",t=new Array(256);for(let r=0;r<16;++r){let n=r*16;for(let i=0;i<16;++i)t[n+i]=e[r]+e[i]}return t}();function fi(e){return typeof BigInt=="undefined"?OR:e}function OR(){throw new Error("BigInt not supported")}});var f1,fh,Buffer,g=JP(()=>{f1=require("obsidian");f1.Platform.isMobileApp?fh=uh().Buffer:fh=global.Buffer;Buffer=fh});var h1=F((JH,d1)=>{"use strict";g();var dr=function(e){if(e=e||{},this.Promise=e.Promise||Promise,this.queues=Object.create(null),this.domainReentrant=e.domainReentrant||!1,this.domainReentrant){if(typeof process=="undefined"||typeof process.domain=="undefined")throw new Error("Domain-reentrant locks require `process.domain` to exist. Please flip `opts.domainReentrant = false`, use a NodeJS version that still implements Domain, or install a browser polyfill.");this.domains=Object.create(null)}this.timeout=e.timeout||dr.DEFAULT_TIMEOUT,this.maxOccupationTime=e.maxOccupationTime||dr.DEFAULT_MAX_OCCUPATION_TIME,this.maxExecutionTime=e.maxExecutionTime||dr.DEFAULT_MAX_EXECUTION_TIME,e.maxPending===1/0||Number.isInteger(e.maxPending)&&e.maxPending>=0?this.maxPending=e.maxPending:this.maxPending=dr.DEFAULT_MAX_PENDING};dr.DEFAULT_TIMEOUT=0;dr.DEFAULT_MAX_OCCUPATION_TIME=0;dr.DEFAULT_MAX_EXECUTION_TIME=0;dr.DEFAULT_MAX_PENDING=1e3;dr.prototype.acquire=function(e,t,r,n){if(Array.isArray(e))return this._acquireBatch(e,t,r,n);if(typeof t!="function")throw new Error("You must pass a function to execute");var i=null,a=null,s=null;typeof r!="function"&&(n=r,r=null,s=new this.Promise(function(b,x){i=b,a=x})),n=n||{};var o=!1,l=null,c=null,u=null,f=this,d=function(b,x,E){c&&(clearTimeout(c),c=null),u&&(clearTimeout(u),u=null),b&&(f.queues[e]&&f.queues[e].length===0&&delete f.queues[e],f.domainReentrant&&delete f.domains[e]),o||(s?x?a(x):i(E):typeof r=="function"&&r(x,E),o=!0),b&&f.queues[e]&&f.queues[e].length>0&&f.queues[e].shift()()},h=function(b){if(o)return d(b);l&&(clearTimeout(l),l=null),f.domainReentrant&&b&&(f.domains[e]=process.domain);var x=n.maxExecutionTime||f.maxExecutionTime;if(x&&(u=setTimeout(function(){f.queues[e]&&d(b,new Error("Maximum execution time is exceeded "+e))},x)),t.length===1){var E=!1;try{t(function(_,k){E||(E=!0,d(b,_,k))})}catch(_){E||(E=!0,d(b,_))}}else f._promiseTry(function(){return t()}).then(function(_){d(b,void 0,_)},function(_){d(b,_)})};f.domainReentrant&&process.domain&&(h=process.domain.bind(h));var p=n.maxPending||f.maxPending;if(!f.queues[e])f.queues[e]=[],h(!0);else if(f.domainReentrant&&process.domain&&process.domain===f.domains[e])h(!1);else if(f.queues[e].length>=p)d(!1,new Error("Too many pending tasks in queue "+e));else{var m=function(){h(!0)};n.skipQueue?f.queues[e].unshift(m):f.queues[e].push(m);var v=n.timeout||f.timeout;v&&(l=setTimeout(function(){l=null,d(!1,new Error("async-lock timed out in queue "+e))},v))}var y=n.maxOccupationTime||f.maxOccupationTime;if(y&&(c=setTimeout(function(){f.queues[e]&&d(!1,new Error("Maximum occupation time is exceeded in queue "+e))},y)),s)return s};dr.prototype._acquireBatch=function(e,t,r,n){typeof r!="function"&&(n=r,r=null);var i=this,a=function(o,l){return function(c){i.acquire(o,l,c,n)}},s=e.reduceRight(function(o,l){return a(l,o)},t);if(typeof r=="function")s(r);else return new this.Promise(function(o,l){s.length===1?s(function(c,u){c?l(c):o(u)}):o(s())})};dr.prototype.isBusy=function(e){return e?!!this.queues[e]:Object.keys(this.queues).length>0};dr.prototype._promiseTry=function(e){try{return this.Promise.resolve(e())}catch(t){return this.Promise.reject(t)}};d1.exports=dr});var m1=F((eU,p1)=>{"use strict";g();p1.exports=h1()});var g1=F((rU,dh)=>{g();typeof Object.create=="function"?dh.exports=function(t,r){r&&(t.super_=r,t.prototype=Object.create(r.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}))}:dh.exports=function(t,r){if(r){t.super_=r;var n=function(){};n.prototype=r.prototype,t.prototype=new n,t.prototype.constructor=t}}});var ph=F((hh,y1)=>{g();var Oc=uh(),mn=Oc.Buffer;function v1(e,t){for(var r in e)t[r]=e[r]}mn.from&&mn.alloc&&mn.allocUnsafe&&mn.allocUnsafeSlow?y1.exports=Oc:(v1(Oc,hh),hh.Buffer=Qi);function Qi(e,t,r){return mn(e,t,r)}Qi.prototype=Object.create(mn.prototype);v1(mn,Qi);Qi.from=function(e,t,r){if(typeof e=="number")throw new TypeError("Argument must not be a number");return mn(e,t,r)};Qi.alloc=function(e,t,r){if(typeof e!="number")throw new TypeError("Argument must be a number");var n=mn(e);return t!==void 0?typeof r=="string"?n.fill(t,r):n.fill(t):n.fill(0),n};Qi.allocUnsafe=function(e){if(typeof e!="number")throw new TypeError("Argument must be a number");return mn(e)};Qi.allocUnsafeSlow=function(e){if(typeof e!="number")throw new TypeError("Argument must be a number");return Oc.SlowBuffer(e)}});var _1=F((aU,b1)=>{g();var w1=ph().Buffer;function Ic(e,t){this._block=w1.alloc(e),this._finalSize=t,this._blockSize=e,this._len=0}Ic.prototype.update=function(e,t){typeof e=="string"&&(t=t||"utf8",e=w1.from(e,t));for(var r=this._block,n=this._blockSize,i=e.length,a=this._len,s=0;s=this._finalSize&&(this._update(this._block),this._block.fill(0));var r=this._len*8;if(r<=4294967295)this._block.writeUInt32BE(r,this._blockSize-4);else{var n=(r&4294967295)>>>0,i=(r-n)/4294967296;this._block.writeUInt32BE(i,this._blockSize-8),this._block.writeUInt32BE(n,this._blockSize-4)}this._update(this._block);var a=this._hash();return e?a.toString(e):a};Ic.prototype._update=function(){throw new Error("_update must be implemented by subclass")};b1.exports=Ic});var E1=F((oU,S1)=>{g();var IR=g1(),x1=_1(),FR=ph().Buffer,$R=[1518500249,1859775393,-1894007588,-899497514],LR=new Array(80);function Do(){this.init(),this._w=LR,x1.call(this,64,56)}IR(Do,x1);Do.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this};function DR(e){return e<<1|e>>>31}function NR(e){return e<<5|e>>>27}function BR(e){return e<<30|e>>>2}function jR(e,t,r,n){return e===0?t&r|~t&n:e===2?t&r|t&n|r&n:t^r^n}Do.prototype._update=function(e){for(var t=this._w,r=this._a|0,n=this._b|0,i=this._c|0,a=this._d|0,s=this._e|0,o=0;o<16;++o)t[o]=e.readInt32BE(o*4);for(;o<80;++o)t[o]=DR(t[o-3]^t[o-8]^t[o-14]^t[o-16]);for(var l=0;l<80;++l){var c=~~(l/20),u=NR(r)+jR(c,n,i,a)+s+t[l]+$R[c]|0;s=a,a=i,i=BR(n),n=r,r=u}this._a=r+this._a|0,this._b=n+this._b|0,this._c=i+this._c|0,this._d=a+this._d|0,this._e=s+this._e|0};Do.prototype._hash=function(){var e=FR.allocUnsafe(20);return e.writeInt32BE(this._a|0,0),e.writeInt32BE(this._b|0,4),e.writeInt32BE(this._c|0,8),e.writeInt32BE(this._d|0,12),e.writeInt32BE(this._e|0,16),e};S1.exports=Do});var k1=F(mh=>{g();var A1;(function(e){typeof DO_NOT_EXPORT_CRC=="undefined"?typeof mh=="object"?e(mh):typeof define=="function"&&define.amd?define(function(){var t={};return e(t),t}):e(A1={}):e(A1={})})(function(e){e.version="1.2.2";function t(){for(var w=0,A=new Array(256),S=0;S!=256;++S)w=S,w=w&1?-306674912^w>>>1:w>>>1,w=w&1?-306674912^w>>>1:w>>>1,w=w&1?-306674912^w>>>1:w>>>1,w=w&1?-306674912^w>>>1:w>>>1,w=w&1?-306674912^w>>>1:w>>>1,w=w&1?-306674912^w>>>1:w>>>1,w=w&1?-306674912^w>>>1:w>>>1,w=w&1?-306674912^w>>>1:w>>>1,A[S]=w;return typeof Int32Array!="undefined"?new Int32Array(A):A}var r=t();function n(w){var A=0,S=0,T=0,P=typeof Int32Array!="undefined"?new Int32Array(4096):new Array(4096);for(T=0;T!=256;++T)P[T]=w[T];for(T=0;T!=256;++T)for(S=w[T],A=256+T;A<4096;A+=256)S=P[A]=S>>>8^w[S&255];var I=[];for(T=1;T!=16;++T)I[T-1]=typeof Int32Array!="undefined"?P.subarray(T*256,T*256+256):P.slice(T*256,T*256+256);return I}var i=n(r),a=i[0],s=i[1],o=i[2],l=i[3],c=i[4],u=i[5],f=i[6],d=i[7],h=i[8],p=i[9],m=i[10],v=i[11],y=i[12],b=i[13],x=i[14];function E(w,A){for(var S=A^-1,T=0,P=w.length;T>>8^r[(S^w.charCodeAt(T++))&255];return~S}function _(w,A){for(var S=A^-1,T=w.length-15,P=0;P>8&255]^y[w[P++]^S>>16&255]^v[w[P++]^S>>>24]^m[w[P++]]^p[w[P++]]^h[w[P++]]^d[w[P++]]^f[w[P++]]^u[w[P++]]^c[w[P++]]^l[w[P++]]^o[w[P++]]^s[w[P++]]^a[w[P++]]^r[w[P++]];for(T+=15;P>>8^r[(S^w[P++])&255];return~S}function k(w,A){for(var S=A^-1,T=0,P=w.length,I=0,N=0;T>>8^r[(S^I)&255]:I<2048?(S=S>>>8^r[(S^(192|I>>6&31))&255],S=S>>>8^r[(S^(128|I&63))&255]):I>=55296&&I<57344?(I=(I&1023)+64,N=w.charCodeAt(T++)&1023,S=S>>>8^r[(S^(240|I>>8&7))&255],S=S>>>8^r[(S^(128|I>>2&63))&255],S=S>>>8^r[(S^(128|N>>6&15|(I&3)<<4))&255],S=S>>>8^r[(S^(128|N&63))&255]):(S=S>>>8^r[(S^(224|I>>12&15))&255],S=S>>>8^r[(S^(128|I>>6&63))&255],S=S>>>8^r[(S^(128|I&63))&255]);return~S}e.table=r,e.bstr=E,e.buf=_,e.str=k})});var Bn=F(Ut=>{"use strict";g();var HR=typeof Uint8Array!="undefined"&&typeof Uint16Array!="undefined"&&typeof Int32Array!="undefined";function UR(e,t){return Object.prototype.hasOwnProperty.call(e,t)}Ut.assign=function(e){for(var t=Array.prototype.slice.call(arguments,1);t.length;){var r=t.shift();if(r){if(typeof r!="object")throw new TypeError(r+"must be non-object");for(var n in r)UR(r,n)&&(e[n]=r[n])}}return e};Ut.shrinkBuf=function(e,t){return e.length===t?e:e.subarray?e.subarray(0,t):(e.length=t,e)};var GR={arraySet:function(e,t,r,n,i){if(t.subarray&&e.subarray){e.set(t.subarray(r,r+n),i);return}for(var a=0;a{"use strict";g();var VR=Bn(),WR=4,T1=0,C1=1,qR=2;function ts(e){for(var t=e.length;--t>=0;)e[t]=0}var YR=0,F1=1,XR=2,ZR=3,KR=258,xh=29,Go=256,Bo=Go+1+xh,es=30,Sh=19,$1=2*Bo+1,ea=15,gh=16,JR=7,Eh=256,L1=16,D1=17,N1=18,bh=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],Fc=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],QR=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],B1=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],e5=512,jn=new Array((Bo+2)*2);ts(jn);var No=new Array(es*2);ts(No);var jo=new Array(e5);ts(jo);var Ho=new Array(KR-ZR+1);ts(Ho);var Ah=new Array(xh);ts(Ah);var $c=new Array(es);ts($c);function vh(e,t,r,n,i){this.static_tree=e,this.extra_bits=t,this.extra_base=r,this.elems=n,this.max_length=i,this.has_stree=e&&e.length}var j1,H1,U1;function yh(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t}function G1(e){return e<256?jo[e]:jo[256+(e>>>7)]}function Uo(e,t){e.pending_buf[e.pending++]=t&255,e.pending_buf[e.pending++]=t>>>8&255}function Qt(e,t,r){e.bi_valid>gh-r?(e.bi_buf|=t<>gh-e.bi_valid,e.bi_valid+=r-gh):(e.bi_buf|=t<>>=1,r<<=1;while(--t>0);return r>>>1}function t5(e){e.bi_valid===16?(Uo(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):e.bi_valid>=8&&(e.pending_buf[e.pending++]=e.bi_buf&255,e.bi_buf>>=8,e.bi_valid-=8)}function r5(e,t){var r=t.dyn_tree,n=t.max_code,i=t.stat_desc.static_tree,a=t.stat_desc.has_stree,s=t.stat_desc.extra_bits,o=t.stat_desc.extra_base,l=t.stat_desc.max_length,c,u,f,d,h,p,m=0;for(d=0;d<=ea;d++)e.bl_count[d]=0;for(r[e.heap[e.heap_max]*2+1]=0,c=e.heap_max+1;c<$1;c++)u=e.heap[c],d=r[r[u*2+1]*2+1]+1,d>l&&(d=l,m++),r[u*2+1]=d,!(u>n)&&(e.bl_count[d]++,h=0,u>=o&&(h=s[u-o]),p=r[u*2],e.opt_len+=p*(d+h),a&&(e.static_len+=p*(i[u*2+1]+h)));if(m!==0){do{for(d=l-1;e.bl_count[d]===0;)d--;e.bl_count[d]--,e.bl_count[d+1]+=2,e.bl_count[l]--,m-=2}while(m>0);for(d=l;d!==0;d--)for(u=e.bl_count[d];u!==0;)f=e.heap[--c],!(f>n)&&(r[f*2+1]!==d&&(e.opt_len+=(d-r[f*2+1])*r[f*2],r[f*2+1]=d),u--)}}function V1(e,t,r){var n=new Array(ea+1),i=0,a,s;for(a=1;a<=ea;a++)n[a]=i=i+r[a-1]<<1;for(s=0;s<=t;s++){var o=e[s*2+1];o!==0&&(e[s*2]=z1(n[o]++,o))}}function n5(){var e,t,r,n,i,a=new Array(ea+1);for(r=0,n=0;n>=7;n8?Uo(e,e.bi_buf):e.bi_valid>0&&(e.pending_buf[e.pending++]=e.bi_buf),e.bi_buf=0,e.bi_valid=0}function i5(e,t,r,n){q1(e),n&&(Uo(e,r),Uo(e,~r)),VR.arraySet(e.pending_buf,e.window,t,r,e.pending),e.pending+=r}function P1(e,t,r,n){var i=t*2,a=r*2;return e[i]>1;s>=1;s--)wh(e,r,s);c=a;do s=e.heap[1],e.heap[1]=e.heap[e.heap_len--],wh(e,r,1),o=e.heap[1],e.heap[--e.heap_max]=s,e.heap[--e.heap_max]=o,r[c*2]=r[s*2]+r[o*2],e.depth[c]=(e.depth[s]>=e.depth[o]?e.depth[s]:e.depth[o])+1,r[s*2+1]=r[o*2+1]=c,e.heap[1]=c++,wh(e,r,1);while(e.heap_len>=2);e.heap[--e.heap_max]=e.heap[1],r5(e,t),V1(r,l,e.bl_count)}function M1(e,t,r){var n,i=-1,a,s=t[0*2+1],o=0,l=7,c=4;for(s===0&&(l=138,c=3),t[(r+1)*2+1]=65535,n=0;n<=r;n++)a=s,s=t[(n+1)*2+1],!(++o=3&&e.bl_tree[B1[t]*2+1]===0;t--);return e.opt_len+=3*(t+1)+5+5+4,t}function s5(e,t,r,n){var i;for(Qt(e,t-257,5),Qt(e,r-1,5),Qt(e,n-4,4),i=0;i>>=1)if(t&1&&e.dyn_ltree[r*2]!==0)return T1;if(e.dyn_ltree[9*2]!==0||e.dyn_ltree[10*2]!==0||e.dyn_ltree[13*2]!==0)return C1;for(r=32;r0?(e.strm.data_type===qR&&(e.strm.data_type=o5(e)),_h(e,e.l_desc),_h(e,e.d_desc),s=a5(e),i=e.opt_len+3+7>>>3,a=e.static_len+3+7>>>3,a<=i&&(i=a)):i=a=r+5,r+4<=i&&t!==-1?Y1(e,t,r,n):e.strategy===WR||a===i?(Qt(e,(F1<<1)+(n?1:0),3),R1(e,jn,No)):(Qt(e,(XR<<1)+(n?1:0),3),s5(e,e.l_desc.max_code+1,e.d_desc.max_code+1,s+1),R1(e,e.dyn_ltree,e.dyn_dtree)),W1(e),n&&q1(e)}function f5(e,t,r){return e.pending_buf[e.d_buf+e.last_lit*2]=t>>>8&255,e.pending_buf[e.d_buf+e.last_lit*2+1]=t&255,e.pending_buf[e.l_buf+e.last_lit]=r&255,e.last_lit++,t===0?e.dyn_ltree[r*2]++:(e.matches++,t--,e.dyn_ltree[(Ho[r]+Go+1)*2]++,e.dyn_dtree[G1(t)*2]++),e.last_lit===e.lit_bufsize-1}rs._tr_init=l5;rs._tr_stored_block=Y1;rs._tr_flush_block=u5;rs._tr_tally=f5;rs._tr_align=c5});var kh=F((mU,Z1)=>{"use strict";g();function d5(e,t,r,n){for(var i=e&65535|0,a=e>>>16&65535|0,s=0;r!==0;){s=r>2e3?2e3:r,r-=s;do i=i+t[n++]|0,a=a+i|0;while(--s);i%=65521,a%=65521}return i|a<<16|0}Z1.exports=d5});var Th=F((vU,K1)=>{"use strict";g();function h5(){for(var e,t=[],r=0;r<256;r++){e=r;for(var n=0;n<8;n++)e=e&1?3988292384^e>>>1:e>>>1;t[r]=e}return t}var p5=h5();function m5(e,t,r,n){var i=p5,a=n+r;e^=-1;for(var s=n;s>>8^i[(e^t[s])&255];return e^-1}K1.exports=m5});var Lc=F((wU,J1)=>{"use strict";g();J1.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}});var oy=F(wn=>{"use strict";g();var Gt=Bn(),Mr=X1(),ry=kh(),di=Th(),g5=Lc(),ia=0,v5=1,y5=3,vi=4,Q1=5,yn=0,ey=1,Or=-2,w5=-3,Ch=-5,b5=-1,_5=1,Dc=2,x5=3,S5=4,E5=0,A5=2,Hc=8,k5=9,T5=15,C5=8,P5=29,R5=256,Rh=R5+1+P5,M5=30,O5=19,I5=2*Rh+1,F5=15,be=3,mi=258,Kr=mi+be+1,$5=32,Uc=42,Mh=69,Nc=73,Bc=91,jc=103,ta=113,Vo=666,vt=1,Wo=2,ra=3,as=4,L5=3;function gi(e,t){return e.msg=g5[t],t}function ty(e){return(e<<1)-(e>4?9:0)}function pi(e){for(var t=e.length;--t>=0;)e[t]=0}function hi(e){var t=e.state,r=t.pending;r>e.avail_out&&(r=e.avail_out),r!==0&&(Gt.arraySet(e.output,t.pending_buf,t.pending_out,r,e.next_out),e.next_out+=r,t.pending_out+=r,e.total_out+=r,e.avail_out-=r,t.pending-=r,t.pending===0&&(t.pending_out=0))}function At(e,t){Mr._tr_flush_block(e,e.block_start>=0?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,hi(e.strm)}function ke(e,t){e.pending_buf[e.pending++]=t}function zo(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=t&255}function D5(e,t,r,n){var i=e.avail_in;return i>n&&(i=n),i===0?0:(e.avail_in-=i,Gt.arraySet(t,e.input,e.next_in,i,r),e.state.wrap===1?e.adler=ry(e.adler,t,i,r):e.state.wrap===2&&(e.adler=di(e.adler,t,i,r)),e.next_in+=i,e.total_in+=i,i)}function ny(e,t){var r=e.max_chain_length,n=e.strstart,i,a,s=e.prev_length,o=e.nice_match,l=e.strstart>e.w_size-Kr?e.strstart-(e.w_size-Kr):0,c=e.window,u=e.w_mask,f=e.prev,d=e.strstart+mi,h=c[n+s-1],p=c[n+s];e.prev_length>=e.good_match&&(r>>=2),o>e.lookahead&&(o=e.lookahead);do if(i=t,!(c[i+s]!==p||c[i+s-1]!==h||c[i]!==c[n]||c[++i]!==c[n+1])){n+=2,i++;do;while(c[++n]===c[++i]&&c[++n]===c[++i]&&c[++n]===c[++i]&&c[++n]===c[++i]&&c[++n]===c[++i]&&c[++n]===c[++i]&&c[++n]===c[++i]&&c[++n]===c[++i]&&ns){if(e.match_start=t,s=a,a>=o)break;h=c[n+s-1],p=c[n+s]}}while((t=f[t&u])>l&&--r!==0);return s<=e.lookahead?s:e.lookahead}function na(e){var t=e.w_size,r,n,i,a,s;do{if(a=e.window_size-e.lookahead-e.strstart,e.strstart>=t+(t-Kr)){Gt.arraySet(e.window,e.window,t,t,0),e.match_start-=t,e.strstart-=t,e.block_start-=t,n=e.hash_size,r=n;do i=e.head[--r],e.head[r]=i>=t?i-t:0;while(--n);n=t,r=n;do i=e.prev[--r],e.prev[r]=i>=t?i-t:0;while(--n);a+=t}if(e.strm.avail_in===0)break;if(n=D5(e.strm,e.window,e.strstart+e.lookahead,a),e.lookahead+=n,e.lookahead+e.insert>=be)for(s=e.strstart-e.insert,e.ins_h=e.window[s],e.ins_h=(e.ins_h<e.pending_buf_size-5&&(r=e.pending_buf_size-5);;){if(e.lookahead<=1){if(na(e),e.lookahead===0&&t===ia)return vt;if(e.lookahead===0)break}e.strstart+=e.lookahead,e.lookahead=0;var n=e.block_start+r;if((e.strstart===0||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,At(e,!1),e.strm.avail_out===0)||e.strstart-e.block_start>=e.w_size-Kr&&(At(e,!1),e.strm.avail_out===0))return vt}return e.insert=0,t===vi?(At(e,!0),e.strm.avail_out===0?ra:as):(e.strstart>e.block_start&&(At(e,!1),e.strm.avail_out===0),vt)}function Ph(e,t){for(var r,n;;){if(e.lookahead=be&&(e.ins_h=(e.ins_h<=be)if(n=Mr._tr_tally(e,e.strstart-e.match_start,e.match_length-be),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=be){e.match_length--;do e.strstart++,e.ins_h=(e.ins_h<=be&&(e.ins_h=(e.ins_h<4096)&&(e.match_length=be-1)),e.prev_length>=be&&e.match_length<=e.prev_length){i=e.strstart+e.lookahead-be,n=Mr._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-be),e.lookahead-=e.prev_length-1,e.prev_length-=2;do++e.strstart<=i&&(e.ins_h=(e.ins_h<=be&&e.strstart>0&&(i=e.strstart-1,n=s[i],n===s[++i]&&n===s[++i]&&n===s[++i])){a=e.strstart+mi;do;while(n===s[++i]&&n===s[++i]&&n===s[++i]&&n===s[++i]&&n===s[++i]&&n===s[++i]&&n===s[++i]&&n===s[++i]&&ie.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=be?(r=Mr._tr_tally(e,1,e.match_length-be),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(r=Mr._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),r&&(At(e,!1),e.strm.avail_out===0))return vt}return e.insert=0,t===vi?(At(e,!0),e.strm.avail_out===0?ra:as):e.last_lit&&(At(e,!1),e.strm.avail_out===0)?vt:Wo}function j5(e,t){for(var r;;){if(e.lookahead===0&&(na(e),e.lookahead===0)){if(t===ia)return vt;break}if(e.match_length=0,r=Mr._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,r&&(At(e,!1),e.strm.avail_out===0))return vt}return e.insert=0,t===vi?(At(e,!0),e.strm.avail_out===0?ra:as):e.last_lit&&(At(e,!1),e.strm.avail_out===0)?vt:Wo}function vn(e,t,r,n,i){this.good_length=e,this.max_lazy=t,this.nice_length=r,this.max_chain=n,this.func=i}var is;is=[new vn(0,0,0,0,N5),new vn(4,4,8,4,Ph),new vn(4,5,16,8,Ph),new vn(4,6,32,32,Ph),new vn(4,4,16,16,ns),new vn(8,16,32,32,ns),new vn(8,16,128,128,ns),new vn(8,32,128,256,ns),new vn(32,128,258,1024,ns),new vn(32,258,258,4096,ns)];function H5(e){e.window_size=2*e.w_size,pi(e.head),e.max_lazy_match=is[e.level].max_lazy,e.good_match=is[e.level].good_length,e.nice_match=is[e.level].nice_length,e.max_chain_length=is[e.level].max_chain,e.strstart=0,e.block_start=0,e.lookahead=0,e.insert=0,e.match_length=e.prev_length=be-1,e.match_available=0,e.ins_h=0}function U5(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=Hc,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new Gt.Buf16(I5*2),this.dyn_dtree=new Gt.Buf16((2*M5+1)*2),this.bl_tree=new Gt.Buf16((2*O5+1)*2),pi(this.dyn_ltree),pi(this.dyn_dtree),pi(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new Gt.Buf16(F5+1),this.heap=new Gt.Buf16(2*Rh+1),pi(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Gt.Buf16(2*Rh+1),pi(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function iy(e){var t;return!e||!e.state?gi(e,Or):(e.total_in=e.total_out=0,e.data_type=A5,t=e.state,t.pending=0,t.pending_out=0,t.wrap<0&&(t.wrap=-t.wrap),t.status=t.wrap?Uc:ta,e.adler=t.wrap===2?0:1,t.last_flush=ia,Mr._tr_init(t),yn)}function ay(e){var t=iy(e);return t===yn&&H5(e.state),t}function G5(e,t){return!e||!e.state||e.state.wrap!==2?Or:(e.state.gzhead=t,yn)}function sy(e,t,r,n,i,a){if(!e)return Or;var s=1;if(t===b5&&(t=6),n<0?(s=0,n=-n):n>15&&(s=2,n-=16),i<1||i>k5||r!==Hc||n<8||n>15||t<0||t>9||a<0||a>S5)return gi(e,Or);n===8&&(n=9);var o=new U5;return e.state=o,o.strm=e,o.wrap=s,o.gzhead=null,o.w_bits=n,o.w_size=1<Q1||t<0)return e?gi(e,Or):Or;if(n=e.state,!e.output||!e.input&&e.avail_in!==0||n.status===Vo&&t!==vi)return gi(e,e.avail_out===0?Ch:Or);if(n.strm=e,r=n.last_flush,n.last_flush=t,n.status===Uc)if(n.wrap===2)e.adler=0,ke(n,31),ke(n,139),ke(n,8),n.gzhead?(ke(n,(n.gzhead.text?1:0)+(n.gzhead.hcrc?2:0)+(n.gzhead.extra?4:0)+(n.gzhead.name?8:0)+(n.gzhead.comment?16:0)),ke(n,n.gzhead.time&255),ke(n,n.gzhead.time>>8&255),ke(n,n.gzhead.time>>16&255),ke(n,n.gzhead.time>>24&255),ke(n,n.level===9?2:n.strategy>=Dc||n.level<2?4:0),ke(n,n.gzhead.os&255),n.gzhead.extra&&n.gzhead.extra.length&&(ke(n,n.gzhead.extra.length&255),ke(n,n.gzhead.extra.length>>8&255)),n.gzhead.hcrc&&(e.adler=di(e.adler,n.pending_buf,n.pending,0)),n.gzindex=0,n.status=Mh):(ke(n,0),ke(n,0),ke(n,0),ke(n,0),ke(n,0),ke(n,n.level===9?2:n.strategy>=Dc||n.level<2?4:0),ke(n,L5),n.status=ta);else{var s=Hc+(n.w_bits-8<<4)<<8,o=-1;n.strategy>=Dc||n.level<2?o=0:n.level<6?o=1:n.level===6?o=2:o=3,s|=o<<6,n.strstart!==0&&(s|=$5),s+=31-s%31,n.status=ta,zo(n,s),n.strstart!==0&&(zo(n,e.adler>>>16),zo(n,e.adler&65535)),e.adler=1}if(n.status===Mh)if(n.gzhead.extra){for(i=n.pending;n.gzindex<(n.gzhead.extra.length&65535)&&!(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=di(e.adler,n.pending_buf,n.pending-i,i)),hi(e),i=n.pending,n.pending===n.pending_buf_size));)ke(n,n.gzhead.extra[n.gzindex]&255),n.gzindex++;n.gzhead.hcrc&&n.pending>i&&(e.adler=di(e.adler,n.pending_buf,n.pending-i,i)),n.gzindex===n.gzhead.extra.length&&(n.gzindex=0,n.status=Nc)}else n.status=Nc;if(n.status===Nc)if(n.gzhead.name){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=di(e.adler,n.pending_buf,n.pending-i,i)),hi(e),i=n.pending,n.pending===n.pending_buf_size)){a=1;break}n.gzindexi&&(e.adler=di(e.adler,n.pending_buf,n.pending-i,i)),a===0&&(n.gzindex=0,n.status=Bc)}else n.status=Bc;if(n.status===Bc)if(n.gzhead.comment){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=di(e.adler,n.pending_buf,n.pending-i,i)),hi(e),i=n.pending,n.pending===n.pending_buf_size)){a=1;break}n.gzindexi&&(e.adler=di(e.adler,n.pending_buf,n.pending-i,i)),a===0&&(n.status=jc)}else n.status=jc;if(n.status===jc&&(n.gzhead.hcrc?(n.pending+2>n.pending_buf_size&&hi(e),n.pending+2<=n.pending_buf_size&&(ke(n,e.adler&255),ke(n,e.adler>>8&255),e.adler=0,n.status=ta)):n.status=ta),n.pending!==0){if(hi(e),e.avail_out===0)return n.last_flush=-1,yn}else if(e.avail_in===0&&ty(t)<=ty(r)&&t!==vi)return gi(e,Ch);if(n.status===Vo&&e.avail_in!==0)return gi(e,Ch);if(e.avail_in!==0||n.lookahead!==0||t!==ia&&n.status!==Vo){var l=n.strategy===Dc?j5(n,t):n.strategy===x5?B5(n,t):is[n.level].func(n,t);if((l===ra||l===as)&&(n.status=Vo),l===vt||l===ra)return e.avail_out===0&&(n.last_flush=-1),yn;if(l===Wo&&(t===v5?Mr._tr_align(n):t!==Q1&&(Mr._tr_stored_block(n,0,0,!1),t===y5&&(pi(n.head),n.lookahead===0&&(n.strstart=0,n.block_start=0,n.insert=0))),hi(e),e.avail_out===0))return n.last_flush=-1,yn}return t!==vi?yn:n.wrap<=0?ey:(n.wrap===2?(ke(n,e.adler&255),ke(n,e.adler>>8&255),ke(n,e.adler>>16&255),ke(n,e.adler>>24&255),ke(n,e.total_in&255),ke(n,e.total_in>>8&255),ke(n,e.total_in>>16&255),ke(n,e.total_in>>24&255)):(zo(n,e.adler>>>16),zo(n,e.adler&65535)),hi(e),n.wrap>0&&(n.wrap=-n.wrap),n.pending!==0?yn:ey)}function W5(e){var t;return!e||!e.state?Or:(t=e.state.status,t!==Uc&&t!==Mh&&t!==Nc&&t!==Bc&&t!==jc&&t!==ta&&t!==Vo?gi(e,Or):(e.state=null,t===ta?gi(e,w5):yn))}function q5(e,t){var r=t.length,n,i,a,s,o,l,c,u;if(!e||!e.state||(n=e.state,s=n.wrap,s===2||s===1&&n.status!==Uc||n.lookahead))return Or;for(s===1&&(e.adler=ry(e.adler,t,r,0)),n.wrap=0,r>=n.w_size&&(s===0&&(pi(n.head),n.strstart=0,n.block_start=0,n.insert=0),u=new Gt.Buf8(n.w_size),Gt.arraySet(u,t,r-n.w_size,n.w_size,0),t=u,r=n.w_size),o=e.avail_in,l=e.next_in,c=e.input,e.avail_in=r,e.next_in=0,e.input=t,na(n);n.lookahead>=be;){i=n.strstart,a=n.lookahead-(be-1);do n.ins_h=(n.ins_h<{"use strict";g();var Gc=Bn(),ly=!0,cy=!0;try{String.fromCharCode.apply(null,[0])}catch(e){ly=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(e){cy=!1}var qo=new Gc.Buf8(256);for(Hn=0;Hn<256;Hn++)qo[Hn]=Hn>=252?6:Hn>=248?5:Hn>=240?4:Hn>=224?3:Hn>=192?2:1;var Hn;qo[254]=qo[254]=1;ss.string2buf=function(e){var t,r,n,i,a,s=e.length,o=0;for(i=0;i>>6,t[a++]=128|r&63):r<65536?(t[a++]=224|r>>>12,t[a++]=128|r>>>6&63,t[a++]=128|r&63):(t[a++]=240|r>>>18,t[a++]=128|r>>>12&63,t[a++]=128|r>>>6&63,t[a++]=128|r&63);return t};function uy(e,t){if(t<65534&&(e.subarray&&cy||!e.subarray&&ly))return String.fromCharCode.apply(null,Gc.shrinkBuf(e,t));for(var r="",n=0;n4){o[n++]=65533,r+=a-1;continue}for(i&=a===2?31:a===3?15:7;a>1&&r1){o[n++]=65533;continue}i<65536?o[n++]=i:(i-=65536,o[n++]=55296|i>>10&1023,o[n++]=56320|i&1023)}return uy(o,n)};ss.utf8border=function(e,t){var r;for(t=t||e.length,t>e.length&&(t=e.length),r=t-1;r>=0&&(e[r]&192)===128;)r--;return r<0||r===0?t:r+qo[e[r]]>t?r:t}});var Ih=F((AU,fy)=>{"use strict";g();function Y5(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}fy.exports=Y5});var my=F(Zo=>{"use strict";g();var Yo=oy(),Xo=Bn(),$h=Oh(),Lh=Lc(),X5=Ih(),py=Object.prototype.toString,Z5=0,Fh=4,os=0,dy=1,hy=2,K5=-1,J5=0,Q5=8;function aa(e){if(!(this instanceof aa))return new aa(e);this.options=Xo.assign({level:K5,method:Q5,chunkSize:16384,windowBits:15,memLevel:8,strategy:J5,to:""},e||{});var t=this.options;t.raw&&t.windowBits>0?t.windowBits=-t.windowBits:t.gzip&&t.windowBits>0&&t.windowBits<16&&(t.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new X5,this.strm.avail_out=0;var r=Yo.deflateInit2(this.strm,t.level,t.method,t.windowBits,t.memLevel,t.strategy);if(r!==os)throw new Error(Lh[r]);if(t.header&&Yo.deflateSetHeader(this.strm,t.header),t.dictionary){var n;if(typeof t.dictionary=="string"?n=$h.string2buf(t.dictionary):py.call(t.dictionary)==="[object ArrayBuffer]"?n=new Uint8Array(t.dictionary):n=t.dictionary,r=Yo.deflateSetDictionary(this.strm,n),r!==os)throw new Error(Lh[r]);this._dict_set=!0}}aa.prototype.push=function(e,t){var r=this.strm,n=this.options.chunkSize,i,a;if(this.ended)return!1;a=t===~~t?t:t===!0?Fh:Z5,typeof e=="string"?r.input=$h.string2buf(e):py.call(e)==="[object ArrayBuffer]"?r.input=new Uint8Array(e):r.input=e,r.next_in=0,r.avail_in=r.input.length;do{if(r.avail_out===0&&(r.output=new Xo.Buf8(n),r.next_out=0,r.avail_out=n),i=Yo.deflate(r,a),i!==dy&&i!==os)return this.onEnd(i),this.ended=!0,!1;(r.avail_out===0||r.avail_in===0&&(a===Fh||a===hy))&&(this.options.to==="string"?this.onData($h.buf2binstring(Xo.shrinkBuf(r.output,r.next_out))):this.onData(Xo.shrinkBuf(r.output,r.next_out)))}while((r.avail_in>0||r.avail_out===0)&&i!==dy);return a===Fh?(i=Yo.deflateEnd(this.strm),this.onEnd(i),this.ended=!0,i===os):(a===hy&&(this.onEnd(os),r.avail_out=0),!0)};aa.prototype.onData=function(e){this.chunks.push(e)};aa.prototype.onEnd=function(e){e===os&&(this.options.to==="string"?this.result=this.chunks.join(""):this.result=Xo.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg};function Dh(e,t){var r=new aa(t);if(r.push(e,!0),r.err)throw r.msg||Lh[r.err];return r.result}function eM(e,t){return t=t||{},t.raw=!0,Dh(e,t)}function tM(e,t){return t=t||{},t.gzip=!0,Dh(e,t)}Zo.Deflate=aa;Zo.deflate=Dh;Zo.deflateRaw=eM;Zo.gzip=tM});var vy=F((PU,gy)=>{"use strict";g();var zc=30,rM=12;gy.exports=function(t,r){var n,i,a,s,o,l,c,u,f,d,h,p,m,v,y,b,x,E,_,k,w,A,S,T,P;n=t.state,i=t.next_in,T=t.input,a=i+(t.avail_in-5),s=t.next_out,P=t.output,o=s-(r-t.avail_out),l=s+(t.avail_out-257),c=n.dmax,u=n.wsize,f=n.whave,d=n.wnext,h=n.window,p=n.hold,m=n.bits,v=n.lencode,y=n.distcode,b=(1<>>24,p>>>=_,m-=_,_=E>>>16&255,_===0)P[s++]=E&65535;else if(_&16){k=E&65535,_&=15,_&&(m<_&&(p+=T[i++]<>>=_,m-=_),m<15&&(p+=T[i++]<>>24,p>>>=_,m-=_,_=E>>>16&255,_&16){if(w=E&65535,_&=15,m<_&&(p+=T[i++]<c){t.msg="invalid distance too far back",n.mode=zc;break e}if(p>>>=_,m-=_,_=s-o,w>_){if(_=w-_,_>f&&n.sane){t.msg="invalid distance too far back",n.mode=zc;break e}if(A=0,S=h,d===0){if(A+=u-_,_2;)P[s++]=S[A++],P[s++]=S[A++],P[s++]=S[A++],k-=3;k&&(P[s++]=S[A++],k>1&&(P[s++]=S[A++]))}else{A=s-w;do P[s++]=P[A++],P[s++]=P[A++],P[s++]=P[A++],k-=3;while(k>2);k&&(P[s++]=P[A++],k>1&&(P[s++]=P[A++]))}}else if(_&64){t.msg="invalid distance code",n.mode=zc;break e}else{E=y[(E&65535)+(p&(1<<_)-1)];continue r}break}}else if(_&64)if(_&32){n.mode=rM;break e}else{t.msg="invalid literal/length code",n.mode=zc;break e}else{E=v[(E&65535)+(p&(1<<_)-1)];continue t}break}}while(i>3,i-=k,m-=k<<3,p&=(1<{"use strict";g();var yy=Bn(),ls=15,wy=852,by=592,_y=0,Nh=1,xy=2,nM=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],iM=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],aM=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],sM=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];Sy.exports=function(t,r,n,i,a,s,o,l){var c=l.bits,u=0,f=0,d=0,h=0,p=0,m=0,v=0,y=0,b=0,x=0,E,_,k,w,A,S=null,T=0,P,I=new yy.Buf16(ls+1),N=new yy.Buf16(ls+1),L=null,ee=0,fe,J,Q;for(u=0;u<=ls;u++)I[u]=0;for(f=0;f=1&&I[h]===0;h--);if(p>h&&(p=h),h===0)return a[s++]=1<<24|64<<16|0,a[s++]=1<<24|64<<16|0,l.bits=1,0;for(d=1;d0&&(t===_y||h!==1))return-1;for(N[1]=0,u=1;uwy||t===xy&&b>by)return 1;for(;;){fe=u-v,o[f]P?(J=L[ee+o[f]],Q=S[T+o[f]]):(J=96,Q=0),E=1<>v)+_]=fe<<24|J<<16|Q|0;while(_!==0);for(E=1<>=1;if(E!==0?(x&=E-1,x+=E):x=0,f++,--I[u]===0){if(u===h)break;u=r[n+o[f]]}if(u>p&&(x&w)!==k){for(v===0&&(v=p),A+=d,m=u-v,y=1<wy||t===xy&&b>by)return 1;k=x&w,a[k]=p<<24|m<<16|A-s|0}}return x!==0&&(a[A+x]=u-v<<24|64<<16|0),l.bits=p,0}});var aw=F(Jr=>{"use strict";g();var hr=Bn(),zh=kh(),bn=Th(),oM=vy(),Ko=Ey(),lM=0,Zy=1,Ky=2,Ay=4,cM=5,Vc=6,sa=0,uM=1,fM=2,Ir=-2,Jy=-3,Vh=-4,dM=-5,ky=8,Qy=1,Ty=2,Cy=3,Py=4,Ry=5,My=6,Oy=7,Iy=8,Fy=9,$y=10,Yc=11,Un=12,Bh=13,Ly=14,jh=15,Dy=16,Ny=17,By=18,jy=19,Wc=20,qc=21,Hy=22,Uy=23,Gy=24,zy=25,Vy=26,Hh=27,Wy=28,qy=29,Be=30,Wh=31,hM=32,pM=852,mM=592,gM=15,vM=gM;function Yy(e){return(e>>>24&255)+(e>>>8&65280)+((e&65280)<<8)+((e&255)<<24)}function yM(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new hr.Buf16(320),this.work=new hr.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function ew(e){var t;return!e||!e.state?Ir:(t=e.state,e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=t.wrap&1),t.mode=Qy,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new hr.Buf32(pM),t.distcode=t.distdyn=new hr.Buf32(mM),t.sane=1,t.back=-1,sa)}function tw(e){var t;return!e||!e.state?Ir:(t=e.state,t.wsize=0,t.whave=0,t.wnext=0,ew(e))}function rw(e,t){var r,n;return!e||!e.state||(n=e.state,t<0?(r=0,t=-t):(r=(t>>4)+1,t<48&&(t&=15)),t&&(t<8||t>15))?Ir:(n.window!==null&&n.wbits!==t&&(n.window=null),n.wrap=r,n.wbits=t,tw(e))}function nw(e,t){var r,n;return e?(n=new yM,e.state=n,n.window=null,r=rw(e,t),r!==sa&&(e.state=null),r):Ir}function wM(e){return nw(e,vM)}var Xy=!0,Uh,Gh;function bM(e){if(Xy){var t;for(Uh=new hr.Buf32(512),Gh=new hr.Buf32(32),t=0;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(Ko(Zy,e.lens,0,288,Uh,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;Ko(Ky,e.lens,0,32,Gh,0,e.work,{bits:5}),Xy=!1}e.lencode=Uh,e.lenbits=9,e.distcode=Gh,e.distbits=5}function iw(e,t,r,n){var i,a=e.state;return a.window===null&&(a.wsize=1<=a.wsize?(hr.arraySet(a.window,t,r-a.wsize,a.wsize,0),a.wnext=0,a.whave=a.wsize):(i=a.wsize-a.wnext,i>n&&(i=n),hr.arraySet(a.window,t,r-n,i,a.wnext),n-=i,n?(hr.arraySet(a.window,t,r-n,n,0),a.wnext=n,a.whave=a.wsize):(a.wnext+=i,a.wnext===a.wsize&&(a.wnext=0),a.whave>>8&255,r.check=bn(r.check,S,2,0),c=0,u=0,r.mode=Ty;break}if(r.flags=0,r.head&&(r.head.done=!1),!(r.wrap&1)||(((c&255)<<8)+(c>>8))%31){e.msg="incorrect header check",r.mode=Be;break}if((c&15)!==ky){e.msg="unknown compression method",r.mode=Be;break}if(c>>>=4,u-=4,w=(c&15)+8,r.wbits===0)r.wbits=w;else if(w>r.wbits){e.msg="invalid window size",r.mode=Be;break}r.dmax=1<>8&1),r.flags&512&&(S[0]=c&255,S[1]=c>>>8&255,r.check=bn(r.check,S,2,0)),c=0,u=0,r.mode=Cy;case Cy:for(;u<32;){if(o===0)break e;o--,c+=n[a++]<>>8&255,S[2]=c>>>16&255,S[3]=c>>>24&255,r.check=bn(r.check,S,4,0)),c=0,u=0,r.mode=Py;case Py:for(;u<16;){if(o===0)break e;o--,c+=n[a++]<>8),r.flags&512&&(S[0]=c&255,S[1]=c>>>8&255,r.check=bn(r.check,S,2,0)),c=0,u=0,r.mode=Ry;case Ry:if(r.flags&1024){for(;u<16;){if(o===0)break e;o--,c+=n[a++]<>>8&255,r.check=bn(r.check,S,2,0)),c=0,u=0}else r.head&&(r.head.extra=null);r.mode=My;case My:if(r.flags&1024&&(h=r.length,h>o&&(h=o),h&&(r.head&&(w=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),hr.arraySet(r.head.extra,n,a,h,w)),r.flags&512&&(r.check=bn(r.check,n,h,a)),o-=h,a+=h,r.length-=h),r.length))break e;r.length=0,r.mode=Oy;case Oy:if(r.flags&2048){if(o===0)break e;h=0;do w=n[a+h++],r.head&&w&&r.length<65536&&(r.head.name+=String.fromCharCode(w));while(w&&h>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=Un;break;case $y:for(;u<32;){if(o===0)break e;o--,c+=n[a++]<>>=u&7,u-=u&7,r.mode=Hh;break}for(;u<3;){if(o===0)break e;o--,c+=n[a++]<>>=1,u-=1,c&3){case 0:r.mode=Ly;break;case 1:if(bM(r),r.mode=Wc,t===Vc){c>>>=2,u-=2;break e}break;case 2:r.mode=Ny;break;case 3:e.msg="invalid block type",r.mode=Be}c>>>=2,u-=2;break;case Ly:for(c>>>=u&7,u-=u&7;u<32;){if(o===0)break e;o--,c+=n[a++]<>>16^65535)){e.msg="invalid stored block lengths",r.mode=Be;break}if(r.length=c&65535,c=0,u=0,r.mode=jh,t===Vc)break e;case jh:r.mode=Dy;case Dy:if(h=r.length,h){if(h>o&&(h=o),h>l&&(h=l),h===0)break e;hr.arraySet(i,n,a,h,s),o-=h,a+=h,l-=h,s+=h,r.length-=h;break}r.mode=Un;break;case Ny:for(;u<14;){if(o===0)break e;o--,c+=n[a++]<>>=5,u-=5,r.ndist=(c&31)+1,c>>>=5,u-=5,r.ncode=(c&15)+4,c>>>=4,u-=4,r.nlen>286||r.ndist>30){e.msg="too many length or distance symbols",r.mode=Be;break}r.have=0,r.mode=By;case By:for(;r.have>>=3,u-=3}for(;r.have<19;)r.lens[I[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,T={bits:r.lenbits},A=Ko(lM,r.lens,0,19,r.lencode,0,r.work,T),r.lenbits=T.bits,A){e.msg="invalid code lengths set",r.mode=Be;break}r.have=0,r.mode=jy;case jy:for(;r.have>>24,b=v>>>16&255,x=v&65535,!(y<=u);){if(o===0)break e;o--,c+=n[a++]<>>=y,u-=y,r.lens[r.have++]=x;else{if(x===16){for(P=y+2;u>>=y,u-=y,r.have===0){e.msg="invalid bit length repeat",r.mode=Be;break}w=r.lens[r.have-1],h=3+(c&3),c>>>=2,u-=2}else if(x===17){for(P=y+3;u>>=y,u-=y,w=0,h=3+(c&7),c>>>=3,u-=3}else{for(P=y+7;u>>=y,u-=y,w=0,h=11+(c&127),c>>>=7,u-=7}if(r.have+h>r.nlen+r.ndist){e.msg="invalid bit length repeat",r.mode=Be;break}for(;h--;)r.lens[r.have++]=w}}if(r.mode===Be)break;if(r.lens[256]===0){e.msg="invalid code -- missing end-of-block",r.mode=Be;break}if(r.lenbits=9,T={bits:r.lenbits},A=Ko(Zy,r.lens,0,r.nlen,r.lencode,0,r.work,T),r.lenbits=T.bits,A){e.msg="invalid literal/lengths set",r.mode=Be;break}if(r.distbits=6,r.distcode=r.distdyn,T={bits:r.distbits},A=Ko(Ky,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,T),r.distbits=T.bits,A){e.msg="invalid distances set",r.mode=Be;break}if(r.mode=Wc,t===Vc)break e;case Wc:r.mode=qc;case qc:if(o>=6&&l>=258){e.next_out=s,e.avail_out=l,e.next_in=a,e.avail_in=o,r.hold=c,r.bits=u,oM(e,d),s=e.next_out,i=e.output,l=e.avail_out,a=e.next_in,n=e.input,o=e.avail_in,c=r.hold,u=r.bits,r.mode===Un&&(r.back=-1);break}for(r.back=0;v=r.lencode[c&(1<>>24,b=v>>>16&255,x=v&65535,!(y<=u);){if(o===0)break e;o--,c+=n[a++]<>E)],y=v>>>24,b=v>>>16&255,x=v&65535,!(E+y<=u);){if(o===0)break e;o--,c+=n[a++]<>>=E,u-=E,r.back+=E}if(c>>>=y,u-=y,r.back+=y,r.length=x,b===0){r.mode=Vy;break}if(b&32){r.back=-1,r.mode=Un;break}if(b&64){e.msg="invalid literal/length code",r.mode=Be;break}r.extra=b&15,r.mode=Hy;case Hy:if(r.extra){for(P=r.extra;u>>=r.extra,u-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=Uy;case Uy:for(;v=r.distcode[c&(1<>>24,b=v>>>16&255,x=v&65535,!(y<=u);){if(o===0)break e;o--,c+=n[a++]<>E)],y=v>>>24,b=v>>>16&255,x=v&65535,!(E+y<=u);){if(o===0)break e;o--,c+=n[a++]<>>=E,u-=E,r.back+=E}if(c>>>=y,u-=y,r.back+=y,b&64){e.msg="invalid distance code",r.mode=Be;break}r.offset=x,r.extra=b&15,r.mode=Gy;case Gy:if(r.extra){for(P=r.extra;u>>=r.extra,u-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg="invalid distance too far back",r.mode=Be;break}r.mode=zy;case zy:if(l===0)break e;if(h=d-l,r.offset>h){if(h=r.offset-h,h>r.whave&&r.sane){e.msg="invalid distance too far back",r.mode=Be;break}h>r.wnext?(h-=r.wnext,p=r.wsize-h):p=r.wnext-h,h>r.length&&(h=r.length),m=r.window}else m=i,p=s-r.offset,h=r.length;h>l&&(h=l),l-=h,r.length-=h;do i[s++]=m[p++];while(--h);r.length===0&&(r.mode=qc);break;case Vy:if(l===0)break e;i[s++]=r.length,l--,r.mode=qc;break;case Hh:if(r.wrap){for(;u<32;){if(o===0)break e;o--,c|=n[a++]<{"use strict";g();sw.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}});var lw=F((DU,ow)=>{"use strict";g();function AM(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}ow.exports=AM});var uw=F(Qo=>{"use strict";g();var cs=aw(),Jo=Bn(),Xc=Oh(),nt=qh(),Yh=Lc(),kM=Ih(),TM=lw(),cw=Object.prototype.toString;function oa(e){if(!(this instanceof oa))return new oa(e);this.options=Jo.assign({chunkSize:16384,windowBits:0,to:""},e||{});var t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,t.windowBits===0&&(t.windowBits=-15)),t.windowBits>=0&&t.windowBits<16&&!(e&&e.windowBits)&&(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&(t.windowBits&15||(t.windowBits|=15)),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new kM,this.strm.avail_out=0;var r=cs.inflateInit2(this.strm,t.windowBits);if(r!==nt.Z_OK)throw new Error(Yh[r]);if(this.header=new TM,cs.inflateGetHeader(this.strm,this.header),t.dictionary&&(typeof t.dictionary=="string"?t.dictionary=Xc.string2buf(t.dictionary):cw.call(t.dictionary)==="[object ArrayBuffer]"&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(r=cs.inflateSetDictionary(this.strm,t.dictionary),r!==nt.Z_OK)))throw new Error(Yh[r])}oa.prototype.push=function(e,t){var r=this.strm,n=this.options.chunkSize,i=this.options.dictionary,a,s,o,l,c,u=!1;if(this.ended)return!1;s=t===~~t?t:t===!0?nt.Z_FINISH:nt.Z_NO_FLUSH,typeof e=="string"?r.input=Xc.binstring2buf(e):cw.call(e)==="[object ArrayBuffer]"?r.input=new Uint8Array(e):r.input=e,r.next_in=0,r.avail_in=r.input.length;do{if(r.avail_out===0&&(r.output=new Jo.Buf8(n),r.next_out=0,r.avail_out=n),a=cs.inflate(r,nt.Z_NO_FLUSH),a===nt.Z_NEED_DICT&&i&&(a=cs.inflateSetDictionary(this.strm,i)),a===nt.Z_BUF_ERROR&&u===!0&&(a=nt.Z_OK,u=!1),a!==nt.Z_STREAM_END&&a!==nt.Z_OK)return this.onEnd(a),this.ended=!0,!1;r.next_out&&(r.avail_out===0||a===nt.Z_STREAM_END||r.avail_in===0&&(s===nt.Z_FINISH||s===nt.Z_SYNC_FLUSH))&&(this.options.to==="string"?(o=Xc.utf8border(r.output,r.next_out),l=r.next_out-o,c=Xc.buf2string(r.output,o),r.next_out=l,r.avail_out=n-l,l&&Jo.arraySet(r.output,r.output,o,l,0),this.onData(c)):this.onData(Jo.shrinkBuf(r.output,r.next_out))),r.avail_in===0&&r.avail_out===0&&(u=!0)}while((r.avail_in>0||r.avail_out===0)&&a!==nt.Z_STREAM_END);return a===nt.Z_STREAM_END&&(s=nt.Z_FINISH),s===nt.Z_FINISH?(a=cs.inflateEnd(this.strm),this.onEnd(a),this.ended=!0,a===nt.Z_OK):(s===nt.Z_SYNC_FLUSH&&(this.onEnd(nt.Z_OK),r.avail_out=0),!0)};oa.prototype.onData=function(e){this.chunks.push(e)};oa.prototype.onEnd=function(e){e===nt.Z_OK&&(this.options.to==="string"?this.result=this.chunks.join(""):this.result=Jo.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg};function Xh(e,t){var r=new oa(t);if(r.push(e,!0),r.err)throw r.msg||Yh[r.err];return r.result}function CM(e,t){return t=t||{},t.raw=!0,Xh(e,t)}Qo.Inflate=oa;Qo.inflate=Xh;Qo.inflateRaw=CM;Qo.ungzip=Xh});var hw=F((HU,dw)=>{"use strict";g();var PM=Bn().assign,RM=my(),MM=uw(),OM=qh(),fw={};PM(fw,RM,MM,OM);dw.exports=fw});var gw=F((GU,mw)=>{"use strict";g();var pw=(e,t)=>function(...r){let n=t.promiseModule;return new n((i,a)=>{t.multiArgs?r.push((...s)=>{t.errorFirst?s[0]?a(s):(s.shift(),i(s)):i(s)}):t.errorFirst?r.push((s,o)=>{s?a(s):i(o)}):r.push(i),e.apply(this,r)})};mw.exports=(e,t)=>{t=Object.assign({exclude:[/.+(Sync|Stream)$/],errorFirst:!0,promiseModule:Promise},t);let r=typeof e;if(!(e!==null&&(r==="object"||r==="function")))throw new TypeError(`Expected \`input\` to be a \`Function\` or \`Object\`, got \`${e===null?"null":r}\``);let n=a=>{let s=o=>typeof o=="string"?a===o:o.test(a);return t.include?t.include.some(s):!t.exclude.some(s)},i;r==="function"?i=function(...a){return t.excludeMain?e(...a):pw(e,t).apply(this,a)}:i=Object.create(Object.getPrototypeOf(e));for(let a in e){let s=e[a];i[a]=typeof s=="function"&&n(a)?pw(s,t):s}return i}});var Aw=F((VU,Ew)=>{g();function vw(e){return Array.isArray(e)?e:[e]}var Jh="",yw=" ",Zh="\\",IM=/^\s+$/,FM=/(?:[^\\]|^)\\$/,$M=/^\\!/,LM=/^\\#/,DM=/\r?\n/g,NM=/^\.*\/|^\.+$/,Kh="/",_w="node-ignore";typeof Symbol!="undefined"&&(_w=Symbol.for("node-ignore"));var ww=_w,BM=(e,t,r)=>Object.defineProperty(e,t,{value:r}),jM=/([0-z])-([0-z])/g,xw=()=>!1,HM=e=>e.replace(jM,(t,r,n)=>r.charCodeAt(0)<=n.charCodeAt(0)?t:Jh),UM=e=>{let{length:t}=e;return e.slice(0,t-t%2)},GM=[[/^\uFEFF/,()=>Jh],[/((?:\\\\)*?)(\\?\s+)$/,(e,t,r)=>t+(r.indexOf("\\")===0?yw:Jh)],[/(\\+?)\s/g,(e,t)=>{let{length:r}=t;return t.slice(0,r-r%2)+yw}],[/[\\$.|*+(){^]/g,e=>`\\${e}`],[/(?!\\)\?/g,()=>"[^/]"],[/^\//,()=>"^"],[/\//g,()=>"\\/"],[/^\^*\\\*\\\*\\\//,()=>"^(?:.*\\/)?"],[/^(?=[^^])/,function(){return/\/(?!$)/.test(this)?"^":"(?:^|\\/)"}],[/\\\/\\\*\\\*(?=\\\/|$)/g,(e,t,r)=>t+6{let n=r.replace(/\\\*/g,"[^\\/]*");return t+n}],[/\\\\\\(?=[$.|*+(){^])/g,()=>Zh],[/\\\\/g,()=>Zh],[/(\\)?\[([^\]/]*?)(\\*)($|\])/g,(e,t,r,n,i)=>t===Zh?`\\[${r}${UM(n)}${i}`:i==="]"&&n.length%2===0?`[${HM(r)}${n}]`:"[]"],[/(?:[^*])$/,e=>/\/$/.test(e)?`${e}$`:`${e}(?=$|\\/$)`],[/(\^|\\\/)?\\\*$/,(e,t)=>`${t?`${t}[^/]+`:"[^/]*"}(?=$|\\/$)`]],bw=Object.create(null),zM=(e,t)=>{let r=bw[e];return r||(r=GM.reduce((n,[i,a])=>n.replace(i,a.bind(e)),e),bw[e]=r),t?new RegExp(r,"i"):new RegExp(r)},tp=e=>typeof e=="string",VM=e=>e&&tp(e)&&!IM.test(e)&&!FM.test(e)&&e.indexOf("#")!==0,WM=e=>e.split(DM),Qh=class{constructor(t,r,n,i){this.origin=t,this.pattern=r,this.negative=n,this.regex=i}},qM=(e,t)=>{let r=e,n=!1;e.indexOf("!")===0&&(n=!0,e=e.substr(1)),e=e.replace($M,"!").replace(LM,"#");let i=zM(e,t);return new Qh(r,e,n,i)},YM=(e,t)=>{throw new t(e)},Gn=(e,t,r)=>tp(e)?e?Gn.isNotRelative(e)?r(`path should be a \`path.relative()\`d string, but got "${t}"`,RangeError):!0:r("path must not be empty",TypeError):r(`path must be a string, but got \`${t}\``,TypeError),Sw=e=>NM.test(e);Gn.isNotRelative=Sw;Gn.convert=e=>e;var ep=class{constructor({ignorecase:t=!0,ignoreCase:r=t,allowRelativePaths:n=!1}={}){BM(this,ww,!0),this._rules=[],this._ignoreCase=r,this._allowRelativePaths=n,this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}_addPattern(t){if(t&&t[ww]){this._rules=this._rules.concat(t._rules),this._added=!0;return}if(VM(t)){let r=qM(t,this._ignoreCase);this._added=!0,this._rules.push(r)}}add(t){return this._added=!1,vw(tp(t)?WM(t):t).forEach(this._addPattern,this),this._added&&this._initCache(),this}addPattern(t){return this.add(t)}_testOne(t,r){let n=!1,i=!1;return this._rules.forEach(a=>{let{negative:s}=a;if(i===s&&n!==i||s&&!n&&!i&&!r)return;a.regex.test(t)&&(n=!s,i=s)}),{ignored:n,unignored:i}}_test(t,r,n,i){let a=t&&Gn.convert(t);return Gn(a,t,this._allowRelativePaths?xw:YM),this._t(a,r,n,i)}_t(t,r,n,i){if(t in r)return r[t];if(i||(i=t.split(Kh)),i.pop(),!i.length)return r[t]=this._testOne(t,n);let a=this._t(i.join(Kh)+Kh,r,n,i);return r[t]=a.ignored?a:this._testOne(t,n)}ignores(t){return this._test(t,this._ignoreCache,!1).ignored}createFilter(){return t=>!this.ignores(t)}filter(t){return vw(t).filter(this.createFilter())}test(t){return this._test(t,this._testCache,!0)}},Zc=e=>new ep(e),XM=e=>Gn(e&&Gn.convert(e),e,xw);Zc.isPathValid=XM;Zc.default=Zc;Ew.exports=Zc;if(typeof process!="undefined"&&(process.env&&process.env.IGNORE_TEST_WIN32||process.platform==="win32")){let e=r=>/^\\\\\?\\/.test(r)||/["<>|\u0000-\u001F]+/u.test(r)?r:r.replace(/\\/g,"/");Gn.convert=e;let t=/^[a-z]:\//i;Gn.isNotRelative=r=>t.test(r)||Sw(r)}});var Tw=F((qU,kw)=>{"use strict";g();function ZM(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function _n(e,t,r){return t=t instanceof RegExp?t:new RegExp(ZM(t),"g"),e.replace(t,r)}var KM={clean:function(t){if(typeof t!="string")throw new Error("Expected a string, received: "+t);return t=_n(t,"./","/"),t=_n(t,"..","."),t=_n(t," ","-"),t=_n(t,/^[~^:?*\\\-]/g,""),t=_n(t,/[~^:?*\\]/g,"-"),t=_n(t,/[~^:?*\\\-]$/g,""),t=_n(t,"@{","-"),t=_n(t,/\.$/g,""),t=_n(t,/\/$/g,""),t=_n(t,/\.lock$/g,""),t}};kw.exports=KM});var Pw=F((XU,Cw)=>{g();Cw.exports=function(e,t){var r=e,n=t,i=r.length,a=n.length,s=!1,o=null,l=i+1,c=[],u=[],f=[],d="",h=-1,p=0,m=1,v,y,b=function(){i>=a&&(v=r,y=i,r=n,n=v,i=a,a=y,s=!0,l=i+1)},x=function(w,A,S){return{x:w,y:A,k:S}},E=function(w,A){return{elem:w,t:A}},_=function(w,A,S){var T,P,I;for(A>S?T=c[w-1+l]:T=c[w+1+l],I=Math.max(A,S),P=I-w;P=0;--I)for(;TP-T?(s?f[f.length]=new E(n[P],h):f[f.length]=new E(n[P],m),++S,++P):w[I].y-w[I].x=w+1;--L)S[L+l]=_(L,S[L-1+l]+1,S[L+1+l]);S[w+l]=_(w,S[w-1+l]+1,S[w+1+l])}while(S[w+l]!==a);for(o=w+2*T,P=c[w+l],I=[];P!==-1;)I[I.length]=new x(u[P].x,u[P].y,null),P=u[P].k;k(I)}}}});var Ow=F((KU,Mw)=>{g();var JM=Pw();function QM(e,t){var r=new JM(e,t);r.compose();for(var n=r.getses(),i,a,s=e.length-1,o=t.length-1,l=n.length-1;l>=0;--l)n[l].t===r.SES_COMMON?(a?(a.chain={file1index:s,file2index:o,chain:null},a=a.chain):(i={file1index:s,file2index:o,chain:null},a=i),s--,o--):n[l].t===r.SES_DELETE?s--:n[l].t===r.SES_ADD&&o--;var c={file1index:-1,file2index:-1,chain:null};return a?(a.chain=c,i):c}function Rw(e,t){for(var r=[],n=e.length,i=t.length,a=QM(e,t);a!==null;a=a.chain){var s=n-a.file1index-1,o=i-a.file2index-1;n=a.file1index,i=a.file2index,(s||o)&&r.push({file1:[n+1,s],file2:[i+1,o]})}return r.reverse(),r}function e6(e,t,r){var n,i=Rw(t,e),a=Rw(t,r),s=[];function o(N,L){s.push([N.file1[0],L,N.file1[1],N.file2[0],N.file2[1]])}for(n=0;nc&&(l.push([1,c,N-c]),c=N)}for(var f=0;fm)break;m=Math.max(m,y+v[2]),f++}if(u(p),d==f)h[4]>0&&l.push([h[1],h[3],h[4]]);else{var b={0:[e.length,-1,t.length,-1],2:[r.length,-1,t.length,-1]};for(n=d;n<=f;n++){h=s[n];var x=h[1],E=b[x],_=h[0],k=_+h[2],w=h[3],A=w+h[4];E[0]=Math.min(w,E[0]),E[1]=Math.max(A,E[1]),E[2]=Math.min(_,E[2]),E[3]=Math.max(k,E[3])}var S=b[0][0]+(p-b[0][2]),T=b[0][1]+(m-b[0][3]),P=b[2][0]+(p-b[2][2]),I=b[2][1]+(m-b[2][3]);l.push([-1,S,T-S,p,m-p,P,I-P])}c=m}return u(t.length),l}function t6(e,t,r){var n=[],i=[e,t,r],a=e6(e,t,r),s=[];function o(){s.length&&n.push({ok:s}),s=[]}function l(h){for(var p=0;p{g();var Ts=1e3,Cs=Ts*60,Ps=Cs*60,pa=Ps*24,i8=pa*7,a8=pa*365.25;$2.exports=function(e,t){t=t||{};var r=typeof e;if(r==="string"&&e.length>0)return s8(e);if(r==="number"&&isFinite(e))return t.long?l8(e):o8(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))};function s8(e){if(e=String(e),!(e.length>100)){var t=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(e);if(t){var r=parseFloat(t[1]),n=(t[2]||"ms").toLowerCase();switch(n){case"years":case"year":case"yrs":case"yr":case"y":return r*a8;case"weeks":case"week":case"w":return r*i8;case"days":case"day":case"d":return r*pa;case"hours":case"hour":case"hrs":case"hr":case"h":return r*Ps;case"minutes":case"minute":case"mins":case"min":case"m":return r*Cs;case"seconds":case"second":case"secs":case"sec":case"s":return r*Ts;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return r;default:return}}}}function o8(e){var t=Math.abs(e);return t>=pa?Math.round(e/pa)+"d":t>=Ps?Math.round(e/Ps)+"h":t>=Cs?Math.round(e/Cs)+"m":t>=Ts?Math.round(e/Ts)+"s":e+"ms"}function l8(e){var t=Math.abs(e);return t>=pa?vu(e,t,pa,"day"):t>=Ps?vu(e,t,Ps,"hour"):t>=Cs?vu(e,t,Cs,"minute"):t>=Ts?vu(e,t,Ts,"second"):e+" ms"}function vu(e,t,r,n){var i=t>=r*1.5;return Math.round(e/r)+" "+n+(i?"s":"")}});var N2=F((sG,D2)=>{g();function c8(e){r.debug=r,r.default=r,r.coerce=l,r.disable=a,r.enable=i,r.enabled=s,r.humanize=L2(),r.destroy=c,Object.keys(e).forEach(u=>{r[u]=e[u]}),r.names=[],r.skips=[],r.formatters={};function t(u){let f=0;for(let d=0;d{if(k==="%%")return"%";E++;let A=r.formatters[w];if(typeof A=="function"){let S=v[E];k=A.call(y,S),v.splice(E,1),E--}return k}),r.formatArgs.call(y,v),(y.log||r.log).apply(y,v)}return m.namespace=u,m.useColors=r.useColors(),m.color=r.selectColor(u),m.extend=n,m.destroy=r.destroy,Object.defineProperty(m,"enabled",{enumerable:!0,configurable:!1,get:()=>d!==null?d:(h!==r.namespaces&&(h=r.namespaces,p=r.enabled(u)),p),set:v=>{d=v}}),typeof r.init=="function"&&r.init(m),m}function n(u,f){let d=r(this.namespace+(typeof f=="undefined"?":":f)+u);return d.log=this.log,d}function i(u){r.save(u),r.namespaces=u,r.names=[],r.skips=[];let f,d=(typeof u=="string"?u:"").split(/[\s,]+/),h=d.length;for(f=0;f"-"+f)].join(",");return r.enable(""),u}function s(u){if(u[u.length-1]==="*")return!0;let f,d;for(f=0,d=r.skips.length;f{g();gr.formatArgs=f8;gr.save=d8;gr.load=h8;gr.useColors=u8;gr.storage=p8();gr.destroy=(()=>{let e=!1;return()=>{e||(e=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})();gr.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function u8(){if(typeof window!="undefined"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs))return!0;if(typeof navigator!="undefined"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let e;return typeof document!="undefined"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window!="undefined"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator!="undefined"&&navigator.userAgent&&(e=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(e[1],10)>=31||typeof navigator!="undefined"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function f8(e){if(e[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+e[0]+(this.useColors?"%c ":" ")+"+"+yu.exports.humanize(this.diff),!this.useColors)return;let t="color: "+this.color;e.splice(1,0,t,"color: inherit");let r=0,n=0;e[0].replace(/%[a-zA-Z%]/g,i=>{i!=="%%"&&(r++,i==="%c"&&(n=r))}),e.splice(n,0,t)}gr.log=console.debug||console.log||(()=>{});function d8(e){try{e?gr.storage.setItem("debug",e):gr.storage.removeItem("debug")}catch(t){}}function h8(){let e;try{e=gr.storage.getItem("debug")}catch(t){}return!e&&typeof process!="undefined"&&"env"in process&&(e=process.env.DEBUG),e}function p8(){try{return localStorage}catch(e){}}yu.exports=N2()(gr);var{formatters:m8}=yu.exports;m8.j=function(e){try{return JSON.stringify(e)}catch(t){return"[UnexpectedJSONParseError]: "+t.message}}});var B2=F(vr=>{"use strict";g();var g8=vr&&vr.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(vr,"__esModule",{value:!0});var v8=require("fs"),y8=g8(wu()),Rs=y8.default("@kwsites/file-exists");function w8(e,t,r){Rs("checking %s",e);try{let n=v8.statSync(e);return n.isFile()&&t?(Rs("[OK] path represents a file"),!0):n.isDirectory()&&r?(Rs("[OK] path represents a directory"),!0):(Rs("[FAIL] path represents something other than a file or directory"),!1)}catch(n){if(n.code==="ENOENT")return Rs("[FAIL] path is not accessible: %o",n),!1;throw Rs("[FATAL] %o",n),n}}function b8(e,t=vr.READABLE){return w8(e,(t&vr.FILE)>0,(t&vr.FOLDER)>0)}vr.exists=b8;vr.FILE=1;vr.FOLDER=2;vr.READABLE=vr.FILE+vr.FOLDER});var j2=F(bu=>{"use strict";g();function _8(e){for(var t in e)bu.hasOwnProperty(t)||(bu[t]=e[t])}Object.defineProperty(bu,"__esModule",{value:!0});_8(B2())});var Mp=F(ma=>{"use strict";g();Object.defineProperty(ma,"__esModule",{value:!0});ma.createDeferred=ma.deferred=void 0;function Rp(){let e,t,r="pending";return{promise:new Promise((i,a)=>{e=i,t=a}),done(i){r==="pending"&&(r="resolved",e(i))},fail(i){r==="pending"&&(r="rejected",t(i))},get fulfilled(){return r!=="pending"},get status(){return r}}}ma.deferred=Rp;ma.createDeferred=Rp;ma.default=Rp});var Px=F((JG,Cx)=>{"use strict";g();Cx.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});var Mx=F((ez,Rx)=>{g();var Sm={px:{px:1,cm:37.79527559055118,mm:3.7795275590551185,in:96,pt:1.3333333333333333,pc:16},cm:{px:.026458333333333334,cm:1,mm:.1,in:2.54,pt:.035277777777777776,pc:.42333333333333334},mm:{px:.26458333333333334,cm:10,mm:1,in:25.4,pt:.35277777777777775,pc:4.233333333333333},in:{px:.010416666666666666,cm:.39370078740157477,mm:.03937007874015748,in:1,pt:.013888888888888888,pc:.16666666666666666},pt:{px:.75,cm:28.346456692913385,mm:2.834645669291339,in:72,pt:1,pc:12},pc:{px:.0625,cm:2.3622047244094486,mm:.2362204724409449,in:6,pt:.08333333333333333,pc:1},deg:{deg:1,grad:.9,rad:180/Math.PI,turn:360},grad:{deg:1.1111111111111112,grad:1,rad:200/Math.PI,turn:400},rad:{deg:Math.PI/180,grad:Math.PI/200,rad:1,turn:Math.PI*2},turn:{deg:.002777777777777778,grad:.0025,rad:.5/Math.PI,turn:1},s:{s:1,ms:.001},ms:{s:1e3,ms:1},Hz:{Hz:1,kHz:1e3},kHz:{Hz:.001,kHz:1},dpi:{dpi:1,dpcm:.39370078740157477,dppx:.010416666666666666},dpcm:{dpi:2.54,dpcm:1,dppx:.026458333333333334},dppx:{dpi:96,dpcm:37.79527559055118,dppx:1}};Rx.exports=function(e,t,r,n){if(!Sm.hasOwnProperty(r))throw new Error("Cannot convert to "+r);if(!Sm[r].hasOwnProperty(t))throw new Error("Cannot convert from "+t+" to "+r);var i=Sm[r][t]*e;return n!==!1?(n=Math.pow(10,parseInt(n)||5),Math.round(i*n)/n):i}});var Vx=F(Yn=>{"use strict";g();Object.defineProperty(Yn,"__esModule",{value:!0});Yn.fromRgba=Ls;Yn.fromRgb=Em;Yn.fromHsla=Vu;Yn.fromHsl=Gx;Yn.fromString=zx;Yn.default=void 0;var Ox=$x(Px()),I$=$x(Mx());function $x(e){return e&&e.__esModule?e:{default:e}}function F$(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Ix(e,t){for(var r=0;re.length)&&(t=e.length);for(var r=0,n=new Array(t);r-1}function j$(e,t,r){var n=e/255,i=t/255,a=r/255,s=Math.max(n,i,a),o=Math.min(n,i,a),l=s-o,c=(s+o)/2;if(l===0)return[0,0,c*100];var u=l/(1-Math.abs(2*c-1)),f=function(){switch(s){case n:return(i-a)/l%6;case i:return(a-n)/l+2;default:return(n-i)/l+4}}();return[f*60,u*100,c*100]}function H$(e,t,r){var n=e/60,i=t/100,a=r/100,s=(1-Math.abs(2*a-1))*i,o=s*(1-Math.abs(n%2-1)),l=a-s/2,c=function(){return n<1?[s,o,0]:n<2?[o,s,0]:n<3?[0,s,o]:n<4?[0,o,s]:n<5?[o,0,s]:[s,0,o]}(),u=qt(c,3),f=u[0],d=u[1],h=u[2];return[(f+l)*255,(d+l)*255,(h+l)*255]}var U$=function(){function e(t){var r=qt(t,4),n=r[0],i=r[1],a=r[2],s=r[3];F$(this,e),this.values=[Math.max(Math.min(parseInt(n,10),255),0),Math.max(Math.min(parseInt(i,10),255),0),Math.max(Math.min(parseInt(a,10),255),0),s==null?1:Math.max(Math.min(parseFloat(s),255),0)]}return $$(e,[{key:"toRgbString",value:function(){var r=qt(this.values,4),n=r[0],i=r[1],a=r[2],s=r[3];return s===1?"rgb(".concat(n,", ").concat(i,", ").concat(a,")"):"rgba(".concat(n,", ").concat(i,", ").concat(a,", ").concat(s,")")}},{key:"toHslString",value:function(){var r=this.toHslaArray(),n=qt(r,4),i=n[0],a=n[1],s=n[2],o=n[3];return o===1?"hsl(".concat(i,", ").concat(a,"%, ").concat(s,"%)"):"hsla(".concat(i,", ").concat(a,"%, ").concat(s,"%, ").concat(o,")")}},{key:"toHexString",value:function(){var r=qt(this.values,4),n=r[0],i=r[1],a=r[2],s=r[3];return n=Number(n).toString(16).padStart(2,"0"),i=Number(i).toString(16).padStart(2,"0"),a=Number(a).toString(16).padStart(2,"0"),s=s<1?parseInt(s*255,10).toString(16).padStart(2,"0"):"","#".concat(n).concat(i).concat(a).concat(s)}},{key:"toRgbaArray",value:function(){return this.values}},{key:"toHslaArray",value:function(){var r=qt(this.values,4),n=r[0],i=r[1],a=r[2],s=r[3],o=j$(n,i,a),l=qt(o,3),c=l[0],u=l[1],f=l[2];return[c,u,f,s]}}]),e}();function Ls(e){var t=qt(e,4),r=t[0],n=t[1],i=t[2],a=t[3];return new U$([r,n,i,a])}function Em(e){var t=qt(e,3),r=t[0],n=t[1],i=t[2];return Ls([r,n,i,1])}function Vu(e){var t=qt(e,4),r=t[0],n=t[1],i=t[2],a=t[3],s=H$(r,n,i),o=qt(s,3),l=o[0],c=o[1],u=o[2];return Ls([l,c,u,a])}function Gx(e){var t=qt(e,3),r=t[0],n=t[1],i=t[2];return Vu([r,n,i,1])}function G$(e){var t=Lx.exec(e)||Dx.exec(e),r=qt(t,5),n=r[1],i=r[2],a=r[3],s=r[4];return n=parseInt(n.length<2?n.repeat(2):n,16),i=parseInt(i.length<2?i.repeat(2):i,16),a=parseInt(a.length<2?a.repeat(2):a,16),s=s&&(parseInt(s.length<2?s.repeat(2):s,16)/255).toPrecision(1)||1,Ls([n,i,a,s])}function z$(e){var t=Nx.exec(e)||jx.exec(e)||Bx.exec(e)||Hx.exec(e),r=qt(t,5),n=r[1],i=r[2],a=r[3],s=r[4];return n=$l(n,"%")?parseInt(n,10)*255/100:parseInt(n,10),i=$l(i,"%")?parseInt(i,10)*255/100:parseInt(i,10),a=$l(a,"%")>0?parseInt(a,10)*255/100:parseInt(a,10),s=s===void 0?1:parseFloat(s)/($l(s,"%")?100:1),Ls([n,i,a,s])}function V$(e){var t=Ux.exec(e),r=qt(t,6),n=r[1],i=r[2],a=r[3],s=r[4],o=r[5];return i=i||"deg",n=(0,I$.default)(parseFloat(n),i,"deg"),a=parseFloat(a),s=parseFloat(s),o=o===void 0?1:parseFloat(o)/($l(o,"%")?100:1),Vu([n,a,s,o])}function zx(e){return Ox.default[e]?Em(Ox.default[e]):Lx.test(e)||Dx.test(e)?G$(e):Nx.test(e)||jx.test(e)||Bx.test(e)||Hx.test(e)?z$(e):Ux.test(e)?V$(e):null}var W$={fromString:zx,fromRgb:Em,fromRgba:Ls,fromHsl:Gx,fromHsla:Vu};Yn.default=W$});var Am=F((iz,qx)=>{"use strict";g();var Wx=Object.prototype.toString;qx.exports=function(t){var r=Wx.call(t),n=r==="[object Arguments]";return n||(n=r!=="[object Array]"&&t!==null&&typeof t=="object"&&typeof t.length=="number"&&t.length>=0&&Wx.call(t.callee)==="[object Function]"),n}});var rS=F((sz,tS)=>{"use strict";g();var eS;Object.keys||(Ll=Object.prototype.hasOwnProperty,km=Object.prototype.toString,Yx=Am(),Tm=Object.prototype.propertyIsEnumerable,Xx=!Tm.call({toString:null},"toString"),Zx=Tm.call(function(){},"prototype"),Dl=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],Wu=function(e){var t=e.constructor;return t&&t.prototype===e},Kx={$applicationCache:!0,$console:!0,$external:!0,$frame:!0,$frameElement:!0,$frames:!0,$innerHeight:!0,$innerWidth:!0,$onmozfullscreenchange:!0,$onmozfullscreenerror:!0,$outerHeight:!0,$outerWidth:!0,$pageXOffset:!0,$pageYOffset:!0,$parent:!0,$scrollLeft:!0,$scrollTop:!0,$scrollX:!0,$scrollY:!0,$self:!0,$webkitIndexedDB:!0,$webkitStorageInfo:!0,$window:!0},Jx=function(){if(typeof window=="undefined")return!1;for(var e in window)try{if(!Kx["$"+e]&&Ll.call(window,e)&&window[e]!==null&&typeof window[e]=="object")try{Wu(window[e])}catch(t){return!0}}catch(t){return!0}return!1}(),Qx=function(e){if(typeof window=="undefined"||!Jx)return Wu(e);try{return Wu(e)}catch(t){return!1}},eS=function(t){var r=t!==null&&typeof t=="object",n=km.call(t)==="[object Function]",i=Yx(t),a=r&&km.call(t)==="[object String]",s=[];if(!r&&!n&&!i)throw new TypeError("Object.keys called on a non-object");var o=Zx&&n;if(a&&t.length>0&&!Ll.call(t,0))for(var l=0;l0)for(var c=0;c{"use strict";g();var q$=Array.prototype.slice,Y$=Am(),nS=Object.keys,qu=nS?function(t){return nS(t)}:rS(),iS=Object.keys;qu.shim=function(){if(Object.keys){var t=function(){var r=Object.keys(arguments);return r&&r.length===arguments.length}(1,2);t||(Object.keys=function(n){return Y$(n)?iS(q$.call(n)):iS(n)})}else Object.keys=qu;return Object.keys||qu};aS.exports=qu});var oS=F((uz,sS)=>{"use strict";g();sS.exports=Error});var cS=F((dz,lS)=>{"use strict";g();lS.exports=EvalError});var fS=F((pz,uS)=>{"use strict";g();uS.exports=RangeError});var hS=F((gz,dS)=>{"use strict";g();dS.exports=ReferenceError});var Cm=F((yz,pS)=>{"use strict";g();pS.exports=SyntaxError});var Xn=F((bz,mS)=>{"use strict";g();mS.exports=TypeError});var vS=F((xz,gS)=>{"use strict";g();gS.exports=URIError});var Nl=F((Ez,yS)=>{"use strict";g();yS.exports=function(){if(typeof Symbol!="function"||typeof Object.getOwnPropertySymbols!="function")return!1;if(typeof Symbol.iterator=="symbol")return!0;var t={},r=Symbol("test"),n=Object(r);if(typeof r=="string"||Object.prototype.toString.call(r)!=="[object Symbol]"||Object.prototype.toString.call(n)!=="[object Symbol]")return!1;var i=42;t[r]=i;for(r in t)return!1;if(typeof Object.keys=="function"&&Object.keys(t).length!==0||typeof Object.getOwnPropertyNames=="function"&&Object.getOwnPropertyNames(t).length!==0)return!1;var a=Object.getOwnPropertySymbols(t);if(a.length!==1||a[0]!==r||!Object.prototype.propertyIsEnumerable.call(t,r))return!1;if(typeof Object.getOwnPropertyDescriptor=="function"){var s=Object.getOwnPropertyDescriptor(t,r);if(s.value!==i||s.enumerable!==!0)return!1}return!0}});var Xu=F((kz,bS)=>{"use strict";g();var wS=typeof Symbol!="undefined"&&Symbol,X$=Nl();bS.exports=function(){return typeof wS!="function"||typeof Symbol!="function"||typeof wS("foo")!="symbol"||typeof Symbol("bar")!="symbol"?!1:X$()}});var xS=F((Cz,_S)=>{"use strict";g();var Pm={__proto__:null,foo:{}},Z$=Object;_S.exports=function(){return{__proto__:Pm}.foo===Pm.foo&&!(Pm instanceof Z$)}});var AS=F((Rz,ES)=>{"use strict";g();var K$="Function.prototype.bind called on incompatible ",J$=Object.prototype.toString,Q$=Math.max,eL="[object Function]",SS=function(t,r){for(var n=[],i=0;i{"use strict";g();var nL=AS();kS.exports=Function.prototype.bind||nL});var Rm=F((Fz,TS)=>{"use strict";g();var iL=Function.prototype.call,aL=Object.prototype.hasOwnProperty,sL=Zu();TS.exports=sL.call(iL,aL)});var tn=F((Lz,OS)=>{"use strict";g();var we,oL=oS(),lL=cS(),cL=fS(),uL=hS(),js=Cm(),Bs=Xn(),fL=vS(),MS=Function,Mm=function(e){try{return MS('"use strict"; return ('+e+").constructor;")()}catch(t){}},ba=Object.getOwnPropertyDescriptor;if(ba)try{ba({},"")}catch(e){ba=null}var Om=function(){throw new Bs},dL=ba?function(){try{return arguments.callee,Om}catch(e){try{return ba(arguments,"callee").get}catch(t){return Om}}}():Om,Ds=Xu()(),hL=xS()(),xt=Object.getPrototypeOf||(hL?function(e){return e.__proto__}:null),Ns={},pL=typeof Uint8Array=="undefined"||!xt?we:xt(Uint8Array),_a={__proto__:null,"%AggregateError%":typeof AggregateError=="undefined"?we:AggregateError,"%Array%":Array,"%ArrayBuffer%":typeof ArrayBuffer=="undefined"?we:ArrayBuffer,"%ArrayIteratorPrototype%":Ds&&xt?xt([][Symbol.iterator]()):we,"%AsyncFromSyncIteratorPrototype%":we,"%AsyncFunction%":Ns,"%AsyncGenerator%":Ns,"%AsyncGeneratorFunction%":Ns,"%AsyncIteratorPrototype%":Ns,"%Atomics%":typeof Atomics=="undefined"?we:Atomics,"%BigInt%":typeof BigInt=="undefined"?we:BigInt,"%BigInt64Array%":typeof BigInt64Array=="undefined"?we:BigInt64Array,"%BigUint64Array%":typeof BigUint64Array=="undefined"?we:BigUint64Array,"%Boolean%":Boolean,"%DataView%":typeof DataView=="undefined"?we:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":oL,"%eval%":eval,"%EvalError%":lL,"%Float32Array%":typeof Float32Array=="undefined"?we:Float32Array,"%Float64Array%":typeof Float64Array=="undefined"?we:Float64Array,"%FinalizationRegistry%":typeof FinalizationRegistry=="undefined"?we:FinalizationRegistry,"%Function%":MS,"%GeneratorFunction%":Ns,"%Int8Array%":typeof Int8Array=="undefined"?we:Int8Array,"%Int16Array%":typeof Int16Array=="undefined"?we:Int16Array,"%Int32Array%":typeof Int32Array=="undefined"?we:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":Ds&&xt?xt(xt([][Symbol.iterator]())):we,"%JSON%":typeof JSON=="object"?JSON:we,"%Map%":typeof Map=="undefined"?we:Map,"%MapIteratorPrototype%":typeof Map=="undefined"||!Ds||!xt?we:xt(new Map()[Symbol.iterator]()),"%Math%":Math,"%Number%":Number,"%Object%":Object,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":typeof Promise=="undefined"?we:Promise,"%Proxy%":typeof Proxy=="undefined"?we:Proxy,"%RangeError%":cL,"%ReferenceError%":uL,"%Reflect%":typeof Reflect=="undefined"?we:Reflect,"%RegExp%":RegExp,"%Set%":typeof Set=="undefined"?we:Set,"%SetIteratorPrototype%":typeof Set=="undefined"||!Ds||!xt?we:xt(new Set()[Symbol.iterator]()),"%SharedArrayBuffer%":typeof SharedArrayBuffer=="undefined"?we:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":Ds&&xt?xt(""[Symbol.iterator]()):we,"%Symbol%":Ds?Symbol:we,"%SyntaxError%":js,"%ThrowTypeError%":dL,"%TypedArray%":pL,"%TypeError%":Bs,"%Uint8Array%":typeof Uint8Array=="undefined"?we:Uint8Array,"%Uint8ClampedArray%":typeof Uint8ClampedArray=="undefined"?we:Uint8ClampedArray,"%Uint16Array%":typeof Uint16Array=="undefined"?we:Uint16Array,"%Uint32Array%":typeof Uint32Array=="undefined"?we:Uint32Array,"%URIError%":fL,"%WeakMap%":typeof WeakMap=="undefined"?we:WeakMap,"%WeakRef%":typeof WeakRef=="undefined"?we:WeakRef,"%WeakSet%":typeof WeakSet=="undefined"?we:WeakSet};if(xt)try{null.error}catch(e){CS=xt(xt(e)),_a["%Error.prototype%"]=CS}var CS,mL=function e(t){var r;if(t==="%AsyncFunction%")r=Mm("async function () {}");else if(t==="%GeneratorFunction%")r=Mm("function* () {}");else if(t==="%AsyncGeneratorFunction%")r=Mm("async function* () {}");else if(t==="%AsyncGenerator%"){var n=e("%AsyncGeneratorFunction%");n&&(r=n.prototype)}else if(t==="%AsyncIteratorPrototype%"){var i=e("%AsyncGenerator%");i&&xt&&(r=xt(i.prototype))}return _a[t]=r,r},PS={__proto__:null,"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},Bl=Zu(),Ku=Rm(),gL=Bl.call(Function.call,Array.prototype.concat),vL=Bl.call(Function.apply,Array.prototype.splice),RS=Bl.call(Function.call,String.prototype.replace),Ju=Bl.call(Function.call,String.prototype.slice),yL=Bl.call(Function.call,RegExp.prototype.exec),wL=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,bL=/\\(\\)?/g,_L=function(t){var r=Ju(t,0,1),n=Ju(t,-1);if(r==="%"&&n!=="%")throw new js("invalid intrinsic syntax, expected closing `%`");if(n==="%"&&r!=="%")throw new js("invalid intrinsic syntax, expected opening `%`");var i=[];return RS(t,wL,function(a,s,o,l){i[i.length]=o?RS(l,bL,"$1"):s||a}),i},xL=function(t,r){var n=t,i;if(Ku(PS,n)&&(i=PS[n],n="%"+i[0]+"%"),Ku(_a,n)){var a=_a[n];if(a===Ns&&(a=mL(n)),typeof a=="undefined"&&!r)throw new Bs("intrinsic "+t+" exists, but is not available. Please file an issue!");return{alias:i,name:n,value:a}}throw new js("intrinsic "+t+" does not exist!")};OS.exports=function(t,r){if(typeof t!="string"||t.length===0)throw new Bs("intrinsic name must be a non-empty string");if(arguments.length>1&&typeof r!="boolean")throw new Bs('"allowMissing" argument must be a boolean');if(yL(/^%?[^%]*%?$/,t)===null)throw new js("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var n=_L(t),i=n.length>0?n[0]:"",a=xL("%"+i+"%",r),s=a.name,o=a.value,l=!1,c=a.alias;c&&(i=c[0],vL(n,gL([0,1],c)));for(var u=1,f=!0;u=n.length){var m=ba(o,d);f=!!m,f&&"get"in m&&!("originalValue"in m.get)?o=m.get:o=o[d]}else f=Ku(o,d),o=o[d];f&&!l&&(_a[s]=o)}}return o}});var ef=F((Nz,IS)=>{"use strict";g();var SL=tn(),Qu=SL("%Object.defineProperty%",!0)||!1;if(Qu)try{Qu({},"a",{value:1})}catch(e){Qu=!1}IS.exports=Qu});var rf=F((jz,FS)=>{"use strict";g();var EL=tn(),tf=EL("%Object.getOwnPropertyDescriptor%",!0);if(tf)try{tf([],"length")}catch(e){tf=null}FS.exports=tf});var nf=F((Uz,DS)=>{"use strict";g();var $S=ef(),AL=Cm(),Hs=Xn(),LS=rf();DS.exports=function(t,r,n){if(!t||typeof t!="object"&&typeof t!="function")throw new Hs("`obj` must be an object or a function`");if(typeof r!="string"&&typeof r!="symbol")throw new Hs("`property` must be a string or a symbol`");if(arguments.length>3&&typeof arguments[3]!="boolean"&&arguments[3]!==null)throw new Hs("`nonEnumerable`, if provided, must be a boolean or null");if(arguments.length>4&&typeof arguments[4]!="boolean"&&arguments[4]!==null)throw new Hs("`nonWritable`, if provided, must be a boolean or null");if(arguments.length>5&&typeof arguments[5]!="boolean"&&arguments[5]!==null)throw new Hs("`nonConfigurable`, if provided, must be a boolean or null");if(arguments.length>6&&typeof arguments[6]!="boolean")throw new Hs("`loose`, if provided, must be a boolean");var i=arguments.length>3?arguments[3]:null,a=arguments.length>4?arguments[4]:null,s=arguments.length>5?arguments[5]:null,o=arguments.length>6?arguments[6]:!1,l=!!LS&&LS(t,r);if($S)$S(t,r,{configurable:s===null&&l?l.configurable:!s,enumerable:i===null&&l?l.enumerable:!i,value:n,writable:a===null&&l?l.writable:!a});else if(o||!i&&!a&&!s)t[r]=n;else throw new AL("This environment does not support defining a property as non-configurable, non-writable, or non-enumerable.")}});var af=F((zz,BS)=>{"use strict";g();var Im=ef(),NS=function(){return!!Im};NS.hasArrayLengthDefineBug=function(){if(!Im)return null;try{return Im([],"length",{value:1}).length!==1}catch(t){return!0}};BS.exports=NS});var Ci=F((Wz,GS)=>{"use strict";g();var kL=Yu(),TL=typeof Symbol=="function"&&typeof Symbol("foo")=="symbol",CL=Object.prototype.toString,PL=Array.prototype.concat,jS=nf(),RL=function(e){return typeof e=="function"&&CL.call(e)==="[object Function]"},HS=af()(),ML=function(e,t,r,n){if(t in e){if(n===!0){if(e[t]===r)return}else if(!RL(n)||!n())return}HS?jS(e,t,r,!0):jS(e,t,r)},US=function(e,t){var r=arguments.length>2?arguments[2]:{},n=kL(t);TL&&(n=PL.call(n,Object.getOwnPropertySymbols(t)));for(var i=0;i{"use strict";g();var OL=tn(),zS=nf(),IL=af()(),VS=rf(),WS=Xn(),FL=OL("%Math.floor%");qS.exports=function(t,r){if(typeof t!="function")throw new WS("`fn` is not a function");if(typeof r!="number"||r<0||r>4294967295||FL(r)!==r)throw new WS("`length` must be a positive 32-bit integer");var n=arguments.length>2&&!!arguments[2],i=!0,a=!0;if("length"in t&&VS){var s=VS(t,"length");s&&!s.configurable&&(i=!1),s&&!s.writable&&(a=!1)}return(i||a||!n)&&(IL?zS(t,"length",r,!0,!0):zS(t,"length",r)),t}});var xa=F((Zz,sf)=>{"use strict";g();var Fm=Zu(),of=tn(),$L=YS(),LL=Xn(),KS=of("%Function.prototype.apply%"),JS=of("%Function.prototype.call%"),QS=of("%Reflect.apply%",!0)||Fm.call(JS,KS),XS=ef(),DL=of("%Math.max%");sf.exports=function(t){if(typeof t!="function")throw new LL("a function is required");var r=QS(Fm,JS,arguments);return $L(r,1+DL(0,t.length-(arguments.length-1)),!0)};var ZS=function(){return QS(Fm,KS,arguments)};XS?XS(sf.exports,"apply",{value:ZS}):sf.exports.apply=ZS});var br=F((Jz,rE)=>{"use strict";g();var eE=tn(),tE=xa(),NL=tE(eE("String.prototype.indexOf"));rE.exports=function(t,r){var n=eE(t,!!r);return typeof n=="function"&&NL(t,".prototype.")>-1?tE(n):n}});var $m=F((eV,oE)=>{"use strict";g();var BL=Yu(),aE=Nl()(),sE=br(),nE=Object,jL=sE("Array.prototype.push"),iE=sE("Object.prototype.propertyIsEnumerable"),HL=aE?Object.getOwnPropertySymbols:null;oE.exports=function(t,r){if(t==null)throw new TypeError("target must be an object");var n=nE(t);if(arguments.length===1)return n;for(var i=1;i{"use strict";g();var Lm=$m(),UL=function(){if(!Object.assign)return!1;for(var e="abcdefghijklmnopqrst",t=e.split(""),r={},n=0;n{"use strict";g();var zL=Ci(),VL=Dm();cE.exports=function(){var t=VL();return zL(Object,{assign:t},{assign:function(){return Object.assign!==t}}),t}});var pE=F((sV,hE)=>{"use strict";g();var WL=Ci(),qL=xa(),YL=$m(),fE=Dm(),XL=uE(),ZL=qL.apply(fE()),dE=function(t,r){return ZL(Object,arguments)};WL(dE,{getPolyfill:fE,implementation:YL,shim:XL});hE.exports=dE});var gE=F((lV,mE)=>{"use strict";g();var Hl=function(){return typeof function(){}.name=="string"},jl=Object.getOwnPropertyDescriptor;if(jl)try{jl([],"length")}catch(e){jl=null}Hl.functionsHaveConfigurableNames=function(){if(!Hl()||!jl)return!1;var t=jl(function(){},"name");return!!t&&!!t.configurable};var KL=Function.prototype.bind;Hl.boundFunctionsHaveNames=function(){return Hl()&&typeof KL=="function"&&function(){}.bind().name!==""};mE.exports=Hl});var wE=F((uV,yE)=>{"use strict";g();var vE=nf(),JL=af()(),QL=gE().functionsHaveConfigurableNames(),eD=Xn();yE.exports=function(t,r){if(typeof t!="function")throw new eD("`fn` is not a function");var n=arguments.length>2&&!!arguments[2];return(!n||QL)&&(JL?vE(t,"name",r,!0,!0):vE(t,"name",r)),t}});var Nm=F((dV,bE)=>{"use strict";g();var tD=wE(),rD=Xn(),nD=Object;bE.exports=tD(function(){if(this==null||this!==nD(this))throw new rD("RegExp.prototype.flags getter called on non-object");var t="";return this.hasIndices&&(t+="d"),this.global&&(t+="g"),this.ignoreCase&&(t+="i"),this.multiline&&(t+="m"),this.dotAll&&(t+="s"),this.unicode&&(t+="u"),this.unicodeSets&&(t+="v"),this.sticky&&(t+="y"),t},"get flags",!0)});var Bm=F((pV,_E)=>{"use strict";g();var iD=Nm(),aD=Ci().supportsDescriptors,sD=Object.getOwnPropertyDescriptor;_E.exports=function(){if(aD&&/a/mig.flags==="gim"){var t=sD(RegExp.prototype,"flags");if(t&&typeof t.get=="function"&&"dotAll"in RegExp.prototype&&"hasIndices"in RegExp.prototype){var r="",n={};if(Object.defineProperty(n,"hasIndices",{get:function(){r+="d"}}),Object.defineProperty(n,"sticky",{get:function(){r+="y"}}),t.get.call(n),r==="dy")return t.get}}return iD}});var EE=F((gV,SE)=>{"use strict";g();var oD=Ci().supportsDescriptors,lD=Bm(),cD=Object.getOwnPropertyDescriptor,uD=Object.defineProperty,fD=TypeError,xE=Object.getPrototypeOf,dD=/a/;SE.exports=function(){if(!oD||!xE)throw new fD("RegExp.prototype.flags requires a true ES5 environment that supports property descriptors");var t=lD(),r=xE(dD),n=cD(r,"flags");return(!n||n.get!==t)&&uD(r,"flags",{configurable:!0,enumerable:!1,get:t}),t}});var CE=F((yV,TE)=>{"use strict";g();var hD=Ci(),pD=xa(),mD=Nm(),AE=Bm(),gD=EE(),kE=pD(AE());hD(kE,{getPolyfill:AE,implementation:mD,shim:gD});TE.exports=kE});var Pi=F((bV,PE)=>{"use strict";g();var vD=Nl();PE.exports=function(){return vD()&&!!Symbol.toStringTag}});var Hm=F((xV,ME)=>{"use strict";g();var yD=Pi()(),wD=br(),jm=wD("Object.prototype.toString"),lf=function(t){return yD&&t&&typeof t=="object"&&Symbol.toStringTag in t?!1:jm(t)==="[object Arguments]"},RE=function(t){return lf(t)?!0:t!==null&&typeof t=="object"&&typeof t.length=="number"&&t.length>=0&&jm(t)!=="[object Array]"&&jm(t.callee)==="[object Function]"},bD=function(){return lf(arguments)}();lf.isLegacyArguments=RE;ME.exports=bD?lf:RE});var OE=F(()=>{g()});var JE=F((TV,KE)=>{g();var Km=typeof Map=="function"&&Map.prototype,Um=Object.getOwnPropertyDescriptor&&Km?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,uf=Km&&Um&&typeof Um.get=="function"?Um.get:null,IE=Km&&Map.prototype.forEach,Jm=typeof Set=="function"&&Set.prototype,Gm=Object.getOwnPropertyDescriptor&&Jm?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,ff=Jm&&Gm&&typeof Gm.get=="function"?Gm.get:null,FE=Jm&&Set.prototype.forEach,_D=typeof WeakMap=="function"&&WeakMap.prototype,Gl=_D?WeakMap.prototype.has:null,xD=typeof WeakSet=="function"&&WeakSet.prototype,zl=xD?WeakSet.prototype.has:null,SD=typeof WeakRef=="function"&&WeakRef.prototype,$E=SD?WeakRef.prototype.deref:null,ED=Boolean.prototype.valueOf,AD=Object.prototype.toString,kD=Function.prototype.toString,TD=String.prototype.match,Qm=String.prototype.slice,Mi=String.prototype.replace,CD=String.prototype.toUpperCase,LE=String.prototype.toLowerCase,VE=RegExp.prototype.test,DE=Array.prototype.concat,An=Array.prototype.join,PD=Array.prototype.slice,NE=Math.floor,Wm=typeof BigInt=="function"?BigInt.prototype.valueOf:null,zm=Object.getOwnPropertySymbols,qm=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Symbol.prototype.toString:null,Us=typeof Symbol=="function"&&typeof Symbol.iterator=="object",Ot=typeof Symbol=="function"&&Symbol.toStringTag&&(typeof Symbol.toStringTag===Us||!0)?Symbol.toStringTag:null,WE=Object.prototype.propertyIsEnumerable,BE=(typeof Reflect=="function"?Reflect.getPrototypeOf:Object.getPrototypeOf)||([].__proto__===Array.prototype?function(e){return e.__proto__}:null);function jE(e,t){if(e===1/0||e===-1/0||e!==e||e&&e>-1e3&&e<1e3||VE.call(/e/,t))return t;var r=/[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;if(typeof e=="number"){var n=e<0?-NE(-e):NE(e);if(n!==e){var i=String(n),a=Qm.call(t,i.length+1);return Mi.call(i,r,"$&_")+"."+Mi.call(Mi.call(a,/([0-9]{3})/g,"$&_"),/_$/,"")}}return Mi.call(t,r,"$&_")}var Ym=OE(),HE=Ym.custom,UE=YE(HE)?HE:null;KE.exports=function e(t,r,n,i){var a=r||{};if(Ri(a,"quoteStyle")&&a.quoteStyle!=="single"&&a.quoteStyle!=="double")throw new TypeError('option "quoteStyle" must be "single" or "double"');if(Ri(a,"maxStringLength")&&(typeof a.maxStringLength=="number"?a.maxStringLength<0&&a.maxStringLength!==1/0:a.maxStringLength!==null))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');var s=Ri(a,"customInspect")?a.customInspect:!0;if(typeof s!="boolean"&&s!=="symbol")throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");if(Ri(a,"indent")&&a.indent!==null&&a.indent!==" "&&!(parseInt(a.indent,10)===a.indent&&a.indent>0))throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');if(Ri(a,"numericSeparator")&&typeof a.numericSeparator!="boolean")throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var o=a.numericSeparator;if(typeof t=="undefined")return"undefined";if(t===null)return"null";if(typeof t=="boolean")return t?"true":"false";if(typeof t=="string")return ZE(t,a);if(typeof t=="number"){if(t===0)return 1/0/t>0?"0":"-0";var l=String(t);return o?jE(t,l):l}if(typeof t=="bigint"){var c=String(t)+"n";return o?jE(t,c):c}var u=typeof a.depth=="undefined"?5:a.depth;if(typeof n=="undefined"&&(n=0),n>=u&&u>0&&typeof t=="object")return Xm(t)?"[Array]":"[Object]";var f=qD(a,n);if(typeof i=="undefined")i=[];else if(XE(i,t)>=0)return"[Circular]";function d(N,L,ee){if(L&&(i=PD.call(i),i.push(L)),ee){var fe={depth:a.depth};return Ri(a,"quoteStyle")&&(fe.quoteStyle=a.quoteStyle),e(N,fe,n+1,i)}return e(N,a,n+1,i)}if(typeof t=="function"&&!GE(t)){var h=ND(t),p=cf(t,d);return"[Function"+(h?": "+h:" (anonymous)")+"]"+(p.length>0?" { "+An.call(p,", ")+" }":"")}if(YE(t)){var m=Us?Mi.call(String(t),/^(Symbol\(.*\))_[^)]*$/,"$1"):qm.call(t);return typeof t=="object"&&!Us?Ul(m):m}if(zD(t)){for(var v="<"+LE.call(String(t.nodeName)),y=t.attributes||[],b=0;b",v}if(Xm(t)){if(t.length===0)return"[]";var x=cf(t,d);return f&&!WD(x)?"["+Zm(x,f)+"]":"[ "+An.call(x,", ")+" ]"}if(OD(t)){var E=cf(t,d);return!("cause"in Error.prototype)&&"cause"in t&&!WE.call(t,"cause")?"{ ["+String(t)+"] "+An.call(DE.call("[cause]: "+d(t.cause),E),", ")+" }":E.length===0?"["+String(t)+"]":"{ ["+String(t)+"] "+An.call(E,", ")+" }"}if(typeof t=="object"&&s){if(UE&&typeof t[UE]=="function"&&Ym)return Ym(t,{depth:u-n});if(s!=="symbol"&&typeof t.inspect=="function")return t.inspect()}if(BD(t)){var _=[];return IE&&IE.call(t,function(N,L){_.push(d(L,t,!0)+" => "+d(N,t))}),zE("Map",uf.call(t),_,f)}if(UD(t)){var k=[];return FE&&FE.call(t,function(N){k.push(d(N,t))}),zE("Set",ff.call(t),k,f)}if(jD(t))return Vm("WeakMap");if(GD(t))return Vm("WeakSet");if(HD(t))return Vm("WeakRef");if(FD(t))return Ul(d(Number(t)));if(LD(t))return Ul(d(Wm.call(t)));if($D(t))return Ul(ED.call(t));if(ID(t))return Ul(d(String(t)));if(typeof window!="undefined"&&t===window)return"{ [object Window] }";if(typeof globalThis!="undefined"&&t===globalThis||typeof global!="undefined"&&t===global)return"{ [object globalThis] }";if(!MD(t)&&!GE(t)){var w=cf(t,d),A=BE?BE(t)===Object.prototype:t instanceof Object||t.constructor===Object,S=t instanceof Object?"":"null prototype",T=!A&&Ot&&Object(t)===t&&Ot in t?Qm.call(Oi(t),8,-1):S?"Object":"",P=A||typeof t.constructor!="function"?"":t.constructor.name?t.constructor.name+" ":"",I=P+(T||S?"["+An.call(DE.call([],T||[],S||[]),": ")+"] ":"");return w.length===0?I+"{}":f?I+"{"+Zm(w,f)+"}":I+"{ "+An.call(w,", ")+" }"}return String(t)};function qE(e,t,r){var n=(r.quoteStyle||t)==="double"?'"':"'";return n+e+n}function RD(e){return Mi.call(String(e),/"/g,""")}function Xm(e){return Oi(e)==="[object Array]"&&(!Ot||!(typeof e=="object"&&Ot in e))}function MD(e){return Oi(e)==="[object Date]"&&(!Ot||!(typeof e=="object"&&Ot in e))}function GE(e){return Oi(e)==="[object RegExp]"&&(!Ot||!(typeof e=="object"&&Ot in e))}function OD(e){return Oi(e)==="[object Error]"&&(!Ot||!(typeof e=="object"&&Ot in e))}function ID(e){return Oi(e)==="[object String]"&&(!Ot||!(typeof e=="object"&&Ot in e))}function FD(e){return Oi(e)==="[object Number]"&&(!Ot||!(typeof e=="object"&&Ot in e))}function $D(e){return Oi(e)==="[object Boolean]"&&(!Ot||!(typeof e=="object"&&Ot in e))}function YE(e){if(Us)return e&&typeof e=="object"&&e instanceof Symbol;if(typeof e=="symbol")return!0;if(!e||typeof e!="object"||!qm)return!1;try{return qm.call(e),!0}catch(t){}return!1}function LD(e){if(!e||typeof e!="object"||!Wm)return!1;try{return Wm.call(e),!0}catch(t){}return!1}var DD=Object.prototype.hasOwnProperty||function(e){return e in this};function Ri(e,t){return DD.call(e,t)}function Oi(e){return AD.call(e)}function ND(e){if(e.name)return e.name;var t=TD.call(kD.call(e),/^function\s*([\w$]+)/);return t?t[1]:null}function XE(e,t){if(e.indexOf)return e.indexOf(t);for(var r=0,n=e.length;rt.maxStringLength){var r=e.length-t.maxStringLength,n="... "+r+" more character"+(r>1?"s":"");return ZE(Qm.call(e,0,t.maxStringLength),t)+n}var i=Mi.call(Mi.call(e,/(['\\])/g,"\\$1"),/[\x00-\x1f]/g,VD);return qE(i,"single",t)}function VD(e){var t=e.charCodeAt(0),r={8:"b",9:"t",10:"n",12:"f",13:"r"}[t];return r?"\\"+r:"\\x"+(t<16?"0":"")+CD.call(t.toString(16))}function Ul(e){return"Object("+e+")"}function Vm(e){return e+" { ? }"}function zE(e,t,r,n){var i=n?Zm(r,n):An.call(r,", ");return e+" ("+t+") {"+i+"}"}function WD(e){for(var t=0;t=0)return!1;return!0}function qD(e,t){var r;if(e.indent===" ")r=" ";else if(typeof e.indent=="number"&&e.indent>0)r=An.call(Array(e.indent+1)," ");else return null;return{base:r,prev:An.call(Array(t+1),r)}}function Zm(e,t){if(e.length===0)return"";var r=` +`+t.prev+t.base;return r+An.call(e,","+r)+` +`+t.prev}function cf(e,t){var r=Xm(e),n=[];if(r){n.length=e.length;for(var i=0;i{"use strict";g();var QE=tn(),Gs=br(),YD=JE(),XD=Xn(),df=QE("%WeakMap%",!0),hf=QE("%Map%",!0),ZD=Gs("WeakMap.prototype.get",!0),KD=Gs("WeakMap.prototype.set",!0),JD=Gs("WeakMap.prototype.has",!0),QD=Gs("Map.prototype.get",!0),eN=Gs("Map.prototype.set",!0),tN=Gs("Map.prototype.has",!0),eg=function(e,t){for(var r=e,n;(n=r.next)!==null;r=n)if(n.key===t)return r.next=n.next,n.next=e.next,e.next=n,n},rN=function(e,t){var r=eg(e,t);return r&&r.value},nN=function(e,t,r){var n=eg(e,t);n?n.value=r:e.next={key:t,next:e.next,value:r}},iN=function(e,t){return!!eg(e,t)};eA.exports=function(){var t,r,n,i={assert:function(a){if(!i.has(a))throw new XD("Side channel does not contain "+YD(a))},get:function(a){if(df&&a&&(typeof a=="object"||typeof a=="function")){if(t)return ZD(t,a)}else if(hf){if(r)return QD(r,a)}else if(n)return rN(n,a)},has:function(a){if(df&&a&&(typeof a=="object"||typeof a=="function")){if(t)return JD(t,a)}else if(hf){if(r)return tN(r,a)}else if(n)return iN(n,a);return!1},set:function(a,s){df&&a&&(typeof a=="object"||typeof a=="function")?(t||(t=new df),KD(t,a,s)):hf?(r||(r=new hf),eN(r,a,s)):(n||(n={key:{},next:null}),nN(n,a,s))}};return i}});var rA=F((MV,tA)=>{"use strict";g();var aN=Rm(),Vl=tg()(),Zn=Xn(),rg={assert:function(e,t){if(!e||typeof e!="object"&&typeof e!="function")throw new Zn("`O` is not an object");if(typeof t!="string")throw new Zn("`slot` must be a string");if(Vl.assert(e),!rg.has(e,t))throw new Zn("`"+t+"` is not present on `O`")},get:function(e,t){if(!e||typeof e!="object"&&typeof e!="function")throw new Zn("`O` is not an object");if(typeof t!="string")throw new Zn("`slot` must be a string");var r=Vl.get(e);return r&&r["$"+t]},has:function(e,t){if(!e||typeof e!="object"&&typeof e!="function")throw new Zn("`O` is not an object");if(typeof t!="string")throw new Zn("`slot` must be a string");var r=Vl.get(e);return!!r&&aN(r,"$"+t)},set:function(e,t,r){if(!e||typeof e!="object"&&typeof e!="function")throw new Zn("`O` is not an object");if(typeof t!="string")throw new Zn("`slot` must be a string");var n=Vl.get(e);n||(n={},Vl.set(e,n)),n["$"+t]=r}};Object.freeze&&Object.freeze(rg);tA.exports=rg});var aA=F((IV,iA)=>{"use strict";g();var Wl=rA(),sN=SyntaxError,nA=typeof StopIteration=="object"?StopIteration:null;iA.exports=function(t){if(!nA)throw new sN("this environment lacks StopIteration");Wl.set(t,"[[Done]]",!1);var r={next:function(){var i=Wl.get(this,"[[Iterator]]"),a=Wl.get(i,"[[Done]]");try{return{done:a,value:a?void 0:i.next()}}catch(s){if(Wl.set(i,"[[Done]]",!0),s!==nA)throw s;return{done:!0,value:void 0}}}};return Wl.set(r,"[[Iterator]]",t),r}});var ng=F(($V,sA)=>{g();var oN={}.toString;sA.exports=Array.isArray||function(e){return oN.call(e)=="[object Array]"}});var ig=F((DV,oA)=>{"use strict";g();var lN=String.prototype.valueOf,cN=function(t){try{return lN.call(t),!0}catch(r){return!1}},uN=Object.prototype.toString,fN="[object String]",dN=Pi()();oA.exports=function(t){return typeof t=="string"?!0:typeof t!="object"?!1:dN?cN(t):uN.call(t)===fN}});var sg=F((BV,uA)=>{"use strict";g();var ag=typeof Map=="function"&&Map.prototype?Map:null,hN=typeof Set=="function"&&Set.prototype?Set:null,pf;ag||(pf=function(t){return!1});var cA=ag?Map.prototype.has:null,lA=hN?Set.prototype.has:null;!pf&&!cA&&(pf=function(t){return!1});uA.exports=pf||function(t){if(!t||typeof t!="object")return!1;try{if(cA.call(t),lA)try{lA.call(t)}catch(r){return!0}return t instanceof ag}catch(r){}return!1}});var lg=F((HV,hA)=>{"use strict";g();var pN=typeof Map=="function"&&Map.prototype?Map:null,og=typeof Set=="function"&&Set.prototype?Set:null,mf;og||(mf=function(t){return!1});var fA=pN?Map.prototype.has:null,dA=og?Set.prototype.has:null;!mf&&!dA&&(mf=function(t){return!1});hA.exports=mf||function(t){if(!t||typeof t!="object")return!1;try{if(dA.call(t),fA)try{fA.call(t)}catch(r){return!0}return t instanceof og}catch(r){}return!1}});var AA=F((GV,yf)=>{"use strict";g();var pA=Hm(),mA=aA();Xu()()||Nl()()?(gf=Symbol.iterator,yf.exports=function(t){if(t!=null&&typeof t[gf]!="undefined")return t[gf]();if(pA(t))return Array.prototype[gf].call(t)}):(gA=ng(),vA=ig(),cg=tn(),yA=cg("%Map%",!0),wA=cg("%Set%",!0),Dr=br(),ug=Dr("Array.prototype.push"),fg=Dr("String.prototype.charCodeAt"),bA=Dr("String.prototype.slice"),_A=function(t,r){var n=t.length;if(r+1>=n)return r+1;var i=fg(t,r);if(i<55296||i>56319)return r+1;var a=fg(t,r+1);return a<56320||a>57343?r+1:r+2},vf=function(t){var r=0;return{next:function(){var i=r>=t.length,a;return i||(a=t[r],r+=1),{done:i,value:a}}}},dg=function(t,r){if(gA(t)||pA(t))return vf(t);if(vA(t)){var n=0;return{next:function(){var a=_A(t,n),s=bA(t,n,a);return n=a,{done:a>t.length,value:s}}}}if(r&&typeof t["_es6-shim iterator_"]!="undefined")return t["_es6-shim iterator_"]()},!yA&&!wA?yf.exports=function(t){if(t!=null)return dg(t,!0)}:(xA=sg(),SA=lg(),hg=Dr("Map.prototype.forEach",!0),pg=Dr("Set.prototype.forEach",!0),(typeof process=="undefined"||!process.versions||!process.versions.node)&&(mg=Dr("Map.prototype.iterator",!0),gg=Dr("Set.prototype.iterator",!0)),vg=Dr("Map.prototype.@@iterator",!0)||Dr("Map.prototype._es6-shim iterator_",!0),yg=Dr("Set.prototype.@@iterator",!0)||Dr("Set.prototype._es6-shim iterator_",!0),EA=function(t){if(xA(t)){if(mg)return mA(mg(t));if(vg)return vg(t);if(hg){var r=[];return hg(t,function(i,a){ug(r,[a,i])}),vf(r)}}if(SA(t)){if(gg)return mA(gg(t));if(yg)return yg(t);if(pg){var n=[];return pg(t,function(i){ug(n,i)}),vf(n)}}},yf.exports=function(t){return EA(t)||dg(t)}));var gf,gA,vA,cg,yA,wA,Dr,ug,fg,bA,_A,vf,dg,xA,SA,hg,pg,mg,gg,vg,yg,EA});var wg=F((VV,TA)=>{"use strict";g();var kA=function(e){return e!==e};TA.exports=function(t,r){return t===0&&r===0?1/t===1/r:!!(t===r||kA(t)&&kA(r))}});var bg=F((qV,CA)=>{"use strict";g();var mN=wg();CA.exports=function(){return typeof Object.is=="function"?Object.is:mN}});var RA=F((XV,PA)=>{"use strict";g();var gN=bg(),vN=Ci();PA.exports=function(){var t=gN();return vN(Object,{is:t},{is:function(){return Object.is!==t}}),t}});var FA=F((KV,IA)=>{"use strict";g();var yN=Ci(),wN=xa(),bN=wg(),MA=bg(),_N=RA(),OA=wN(MA(),Object);yN(OA,{getPolyfill:MA,implementation:bN,shim:_N});IA.exports=OA});var xg=F((QV,NA)=>{"use strict";g();var xN=xa(),DA=br(),SN=tn(),_g=SN("%ArrayBuffer%",!0),wf=DA("ArrayBuffer.prototype.byteLength",!0),EN=DA("Object.prototype.toString"),$A=!!_g&&!wf&&new _g(0).slice,LA=!!$A&&xN($A);NA.exports=wf||LA?function(t){if(!t||typeof t!="object")return!1;try{return wf?wf(t):LA(t,0),!0}catch(r){return!1}}:_g?function(t){return EN(t)==="[object ArrayBuffer]"}:function(t){return!1}});var jA=F((tW,BA)=>{"use strict";g();var AN=Date.prototype.getDay,kN=function(t){try{return AN.call(t),!0}catch(r){return!1}},TN=Object.prototype.toString,CN="[object Date]",PN=Pi()();BA.exports=function(t){return typeof t!="object"||t===null?!1:PN?kN(t):TN.call(t)===CN}});var VA=F((nW,zA)=>{"use strict";g();var Sg=br(),HA=Pi()(),UA,GA,Eg,Ag;HA&&(UA=Sg("Object.prototype.hasOwnProperty"),GA=Sg("RegExp.prototype.exec"),Eg={},bf=function(){throw Eg},Ag={toString:bf,valueOf:bf},typeof Symbol.toPrimitive=="symbol"&&(Ag[Symbol.toPrimitive]=bf));var bf,RN=Sg("Object.prototype.toString"),MN=Object.getOwnPropertyDescriptor,ON="[object RegExp]";zA.exports=HA?function(t){if(!t||typeof t!="object")return!1;var r=MN(t,"lastIndex"),n=r&&UA(r,"value");if(!n)return!1;try{GA(t,Ag)}catch(i){return i===Eg}}:function(t){return!t||typeof t!="object"&&typeof t!="function"?!1:RN(t)===ON}});var YA=F((aW,qA)=>{"use strict";g();var IN=br(),WA=IN("SharedArrayBuffer.prototype.byteLength",!0);qA.exports=WA?function(t){if(!t||typeof t!="object")return!1;try{return WA(t),!0}catch(r){return!1}}:function(t){return!1}});var ZA=F((oW,XA)=>{"use strict";g();var FN=Number.prototype.toString,$N=function(t){try{return FN.call(t),!0}catch(r){return!1}},LN=Object.prototype.toString,DN="[object Number]",NN=Pi()();XA.exports=function(t){return typeof t=="number"?!0:typeof t!="object"?!1:NN?$N(t):LN.call(t)===DN}});var QA=F((cW,JA)=>{"use strict";g();var KA=br(),BN=KA("Boolean.prototype.toString"),jN=KA("Object.prototype.toString"),HN=function(t){try{return BN(t),!0}catch(r){return!1}},UN="[object Boolean]",GN=Pi()();JA.exports=function(t){return typeof t=="boolean"?!0:t===null||typeof t!="object"?!1:GN&&Symbol.toStringTag in t?HN(t):jN(t)===UN}});var nk=F((fW,kg)=>{"use strict";g();var zN=Object.prototype.toString,VN=Xu()();VN?(ek=Symbol.prototype.toString,tk=/^Symbol\(.*\)$/,rk=function(t){return typeof t.valueOf()!="symbol"?!1:tk.test(ek.call(t))},kg.exports=function(t){if(typeof t=="symbol")return!0;if(zN.call(t)!=="[object Symbol]")return!1;try{return rk(t)}catch(r){return!1}}):kg.exports=function(t){return!1};var ek,tk,rk});var sk=F((hW,ak)=>{"use strict";g();var ik=typeof BigInt!="undefined"&&BigInt;ak.exports=function(){return typeof ik=="function"&&typeof BigInt=="function"&&typeof ik(42)=="bigint"&&typeof BigInt(42)=="bigint"}});var ck=F((mW,Tg)=>{"use strict";g();var WN=sk()();WN?(ok=BigInt.prototype.valueOf,lk=function(t){try{return ok.call(t),!0}catch(r){}return!1},Tg.exports=function(t){return t===null||typeof t=="undefined"||typeof t=="boolean"||typeof t=="string"||typeof t=="number"||typeof t=="symbol"||typeof t=="function"?!1:typeof t=="bigint"?!0:lk(t)}):Tg.exports=function(t){return!1};var ok,lk});var fk=F((vW,uk)=>{"use strict";g();var qN=ig(),YN=ZA(),XN=QA(),ZN=nk(),KN=ck();uk.exports=function(t){if(t==null||typeof t!="object"&&typeof t!="function")return null;if(qN(t))return"String";if(YN(t))return"Number";if(XN(t))return"Boolean";if(ZN(t))return"Symbol";if(KN(t))return"BigInt"}});var pk=F((wW,hk)=>{"use strict";g();var _f=typeof WeakMap=="function"&&WeakMap.prototype?WeakMap:null,dk=typeof WeakSet=="function"&&WeakSet.prototype?WeakSet:null,xf;_f||(xf=function(t){return!1});var Pg=_f?_f.prototype.has:null,Cg=dk?dk.prototype.has:null;!xf&&!Pg&&(xf=function(t){return!1});hk.exports=xf||function(t){if(!t||typeof t!="object")return!1;try{if(Pg.call(t,Pg),Cg)try{Cg.call(t,Cg)}catch(r){return!0}return t instanceof _f}catch(r){}return!1}});var gk=F((_W,Mg)=>{"use strict";g();var JN=tn(),mk=br(),QN=JN("%WeakSet%",!0),Rg=mk("WeakSet.prototype.has",!0);Rg?(Sf=mk("WeakMap.prototype.has",!0),Mg.exports=function(t){if(!t||typeof t!="object")return!1;try{if(Rg(t,Rg),Sf)try{Sf(t,Sf)}catch(r){return!0}return t instanceof QN}catch(r){}return!1}):Mg.exports=function(t){return!1};var Sf});var yk=F((SW,vk)=>{"use strict";g();var eB=sg(),tB=lg(),rB=pk(),nB=gk();vk.exports=function(t){if(t&&typeof t=="object"){if(eB(t))return"Map";if(tB(t))return"Set";if(rB(t))return"WeakMap";if(nB(t))return"WeakSet"}return!1}});var xk=F((AW,_k)=>{"use strict";g();var bk=Function.prototype.toString,zs=typeof Reflect=="object"&&Reflect!==null&&Reflect.apply,Ig,Ef;if(typeof zs=="function"&&typeof Object.defineProperty=="function")try{Ig=Object.defineProperty({},"length",{get:function(){throw Ef}}),Ef={},zs(function(){throw 42},null,Ig)}catch(e){e!==Ef&&(zs=null)}else zs=null;var iB=/^\s*class\b/,Fg=function(t){try{var r=bk.call(t);return iB.test(r)}catch(n){return!1}},Og=function(t){try{return Fg(t)?!1:(bk.call(t),!0)}catch(r){return!1}},Af=Object.prototype.toString,aB="[object Object]",sB="[object Function]",oB="[object GeneratorFunction]",lB="[object HTMLAllCollection]",cB="[object HTML document.all class]",uB="[object HTMLCollection]",fB=typeof Symbol=="function"&&!!Symbol.toStringTag,dB=!(0 in[,]),$g=function(){return!1};typeof document=="object"&&(wk=document.all,Af.call(wk)===Af.call(document.all)&&($g=function(t){if((dB||!t)&&(typeof t=="undefined"||typeof t=="object"))try{var r=Af.call(t);return(r===lB||r===cB||r===uB||r===aB)&&t("")==null}catch(n){}return!1}));var wk;_k.exports=zs?function(t){if($g(t))return!0;if(!t||typeof t!="function"&&typeof t!="object")return!1;try{zs(t,null,Ig)}catch(r){if(r!==Ef)return!1}return!Fg(t)&&Og(t)}:function(t){if($g(t))return!0;if(!t||typeof t!="function"&&typeof t!="object")return!1;if(fB)return Og(t);if(Fg(t))return!1;var r=Af.call(t);return r!==sB&&r!==oB&&!/^\[object HTML/.test(r)?!1:Og(t)}});var Ak=F((TW,Ek)=>{"use strict";g();var hB=xk(),pB=Object.prototype.toString,Sk=Object.prototype.hasOwnProperty,mB=function(t,r,n){for(var i=0,a=t.length;i=3&&(i=n),pB.call(t)==="[object Array]"?mB(t,r,i):typeof t=="string"?gB(t,r,i):vB(t,r,i)};Ek.exports=yB});var Tk=F((PW,kk)=>{"use strict";g();kk.exports=["Float32Array","Float64Array","Int8Array","Int16Array","Int32Array","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array"]});var Pk=F((MW,Ck)=>{"use strict";g();var Lg=Tk(),wB=typeof globalThis=="undefined"?global:globalThis;Ck.exports=function(){for(var t=[],r=0;r{"use strict";g();var Tf=Ak(),bB=Pk(),Rk=xa(),Bg=br(),kf=rf(),_B=Bg("Object.prototype.toString"),Ok=Pi()(),Mk=typeof globalThis=="undefined"?global:globalThis,Ng=bB(),jg=Bg("String.prototype.slice"),Dg=Object.getPrototypeOf,xB=Bg("Array.prototype.indexOf",!0)||function(t,r){for(var n=0;n-1?r:r!=="Object"?!1:EB(t)}return kf?SB(t):null}});var Dk=F(($W,Lk)=>{"use strict";g();var AB=br(),$k=AB("ArrayBuffer.prototype.byteLength",!0),kB=xg();Lk.exports=function(t){return kB(t)?$k?$k(t):t.byteLength:NaN}});var lT=F((DW,oT)=>{"use strict";g();var iT=pE(),kn=br(),Nk=CE(),TB=tn(),Vs=AA(),CB=tg(),Bk=FA(),jk=Hm(),Hk=ng(),Uk=xg(),Gk=jA(),zk=VA(),Vk=YA(),Wk=Yu(),qk=fk(),Yk=yk(),Xk=Fk(),Zk=Dk(),Kk=kn("SharedArrayBuffer.prototype.byteLength",!0),Jk=kn("Date.prototype.getTime"),Hg=Object.getPrototypeOf,Qk=kn("Object.prototype.toString"),Rf=TB("%Set%",!0),Ug=kn("Map.prototype.has",!0),Mf=kn("Map.prototype.get",!0),eT=kn("Map.prototype.size",!0),Of=kn("Set.prototype.add",!0),aT=kn("Set.prototype.delete",!0),If=kn("Set.prototype.has",!0),Pf=kn("Set.prototype.size",!0);function tT(e,t,r,n){for(var i=Vs(e),a;(a=i.next())&&!a.done;)if(rn(t,a.value,r,n))return aT(e,a.value),!0;return!1}function sT(e){if(typeof e=="undefined")return null;if(typeof e!="object")return typeof e=="symbol"?!1:typeof e=="string"||typeof e=="number"?+e==+e:!0}function PB(e,t,r,n,i,a){var s=sT(r);if(s!=null)return s;var o=Mf(t,s),l=iT({},i,{strict:!1});return typeof o=="undefined"&&!Ug(t,s)||!rn(n,o,l,a)?!1:!Ug(e,s)&&rn(n,o,l,a)}function RB(e,t,r){var n=sT(r);return n!=null?n:If(t,n)&&!If(e,n)}function rT(e,t,r,n,i,a){for(var s=Vs(e),o,l;(o=s.next())&&!o.done;)if(l=o.value,rn(r,l,i,a)&&rn(n,Mf(t,l),i,a))return aT(e,l),!0;return!1}function rn(e,t,r,n){var i=r||{};if(i.strict?Bk(e,t):e===t)return!0;var a=qk(e),s=qk(t);if(a!==s)return!1;if(!e||!t||typeof e!="object"&&typeof t!="object")return i.strict?Bk(e,t):e==t;var o=n.has(e),l=n.has(t),c;if(o&&l){if(n.get(e)===n.get(t))return!0}else c={};return o||n.set(e,c),l||n.set(t,c),IB(e,t,i,n)}function nT(e){return!e||typeof e!="object"||typeof e.length!="number"||typeof e.copy!="function"||typeof e.slice!="function"||e.length>0&&typeof e[0]!="number"?!1:!!(e.constructor&&e.constructor.isBuffer&&e.constructor.isBuffer(e))}function MB(e,t,r,n){if(Pf(e)!==Pf(t))return!1;for(var i=Vs(e),a=Vs(t),s,o,l;(s=i.next())&&!s.done;)if(s.value&&typeof s.value=="object")l||(l=new Rf),Of(l,s.value);else if(!If(t,s.value)){if(r.strict||!RB(e,t,s.value))return!1;l||(l=new Rf),Of(l,s.value)}if(l){for(;(o=a.next())&&!o.done;)if(o.value&&typeof o.value=="object"){if(!tT(l,o.value,r.strict,n))return!1}else if(!r.strict&&!If(e,o.value)&&!tT(l,o.value,r.strict,n))return!1;return Pf(l)===0}return!0}function OB(e,t,r,n){if(eT(e)!==eT(t))return!1;for(var i=Vs(e),a=Vs(t),s,o,l,c,u,f;(s=i.next())&&!s.done;)if(c=s.value[0],u=s.value[1],c&&typeof c=="object")l||(l=new Rf),Of(l,c);else if(f=Mf(t,c),typeof f=="undefined"&&!Ug(t,c)||!rn(u,f,r,n)){if(r.strict||!PB(e,t,c,u,r,n))return!1;l||(l=new Rf),Of(l,c)}if(l){for(;(o=a.next())&&!o.done;)if(c=o.value[0],f=o.value[1],c&&typeof c=="object"){if(!rT(l,e,c,f,r,n))return!1}else if(!r.strict&&(!e.has(c)||!rn(Mf(e,c),f,r,n))&&!rT(l,e,c,f,iT({},r,{strict:!1}),n))return!1;return Pf(l)===0}return!0}function IB(e,t,r,n){var i,a;if(typeof e!=typeof t||e==null||t==null||Qk(e)!==Qk(t)||jk(e)!==jk(t))return!1;var s=Hk(e),o=Hk(t);if(s!==o)return!1;var l=e instanceof Error,c=t instanceof Error;if(l!==c||(l||c)&&(e.name!==t.name||e.message!==t.message))return!1;var u=zk(e),f=zk(t);if(u!==f||(u||f)&&(e.source!==t.source||Nk(e)!==Nk(t)))return!1;var d=Gk(e),h=Gk(t);if(d!==h||(d||h)&&Jk(e)!==Jk(t)||r.strict&&Hg&&Hg(e)!==Hg(t))return!1;var p=Xk(e),m=Xk(t);if(p!==m)return!1;if(p||m){if(e.length!==t.length)return!1;for(i=0;i=0;i--)if(k[i]!=w[i])return!1;for(i=k.length-1;i>=0;i--)if(a=k[i],!rn(e[a],t[a],r,n))return!1;var A=Yk(e),S=Yk(t);return A!==S?!1:A==="Set"||S==="Set"?MB(e,t,r,n):A==="Map"?OB(e,t,r,n):!0}oT.exports=function(t,r,n){return rn(t,r,n,CB())}});var Zg=F((exports,module)=>{g();(function(){"use strict";var ERROR="input is invalid type",WINDOW=typeof window=="object",root=WINDOW?window:{};root.JS_SHA256_NO_WINDOW&&(WINDOW=!1);var WEB_WORKER=!WINDOW&&typeof self=="object",NODE_JS=!root.JS_SHA256_NO_NODE_JS&&typeof process=="object"&&process.versions&&process.versions.node;NODE_JS?root=global:WEB_WORKER&&(root=self);var COMMON_JS=!root.JS_SHA256_NO_COMMON_JS&&typeof module=="object"&&module.exports,AMD=typeof define=="function"&&define.amd,ARRAY_BUFFER=!root.JS_SHA256_NO_ARRAY_BUFFER&&typeof ArrayBuffer!="undefined",HEX_CHARS="0123456789abcdef".split(""),EXTRA=[-2147483648,8388608,32768,128],SHIFT=[24,16,8,0],K=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],OUTPUT_TYPES=["hex","array","digest","arrayBuffer"],blocks=[];(root.JS_SHA256_NO_NODE_JS||!Array.isArray)&&(Array.isArray=function(e){return Object.prototype.toString.call(e)==="[object Array]"}),ARRAY_BUFFER&&(root.JS_SHA256_NO_ARRAY_BUFFER_IS_VIEW||!ArrayBuffer.isView)&&(ArrayBuffer.isView=function(e){return typeof e=="object"&&e.buffer&&e.buffer.constructor===ArrayBuffer});var createOutputMethod=function(e,t){return function(r){return new Sha256(t,!0).update(r)[e]()}},createMethod=function(e){var t=createOutputMethod("hex",e);NODE_JS&&(t=nodeWrap(t,e)),t.create=function(){return new Sha256(e)},t.update=function(i){return t.create().update(i)};for(var r=0;r>2]|=e[i]<>2]|=n<>2]|=(192|n>>6)<>2]|=(128|n&63)<=57344?(o[a>>2]|=(224|n>>12)<>2]|=(128|n>>6&63)<>2]|=(128|n&63)<>2]|=(240|n>>18)<>2]|=(128|n>>12&63)<>2]|=(128|n>>6&63)<>2]|=(128|n&63)<=64?(this.block=o[16],this.start=a-64,this.hash(),this.hashed=!0):this.start=a}return this.bytes>4294967295&&(this.hBytes+=this.bytes/4294967296<<0,this.bytes=this.bytes%4294967296),this}},Sha256.prototype.finalize=function(){if(!this.finalized){this.finalized=!0;var e=this.blocks,t=this.lastByteIndex;e[16]=this.block,e[t>>2]|=EXTRA[t&3],this.block=e[16],t>=56&&(this.hashed||this.hash(),e[0]=this.block,e[16]=e[1]=e[2]=e[3]=e[4]=e[5]=e[6]=e[7]=e[8]=e[9]=e[10]=e[11]=e[12]=e[13]=e[14]=e[15]=0),e[14]=this.hBytes<<3|this.bytes>>>29,e[15]=this.bytes<<3,this.hash()}},Sha256.prototype.hash=function(){var e=this.h0,t=this.h1,r=this.h2,n=this.h3,i=this.h4,a=this.h5,s=this.h6,o=this.h7,l=this.blocks,c,u,f,d,h,p,m,v,y,b,x;for(c=16;c<64;++c)h=l[c-15],u=(h>>>7|h<<25)^(h>>>18|h<<14)^h>>>3,h=l[c-2],f=(h>>>17|h<<15)^(h>>>19|h<<13)^h>>>10,l[c]=l[c-16]+u+l[c-7]+f<<0;for(x=t&r,c=0;c<64;c+=4)this.first?(this.is224?(v=300032,h=l[0]-1413257819,o=h-150054599<<0,n=h+24177077<<0):(v=704751109,h=l[0]-210244248,o=h-1521486534<<0,n=h+143694565<<0),this.first=!1):(u=(e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10),f=(i>>>6|i<<26)^(i>>>11|i<<21)^(i>>>25|i<<7),v=e&t,d=v^e&r^x,m=i&a^~i&s,h=o+f+m+K[c]+l[c],p=u+d,o=n+h<<0,n=h+p<<0),u=(n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10),f=(o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7),y=n&e,d=y^n&t^v,m=o&i^~o&a,h=s+f+m+K[c+1]+l[c+1],p=u+d,s=r+h<<0,r=h+p<<0,u=(r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10),f=(s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7),b=r&n,d=b^r&e^y,m=s&o^~s&i,h=a+f+m+K[c+2]+l[c+2],p=u+d,a=t+h<<0,t=h+p<<0,u=(t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10),f=(a>>>6|a<<26)^(a>>>11|a<<21)^(a>>>25|a<<7),x=t&r,d=x^t&n^b,m=a&s^~a&o,h=i+f+m+K[c+3]+l[c+3],p=u+d,i=e+h<<0,e=h+p<<0;this.h0=this.h0+e<<0,this.h1=this.h1+t<<0,this.h2=this.h2+r<<0,this.h3=this.h3+n<<0,this.h4=this.h4+i<<0,this.h5=this.h5+a<<0,this.h6=this.h6+s<<0,this.h7=this.h7+o<<0},Sha256.prototype.hex=function(){this.finalize();var e=this.h0,t=this.h1,r=this.h2,n=this.h3,i=this.h4,a=this.h5,s=this.h6,o=this.h7,l=HEX_CHARS[e>>28&15]+HEX_CHARS[e>>24&15]+HEX_CHARS[e>>20&15]+HEX_CHARS[e>>16&15]+HEX_CHARS[e>>12&15]+HEX_CHARS[e>>8&15]+HEX_CHARS[e>>4&15]+HEX_CHARS[e&15]+HEX_CHARS[t>>28&15]+HEX_CHARS[t>>24&15]+HEX_CHARS[t>>20&15]+HEX_CHARS[t>>16&15]+HEX_CHARS[t>>12&15]+HEX_CHARS[t>>8&15]+HEX_CHARS[t>>4&15]+HEX_CHARS[t&15]+HEX_CHARS[r>>28&15]+HEX_CHARS[r>>24&15]+HEX_CHARS[r>>20&15]+HEX_CHARS[r>>16&15]+HEX_CHARS[r>>12&15]+HEX_CHARS[r>>8&15]+HEX_CHARS[r>>4&15]+HEX_CHARS[r&15]+HEX_CHARS[n>>28&15]+HEX_CHARS[n>>24&15]+HEX_CHARS[n>>20&15]+HEX_CHARS[n>>16&15]+HEX_CHARS[n>>12&15]+HEX_CHARS[n>>8&15]+HEX_CHARS[n>>4&15]+HEX_CHARS[n&15]+HEX_CHARS[i>>28&15]+HEX_CHARS[i>>24&15]+HEX_CHARS[i>>20&15]+HEX_CHARS[i>>16&15]+HEX_CHARS[i>>12&15]+HEX_CHARS[i>>8&15]+HEX_CHARS[i>>4&15]+HEX_CHARS[i&15]+HEX_CHARS[a>>28&15]+HEX_CHARS[a>>24&15]+HEX_CHARS[a>>20&15]+HEX_CHARS[a>>16&15]+HEX_CHARS[a>>12&15]+HEX_CHARS[a>>8&15]+HEX_CHARS[a>>4&15]+HEX_CHARS[a&15]+HEX_CHARS[s>>28&15]+HEX_CHARS[s>>24&15]+HEX_CHARS[s>>20&15]+HEX_CHARS[s>>16&15]+HEX_CHARS[s>>12&15]+HEX_CHARS[s>>8&15]+HEX_CHARS[s>>4&15]+HEX_CHARS[s&15];return this.is224||(l+=HEX_CHARS[o>>28&15]+HEX_CHARS[o>>24&15]+HEX_CHARS[o>>20&15]+HEX_CHARS[o>>16&15]+HEX_CHARS[o>>12&15]+HEX_CHARS[o>>8&15]+HEX_CHARS[o>>4&15]+HEX_CHARS[o&15]),l},Sha256.prototype.toString=Sha256.prototype.hex,Sha256.prototype.digest=function(){this.finalize();var e=this.h0,t=this.h1,r=this.h2,n=this.h3,i=this.h4,a=this.h5,s=this.h6,o=this.h7,l=[e>>24&255,e>>16&255,e>>8&255,e&255,t>>24&255,t>>16&255,t>>8&255,t&255,r>>24&255,r>>16&255,r>>8&255,r&255,n>>24&255,n>>16&255,n>>8&255,n&255,i>>24&255,i>>16&255,i>>8&255,i&255,a>>24&255,a>>16&255,a>>8&255,a&255,s>>24&255,s>>16&255,s>>8&255,s&255];return this.is224||l.push(o>>24&255,o>>16&255,o>>8&255,o&255),l},Sha256.prototype.array=Sha256.prototype.digest,Sha256.prototype.arrayBuffer=function(){this.finalize();var e=new ArrayBuffer(this.is224?28:32),t=new DataView(e);return t.setUint32(0,this.h0),t.setUint32(4,this.h1),t.setUint32(8,this.h2),t.setUint32(12,this.h3),t.setUint32(16,this.h4),t.setUint32(20,this.h5),t.setUint32(24,this.h6),this.is224||t.setUint32(28,this.h7),e};function HmacSha256(e,t,r){var n,i=typeof e;if(i==="string"){var a=[],s=e.length,o=0,l;for(n=0;n>6,a[o++]=128|l&63):l<55296||l>=57344?(a[o++]=224|l>>12,a[o++]=128|l>>6&63,a[o++]=128|l&63):(l=65536+((l&1023)<<10|e.charCodeAt(++n)&1023),a[o++]=240|l>>18,a[o++]=128|l>>12&63,a[o++]=128|l>>6&63,a[o++]=128|l&63);e=a}else if(i==="object"){if(e===null)throw new Error(ERROR);if(ARRAY_BUFFER&&e.constructor===ArrayBuffer)e=new Uint8Array(e);else if(!Array.isArray(e)&&(!ARRAY_BUFFER||!ArrayBuffer.isView(e)))throw new Error(ERROR)}else throw new Error(ERROR);e.length>64&&(e=new Sha256(t,!0).update(e).array());var c=[],u=[];for(n=0;n<64;++n){var f=e[n]||0;c[n]=92^f,u[n]=54^f}Sha256.call(this,t,r),this.update(u),this.oKeyPad=c,this.inner=!0,this.sharedMemory=r}HmacSha256.prototype=new Sha256,HmacSha256.prototype.finalize=function(){if(Sha256.prototype.finalize.call(this),this.inner){this.inner=!1;var e=this.array();Sha256.call(this,this.is224,this.sharedMemory),this.update(this.oKeyPad),this.update(e),Sha256.prototype.finalize.call(this)}};var exports=createMethod();exports.sha256=exports,exports.sha224=createMethod(!0),exports.sha256.hmac=createHmacMethod(),exports.sha224.hmac=createHmacMethod(!0),COMMON_JS?module.exports=exports:(root.sha256=exports.sha256,root.sha224=exports.sha224,AMD&&define(function(){return exports}))})()});var RC=F(A0=>{g();(function(e){var t=/\S/,r=/\"/g,n=/\n/g,i=/\r/g,a=/\\/g,s=/\u2028/,o=/\u2029/;e.tags={"#":1,"^":2,"<":3,$:4,"/":5,"!":6,">":7,"=":8,_v:9,"{":10,"&":11,_t:12},e.scan=function(A,S){var T=A.length,P=0,I=1,N=2,L=P,ee=null,fe=null,J="",Q=[],Pe=!1,ge=0,z=0,Y="{{",O="}}";function he(){J.length>0&&(Q.push({tag:"_t",text:new String(J)}),J="")}function Ge(){for(var ct=!0,rt=z;rt"&&(Ie.indent=Q[Et].text.toString()),Q.splice(Et,1));else rt||Q.push({tag:` +`});Pe=!1,z=Q.length}function Re(ct,rt){var Et="="+O,Ie=ct.indexOf(Et,rt),H=c(ct.substring(ct.indexOf("=",rt)+1,Ie)).split(" ");return Y=H[0],O=H[H.length-1],Ie+Et.length-1}for(S&&(S=S.split(" "),Y=S[0],O=S[1]),ge=0;ge0;){if(L=w.shift(),N&&N.tag=="<"&&!(L.tag in f))throw new Error("Illegal content in < super tag.");if(e.tags[L.tag]<=e.tags.$||h(L,T))S.push(L),L.nodes=d(w,L.tag,S,T);else if(L.tag=="/"){if(S.length===0)throw new Error("Closing tag without opener: /"+L.n);if(I=S.pop(),L.n!=I.n&&!p(L.n,I.n,T))throw new Error("Nesting error: "+I.n+" vs. "+L.n);return I.end=L.i,P}else L.tag==` +`&&(L.last=w.length==0||w[0].tag==` +`);P.push(L)}if(S.length>0)throw new Error("missing closing tag: "+S.pop().n);return P}function h(w,A){for(var S=0,T=A.length;S":E,"<":function(w,A){var S={partials:{},code:"",subs:{},inPartial:!0};e.walk(w.nodes,S);var T=A.partials[E(w,A)];T.subs=S.subs,T.partials=S.partials},$:function(w,A){var S={subs:{},code:"",partials:A.partials,prefix:w.n};e.walk(w.nodes,S),A.subs[w.n]=S.code,A.inPartial||(A.code+='t.sub("'+b(w.n)+'",c,p,i);')},"\n":function(w,A){A.code+=k('"\\n"'+(w.last?"":" + i"))},_v:function(w,A){A.code+="t.b(t.v(t."+x(w.n)+'("'+b(w.n)+'",c,p,0)));'},_t:function(w,A){A.code+=k('"'+b(w.text)+'"')},"{":_,"&":_};function _(w,A){A.code+="t.b(t.t(t."+x(w.n)+'("'+b(w.n)+'",c,p,0)));'}function k(w){return"t.b("+w+");"}e.walk=function(w,A){for(var S,T=0,P=w.length;T{g();var Wj={};(function(e){e.Template=function(d,h,p,m){d=d||{},this.r=d.code||this.r,this.c=p,this.options=m||{},this.text=h||"",this.partials=d.partials||{},this.subs=d.subs||{},this.buf=""},e.Template.prototype={r:function(d,h,p){return""},v:u,t:c,render:function(h,p,m){return this.ri([h],p||{},m)},ri:function(d,h,p){return this.r(d,h,p)},ep:function(d,h){var p=this.partials[d],m=h[p.name];if(p.instance&&p.base==m)return p.instance;if(typeof m=="string"){if(!this.c)throw new Error("No compiler available.");m=this.c.compile(m,this.options)}if(!m)return null;if(this.partials[d].base=m,p.subs){h.stackText||(h.stackText={});for(key in p.subs)h.stackText[key]||(h.stackText[key]=this.activeSub!==void 0&&h.stackText[this.activeSub]?h.stackText[this.activeSub]:this.text);m=r(m,p.subs,p.partials,this.stackSubs,this.stackPartials,h.stackText)}return this.partials[d].instance=m,m},rp:function(d,h,p,m){var v=this.ep(d,p);return v?v.ri(h,p,m):""},rs:function(d,h,p){var m=d[d.length-1];if(!f(m)){p(d,h,this);return}for(var v=0;v=0;E--)if(y=h[E],v=t(d,y,x),v!==void 0){b=!0;break}return b?(!m&&typeof v=="function"&&(v=this.mv(v,h,p)),v):m?!1:""},ls:function(d,h,p,m,v){var y=this.options.delimiters;return this.options.delimiters=v,this.b(this.ct(c(d.call(h,m)),h,p)),this.options.delimiters=y,!1},ct:function(d,h,p){if(this.options.disableLambda)throw new Error("Lambda features disabled.");return this.c.compile(d,this.options).render(h,p)},b:function(d){this.buf+=d},fl:function(){var d=this.buf;return this.buf="",d},ms:function(d,h,p,m,v,y,b){var x,E=h[h.length-1],_=d.call(E);return typeof _=="function"?m?!0:(x=this.activeSub&&this.subsText&&this.subsText[this.activeSub]?this.subsText[this.activeSub]:this.text,this.ls(_,E,p,x.substring(v,y),b)):_},mv:function(d,h,p){var m=h[h.length-1],v=d.call(m);return typeof v=="function"?this.ct(c(v.call(m)),m,p):v},sub:function(d,h,p,m){var v=this.subs[d];v&&(this.activeSub=d,v(h,p,this,m),this.activeSub=!1)}};function t(d,h,p){var m;return h&&typeof h=="object"&&(h[d]!==void 0?m=h[d]:p&&h.get&&typeof h.get=="function"&&(m=h.get(d))),m}function r(d,h,p,m,v,y){function b(){}b.prototype=d;function x(){}x.prototype=d.subs;var E,_=new b;_.subs=new x,_.subsText={},_.buf="",m=m||{},_.stackSubs=m,_.subsText=y;for(E in h)m[E]||(m[E]=h[E]);for(E in m)_.subs[E]=m[E];v=v||{},_.stackPartials=v;for(E in p)v[E]||(v[E]=p[E]);for(E in v)_.partials[E]=v[E];return _}var n=/&/g,i=//g,s=/\'/g,o=/\"/g,l=/[&<>\"\']/;function c(d){return String(d==null?"":d)}function u(d){return d=c(d),l.test(d)?d.replace(n,"&").replace(i,"<").replace(a,">").replace(s,"'").replace(o,"""):d}var f=Array.isArray||function(d){return Object.prototype.toString.call(d)==="[object Array]"}})(typeof k0!="undefined"?k0:Wj)});var T0=F((WX,OC)=>{g();var hd=RC();hd.Template=MC().Template;hd.template=hd.Template;OC.exports=hd});var MP=F((xc,$v)=>{g();(function(t,r){typeof xc=="object"&&typeof $v=="object"?$v.exports=r():typeof define=="function"&&define.amd?define([],r):typeof xc=="object"?xc.feather=r():t.feather=r()})(typeof self!="undefined"?self:xc,function(){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=e,r.c=t,r.d=function(n,i,a){r.o(n,i)||Object.defineProperty(n,i,{configurable:!1,enumerable:!0,get:a})},r.r=function(n){Object.defineProperty(n,"__esModule",{value:!0})},r.n=function(n){var i=n&&n.__esModule?function(){return n.default}:function(){return n};return r.d(i,"a",i),i},r.o=function(n,i){return Object.prototype.hasOwnProperty.call(n,i)},r.p="",r(r.s=0)}({"./dist/icons.json":function(e){e.exports={activity:'',airplay:'',"alert-circle":'',"alert-octagon":'',"alert-triangle":'',"align-center":'',"align-justify":'',"align-left":'',"align-right":'',anchor:'',aperture:'',archive:'',"arrow-down-circle":'',"arrow-down-left":'',"arrow-down-right":'',"arrow-down":'',"arrow-left-circle":'',"arrow-left":'',"arrow-right-circle":'',"arrow-right":'',"arrow-up-circle":'',"arrow-up-left":'',"arrow-up-right":'',"arrow-up":'',"at-sign":'',award:'',"bar-chart-2":'',"bar-chart":'',"battery-charging":'',battery:'',"bell-off":'',bell:'',bluetooth:'',bold:'',"book-open":'',book:'',bookmark:'',box:'',briefcase:'',calendar:'',"camera-off":'',camera:'',cast:'',"check-circle":'',"check-square":'',check:'',"chevron-down":'',"chevron-left":'',"chevron-right":'',"chevron-up":'',"chevrons-down":'',"chevrons-left":'',"chevrons-right":'',"chevrons-up":'',chrome:'',circle:'',clipboard:'',clock:'',"cloud-drizzle":'',"cloud-lightning":'',"cloud-off":'',"cloud-rain":'',"cloud-snow":'',cloud:'',code:'',codepen:'',codesandbox:'',coffee:'',columns:'',command:'',compass:'',copy:'',"corner-down-left":'',"corner-down-right":'',"corner-left-down":'',"corner-left-up":'',"corner-right-down":'',"corner-right-up":'',"corner-up-left":'',"corner-up-right":'',cpu:'',"credit-card":'',crop:'',crosshair:'',database:'',delete:'',disc:'',"divide-circle":'',"divide-square":'',divide:'',"dollar-sign":'',"download-cloud":'',download:'',dribbble:'',droplet:'',"edit-2":'',"edit-3":'',edit:'',"external-link":'',"eye-off":'',eye:'',facebook:'',"fast-forward":'',feather:'',figma:'',"file-minus":'',"file-plus":'',"file-text":'',file:'',film:'',filter:'',flag:'',"folder-minus":'',"folder-plus":'',folder:'',framer:'',frown:'',gift:'',"git-branch":'',"git-commit":'',"git-merge":'',"git-pull-request":'',github:'',gitlab:'',globe:'',grid:'',"hard-drive":'',hash:'',headphones:'',heart:'',"help-circle":'',hexagon:'',home:'',image:'',inbox:'',info:'',instagram:'',italic:'',key:'',layers:'',layout:'',"life-buoy":'',"link-2":'',link:'',linkedin:'',list:'',loader:'',lock:'',"log-in":'',"log-out":'',mail:'',"map-pin":'',map:'',"maximize-2":'',maximize:'',meh:'',menu:'',"message-circle":'',"message-square":'',"mic-off":'',mic:'',"minimize-2":'',minimize:'',"minus-circle":'',"minus-square":'',minus:'',monitor:'',moon:'',"more-horizontal":'',"more-vertical":'',"mouse-pointer":'',move:'',music:'',"navigation-2":'',navigation:'',octagon:'',package:'',paperclip:'',"pause-circle":'',pause:'',"pen-tool":'',percent:'',"phone-call":'',"phone-forwarded":'',"phone-incoming":'',"phone-missed":'',"phone-off":'',"phone-outgoing":'',phone:'',"pie-chart":'',"play-circle":'',play:'',"plus-circle":'',"plus-square":'',plus:'',pocket:'',power:'',printer:'',radio:'',"refresh-ccw":'',"refresh-cw":'',repeat:'',rewind:'',"rotate-ccw":'',"rotate-cw":'',rss:'',save:'',scissors:'',search:'',send:'',server:'',settings:'',"share-2":'',share:'',"shield-off":'',shield:'',"shopping-bag":'',"shopping-cart":'',shuffle:'',sidebar:'',"skip-back":'',"skip-forward":'',slack:'',slash:'',sliders:'',smartphone:'',smile:'',speaker:'',square:'',star:'',"stop-circle":'',sun:'',sunrise:'',sunset:'',table:'',tablet:'',tag:'',target:'',terminal:'',thermometer:'',"thumbs-down":'',"thumbs-up":'',"toggle-left":'',"toggle-right":'',tool:'',"trash-2":'',trash:'',trello:'',"trending-down":'',"trending-up":'',triangle:'',truck:'',tv:'',twitch:'',twitter:'',type:'',umbrella:'',underline:'',unlock:'',"upload-cloud":'',upload:'',"user-check":'',"user-minus":'',"user-plus":'',"user-x":'',user:'',users:'',"video-off":'',video:'',voicemail:'',"volume-1":'',"volume-2":'',"volume-x":'',volume:'',watch:'',"wifi-off":'',wifi:'',wind:'',"x-circle":'',"x-octagon":'',"x-square":'',x:'',youtube:'',"zap-off":'',zap:'',"zoom-in":'',"zoom-out":''}},"./node_modules/classnames/dedupe.js":function(e,t,r){var n,i;(function(){"use strict";var a=function(){function s(){}s.prototype=Object.create(null);function o(m,v){for(var y=v.length,b=0;b1?arguments[1]:void 0,v=m!==void 0,y=0,b=c(d),x,E,_,k;if(v&&(m=n(m,p>2?arguments[2]:void 0,2)),b!=null&&!(h==Array&&s(b)))for(k=b.call(d),E=new h;!(_=k.next()).done;y++)l(E,y,v?a(k,m,[_.value,y],!0):_.value);else for(x=o(d.length),E=new h(x);x>y;y++)l(E,y,v?m(d[y],y):d[y]);return E.length=y,E}},"./node_modules/core-js/internals/array-includes.js":function(e,t,r){var n=r("./node_modules/core-js/internals/to-indexed-object.js"),i=r("./node_modules/core-js/internals/to-length.js"),a=r("./node_modules/core-js/internals/to-absolute-index.js");e.exports=function(s){return function(o,l,c){var u=n(o),f=i(u.length),d=a(c,f),h;if(s&&l!=l){for(;f>d;)if(h=u[d++],h!=h)return!0}else for(;f>d;d++)if((s||d in u)&&u[d]===l)return s||d||0;return!s&&-1}}},"./node_modules/core-js/internals/bind-context.js":function(e,t,r){var n=r("./node_modules/core-js/internals/a-function.js");e.exports=function(i,a,s){if(n(i),a===void 0)return i;switch(s){case 0:return function(){return i.call(a)};case 1:return function(o){return i.call(a,o)};case 2:return function(o,l){return i.call(a,o,l)};case 3:return function(o,l,c){return i.call(a,o,l,c)}}return function(){return i.apply(a,arguments)}}},"./node_modules/core-js/internals/call-with-safe-iteration-closing.js":function(e,t,r){var n=r("./node_modules/core-js/internals/an-object.js");e.exports=function(i,a,s,o){try{return o?a(n(s)[0],s[1]):a(s)}catch(c){var l=i.return;throw l!==void 0&&n(l.call(i)),c}}},"./node_modules/core-js/internals/check-correctness-of-iteration.js":function(e,t,r){var n=r("./node_modules/core-js/internals/well-known-symbol.js"),i=n("iterator"),a=!1;try{var s=0,o={next:function(){return{done:!!s++}},return:function(){a=!0}};o[i]=function(){return this},Array.from(o,function(){throw 2})}catch(l){}e.exports=function(l,c){if(!c&&!a)return!1;var u=!1;try{var f={};f[i]=function(){return{next:function(){return{done:u=!0}}}},l(f)}catch(d){}return u}},"./node_modules/core-js/internals/classof-raw.js":function(e,t){var r={}.toString;e.exports=function(n){return r.call(n).slice(8,-1)}},"./node_modules/core-js/internals/classof.js":function(e,t,r){var n=r("./node_modules/core-js/internals/classof-raw.js"),i=r("./node_modules/core-js/internals/well-known-symbol.js"),a=i("toStringTag"),s=n(function(){return arguments}())=="Arguments",o=function(l,c){try{return l[c]}catch(u){}};e.exports=function(l){var c,u,f;return l===void 0?"Undefined":l===null?"Null":typeof(u=o(c=Object(l),a))=="string"?u:s?n(c):(f=n(c))=="Object"&&typeof c.callee=="function"?"Arguments":f}},"./node_modules/core-js/internals/copy-constructor-properties.js":function(e,t,r){var n=r("./node_modules/core-js/internals/has.js"),i=r("./node_modules/core-js/internals/own-keys.js"),a=r("./node_modules/core-js/internals/object-get-own-property-descriptor.js"),s=r("./node_modules/core-js/internals/object-define-property.js");e.exports=function(o,l){for(var c=i(l),u=s.f,f=a.f,d=0;d",x="java"+y+":",E;for(p.style.display="none",o.appendChild(p),p.src=String(x),E=p.contentWindow.document,E.open(),E.write(v+y+b+"document.F=Object"+v+"/"+y+b),E.close(),h=E.F;m--;)delete h[f][a[m]];return h()};e.exports=Object.create||function(m,v){var y;return m!==null?(d[f]=n(m),y=new d,d[f]=null,y[u]=m):y=h(),v===void 0?y:i(y,v)},s[u]=!0},"./node_modules/core-js/internals/object-define-properties.js":function(e,t,r){var n=r("./node_modules/core-js/internals/descriptors.js"),i=r("./node_modules/core-js/internals/object-define-property.js"),a=r("./node_modules/core-js/internals/an-object.js"),s=r("./node_modules/core-js/internals/object-keys.js");e.exports=n?Object.defineProperties:function(l,c){a(l);for(var u=s(c),f=u.length,d=0,h;f>d;)i.f(l,h=u[d++],c[h]);return l}},"./node_modules/core-js/internals/object-define-property.js":function(e,t,r){var n=r("./node_modules/core-js/internals/descriptors.js"),i=r("./node_modules/core-js/internals/ie8-dom-define.js"),a=r("./node_modules/core-js/internals/an-object.js"),s=r("./node_modules/core-js/internals/to-primitive.js"),o=Object.defineProperty;t.f=n?o:function(c,u,f){if(a(c),u=s(u,!0),a(f),i)try{return o(c,u,f)}catch(d){}if("get"in f||"set"in f)throw TypeError("Accessors not supported");return"value"in f&&(c[u]=f.value),c}},"./node_modules/core-js/internals/object-get-own-property-descriptor.js":function(e,t,r){var n=r("./node_modules/core-js/internals/descriptors.js"),i=r("./node_modules/core-js/internals/object-property-is-enumerable.js"),a=r("./node_modules/core-js/internals/create-property-descriptor.js"),s=r("./node_modules/core-js/internals/to-indexed-object.js"),o=r("./node_modules/core-js/internals/to-primitive.js"),l=r("./node_modules/core-js/internals/has.js"),c=r("./node_modules/core-js/internals/ie8-dom-define.js"),u=Object.getOwnPropertyDescriptor;t.f=n?u:function(d,h){if(d=s(d),h=o(h,!0),c)try{return u(d,h)}catch(p){}if(l(d,h))return a(!i.f.call(d,h),d[h])}},"./node_modules/core-js/internals/object-get-own-property-names.js":function(e,t,r){var n=r("./node_modules/core-js/internals/object-keys-internal.js"),i=r("./node_modules/core-js/internals/enum-bug-keys.js"),a=i.concat("length","prototype");t.f=Object.getOwnPropertyNames||function(o){return n(o,a)}},"./node_modules/core-js/internals/object-get-own-property-symbols.js":function(e,t){t.f=Object.getOwnPropertySymbols},"./node_modules/core-js/internals/object-get-prototype-of.js":function(e,t,r){var n=r("./node_modules/core-js/internals/has.js"),i=r("./node_modules/core-js/internals/to-object.js"),a=r("./node_modules/core-js/internals/shared-key.js"),s=r("./node_modules/core-js/internals/correct-prototype-getter.js"),o=a("IE_PROTO"),l=Object.prototype;e.exports=s?Object.getPrototypeOf:function(c){return c=i(c),n(c,o)?c[o]:typeof c.constructor=="function"&&c instanceof c.constructor?c.constructor.prototype:c instanceof Object?l:null}},"./node_modules/core-js/internals/object-keys-internal.js":function(e,t,r){var n=r("./node_modules/core-js/internals/has.js"),i=r("./node_modules/core-js/internals/to-indexed-object.js"),a=r("./node_modules/core-js/internals/array-includes.js"),s=r("./node_modules/core-js/internals/hidden-keys.js"),o=a(!1);e.exports=function(l,c){var u=i(l),f=0,d=[],h;for(h in u)!n(s,h)&&n(u,h)&&d.push(h);for(;c.length>f;)n(u,h=c[f++])&&(~o(d,h)||d.push(h));return d}},"./node_modules/core-js/internals/object-keys.js":function(e,t,r){var n=r("./node_modules/core-js/internals/object-keys-internal.js"),i=r("./node_modules/core-js/internals/enum-bug-keys.js");e.exports=Object.keys||function(s){return n(s,i)}},"./node_modules/core-js/internals/object-property-is-enumerable.js":function(e,t,r){"use strict";var n={}.propertyIsEnumerable,i=Object.getOwnPropertyDescriptor,a=i&&!n.call({1:2},1);t.f=a?function(o){var l=i(this,o);return!!l&&l.enumerable}:n},"./node_modules/core-js/internals/object-set-prototype-of.js":function(e,t,r){var n=r("./node_modules/core-js/internals/validate-set-prototype-of-arguments.js");e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var i=!1,a={},s;try{s=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set,s.call(a,[]),i=a instanceof Array}catch(o){}return function(l,c){return n(l,c),i?s.call(l,c):l.__proto__=c,l}}():void 0)},"./node_modules/core-js/internals/own-keys.js":function(e,t,r){var n=r("./node_modules/core-js/internals/global.js"),i=r("./node_modules/core-js/internals/object-get-own-property-names.js"),a=r("./node_modules/core-js/internals/object-get-own-property-symbols.js"),s=r("./node_modules/core-js/internals/an-object.js"),o=n.Reflect;e.exports=o&&o.ownKeys||function(c){var u=i.f(s(c)),f=a.f;return f?u.concat(f(c)):u}},"./node_modules/core-js/internals/path.js":function(e,t,r){e.exports=r("./node_modules/core-js/internals/global.js")},"./node_modules/core-js/internals/redefine.js":function(e,t,r){var n=r("./node_modules/core-js/internals/global.js"),i=r("./node_modules/core-js/internals/shared.js"),a=r("./node_modules/core-js/internals/hide.js"),s=r("./node_modules/core-js/internals/has.js"),o=r("./node_modules/core-js/internals/set-global.js"),l=r("./node_modules/core-js/internals/function-to-string.js"),c=r("./node_modules/core-js/internals/internal-state.js"),u=c.get,f=c.enforce,d=String(l).split("toString");i("inspectSource",function(h){return l.call(h)}),(e.exports=function(h,p,m,v){var y=v?!!v.unsafe:!1,b=v?!!v.enumerable:!1,x=v?!!v.noTargetGet:!1;if(typeof m=="function"&&(typeof p=="string"&&!s(m,"name")&&a(m,"name",p),f(m).source=d.join(typeof p=="string"?p:"")),h===n){b?h[p]=m:o(p,m);return}else y?!x&&h[p]&&(b=!0):delete h[p];b?h[p]=m:a(h,p,m)})(Function.prototype,"toString",function(){return typeof this=="function"&&u(this).source||l.call(this)})},"./node_modules/core-js/internals/require-object-coercible.js":function(e,t){e.exports=function(r){if(r==null)throw TypeError("Can't call method on "+r);return r}},"./node_modules/core-js/internals/set-global.js":function(e,t,r){var n=r("./node_modules/core-js/internals/global.js"),i=r("./node_modules/core-js/internals/hide.js");e.exports=function(a,s){try{i(n,a,s)}catch(o){n[a]=s}return s}},"./node_modules/core-js/internals/set-to-string-tag.js":function(e,t,r){var n=r("./node_modules/core-js/internals/object-define-property.js").f,i=r("./node_modules/core-js/internals/has.js"),a=r("./node_modules/core-js/internals/well-known-symbol.js"),s=a("toStringTag");e.exports=function(o,l,c){o&&!i(o=c?o:o.prototype,s)&&n(o,s,{configurable:!0,value:l})}},"./node_modules/core-js/internals/shared-key.js":function(e,t,r){var n=r("./node_modules/core-js/internals/shared.js"),i=r("./node_modules/core-js/internals/uid.js"),a=n("keys");e.exports=function(s){return a[s]||(a[s]=i(s))}},"./node_modules/core-js/internals/shared.js":function(e,t,r){var n=r("./node_modules/core-js/internals/global.js"),i=r("./node_modules/core-js/internals/set-global.js"),a=r("./node_modules/core-js/internals/is-pure.js"),s="__core-js_shared__",o=n[s]||i(s,{});(e.exports=function(l,c){return o[l]||(o[l]=c!==void 0?c:{})})("versions",[]).push({version:"3.1.3",mode:a?"pure":"global",copyright:"\xA9 2019 Denis Pushkarev (zloirock.ru)"})},"./node_modules/core-js/internals/string-at.js":function(e,t,r){var n=r("./node_modules/core-js/internals/to-integer.js"),i=r("./node_modules/core-js/internals/require-object-coercible.js");e.exports=function(a,s,o){var l=String(i(a)),c=n(s),u=l.length,f,d;return c<0||c>=u?o?"":void 0:(f=l.charCodeAt(c),f<55296||f>56319||c+1===u||(d=l.charCodeAt(c+1))<56320||d>57343?o?l.charAt(c):f:o?l.slice(c,c+2):(f-55296<<10)+(d-56320)+65536)}},"./node_modules/core-js/internals/to-absolute-index.js":function(e,t,r){var n=r("./node_modules/core-js/internals/to-integer.js"),i=Math.max,a=Math.min;e.exports=function(s,o){var l=n(s);return l<0?i(l+o,0):a(l,o)}},"./node_modules/core-js/internals/to-indexed-object.js":function(e,t,r){var n=r("./node_modules/core-js/internals/indexed-object.js"),i=r("./node_modules/core-js/internals/require-object-coercible.js");e.exports=function(a){return n(i(a))}},"./node_modules/core-js/internals/to-integer.js":function(e,t){var r=Math.ceil,n=Math.floor;e.exports=function(i){return isNaN(i=+i)?0:(i>0?n:r)(i)}},"./node_modules/core-js/internals/to-length.js":function(e,t,r){var n=r("./node_modules/core-js/internals/to-integer.js"),i=Math.min;e.exports=function(a){return a>0?i(n(a),9007199254740991):0}},"./node_modules/core-js/internals/to-object.js":function(e,t,r){var n=r("./node_modules/core-js/internals/require-object-coercible.js");e.exports=function(i){return Object(n(i))}},"./node_modules/core-js/internals/to-primitive.js":function(e,t,r){var n=r("./node_modules/core-js/internals/is-object.js");e.exports=function(i,a){if(!n(i))return i;var s,o;if(a&&typeof(s=i.toString)=="function"&&!n(o=s.call(i))||typeof(s=i.valueOf)=="function"&&!n(o=s.call(i))||!a&&typeof(s=i.toString)=="function"&&!n(o=s.call(i)))return o;throw TypeError("Can't convert object to primitive value")}},"./node_modules/core-js/internals/uid.js":function(e,t){var r=0,n=Math.random();e.exports=function(i){return"Symbol(".concat(i===void 0?"":i,")_",(++r+n).toString(36))}},"./node_modules/core-js/internals/validate-set-prototype-of-arguments.js":function(e,t,r){var n=r("./node_modules/core-js/internals/is-object.js"),i=r("./node_modules/core-js/internals/an-object.js");e.exports=function(a,s){if(i(a),!n(s)&&s!==null)throw TypeError("Can't set "+String(s)+" as a prototype")}},"./node_modules/core-js/internals/well-known-symbol.js":function(e,t,r){var n=r("./node_modules/core-js/internals/global.js"),i=r("./node_modules/core-js/internals/shared.js"),a=r("./node_modules/core-js/internals/uid.js"),s=r("./node_modules/core-js/internals/native-symbol.js"),o=n.Symbol,l=i("wks");e.exports=function(c){return l[c]||(l[c]=s&&o[c]||(s?o:a)("Symbol."+c))}},"./node_modules/core-js/modules/es.array.from.js":function(e,t,r){var n=r("./node_modules/core-js/internals/export.js"),i=r("./node_modules/core-js/internals/array-from.js"),a=r("./node_modules/core-js/internals/check-correctness-of-iteration.js"),s=!a(function(o){Array.from(o)});n({target:"Array",stat:!0,forced:s},{from:i})},"./node_modules/core-js/modules/es.string.iterator.js":function(e,t,r){"use strict";var n=r("./node_modules/core-js/internals/string-at.js"),i=r("./node_modules/core-js/internals/internal-state.js"),a=r("./node_modules/core-js/internals/define-iterator.js"),s="String Iterator",o=i.set,l=i.getterFor(s);a(String,"String",function(c){o(this,{type:s,string:String(c),index:0})},function(){var u=l(this),f=u.string,d=u.index,h;return d>=f.length?{value:void 0,done:!0}:(h=n(f,d,!0),u.index+=h.length,{value:h,done:!1})})},"./node_modules/webpack/buildin/global.js":function(e,t){var r;r=function(){return this}();try{r=r||Function("return this")()||(0,eval)("this")}catch(n){typeof window=="object"&&(r=window)}e.exports=r},"./src/default-attrs.json":function(e){e.exports={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"}},"./src/icon.js":function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=Object.assign||function(h){for(var p=1;p2&&arguments[2]!==void 0?arguments[2]:[];u(this,h),this.name=p,this.contents=m,this.tags=v,this.attrs=n({},l.default,{class:"feather feather-"+p})}return i(h,[{key:"toSvg",value:function(){var m=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},v=n({},this.attrs,m,{class:(0,s.default)(this.attrs.class,m.class)});return""+this.contents+""}},{key:"toString",value:function(){return this.contents}}]),h}();function d(h){return Object.keys(h).map(function(p){return p+'="'+h[p]+'"'}).join(" ")}t.default=f},"./src/icons.js":function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r("./src/icon.js"),i=c(n),a=r("./dist/icons.json"),s=c(a),o=r("./src/tags.json"),l=c(o);function c(u){return u&&u.__esModule?u:{default:u}}t.default=Object.keys(s.default).map(function(u){return new i.default(u,s.default[u],l.default[u])}).reduce(function(u,f){return u[f.name]=f,u},{})},"./src/index.js":function(e,t,r){"use strict";var n=r("./src/icons.js"),i=c(n),a=r("./src/to-svg.js"),s=c(a),o=r("./src/replace.js"),l=c(o);function c(u){return u&&u.__esModule?u:{default:u}}e.exports={icons:i.default,toSvg:s.default,replace:l.default}},"./src/replace.js":function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=Object.assign||function(d){for(var h=1;h0&&arguments[0]!==void 0?arguments[0]:{};if(typeof document=="undefined")throw new Error("`feather.replace()` only works in a browser environment.");var h=document.querySelectorAll("[data-feather]");Array.from(h).forEach(function(p){return u(p,d)})}function u(d){var h=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},p=f(d),m=p["data-feather"];if(delete p["data-feather"],o.default[m]===void 0){console.warn("feather: '"+m+"' is not a valid icon");return}var v=o.default[m].toSvg(n({},h,p,{class:(0,a.default)(h.class,p.class)})),y=new DOMParser().parseFromString(v,"image/svg+xml"),b=y.querySelector("svg");d.parentNode.replaceChild(b,d)}function f(d){return Array.from(d.attributes).reduce(function(h,p){return h[p.name]=p.value,h},{})}t.default=c},"./src/tags.json":function(e){e.exports={activity:["pulse","health","action","motion"],airplay:["stream","cast","mirroring"],"alert-circle":["warning","alert","danger"],"alert-octagon":["warning","alert","danger"],"alert-triangle":["warning","alert","danger"],"align-center":["text alignment","center"],"align-justify":["text alignment","justified"],"align-left":["text alignment","left"],"align-right":["text alignment","right"],anchor:[],archive:["index","box"],"at-sign":["mention","at","email","message"],award:["achievement","badge"],aperture:["camera","photo"],"bar-chart":["statistics","diagram","graph"],"bar-chart-2":["statistics","diagram","graph"],battery:["power","electricity"],"battery-charging":["power","electricity"],bell:["alarm","notification","sound"],"bell-off":["alarm","notification","silent"],bluetooth:["wireless"],"book-open":["read","library"],book:["read","dictionary","booklet","magazine","library"],bookmark:["read","clip","marker","tag"],box:["cube"],briefcase:["work","bag","baggage","folder"],calendar:["date"],camera:["photo"],cast:["chromecast","airplay"],"chevron-down":["expand"],"chevron-up":["collapse"],circle:["off","zero","record"],clipboard:["copy"],clock:["time","watch","alarm"],"cloud-drizzle":["weather","shower"],"cloud-lightning":["weather","bolt"],"cloud-rain":["weather"],"cloud-snow":["weather","blizzard"],cloud:["weather"],codepen:["logo"],codesandbox:["logo"],code:["source","programming"],coffee:["drink","cup","mug","tea","cafe","hot","beverage"],columns:["layout"],command:["keyboard","cmd","terminal","prompt"],compass:["navigation","safari","travel","direction"],copy:["clone","duplicate"],"corner-down-left":["arrow","return"],"corner-down-right":["arrow"],"corner-left-down":["arrow"],"corner-left-up":["arrow"],"corner-right-down":["arrow"],"corner-right-up":["arrow"],"corner-up-left":["arrow"],"corner-up-right":["arrow"],cpu:["processor","technology"],"credit-card":["purchase","payment","cc"],crop:["photo","image"],crosshair:["aim","target"],database:["storage","memory"],delete:["remove"],disc:["album","cd","dvd","music"],"dollar-sign":["currency","money","payment"],droplet:["water"],edit:["pencil","change"],"edit-2":["pencil","change"],"edit-3":["pencil","change"],eye:["view","watch"],"eye-off":["view","watch","hide","hidden"],"external-link":["outbound"],facebook:["logo","social"],"fast-forward":["music"],figma:["logo","design","tool"],"file-minus":["delete","remove","erase"],"file-plus":["add","create","new"],"file-text":["data","txt","pdf"],film:["movie","video"],filter:["funnel","hopper"],flag:["report"],"folder-minus":["directory"],"folder-plus":["directory"],folder:["directory"],framer:["logo","design","tool"],frown:["emoji","face","bad","sad","emotion"],gift:["present","box","birthday","party"],"git-branch":["code","version control"],"git-commit":["code","version control"],"git-merge":["code","version control"],"git-pull-request":["code","version control"],github:["logo","version control"],gitlab:["logo","version control"],globe:["world","browser","language","translate"],"hard-drive":["computer","server","memory","data"],hash:["hashtag","number","pound"],headphones:["music","audio","sound"],heart:["like","love","emotion"],"help-circle":["question mark"],hexagon:["shape","node.js","logo"],home:["house","living"],image:["picture"],inbox:["email"],instagram:["logo","camera"],key:["password","login","authentication","secure"],layers:["stack"],layout:["window","webpage"],"life-buoy":["help","life ring","support"],link:["chain","url"],"link-2":["chain","url"],linkedin:["logo","social media"],list:["options"],lock:["security","password","secure"],"log-in":["sign in","arrow","enter"],"log-out":["sign out","arrow","exit"],mail:["email","message"],"map-pin":["location","navigation","travel","marker"],map:["location","navigation","travel"],maximize:["fullscreen"],"maximize-2":["fullscreen","arrows","expand"],meh:["emoji","face","neutral","emotion"],menu:["bars","navigation","hamburger"],"message-circle":["comment","chat"],"message-square":["comment","chat"],"mic-off":["record","sound","mute"],mic:["record","sound","listen"],minimize:["exit fullscreen","close"],"minimize-2":["exit fullscreen","arrows","close"],minus:["subtract"],monitor:["tv","screen","display"],moon:["dark","night"],"more-horizontal":["ellipsis"],"more-vertical":["ellipsis"],"mouse-pointer":["arrow","cursor"],move:["arrows"],music:["note"],navigation:["location","travel"],"navigation-2":["location","travel"],octagon:["stop"],package:["box","container"],paperclip:["attachment"],pause:["music","stop"],"pause-circle":["music","audio","stop"],"pen-tool":["vector","drawing"],percent:["discount"],"phone-call":["ring"],"phone-forwarded":["call"],"phone-incoming":["call"],"phone-missed":["call"],"phone-off":["call","mute"],"phone-outgoing":["call"],phone:["call"],play:["music","start"],"pie-chart":["statistics","diagram"],"play-circle":["music","start"],plus:["add","new"],"plus-circle":["add","new"],"plus-square":["add","new"],pocket:["logo","save"],power:["on","off"],printer:["fax","office","device"],radio:["signal"],"refresh-cw":["synchronise","arrows"],"refresh-ccw":["arrows"],repeat:["loop","arrows"],rewind:["music"],"rotate-ccw":["arrow"],"rotate-cw":["arrow"],rss:["feed","subscribe"],save:["floppy disk"],scissors:["cut"],search:["find","magnifier","magnifying glass"],send:["message","mail","email","paper airplane","paper aeroplane"],settings:["cog","edit","gear","preferences"],"share-2":["network","connections"],shield:["security","secure"],"shield-off":["security","insecure"],"shopping-bag":["ecommerce","cart","purchase","store"],"shopping-cart":["ecommerce","cart","purchase","store"],shuffle:["music"],"skip-back":["music"],"skip-forward":["music"],slack:["logo"],slash:["ban","no"],sliders:["settings","controls"],smartphone:["cellphone","device"],smile:["emoji","face","happy","good","emotion"],speaker:["audio","music"],star:["bookmark","favorite","like"],"stop-circle":["media","music"],sun:["brightness","weather","light"],sunrise:["weather","time","morning","day"],sunset:["weather","time","evening","night"],tablet:["device"],tag:["label"],target:["logo","bullseye"],terminal:["code","command line","prompt"],thermometer:["temperature","celsius","fahrenheit","weather"],"thumbs-down":["dislike","bad","emotion"],"thumbs-up":["like","good","emotion"],"toggle-left":["on","off","switch"],"toggle-right":["on","off","switch"],tool:["settings","spanner"],trash:["garbage","delete","remove","bin"],"trash-2":["garbage","delete","remove","bin"],triangle:["delta"],truck:["delivery","van","shipping","transport","lorry"],tv:["television","stream"],twitch:["logo"],twitter:["logo","social"],type:["text"],umbrella:["rain","weather"],unlock:["security"],"user-check":["followed","subscribed"],"user-minus":["delete","remove","unfollow","unsubscribe"],"user-plus":["new","add","create","follow","subscribe"],"user-x":["delete","remove","unfollow","unsubscribe","unavailable"],user:["person","account"],users:["group"],"video-off":["camera","movie","film"],video:["camera","movie","film"],voicemail:["phone"],volume:["music","sound","mute"],"volume-1":["music","sound"],"volume-2":["music","sound"],"volume-x":["music","sound","mute"],watch:["clock","time"],"wifi-off":["disabled"],wifi:["connection","signal","wireless"],wind:["weather","air"],"x-circle":["cancel","close","delete","remove","times","clear"],"x-octagon":["delete","stop","alert","warning","times","clear"],"x-square":["cancel","close","delete","remove","times","clear"],x:["cancel","close","delete","remove","times","clear"],youtube:["logo","video","play"],"zap-off":["flash","camera","lightning"],zap:["flash","camera","lightning"],"zoom-in":["magnifying glass"],"zoom-out":["magnifying glass"]}},"./src/to-svg.js":function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r("./src/icons.js"),i=a(n);function a(o){return o&&o.__esModule?o:{default:o}}function s(o){var l=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(console.warn("feather.toSvg() is deprecated. Please use feather.icons[name].toSvg() instead."),!o)throw new Error("The required `key` (icon name) parameter is missing.");if(!i.default[o])throw new Error("No icon matching '"+o+"'. See the complete list of icons at https://feathericons.com");return i.default[o].toSvg(l)}t.default=s},0:function(e,t,r){r("./node_modules/core-js/es/array/from.js"),e.exports=r("./src/index.js")}})})});var UH={};QP(UH,{default:()=>Qd});module.exports=eR(UH);g();g();var tl=ze(m1(),1),Ep=ze(E1(),1),t2=ze(k1(),1),uu=ze(hw(),1),Qc=ze(gw(),1),r2=ze(Aw(),1),Qr=ze(Tw(),1),n2=ze(Ow(),1),Se=class e extends Error{constructor(t){super(t),this.caller=""}toJSON(){return{code:this.code,data:this.data,caller:this.caller,message:this.message,stack:this.stack}}fromJSON(t){let r=new e(t.message);return r.code=t.code,r.data=t.data,r.caller=t.caller,r.stack=t.stack,r}get isIsomorphicGitError(){return!0}},rl=class e extends Se{constructor(t){super(`Modifying the index is not possible because you have unmerged files: ${t.toString}. Fix them up in the work tree, and then use 'git add/rm as appropriate to mark resolution and make a commit.`),this.code=this.name=e.code,this.data={filepaths:t}}};rl.code="UnmergedPathsError";var le=class e extends Se{constructor(t){super(`An internal error caused this command to fail. Please file a bug report at https://github.com/isomorphic-git/isomorphic-git/issues with this error message: ${t}`),this.code=this.name=e.code,this.data={message:t}}};le.code="InternalError";var ds=class e extends Se{constructor(t){super(`The filepath "${t}" contains unsafe character sequences`),this.code=this.name=e.code,this.data={filepath:t}}};ds.code="UnsafeFilepathError";var Fr=class{constructor(t){this.buffer=t,this._start=0}eof(){return this._start>=this.buffer.length}tell(){return this._start}seek(t){this._start=t}slice(t){let r=this.buffer.slice(this._start,this._start+t);return this._start+=t,r}toString(t,r){let n=this.buffer.toString(t,this._start,this._start+r);return this._start+=r,n}write(t,r,n){let i=this.buffer.write(t,this._start,r,n);return this._start+=r,i}copy(t,r,n){let i=t.copy(this.buffer,this._start,r,n);return this._start+=i,i}readUInt8(){let t=this.buffer.readUInt8(this._start);return this._start+=1,t}writeUInt8(t){let r=this.buffer.writeUInt8(t,this._start);return this._start+=1,r}readUInt16BE(){let t=this.buffer.readUInt16BE(this._start);return this._start+=2,t}writeUInt16BE(t){let r=this.buffer.writeUInt16BE(t,this._start);return this._start+=2,r}readUInt32BE(){let t=this.buffer.readUInt32BE(this._start);return this._start+=4,t}writeUInt32BE(t){let r=this.buffer.writeUInt32BE(t,this._start);return this._start+=4,r}};function fu(e,t){return-(et)}function i2(e,t){return fu(e.path,t.path)}function a2(e){let t=e>0?e>>12:0;t!==4&&t!==8&&t!==10&&t!==14&&(t=8);let r=e&511;return r&73?r=493:r=420,t!==8&&(r=0),(t<<12)+r}var xn=2**32;function Iw(e,t,r,n){if(e!==void 0&&t!==void 0)return[e,t];r===void 0&&(r=n.valueOf());let i=Math.floor(r/1e3),a=(r-i*1e3)*1e6;return[i,a]}function hs(e){let[t,r]=Iw(e.ctimeSeconds,e.ctimeNanoseconds,e.ctimeMs,e.ctime),[n,i]=Iw(e.mtimeSeconds,e.mtimeNanoseconds,e.mtimeMs,e.mtime);return{ctimeSeconds:t%xn,ctimeNanoseconds:r%xn,mtimeSeconds:n%xn,mtimeNanoseconds:i%xn,dev:e.dev%xn,ino:e.ino%xn,mode:a2(e.mode%xn),uid:e.uid%xn,gid:e.gid%xn,size:e.size>-1?e.size%xn:0}}function r6(e){let t="";for(let r of new Uint8Array(e))r<16&&(t+="0"),t+=r.toString(16);return t}var rp=null;async function Vn(e){return rp===null&&(rp=await i6()),rp?s2(e):n6(e)}function n6(e){return new Ep.default().update(e).digest("hex")}async function s2(e){let t=await crypto.subtle.digest("SHA-1",e);return r6(t)}async function i6(){try{if(await s2(new Uint8Array([]))==="da39a3ee5e6b4b0d3255bfef95601890afd80709")return!0}catch(e){}return!1}function a6(e){return{assumeValid:!!(e&32768),extended:!!(e&16384),stage:(e&12288)>>12,nameLength:e&4095}}function s6(e){let t=e.flags;return t.extended=!1,t.nameLength=Math.min(Buffer.from(e.path).length,4095),(t.assumeValid?32768:0)+(t.extended?16384:0)+((t.stage&3)<<12)+(t.nameLength&4095)}var dp=class e{constructor(t,r){this._dirty=!1,this._unmergedPaths=r||new Set,this._entries=t||new Map}_addEntry(t){if(t.flags.stage===0)t.stages=[t],this._entries.set(t.path,t),this._unmergedPaths.delete(t.path);else{let r=this._entries.get(t.path);r||(this._entries.set(t.path,t),r=t),r.stages[t.flags.stage]=t,this._unmergedPaths.add(t.path)}}static async from(t){if(Buffer.isBuffer(t))return e.fromBuffer(t);if(t===null)return new e(null);throw new le("invalid type passed to GitIndex.from")}static async fromBuffer(t){if(t.length===0)throw new le("Index file is empty (.git/index)");let r=new e,n=new Fr(t),i=n.toString("utf8",4);if(i!=="DIRC")throw new le(`Invalid dircache magic file number: ${i}`);let a=await Vn(t.slice(0,-20)),s=t.slice(-20).toString("hex");if(s!==a)throw new le(`Invalid checksum in GitIndex buffer: expected ${s} but saw ${a}`);let o=n.readUInt32BE();if(o!==2)throw new le(`Unsupported dircache version: ${o}`);let l=n.readUInt32BE(),c=0;for(;!n.eof()&&ct.stages.length>1?t.stages.filter(r=>r):t)}*[Symbol.iterator](){for(let t of this.entries)yield t}insert({filepath:t,stats:r,oid:n,stage:i=0}){r||(r={ctimeSeconds:0,ctimeNanoseconds:0,mtimeSeconds:0,mtimeNanoseconds:0,dev:0,ino:0,mode:0,uid:0,gid:0,size:0}),r=hs(r);let a=Buffer.from(t),s={ctimeSeconds:r.ctimeSeconds,ctimeNanoseconds:r.ctimeNanoseconds,mtimeSeconds:r.mtimeSeconds,mtimeNanoseconds:r.mtimeNanoseconds,dev:r.dev,ino:r.ino,mode:r.mode||33188,uid:r.uid,gid:r.gid,size:r.size,path:t,oid:n,flags:{assumeValid:!1,extended:!1,stage:i,nameLength:a.length<4095?a.length:4095},stages:[]};this._addEntry(s),this._dirty=!0}delete({filepath:t}){if(this._entries.has(t))this._entries.delete(t);else for(let r of this._entries.keys())r.startsWith(t+"/")&&this._entries.delete(r);this._unmergedPaths.has(t)&&this._unmergedPaths.delete(t),this._dirty=!0}clear(){this._entries.clear(),this._dirty=!0}has({filepath:t}){return this._entries.has(t)}render(){return this.entries.map(t=>`${t.mode.toString(8)} ${t.oid} ${t.path}`).join(` +`)}static async _entryToBuffer(t){let r=Buffer.from(t.path),n=Math.ceil((62+r.length+1)/8)*8,i=Buffer.alloc(n),a=new Fr(i),s=hs(t);return a.writeUInt32BE(s.ctimeSeconds),a.writeUInt32BE(s.ctimeNanoseconds),a.writeUInt32BE(s.mtimeSeconds),a.writeUInt32BE(s.mtimeNanoseconds),a.writeUInt32BE(s.dev),a.writeUInt32BE(s.ino),a.writeUInt32BE(s.mode),a.writeUInt32BE(s.uid),a.writeUInt32BE(s.gid),a.writeUInt32BE(s.size),a.write(t.oid,20,"hex"),a.writeUInt16BE(s6(t)),a.write(t.path,r.length,"utf8"),i}async toObject(){let t=Buffer.alloc(12),r=new Fr(t);r.write("DIRC",4,"utf8"),r.writeUInt32BE(2),r.writeUInt32BE(this.entriesFlat.length);let n=[];for(let o of this.entries)if(n.push(e._entryToBuffer(o)),o.stages.length>1)for(let l of o.stages)l&&l!==o&&n.push(e._entryToBuffer(l));n=await Promise.all(n);let i=Buffer.concat(n),a=Buffer.concat([t,i]),s=await Vn(a);return Buffer.concat([a,Buffer.from(s,"hex")])}};function eu(e,t,r=!0,n=!0){let i=hs(e),a=hs(t);return r&&i.mode!==a.mode||i.mtimeSeconds!==a.mtimeSeconds||i.ctimeSeconds!==a.ctimeSeconds||i.uid!==a.uid||i.gid!==a.gid||n&&i.ino!==a.ino||i.size!==a.size}var np=null,us=Symbol("IndexCache");function o6(){return{map:new Map,stats:new Map}}async function l6(e,t,r){let n=await e.lstat(t),i=await e.read(t),a=await dp.from(i);r.map.set(t,a),r.stats.set(t,n)}async function c6(e,t,r){let n=r.stats.get(t);if(n===void 0)return!0;let i=await e.lstat(t);return n===null||i===null?!1:eu(n,i)}var yt=class{static async acquire({fs:t,gitdir:r,cache:n,allowUnmerged:i=!0},a){n[us]||(n[us]=o6());let s=`${r}/index`;np===null&&(np=new tl.default({maxPending:1/0}));let o,l=[];return await np.acquire(s,async()=>{await c6(t,s,n[us])&&await l6(t,s,n[us]);let c=n[us].map.get(s);if(l=c.unmergedPaths,l.length&&!i)throw new rl(l);if(o=await a(c),c._dirty){let u=await c.toObject();await t.write(s,u),n[us].stats.set(s,await t.lstat(s)),c._dirty=!1}}),o}};function tu(e){let t=Math.max(e.lastIndexOf("/"),e.lastIndexOf("\\"));return t>-1&&(e=e.slice(t+1)),e}function ps(e){let t=Math.max(e.lastIndexOf("/"),e.lastIndexOf("\\"));return t===-1?".":t===0?"/":e.slice(0,t)}function o2(e){let t=new Map,r=function(i){if(!t.has(i)){let a={type:"tree",fullpath:i,basename:tu(i),metadata:{},children:[]};t.set(i,a),a.parent=r(ps(i)),a.parent&&a.parent!==a&&a.parent.children.push(a)}return t.get(i)},n=function(i,a){if(!t.has(i)){let s={type:"blob",fullpath:i,basename:tu(i),metadata:a,parent:r(ps(i)),children:[]};s.parent&&s.parent.children.push(s),t.set(i,s)}return t.get(i)};r(".");for(let i of e)n(i.path,i);return t}function u6(e){switch(e){case 16384:return"tree";case 33188:return"blob";case 33261:return"blob";case 40960:return"blob";case 57344:return"commit"}throw new le(`Unexpected GitTree entry mode: ${e.toString(8)}`)}var hp=class{constructor({fs:t,gitdir:r,cache:n}){this.treePromise=yt.acquire({fs:t,gitdir:r,cache:n},async function(a){return o2(a.entries)});let i=this;this.ConstructEntry=class{constructor(s){this._fullpath=s,this._type=!1,this._mode=!1,this._stat=!1,this._oid=!1}async type(){return i.type(this)}async mode(){return i.mode(this)}async stat(){return i.stat(this)}async content(){return i.content(this)}async oid(){return i.oid(this)}}}async readdir(t){let r=t._fullpath,i=(await this.treePromise).get(r);if(!i||i.type==="blob")return null;if(i.type!=="tree")throw new Error(`ENOTDIR: not a directory, scandir '${r}'`);let a=i.children.map(s=>s.fullpath);return a.sort(fu),a}async type(t){return t._type===!1&&await t.stat(),t._type}async mode(t){return t._mode===!1&&await t.stat(),t._mode}async stat(t){if(t._stat===!1){let n=(await this.treePromise).get(t._fullpath);if(!n)throw new Error(`ENOENT: no such file or directory, lstat '${t._fullpath}'`);let i=n.type==="tree"?{}:hs(n.metadata);t._type=n.type==="tree"?"tree":u6(i.mode),t._mode=i.mode,n.type==="tree"?t._stat=void 0:t._stat=i}return t._stat}async content(t){}async oid(t){if(t._oid===!1){let n=(await this.treePromise).get(t._fullpath);t._oid=n.metadata.oid}return t._oid}},du=Symbol("GitWalkSymbol");function hu(){let e=Object.create(null);return Object.defineProperty(e,du,{value:function({fs:t,gitdir:r,cache:n}){return new hp({fs:t,gitdir:r,cache:n})}}),Object.freeze(e),e}var Le=class e extends Se{constructor(t){super(`Could not find ${t}.`),this.code=this.name=e.code,this.data={what:t}}};Le.code="NotFoundError";var zt=class e extends Se{constructor(t,r,n,i){super(`Object ${t} ${i?`at ${i}`:""}was anticipated to be a ${n} but it is a ${r}.`),this.code=this.name=e.code,this.data={oid:t,actual:r,expected:n,filepath:i}}};zt.code="ObjectTypeError";var _i=class e extends Se{constructor(t){super(`Expected a 40-char hex object id but saw "${t}".`),this.code=this.name=e.code,this.data={value:t}}};_i.code="InvalidOidError";var nl=class e extends Se{constructor(t){super(`Could not find a fetch refspec for remote "${t}". Make sure the config file has an entry like the following: +[remote "${t}"] + fetch = +refs/heads/*:refs/remotes/origin/* +`),this.code=this.name=e.code,this.data={remote:t}}};nl.code="NoRefspecError";var ru=class e{constructor(t){if(this.refs=new Map,this.parsedConfig=[],t){let r=null;this.parsedConfig=t.trim().split(` +`).map(n=>{if(/^\s*#/.test(n))return{line:n,comment:!0};let i=n.indexOf(" ");if(n.startsWith("^")){let a=n.slice(1);return this.refs.set(r+"^{}",a),{line:n,ref:r,peeled:a}}else{let a=n.slice(0,i);return r=n.slice(i+1),this.refs.set(r,a),{line:n,ref:r,oid:a}}})}return this}static from(t){return new e(t)}delete(t){this.parsedConfig=this.parsedConfig.filter(r=>r.ref!==t),this.refs.delete(t)}toString(){return this.parsedConfig.map(({line:t})=>t).join(` +`)+` +`}},nu=class e{constructor({remotePath:t,localPath:r,force:n,matchPrefix:i}){Object.assign(this,{remotePath:t,localPath:r,force:n,matchPrefix:i})}static from(t){let[r,n,i,a,s]=t.match(/^(\+?)(.*?)(\*?):(.*?)(\*?)$/).slice(1),o=r==="+",l=i==="*";if(l!==(s==="*"))throw new le("Invalid refspec");return new e({remotePath:n,localPath:a,force:o,matchPrefix:l})}translate(t){if(this.matchPrefix){if(t.startsWith(this.remotePath))return this.localPath+t.replace(this.remotePath,"")}else if(t===this.remotePath)return this.localPath;return null}reverseTranslate(t){if(this.matchPrefix){if(t.startsWith(this.localPath))return this.remotePath+t.replace(this.localPath,"")}else if(t===this.localPath)return this.remotePath;return null}},pp=class e{constructor(t=[]){this.rules=t}static from(t){let r=[];for(let n of t)r.push(nu.from(n));return new e(r)}add(t){let r=nu.from(t);this.rules.push(r)}translate(t){let r=[];for(let n of this.rules)for(let i of t){let a=n.translate(i);a&&r.push([i,a])}return r}translateOne(t){let r=null;for(let n of this.rules){let i=n.translate(t);i&&(r=i)}return r}localNamespaces(){return this.rules.filter(t=>t.matchPrefix).map(t=>t.localPath.replace(/\/$/,""))}};function f6(e,t){let r=e.replace(/\^\{\}$/,""),n=t.replace(/\^\{\}$/,""),i=-(rn);return i===0?e.endsWith("^{}")?1:-1:i}var Fw=new Map;function $w(e){let t=Fw.get(e);return t||(t=d6(e),Fw.set(e,t)),t}function d6(e){return e=e.split("/./").join("/").replace(/\/{2,}/g,"/"),e==="/."?"/":e==="./"||(e.startsWith("./")&&(e=e.slice(2)),e.endsWith("/.")&&(e=e.slice(0,-2)),e.length>1&&e.endsWith("/")&&(e=e.slice(0,-1)),e==="")?".":e}function $(...e){return $w(e.map($w).join("/"))}var h6=e=>{e=e.toLowerCase();let t=parseInt(e);return e.endsWith("k")&&(t*=1024),e.endsWith("m")&&(t*=1024*1024),e.endsWith("g")&&(t*=1024*1024*1024),t},el=e=>{if(e=e.trim().toLowerCase(),e==="true"||e==="yes"||e==="on")return!0;if(e==="false"||e==="no"||e==="off")return!1;throw Error(`Expected 'true', 'false', 'yes', 'no', 'on', or 'off', but got ${e}`)},Lw={core:{filemode:el,bare:el,logallrefupdates:el,symlinks:el,ignorecase:el,bigFileThreshold:h6}},p6=/^\[([A-Za-z0-9-.]+)(?: "(.*)")?\]$/,m6=/^[A-Za-z0-9-.]+$/,g6=/^([A-Za-z][A-Za-z-]*)(?: *= *(.*))?$/,v6=/^[A-Za-z][A-Za-z-]*$/,y6=/^(.*?)( *[#;].*)$/,w6=e=>{let t=p6.exec(e);if(t!=null){let[r,n]=t.slice(1);return[r,n]}return null},b6=e=>{let t=g6.exec(e);if(t!=null){let[r,n="true"]=t.slice(1),i=_6(n),a=x6(i);return[r,a]}return null},_6=e=>{let t=y6.exec(e);if(t==null)return e;let[r,n]=t.slice(1);return Dw(r)&&Dw(n)?`${r}${n}`:r},Dw=e=>(e.match(/(?:^|[^\\])"/g)||[]).length%2!==0,x6=e=>e.split("").reduce((t,r,n,i)=>{let a=r==='"'&&i[n-1]!=="\\",s=r==="\\"&&i[n+1]==='"';return a||s?t:t+r},""),Nw=e=>e!=null?e.toLowerCase():null,mp=(e,t,r)=>[Nw(e),t,Nw(r)].filter(n=>n!=null).join("."),Bw=e=>{let t=e.split("."),r=t.shift(),n=t.pop(),i=t.length?t.join("."):void 0;return{section:r,subsection:i,name:n,path:mp(r,i,n),sectionPath:mp(r,i,null)}},S6=(e,t)=>e.reduce((r,n,i)=>t(n)?i:r,-1),gp=class e{constructor(t){let r=null,n=null;this.parsedConfig=t?t.split(` +`).map(i=>{let a=null,s=null,o=i.trim(),l=w6(o),c=l!=null;if(c)[r,n]=l;else{let f=b6(o);f!=null&&([a,s]=f)}let u=mp(r,n,a);return{line:i,isSection:c,section:r,subsection:n,name:a,value:s,path:u}}):[]}static from(t){return new e(t)}async get(t,r=!1){let n=Bw(t).path,i=this.parsedConfig.filter(a=>a.path===n).map(({section:a,name:s,value:o})=>{let l=Lw[a]&&Lw[a][s];return l?l(o):o});return r?i:i.pop()}async getall(t){return this.get(t,!0)}async getSubsections(t){return this.parsedConfig.filter(r=>r.section===t&&r.isSection).map(r=>r.subsection)}async deleteSection(t,r){this.parsedConfig=this.parsedConfig.filter(n=>!(n.section===t&&n.subsection===r))}async append(t,r){return this.set(t,r,!0)}async set(t,r,n=!1){let{section:i,subsection:a,name:s,path:o,sectionPath:l}=Bw(t),c=S6(this.parsedConfig,u=>u.path===o);if(r==null)c!==-1&&this.parsedConfig.splice(c,1);else if(c!==-1){let u=this.parsedConfig[c],f=Object.assign({},u,{name:s,value:r,modified:!0});n?this.parsedConfig.splice(c+1,0,f):this.parsedConfig[c]=f}else{let u=this.parsedConfig.findIndex(d=>d.path===l),f={section:i,subsection:a,name:s,value:r,modified:!0,path:o};if(m6.test(i)&&v6.test(s))if(u>=0)this.parsedConfig.splice(u+1,0,f);else{let d={section:i,subsection:a,modified:!0,path:l};this.parsedConfig.push(d,f)}}}toString(){return this.parsedConfig.map(({line:t,section:r,subsection:n,name:i,value:a,modified:s=!1})=>s?i!=null&&a!=null?typeof a=="string"&&/[#;]/.test(a)?` ${i} = "${a}"`:` ${i} = ${a}`:n!=null?`[${r} "${n}"]`:`[${r}]`:t).join(` +`)}},We=class{static async get({fs:t,gitdir:r}){let n=await t.read(`${r}/config`,{encoding:"utf8"});return gp.from(n)}static async save({fs:t,gitdir:r,config:n}){await t.write(`${r}/config`,n.toString(),{encoding:"utf8"})}},Kc=e=>[`${e}`,`refs/${e}`,`refs/tags/${e}`,`refs/heads/${e}`,`refs/remotes/${e}`,`refs/remotes/${e}/HEAD`],E6=["config","description","index","shallow","commondir"],ip;async function yi(e,t){return ip===void 0&&(ip=new tl.default),ip.acquire(e,t)}var W=class e{static async updateRemoteRefs({fs:t,gitdir:r,remote:n,refs:i,symrefs:a,tags:s,refspecs:o=void 0,prune:l=!1,pruneTags:c=!1}){for(let v of i.values())if(!v.match(/[0-9a-f]{40}/))throw new _i(v);let u=await We.get({fs:t,gitdir:r});if(!o){if(o=await u.getall(`remote.${n}.fetch`),o.length===0)throw new nl(n);o.unshift(`+HEAD:refs/remotes/${n}/HEAD`)}let f=pp.from(o),d=new Map;if(c){let v=await e.listRefs({fs:t,gitdir:r,filepath:"refs/tags"});await e.deleteRefs({fs:t,gitdir:r,refs:v.map(y=>`refs/tags/${y}`)})}if(s){for(let v of i.keys())if(v.startsWith("refs/tags")&&!v.endsWith("^{}")&&!await e.exists({fs:t,gitdir:r,ref:v})){let y=i.get(v);d.set(v,y)}}let h=f.translate([...i.keys()]);for(let[v,y]of h){let b=i.get(v);d.set(y,b)}let p=f.translate([...a.keys()]);for(let[v,y]of p){let b=a.get(v),x=f.translateOne(b);x&&d.set(y,`ref: ${x}`)}let m=[];if(l){for(let v of f.localNamespaces()){let y=(await e.listRefs({fs:t,gitdir:r,filepath:v})).map(b=>`${v}/${b}`);for(let b of y)d.has(b)||m.push(b)}m.length>0&&await e.deleteRefs({fs:t,gitdir:r,refs:m})}for(let[v,y]of d)await yi(v,async()=>t.write($(r,v),`${y.trim()} +`,"utf8"));return{pruned:m}}static async writeRef({fs:t,gitdir:r,ref:n,value:i}){if(!i.match(/[0-9a-f]{40}/))throw new _i(i);await yi(n,async()=>t.write($(r,n),`${i.trim()} +`,"utf8"))}static async writeSymbolicRef({fs:t,gitdir:r,ref:n,value:i}){await yi(n,async()=>t.write($(r,n),`ref: ${i.trim()} +`,"utf8"))}static async deleteRef({fs:t,gitdir:r,ref:n}){return e.deleteRefs({fs:t,gitdir:r,refs:[n]})}static async deleteRefs({fs:t,gitdir:r,refs:n}){await Promise.all(n.map(o=>t.rm($(r,o))));let i=await yi("packed-refs",async()=>t.read(`${r}/packed-refs`,{encoding:"utf8"})),a=ru.from(i),s=a.refs.size;for(let o of n)a.refs.has(o)&&a.delete(o);a.refs.sizet.write(`${r}/packed-refs`,i,{encoding:"utf8"})))}static async resolve({fs:t,gitdir:r,ref:n,depth:i=void 0}){if(i!==void 0&&(i--,i===-1))return n;if(n.startsWith("ref: "))return n=n.slice(5),e.resolve({fs:t,gitdir:r,ref:n,depth:i});if(n.length===40&&/[0-9a-f]{40}/.test(n))return n;let a=await e.packedRefs({fs:t,gitdir:r}),s=Kc(n).filter(o=>!E6.includes(o));for(let o of s){let l=await yi(o,async()=>await t.read(`${r}/${o}`,{encoding:"utf8"})||a.get(o));if(l)return e.resolve({fs:t,gitdir:r,ref:l.trim(),depth:i})}throw new Le(n)}static async exists({fs:t,gitdir:r,ref:n}){try{return await e.expand({fs:t,gitdir:r,ref:n}),!0}catch(i){return!1}}static async expand({fs:t,gitdir:r,ref:n}){if(n.length===40&&/[0-9a-f]{40}/.test(n))return n;let i=await e.packedRefs({fs:t,gitdir:r}),a=Kc(n);for(let s of a)if(await yi(s,async()=>t.exists(`${r}/${s}`))||i.has(s))return s;throw new Le(n)}static async expandAgainstMap({ref:t,map:r}){let n=Kc(t);for(let i of n)if(await r.has(i))return i;throw new Le(t)}static resolveAgainstMap({ref:t,fullref:r=t,depth:n=void 0,map:i}){if(n!==void 0&&(n--,n===-1))return{fullref:r,oid:t};if(t.startsWith("ref: "))return t=t.slice(5),e.resolveAgainstMap({ref:t,fullref:r,depth:n,map:i});if(t.length===40&&/[0-9a-f]{40}/.test(t))return{fullref:r,oid:t};let a=Kc(t);for(let s of a){let o=i.get(s);if(o)return e.resolveAgainstMap({ref:o.trim(),fullref:s,depth:n,map:i})}throw new Le(t)}static async packedRefs({fs:t,gitdir:r}){let n=await yi("packed-refs",async()=>t.read(`${r}/packed-refs`,{encoding:"utf8"}));return ru.from(n).refs}static async listRefs({fs:t,gitdir:r,filepath:n}){let i=e.packedRefs({fs:t,gitdir:r}),a=null;try{a=await t.readdirDeep(`${r}/${n}`),a=a.map(s=>s.replace(`${r}/${n}/`,""))}catch(s){a=[]}for(let s of(await i).keys())s.startsWith(n)&&(s=s.replace(n+"/",""),a.includes(s)||a.push(s));return a.sort(f6),a}static async listBranches({fs:t,gitdir:r,remote:n}){return n?e.listRefs({fs:t,gitdir:r,filepath:`refs/remotes/${n}`}):e.listRefs({fs:t,gitdir:r,filepath:"refs/heads"})}static async listTags({fs:t,gitdir:r}){return(await e.listRefs({fs:t,gitdir:r,filepath:"refs/tags"})).filter(i=>!i.endsWith("^{}"))}};function A6(e,t){return fu(jw(e),jw(t))}function jw(e){return e.mode==="040000"?e.path+"/":e.path}function l2(e){switch(e){case"040000":return"tree";case"100644":return"blob";case"100755":return"blob";case"120000":return"blob";case"160000":return"commit"}throw new le(`Unexpected GitTree entry mode: ${e}`)}function k6(e){let t=[],r=0;for(;r`${t.mode} ${t.type} ${t.oid} ${t.path}`).join(` +`)}toObject(){let t=[...this._entries];return t.sort(A6),Buffer.concat(t.map(r=>{let n=Buffer.from(r.mode.replace(/^0/,"")),i=Buffer.from(" "),a=Buffer.from(r.path,"utf8"),s=Buffer.from([0]),o=Buffer.from(r.oid,"hex");return Buffer.concat([n,i,a,s,o])}))}entries(){return this._entries}*[Symbol.iterator](){for(let t of this._entries)yield t}},xi=class{static wrap({type:t,object:r}){return Buffer.concat([Buffer.from(`${t} ${r.byteLength.toString()}\0`),Buffer.from(r)])}static unwrap(t){let r=t.indexOf(32),n=t.indexOf(0),i=t.slice(0,r).toString("utf8"),a=t.slice(r+1,n).toString("utf8"),s=t.length-(n+1);if(parseInt(a)!==s)throw new le(`Length mismatch: expected ${a} bytes but got ${s} instead.`);return{type:i,object:Buffer.from(t.slice(n+1))}}};async function P6({fs:e,gitdir:t,oid:r}){let n=`objects/${r.slice(0,2)}/${r.slice(2)}`,i=await e.read(`${t}/${n}`);return i?{object:i,format:"deflated",source:n}:null}function R6(e,t){let r=new Fr(e),n=Hw(r);if(n!==t.byteLength)throw new le(`applyDelta expected source buffer to be ${n} bytes but the provided buffer was ${t.length} bytes`);let i=Hw(r),a,s=Gw(r,t);if(s.byteLength===i)a=s;else{a=Buffer.alloc(i);let o=new Fr(a);for(o.copy(s);!r.eof();)o.copy(Gw(r,t));let l=o.tell();if(i!==l)throw new le(`applyDelta expected target buffer to be ${i} bytes but the resulting buffer was ${l} bytes`)}return a}function Hw(e){let t=0,r=0,n=null;do n=e.readUInt8(),t|=(n&127)<>=1,i+=8;return n}function Gw(e,t){let r=e.readUInt8(),n=128,i=15,a=112;if(r&n){let s=Uw(e,r&i,4),o=Uw(e,(r&a)>>4,3);return o===0&&(o=65536),t.slice(s,s+o)}else return e.slice(r)}function M6(e){let t=[e];return{next(){return Promise.resolve({done:t.length===0,value:t.pop()})},return(){return t=[],{}},[Symbol.asyncIterator](){return this}}}function c2(e){return e[Symbol.asyncIterator]?e[Symbol.asyncIterator]():e[Symbol.iterator]?e[Symbol.iterator]():e.next?e:M6(e)}var iu=class{constructor(t){if(typeof Buffer=="undefined")throw new Error("Missing Buffer dependency");this.stream=c2(t),this.buffer=null,this.cursor=0,this.undoCursor=0,this.started=!1,this._ended=!1,this._discardedBytes=0}eof(){return this._ended&&this.cursor===this.buffer.length}tell(){return this._discardedBytes+this.cursor}async byte(){if(!this.eof()&&(this.started||await this._init(),!(this.cursor===this.buffer.length&&(await this._loadnext(),this._ended))))return this._moveCursor(1),this.buffer[this.undoCursor]}async chunk(){if(!this.eof()&&(this.started||await this._init(),!(this.cursor===this.buffer.length&&(await this._loadnext(),this._ended))))return this._moveCursor(this.buffer.length),this.buffer.slice(this.undoCursor,this.cursor)}async read(t){if(!this.eof())return this.started||await this._init(),this.cursor+t>this.buffer.length&&(this._trim(),await this._accumulate(t)),this._moveCursor(t),this.buffer.slice(this.undoCursor,this.cursor)}async skip(t){this.eof()||(this.started||await this._init(),this.cursor+t>this.buffer.length&&(this._trim(),await this._accumulate(t)),this._moveCursor(t))}async undo(){this.cursor=this.undoCursor}async _next(){this.started=!0;let{done:t,value:r}=await this.stream.next();return t&&(this._ended=!0,!r)?Buffer.alloc(0):(r&&(r=Buffer.from(r)),r)}_trim(){this.buffer=this.buffer.slice(this.undoCursor),this.cursor-=this.undoCursor,this._discardedBytes+=this.undoCursor,this.undoCursor=0}_moveCursor(t){this.undoCursor=this.cursor,this.cursor+=t,this.cursor>this.buffer.length&&(this.cursor=this.buffer.length)}async _accumulate(t){if(this._ended)return;let r=[this.buffer];for(;this.cursor+t>O6(r);){let n=await this._next();if(this._ended)break;r.push(n)}this.buffer=Buffer.concat(r)}async _loadnext(){this._discardedBytes+=this.buffer.length,this.undoCursor=0,this.cursor=0,this.buffer=await this._next()}async _init(){this.buffer=await this._next()}};function O6(e){return e.reduce((t,r)=>t+r.length,0)}async function I6(e,t){let r=new iu(e),n=await r.read(4);if(n=n.toString("utf8"),n!=="PACK")throw new le(`Invalid PACK header '${n}'`);let i=await r.read(4);if(i=i.readUInt32BE(0),i!==2)throw new le(`Invalid packfile version: ${i}`);let a=await r.read(4);if(a=a.readUInt32BE(0),!(a<1))for(;!r.eof()&&a--;){let s=r.tell(),{type:o,length:l,ofs:c,reference:u}=await F6(r),f=new uu.default.Inflate;for(;!f.result;){let d=await r.chunk();if(!d)break;if(f.push(d,!1),f.err)throw new le(`Pako error: ${f.msg}`);if(f.result){if(f.result.length!==l)throw new le("Inflated object size is different from that stated in packfile.");await r.undo(),await r.read(d.length-f.strm.avail_in);let h=r.tell();await t({data:f.result,type:o,num:a,offset:s,end:h,reference:u,ofs:c})}}}}async function F6(e){let t=await e.byte(),r=t>>4&7,n=t&15;if(t&128){let s=4;do t=await e.byte(),n|=(t&127)<i+1<<7|a,-1)}function N6(e,t){let r=t,n=4,i=null;do i=e.readUInt8(),r|=(i&127)<2048*1024*1024)throw new le("To keep implementation simple, I haven't implemented the layer 5 feature needed to support packfiles > 2GB in size.");n.seek(n.tell()+4*255);let s=n.readUInt32BE(),o=[];for(let u=0;u{u===null&&(u=E);let _=Math.floor((u-E)*100/u);_!==f&&n&&await n({phase:"Receiving objects",loaded:u-E,total:u}),f=_,y=i[y],["commit","tree","blob","tag"].includes(y)?a[x]={type:y,offset:x}:y==="ofs-delta"?a[x]={type:y,offset:x}:y==="ref-delta"&&(a[x]={type:y,offset:x})});let d=Object.keys(a).map(Number);for(let[v,y]of d.entries()){let b=v+1===d.length?t.byteLength-20:d[v+1],x=a[y],E=t2.default.buf(t.slice(y,b))>>>0;x.end=b,x.crc=E}let h=new e({pack:Promise.resolve(t),packfileSha:s,crcs:l,hashes:o,offsets:c,getExternalRefDelta:r});f=null;let p=0,m=[0,0,0,0,0,0,0,0,0,0,0,0];for(let v in a){v=Number(v);let y=Math.floor(p*100/u);y!==f&&n&&await n({phase:"Resolving deltas",loaded:p,total:u}),p++,f=y;let b=a[v];if(!b.oid)try{h.readDepth=0,h.externalReadDepth=0;let{type:x,object:E}=await h.readSlice({start:v});m[h.readDepth]+=1;let _=await Vn(xi.wrap({type:x,object:E}));b.oid=_,o.push(_),c.set(_,v),l[_]=b.crc}catch(x){continue}}return o.sort(),h}async toBuffer(){let t=[],r=(c,u)=>{t.push(Buffer.from(c,u))};r("ff744f63","hex"),r("00000002","hex");let n=new Fr(Buffer.alloc(256*4));for(let c=0;c<256;c++){let u=0;for(let f of this.hashes)parseInt(f.slice(0,2),16)<=c&&u++;n.writeUInt32BE(u)}t.push(n.buffer);for(let c of this.hashes)r(c,"hex");let i=new Fr(Buffer.alloc(this.hashes.length*4));for(let c of this.hashes)i.writeUInt32BE(this.crcs[c]);t.push(i.buffer);let a=new Fr(Buffer.alloc(this.hashes.length*4));for(let c of this.hashes)a.writeUInt32BE(this.offsets.get(c));t.push(a.buffer),r(this.packfileSha,"hex");let s=Buffer.concat(t),o=await Vn(s),l=Buffer.alloc(20);return l.write(o,"hex"),Buffer.concat([s,l])}async load({pack:t}){this.pack=t}async unload(){this.pack=null}async read({oid:t}){if(!this.offsets.get(t)){if(this.getExternalRefDelta)return this.externalReadDepth++,this.getExternalRefDelta(t);throw new le(`Could not read object ${t} from packfile`)}let r=this.offsets.get(t);return this.readSlice({start:r})}async readSlice({start:t}){if(this.offsetCache[t])return Object.assign({},this.offsetCache[t]);this.readDepth++;let r={16:"commit",32:"tree",48:"blob",64:"tag",96:"ofs_delta",112:"ref_delta"};if(!this.pack)throw new le("Tried to read from a GitPackIndex with no packfile loaded into memory");let n=(await this.pack).slice(t),i=new Fr(n),a=i.readUInt8(),s=a&112,o=r[s];if(o===void 0)throw new le("Unrecognized type: 0b"+s.toString(2));let l=a&15,c=l;a&128&&(c=N6(i,l));let f=null,d=null;if(o==="ofs_delta"){let p=D6(i),m=t-p;({object:f,type:o}=await this.readSlice({start:m}))}if(o==="ref_delta"){let p=i.slice(20).toString("hex");({object:f,type:o}=await this.read({oid:p}))}let h=n.slice(i.tell());if(d=Buffer.from(await u2(h)),d.byteLength!==c)throw new le(`Packfile told us object would have length ${c} but it had length ${d.byteLength}`);return f&&(d=Buffer.from(R6(d,f))),this.readDepth>3&&(this.offsetCache[t]={type:o,object:d}),{type:o,format:"content",object:d}}},Jc=Symbol("PackfileCache");async function B6({fs:e,filename:t,getExternalRefDelta:r,emitter:n,emitterPrefix:i}){let a=await e.read(t);return il.fromIdx({idx:a,getExternalRefDelta:r})}function Ap({fs:e,cache:t,filename:r,getExternalRefDelta:n,emitter:i,emitterPrefix:a}){t[Jc]||(t[Jc]=new Map);let s=t[Jc].get(r);return s||(s=B6({fs:e,filename:r,getExternalRefDelta:n,emitter:i,emitterPrefix:a}),t[Jc].set(r,s)),s}async function j6({fs:e,cache:t,gitdir:r,oid:n,format:i="content",getExternalRefDelta:a}){let s=await e.readdir($(r,"objects/pack"));s=s.filter(o=>o.endsWith(".idx"));for(let o of s){let l=`${r}/objects/pack/${o}`,c=await Ap({fs:e,cache:t,filename:l,getExternalRefDelta:a});if(c.error)throw new le(c.error);if(c.offsets.has(n)){if(!c.pack){let f=l.replace(/idx$/,"pack");c.pack=e.read(f)}let u=await c.read({oid:n,getExternalRefDelta:a});return u.format="content",u.source=`objects/pack/${o.replace(/idx$/,"pack")}`,u}}return null}async function qe({fs:e,cache:t,gitdir:r,oid:n,format:i="content"}){let a=u=>qe({fs:e,cache:t,gitdir:r,oid:u}),s;if(n==="4b825dc642cb6eb9a060e54bf8d69288fbee4904"&&(s={format:"wrapped",object:Buffer.from("tree 0\0")}),s||(s=await P6({fs:e,gitdir:r,oid:n})),!s){if(s=await j6({fs:e,cache:t,gitdir:r,oid:n,getExternalRefDelta:a}),!s)throw new Le(n);return s}if(i==="deflated"||(s.format==="deflated"&&(s.object=Buffer.from(await u2(s.object)),s.format="wrapped"),i==="wrapped"))return s;let o=await Vn(s.object);if(o!==n)throw new le(`SHA check failed! Expected ${n}, computed ${o}`);let{object:l,type:c}=xi.unwrap(s.object);if(s.type=c,s.object=l,s.format="content",i==="content")return s;throw new le(`invalid requested format "${i}"`)}var en=class e extends Se{constructor(t,r,n=!0){super(`Failed to create ${t} at ${r} because it already exists.${n?` (Hint: use 'force: true' parameter to overwrite existing ${t}.)`:""}`),this.code=this.name=e.code,this.data={noun:t,where:r,canForce:n}}};en.code="AlreadyExistsError";var al=class e extends Se{constructor(t,r,n){super(`Found multiple ${t} matching "${r}" (${n.join(", ")}). Use a longer abbreviation length to disambiguate them.`),this.code=this.name=e.code,this.data={nouns:t,short:r,matches:n}}};al.code="AmbiguousError";var sl=class e extends Se{constructor(t){super(`Your local changes to the following files would be overwritten by checkout: ${t.join(", ")}`),this.code=this.name=e.code,this.data={filepaths:t}}};sl.code="CheckoutConflictError";var ol=class e extends Se{constructor(t,r){super(`Failed to checkout "${t}" because commit ${r} is not available locally. Do a git fetch to make the branch available locally.`),this.code=this.name=e.code,this.data={ref:t,oid:r}}};ol.code="CommitNotFetchedError";var ll=class e extends Se{constructor(){super("Empty response from git server."),this.code=this.name=e.code,this.data={}}};ll.code="EmptyServerResponseError";var cl=class e extends Se{constructor(){super("A simple fast-forward merge was not possible."),this.code=this.name=e.code,this.data={}}};cl.code="FastForwardError";var ul=class e extends Se{constructor(t,r){super(`One or more branches were not updated: ${t}`),this.code=this.name=e.code,this.data={prettyDetails:t,result:r}}};ul.code="GitPushError";var ms=class e extends Se{constructor(t,r,n){super(`HTTP Error: ${t} ${r}`),this.code=this.name=e.code,this.data={statusCode:t,statusMessage:r,response:n}}};ms.code="HttpError";var Si=class e extends Se{constructor(t){let r="invalid filepath";t==="leading-slash"||t==="trailing-slash"?r='"filepath" parameter should not include leading or trailing directory separators because these can cause problems on some platforms.':t==="directory"&&(r='"filepath" should not be a directory.'),super(r),this.code=this.name=e.code,this.data={reason:t}}};Si.code="InvalidFilepathError";var Wn=class e extends Se{constructor(t,r){super(`"${t}" would be an invalid git reference. (Hint: a valid alternative would be "${r}".)`),this.code=this.name=e.code,this.data={ref:t,suggestion:r}}};Wn.code="InvalidRefNameError";var fl=class e extends Se{constructor(t){super(`Maximum search depth of ${t} exceeded.`),this.code=this.name=e.code,this.data={depth:t}}};fl.code="MaxDepthError";var gs=class e extends Se{constructor(){super("Merges with conflicts are not supported yet."),this.code=this.name=e.code,this.data={}}};gs.code="MergeNotSupportedError";var vs=class e extends Se{constructor(t,r,n,i){super(`Automatic merge failed with one or more merge conflicts in the following files: ${t.toString()}. Fix conflicts then commit the result.`),this.code=this.name=e.code,this.data={filepaths:t,bothModified:r,deleteByUs:n,deleteByTheirs:i}}};vs.code="MergeConflictError";var Vt=class e extends Se{constructor(t){super(`No name was provided for ${t} in the argument or in the .git/config file.`),this.code=this.name=e.code,this.data={role:t}}};Vt.code="MissingNameError";var er=class e extends Se{constructor(t){super(`The function requires a "${t}" parameter but none was provided.`),this.code=this.name=e.code,this.data={parameter:t}}};er.code="MissingParameterError";var dl=class e extends Se{constructor(t){super('There are multiple errors that were thrown by the method. Please refer to the "errors" property to see more'),this.code=this.name=e.code,this.data={errors:t},this.errors=t}};dl.code="MultipleGitError";var ua=class e extends Se{constructor(t,r){super(`Expected "${t}" but received "${r}".`),this.code=this.name=e.code,this.data={expected:t,actual:r}}};ua.code="ParseError";var ys=class e extends Se{constructor(t){let r="";t==="not-fast-forward"?r=" because it was not a simple fast-forward":t==="tag-exists"&&(r=" because tag already exists"),super(`Push rejected${r}. Use "force: true" to override.`),this.code=this.name=e.code,this.data={reason:t}}};ys.code="PushRejectedError";var wi=class e extends Se{constructor(t,r){super(`Remote does not support the "${t}" so the "${r}" parameter cannot be used.`),this.code=this.name=e.code,this.data={capability:t,parameter:r}}};wi.code="RemoteCapabilityError";var hl=class e extends Se{constructor(t,r){super(`Remote did not reply using the "smart" HTTP protocol. Expected "001e# service=git-upload-pack" but received: ${t}`),this.code=this.name=e.code,this.data={preview:t,response:r}}};hl.code="SmartHttpError";var pl=class e extends Se{constructor(t,r,n){super(`Git remote "${t}" uses an unrecognized transport protocol: "${r}"`),this.code=this.name=e.code,this.data={url:t,transport:r,suggestion:n}}};pl.code="UnknownTransportError";var ml=class e extends Se{constructor(t){super(`Cannot parse remote URL: "${t}"`),this.code=this.name=e.code,this.data={url:t}}};ml.code="UrlParseError";var ws=class e extends Se{constructor(){super("The operation was canceled."),this.code=this.name=e.code,this.data={}}};ws.code="UserCanceledError";var gl=class e extends Se{constructor(t){super(`Could not merge index: Entry for '${t}' is not up to date. Either reset the index entry to HEAD, or stage your unstaged changes.`),this.code=this.name=e.code,this.data={filepath:t}}};gl.code="IndexResetError";var vl=class e extends Se{constructor(t){super(`"${t}" does not point to any commit. You're maybe working on a repository with no commits yet. `),this.code=this.name=e.code,this.data={ref:t}}};vl.code="NoCommitError";var wl=Object.freeze({__proto__:null,AlreadyExistsError:en,AmbiguousError:al,CheckoutConflictError:sl,CommitNotFetchedError:ol,EmptyServerResponseError:ll,FastForwardError:cl,GitPushError:ul,HttpError:ms,InternalError:le,InvalidFilepathError:Si,InvalidOidError:_i,InvalidRefNameError:Wn,MaxDepthError:fl,MergeNotSupportedError:gs,MergeConflictError:vs,MissingNameError:Vt,MissingParameterError:er,MultipleGitError:dl,NoRefspecError:nl,NotFoundError:Le,ObjectTypeError:zt,ParseError:ua,PushRejectedError:ys,RemoteCapabilityError:wi,SmartHttpError:hl,UnknownTransportError:pl,UnsafeFilepathError:ds,UrlParseError:ml,UserCanceledError:ws,UnmergedPathsError:rl,IndexResetError:gl,NoCommitError:vl});function vp({name:e,email:t,timestamp:r,timezoneOffset:n}){return n=H6(n),`${e} <${t}> ${r} ${n}`}function H6(e){let t=U6(G6(e));e=Math.abs(e);let r=Math.floor(e/60);e-=r*60;let n=String(r),i=String(e);return n.length<2&&(n="0"+n),i.length<2&&(i="0"+i),(t===-1?"-":"+")+n+i}function U6(e){return Math.sign(e)||(Object.is(e,-0)?-1:1)}function G6(e){return e===0?e:-e}function zn(e){return e=e.replace(/\r/g,""),e=e.replace(/^\n+/,""),e=e.replace(/\n+$/,"")+` +`,e}function au(e){let[,t,r,n,i]=e.match(/^(.*) <(.*)> (.*) (.*)$/);return{name:t,email:r,timestamp:Number(n),timezoneOffset:z6(i)}}function z6(e){let[,t,r,n]=e.match(/(\+|-)(\d\d)(\d\d)/);return n=(t==="+"?1:-1)*(Number(r)*60+Number(n)),V6(n)}function V6(e){return e===0?e:-e}var pr=class e{constructor(t){if(typeof t=="string")this._tag=t;else if(Buffer.isBuffer(t))this._tag=t.toString("utf8");else if(typeof t=="object")this._tag=e.render(t);else throw new le("invalid type passed to GitAnnotatedTag constructor")}static from(t){return new e(t)}static render(t){return`object ${t.object} +type ${t.type} +tag ${t.tag} +tagger ${vp(t.tagger)} + +${t.message} +${t.gpgsig?t.gpgsig:""}`}justHeaders(){return this._tag.slice(0,this._tag.indexOf(` + +`))}message(){let t=this.withoutSignature();return t.slice(t.indexOf(` + +`)+2)}parse(){return Object.assign(this.headers(),{message:this.message(),gpgsig:this.gpgsig()})}render(){return this._tag}headers(){let t=this.justHeaders().split(` +`),r=[];for(let i of t)i[0]===" "?r[r.length-1]+=` +`+i.slice(1):r.push(i);let n={};for(let i of r){let a=i.slice(0,i.indexOf(" ")),s=i.slice(i.indexOf(" ")+1);Array.isArray(n[a])?n[a].push(s):n[a]=s}return n.tagger&&(n.tagger=au(n.tagger)),n.committer&&(n.committer=au(n.committer)),n}withoutSignature(){let t=zn(this._tag);return t.indexOf(` +-----BEGIN PGP SIGNATURE-----`)===-1?t:t.slice(0,t.lastIndexOf(` +-----BEGIN PGP SIGNATURE-----`))}gpgsig(){if(this._tag.indexOf(` +-----BEGIN PGP SIGNATURE-----`)===-1)return;let t=this._tag.slice(this._tag.indexOf("-----BEGIN PGP SIGNATURE-----"),this._tag.indexOf("-----END PGP SIGNATURE-----")+27);return zn(t)}payload(){return this.withoutSignature()+` +`}toObject(){return Buffer.from(this._tag,"utf8")}static async sign(t,r,n){let i=t.payload(),{signature:a}=await r({payload:i,secretKey:n});a=zn(a);let s=i+a;return e.from(s)}};function sp(e){return e.trim().split(` +`).map(t=>" "+t).join(` +`)+` +`}function W6(e){return e.split(` +`).map(t=>t.replace(/^ /,"")).join(` +`)}var rr=class e{constructor(t){if(typeof t=="string")this._commit=t;else if(Buffer.isBuffer(t))this._commit=t.toString("utf8");else if(typeof t=="object")this._commit=e.render(t);else throw new le("invalid type passed to GitCommit constructor")}static fromPayloadSignature({payload:t,signature:r}){let n=e.justHeaders(t),i=e.justMessage(t),a=zn(n+` +gpgsig`+sp(r)+` +`+i);return new e(a)}static from(t){return new e(t)}toObject(){return Buffer.from(this._commit,"utf8")}headers(){return this.parseHeaders()}message(){return e.justMessage(this._commit)}parse(){return Object.assign({message:this.message()},this.headers())}static justMessage(t){return zn(t.slice(t.indexOf(` + +`)+2))}static justHeaders(t){return t.slice(0,t.indexOf(` + +`))}parseHeaders(){let t=e.justHeaders(this._commit).split(` +`),r=[];for(let i of t)i[0]===" "?r[r.length-1]+=` +`+i.slice(1):r.push(i);let n={parent:[]};for(let i of r){let a=i.slice(0,i.indexOf(" ")),s=i.slice(i.indexOf(" ")+1);Array.isArray(n[a])?n[a].push(s):n[a]=s}return n.author&&(n.author=au(n.author)),n.committer&&(n.committer=au(n.committer)),n}static renderHeaders(t){let r="";if(t.tree?r+=`tree ${t.tree} +`:r+=`tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904 +`,t.parent){if(t.parent.length===void 0)throw new le("commit 'parent' property should be an array");for(let a of t.parent)r+=`parent ${a} +`}let n=t.author;r+=`author ${vp(n)} +`;let i=t.committer||t.author;return r+=`committer ${vp(i)} +`,t.gpgsig&&(r+="gpgsig"+sp(t.gpgsig)),r}static render(t){return e.renderHeaders(t)+` +`+zn(t.message)}render(){return this._commit}withoutSignature(){let t=zn(this._commit);if(t.indexOf(` +gpgsig`)===-1)return t;let r=t.slice(0,t.indexOf(` +gpgsig`)),n=t.slice(t.indexOf(`-----END PGP SIGNATURE----- +`)+28);return zn(r+` +`+n)}isolateSignature(){let t=this._commit.slice(this._commit.indexOf("-----BEGIN PGP SIGNATURE-----"),this._commit.indexOf("-----END PGP SIGNATURE-----")+27);return W6(t)}static async sign(t,r,n){let i=t.withoutSignature(),a=e.justMessage(t._commit),{signature:s}=await r({payload:i,secretKey:n});s=zn(s);let l=e.justHeaders(t._commit)+` +gpgsig`+sp(s)+` +`+a;return e.from(l)}};async function bs({fs:e,cache:t,gitdir:r,oid:n}){if(n==="4b825dc642cb6eb9a060e54bf8d69288fbee4904")return{tree:tr.from([]),oid:n};let{type:i,object:a}=await qe({fs:e,cache:t,gitdir:r,oid:n});if(i==="tag")return n=pr.from(a).parse().object,bs({fs:e,cache:t,gitdir:r,oid:n});if(i==="commit")return n=rr.from(a).parse().tree,bs({fs:e,cache:t,gitdir:r,oid:n});if(i!=="tree")throw new zt(n,i,"tree");return{tree:tr.from(a),oid:n}}var yp=class{constructor({fs:t,gitdir:r,ref:n,cache:i}){this.fs=t,this.cache=i,this.gitdir=r,this.mapPromise=(async()=>{let s=new Map,o;try{o=await W.resolve({fs:t,gitdir:r,ref:n})}catch(c){c instanceof Le&&(o="4b825dc642cb6eb9a060e54bf8d69288fbee4904")}let l=await bs({fs:t,cache:this.cache,gitdir:r,oid:o});return l.type="tree",l.mode="40000",s.set(".",l),s})();let a=this;this.ConstructEntry=class{constructor(o){this._fullpath=o,this._type=!1,this._mode=!1,this._stat=!1,this._content=!1,this._oid=!1}async type(){return a.type(this)}async mode(){return a.mode(this)}async stat(){return a.stat(this)}async content(){return a.content(this)}async oid(){return a.oid(this)}}}async readdir(t){let r=t._fullpath,{fs:n,cache:i,gitdir:a}=this,s=await this.mapPromise,o=s.get(r);if(!o)throw new Error(`No obj for ${r}`);let l=o.oid;if(!l)throw new Error(`No oid for obj ${JSON.stringify(o)}`);if(o.type!=="tree")return null;let{type:c,object:u}=await qe({fs:n,cache:i,gitdir:a,oid:l});if(c!==o.type)throw new zt(l,c,o.type);let f=tr.from(u);for(let d of f)s.set($(r,d.path),d);return f.entries().map(d=>$(r,d.path))}async type(t){if(t._type===!1){let r=await this.mapPromise,{type:n}=r.get(t._fullpath);t._type=n}return t._type}async mode(t){if(t._mode===!1){let r=await this.mapPromise,{mode:n}=r.get(t._fullpath);t._mode=a2(parseInt(n,8))}return t._mode}async stat(t){}async content(t){if(t._content===!1){let r=await this.mapPromise,{fs:n,cache:i,gitdir:a}=this,o=r.get(t._fullpath).oid,{type:l,object:c}=await qe({fs:n,cache:i,gitdir:a,oid:o});l!=="blob"?t._content=void 0:t._content=new Uint8Array(c)}return t._content}async oid(t){if(t._oid===!1){let n=(await this.mapPromise).get(t._fullpath);t._oid=n.oid}return t._oid}};function bi({ref:e="HEAD"}={}){let t=Object.create(null);return Object.defineProperty(t,du,{value:function({fs:r,gitdir:n,cache:i}){return new yp({fs:r,gitdir:n,ref:e,cache:i})}}),Object.freeze(t),t}var wp=class{constructor({fs:t,dir:r,gitdir:n,cache:i}){this.fs=t,this.cache=i,this.dir=r,this.gitdir=n;let a=this;this.ConstructEntry=class{constructor(o){this._fullpath=o,this._type=!1,this._mode=!1,this._stat=!1,this._content=!1,this._oid=!1}async type(){return a.type(this)}async mode(){return a.mode(this)}async stat(){return a.stat(this)}async content(){return a.content(this)}async oid(){return a.oid(this)}}}async readdir(t){let r=t._fullpath,{fs:n,dir:i}=this,a=await n.readdir($(i,r));return a===null?null:a.map(s=>$(r,s))}async type(t){return t._type===!1&&await t.stat(),t._type}async mode(t){return t._mode===!1&&await t.stat(),t._mode}async stat(t){if(t._stat===!1){let{fs:r,dir:n}=this,i=await r.lstat(`${n}/${t._fullpath}`);if(!i)throw new Error(`ENOENT: no such file or directory, lstat '${t._fullpath}'`);let a=i.isDirectory()?"tree":"blob";a==="blob"&&!i.isFile()&&!i.isSymbolicLink()&&(a="special"),t._type=a,i=hs(i),t._mode=i.mode,i.size===-1&&t._actualSize&&(i.size=t._actualSize),t._stat=i}return t._stat}async content(t){if(t._content===!1){let{fs:r,dir:n,gitdir:i}=this;if(await t.type()==="tree")t._content=void 0;else{let s=await(await We.get({fs:r,gitdir:i})).get("core.autocrlf"),o=await r.read(`${n}/${t._fullpath}`,{autocrlf:s});t._actualSize=o.length,t._stat&&t._stat.size===-1&&(t._stat.size=t._actualSize),t._content=new Uint8Array(o)}}return t._content}async oid(t){if(t._oid===!1){let{fs:r,gitdir:n,cache:i}=this,a;await yt.acquire({fs:r,gitdir:n,cache:i},async function(s){let o=s.entriesMap.get(t._fullpath),l=await t.stat(),u=await(await We.get({fs:r,gitdir:n})).get("core.filemode"),f=typeof process!="undefined"?process.platform!=="win32":!0;!o||eu(l,o,u,f)?await t.content()===void 0?a=void 0:(a=await Vn(xi.wrap({type:"blob",object:await t.content()})),o&&a===o.oid&&(!u||l.mode===o.mode)&&eu(l,o,u,f)&&s.insert({filepath:t._fullpath,stats:l,oid:a})):a=o.oid}),t._oid=a}return t._oid}};function pu(){let e=Object.create(null);return Object.defineProperty(e,du,{value:function({fs:t,dir:r,gitdir:n,cache:i}){return new wp({fs:t,dir:r,gitdir:n,cache:i})}}),Object.freeze(e),e}function q6(e,t){let r=t-e;return Array.from({length:r},(n,i)=>e+i)}var f2=typeof Array.prototype.flat=="undefined"?e=>e.reduce((t,r)=>t.concat(r),[]):e=>e.flat(),bp=class{constructor(){this.value=null}consider(t){t!=null&&(this.value===null?this.value=t:tc,reduce:s=async(l,c)=>{let u=f2(c);return l!==void 0&&u.unshift(l),u},iterate:o=(l,c)=>Promise.all([...c].map(l))}){let l=i.map(h=>h[du]({fs:e,dir:r,gitdir:n,cache:t})),c=new Array(l.length).fill("."),u=q6(0,l.length),f=async h=>{u.map(v=>{h[v]=h[v]&&new l[v].ConstructEntry(h[v])});let m=(await Promise.all(u.map(v=>h[v]?l[v].readdir(h[v]):[]))).map(v=>v===null?[]:v).map(v=>v[Symbol.iterator]());return{entries:h,children:Y6(m)}},d=async h=>{let{entries:p,children:m}=await f(h),v=p.find(b=>b&&b._fullpath)._fullpath,y=await a(v,p);if(y!==null){let b=await o(d,m);return b=b.filter(x=>x!==void 0),s(y,b)}};return d(c)}async function _p(e,t){let r=await e.readdir(t);r==null?await e.rm(t):r.length?await Promise.all(r.map(n=>{let i=$(t,n);return e.lstat(i).then(a=>{if(a)return a.isDirectory()?_p(e,i):e.rm(i)})})).then(()=>e.rmdir(t)):await e.rmdir(t)}function X6(e){return Z6(e)&&zw(e.then)&&zw(e.catch)}function Z6(e){return e&&typeof e=="object"}function zw(e){return typeof e=="function"}function Vw(e){return X6((r=>{try{return r.readFile().catch(n=>n)}catch(n){return n}})(e))}var Ww=["readFile","writeFile","mkdir","rmdir","unlink","stat","lstat","readdir","readlink","symlink"];function qw(e,t){if(Vw(t))for(let r of Ww)e[`_${r}`]=t[r].bind(t);else for(let r of Ww)e[`_${r}`]=(0,Qc.default)(t[r].bind(t));Vw(t)?t.rm?e._rm=t.rm.bind(t):t.rmdir.length>1?e._rm=t.rmdir.bind(t):e._rm=_p.bind(null,e):t.rm?e._rm=(0,Qc.default)(t.rm.bind(t)):t.rmdir.length>2?e._rm=(0,Qc.default)(t.rmdir.bind(t)):e._rm=_p.bind(null,e)}var X=class{constructor(t){if(typeof t._original_unwrapped_fs!="undefined")return t;let r=Object.getOwnPropertyDescriptor(t,"promises");r&&r.enumerable?qw(this,t.promises):qw(this,t),this._original_unwrapped_fs=t}async exists(t,r={}){try{return await this._stat(t),!0}catch(n){if(n.code==="ENOENT"||n.code==="ENOTDIR")return!1;throw console.log('Unhandled error in "FileSystem.exists()" function',n),n}}async read(t,r={}){try{let n=await this._readFile(t,r);if(r.autocrlf==="true")try{n=new TextDecoder("utf8",{fatal:!0}).decode(n),n=n.replace(/\r\n/g,` +`),n=new TextEncoder().encode(n)}catch(i){}return typeof n!="string"&&(n=Buffer.from(n)),n}catch(n){return null}}async write(t,r,n={}){try{await this._writeFile(t,r,n);return}catch(i){await this.mkdir(ps(t)),await this._writeFile(t,r,n)}}async mkdir(t,r=!1){try{await this._mkdir(t);return}catch(n){if(n===null||n.code==="EEXIST")return;if(r)throw n;if(n.code==="ENOENT"){let i=ps(t);if(i==="."||i==="/"||i===t)throw n;await this.mkdir(i),await this.mkdir(t,!0)}}}async rm(t){try{await this._unlink(t)}catch(r){if(r.code!=="ENOENT")throw r}}async rmdir(t,r){try{r&&r.recursive?await this._rm(t,r):await this._rmdir(t)}catch(n){if(n.code!=="ENOENT")throw n}}async readdir(t){try{let r=await this._readdir(t);return r.sort(fu),r}catch(r){return r.code==="ENOTDIR"?null:[]}}async readdirDeep(t){let r=await this._readdir(t);return(await Promise.all(r.map(async i=>{let a=t+"/"+i;return(await this._stat(a)).isDirectory()?this.readdirDeep(a):a}))).reduce((i,a)=>i.concat(a),[])}async lstat(t){try{return await this._lstat(t)}catch(r){if(r.code==="ENOENT")return null;throw r}}async readlink(t,r={encoding:"buffer"}){try{let n=await this._readlink(t,r);return Buffer.isBuffer(n)?n:Buffer.from(n)}catch(n){if(n.code==="ENOENT")return null;throw n}}async writelink(t,r){return this._symlink(r.toString("utf8"),t)}};function C(e,t){if(t===void 0)throw new er(e)}async function su(e,t){return!e&&!t?!1:e&&!t||!e&&t?!0:!(await e.type()==="tree"&&await t.type()==="tree"||await e.type()===await t.type()&&await e.mode()===await t.mode()&&await e.oid()===await t.oid())}async function K6({fs:e,dir:t,gitdir:r=$(t,".git"),commit:n="HEAD",cache:i={}}){try{C("fs",e),C("dir",t),C("gitdir",r);let a=new X(e),s=[bi({ref:n}),pu(),hu()],o=[];await yt.acquire({fs:a,gitdir:r,cache:i},async function(c){o=c.unmergedPaths});let l=await _s({fs:a,cache:i,dir:t,gitdir:r,trees:s,map:async function(c,[u,f,d]){let h=!await su(f,d),p=o.includes(c),m=!await su(d,u);if(h||p)return u?{path:c,mode:await u.mode(),oid:await u.oid(),type:await u.type(),content:await u.content()}:void 0;if(m)return!1;throw new gl(c)}});await yt.acquire({fs:a,gitdir:r,cache:i},async function(c){for(let u of l)if(u!==!1){if(!u){await a.rmdir(`${t}/${u.path}`,{recursive:!0}),c.delete({filepath:u.path});continue}if(u.type==="blob"){let f=new TextDecoder().decode(u.content);await a.write(`${t}/${u.path}`,f,{mode:u.mode}),c.insert({filepath:u.path,oid:u.oid,stage:0})}}})}catch(a){throw a.caller="git.abortMerge",a}}var xs=class{static async isIgnored({fs:t,dir:r,gitdir:n=$(r,".git"),filepath:i}){if(tu(i)===".git")return!0;if(i===".")return!1;let a="",s=$(n,"info","exclude");await t.exists(s)&&(a=await t.read(s,"utf8"));let o=[{gitignore:$(r,".gitignore"),filepath:i}],l=i.split("/").filter(Boolean);for(let u=1;uxp({dir:t,gitdir:r,fs:o,filepath:n,index:l,force:a,parallel:s}))}catch(o){throw o.caller="git.add",o}}async function xp({dir:e,gitdir:t,fs:r,filepath:n,index:i,force:a,parallel:s}){n=Array.isArray(n)?n:[n];let o=n.map(async f=>{if(!a&&await xs.isIgnored({fs:r,dir:e,gitdir:t,filepath:f}))return;let d=await r.lstat($(e,f));if(!d)throw new Le(f);if(d.isDirectory()){let h=await r.readdir($(e,f));if(s){let p=h.map(m=>xp({dir:e,gitdir:t,fs:r,filepath:[$(f,m)],index:i,force:a,parallel:s}));await Promise.all(p)}else for(let p of h)await xp({dir:e,gitdir:t,fs:r,filepath:[$(f,p)],index:i,force:a,parallel:s})}else{let p=await(await We.get({fs:r,gitdir:t})).get("core.autocrlf"),m=d.isSymbolicLink()?await r.readlink($(e,f)).then(tO):await r.read($(e,f),{autocrlf:p});if(m===null)throw new Le(f);let v=await mr({fs:r,gitdir:t,type:"blob",object:m});i.insert({filepath:f,stats:d,oid:v})}}),l=await Promise.allSettled(o),c=l.filter(f=>f.status==="rejected").map(f=>f.reason);if(c.length>1)throw new dl(c);if(c.length===1)throw c[0];return l.filter(f=>f.status==="fulfilled"&&f.value).map(f=>f.value)}async function yl({fs:e,gitdir:t,path:r}){return(await We.get({fs:e,gitdir:t})).get(r)}function h2(e,...t){for(let r of t)if(r)for(let n of Object.keys(r)){let i=r[n];i!==void 0&&(e[n]=i)}return e}async function fa({fs:e,gitdir:t,author:r,commit:n}){let i=Math.floor(Date.now()/1e3),a={name:await yl({fs:e,gitdir:t,path:"user.name"}),email:await yl({fs:e,gitdir:t,path:"user.email"})||"",timestamp:i,timezoneOffset:new Date(i*1e3).getTimezoneOffset()},s=h2({},a,n?n.author:void 0,r);if(s.name!==void 0)return s}async function Ss({fs:e,gitdir:t,author:r,committer:n,commit:i}){let a=Math.floor(Date.now()/1e3),s={name:await yl({fs:e,gitdir:t,path:"user.name"}),email:await yl({fs:e,gitdir:t,path:"user.email"})||"",timestamp:a,timezoneOffset:new Date(a*1e3).getTimezoneOffset()},o=h2({},s,i?i.committer:void 0,r,n);if(o.name!==void 0)return o}async function p2({fs:e,cache:t,gitdir:r,oid:n}){let{type:i,object:a}=await qe({fs:e,cache:t,gitdir:r,oid:n});if(i==="tag")return n=pr.from(a).parse().object,p2({fs:e,cache:t,gitdir:r,oid:n});if(i!=="commit")throw new zt(n,i,"commit");return{commit:rr.from(a),oid:n}}async function ou({fs:e,cache:t,gitdir:r,oid:n}){let{commit:i,oid:a}=await p2({fs:e,cache:t,gitdir:r,oid:n});return{oid:a,commit:i.parse(),payload:i.withoutSignature()}}async function mu({fs:e,cache:t,onSign:r,gitdir:n,message:i,author:a,committer:s,signingKey:o,amend:l=!1,dryRun:c=!1,noUpdateBranch:u=!1,ref:f,parent:d,tree:h}){let p=!1;f||(f=await W.resolve({fs:e,gitdir:n,ref:"HEAD",depth:2}));let m,v;try{m=await W.resolve({fs:e,gitdir:n,ref:f}),v=await ou({fs:e,gitdir:n,oid:m,cache:{}})}catch(x){p=!0}if(l&&p)throw new vl(f);let y=l?await fa({fs:e,gitdir:n,author:a,commit:v.commit}):await fa({fs:e,gitdir:n,author:a});if(!y)throw new Vt("author");let b=l?await Ss({fs:e,gitdir:n,author:y,committer:s,commit:v.commit}):await Ss({fs:e,gitdir:n,author:y,committer:s});if(!b)throw new Vt("committer");return yt.acquire({fs:e,gitdir:n,cache:t,allowUnmerged:!1},async function(x){let _=o2(x.entries).get(".");if(h||(h=await m2({fs:e,gitdir:n,inode:_,dryRun:c})),d?d=await Promise.all(d.map(A=>W.resolve({fs:e,gitdir:n,ref:A}))):l?d=v.commit.parent:d=m?[m]:[],!i)if(l)i=v.commit.message;else throw new er("message");let k=rr.from({tree:h,parent:d,author:y,committer:b,message:i});o&&(k=await rr.sign(k,r,o));let w=await mr({fs:e,gitdir:n,type:"commit",object:k.toObject(),dryRun:c});return!u&&!c&&await W.writeRef({fs:e,gitdir:n,ref:f,value:w}),w})}async function m2({fs:e,gitdir:t,inode:r,dryRun:n}){let i=r.children;for(let l of i)l.type==="tree"&&(l.metadata.mode="040000",l.metadata.oid=await m2({fs:e,gitdir:t,inode:l,dryRun:n}));let a=i.map(l=>({mode:l.metadata.mode,path:l.basename,oid:l.metadata.oid,type:l.type})),s=tr.from(a);return await mr({fs:e,gitdir:t,type:"tree",object:s.toObject(),dryRun:n})}async function bl({fs:e,cache:t,gitdir:r,oid:n,filepath:i}){if(i.startsWith("/"))throw new Si("leading-slash");if(i.endsWith("/"))throw new Si("trailing-slash");let a=n,s=await bs({fs:e,cache:t,gitdir:r,oid:n}),o=s.tree;if(i==="")n=s.oid;else{let l=i.split("/");n=await g2({fs:e,cache:t,gitdir:r,tree:o,pathArray:l,oid:a,filepath:i})}return n}async function g2({fs:e,cache:t,gitdir:r,tree:n,pathArray:i,oid:a,filepath:s}){let o=i.shift();for(let l of n)if(l.path===o){if(i.length===0)return l.oid;{let{type:c,object:u}=await qe({fs:e,cache:t,gitdir:r,oid:l.oid});if(c!=="tree")throw new zt(a,c,"tree",s);return n=tr.from(u),g2({fs:e,cache:t,gitdir:r,tree:n,pathArray:i,oid:a,filepath:s})}}throw new Le(`file or directory found at "${a}:${s}"`)}async function ks({fs:e,cache:t,gitdir:r,oid:n,filepath:i=void 0}){i!==void 0&&(n=await bl({fs:e,cache:t,gitdir:r,oid:n,filepath:i}));let{tree:a,oid:s}=await bs({fs:e,cache:t,gitdir:r,oid:n});return{oid:s,tree:a.entries()}}async function kp({fs:e,gitdir:t,tree:r}){let n=tr.from(r).toObject();return await mr({fs:e,gitdir:t,type:"tree",object:n,format:"content"})}async function nO({fs:e,cache:t,onSign:r,gitdir:n,ref:i,oid:a,note:s,force:o,author:l,committer:c,signingKey:u}){let f;try{f=await W.resolve({gitdir:n,fs:e,ref:i})}catch(y){if(!(y instanceof Le))throw y}let h=(await ks({fs:e,cache:t,gitdir:n,oid:f||"4b825dc642cb6eb9a060e54bf8d69288fbee4904"})).tree;if(o)h=h.filter(y=>y.path!==a);else for(let y of h)if(y.path===a)throw new en("note",a);typeof s=="string"&&(s=Buffer.from(s,"utf8"));let p=await mr({fs:e,gitdir:n,type:"blob",object:s,format:"content"});h.push({mode:"100644",path:a,oid:p,type:"blob"});let m=await kp({fs:e,gitdir:n,tree:h});return await mu({fs:e,cache:t,onSign:r,gitdir:n,ref:i,tree:m,parent:f&&[f],message:`Note added by 'isomorphic-git addNote' +`,author:l,committer:c,signingKey:u})}async function iO({fs:e,onSign:t,dir:r,gitdir:n=$(r,".git"),ref:i="refs/notes/commits",oid:a,note:s,force:o,author:l,committer:c,signingKey:u,cache:f={}}){try{C("fs",e),C("gitdir",n),C("oid",a),C("note",s),u&&C("onSign",t);let d=new X(e),h=await fa({fs:d,gitdir:n,author:l});if(!h)throw new Vt("author");let p=await Ss({fs:d,gitdir:n,author:h,committer:c});if(!p)throw new Vt("committer");return await nO({fs:new X(d),cache:f,onSign:t,gitdir:n,ref:i,oid:a,note:s,force:o,author:h,committer:p,signingKey:u})}catch(d){throw d.caller="git.addNote",d}}async function v2({fs:e,gitdir:t,remote:r,url:n,force:i}){if(r!==Qr.default.clean(r))throw new Wn(r,Qr.default.clean(r));let a=await We.get({fs:e,gitdir:t});if(!i&&(await a.getSubsections("remote")).includes(r)&&n!==await a.get(`remote.${r}.url`))throw new en("remote",r);await a.set(`remote.${r}.url`,n),await a.set(`remote.${r}.fetch`,`+refs/heads/*:refs/remotes/${r}/*`),await We.save({fs:e,gitdir:t,config:a})}async function aO({fs:e,dir:t,gitdir:r=$(t,".git"),remote:n,url:i,force:a=!1}){try{return C("fs",e),C("gitdir",r),C("remote",n),C("url",i),await v2({fs:new X(e),gitdir:r,remote:n,url:i,force:a})}catch(s){throw s.caller="git.addRemote",s}}async function sO({fs:e,cache:t,onSign:r,gitdir:n,ref:i,tagger:a,message:s=i,gpgsig:o,object:l,signingKey:c,force:u=!1}){if(i=i.startsWith("refs/tags/")?i:`refs/tags/${i}`,!u&&await W.exists({fs:e,gitdir:n,ref:i}))throw new en("tag",i);let f=await W.resolve({fs:e,gitdir:n,ref:l||"HEAD"}),{type:d}=await qe({fs:e,cache:t,gitdir:n,oid:f}),h=pr.from({object:f,type:d,tag:i.replace("refs/tags/",""),tagger:a,message:s,gpgsig:o});c&&(h=await pr.sign(h,r,c));let p=await mr({fs:e,gitdir:n,type:"tag",object:h.toObject()});await W.writeRef({fs:e,gitdir:n,ref:i,value:p})}async function oO({fs:e,onSign:t,dir:r,gitdir:n=$(r,".git"),ref:i,tagger:a,message:s=i,gpgsig:o,object:l,signingKey:c,force:u=!1,cache:f={}}){try{C("fs",e),C("gitdir",n),C("ref",i),c&&C("onSign",t);let d=new X(e),h=await fa({fs:d,gitdir:n,author:a});if(!h)throw new Vt("tagger");return await sO({fs:d,cache:f,onSign:t,gitdir:n,ref:i,tagger:h,message:s,gpgsig:o,object:l,signingKey:c,force:u})}catch(d){throw d.caller="git.annotatedTag",d}}async function lO({fs:e,gitdir:t,ref:r,object:n,checkout:i=!1,force:a=!1}){if(r!==Qr.default.clean(r))throw new Wn(r,Qr.default.clean(r));let s=`refs/heads/${r}`;if(!a&&await W.exists({fs:e,gitdir:t,ref:s}))throw new en("branch",r,!1);let o;try{o=await W.resolve({fs:e,gitdir:t,ref:n||"HEAD"})}catch(l){}o&&await W.writeRef({fs:e,gitdir:t,ref:s,value:o}),i&&await W.writeSymbolicRef({fs:e,gitdir:t,ref:"HEAD",value:s})}async function cO({fs:e,dir:t,gitdir:r=$(t,".git"),ref:n,object:i,checkout:a=!1,force:s=!1}){try{return C("fs",e),C("gitdir",r),C("ref",n),await lO({fs:new X(e),gitdir:r,ref:n,object:i,checkout:a,force:s})}catch(o){throw o.caller="git.branch",o}}var y2=(e,t)=>e==="."||t==null||t.length===0||t==="."?!0:t.length>=e.length?t.startsWith(e):e.startsWith(t);async function Tp({fs:e,cache:t,onProgress:r,onPostCheckout:n,dir:i,gitdir:a,remote:s,ref:o,filepaths:l,noCheckout:c,noUpdateHead:u,dryRun:f,force:d,track:h=!0}){let p;if(n)try{p=await W.resolve({fs:e,gitdir:a,ref:"HEAD"})}catch(v){p="0000000000000000000000000000000000000000"}let m;try{m=await W.resolve({fs:e,gitdir:a,ref:o})}catch(v){if(o==="HEAD")throw v;let y=`${s}/${o}`;if(m=await W.resolve({fs:e,gitdir:a,ref:y}),h){let b=await We.get({fs:e,gitdir:a});await b.set(`branch.${o}.remote`,s),await b.set(`branch.${o}.merge`,`refs/heads/${o}`),await We.save({fs:e,gitdir:a,config:b})}await W.writeRef({fs:e,gitdir:a,ref:`refs/heads/${o}`,value:m})}if(!c){let v;try{v=await uO({fs:e,cache:t,onProgress:r,dir:i,gitdir:a,ref:o,force:d,filepaths:l})}catch(_){throw _ instanceof Le&&_.data.what===m?new ol(o,m):_}let y=v.filter(([_])=>_==="conflict").map(([_,k])=>k);if(y.length>0)throw new sl(y);let b=v.filter(([_])=>_==="error").map(([_,k])=>k);if(b.length>0)throw new le(b.join(", "));if(f){n&&await n({previousHead:p,newHead:m,type:l!=null&&l.length>0?"file":"branch"});return}let x=0,E=v.length;await yt.acquire({fs:e,gitdir:a,cache:t},async function(_){await Promise.all(v.filter(([k])=>k==="delete"||k==="delete-index").map(async function([k,w]){let A=`${i}/${w}`;k==="delete"&&await e.rm(A),_.delete({filepath:w}),r&&await r({phase:"Updating workdir",loaded:++x,total:E})}))}),await yt.acquire({fs:e,gitdir:a,cache:t},async function(_){for(let[k,w]of v)if(k==="rmdir"||k==="rmdir-index"){let A=`${i}/${w}`;try{k==="rmdir-index"&&_.delete({filepath:w}),await e.rmdir(A),r&&await r({phase:"Updating workdir",loaded:++x,total:E})}catch(S){if(S.code==="ENOTEMPTY")console.log(`Did not delete ${w} because directory is not empty`);else throw S}}}),await Promise.all(v.filter(([_])=>_==="mkdir"||_==="mkdir-index").map(async function([_,k]){let w=`${i}/${k}`;await e.mkdir(w),r&&await r({phase:"Updating workdir",loaded:++x,total:E})})),await yt.acquire({fs:e,gitdir:a,cache:t},async function(_){await Promise.all(v.filter(([k])=>k==="create"||k==="create-index"||k==="update"||k==="mkdir-index").map(async function([k,w,A,S,T]){let P=`${i}/${w}`;try{if(k!=="create-index"&&k!=="mkdir-index"){let{object:N}=await qe({fs:e,cache:t,gitdir:a,oid:A});if(T&&await e.rm(P),S===33188)await e.write(P,N);else if(S===33261)await e.write(P,N,{mode:511});else if(S===40960)await e.writelink(P,N);else throw new le(`Invalid mode 0o${S.toString(8)} detected in blob ${A}`)}let I=await e.lstat(P);S===33261&&(I.mode=493),k==="mkdir-index"&&(I.mode=57344),_.insert({filepath:w,stats:I,oid:A}),r&&await r({phase:"Updating workdir",loaded:++x,total:E})}catch(I){console.log(I)}}))}),n&&await n({previousHead:p,newHead:m,type:l!=null&&l.length>0?"file":"branch"})}if(!u){let v=await W.expand({fs:e,gitdir:a,ref:o});v.startsWith("refs/heads")?await W.writeSymbolicRef({fs:e,gitdir:a,ref:"HEAD",value:v}):await W.writeRef({fs:e,gitdir:a,ref:"HEAD",value:m})}}async function uO({fs:e,cache:t,onProgress:r,dir:n,gitdir:i,ref:a,force:s,filepaths:o}){let l=0;return _s({fs:e,cache:t,dir:n,gitdir:i,trees:[bi({ref:a}),pu(),hu()],map:async function(c,[u,f,d]){if(c===".")return;if(o&&!o.some(p=>y2(c,p)))return null;switch(r&&await r({phase:"Analyzing workdir",loaded:++l}),[!!d,!!u,!!f].map(Number).join("")){case"000":return;case"001":return s&&o&&o.includes(c)?["delete",c]:void 0;case"010":switch(await u.type()){case"tree":return["mkdir",c];case"blob":return["create",c,await u.oid(),await u.mode()];case"commit":return["mkdir-index",c,await u.oid(),await u.mode()];default:return["error",`new entry Unhandled type ${await u.type()}`]}case"011":switch(`${await u.type()}-${await f.type()}`){case"tree-tree":return;case"tree-blob":case"blob-tree":return["conflict",c];case"blob-blob":return await u.oid()!==await f.oid()?s?["update",c,await u.oid(),await u.mode(),await u.mode()!==await f.mode()]:["conflict",c]:await u.mode()!==await f.mode()?s?["update",c,await u.oid(),await u.mode(),!0]:["conflict",c]:["create-index",c,await u.oid(),await u.mode()];case"commit-tree":return;case"commit-blob":return["conflict",c];default:return["error",`new entry Unhandled type ${u.type}`]}case"100":return["delete-index",c];case"101":switch(await d.type()){case"tree":return["rmdir",c];case"blob":return await d.oid()!==await f.oid()?s?["delete",c]:["conflict",c]:["delete",c];case"commit":return["rmdir-index",c];default:return["error",`delete entry Unhandled type ${await d.type()}`]}case"110":case"111":switch(`${await d.type()}-${await u.type()}`){case"tree-tree":return;case"blob-blob":{if(await d.oid()===await u.oid()&&await d.mode()===await u.mode()&&!s)return;if(f){if(await f.oid()!==await d.oid()&&await f.oid()!==await u.oid())return s?["update",c,await u.oid(),await u.mode(),await u.mode()!==await f.mode()]:["conflict",c]}else if(s)return["update",c,await u.oid(),await u.mode(),await u.mode()!==await d.mode()];return await u.mode()!==await d.mode()?["update",c,await u.oid(),await u.mode(),!0]:await u.oid()!==await d.oid()?["update",c,await u.oid(),await u.mode(),!1]:void 0}case"tree-blob":return["update-dir-to-blob",c,await u.oid()];case"blob-tree":return["update-blob-to-tree",c];case"commit-commit":return["mkdir-index",c,await u.oid(),await u.mode()];default:return["error",`update entry Unhandled type ${await d.type()}-${await u.type()}`]}}},reduce:async function(c,u){return u=f2(u),c?c&&c[0]==="rmdir"?(u.push(c),u):(u.unshift(c),u):u}})}async function fO({fs:e,onProgress:t,onPostCheckout:r,dir:n,gitdir:i=$(n,".git"),remote:a="origin",ref:s,filepaths:o,noCheckout:l=!1,noUpdateHead:c=s===void 0,dryRun:u=!1,force:f=!1,track:d=!0,cache:h={}}){try{C("fs",e),C("dir",n),C("gitdir",i);let p=s||"HEAD";return await Tp({fs:new X(e),cache:h,onProgress:t,onPostCheckout:r,dir:n,gitdir:i,remote:a,ref:p,filepaths:o,noCheckout:l,noUpdateHead:c,dryRun:u,force:f,track:d})}catch(p){throw p.caller="git.checkout",p}}var dO=new RegExp("^refs/(heads/|tags/|remotes/)?(.*)");function ca(e){let t=dO.exec(e);return t?t[1]==="remotes/"&&e.endsWith("/HEAD")?t[2].slice(0,-5):t[2]:e}async function ha({fs:e,gitdir:t,fullname:r=!1,test:n=!1}){let i=await W.resolve({fs:e,gitdir:t,ref:"HEAD",depth:2});if(n)try{await W.resolve({fs:e,gitdir:t,ref:i})}catch(a){return}if(i.startsWith("refs/"))return r?i:ca(i)}function hO(e){return e=e.replace(/^git@([^:]+):/,"https://$1/"),e=e.replace(/^ssh:\/\//,"https://"),e}function w2({username:e="",password:t=""}){return`Basic ${Buffer.from(`${e}:${t}`).toString("base64")}`}async function _l(e,t){let r=c2(e);for(;;){let{value:n,done:i}=await r.next();if(n&&await t(n),i)break}r.return&&r.return()}async function lu(e){let t=0,r=[];await _l(e,a=>{r.push(a),t+=a.byteLength});let n=new Uint8Array(t),i=0;for(let a of r)n.set(a,i),i+=a.byteLength;return n}function Yw(e){let t=e.match(/^https?:\/\/([^/]+)@/);if(t==null)return{url:e,auth:{}};t=t[1];let[r,n]=t.split(":");return e=e.replace(`${t}@`,""),{url:e,auth:{username:r,password:n}}}function Sp(e,t){let r=t.toString(16);return"0".repeat(e-r.length)+r}var Ve=class{static flush(){return Buffer.from("0000","utf8")}static delim(){return Buffer.from("0001","utf8")}static encode(t){typeof t=="string"&&(t=Buffer.from(t));let r=t.length+4,n=Sp(4,r);return Buffer.concat([Buffer.from(n,"utf8"),t])}static streamReader(t){let r=new iu(t);return async function(){try{let i=await r.read(4);if(i==null)return!0;if(i=parseInt(i.toString("utf8"),16),i===0||i===1)return null;let a=await r.read(i-4);return a==null?!0:a}catch(i){return t.error=i,!0}}}};async function Xw(e){let t={},r;for(;r=await e(),r!==!0;){if(r===null)continue;r=r.toString("utf8").replace(/\n$/,"");let n=r.indexOf("=");if(n>-1){let i=r.slice(0,n),a=r.slice(n+1);t[i]=a}else t[r]=!0}return{protocolVersion:2,capabilities2:t}}async function Zw(e,{service:t}){let r=new Set,n=new Map,i=new Map,a=Ve.streamReader(e),s=await a();for(;s===null;)s=await a();if(s===!0)throw new ll;if(s.includes("version 2"))return Xw(a);if(s.toString("utf8").replace(/\n$/,"")!==`# service=${t}`)throw new ua(`# service=${t}\\n`,s.toString("utf8"));let o=await a();for(;o===null;)o=await a();if(o===!0)return{capabilities:r,refs:n,symrefs:i};if(o=o.toString("utf8"),o.includes("version 2"))return Xw(a);let[l,c]=lp(o,"\0","\\x00");if(c.split(" ").map(u=>r.add(u)),l!=="0000000000000000000000000000000000000000 capabilities^{}"){let[u,f]=lp(l," "," ");for(n.set(f,u);;){let d=await a();if(d===!0)break;if(d!==null){let[h,p]=lp(d.toString("utf8")," "," ");n.set(p,h)}}}for(let u of r)if(u.startsWith("symref=")){let f=u.match(/symref=([^:]+):(.*)/);f.length===3&&i.set(f[1],f[2])}return{protocolVersion:1,capabilities:r,refs:n,symrefs:i}}function lp(e,t,r){let n=e.trim().split(t);if(n.length!==2)throw new ua(`Two strings separated by '${r}'`,e.toString("utf8"));return n}var Kw=(e,t)=>e.endsWith("?")?`${e}${t}`:`${e}/${t.replace(/^https?:\/\//,"")}`,Jw=(e,t)=>{(t.username||t.password)&&(e.Authorization=w2(t)),t.headers&&Object.assign(e,t.headers)},cp=async e=>{try{let t=Buffer.from(await lu(e.body)),r=t.toString("utf8");return{preview:r.length<256?r:r.slice(0,256)+"...",response:r,data:t}}catch(t){return{}}},Es=class{static async capabilities(){return["discover","connect"]}static async discover({http:t,onProgress:r,onAuth:n,onAuthSuccess:i,onAuthFailure:a,corsProxy:s,service:o,url:l,headers:c,protocolVersion:u}){let{url:f,auth:d}=Yw(l),h=s?Kw(s,f):f;(d.username||d.password)&&(c.Authorization=w2(d)),u===2&&(c["Git-Protocol"]="version=2");let p,m,v=!1;do if(p=await t.request({onProgress:r,method:"GET",url:`${h}/info/refs?service=${o}`,headers:c}),m=!1,p.statusCode===401||p.statusCode===203){let y=v?a:n;if(y){if(d=await y(f,{...d,headers:{...c}}),d&&d.cancel)throw new ws;d&&(Jw(c,d),v=!0,m=!0)}}else p.statusCode===200&&v&&i&&await i(f,d);while(m);if(p.statusCode!==200){let{response:y}=await cp(p);throw new ms(p.statusCode,p.statusMessage,y)}if(p.headers["content-type"]===`application/x-${o}-advertisement`){let y=await Zw(p.body,{service:o});return y.auth=d,y}else{let{preview:y,response:b,data:x}=await cp(p);try{let E=await Zw([x],{service:o});return E.auth=d,E}catch(E){throw new hl(y,b)}}}static async connect({http:t,onProgress:r,corsProxy:n,service:i,url:a,auth:s,body:o,headers:l}){let c=Yw(a);c&&(a=c.url),n&&(a=Kw(n,a)),l["content-type"]=`application/x-${i}-request`,l.accept=`application/x-${i}-result`,Jw(l,s);let u=await t.request({onProgress:r,method:"POST",url:`${a}/${i}`,body:o,headers:l});if(u.statusCode!==200){let{response:f}=cp(u);throw new ms(u.statusCode,u.statusMessage,f)}return u}};function pO({url:e}){if(e.startsWith("git@"))return{transport:"ssh",address:e};let t=e.match(/(\w+)(:\/\/|::)(.*)/);if(t!==null){if(t[2]==="://")return{transport:t[1],address:t[0]};if(t[2]==="::")return{transport:t[1],address:t[3]}}}var As=class{static getRemoteHelperFor({url:t}){let r=new Map;r.set("http",Es),r.set("https",Es);let n=pO({url:t});if(!n)throw new ml(t);if(r.has(n.transport))return r.get(n.transport);throw new pl(t,n.transport,n.transport==="ssh"?hO(t):void 0)}},la=null,da=class{static async read({fs:t,gitdir:r}){la===null&&(la=new tl.default);let n=$(r,"shallow"),i=new Set;return await la.acquire(n,async function(){let a=await t.read(n,{encoding:"utf8"});if(a===null||a.trim()==="")return i;a.trim().split(` +`).map(s=>i.add(s))}),i}static async write({fs:t,gitdir:r,oids:n}){la===null&&(la=new tl.default);let i=$(r,"shallow");if(n.size>0){let a=[...n].join(` +`)+` +`;await la.acquire(i,async function(){await t.write(i,a,{encoding:"utf8"})})}else await la.acquire(i,async function(){await t.rm(i)})}};async function mO({fs:e,gitdir:t,oid:r}){let n=`objects/${r.slice(0,2)}/${r.slice(2)}`;return e.exists(`${t}/${n}`)}async function gO({fs:e,cache:t,gitdir:r,oid:n,getExternalRefDelta:i}){let a=await e.readdir($(r,"objects/pack"));a=a.filter(s=>s.endsWith(".idx"));for(let s of a){let o=`${r}/objects/pack/${s}`,l=await Ap({fs:e,cache:t,filename:o,getExternalRefDelta:i});if(l.error)throw new le(l.error);if(l.offsets.has(n))return!0}return!1}async function Qw({fs:e,cache:t,gitdir:r,oid:n,format:i="content"}){let a=o=>qe({fs:e,cache:t,gitdir:r,oid:o}),s=await mO({fs:e,gitdir:r,oid:n});return s||(s=await gO({fs:e,cache:t,gitdir:r,oid:n,getExternalRefDelta:a})),s}function vO(e){let i="5041434b"+"00000002"+"00000000";return e.slice(0,12).toString("hex")===i}function b2(e,t){let r=e.map(n=>n.split("=",1)[0]);return t.filter(n=>{let i=n.split("=",1)[0];return r.includes(i)})}var gu={name:"isomorphic-git",version:"1.27.1",agent:"git/isomorphic-git@1.27.1"},fs=class{constructor(){this._queue=[]}write(t){if(this._ended)throw Error("You cannot write to a FIFO that has already been ended!");if(this._waiting){let r=this._waiting;this._waiting=null,r({value:t})}else this._queue.push(t)}end(){if(this._ended=!0,this._waiting){let t=this._waiting;this._waiting=null,t({done:!0})}}destroy(t){this.error=t,this.end()}async next(){if(this._queue.length>0)return{value:this._queue.shift()};if(this._ended)return{done:!0};if(this._waiting)throw Error("You cannot call read until the previous call to read has returned!");return new Promise(t=>{this._waiting=t})}};function yO(e){let t=e.indexOf("\r"),r=e.indexOf(` +`);return t===-1&&r===-1?-1:t===-1?r+1:r===-1?t+1:r===t+1?r+1:Math.min(t,r)+1}function _2(e){let t=new fs,r="";return(async()=>(await _l(e,n=>{for(n=n.toString("utf8"),r+=n;;){let i=yO(r);if(i===-1)break;t.write(r.slice(0,i)),r=r.slice(i)}}),r.length>0&&t.write(r),t.end()))(),t}var cu=class{static demux(t){let r=Ve.streamReader(t),n=new fs,i=new fs,a=new fs,s=async function(){let o=await r();if(o===null)return s();if(o===!0){n.end(),a.end(),t.error?i.destroy(t.error):i.end();return}switch(o[0]){case 1:{i.write(o.slice(1));break}case 2:{a.write(o.slice(1));break}case 3:{let l=o.slice(1);a.write(l),n.end(),a.end(),i.destroy(new Error(l.toString("utf8")));return}default:n.write(o)}s()};return s(),{packetlines:n,packfile:i,progress:a}}};async function wO(e){let{packetlines:t,packfile:r,progress:n}=cu.demux(e),i=[],a=[],s=[],o=!1,l=!1;return new Promise((c,u)=>{_l(t,f=>{let d=f.toString("utf8").trim();if(d.startsWith("shallow")){let h=d.slice(-41).trim();h.length!==40&&u(new _i(h)),i.push(h)}else if(d.startsWith("unshallow")){let h=d.slice(-41).trim();h.length!==40&&u(new _i(h)),a.push(h)}else if(d.startsWith("ACK")){let[,h,p]=d.split(" ");s.push({oid:h,status:p}),p||(l=!0)}else d.startsWith("NAK")?(o=!0,l=!0):(l=!0,o=!0);l&&(e.error?u(e.error):c({shallows:i,unshallows:a,acks:s,nak:o,packfile:r,progress:n}))}).finally(()=>{l||(e.error?u(e.error):c({shallows:i,unshallows:a,acks:s,nak:o,packfile:r,progress:n}))})})}function bO({capabilities:e=[],wants:t=[],haves:r=[],shallows:n=[],depth:i=null,since:a=null,exclude:s=[]}){let o=[];t=[...new Set(t)];let l=` ${e.join(" ")}`;for(let c of t)o.push(Ve.encode(`want ${c}${l} +`)),l="";for(let c of n)o.push(Ve.encode(`shallow ${c} +`));i!==null&&o.push(Ve.encode(`deepen ${i} +`)),a!==null&&o.push(Ve.encode(`deepen-since ${Math.floor(a.valueOf()/1e3)} +`));for(let c of s)o.push(Ve.encode(`deepen-not ${c} +`));o.push(Ve.flush());for(let c of r)o.push(Ve.encode(`have ${c} +`));return o.push(Ve.encode(`done +`)),o}async function Cp({fs:e,cache:t,http:r,onProgress:n,onMessage:i,onAuth:a,onAuthSuccess:s,onAuthFailure:o,gitdir:l,ref:c,remoteRef:u,remote:f,url:d,corsProxy:h,depth:p=null,since:m=null,exclude:v=[],relative:y=!1,tags:b=!1,singleBranch:x=!1,headers:E={},prune:_=!1,pruneTags:k=!1}){let w=c||await ha({fs:e,gitdir:l,test:!0}),A=await We.get({fs:e,gitdir:l}),S=f||w&&await A.get(`branch.${w}.remote`)||"origin",T=d||await A.get(`remote.${S}.url`);if(typeof T=="undefined")throw new er("remote OR url");let P=u||w&&await A.get(`branch.${w}.merge`)||c||"HEAD";h===void 0&&(h=await A.get("http.corsProxy"));let I=As.getRemoteHelperFor({url:T}),N=await I.discover({http:r,onAuth:a,onAuthSuccess:s,onAuthFailure:o,corsProxy:h,service:"git-upload-pack",url:T,headers:E,protocolVersion:1}),L=N.auth,ee=N.refs;if(ee.size===0)return{defaultBranch:null,fetchHead:null,fetchHeadDescription:null};if(p!==null&&!N.capabilities.has("shallow"))throw new wi("shallow","depth");if(m!==null&&!N.capabilities.has("deepen-since"))throw new wi("deepen-since","since");if(v.length>0&&!N.capabilities.has("deepen-not"))throw new wi("deepen-not","exclude");if(y===!0&&!N.capabilities.has("deepen-relative"))throw new wi("deepen-relative","relative");let{oid:fe,fullref:J}=W.resolveAgainstMap({ref:P,map:ee});for(let H of ee.keys())H===J||H==="HEAD"||H.startsWith("refs/heads/")||b&&H.startsWith("refs/tags/")||ee.delete(H);let Q=b2([...N.capabilities],["multi_ack_detailed","no-done","side-band-64k","ofs-delta",`agent=${gu.agent}`]);y&&Q.push("deepen-relative");let Pe=x?[fe]:ee.values(),ge=x?[w]:await W.listRefs({fs:e,gitdir:l,filepath:"refs"}),z=[];for(let H of ge)try{H=await W.expand({fs:e,gitdir:l,ref:H});let Je=await W.resolve({fs:e,gitdir:l,ref:H});await Qw({fs:e,cache:t,gitdir:l,oid:Je})&&z.push(Je)}catch(Je){}z=[...new Set(z)];let Y=await da.read({fs:e,gitdir:l}),O=N.capabilities.has("shallow")?[...Y]:[],he=bO({capabilities:Q,wants:Pe,haves:z,shallows:O,depth:p,since:m,exclude:v}),Ge=Buffer.from(await lu(he)),gt=await I.connect({http:r,onProgress:n,corsProxy:h,service:"git-upload-pack",url:T,auth:L,body:[Ge],headers:E}),Re=await wO(gt.body);gt.headers&&(Re.headers=gt.headers);for(let H of Re.shallows)if(!Y.has(H))try{let{object:Je}=await qe({fs:e,cache:t,gitdir:l,oid:H}),D=new rr(Je),q=await Promise.all(D.headers().parent.map(Ne=>Qw({fs:e,cache:t,gitdir:l,oid:Ne})));q.length===0||q.every(Ne=>Ne)||Y.add(H)}catch(Je){Y.add(H)}for(let H of Re.unshallows)Y.delete(H);if(await da.write({fs:e,gitdir:l,oids:Y}),x){let H=new Map([[J,fe]]),Je=new Map,D=10,q=J;for(;D--;){let bt=N.symrefs.get(q);if(bt===void 0)break;Je.set(q,bt),q=bt}let ve=ee.get(q);ve&&H.set(q,ve);let{pruned:Ne}=await W.updateRemoteRefs({fs:e,gitdir:l,remote:S,refs:H,symrefs:Je,tags:b,prune:_});_&&(Re.pruned=Ne)}else{let{pruned:H}=await W.updateRemoteRefs({fs:e,gitdir:l,remote:S,refs:ee,symrefs:N.symrefs,tags:b,prune:_,pruneTags:k});_&&(Re.pruned=H)}if(Re.HEAD=N.symrefs.get("HEAD"),Re.HEAD===void 0){let{oid:H}=W.resolveAgainstMap({ref:"HEAD",map:ee});for(let[Je,D]of ee.entries())if(Je!=="HEAD"&&D===H){Re.HEAD=Je;break}}let ct=J.startsWith("refs/tags")?"tag":"branch";if(Re.FETCH_HEAD={oid:fe,description:`${ct} '${ca(J)}' of ${T}`},n||i){let H=_2(Re.progress);_l(H,async Je=>{if(i&&await i(Je),n){let D=Je.match(/([^:]*).*\((\d+?)\/(\d+?)\)/);D&&await n({phase:D[1].trim(),loaded:parseInt(D[2],10),total:parseInt(D[3],10)})}})}let rt=Buffer.from(await lu(Re.packfile));if(gt.body.error)throw gt.body.error;let Et=rt.slice(-20).toString("hex"),Ie={defaultBranch:Re.HEAD,fetchHead:Re.FETCH_HEAD.oid,fetchHeadDescription:Re.FETCH_HEAD.description};if(Re.headers&&(Ie.headers=Re.headers),_&&(Ie.pruned=Re.pruned),Et!==""&&!vO(rt)){Ie.packfile=`objects/pack/pack-${Et}.pack`;let H=$(l,Ie.packfile);await e.write(H,rt);let Je=q=>qe({fs:e,cache:t,gitdir:l,oid:q}),D=await il.fromPack({pack:rt,getExternalRefDelta:Je,onProgress:n});await e.write(H.replace(/\.pack$/,".idx"),await D.toBuffer())}return Ie}async function x2({fs:e,bare:t=!1,dir:r,gitdir:n=t?r:$(r,".git"),defaultBranch:i="master"}){if(await e.exists(n+"/config"))return;let a=["hooks","info","objects/info","objects/pack","refs/heads","refs/tags"];a=a.map(s=>n+"/"+s);for(let s of a)await e.mkdir(s);await e.write(n+"/config",`[core] + repositoryformatversion = 0 + filemode = false + bare = ${t} +`+(t?"":` logallrefupdates = true +`)+` symlinks = false + ignorecase = true +`),await e.write(n+"/HEAD",`ref: refs/heads/${i} +`)}async function _O({fs:e,cache:t,http:r,onProgress:n,onMessage:i,onAuth:a,onAuthSuccess:s,onAuthFailure:o,onPostCheckout:l,dir:c,gitdir:u,url:f,corsProxy:d,ref:h,remote:p,depth:m,since:v,exclude:y,relative:b,singleBranch:x,noCheckout:E,noTags:_,headers:k}){try{if(await x2({fs:e,gitdir:u}),await v2({fs:e,gitdir:u,remote:p,url:f,force:!1}),d){let S=await We.get({fs:e,gitdir:u});await S.set("http.corsProxy",d),await We.save({fs:e,gitdir:u,config:S})}let{defaultBranch:w,fetchHead:A}=await Cp({fs:e,cache:t,http:r,onProgress:n,onMessage:i,onAuth:a,onAuthSuccess:s,onAuthFailure:o,gitdir:u,ref:h,remote:p,corsProxy:d,depth:m,since:v,exclude:y,relative:b,singleBranch:x,headers:k,tags:!_});if(A===null)return;h=h||w,h=h.replace("refs/heads/",""),await Tp({fs:e,cache:t,onProgress:n,onPostCheckout:l,dir:c,gitdir:u,ref:h,remote:p,noCheckout:E})}catch(w){throw await e.rmdir(u,{recursive:!0,maxRetries:10}).catch(()=>{}),w}}async function xO({fs:e,http:t,onProgress:r,onMessage:n,onAuth:i,onAuthSuccess:a,onAuthFailure:s,onPostCheckout:o,dir:l,gitdir:c=$(l,".git"),url:u,corsProxy:f=void 0,ref:d=void 0,remote:h="origin",depth:p=void 0,since:m=void 0,exclude:v=[],relative:y=!1,singleBranch:b=!1,noCheckout:x=!1,noTags:E=!1,headers:_={},cache:k={}}){try{return C("fs",e),C("http",t),C("gitdir",c),x||C("dir",l),C("url",u),await _O({fs:new X(e),cache:k,http:t,onProgress:r,onMessage:n,onAuth:i,onAuthSuccess:a,onAuthFailure:s,onPostCheckout:o,dir:l,gitdir:c,url:u,corsProxy:f,ref:d,remote:h,depth:p,since:m,exclude:v,relative:y,singleBranch:b,noCheckout:x,noTags:E,headers:_})}catch(w){throw w.caller="git.clone",w}}async function SO({fs:e,onSign:t,dir:r,gitdir:n=$(r,".git"),message:i,author:a,committer:s,signingKey:o,amend:l=!1,dryRun:c=!1,noUpdateBranch:u=!1,ref:f,parent:d,tree:h,cache:p={}}){try{C("fs",e),l||C("message",i),o&&C("onSign",t);let m=new X(e);return await mu({fs:m,cache:p,onSign:t,gitdir:n,message:i,author:a,committer:s,signingKey:o,amend:l,dryRun:c,noUpdateBranch:u,ref:f,parent:d,tree:h})}catch(m){throw m.caller="git.commit",m}}async function EO({fs:e,dir:t,gitdir:r=$(t,".git"),fullname:n=!1,test:i=!1}){try{return C("fs",e),C("gitdir",r),await ha({fs:new X(e),gitdir:r,fullname:n,test:i})}catch(a){throw a.caller="git.currentBranch",a}}async function AO({fs:e,gitdir:t,ref:r}){if(r=r.startsWith("refs/heads/")?r:`refs/heads/${r}`,!await W.exists({fs:e,gitdir:t,ref:r}))throw new Le(r);let i=await W.expand({fs:e,gitdir:t,ref:r}),a=await ha({fs:e,gitdir:t,fullname:!0});if(i===a){let l=await W.resolve({fs:e,gitdir:t,ref:i});await W.writeRef({fs:e,gitdir:t,ref:"HEAD",value:l})}await W.deleteRef({fs:e,gitdir:t,ref:i});let s=ca(r),o=await We.get({fs:e,gitdir:t});await o.deleteSection("branch",s),await We.save({fs:e,gitdir:t,config:o})}async function kO({fs:e,dir:t,gitdir:r=$(t,".git"),ref:n}){try{return C("fs",e),C("ref",n),await AO({fs:new X(e),gitdir:r,ref:n})}catch(i){throw i.caller="git.deleteBranch",i}}async function TO({fs:e,dir:t,gitdir:r=$(t,".git"),ref:n}){try{C("fs",e),C("ref",n),await W.deleteRef({fs:new X(e),gitdir:r,ref:n})}catch(i){throw i.caller="git.deleteRef",i}}async function CO({fs:e,gitdir:t,remote:r}){let n=await We.get({fs:e,gitdir:t});await n.deleteSection("remote",r),await We.save({fs:e,gitdir:t,config:n})}async function PO({fs:e,dir:t,gitdir:r=$(t,".git"),remote:n}){try{return C("fs",e),C("remote",n),await CO({fs:new X(e),gitdir:r,remote:n})}catch(i){throw i.caller="git.deleteRemote",i}}async function RO({fs:e,gitdir:t,ref:r}){r=r.startsWith("refs/tags/")?r:`refs/tags/${r}`,await W.deleteRef({fs:e,gitdir:t,ref:r})}async function MO({fs:e,dir:t,gitdir:r=$(t,".git"),ref:n}){try{return C("fs",e),C("ref",n),await RO({fs:new X(e),gitdir:r,ref:n})}catch(i){throw i.caller="git.deleteTag",i}}async function OO({fs:e,gitdir:t,oid:r}){let n=r.slice(0,2);return(await e.readdir(`${t}/objects/${n}`)).map(a=>`${n}${a}`).filter(a=>a.startsWith(r))}async function IO({fs:e,cache:t,gitdir:r,oid:n,getExternalRefDelta:i}){let a=[],s=await e.readdir($(r,"objects/pack"));s=s.filter(o=>o.endsWith(".idx"));for(let o of s){let l=`${r}/objects/pack/${o}`,c=await Ap({fs:e,cache:t,filename:l,getExternalRefDelta:i});if(c.error)throw new le(c.error);for(let u of c.offsets.keys())u.startsWith(n)&&a.push(u)}return a}async function FO({fs:e,cache:t,gitdir:r,oid:n}){let i=o=>qe({fs:e,cache:t,gitdir:r,oid:o}),a=await OO({fs:e,gitdir:r,oid:n}),s=await IO({fs:e,cache:t,gitdir:r,oid:n,getExternalRefDelta:i});for(let o of s)a.indexOf(o)===-1&&a.push(o);if(a.length===1)return a[0];throw a.length>1?new al("oids",n,a):new Le(`an object matching "${n}"`)}async function $O({fs:e,dir:t,gitdir:r=$(t,".git"),oid:n,cache:i={}}){try{return C("fs",e),C("gitdir",r),C("oid",n),await FO({fs:new X(e),cache:i,gitdir:r,oid:n})}catch(a){throw a.caller="git.expandOid",a}}async function LO({fs:e,dir:t,gitdir:r=$(t,".git"),ref:n}){try{return C("fs",e),C("gitdir",r),C("ref",n),await W.expand({fs:new X(e),gitdir:r,ref:n})}catch(i){throw i.caller="git.expandRef",i}}async function Pp({fs:e,cache:t,gitdir:r,oids:n}){let i={},a=n.length,s=n.map((o,l)=>({index:l,oid:o}));for(;s.length;){let o=new Set;for(let{oid:c,index:u}of s)i[c]||(i[c]=new Set),i[c].add(u),i[c].size===a&&o.add(c);if(o.size>0)return[...o];let l=new Map;for(let{oid:c,index:u}of s)try{let{object:f}=await qe({fs:e,cache:t,gitdir:r,oid:c}),d=rr.from(f),{parent:h}=d.parseHeaders();for(let p of h)(!i[p]||!i[p].has(u))&&l.set(p+":"+u,{oid:p,index:u})}catch(f){}s=Array.from(l.values())}return[]}var up=/^.*(\r?\n|$)/gm;function DO({branches:e,contents:t}){let r=e[1],n=e[2],i=t[0],a=t[1],s=t[2],o=a.match(up),l=i.match(up),c=s.match(up),u=(0,n2.default)(o,l,c),f=7,d="",h=!0;for(let p of u)p.ok&&(d+=p.ok.join("")),p.conflict&&(h=!1,d+=`${"<".repeat(f)} ${r} +`,d+=p.conflict.a.join(""),d+=`${"=".repeat(f)} +`,d+=p.conflict.b.join(""),d+=`${">".repeat(f)} ${n} +`);return{cleanMerge:h,mergedText:d}}async function NO({fs:e,cache:t,dir:r,gitdir:n=$(r,".git"),index:i,ourOid:a,baseOid:s,theirOid:o,ourName:l="ours",baseName:c="base",theirName:u="theirs",dryRun:f=!1,abortOnConflict:d=!0,mergeDriver:h}){let p=bi({ref:a}),m=bi({ref:s}),v=bi({ref:o}),y=[],b=[],x=[],E=[],_=await _s({fs:e,cache:t,dir:r,gitdir:n,trees:[p,m,v],map:async function(k,[w,A,S]){let T=tu(k),P=await su(w,A),I=await su(S,A);switch(`${P}-${I}`){case"false-false":return{mode:await A.mode(),path:T,oid:await A.oid(),type:await A.type()};case"false-true":return S?{mode:await S.mode(),path:T,oid:await S.oid(),type:await S.type()}:void 0;case"true-false":return w?{mode:await w.mode(),path:T,oid:await w.oid(),type:await w.type()}:void 0;case"true-true":{if(w&&A&&S&&await w.type()==="blob"&&await A.type()==="blob"&&await S.type()==="blob")return BO({fs:e,gitdir:n,path:T,ours:w,base:A,theirs:S,ourName:l,baseName:c,theirName:u,mergeDriver:h}).then(async N=>{if(N.cleanMerge)d||i.insert({filepath:k,oid:N.mergeResult.oid,stage:0});else if(y.push(k),b.push(k),!d){let L=await A.oid(),ee=await w.oid(),fe=await S.oid();i.delete({filepath:k}),i.insert({filepath:k,oid:L,stage:1}),i.insert({filepath:k,oid:ee,stage:2}),i.insert({filepath:k,oid:fe,stage:3})}return N.mergeResult});if(A&&!w&&S&&await A.type()==="blob"&&await S.type()==="blob"){if(y.push(k),x.push(k),!d){let N=await A.oid(),L=await S.oid();i.delete({filepath:k}),i.insert({filepath:k,oid:N,stage:1}),i.insert({filepath:k,oid:L,stage:3})}return{mode:await S.mode(),oid:await S.oid(),type:"blob",path:T}}if(A&&w&&!S&&await A.type()==="blob"&&await w.type()==="blob"){if(y.push(k),E.push(k),!d){let N=await A.oid(),L=await w.oid();i.delete({filepath:k}),i.insert({filepath:k,oid:N,stage:1}),i.insert({filepath:k,oid:L,stage:2})}return{mode:await w.mode(),oid:await w.oid(),type:"blob",path:T}}if(A&&!w&&!S&&await A.type()==="blob")return;throw new gs}}},reduce:y.length!==0&&(!r||d)?void 0:async(k,w)=>{let A=w.filter(Boolean);if(k&&!(k&&k.type==="tree"&&A.length===0)){if(A.length>0){let T=new tr(A).toObject(),P=await mr({fs:e,gitdir:n,type:"tree",object:T,dryRun:f});k.oid=P}return k}}});return y.length!==0?(r&&!d&&await _s({fs:e,cache:t,dir:r,gitdir:n,trees:[bi({ref:_.oid})],map:async function(k,[w]){let A=`${r}/${k}`;if(await w.type()==="blob"){let S=await w.mode(),T=new TextDecoder().decode(await w.content());await e.write(A,T,{mode:S})}return!0}}),new vs(y,b,x,E)):_.oid}async function BO({fs:e,gitdir:t,path:r,ours:n,base:i,theirs:a,ourName:s,theirName:o,baseName:l,dryRun:c,mergeDriver:u=DO}){let f="blob",d=await i.mode()===await n.mode()?await a.mode():await n.mode();if(await n.oid()===await a.oid())return{cleanMerge:!0,mergeResult:{mode:d,path:r,oid:await n.oid(),type:f}};if(await n.oid()===await i.oid())return{cleanMerge:!0,mergeResult:{mode:d,path:r,oid:await a.oid(),type:f}};if(await a.oid()===await i.oid())return{cleanMerge:!0,mergeResult:{mode:d,path:r,oid:await n.oid(),type:f}};let h=Buffer.from(await n.content()).toString("utf8"),p=Buffer.from(await i.content()).toString("utf8"),m=Buffer.from(await a.content()).toString("utf8"),{mergedText:v,cleanMerge:y}=await u({branches:[l,s,o],contents:[p,h,m],path:r}),b=await mr({fs:e,gitdir:t,type:"blob",object:Buffer.from(v,"utf8"),dryRun:c});return{cleanMerge:y,mergeResult:{mode:d,path:r,oid:b,type:f}}}async function S2({fs:e,cache:t,dir:r,gitdir:n,ours:i,theirs:a,fastForward:s=!0,fastForwardOnly:o=!1,dryRun:l=!1,noUpdateBranch:c=!1,abortOnConflict:u=!0,message:f,author:d,committer:h,signingKey:p,onSign:m,mergeDriver:v}){i===void 0&&(i=await ha({fs:e,gitdir:n,fullname:!0})),i=await W.expand({fs:e,gitdir:n,ref:i}),a=await W.expand({fs:e,gitdir:n,ref:a});let y=await W.resolve({fs:e,gitdir:n,ref:i}),b=await W.resolve({fs:e,gitdir:n,ref:a}),x=await Pp({fs:e,cache:t,gitdir:n,oids:[y,b]});if(x.length!==1)throw new gs;let E=x[0];if(E===b)return{oid:y,alreadyMerged:!0};if(s&&E===y)return!l&&!c&&await W.writeRef({fs:e,gitdir:n,ref:i,value:b}),{oid:b,fastForward:!0};{if(o)throw new cl;let _=await yt.acquire({fs:e,gitdir:n,cache:t,allowUnmerged:!1},async w=>NO({fs:e,cache:t,dir:r,gitdir:n,index:w,ourOid:y,theirOid:b,baseOid:E,ourName:ca(i),baseName:"base",theirName:ca(a),dryRun:l,abortOnConflict:u,mergeDriver:v}));if(_ instanceof vs)throw _;return f||(f=`Merge branch '${ca(a)}' into ${ca(i)}`),{oid:await mu({fs:e,cache:t,gitdir:n,message:f,ref:i,tree:_,parent:[y,b],author:d,committer:h,signingKey:p,onSign:m,dryRun:l,noUpdateBranch:c}),tree:_,mergeCommit:!0}}}async function E2({fs:e,cache:t,http:r,onProgress:n,onMessage:i,onAuth:a,onAuthSuccess:s,onAuthFailure:o,dir:l,gitdir:c,ref:u,url:f,remote:d,remoteRef:h,prune:p,pruneTags:m,fastForward:v,fastForwardOnly:y,corsProxy:b,singleBranch:x,headers:E,author:_,committer:k,signingKey:w}){try{if(!u){let T=await ha({fs:e,gitdir:c});if(!T)throw new er("ref");u=T}let{fetchHead:A,fetchHeadDescription:S}=await Cp({fs:e,cache:t,http:r,onProgress:n,onMessage:i,onAuth:a,onAuthSuccess:s,onAuthFailure:o,gitdir:c,corsProxy:b,ref:u,url:f,remote:d,remoteRef:h,singleBranch:x,headers:E,prune:p,pruneTags:m});await S2({fs:e,cache:t,gitdir:c,ours:u,theirs:A,fastForward:v,fastForwardOnly:y,message:`Merge ${S}`,author:_,committer:k,signingKey:w,dryRun:!1,noUpdateBranch:!1}),await Tp({fs:e,cache:t,onProgress:n,dir:l,gitdir:c,ref:u,remote:d,noCheckout:!1})}catch(A){throw A.caller="git.pull",A}}async function jO({fs:e,http:t,onProgress:r,onMessage:n,onAuth:i,onAuthSuccess:a,onAuthFailure:s,dir:o,gitdir:l=$(o,".git"),ref:c,url:u,remote:f,remoteRef:d,corsProxy:h,singleBranch:p,headers:m={},cache:v={}}){try{C("fs",e),C("http",t),C("gitdir",l);let y={name:"",email:"",timestamp:Date.now(),timezoneOffset:0};return await E2({fs:new X(e),cache:v,http:t,onProgress:r,onMessage:n,onAuth:i,onAuthSuccess:a,onAuthFailure:s,dir:o,gitdir:l,ref:c,url:u,remote:f,remoteRef:d,fastForwardOnly:!0,corsProxy:h,singleBranch:p,headers:m,author:y,committer:y})}catch(y){throw y.caller="git.fastForward",y}}async function HO({fs:e,http:t,onProgress:r,onMessage:n,onAuth:i,onAuthSuccess:a,onAuthFailure:s,dir:o,gitdir:l=$(o,".git"),ref:c,remote:u,remoteRef:f,url:d,corsProxy:h,depth:p=null,since:m=null,exclude:v=[],relative:y=!1,tags:b=!1,singleBranch:x=!1,headers:E={},prune:_=!1,pruneTags:k=!1,cache:w={}}){try{return C("fs",e),C("http",t),C("gitdir",l),await Cp({fs:new X(e),cache:w,http:t,onProgress:r,onMessage:n,onAuth:i,onAuthSuccess:a,onAuthFailure:s,gitdir:l,ref:c,remote:u,remoteRef:f,url:d,corsProxy:h,depth:p,since:m,exclude:v,relative:y,tags:b,singleBranch:x,headers:E,prune:_,pruneTags:k})}catch(A){throw A.caller="git.fetch",A}}async function UO({fs:e,dir:t,gitdir:r=$(t,".git"),oids:n,cache:i={}}){try{return C("fs",e),C("gitdir",r),C("oids",n),await Pp({fs:new X(e),cache:i,gitdir:r,oids:n})}catch(a){throw a.caller="git.findMergeBase",a}}async function A2({fs:e,filepath:t}){if(await e.exists($(t,".git")))return t;{let r=ps(t);if(r===t)throw new Le(`git root for ${t}`);return A2({fs:e,filepath:r})}}async function GO({fs:e,filepath:t}){try{return C("fs",e),C("filepath",t),await A2({fs:new X(e),filepath:t})}catch(r){throw r.caller="git.findRoot",r}}async function zO({fs:e,dir:t,gitdir:r=$(t,".git"),path:n}){try{return C("fs",e),C("gitdir",r),C("path",n),await yl({fs:new X(e),gitdir:r,path:n})}catch(i){throw i.caller="git.getConfig",i}}async function VO({fs:e,gitdir:t,path:r}){return(await We.get({fs:e,gitdir:t})).getall(r)}async function WO({fs:e,dir:t,gitdir:r=$(t,".git"),path:n}){try{return C("fs",e),C("gitdir",r),C("path",n),await VO({fs:new X(e),gitdir:r,path:n})}catch(i){throw i.caller="git.getConfigAll",i}}async function qO({http:e,onAuth:t,onAuthSuccess:r,onAuthFailure:n,corsProxy:i,url:a,headers:s={},forPush:o=!1}){try{C("http",e),C("url",a);let c=await As.getRemoteHelperFor({url:a}).discover({http:e,onAuth:t,onAuthSuccess:r,onAuthFailure:n,corsProxy:i,service:o?"git-receive-pack":"git-upload-pack",url:a,headers:s,protocolVersion:1}),u={capabilities:[...c.capabilities]};for(let[f,d]of c.refs){let h=f.split("/"),p=h.pop(),m=u;for(let v of h)m[v]=m[v]||{},m=m[v];m[p]=d}for(let[f,d]of c.symrefs){let h=f.split("/"),p=h.pop(),m=u;for(let v of h)m[v]=m[v]||{},m=m[v];m[p]=d}return u}catch(l){throw l.caller="git.getRemoteInfo",l}}function k2(e,t,r,n){let i=[];for(let[a,s]of e.refs){if(t&&!a.startsWith(t))continue;if(a.endsWith("^{}")){if(n){let l=a.replace("^{}",""),c=i[i.length-1],u=c.ref===l?c:i.find(f=>f.ref===l);if(u===void 0)throw new Error("I did not expect this to happen");u.peeled=s}continue}let o={ref:a,oid:s};r&&e.symrefs.has(a)&&(o.target=e.symrefs.get(a)),i.push(o)}return i}async function YO({http:e,onAuth:t,onAuthSuccess:r,onAuthFailure:n,corsProxy:i,url:a,headers:s={},forPush:o=!1,protocolVersion:l=2}){try{C("http",e),C("url",a);let u=await As.getRemoteHelperFor({url:a}).discover({http:e,onAuth:t,onAuthSuccess:r,onAuthFailure:n,corsProxy:i,service:o?"git-receive-pack":"git-upload-pack",url:a,headers:s,protocolVersion:l});if(u.protocolVersion===2)return{protocolVersion:u.protocolVersion,capabilities:u.capabilities2};let f={};for(let d of u.capabilities){let[h,p]=d.split("=");p?f[h]=p:f[h]=!0}return{protocolVersion:1,capabilities:f,refs:k2(u,void 0,!0,!0)}}catch(c){throw c.caller="git.getRemoteInfo2",c}}async function XO({type:e,object:t,format:r="content",oid:n=void 0}){return r!=="deflated"&&(r!=="wrapped"&&(t=xi.wrap({type:e,object:t})),n=await Vn(t)),{oid:n,object:t}}async function ZO({object:e}){try{C("object",e),typeof e=="string"?e=Buffer.from(e,"utf8"):e=Buffer.from(e);let t="blob",{oid:r,object:n}=await XO({type:"blob",format:"content",object:e});return{oid:r,type:t,object:new Uint8Array(n),format:"wrapped"}}catch(t){throw t.caller="git.hashBlob",t}}async function KO({fs:e,cache:t,onProgress:r,dir:n,gitdir:i,filepath:a}){try{a=$(n,a);let s=await e.read(a),o=c=>qe({fs:e,cache:t,gitdir:i,oid:c}),l=await il.fromPack({pack:s,getExternalRefDelta:o,onProgress:r});return await e.write(a.replace(/\.pack$/,".idx"),await l.toBuffer()),{oids:[...l.hashes]}}catch(s){throw s.caller="git.indexPack",s}}async function JO({fs:e,onProgress:t,dir:r,gitdir:n=$(r,".git"),filepath:i,cache:a={}}){try{return C("fs",e),C("dir",r),C("gitdir",r),C("filepath",i),await KO({fs:new X(e),cache:a,onProgress:t,dir:r,gitdir:n,filepath:i})}catch(s){throw s.caller="git.indexPack",s}}async function QO({fs:e,bare:t=!1,dir:r,gitdir:n=t?r:$(r,".git"),defaultBranch:i="master"}){try{return C("fs",e),C("gitdir",n),t||C("dir",r),await x2({fs:new X(e),bare:t,dir:r,gitdir:n,defaultBranch:i})}catch(a){throw a.caller="git.init",a}}async function T2({fs:e,cache:t,gitdir:r,oid:n,ancestor:i,depth:a}){let s=await da.read({fs:e,gitdir:r});if(!n)throw new er("oid");if(!i)throw new er("ancestor");if(n===i)return!1;let o=[n],l=new Set,c=0;for(;o.length;){if(c++===a)throw new fl(a);let u=o.shift(),{type:f,object:d}=await qe({fs:e,cache:t,gitdir:r,oid:u});if(f!=="commit")throw new zt(u,f,"commit");let h=rr.from(d).parse();for(let p of h.parent)if(p===i)return!0;if(!s.has(u))for(let p of h.parent)l.has(p)||(o.push(p),l.add(p))}return!1}async function eI({fs:e,dir:t,gitdir:r=$(t,".git"),oid:n,ancestor:i,depth:a=-1,cache:s={}}){try{return C("fs",e),C("gitdir",r),C("oid",n),C("ancestor",i),await T2({fs:new X(e),cache:s,gitdir:r,oid:n,ancestor:i,depth:a})}catch(o){throw o.caller="git.isDescendent",o}}async function tI({fs:e,dir:t,gitdir:r=$(t,".git"),filepath:n}){try{return C("fs",e),C("dir",t),C("gitdir",r),C("filepath",n),xs.isIgnored({fs:new X(e),dir:t,gitdir:r,filepath:n})}catch(i){throw i.caller="git.isIgnored",i}}async function rI({fs:e,dir:t,gitdir:r=$(t,".git"),remote:n}){try{return C("fs",e),C("gitdir",r),W.listBranches({fs:new X(e),gitdir:r,remote:n})}catch(i){throw i.caller="git.listBranches",i}}async function nI({fs:e,gitdir:t,ref:r,cache:n}){if(r){let i=await W.resolve({gitdir:t,fs:e,ref:r}),a=[];return await C2({fs:e,cache:n,gitdir:t,oid:i,filenames:a,prefix:""}),a}else return yt.acquire({fs:e,gitdir:t,cache:n},async function(i){return i.entries.map(a=>a.path)})}async function C2({fs:e,cache:t,gitdir:r,oid:n,filenames:i,prefix:a}){let{tree:s}=await ks({fs:e,cache:t,gitdir:r,oid:n});for(let o of s)o.type==="tree"?await C2({fs:e,cache:t,gitdir:r,oid:o.oid,filenames:i,prefix:$(a,o.path)}):i.push($(a,o.path))}async function iI({fs:e,dir:t,gitdir:r=$(t,".git"),ref:n,cache:i={}}){try{return C("fs",e),C("gitdir",r),await nI({fs:new X(e),cache:i,gitdir:r,ref:n})}catch(a){throw a.caller="git.listFiles",a}}async function aI({fs:e,cache:t,gitdir:r,ref:n}){let i;try{i=await W.resolve({gitdir:r,fs:e,ref:n})}catch(o){if(o instanceof Le)return[]}return(await ks({fs:e,cache:t,gitdir:r,oid:i})).tree.map(o=>({target:o.path,note:o.oid}))}async function sI({fs:e,dir:t,gitdir:r=$(t,".git"),ref:n="refs/notes/commits",cache:i={}}){try{return C("fs",e),C("gitdir",r),C("ref",n),await aI({fs:new X(e),cache:i,gitdir:r,ref:n})}catch(a){throw a.caller="git.listNotes",a}}async function oI({fs:e,gitdir:t}){let r=await We.get({fs:e,gitdir:t}),n=await r.getSubsections("remote");return Promise.all(n.map(async a=>{let s=await r.get(`remote.${a}.url`);return{remote:a,url:s}}))}async function lI({fs:e,dir:t,gitdir:r=$(t,".git")}){try{return C("fs",e),C("gitdir",r),await oI({fs:new X(e),gitdir:r})}catch(n){throw n.caller="git.listRemotes",n}}async function cI(e){let t=Ve.streamReader(e),r=[],n;for(;n=await t(),n!==!0;){if(n===null)continue;n=n.toString("utf8").replace(/\n$/,"");let[i,a,...s]=n.split(" "),o={ref:a,oid:i};for(let l of s){let[c,u]=l.split(":");c==="symref-target"?o.target=u:c==="peeled"&&(o.peeled=u)}r.push(o)}return r}async function uI({prefix:e,symrefs:t,peelTags:r}){let n=[];return n.push(Ve.encode(`command=ls-refs +`)),n.push(Ve.encode(`agent=${gu.agent} +`)),(r||t||e)&&n.push(Ve.delim()),r&&n.push(Ve.encode("peel")),t&&n.push(Ve.encode("symrefs")),e&&n.push(Ve.encode(`ref-prefix ${e}`)),n.push(Ve.flush()),n}async function fI({http:e,onAuth:t,onAuthSuccess:r,onAuthFailure:n,corsProxy:i,url:a,headers:s={},forPush:o=!1,protocolVersion:l=2,prefix:c,symrefs:u,peelTags:f}){try{C("http",e),C("url",a);let d=await Es.discover({http:e,onAuth:t,onAuthSuccess:r,onAuthFailure:n,corsProxy:i,service:o?"git-receive-pack":"git-upload-pack",url:a,headers:s,protocolVersion:l});if(d.protocolVersion===1)return k2(d,c,u,f);let h=await uI({prefix:c,symrefs:u,peelTags:f}),p=await Es.connect({http:e,auth:d.auth,headers:s,corsProxy:i,service:o?"git-receive-pack":"git-upload-pack",url:a,body:h});return cI(p.body)}catch(d){throw d.caller="git.listServerRefs",d}}async function dI({fs:e,dir:t,gitdir:r=$(t,".git")}){try{return C("fs",e),C("gitdir",r),W.listTags({fs:new X(e),gitdir:r})}catch(n){throw n.caller="git.listTags",n}}function hI(e,t){return e.committer.timestamp-t.committer.timestamp}var pI="e69de29bb2d1d6434b8b29ae775ad8c2e48c5391";async function e2({fs:e,cache:t,gitdir:r,oid:n,fileId:i}){if(i===pI)return;let a=n,s,o=await bs({fs:e,cache:t,gitdir:r,oid:n}),l=o.tree;return i===o.oid?s=o.path:(s=await P2({fs:e,cache:t,gitdir:r,tree:l,fileId:i,oid:a}),Array.isArray(s)&&(s.length===0?s=void 0:s.length===1&&(s=s[0]))),s}async function P2({fs:e,cache:t,gitdir:r,tree:n,fileId:i,oid:a,filepaths:s=[],parentPath:o=""}){let l=n.entries().map(function(c){let u;return c.oid===i?(u=$(o,c.path),s.push(u)):c.type==="tree"&&(u=qe({fs:e,cache:t,gitdir:r,oid:c.oid}).then(function({object:f}){return P2({fs:e,cache:t,gitdir:r,tree:tr.from(f),fileId:i,oid:a,filepaths:s,parentPath:$(o,c.path)})})),u});return await Promise.all(l),s}async function mI({fs:e,cache:t,gitdir:r,filepath:n,ref:i,depth:a,since:s,force:o,follow:l}){let c=typeof s=="undefined"?void 0:Math.floor(s.valueOf()/1e3),u=[],f=await da.read({fs:e,gitdir:r}),d=await W.resolve({fs:e,gitdir:r,ref:i}),h=[await ou({fs:e,cache:t,gitdir:r,oid:d})],p,m,v;function y(b){v&&n&&u.push(b)}for(;h.length>0;){let b=h.pop();if(c!==void 0&&b.commit.committer.timestamp<=c)break;if(n){let x;try{x=await bl({fs:e,cache:t,gitdir:r,oid:b.commit.tree,filepath:n}),m&&p!==x&&u.push(m),p=x,m=b,v=!0}catch(E){if(E instanceof Le){let _=l&&p;if(_&&(_=await e2({fs:e,cache:t,gitdir:r,oid:b.commit.tree,fileId:p}),_))if(Array.isArray(_)){if(m){let k=await e2({fs:e,cache:t,gitdir:r,oid:m.commit.tree,fileId:p});if(Array.isArray(k))if(_=_.filter(w=>k.indexOf(w)===-1),_.length===1)_=_[0],n=_,m&&u.push(m);else{_=!1,m&&u.push(m);break}}}else n=_,m&&u.push(m);if(!_){if(v&&p&&(u.push(m),!o))break;if(!o&&!l)throw E}m=b,v=!1}else throw E}}else u.push(b);if(a!==void 0&&u.length===a){y(b);break}if(!f.has(b.oid))for(let x of b.commit.parent){let E=await ou({fs:e,cache:t,gitdir:r,oid:x});h.map(_=>_.oid).includes(E.oid)||h.push(E)}h.length===0&&y(b),h.sort((x,E)=>hI(x.commit,E.commit))}return u}async function gI({fs:e,dir:t,gitdir:r=$(t,".git"),filepath:n,ref:i="HEAD",depth:a,since:s,force:o,follow:l,cache:c={}}){try{return C("fs",e),C("gitdir",r),C("ref",i),await mI({fs:new X(e),cache:c,gitdir:r,filepath:n,ref:i,depth:a,since:s,force:o,follow:l})}catch(u){throw u.caller="git.log",u}}async function vI({fs:e,onSign:t,dir:r,gitdir:n=$(r,".git"),ours:i,theirs:a,fastForward:s=!0,fastForwardOnly:o=!1,dryRun:l=!1,noUpdateBranch:c=!1,abortOnConflict:u=!0,message:f,author:d,committer:h,signingKey:p,cache:m={},mergeDriver:v}){try{C("fs",e),p&&C("onSign",t);let y=new X(e),b=await fa({fs:y,gitdir:n,author:d});if(!b&&(!o||!s))throw new Vt("author");let x=await Ss({fs:y,gitdir:n,author:b,committer:h});if(!x&&(!o||!s))throw new Vt("committer");return await S2({fs:y,cache:m,dir:r,gitdir:n,ours:i,theirs:a,fastForward:s,fastForwardOnly:o,dryRun:l,noUpdateBranch:c,abortOnConflict:u,message:f,author:b,committer:x,signingKey:p,onSign:t,mergeDriver:v})}catch(y){throw y.caller="git.merge",y}}var yI={commit:16,tree:32,blob:48,tag:64,ofs_delta:96,ref_delta:112};async function R2({fs:e,cache:t,dir:r,gitdir:n=$(r,".git"),oids:i}){let a=new Ep.default,s=[];function o(u,f){let d=Buffer.from(u,f);s.push(d),a.update(d)}async function l({stype:u,object:f}){let d=yI[u],h=f.length,p=h>15?128:0,m=h&15;h=h>>>4;let v=(p|d|m).toString(16);for(o(v,"hex");p;)p=h>127?128:0,v=p|h&127,o(Sp(2,v),"hex"),h=h>>>7;o(Buffer.from(await d2(f)))}o("PACK"),o("00000002","hex"),o(Sp(8,i.length),"hex");for(let u of i){let{type:f,object:d}=await qe({fs:e,cache:t,gitdir:n,oid:u});await l({write:o,object:d,stype:f})}let c=a.digest();return s.push(c),s}async function wI({fs:e,cache:t,gitdir:r,oids:n,write:i}){let a=await R2({fs:e,cache:t,gitdir:r,oids:n}),s=Buffer.from(await lu(a)),l=`pack-${s.slice(-20).toString("hex")}.pack`;return i?(await e.write($(r,`objects/pack/${l}`),s),{filename:l}):{filename:l,packfile:new Uint8Array(s)}}async function bI({fs:e,dir:t,gitdir:r=$(t,".git"),oids:n,write:i=!1,cache:a={}}){try{return C("fs",e),C("gitdir",r),C("oids",n),await wI({fs:new X(e),cache:a,gitdir:r,oids:n,write:i})}catch(s){throw s.caller="git.packObjects",s}}async function _I({fs:e,http:t,onProgress:r,onMessage:n,onAuth:i,onAuthSuccess:a,onAuthFailure:s,dir:o,gitdir:l=$(o,".git"),ref:c,url:u,remote:f,remoteRef:d,prune:h=!1,pruneTags:p=!1,fastForward:m=!0,fastForwardOnly:v=!1,corsProxy:y,singleBranch:b,headers:x={},author:E,committer:_,signingKey:k,cache:w={}}){try{C("fs",e),C("gitdir",l);let A=new X(e),S=await fa({fs:A,gitdir:l,author:E});if(!S)throw new Vt("author");let T=await Ss({fs:A,gitdir:l,author:S,committer:_});if(!T)throw new Vt("committer");return await E2({fs:A,cache:w,http:t,onProgress:r,onMessage:n,onAuth:i,onAuthSuccess:a,onAuthFailure:s,dir:o,gitdir:l,ref:c,url:u,remote:f,remoteRef:d,fastForward:m,fastForwardOnly:v,corsProxy:y,singleBranch:b,headers:x,author:S,committer:T,signingKey:k,prune:h,pruneTags:p})}catch(A){throw A.caller="git.pull",A}}async function xI({fs:e,cache:t,dir:r,gitdir:n=$(r,".git"),start:i,finish:a}){let s=await da.read({fs:e,gitdir:n}),o=new Set,l=new Set;for(let f of i)o.add(await W.resolve({fs:e,gitdir:n,ref:f}));for(let f of a)try{let d=await W.resolve({fs:e,gitdir:n,ref:f});l.add(d)}catch(d){}let c=new Set;async function u(f){c.add(f);let{type:d,object:h}=await qe({fs:e,cache:t,gitdir:n,oid:f});if(d==="tag"){let m=pr.from(h).headers().object;return u(m)}if(d!=="commit")throw new zt(f,d,"commit");if(!s.has(f)){let m=rr.from(h).headers().parent;for(f of m)!l.has(f)&&!c.has(f)&&await u(f)}}for(let f of o)await u(f);return c}async function fp({fs:e,cache:t,dir:r,gitdir:n=$(r,".git"),oids:i}){let a=new Set;async function s(o){if(a.has(o))return;a.add(o);let{type:l,object:c}=await qe({fs:e,cache:t,gitdir:n,oid:o});if(l==="tag"){let f=pr.from(c).headers().object;await s(f)}else if(l==="commit"){let f=rr.from(c).headers().tree;await s(f)}else if(l==="tree"){let u=tr.from(c);for(let f of u)f.type==="blob"&&a.add(f.oid),f.type==="tree"&&await s(f.oid)}}for(let o of i)await s(o);return a}async function SI(e){let t={},r="",n=Ve.streamReader(e),i=await n();for(;i!==!0;)i!==null&&(r+=i.toString("utf8")+` +`),i=await n();let a=r.toString("utf8").split(` +`);if(i=a.shift(),!i.startsWith("unpack "))throw new ua('unpack ok" or "unpack [error message]',i);t.ok=i==="unpack ok",t.ok||(t.error=i.slice(7)),t.refs={};for(let s of a){if(s.trim()==="")continue;let o=s.slice(0,2),l=s.slice(3),c=l.indexOf(" ");c===-1&&(c=l.length);let u=l.slice(0,c),f=l.slice(c+1);t.refs[u]={ok:o==="ok",error:f}}return t}async function EI({capabilities:e=[],triplets:t=[]}){let r=[],n=`\0 ${e.join(" ")}`;for(let i of t)r.push(Ve.encode(`${i.oldoid} ${i.oid} ${i.fullRef}${n} +`)),n="";return r.push(Ve.flush()),r}async function AI({fs:e,cache:t,http:r,onProgress:n,onMessage:i,onAuth:a,onAuthSuccess:s,onAuthFailure:o,onPrePush:l,gitdir:c,ref:u,remoteRef:f,remote:d,url:h,force:p=!1,delete:m=!1,corsProxy:v,headers:y={}}){let b=u||await ha({fs:e,gitdir:c});if(typeof b=="undefined")throw new er("ref");let x=await We.get({fs:e,gitdir:c});d=d||await x.get(`branch.${b}.pushRemote`)||await x.get("remote.pushDefault")||await x.get(`branch.${b}.remote`)||"origin";let E=h||await x.get(`remote.${d}.pushurl`)||await x.get(`remote.${d}.url`);if(typeof E=="undefined")throw new er("remote OR url");let _=f||await x.get(`branch.${b}.merge`);if(typeof E=="undefined")throw new er("remoteRef");v===void 0&&(v=await x.get("http.corsProxy"));let k=await W.expand({fs:e,gitdir:c,ref:b}),w=m?"0000000000000000000000000000000000000000":await W.resolve({fs:e,gitdir:c,ref:k}),A=As.getRemoteHelperFor({url:E}),S=await A.discover({http:r,onAuth:a,onAuthSuccess:s,onAuthFailure:o,corsProxy:v,service:"git-receive-pack",url:E,headers:y,protocolVersion:1}),T=S.auth,P;if(!_)P=k;else try{P=await W.expandAgainstMap({ref:_,map:S.refs})}catch(Y){if(Y instanceof Le)P=_.startsWith("refs/")?_:`refs/heads/${_}`;else throw Y}let I=S.refs.get(P)||"0000000000000000000000000000000000000000";if(l&&!await l({remote:d,url:E,localRef:{ref:m?"(delete)":k,oid:w},remoteRef:{ref:P,oid:I}}))throw new ws;let N=!S.capabilities.has("no-thin"),L=new Set;if(!m){let Y=[...S.refs.values()],O=new Set;if(I!=="0000000000000000000000000000000000000000"){let he=await Pp({fs:e,cache:t,gitdir:c,oids:[w,I]});for(let Ge of he)Y.push(Ge);N&&(O=await fp({fs:e,cache:t,gitdir:c,oids:he}))}if(!Y.includes(w)){let he=await xI({fs:e,cache:t,gitdir:c,start:[w],finish:Y});L=await fp({fs:e,cache:t,gitdir:c,oids:he})}if(N){try{let he=await W.resolve({fs:e,gitdir:c,ref:`refs/remotes/${d}/HEAD`,depth:2}),{oid:Ge}=await W.resolveAgainstMap({ref:he.replace(`refs/remotes/${d}/`,""),fullref:he,map:S.refs}),gt=[Ge];for(let Re of await fp({fs:e,cache:t,gitdir:c,oids:gt}))O.add(Re)}catch(he){}for(let he of O)L.delete(he)}if(w===I&&(p=!0),!p){if(k.startsWith("refs/tags")&&I!=="0000000000000000000000000000000000000000")throw new ys("tag-exists");if(w!=="0000000000000000000000000000000000000000"&&I!=="0000000000000000000000000000000000000000"&&!await T2({fs:e,cache:t,gitdir:c,oid:w,ancestor:I,depth:-1}))throw new ys("not-fast-forward")}}let ee=b2([...S.capabilities],["report-status","side-band-64k",`agent=${gu.agent}`]),fe=await EI({capabilities:ee,triplets:[{oldoid:I,oid:w,fullRef:P}]}),J=m?[]:await R2({fs:e,cache:t,gitdir:c,oids:[...L]}),Q=await A.connect({http:r,onProgress:n,corsProxy:v,service:"git-receive-pack",url:E,auth:T,headers:y,body:[...fe,...J]}),{packfile:Pe,progress:ge}=await cu.demux(Q.body);if(i){let Y=_2(ge);_l(Y,async O=>{await i(O)})}let z=await SI(Pe);if(Q.headers&&(z.headers=Q.headers),d&&z.ok&&z.refs[P].ok&&!k.startsWith("refs/tags")){let Y=`refs/remotes/${d}/${P.replace("refs/heads","")}`;m?await W.deleteRef({fs:e,gitdir:c,ref:Y}):await W.writeRef({fs:e,gitdir:c,ref:Y,value:w})}if(z.ok&&Object.values(z.refs).every(Y=>Y.ok))return z;{let Y=Object.entries(z.refs).filter(([O,he])=>!he.ok).map(([O,he])=>` + - ${O}: ${he.error}`).join("");throw new ul(Y,z)}}async function kI({fs:e,http:t,onProgress:r,onMessage:n,onAuth:i,onAuthSuccess:a,onAuthFailure:s,onPrePush:o,dir:l,gitdir:c=$(l,".git"),ref:u,remoteRef:f,remote:d="origin",url:h,force:p=!1,delete:m=!1,corsProxy:v,headers:y={},cache:b={}}){try{return C("fs",e),C("http",t),C("gitdir",c),await AI({fs:new X(e),cache:b,http:t,onProgress:r,onMessage:n,onAuth:i,onAuthSuccess:a,onAuthFailure:s,onPrePush:o,gitdir:c,ref:u,remoteRef:f,remote:d,url:h,force:p,delete:m,corsProxy:v,headers:y})}catch(x){throw x.caller="git.push",x}}async function M2({fs:e,cache:t,gitdir:r,oid:n}){let{type:i,object:a}=await qe({fs:e,cache:t,gitdir:r,oid:n});if(i==="tag")return n=pr.from(a).parse().object,M2({fs:e,cache:t,gitdir:r,oid:n});if(i!=="blob")throw new zt(n,i,"blob");return{oid:n,blob:new Uint8Array(a)}}async function O2({fs:e,cache:t,gitdir:r,oid:n,filepath:i=void 0}){return i!==void 0&&(n=await bl({fs:e,cache:t,gitdir:r,oid:n,filepath:i})),await M2({fs:e,cache:t,gitdir:r,oid:n})}async function xl({fs:e,dir:t,gitdir:r=$(t,".git"),oid:n,filepath:i,cache:a={}}){try{return C("fs",e),C("gitdir",r),C("oid",n),await O2({fs:new X(e),cache:a,gitdir:r,oid:n,filepath:i})}catch(s){throw s.caller="git.readBlob",s}}async function TI({fs:e,dir:t,gitdir:r=$(t,".git"),oid:n,cache:i={}}){try{return C("fs",e),C("gitdir",r),C("oid",n),await ou({fs:new X(e),cache:i,gitdir:r,oid:n})}catch(a){throw a.caller="git.readCommit",a}}async function CI({fs:e,cache:t,gitdir:r,ref:n="refs/notes/commits",oid:i}){let a=await W.resolve({gitdir:r,fs:e,ref:n}),{blob:s}=await O2({fs:e,cache:t,gitdir:r,oid:a,filepath:i});return s}async function PI({fs:e,dir:t,gitdir:r=$(t,".git"),ref:n="refs/notes/commits",oid:i,cache:a={}}){try{return C("fs",e),C("gitdir",r),C("ref",n),C("oid",i),await CI({fs:new X(e),cache:a,gitdir:r,ref:n,oid:i})}catch(s){throw s.caller="git.readNote",s}}async function RI({fs:e,dir:t,gitdir:r=$(t,".git"),oid:n,format:i="parsed",filepath:a=void 0,encoding:s=void 0,cache:o={}}){try{C("fs",e),C("gitdir",r),C("oid",n);let l=new X(e);a!==void 0&&(n=await bl({fs:l,cache:o,gitdir:r,oid:n,filepath:a}));let u=await qe({fs:l,cache:o,gitdir:r,oid:n,format:i==="parsed"?"content":i});if(u.oid=n,i==="parsed")switch(u.format="parsed",u.type){case"commit":u.object=rr.from(u.object).parse();break;case"tree":u.object=tr.from(u.object).entries();break;case"blob":s?u.object=u.object.toString(s):(u.object=new Uint8Array(u.object),u.format="content");break;case"tag":u.object=pr.from(u.object).parse();break;default:throw new zt(u.oid,u.type,"blob|commit|tag|tree")}else(u.format==="deflated"||u.format==="wrapped")&&(u.type=u.format);return u}catch(l){throw l.caller="git.readObject",l}}async function MI({fs:e,cache:t,gitdir:r,oid:n}){let{type:i,object:a}=await qe({fs:e,cache:t,gitdir:r,oid:n,format:"content"});if(i!=="tag")throw new zt(n,i,"tag");let s=pr.from(a);return{oid:n,tag:s.parse(),payload:s.payload()}}async function OI({fs:e,dir:t,gitdir:r=$(t,".git"),oid:n,cache:i={}}){try{return C("fs",e),C("gitdir",r),C("oid",n),await MI({fs:new X(e),cache:i,gitdir:r,oid:n})}catch(a){throw a.caller="git.readTag",a}}async function II({fs:e,dir:t,gitdir:r=$(t,".git"),oid:n,filepath:i=void 0,cache:a={}}){try{return C("fs",e),C("gitdir",r),C("oid",n),await ks({fs:new X(e),cache:a,gitdir:r,oid:n,filepath:i})}catch(s){throw s.caller="git.readTree",s}}async function FI({fs:e,dir:t,gitdir:r=$(t,".git"),filepath:n,cache:i={}}){try{C("fs",e),C("gitdir",r),C("filepath",n),await yt.acquire({fs:new X(e),gitdir:r,cache:i},async function(a){a.delete({filepath:n})})}catch(a){throw a.caller="git.remove",a}}async function $I({fs:e,cache:t,onSign:r,gitdir:n,ref:i="refs/notes/commits",oid:a,author:s,committer:o,signingKey:l}){let c;try{c=await W.resolve({gitdir:n,fs:e,ref:i})}catch(p){if(!(p instanceof Le))throw p}let f=(await ks({fs:e,gitdir:n,oid:c||"4b825dc642cb6eb9a060e54bf8d69288fbee4904"})).tree;f=f.filter(p=>p.path!==a);let d=await kp({fs:e,gitdir:n,tree:f});return await mu({fs:e,cache:t,onSign:r,gitdir:n,ref:i,tree:d,parent:c&&[c],message:`Note removed by 'isomorphic-git removeNote' +`,author:s,committer:o,signingKey:l})}async function LI({fs:e,onSign:t,dir:r,gitdir:n=$(r,".git"),ref:i="refs/notes/commits",oid:a,author:s,committer:o,signingKey:l,cache:c={}}){try{C("fs",e),C("gitdir",n),C("oid",a);let u=new X(e),f=await fa({fs:u,gitdir:n,author:s});if(!f)throw new Vt("author");let d=await Ss({fs:u,gitdir:n,author:f,committer:o});if(!d)throw new Vt("committer");return await $I({fs:u,cache:c,onSign:t,gitdir:n,ref:i,oid:a,author:f,committer:d,signingKey:l})}catch(u){throw u.caller="git.removeNote",u}}async function DI({fs:e,gitdir:t,oldref:r,ref:n,checkout:i=!1}){if(n!==Qr.default.clean(n))throw new Wn(n,Qr.default.clean(n));if(r!==Qr.default.clean(r))throw new Wn(r,Qr.default.clean(r));let a=`refs/heads/${r}`,s=`refs/heads/${n}`;if(await W.exists({fs:e,gitdir:t,ref:s}))throw new en("branch",n,!1);let l=await W.resolve({fs:e,gitdir:t,ref:a,depth:1});await W.writeRef({fs:e,gitdir:t,ref:s,value:l}),await W.deleteRef({fs:e,gitdir:t,ref:a});let u=await ha({fs:e,gitdir:t,fullname:!0})===a;(i||u)&&await W.writeSymbolicRef({fs:e,gitdir:t,ref:"HEAD",value:s})}async function NI({fs:e,dir:t,gitdir:r=$(t,".git"),ref:n,oldref:i,checkout:a=!1}){try{return C("fs",e),C("gitdir",r),C("ref",n),C("oldref",i),await DI({fs:new X(e),gitdir:r,ref:n,oldref:i,checkout:a})}catch(s){throw s.caller="git.renameBranch",s}}async function I2({gitdir:e,type:t,object:r}){return Vn(xi.wrap({type:t,object:r}))}async function BI({fs:e,dir:t,gitdir:r=$(t,".git"),filepath:n,ref:i,cache:a={}}){try{C("fs",e),C("gitdir",r),C("filepath",n);let s=new X(e),o,l;try{o=await W.resolve({fs:s,gitdir:r,ref:i||"HEAD"})}catch(f){if(i)throw f}if(o)try{o=await bl({fs:s,cache:a,gitdir:r,oid:o,filepath:n})}catch(f){o=null}let c={ctime:new Date(0),mtime:new Date(0),dev:0,ino:0,mode:0,uid:0,gid:0,size:0},u=t&&await s.read($(t,n));u&&(l=await I2({gitdir:r,type:"blob",object:u}),o===l&&(c=await s.lstat($(t,n)))),await yt.acquire({fs:s,gitdir:r,cache:a},async function(f){f.delete({filepath:n}),o&&f.insert({filepath:n,stats:c,oid:o})})}catch(s){throw s.caller="git.reset",s}}async function jI({fs:e,dir:t,gitdir:r=$(t,".git"),ref:n,depth:i}){try{return C("fs",e),C("gitdir",r),C("ref",n),await W.resolve({fs:new X(e),gitdir:r,ref:n,depth:i})}catch(a){throw a.caller="git.resolveRef",a}}async function HI({fs:e,dir:t,gitdir:r=$(t,".git"),path:n,value:i,append:a=!1}){try{C("fs",e),C("gitdir",r),C("path",n);let s=new X(e),o=await We.get({fs:s,gitdir:r});a?await o.append(n,i):await o.set(n,i),await We.save({fs:s,gitdir:r,config:o})}catch(s){throw s.caller="git.setConfig",s}}async function UI({fs:e,dir:t,gitdir:r=$(t,".git"),filepath:n,cache:i={}}){try{C("fs",e),C("gitdir",r),C("filepath",n);let a=new X(e);if(await xs.isIgnored({fs:a,gitdir:r,dir:t,filepath:n}))return"ignored";let o=await GI({fs:a,cache:i,gitdir:r}),l=await F2({fs:a,cache:i,gitdir:r,tree:o,path:n}),c=await yt.acquire({fs:a,gitdir:r,cache:i},async function(m){for(let v of m)if(v.path===n)return v;return null}),u=await a.lstat($(t,n)),f=l!==null,d=c!==null,h=u!==null,p=async()=>{if(d&&!eu(c,u))return c.oid;{let m=await a.read($(t,n)),v=await I2({gitdir:r,type:"blob",object:m});return d&&c.oid===v&&u.size!==-1&&yt.acquire({fs:a,gitdir:r,cache:i},async function(y){y.insert({filepath:n,stats:u,oid:v})}),v}};if(!f&&!h&&!d)return"absent";if(!f&&!h&&d)return"*absent";if(!f&&h&&!d)return"*added";if(!f&&h&&d)return await p()===c.oid?"added":"*added";if(f&&!h&&!d)return"deleted";if(f&&!h&&d)return l===c.oid,"*deleted";if(f&&h&&!d)return await p()===l?"*undeleted":"*undeletemodified";if(f&&h&&d){let m=await p();return m===l?m===c.oid?"unmodified":"*unmodified":m===c.oid?"modified":"*modified"}}catch(a){throw a.caller="git.status",a}}async function F2({fs:e,cache:t,gitdir:r,tree:n,path:i}){typeof i=="string"&&(i=i.split("/"));let a=i.shift();for(let s of n)if(s.path===a){if(i.length===0)return s.oid;let{type:o,object:l}=await qe({fs:e,cache:t,gitdir:r,oid:s.oid});if(o==="tree"){let c=tr.from(l);return F2({fs:e,cache:t,gitdir:r,tree:c,path:i})}if(o==="blob")throw new zt(s.oid,o,"blob",i.join("/"))}return null}async function GI({fs:e,cache:t,gitdir:r}){let n;try{n=await W.resolve({fs:e,gitdir:r,ref:"HEAD"})}catch(a){if(a instanceof Le)return[]}let{tree:i}=await ks({fs:e,cache:t,gitdir:r,oid:n});return i}async function zI({fs:e,dir:t,gitdir:r=$(t,".git"),ref:n="HEAD",filepaths:i=["."],filter:a,cache:s={},ignored:o=!1}){try{C("fs",e),C("gitdir",r),C("ref",n);let l=new X(e);return await _s({fs:l,cache:s,dir:t,gitdir:r,trees:[bi({ref:n}),pu(),hu()],map:async function(c,[u,f,d]){if(!u&&!d&&f&&!o&&await xs.isIgnored({fs:l,dir:t,filepath:c})||!i.some(k=>y2(c,k)))return null;if(a&&!a(c))return;let[h,p,m]=await Promise.all([u&&u.type(),f&&f.type(),d&&d.type()]),v=[h,p,m].includes("blob");if((h==="tree"||h==="special")&&!v)return;if(h==="commit")return null;if((p==="tree"||p==="special")&&!v)return;if(m==="commit")return null;if((m==="tree"||m==="special")&&!v)return;let y=h==="blob"?await u.oid():void 0,b=m==="blob"?await d.oid():void 0,x;h!=="blob"&&p==="blob"&&m!=="blob"?x="42":p==="blob"&&(x=await f.oid());let E=[void 0,y,x,b],_=E.map(k=>E.indexOf(k));return _.shift(),[c,..._]}})}catch(l){throw l.caller="git.statusMatrix",l}}async function VI({fs:e,dir:t,gitdir:r=$(t,".git"),ref:n,object:i,force:a=!1}){try{C("fs",e),C("gitdir",r),C("ref",n);let s=new X(e);if(n===void 0)throw new er("ref");n=n.startsWith("refs/tags/")?n:`refs/tags/${n}`;let o=await W.resolve({fs:s,gitdir:r,ref:i||"HEAD"});if(!a&&await W.exists({fs:s,gitdir:r,ref:n}))throw new en("tag",n);await W.writeRef({fs:s,gitdir:r,ref:n,value:o})}catch(s){throw s.caller="git.tag",s}}async function WI({fs:e,dir:t,gitdir:r=$(t,".git"),cache:n={},filepath:i,oid:a,mode:s,add:o,remove:l,force:c}){try{C("fs",e),C("gitdir",r),C("filepath",i);let u=new X(e);if(l)return await yt.acquire({fs:u,gitdir:r,cache:n},async function(d){let h;if(!c&&(h=await u.lstat($(t,i)),h)){if(h.isDirectory())throw new Si("directory");return}d.has({filepath:i})&&d.delete({filepath:i})});let f;if(!a){if(f=await u.lstat($(t,i)),!f)throw new Le(`file at "${i}" on disk and "remove" not set`);if(f.isDirectory())throw new Si("directory")}return await yt.acquire({fs:u,gitdir:r,cache:n},async function(d){if(!o&&!d.has({filepath:i}))throw new Le(`file at "${i}" in index and "add" not set`);let h={ctime:new Date(0),mtime:new Date(0),dev:0,ino:0,mode:s,uid:0,gid:0,size:0};if(!a){h=f;let p=h.isSymbolicLink()?await u.readlink($(t,i)):await u.read($(t,i));a=await mr({fs:u,gitdir:r,type:"blob",format:"content",object:p})}return d.insert({filepath:i,oid:a,stats:h}),a})}catch(u){throw u.caller="git.updateIndex",u}}function qI(){try{return gu.version}catch(e){throw e.caller="git.version",e}}async function YI({fs:e,dir:t,gitdir:r=$(t,".git"),trees:n,map:i,reduce:a,iterate:s,cache:o={}}){try{return C("fs",e),C("gitdir",r),C("trees",n),await _s({fs:new X(e),cache:o,dir:t,gitdir:r,trees:n,map:i,reduce:a,iterate:s})}catch(l){throw l.caller="git.walk",l}}async function XI({fs:e,dir:t,gitdir:r=$(t,".git"),blob:n}){try{return C("fs",e),C("gitdir",r),C("blob",n),await mr({fs:new X(e),gitdir:r,type:"blob",object:n,format:"content"})}catch(i){throw i.caller="git.writeBlob",i}}async function ZI({fs:e,gitdir:t,commit:r}){let n=rr.from(r).toObject();return await mr({fs:e,gitdir:t,type:"commit",object:n,format:"content"})}async function KI({fs:e,dir:t,gitdir:r=$(t,".git"),commit:n}){try{return C("fs",e),C("gitdir",r),C("commit",n),await ZI({fs:new X(e),gitdir:r,commit:n})}catch(i){throw i.caller="git.writeCommit",i}}async function JI({fs:e,dir:t,gitdir:r=$(t,".git"),type:n,object:i,format:a="parsed",oid:s,encoding:o=void 0}){try{let l=new X(e);if(a==="parsed"){switch(n){case"commit":i=rr.from(i).toObject();break;case"tree":i=tr.from(i).toObject();break;case"blob":i=Buffer.from(i,o);break;case"tag":i=pr.from(i).toObject();break;default:throw new zt(s||"",n,"blob|commit|tag|tree")}a="content"}return s=await mr({fs:l,gitdir:r,type:n,object:i,oid:s,format:a}),s}catch(l){throw l.caller="git.writeObject",l}}async function QI({fs:e,dir:t,gitdir:r=$(t,".git"),ref:n,value:i,force:a=!1,symbolic:s=!1}){try{C("fs",e),C("gitdir",r),C("ref",n),C("value",i);let o=new X(e);if(n!==Qr.default.clean(n))throw new Wn(n,Qr.default.clean(n));if(!a&&await W.exists({fs:o,gitdir:r,ref:n}))throw new en("ref",n);s?await W.writeSymbolicRef({fs:o,gitdir:r,ref:n,value:i}):(i=await W.resolve({fs:o,gitdir:r,ref:i}),await W.writeRef({fs:o,gitdir:r,ref:n,value:i}))}catch(o){throw o.caller="git.writeRef",o}}async function e8({fs:e,gitdir:t,tag:r}){let n=pr.from(r).toObject();return await mr({fs:e,gitdir:t,type:"tag",object:n,format:"content"})}async function t8({fs:e,dir:t,gitdir:r=$(t,".git"),tag:n}){try{return C("fs",e),C("gitdir",r),C("tag",n),await e8({fs:new X(e),gitdir:r,tag:n})}catch(i){throw i.caller="git.writeTag",i}}async function r8({fs:e,dir:t,gitdir:r=$(t,".git"),tree:n}){try{return C("fs",e),C("gitdir",r),C("tree",n),await kp({fs:new X(e),gitdir:r,tree:n})}catch(i){throw i.caller="git.writeTree",i}}var n8={Errors:wl,STAGE:hu,TREE:bi,WORKDIR:pu,add:rO,abortMerge:K6,addNote:iO,addRemote:aO,annotatedTag:oO,branch:cO,checkout:fO,clone:xO,commit:SO,getConfig:zO,getConfigAll:WO,setConfig:HI,currentBranch:EO,deleteBranch:kO,deleteRef:TO,deleteRemote:PO,deleteTag:MO,expandOid:$O,expandRef:LO,fastForward:jO,fetch:HO,findMergeBase:UO,findRoot:GO,getRemoteInfo:qO,getRemoteInfo2:YO,hashBlob:ZO,indexPack:JO,init:QO,isDescendent:eI,isIgnored:tI,listBranches:rI,listFiles:iI,listNotes:sI,listRemotes:lI,listServerRefs:fI,listTags:dI,log:gI,merge:vI,packObjects:bI,pull:_I,push:kI,readBlob:xl,readCommit:TI,readNote:PI,readObject:RI,readTag:OI,readTree:II,remove:FI,removeNote:LI,renameBranch:NI,resetIndex:BI,updateIndex:WI,resolveRef:jI,status:UI,statusMatrix:zI,tag:VI,version:qI,walk:YI,writeBlob:XI,writeCommit:KI,writeObject:JI,writeRef:QI,writeTag:t8,writeTree:r8},ie=n8;var xe=require("obsidian"),LP=ze(require("path"));g();var Aa=require("obsidian");g();var Yg=require("child_process"),xT=ze(wu()),_r=ze(require("fs/promises")),Jn=require("obsidian"),De=ze(require("path")),Yl=require("path");g();var Iu=ze(j2(),1),Pu=ze(wu(),1),d_=require("child_process"),X_=ze(Mp(),1),Ms=ze(Mp(),1),_x=require("node:events"),Mu=Object.defineProperty,x8=Object.defineProperties,S8=Object.getOwnPropertyDescriptor,E8=Object.getOwnPropertyDescriptors,Kp=Object.getOwnPropertyNames,H2=Object.getOwnPropertySymbols,bb=Object.prototype.hasOwnProperty,A8=Object.prototype.propertyIsEnumerable,U2=(e,t,r)=>t in e?Mu(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,$r=(e,t)=>{for(var r in t||(t={}))bb.call(t,r)&&U2(e,r,t[r]);if(H2)for(var r of H2(t))A8.call(t,r)&&U2(e,r,t[r]);return e},Al=(e,t)=>x8(e,E8(t)),V=(e,t)=>function(){return e&&(t=(0,e[Kp(e)[0]])(e=0)),t},k8=(e,t)=>function(){return t||(0,e[Kp(e)[0]])((t={exports:{}}).exports,t),t.exports},at=(e,t)=>{for(var r in t)Mu(e,r,{get:t[r],enumerable:!0})},T8=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Kp(t))!bb.call(e,i)&&i!==r&&Mu(e,i,{get:()=>t[i],enumerable:!(n=S8(t,i))||n.enumerable});return e},Qe=e=>T8(Mu({},"__esModule",{value:!0}),e),El=(e,t,r)=>new Promise((n,i)=>{var a=l=>{try{o(r.next(l))}catch(c){i(c)}},s=l=>{try{o(r.throw(l))}catch(c){i(c)}},o=l=>l.done?n(l.value):Promise.resolve(l.value).then(a,s);o((r=r.apply(e,t)).next())});function C8(...e){let t=new String(e);return Ou.set(t,e),t}function Tu(e){return e instanceof String&&Ou.has(e)}function G2(e){return Ou.get(e)||[]}var Ou,Pl=V({"src/lib/args/pathspec.ts"(){"use strict";Ou=new WeakMap}}),wr,Ai=V({"src/lib/errors/git-error.ts"(){"use strict";wr=class extends Error{constructor(e,t){super(t),this.task=e,Object.setPrototypeOf(this,new.target.prototype)}}}}),Rl,Is=V({"src/lib/errors/git-response-error.ts"(){"use strict";Ai(),Rl=class extends wr{constructor(e,t){super(void 0,t||String(e)),this.git=e}}}}),_b,xb=V({"src/lib/errors/task-configuration-error.ts"(){"use strict";Ai(),_b=class extends wr{constructor(e){super(void 0,e)}}}});function Sb(e){return typeof e=="function"?e:ya}function Eb(e){return typeof e=="function"&&e!==ya}function Ab(e,t){let r=e.indexOf(t);return r<=0?[e,""]:[e.substr(0,r),e.substr(r+1)]}function kb(e,t=0){return Tb(e)&&e.length>t?e[t]:void 0}function va(e,t=0){if(Tb(e)&&e.length>t)return e[e.length-1-t]}function Tb(e){return!!(e&&typeof e.length=="number")}function Ml(e="",t=!0,r=` +`){return e.split(r).reduce((n,i)=>{let a=t?i.trim():i;return a&&n.push(a),n},[])}function Jp(e,t){return Ml(e,!0).map(r=>t(r))}function Qp(e){return(0,Iu.exists)(e,Iu.FOLDER)}function Te(e,t){return Array.isArray(e)?e.includes(t)||e.push(t):e.add(t),t}function Cb(e,t){return Array.isArray(e)&&!e.includes(t)&&e.push(t),e}function Fu(e,t){if(Array.isArray(e)){let r=e.indexOf(t);r>=0&&e.splice(r,1)}else e.delete(t);return t}function Sn(e){return Array.isArray(e)?e:[e]}function Pb(e){return e.replace(/[\s-]+(.)/g,(t,r)=>r.toUpperCase())}function Rb(e){return Sn(e).map(String)}function Fe(e,t=0){if(e==null)return t;let r=parseInt(e,10);return isNaN(r)?t:r}function kl(e,t){let r=[];for(let n=0,i=e.length;nr in e?{[r]:e[r]}:{}))}function Np(e=0){return new Promise(t=>setTimeout(t,e))}function Bp(e){if(e!==!1)return e}var Os,ya,Ol,$u=V({"src/lib/utils/util.ts"(){"use strict";Os="\0",ya=()=>{},Ol=Object.prototype.toString.call.bind(Object.prototype.toString)}});function En(e,t,r){return t(e)?e:arguments.length>2?r:void 0}function em(e,t){let r=Tu(e)?"string":typeof e;return/number|string|boolean/.test(r)&&(!t||!t.includes(r))}function tm(e){return!!e&&Ol(e)==="[object Object]"}function Ob(e){return typeof e=="function"}var Il,Mt,Ib,Cu,rm,Fb=V({"src/lib/utils/argument-filters.ts"(){"use strict";$u(),Pl(),Il=e=>Array.isArray(e),Mt=e=>typeof e=="string",Ib=e=>Array.isArray(e)&&e.every(Mt),Cu=e=>Mt(e)||Array.isArray(e)&&e.every(Mt),rm=e=>e==null||"number|boolean|function".includes(typeof e)?!1:Array.isArray(e)||typeof e=="string"||typeof e.length=="number"}}),jp,P8=V({"src/lib/utils/exit-codes.ts"(){"use strict";jp=(e=>(e[e.SUCCESS=0]="SUCCESS",e[e.ERROR=1]="ERROR",e[e.NOT_FOUND=-2]="NOT_FOUND",e[e.UNCLEAN=128]="UNCLEAN",e))(jp||{})}}),Cl,R8=V({"src/lib/utils/git-output-streams.ts"(){"use strict";Cl=class{constructor(e,t){this.stdOut=e,this.stdErr=t}asStrings(){return new Cl(this.stdOut.toString("utf8"),this.stdErr.toString("utf8"))}}}}),ce,Ei,M8=V({"src/lib/utils/line-parser.ts"(){"use strict";ce=class{constructor(e,t){this.matches=[],this.parse=(r,n)=>(this.resetMatches(),this._regExp.every((i,a)=>this.addMatch(i,a,r(a)))?this.useMatches(n,this.prepareMatches())!==!1:!1),this._regExp=Array.isArray(e)?e:[e],t&&(this.useMatches=t)}useMatches(e,t){throw new Error("LineParser:useMatches not implemented")}resetMatches(){this.matches.length=0}prepareMatches(){return this.matches}addMatch(e,t,r){let n=r&&e.exec(r);return n&&this.pushMatch(t,n),!!n}pushMatch(e,t){this.matches.push(...t.slice(1))}},Ei=class extends ce{addMatch(e,t,r){return/^remote:\s/.test(String(r))&&super.addMatch(e,t,r)}pushMatch(e,t){(e>0||t.length>1)&&super.pushMatch(e,t)}}}});function $b(...e){let t=process.cwd(),r=Object.assign($r({baseDir:t},Lb),...e.filter(n=>typeof n=="object"&&n));return r.baseDir=r.baseDir||t,r.trimmed=r.trimmed===!0,r}var Lb,O8=V({"src/lib/utils/simple-git-options.ts"(){"use strict";Lb={binary:"git",maxConcurrentProcesses:5,config:[],trimmed:!1}}});function nm(e,t=[]){return tm(e)?Object.keys(e).reduce((r,n)=>{let i=e[n];return Tu(i)?r.push(i):em(i,["boolean"])?r.push(n+"="+i):r.push(n),r},t):t}function nr(e,t=0,r=!1){let n=[];for(let i=0,a=t<0?e.length:t;i{for(let a=Ml(i,n),s=0,o=a.length;s{if(!(s+c>=o))return a[s+c]};t.some(({parse:c})=>c(l,e))}}),e}var $8=V({"src/lib/utils/task-parser.ts"(){"use strict";$u()}}),Db={};at(Db,{ExitCodes:()=>jp,GitOutputStreams:()=>Cl,LineParser:()=>ce,NOOP:()=>ya,NULL:()=>Os,RemoteLineParser:()=>Ei,append:()=>Te,appendTaskOptions:()=>nm,asArray:()=>Sn,asCamelCase:()=>Pb,asFunction:()=>Sb,asNumber:()=>Fe,asStringArray:()=>Rb,bufferToString:()=>Tl,callTaskParser:()=>Hp,createInstanceConfig:()=>$b,delay:()=>Np,filterArray:()=>Il,filterFunction:()=>Ob,filterHasLength:()=>rm,filterPlainObject:()=>tm,filterPrimitives:()=>em,filterString:()=>Mt,filterStringArray:()=>Ib,filterStringOrStringArray:()=>Cu,filterType:()=>En,first:()=>kb,folderExists:()=>Qp,forEachLineWithContent:()=>Jp,getTrailingOptions:()=>nr,including:()=>Cb,isUserFunction:()=>Eb,last:()=>va,objectToString:()=>Ol,orVoid:()=>Bp,parseStringResponse:()=>ar,pick:()=>Mb,prefixedArray:()=>kl,remove:()=>Fu,splitOn:()=>Ab,toLinesWithContent:()=>Ml,trailingFunctionArgument:()=>et,trailingOptionsArgument:()=>im});var oe=V({"src/lib/utils/index.ts"(){"use strict";Fb(),P8(),R8(),M8(),O8(),F8(),$8(),$u()}}),Nb={};at(Nb,{CheckRepoActions:()=>Up,checkIsBareRepoTask:()=>jb,checkIsRepoRootTask:()=>Bb,checkIsRepoTask:()=>L8});function L8(e){switch(e){case"bare":return jb();case"root":return Bb()}return{commands:["rev-parse","--is-inside-work-tree"],format:"utf-8",onError:Lu,parser:am}}function Bb(){return{commands:["rev-parse","--git-dir"],format:"utf-8",onError:Lu,parser(t){return/^\.(git)?$/.test(t.trim())}}}function jb(){return{commands:["rev-parse","--is-bare-repository"],format:"utf-8",onError:Lu,parser:am}}function D8(e){return/(Not a git repository|Kein Git-Repository)/i.test(String(e))}var Up,Lu,am,Hb=V({"src/lib/tasks/check-is-repo.ts"(){"use strict";oe(),Up=(e=>(e.BARE="bare",e.IN_TREE="tree",e.IS_REPO_ROOT="root",e))(Up||{}),Lu=({exitCode:e},t,r,n)=>{if(e===128&&D8(t))return r(Buffer.from("false"));n(t)},am=e=>e.trim()==="true"}});function N8(e,t){let r=new Ub(e),n=e?zb:Gb;return Ml(t).forEach(i=>{let a=i.replace(n,"");r.paths.push(a),(Vb.test(a)?r.folders:r.files).push(a)}),r}var Ub,Gb,zb,Vb,B8=V({"src/lib/responses/CleanSummary.ts"(){"use strict";oe(),Ub=class{constructor(e){this.dryRun=e,this.paths=[],this.files=[],this.folders=[]}},Gb=/^[a-z]+\s*/i,zb=/^[a-z]+\s+[a-z]+\s*/i,Vb=/\/$/}}),Gp={};at(Gp,{EMPTY_COMMANDS:()=>Du,adhocExecTask:()=>Wb,configurationErrorTask:()=>ir,isBufferTask:()=>Yb,isEmptyTask:()=>Xb,straightThroughBufferTask:()=>qb,straightThroughStringTask:()=>Wt});function Wb(e){return{commands:Du,format:"empty",parser:e}}function ir(e){return{commands:Du,format:"empty",parser(){throw typeof e=="string"?new _b(e):e}}}function Wt(e,t=!1){return{commands:e,format:"utf-8",parser(r){return t?String(r).trim():r}}}function qb(e){return{commands:e,format:"buffer",parser(t){return t}}}function Yb(e){return e.format==="buffer"}function Xb(e){return e.format==="empty"||!e.commands.length}var Du,it=V({"src/lib/tasks/task.ts"(){"use strict";xb(),Du=[]}}),Zb={};at(Zb,{CONFIG_ERROR_INTERACTIVE_MODE:()=>sm,CONFIG_ERROR_MODE_REQUIRED:()=>om,CONFIG_ERROR_UNKNOWN_OPTION:()=>lm,CleanOptions:()=>Su,cleanTask:()=>Kb,cleanWithOptionsTask:()=>j8,isCleanOptionsArray:()=>H8});function j8(e,t){let{cleanMode:r,options:n,valid:i}=U8(e);return r?i.options?(n.push(...t),n.some(V8)?ir(sm):Kb(r,n)):ir(lm+JSON.stringify(e)):ir(om)}function Kb(e,t){return{commands:["clean",`-${e}`,...t],format:"utf-8",parser(n){return N8(e==="n",n)}}}function H8(e){return Array.isArray(e)&&e.every(t=>cm.has(t))}function U8(e){let t,r=[],n={cleanMode:!1,options:!0};return e.replace(/[^a-z]i/g,"").split("").forEach(i=>{G8(i)?(t=i,n.cleanMode=!0):n.options=n.options&&z8(r[r.length]=`-${i}`)}),{cleanMode:t,options:r,valid:n}}function G8(e){return e==="f"||e==="n"}function z8(e){return/^-[a-z]$/i.test(e)&&cm.has(e.charAt(1))}function V8(e){return/^-[^\-]/.test(e)?e.indexOf("i")>0:e==="--interactive"}var sm,om,lm,Su,cm,Jb=V({"src/lib/tasks/clean.ts"(){"use strict";B8(),oe(),it(),sm="Git clean interactive mode is not supported",om='Git clean mode parameter ("n" or "f") is required',lm="Git clean unknown option found in: ",Su=(e=>(e.DRY_RUN="n",e.FORCE="f",e.IGNORED_INCLUDED="x",e.IGNORED_ONLY="X",e.EXCLUDING="e",e.QUIET="q",e.RECURSIVE="d",e))(Su||{}),cm=new Set(["i",...Rb(Object.values(Su))])}});function W8(e){let t=new e_;for(let r of Qb(e))t.addValue(r.file,String(r.key),r.value);return t}function q8(e,t){let r=null,n=[],i=new Map;for(let a of Qb(e,t))a.key===t&&(n.push(r=a.value),i.has(a.file)||i.set(a.file,[]),i.get(a.file).push(r));return{key:t,paths:Array.from(i.keys()),scopes:i,value:r,values:n}}function Y8(e){return e.replace(/^(file):/,"")}function*Qb(e,t=null){let r=e.split("\0");for(let n=0,i=r.length-1;nObject.assign(e,this.values[t]),{})),this._all}addFile(e){if(!(e in this.values)){let t=va(this.files);this.values[e]=t?Object.create(this.values[t]):{},this.files.push(e)}return this.values[e]}addValue(e,t,r){let n=this.addFile(e);n.hasOwnProperty(t)?Array.isArray(n[t])?n[t].push(r):n[t]=[n[t],r]:n[t]=r,this._all=void 0}}}});function Op(e,t){return typeof e=="string"&&zp.hasOwnProperty(e)?e:t}function Z8(e,t,r,n){let i=["config",`--${n}`];return r&&i.push("--add"),i.push(e,t),{commands:i,format:"utf-8",parser(a){return a}}}function K8(e,t){let r=["config","--null","--show-origin","--get-all",e];return t&&r.splice(1,0,`--${t}`),{commands:r,format:"utf-8",parser(n){return q8(n,e)}}}function J8(e){let t=["config","--list","--show-origin","--null"];return e&&t.push(`--${e}`),{commands:t,format:"utf-8",parser(r){return W8(r)}}}function Q8(){return{addConfig(e,t,...r){return this._runTask(Z8(e,t,r[0]===!0,Op(r[1],"local")),et(arguments))},getConfig(e,t){return this._runTask(K8(e,Op(t,void 0)),et(arguments))},listConfig(...e){return this._runTask(J8(Op(e[0],void 0)),et(arguments))}}}var zp,t_=V({"src/lib/tasks/config.ts"(){"use strict";X8(),oe(),zp=(e=>(e.system="system",e.global="global",e.local="local",e.worktree="worktree",e))(zp||{})}});function eF(e){return r_.has(e)}var Ip,r_,n_=V({"src/lib/tasks/diff-name-status.ts"(){"use strict";Ip=(e=>(e.ADDED="A",e.COPIED="C",e.DELETED="D",e.MODIFIED="M",e.RENAMED="R",e.CHANGED="T",e.UNMERGED="U",e.UNKNOWN="X",e.BROKEN="B",e))(Ip||{}),r_=new Set(Object.values(Ip))}});function tF(...e){return new a_().param(...e)}function rF(e){let t=new Set,r={};return Jp(e,n=>{let[i,a,s]=n.split(Os);t.add(i),(r[i]=r[i]||[]).push({line:Fe(a),path:i,preview:s})}),{paths:t,results:r}}function nF(){return{grep(e){let t=et(arguments),r=nr(arguments);for(let i of i_)if(r.includes(i))return this._runTask(ir(`git.grep: use of "${i}" is not supported.`),t);typeof e=="string"&&(e=tF().param(e));let n=["grep","--null","-n","--full-name",...r,...e];return this._runTask({commands:n,format:"utf-8",parser(i){return rF(i)}},t)}}}var i_,Sl,z2,a_,s_=V({"src/lib/tasks/grep.ts"(){"use strict";oe(),it(),i_=["-h"],Sl=Symbol("grepQuery"),a_=class{constructor(){this[z2]=[]}*[(z2=Sl,Symbol.iterator)](){for(let e of this[Sl])yield e}and(...e){return e.length&&this[Sl].push("--and","(",...kl(e,"-e"),")"),this}param(...e){return this[Sl].push(...kl(e,"-e")),this}}}}),o_={};at(o_,{ResetMode:()=>Eu,getResetMode:()=>aF,resetTask:()=>iF});function iF(e,t){let r=["reset"];return l_(e)&&r.push(`--${e}`),r.push(...t),Wt(r)}function aF(e){if(l_(e))return e;switch(typeof e){case"string":case"undefined":return"soft"}}function l_(e){return c_.includes(e)}var Eu,c_,u_=V({"src/lib/tasks/reset.ts"(){"use strict";it(),Eu=(e=>(e.MIXED="mixed",e.SOFT="soft",e.HARD="hard",e.MERGE="merge",e.KEEP="keep",e))(Eu||{}),c_=Array.from(Object.values(Eu))}});function sF(){return(0,Pu.default)("simple-git")}function V2(e,t,r){return!t||!String(t).replace(/\s*/,"")?r?(n,...i)=>{e(n,...i),r(n,...i)}:e:(n,...i)=>{e(`%s ${n}`,t,...i),r&&r(n,...i)}}function oF(e,t,{namespace:r}){if(typeof e=="string")return e;let n=t&&t.namespace||"";return n.startsWith(r)?n.substr(r.length+1):n||r}function um(e,t,r,n=sF()){let i=e&&`[${e}]`||"",a=[],s=typeof t=="string"?n.extend(t):t,o=oF(En(t,Mt),s,n);return c(r);function l(u,f){return Te(a,um(e,o.replace(/^[^:]+/,u),f,n))}function c(u){let f=u&&`[${u}]`||"",d=s&&V2(s,f)||ya,h=V2(n,`${i} ${f}`,d);return Object.assign(s?d:h,{label:e,sibling:l,info:h,step:c})}}var f_=V({"src/lib/git-logger.ts"(){"use strict";oe(),Pu.default.formatters.L=e=>String(rm(e)?e.length:"-"),Pu.default.formatters.B=e=>Buffer.isBuffer(e)?e.toString("utf8"):Ol(e)}}),_u,Vp,lF=V({"src/lib/runners/tasks-pending-queue.ts"(){"use strict";Ai(),f_(),_u=class{constructor(e="GitExecutor"){this.logLabel=e,this._queue=new Map}withProgress(e){return this._queue.get(e)}createProgress(e){let t=_u.getName(e.commands[0]),r=um(this.logLabel,t);return{task:e,logger:r,name:t}}push(e){let t=this.createProgress(e);return t.logger("Adding task to the queue, commands = %o",e.commands),this._queue.set(e,t),t}fatal(e){for(let[t,{logger:r}]of Array.from(this._queue.entries()))t===e.task?(r.info("Failed %o",e),r("Fatal exception, any as-yet un-started tasks run through this executor will not be attempted")):r.info("A fatal exception occurred in a previous task, the queue has been purged: %o",e.message),this.complete(t);if(this._queue.size!==0)throw new Error(`Queue size should be zero after fatal: ${this._queue.size}`)}complete(e){this.withProgress(e)&&this._queue.delete(e)}attempt(e){let t=this.withProgress(e);if(!t)throw new wr(void 0,"TasksPendingQueue: attempt called for an unknown task");return t.logger("Starting task"),t}static getName(e="empty"){return`task:${e}:${++_u.counter}`}},Vp=_u,Vp.counter=0}});function ga(e,t){return{method:kb(e.commands)||"",commands:t}}function cF(e,t){return r=>{t("[ERROR] child process exception %o",r),e.push(Buffer.from(String(r.stack),"ascii"))}}function W2(e,t,r,n){return i=>{r("%s received %L bytes",t,i),n("%B",i),e.push(i)}}var Wp,uF=V({"src/lib/runners/git-executor-chain.ts"(){"use strict";Ai(),it(),oe(),lF(),Wp=class{constructor(e,t,r){this._executor=e,this._scheduler=t,this._plugins=r,this._chain=Promise.resolve(),this._queue=new Vp}get cwd(){return this._cwd||this._executor.cwd}set cwd(e){this._cwd=e}get env(){return this._executor.env}get outputHandler(){return this._executor.outputHandler}chain(){return this}push(e){return this._queue.push(e),this._chain=this._chain.then(()=>this.attemptTask(e))}attemptTask(e){return El(this,null,function*(){let t=yield this._scheduler.next(),r=()=>this._queue.complete(e);try{let{logger:n}=this._queue.attempt(e);return yield Xb(e)?this.attemptEmptyTask(e,n):this.attemptRemoteTask(e,n)}catch(n){throw this.onFatalException(e,n)}finally{r(),t()}})}onFatalException(e,t){let r=t instanceof wr?Object.assign(t,{task:e}):new wr(e,t&&String(t));return this._chain=Promise.resolve(),this._queue.fatal(r),r}attemptRemoteTask(e,t){return El(this,null,function*(){let r=this._plugins.exec("spawn.binary","",ga(e,e.commands)),n=this._plugins.exec("spawn.args",[...e.commands],ga(e,e.commands)),i=yield this.gitResponse(e,r,n,this.outputHandler,t.step("SPAWN")),a=yield this.handleTaskData(e,n,i,t.step("HANDLE"));return t("passing response to task's parser as a %s",e.format),Yb(e)?Hp(e.parser,a):Hp(e.parser,a.asStrings())})}attemptEmptyTask(e,t){return El(this,null,function*(){return t("empty task bypassing child process to call to task's parser"),e.parser(this)})}handleTaskData(e,t,r,n){let{exitCode:i,rejection:a,stdOut:s,stdErr:o}=r;return new Promise((l,c)=>{n("Preparing to handle process response exitCode=%d stdOut=",i);let{error:u}=this._plugins.exec("task.error",{error:a},$r($r({},ga(e,t)),r));if(u&&e.onError)return n.info("exitCode=%s handling with custom error handler"),e.onError(r,u,f=>{n.info("custom error handler treated as success"),n("custom error returned a %s",Ol(f)),l(new Cl(Array.isArray(f)?Buffer.concat(f):f,Buffer.concat(o)))},c);if(u)return n.info("handling as error: exitCode=%s stdErr=%s rejection=%o",i,o.length,a),c(u);n.info("retrieving task output complete"),l(new Cl(Buffer.concat(s),Buffer.concat(o)))})}gitResponse(e,t,r,n,i){return El(this,null,function*(){let a=i.sibling("output"),s=this._plugins.exec("spawn.options",{cwd:this.cwd,env:this.env,windowsHide:!0},ga(e,e.commands));return new Promise(o=>{let l=[],c=[];i.info("%s %o",t,r),i("%O",s);let u=this._beforeSpawn(e,r);if(u)return o({stdOut:l,stdErr:c,exitCode:9901,rejection:u});this._plugins.exec("spawn.before",void 0,Al($r({},ga(e,r)),{kill(d){u=d||u}}));let f=(0,d_.spawn)(t,r,s);f.stdout.on("data",W2(l,"stdOut",i,a.step("stdOut"))),f.stderr.on("data",W2(c,"stdErr",i,a.step("stdErr"))),f.on("error",cF(c,i)),n&&(i("Passing child process stdOut/stdErr to custom outputHandler"),n(t,f.stdout,f.stderr,[...r])),this._plugins.exec("spawn.after",void 0,Al($r({},ga(e,r)),{spawned:f,close(d,h){o({stdOut:l,stdErr:c,exitCode:d,rejection:u||h})},kill(d){f.killed||(u=d,f.kill("SIGINT"))}}))})})}_beforeSpawn(e,t){let r;return this._plugins.exec("spawn.before",void 0,Al($r({},ga(e,t)),{kill(n){r=n||r}})),r}}}}),h_={};at(h_,{GitExecutor:()=>p_});var p_,fF=V({"src/lib/runners/git-executor.ts"(){"use strict";uF(),p_=class{constructor(e,t,r){this.cwd=e,this._scheduler=t,this._plugins=r,this._chain=new Wp(this,this._scheduler,this._plugins)}chain(){return new Wp(this,this._scheduler,this._plugins)}push(e){return this._chain.push(e)}}}});function dF(e,t,r=ya){let n=a=>{r(null,a)},i=a=>{(a==null?void 0:a.task)===e&&r(a instanceof Rl?hF(a):a,void 0)};t.then(n,i)}function hF(e){let t=n=>{console.warn(`simple-git deprecation notice: accessing GitResponseError.${n} should be GitResponseError.git.${n}, this will no longer be available in version 3`),t=ya};return Object.create(e,Object.getOwnPropertyNames(e.git).reduce(r,{}));function r(n,i){return i in e||(n[i]={enumerable:!1,configurable:!1,get(){return t(i),e.git[i]}}),n}}var pF=V({"src/lib/task-callback.ts"(){"use strict";Is(),oe()}});function q2(e,t){return Wb(r=>{if(!Qp(e))throw new Error(`Git.cwd: cannot change to non-directory "${e}"`);return(t||r).cwd=e})}var mF=V({"src/lib/tasks/change-working-directory.ts"(){"use strict";oe(),it()}});function Fp(e){let t=["checkout",...e];return t[1]==="-b"&&t.includes("-B")&&(t[1]=Fu(t,"-B")),Wt(t)}function gF(){return{checkout(){return this._runTask(Fp(nr(arguments,1)),et(arguments))},checkoutBranch(e,t){return this._runTask(Fp(["-b",e,t,...nr(arguments)]),et(arguments))},checkoutLocalBranch(e){return this._runTask(Fp(["-b",e,...nr(arguments)]),et(arguments))}}}var vF=V({"src/lib/tasks/checkout.ts"(){"use strict";oe(),it()}});function yF(){return{count:0,garbage:0,inPack:0,packs:0,prunePackable:0,size:0,sizeGarbage:0,sizePack:0}}function wF(){return{countObjects(){return this._runTask({commands:["count-objects","--verbose"],format:"utf-8",parser(e){return ar(yF(),[m_],e)}})}}}var m_,bF=V({"src/lib/tasks/count-objects.ts"(){"use strict";oe(),m_=new ce(/([a-z-]+): (\d+)$/,(e,[t,r])=>{let n=Pb(t);e.hasOwnProperty(n)&&(e[n]=Fe(r))})}});function _F(e){return ar({author:null,branch:"",commit:"",root:!1,summary:{changes:0,insertions:0,deletions:0}},g_,e)}var g_,xF=V({"src/lib/parsers/parse-commit.ts"(){"use strict";oe(),g_=[new ce(/^\[([^\s]+)( \([^)]+\))? ([^\]]+)/,(e,[t,r,n])=>{e.branch=t,e.commit=n,e.root=!!r}),new ce(/\s*Author:\s(.+)/i,(e,[t])=>{let r=t.split("<"),n=r.pop();!n||!n.includes("@")||(e.author={email:n.substr(0,n.length-1),name:r.join("<").trim()})}),new ce(/(\d+)[^,]*(?:,\s*(\d+)[^,]*)(?:,\s*(\d+))/g,(e,[t,r,n])=>{e.summary.changes=parseInt(t,10)||0,e.summary.insertions=parseInt(r,10)||0,e.summary.deletions=parseInt(n,10)||0}),new ce(/^(\d+)[^,]*(?:,\s*(\d+)[^(]+\(([+-]))?/,(e,[t,r,n])=>{e.summary.changes=parseInt(t,10)||0;let i=parseInt(r,10)||0;n==="-"?e.summary.deletions=i:n==="+"&&(e.summary.insertions=i)})]}});function SF(e,t,r){return{commands:["-c","core.abbrev=40","commit",...kl(e,"-m"),...t,...r],format:"utf-8",parser:_F}}function EF(){return{commit(t,...r){let n=et(arguments),i=e(t)||SF(Sn(t),Sn(En(r[0],Cu,[])),[...En(r[1],Il,[]),...nr(arguments,0,!0)]);return this._runTask(i,n)}};function e(t){return!Cu(t)&&ir("git.commit: requires the commit message to be supplied as a string/string[]")}}var AF=V({"src/lib/tasks/commit.ts"(){"use strict";xF(),oe(),it()}});function kF(){return{firstCommit(){return this._runTask(Wt(["rev-list","--max-parents=0","HEAD"],!0),et(arguments))}}}var TF=V({"src/lib/tasks/first-commit.ts"(){"use strict";oe(),it()}});function CF(e,t){let r=["hash-object",e];return t&&r.push("-w"),Wt(r,!0)}var PF=V({"src/lib/tasks/hash-object.ts"(){"use strict";it()}});function RF(e,t,r){let n=String(r).trim(),i;if(i=v_.exec(n))return new Au(e,t,!1,i[1]);if(i=y_.exec(n))return new Au(e,t,!0,i[1]);let a="",s=n.split(" ");for(;s.length;)if(s.shift()==="in"){a=s.join(" ");break}return new Au(e,t,/^re/i.test(n),a)}var Au,v_,y_,MF=V({"src/lib/responses/InitSummary.ts"(){"use strict";Au=class{constructor(e,t,r,n){this.bare=e,this.path=t,this.existing=r,this.gitDir=n}},v_=/^Init.+ repository in (.+)$/,y_=/^Rein.+ in (.+)$/}});function OF(e){return e.includes(fm)}function IF(e=!1,t,r){let n=["init",...r];return e&&!OF(n)&&n.splice(1,0,fm),{commands:n,format:"utf-8",parser(i){return RF(n.includes("--bare"),t,i)}}}var fm,FF=V({"src/lib/tasks/init.ts"(){"use strict";MF(),fm="--bare"}});function dm(e){for(let t=0;tar(new w_,t,r,!1)}var $p,Y2,X2,Z2,__,x_=V({"src/lib/parsers/parse-diff-summary.ts"(){"use strict";Fl(),LF(),n_(),oe(),$p=[new ce(/^(.+)\s+\|\s+(\d+)(\s+[+\-]+)?$/,(e,[t,r,n=""])=>{e.files.push({file:t.trim(),changes:Fe(r),insertions:n.replace(/[^+]/g,"").length,deletions:n.replace(/[^-]/g,"").length,binary:!1})}),new ce(/^(.+) \|\s+Bin ([0-9.]+) -> ([0-9.]+) ([a-z]+)/,(e,[t,r,n])=>{e.files.push({file:t.trim(),before:Fe(r),after:Fe(n),binary:!0})}),new ce(/(\d+) files? changed\s*((?:, \d+ [^,]+){0,2})/,(e,[t,r])=>{let n=/(\d+) i/.exec(r),i=/(\d+) d/.exec(r);e.changed=Fe(t),e.insertions=Fe(n==null?void 0:n[1]),e.deletions=Fe(i==null?void 0:i[1])})],Y2=[new ce(/(\d+)\t(\d+)\t(.+)$/,(e,[t,r,n])=>{let i=Fe(t),a=Fe(r);e.changed++,e.insertions+=i,e.deletions+=a,e.files.push({file:n,changes:i+a,insertions:i,deletions:a,binary:!1})}),new ce(/-\t-\t(.+)$/,(e,[t])=>{e.changed++,e.files.push({file:t,after:0,before:0,binary:!0})})],X2=[new ce(/(.+)$/,(e,[t])=>{e.changed++,e.files.push({file:t,changes:0,insertions:0,deletions:0,binary:!1})})],Z2=[new ce(/([ACDMRTUXB])([0-9]{0,3})\t(.[^\t]*)(\t(.[^\t]*))?$/,(e,[t,r,n,i,a])=>{e.changed++,e.files.push({file:a!=null?a:n,changes:0,insertions:0,deletions:0,binary:!1,status:Bp(eF(t)&&t),from:Bp(!!a&&n!==a&&n),similarity:Fe(r)})})],__={"":$p,"--stat":$p,"--numstat":Y2,"--name-status":Z2,"--name-only":X2}}});function DF(e,t){return t.reduce((r,n,i)=>(r[n]=e[i]||"",r),Object.create({diff:null}))}function S_(e=gm,t=E_,r=""){let n=b_(r);return function(i){let a=Ml(i.trim(),!1,pm).map(function(s){let o=s.split(mm),l=DF(o[0].split(e),t);return o.length>1&&o[1].trim()&&(l.diff=n(o[1])),l});return{all:a,latest:a.length&&a[0]||null,total:a.length}}}var pm,mm,gm,E_,A_=V({"src/lib/parsers/parse-list-log-summary.ts"(){"use strict";oe(),x_(),Fl(),pm="\xF2\xF2\xF2\xF2\xF2\xF2 ",mm=" \xF2\xF2",gm=" \xF2 ",E_=["hash","date","message","refs","author_name","author_email"]}}),k_={};at(k_,{diffSummaryTask:()=>NF,validateLogFormatConfig:()=>Nu});function NF(e){let t=dm(e),r=["diff"];return t===""&&(t="--stat",r.push("--stat=4096")),r.push(...e),Nu(r)||{commands:r,format:"utf-8",parser:b_(t)}}function Nu(e){let t=e.filter($F);if(t.length>1)return ir(`Summary flags are mutually exclusive - pick one of ${t.join(",")}`);if(t.length&&e.includes("-z"))return ir(`Summary flag ${t} parsing is not compatible with null termination option '-z'`)}var vm=V({"src/lib/tasks/diff.ts"(){"use strict";Fl(),x_(),it()}});function BF(e,t){let r=[],n=[];return Object.keys(e).forEach(i=>{r.push(i),n.push(String(e[i]))}),[r,n.join(t)]}function jF(e){return Object.keys(e).reduce((t,r)=>(r in qp||(t[r]=e[r]),t),{})}function T_(e={},t=[]){let r=En(e.splitter,Mt,gm),n=!em(e.format)&&e.format?e.format:{hash:"%H",date:e.strictDate===!1?"%ai":"%aI",message:"%s",refs:"%D",body:e.multiLine?"%B":"%b",author_name:e.mailMap!==!1?"%aN":"%an",author_email:e.mailMap!==!1?"%aE":"%ae"},[i,a]=BF(n,r),s=[],o=[`--pretty=format:${pm}${a}${mm}`,...t],l=e.n||e["max-count"]||e.maxCount;if(l&&o.push(`--max-count=${l}`),e.from||e.to){let c=e.symmetric!==!1?"...":"..";s.push(`${e.from||""}${c}${e.to||""}`)}return Mt(e.file)&&o.push("--follow",C8(e.file)),nm(jF(e),o),{fields:i,splitter:r,commands:[...o,...s]}}function HF(e,t,r){let n=S_(e,t,dm(r));return{commands:["log",...r],format:"utf-8",parser:n}}function UF(){return{log(...r){let n=et(arguments),i=T_(im(arguments),En(arguments[0],Il)),a=t(...r)||Nu(i.commands)||e(i);return this._runTask(a,n)}};function e(r){return HF(r.splitter,r.fields,r.commands)}function t(r,n){return Mt(r)&&Mt(n)&&ir("git.log(string, string) should be replaced with git.log({ from: string, to: string })")}}var qp,C_=V({"src/lib/tasks/log.ts"(){"use strict";Fl(),Pl(),A_(),oe(),it(),vm(),qp=(e=>(e[e["--pretty"]=0]="--pretty",e[e["max-count"]=1]="max-count",e[e.maxCount=2]="maxCount",e[e.n=3]="n",e[e.file=4]="file",e[e.format=5]="format",e[e.from=6]="from",e[e.to=7]="to",e[e.splitter=8]="splitter",e[e.symmetric=9]="symmetric",e[e.mailMap=10]="mailMap",e[e.multiLine=11]="multiLine",e[e.strictDate=12]="strictDate",e))(qp||{})}}),ku,P_,GF=V({"src/lib/responses/MergeSummary.ts"(){"use strict";ku=class{constructor(e,t=null,r){this.reason=e,this.file=t,this.meta=r}toString(){return`${this.file}:${this.reason}`}},P_=class{constructor(){this.conflicts=[],this.merges=[],this.result="success"}get failed(){return this.conflicts.length>0}get reason(){return this.result}toString(){return this.conflicts.length?`CONFLICTS: ${this.conflicts.join(", ")}`:"OK"}}}}),Yp,R_,zF=V({"src/lib/responses/PullSummary.ts"(){"use strict";Yp=class{constructor(){this.remoteMessages={all:[]},this.created=[],this.deleted=[],this.files=[],this.deletions={},this.insertions={},this.summary={changes:0,deletions:0,insertions:0}}},R_=class{constructor(){this.remote="",this.hash={local:"",remote:""},this.branch={local:"",remote:""},this.message=""}toString(){return this.message}}}});function Lp(e){return e.objects=e.objects||{compressing:0,counting:0,enumerating:0,packReused:0,reused:{count:0,delta:0},total:{count:0,delta:0}}}function K2(e){let t=/^\s*(\d+)/.exec(e),r=/delta (\d+)/i.exec(e);return{count:Fe(t&&t[1]||"0"),delta:Fe(r&&r[1]||"0")}}var M_,VF=V({"src/lib/parsers/parse-remote-objects.ts"(){"use strict";oe(),M_=[new Ei(/^remote:\s*(enumerating|counting|compressing) objects: (\d+),/i,(e,[t,r])=>{let n=t.toLowerCase(),i=Lp(e.remoteMessages);Object.assign(i,{[n]:Fe(r)})}),new Ei(/^remote:\s*(enumerating|counting|compressing) objects: \d+% \(\d+\/(\d+)\),/i,(e,[t,r])=>{let n=t.toLowerCase(),i=Lp(e.remoteMessages);Object.assign(i,{[n]:Fe(r)})}),new Ei(/total ([^,]+), reused ([^,]+), pack-reused (\d+)/i,(e,[t,r,n])=>{let i=Lp(e.remoteMessages);i.total=K2(t),i.reused=K2(r),i.packReused=Fe(n)})]}});function O_(e,t){return ar({remoteMessages:new F_},I_,t)}var I_,F_,$_=V({"src/lib/parsers/parse-remote-messages.ts"(){"use strict";oe(),VF(),I_=[new Ei(/^remote:\s*(.+)$/,(e,[t])=>(e.remoteMessages.all.push(t.trim()),!1)),...M_,new Ei([/create a (?:pull|merge) request/i,/\s(https?:\/\/\S+)$/],(e,[t])=>{e.remoteMessages.pullRequestUrl=t}),new Ei([/found (\d+) vulnerabilities.+\(([^)]+)\)/i,/\s(https?:\/\/\S+)$/],(e,[t,r,n])=>{e.remoteMessages.vulnerabilities={count:Fe(t),summary:r,url:n}})],F_=class{constructor(){this.all=[]}}}});function WF(e,t){let r=ar(new R_,L_,[e,t]);return r.message&&r}var J2,Q2,eb,tb,L_,rb,ym,D_=V({"src/lib/parsers/parse-pull.ts"(){"use strict";zF(),oe(),$_(),J2=/^\s*(.+?)\s+\|\s+\d+\s*(\+*)(-*)/,Q2=/(\d+)\D+((\d+)\D+\(\+\))?(\D+(\d+)\D+\(-\))?/,eb=/^(create|delete) mode \d+ (.+)/,tb=[new ce(J2,(e,[t,r,n])=>{e.files.push(t),r&&(e.insertions[t]=r.length),n&&(e.deletions[t]=n.length)}),new ce(Q2,(e,[t,,r,,n])=>r!==void 0||n!==void 0?(e.summary.changes=+t||0,e.summary.insertions=+r||0,e.summary.deletions=+n||0,!0):!1),new ce(eb,(e,[t,r])=>{Te(e.files,r),Te(t==="create"?e.created:e.deleted,r)})],L_=[new ce(/^from\s(.+)$/i,(e,[t])=>void(e.remote=t)),new ce(/^fatal:\s(.+)$/,(e,[t])=>void(e.message=t)),new ce(/([a-z0-9]+)\.\.([a-z0-9]+)\s+(\S+)\s+->\s+(\S+)$/,(e,[t,r,n,i])=>{e.branch.local=n,e.hash.local=t,e.branch.remote=i,e.hash.remote=r})],rb=(e,t)=>ar(new Yp,tb,[e,t]),ym=(e,t)=>Object.assign(new Yp,rb(e,t),O_(e,t))}}),nb,N_,ib,qF=V({"src/lib/parsers/parse-merge.ts"(){"use strict";GF(),oe(),D_(),nb=[new ce(/^Auto-merging\s+(.+)$/,(e,[t])=>{e.merges.push(t)}),new ce(/^CONFLICT\s+\((.+)\): Merge conflict in (.+)$/,(e,[t,r])=>{e.conflicts.push(new ku(t,r))}),new ce(/^CONFLICT\s+\((.+\/delete)\): (.+) deleted in (.+) and/,(e,[t,r,n])=>{e.conflicts.push(new ku(t,r,{deleteRef:n}))}),new ce(/^CONFLICT\s+\((.+)\):/,(e,[t])=>{e.conflicts.push(new ku(t,null))}),new ce(/^Automatic merge failed;\s+(.+)$/,(e,[t])=>{e.result=t})],N_=(e,t)=>Object.assign(ib(e,t),ym(e,t)),ib=e=>ar(new P_,nb,e)}});function ab(e){return e.length?{commands:["merge",...e],format:"utf-8",parser(t,r){let n=N_(t,r);if(n.failed)throw new Rl(n);return n}}:ir("Git.merge requires at least one option")}var YF=V({"src/lib/tasks/merge.ts"(){"use strict";Is(),qF(),it()}});function XF(e,t,r){let n=r.includes("deleted"),i=r.includes("tag")||/^refs\/tags/.test(e),a=!r.includes("new");return{deleted:n,tag:i,branch:!i,new:!a,alreadyUpdated:a,local:e,remote:t}}var sb,B_,ob,ZF=V({"src/lib/parsers/parse-push.ts"(){"use strict";oe(),$_(),sb=[new ce(/^Pushing to (.+)$/,(e,[t])=>{e.repo=t}),new ce(/^updating local tracking ref '(.+)'/,(e,[t])=>{e.ref=Al($r({},e.ref||{}),{local:t})}),new ce(/^[=*-]\s+([^:]+):(\S+)\s+\[(.+)]$/,(e,[t,r,n])=>{e.pushed.push(XF(t,r,n))}),new ce(/^Branch '([^']+)' set up to track remote branch '([^']+)' from '([^']+)'/,(e,[t,r,n])=>{e.branch=Al($r({},e.branch||{}),{local:t,remote:r,remoteName:n})}),new ce(/^([^:]+):(\S+)\s+([a-z0-9]+)\.\.([a-z0-9]+)$/,(e,[t,r,n,i])=>{e.update={head:{local:t,remote:r},hash:{from:n,to:i}}})],B_=(e,t)=>{let r=ob(e,t),n=O_(e,t);return $r($r({},r),n)},ob=(e,t)=>ar({pushed:[]},sb,[e,t])}}),j_={};at(j_,{pushTagsTask:()=>KF,pushTask:()=>wm});function KF(e={},t){return Te(t,"--tags"),wm(e,t)}function wm(e={},t){let r=["push",...t];return e.branch&&r.splice(1,0,e.branch),e.remote&&r.splice(1,0,e.remote),Fu(r,"-v"),Te(r,"--verbose"),Te(r,"--porcelain"),{commands:r,format:"utf-8",parser:B_}}var H_=V({"src/lib/tasks/push.ts"(){"use strict";ZF(),oe()}});function JF(){return{showBuffer(){let e=["show",...nr(arguments,1)];return e.includes("--binary")||e.splice(1,0,"--binary"),this._runTask(qb(e),et(arguments))},show(){let e=["show",...nr(arguments,1)];return this._runTask(Wt(e),et(arguments))}}}var QF=V({"src/lib/tasks/show.ts"(){"use strict";oe(),it()}}),lb,U_,e4=V({"src/lib/responses/FileStatusSummary.ts"(){"use strict";lb=/^(.+)\0(.+)$/,U_=class{constructor(e,t,r){if(this.path=e,this.index=t,this.working_dir=r,t==="R"||r==="R"){let n=lb.exec(e)||[null,e,e];this.from=n[2]||"",this.path=n[1]||""}}}}});function cb(e){let[t,r]=e.split(Os);return{from:r||t,to:t}}function yr(e,t,r){return[`${e}${t}`,r]}function Dp(e,...t){return t.map(r=>yr(e,r,(n,i)=>Te(n.conflicted,i)))}function t4(e,t){let r=t.trim();switch(" "){case r.charAt(2):return n(r.charAt(0),r.charAt(1),r.substr(3));case r.charAt(1):return n(" ",r.charAt(0),r.substr(2));default:return}function n(i,a,s){let o=`${i}${a}`,l=G_.get(o);l&&l(e,s),o!=="##"&&o!=="!!"&&e.files.push(new U_(s,i,a))}}var ub,G_,z_,r4=V({"src/lib/responses/StatusSummary.ts"(){"use strict";oe(),e4(),ub=class{constructor(){this.not_added=[],this.conflicted=[],this.created=[],this.deleted=[],this.ignored=void 0,this.modified=[],this.renamed=[],this.files=[],this.staged=[],this.ahead=0,this.behind=0,this.current=null,this.tracking=null,this.detached=!1,this.isClean=()=>!this.files.length}},G_=new Map([yr(" ","A",(e,t)=>Te(e.created,t)),yr(" ","D",(e,t)=>Te(e.deleted,t)),yr(" ","M",(e,t)=>Te(e.modified,t)),yr("A"," ",(e,t)=>Te(e.created,t)&&Te(e.staged,t)),yr("A","M",(e,t)=>Te(e.created,t)&&Te(e.staged,t)&&Te(e.modified,t)),yr("D"," ",(e,t)=>Te(e.deleted,t)&&Te(e.staged,t)),yr("M"," ",(e,t)=>Te(e.modified,t)&&Te(e.staged,t)),yr("M","M",(e,t)=>Te(e.modified,t)&&Te(e.staged,t)),yr("R"," ",(e,t)=>{Te(e.renamed,cb(t))}),yr("R","M",(e,t)=>{let r=cb(t);Te(e.renamed,r),Te(e.modified,r.to)}),yr("!","!",(e,t)=>{Te(e.ignored=e.ignored||[],t)}),yr("?","?",(e,t)=>Te(e.not_added,t)),...Dp("A","A","U"),...Dp("D","D","U"),...Dp("U","A","D","U"),["##",(e,t)=>{let r=/ahead (\d+)/,n=/behind (\d+)/,i=/^(.+?(?=(?:\.{3}|\s|$)))/,a=/\.{3}(\S*)/,s=/\son\s([\S]+)$/,o;o=r.exec(t),e.ahead=o&&+o[1]||0,o=n.exec(t),e.behind=o&&+o[1]||0,o=i.exec(t),e.current=o&&o[1],o=a.exec(t),e.tracking=o&&o[1],o=s.exec(t),e.current=o&&o[1]||e.current,e.detached=/\(no branch\)/.test(t)}]]),z_=function(e){let t=e.split(Os),r=new ub;for(let n=0,i=t.length;n!V_.includes(r))],parser(r){return z_(r)}}}var V_,i4=V({"src/lib/tasks/status.ts"(){"use strict";r4(),V_=["--null","-z"]}});function Ru(e=0,t=0,r=0,n="",i=!0){return Object.defineProperty({major:e,minor:t,patch:r,agent:n,installed:i},"toString",{value(){return`${this.major}.${this.minor}.${this.patch}`},configurable:!1,enumerable:!1})}function a4(){return Ru(0,0,0,"",!1)}function s4(){return{version(){return this._runTask({commands:["--version"],format:"utf-8",parser:o4,onError(e,t,r,n){if(e.exitCode===-2)return r(Buffer.from(bm));n(t)}})}}}function o4(e){return e===bm?a4():ar(Ru(0,0,0,e),W_,e)}var bm,W_,l4=V({"src/lib/tasks/version.ts"(){"use strict";oe(),bm="installed=false",W_=[new ce(/version (\d+)\.(\d+)\.(\d+)(?:\s*\((.+)\))?/,(e,[t,r,n,i=""])=>{Object.assign(e,Ru(Fe(t),Fe(r),Fe(n),i))}),new ce(/version (\d+)\.(\d+)\.(\D+)(.+)?$/,(e,[t,r,n,i=""])=>{Object.assign(e,Ru(Fe(t),Fe(r),n,i))})]}}),q_={};at(q_,{SimpleGitApi:()=>Xp});var Xp,c4=V({"src/lib/simple-git-api.ts"(){"use strict";pF(),mF(),vF(),bF(),AF(),t_(),TF(),s_(),PF(),FF(),C_(),YF(),H_(),QF(),i4(),it(),l4(),oe(),Xp=class{constructor(e){this._executor=e}_runTask(e,t){let r=this._executor.chain(),n=r.push(e);return t&&dF(e,n,t),Object.create(this,{then:{value:n.then.bind(n)},catch:{value:n.catch.bind(n)},_executor:{value:r}})}add(e){return this._runTask(Wt(["add",...Sn(e)]),et(arguments))}cwd(e){let t=et(arguments);return typeof e=="string"?this._runTask(q2(e,this._executor),t):typeof(e==null?void 0:e.path)=="string"?this._runTask(q2(e.path,e.root&&this._executor||void 0),t):this._runTask(ir("Git.cwd: workingDirectory must be supplied as a string"),t)}hashObject(e,t){return this._runTask(CF(e,t===!0),et(arguments))}init(e){return this._runTask(IF(e===!0,this._executor.cwd,nr(arguments)),et(arguments))}merge(){return this._runTask(ab(nr(arguments)),et(arguments))}mergeFromTo(e,t){return Mt(e)&&Mt(t)?this._runTask(ab([e,t,...nr(arguments)]),et(arguments,!1)):this._runTask(ir("Git.mergeFromTo requires that the 'remote' and 'branch' arguments are supplied as strings"))}outputHandler(e){return this._executor.outputHandler=e,this}push(){let e=wm({remote:En(arguments[0],Mt),branch:En(arguments[1],Mt)},nr(arguments));return this._runTask(e,et(arguments))}stash(){return this._runTask(Wt(["stash",...nr(arguments)]),et(arguments))}status(){return this._runTask(n4(nr(arguments)),et(arguments))}},Object.assign(Xp.prototype,gF(),EF(),Q8(),wF(),kF(),nF(),UF(),JF(),s4())}}),Y_={};at(Y_,{Scheduler:()=>Z_});var fb,Z_,u4=V({"src/lib/runners/scheduler.ts"(){"use strict";oe(),f_(),fb=(()=>{let e=0;return()=>{e++;let{promise:t,done:r}=(0,X_.createDeferred)();return{promise:t,done:r,id:e}}})(),Z_=class{constructor(e=2){this.concurrency=e,this.logger=um("","scheduler"),this.pending=[],this.running=[],this.logger("Constructed, concurrency=%s",e)}schedule(){if(!this.pending.length||this.running.length>=this.concurrency){this.logger("Schedule attempt ignored, pending=%s running=%s concurrency=%s",this.pending.length,this.running.length,this.concurrency);return}let e=Te(this.running,this.pending.shift());this.logger("Attempting id=%s",e.id),e.done(()=>{this.logger("Completing id=",e.id),Fu(this.running,e),this.schedule()})}next(){let{promise:e,id:t}=Te(this.pending,fb());return this.logger("Scheduling id=%s",t),this.schedule(),e}}}}),K_={};at(K_,{applyPatchTask:()=>f4});function f4(e,t){return Wt(["apply",...t,...e])}var d4=V({"src/lib/tasks/apply-patch.ts"(){"use strict";it()}});function h4(e,t){return{branch:e,hash:t,success:!0}}function p4(e){return{branch:e,hash:null,success:!1}}var J_,m4=V({"src/lib/responses/BranchDeleteSummary.ts"(){"use strict";J_=class{constructor(){this.all=[],this.branches={},this.errors=[]}get success(){return!this.errors.length}}}});function Q_(e,t){return t===1&&Zp.test(e)}var db,Zp,hb,Bu,g4=V({"src/lib/parsers/parse-branch-delete.ts"(){"use strict";m4(),oe(),db=/(\S+)\s+\(\S+\s([^)]+)\)/,Zp=/^error[^']+'([^']+)'/m,hb=[new ce(db,(e,[t,r])=>{let n=h4(t,r);e.all.push(n),e.branches[t]=n}),new ce(Zp,(e,[t])=>{let r=p4(t);e.errors.push(r),e.all.push(r),e.branches[t]=r})],Bu=(e,t)=>ar(new J_,hb,[e,t])}}),ex,v4=V({"src/lib/responses/BranchSummary.ts"(){"use strict";ex=class{constructor(){this.all=[],this.branches={},this.current="",this.detached=!1}push(e,t,r,n,i){e==="*"&&(this.detached=t,this.current=r),this.all.push(r),this.branches[r]={current:e==="*",linkedWorkTree:e==="+",name:r,commit:n,label:i}}}}});function pb(e){return e?e.charAt(0):""}function tx(e){return ar(new ex,rx,e)}var rx,y4=V({"src/lib/parsers/parse-branch.ts"(){"use strict";v4(),oe(),rx=[new ce(/^([*+]\s)?\((?:HEAD )?detached (?:from|at) (\S+)\)\s+([a-z0-9]+)\s(.*)$/,(e,[t,r,n,i])=>{e.push(pb(t),!0,r,n,i)}),new ce(new RegExp("^([*+]\\s)?(\\S+)\\s+([a-z0-9]+)\\s?(.*)$","s"),(e,[t,r,n,i])=>{e.push(pb(t),!1,r,n,i)})]}}),nx={};at(nx,{branchLocalTask:()=>b4,branchTask:()=>w4,containsDeleteBranchCommand:()=>ix,deleteBranchTask:()=>x4,deleteBranchesTask:()=>_4});function ix(e){let t=["-d","-D","--delete"];return e.some(r=>t.includes(r))}function w4(e){let t=ix(e),r=["branch",...e];return r.length===1&&r.push("-a"),r.includes("-v")||r.splice(1,0,"-v"),{format:"utf-8",commands:r,parser(n,i){return t?Bu(n,i).all[0]:tx(n)}}}function b4(){return{format:"utf-8",commands:["branch","-v"],parser:tx}}function _4(e,t=!1){return{format:"utf-8",commands:["branch","-v",t?"-D":"-d",...e],parser(r,n){return Bu(r,n)},onError({exitCode:r,stdOut:n},i,a,s){if(!Q_(String(i),r))return s(i);a(n)}}}function x4(e,t=!1){let r={format:"utf-8",commands:["branch","-v",t?"-D":"-d",e],parser(n,i){return Bu(n,i).branches[e]},onError({exitCode:n,stdErr:i,stdOut:a},s,o,l){if(!Q_(String(s),n))return l(s);throw new Rl(r.parser(Tl(a),Tl(i)),String(s))}};return r}var S4=V({"src/lib/tasks/branch.ts"(){"use strict";Is(),g4(),y4(),oe()}}),ax,E4=V({"src/lib/responses/CheckIgnore.ts"(){"use strict";ax=e=>e.split(/\n/g).map(t=>t.trim()).filter(t=>!!t)}}),sx={};at(sx,{checkIgnoreTask:()=>A4});function A4(e){return{commands:["check-ignore",...e],format:"utf-8",parser:ax}}var k4=V({"src/lib/tasks/check-ignore.ts"(){"use strict";E4()}}),ox={};at(ox,{cloneMirrorTask:()=>C4,cloneTask:()=>lx});function T4(e){return/^--upload-pack(=|$)/.test(e)}function lx(e,t,r){let n=["clone",...r];return Mt(e)&&n.push(e),Mt(t)&&n.push(t),n.find(T4)?ir("git.fetch: potential exploit argument blocked."):Wt(n)}function C4(e,t,r){return Te(r,"--mirror"),lx(e,t,r)}var P4=V({"src/lib/tasks/clone.ts"(){"use strict";it(),oe()}});function R4(e,t){return ar({raw:e,remote:null,branches:[],tags:[],updated:[],deleted:[]},cx,[e,t])}var cx,M4=V({"src/lib/parsers/parse-fetch.ts"(){"use strict";oe(),cx=[new ce(/From (.+)$/,(e,[t])=>{e.remote=t}),new ce(/\* \[new branch]\s+(\S+)\s*-> (.+)$/,(e,[t,r])=>{e.branches.push({name:t,tracking:r})}),new ce(/\* \[new tag]\s+(\S+)\s*-> (.+)$/,(e,[t,r])=>{e.tags.push({name:t,tracking:r})}),new ce(/- \[deleted]\s+\S+\s*-> (.+)$/,(e,[t])=>{e.deleted.push({tracking:t})}),new ce(/\s*([^.]+)\.\.(\S+)\s+(\S+)\s*-> (.+)$/,(e,[t,r,n,i])=>{e.updated.push({name:n,tracking:i,to:r,from:t})})]}}),ux={};at(ux,{fetchTask:()=>I4});function O4(e){return/^--upload-pack(=|$)/.test(e)}function I4(e,t,r){let n=["fetch",...r];return e&&t&&n.push(e,t),n.find(O4)?ir("git.fetch: potential exploit argument blocked."):{commands:n,format:"utf-8",parser:R4}}var F4=V({"src/lib/tasks/fetch.ts"(){"use strict";M4(),it()}});function $4(e){return ar({moves:[]},fx,e)}var fx,L4=V({"src/lib/parsers/parse-move.ts"(){"use strict";oe(),fx=[new ce(/^Renaming (.+) to (.+)$/,(e,[t,r])=>{e.moves.push({from:t,to:r})})]}}),dx={};at(dx,{moveTask:()=>D4});function D4(e,t){return{commands:["mv","-v",...Sn(e),t],format:"utf-8",parser:$4}}var N4=V({"src/lib/tasks/move.ts"(){"use strict";L4(),oe()}}),hx={};at(hx,{pullTask:()=>B4});function B4(e,t,r){let n=["pull",...r];return e&&t&&n.splice(1,0,e,t),{commands:n,format:"utf-8",parser(i,a){return ym(i,a)},onError(i,a,s,o){let l=WF(Tl(i.stdOut),Tl(i.stdErr));if(l)return o(new Rl(l));o(a)}}}var j4=V({"src/lib/tasks/pull.ts"(){"use strict";Is(),D_(),oe()}});function H4(e){let t={};return px(e,([r])=>t[r]={name:r}),Object.values(t)}function U4(e){let t={};return px(e,([r,n,i])=>{t.hasOwnProperty(r)||(t[r]={name:r,refs:{fetch:"",push:""}}),i&&n&&(t[r].refs[i.replace(/[^a-z]/g,"")]=n)}),Object.values(t)}function px(e,t){Jp(e,r=>t(r.split(/\s+/)))}var G4=V({"src/lib/responses/GetRemoteSummary.ts"(){"use strict";oe()}}),mx={};at(mx,{addRemoteTask:()=>z4,getRemotesTask:()=>V4,listRemotesTask:()=>W4,remoteTask:()=>q4,removeRemoteTask:()=>Y4});function z4(e,t,r){return Wt(["remote","add",...r,e,t])}function V4(e){let t=["remote"];return e&&t.push("-v"),{commands:t,format:"utf-8",parser:e?U4:H4}}function W4(e){let t=[...e];return t[0]!=="ls-remote"&&t.unshift("ls-remote"),Wt(t)}function q4(e){let t=[...e];return t[0]!=="remote"&&t.unshift("remote"),Wt(t)}function Y4(e){return Wt(["remote","remove",e])}var X4=V({"src/lib/tasks/remote.ts"(){"use strict";G4(),it()}}),gx={};at(gx,{stashListTask:()=>Z4});function Z4(e={},t){let r=T_(e),n=["stash","list",...r.commands,...t],i=S_(r.splitter,r.fields,dm(n));return Nu(n)||{commands:n,format:"utf-8",parser:i}}var K4=V({"src/lib/tasks/stash-list.ts"(){"use strict";Fl(),A_(),vm(),C_()}}),vx={};at(vx,{addSubModuleTask:()=>J4,initSubModuleTask:()=>Q4,subModuleTask:()=>ju,updateSubModuleTask:()=>e$});function J4(e,t){return ju(["add",e,t])}function Q4(e){return ju(["init",...e])}function ju(e){let t=[...e];return t[0]!=="submodule"&&t.unshift("submodule"),Wt(t)}function e$(e){return ju(["update",...e])}var t$=V({"src/lib/tasks/sub-module.ts"(){"use strict";it()}});function r$(e,t){let r=isNaN(e),n=isNaN(t);return r!==n?r?1:-1:r?yx(e,t):0}function yx(e,t){return e===t?0:e>t?1:-1}function n$(e){return e.trim()}function xu(e){return typeof e=="string"&&parseInt(e.replace(/^\D+/g,""),10)||0}var mb,wx,i$=V({"src/lib/responses/TagList.ts"(){"use strict";mb=class{constructor(e,t){this.all=e,this.latest=t}},wx=function(e,t=!1){let r=e.split(` +`).map(n$).filter(Boolean);t||r.sort(function(i,a){let s=i.split("."),o=a.split(".");if(s.length===1||o.length===1)return r$(xu(s[0]),xu(o[0]));for(let l=0,c=Math.max(s.length,o.length);li.indexOf(".")>=0);return new mb(r,n)}}}),bx={};at(bx,{addAnnotatedTagTask:()=>o$,addTagTask:()=>s$,tagListTask:()=>a$});function a$(e=[]){let t=e.some(r=>/^--sort=/.test(r));return{format:"utf-8",commands:["tag","-l",...e],parser(r){return wx(r,t)}}}function s$(e){return{format:"utf-8",commands:["tag",e],parser(){return{name:e}}}}function o$(e,t){return{format:"utf-8",commands:["tag","-a","-m",t,e],parser(){return{name:e}}}}var l$=V({"src/lib/tasks/tag.ts"(){"use strict";i$()}}),c$=k8({"src/git.js"(e,t){"use strict";var{GitExecutor:r}=(fF(),Qe(h_)),{SimpleGitApi:n}=(c4(),Qe(q_)),{Scheduler:i}=(u4(),Qe(Y_)),{configurationErrorTask:a}=(it(),Qe(Gp)),{asArray:s,filterArray:o,filterPrimitives:l,filterString:c,filterStringOrStringArray:u,filterType:f,getTrailingOptions:d,trailingFunctionArgument:h,trailingOptionsArgument:p}=(oe(),Qe(Db)),{applyPatchTask:m}=(d4(),Qe(K_)),{branchTask:v,branchLocalTask:y,deleteBranchesTask:b,deleteBranchTask:x}=(S4(),Qe(nx)),{checkIgnoreTask:E}=(k4(),Qe(sx)),{checkIsRepoTask:_}=(Hb(),Qe(Nb)),{cloneTask:k,cloneMirrorTask:w}=(P4(),Qe(ox)),{cleanWithOptionsTask:A,isCleanOptionsArray:S}=(Jb(),Qe(Zb)),{diffSummaryTask:T}=(vm(),Qe(k_)),{fetchTask:P}=(F4(),Qe(ux)),{moveTask:I}=(N4(),Qe(dx)),{pullTask:N}=(j4(),Qe(hx)),{pushTagsTask:L}=(H_(),Qe(j_)),{addRemoteTask:ee,getRemotesTask:fe,listRemotesTask:J,remoteTask:Q,removeRemoteTask:Pe}=(X4(),Qe(mx)),{getResetMode:ge,resetTask:z}=(u_(),Qe(o_)),{stashListTask:Y}=(K4(),Qe(gx)),{addSubModuleTask:O,initSubModuleTask:he,subModuleTask:Ge,updateSubModuleTask:gt}=(t$(),Qe(vx)),{addAnnotatedTagTask:Re,addTagTask:ct,tagListTask:rt}=(l$(),Qe(bx)),{straightThroughBufferTask:Et,straightThroughStringTask:Ie}=(it(),Qe(Gp));function H(D,q){this._plugins=q,this._executor=new r(D.baseDir,new i(D.maxConcurrentProcesses),q),this._trimmed=D.trimmed}(H.prototype=Object.create(n.prototype)).constructor=H,H.prototype.customBinary=function(D){return this._plugins.reconfigure("binary",D),this},H.prototype.env=function(D,q){return arguments.length===1&&typeof D=="object"?this._executor.env=D:(this._executor.env=this._executor.env||{})[D]=q,this},H.prototype.stashList=function(D){return this._runTask(Y(p(arguments)||{},o(D)&&D||[]),h(arguments))};function Je(D,q,ve,Ne){return typeof ve!="string"?a(`git.${D}() requires a string 'repoPath'`):q(ve,f(Ne,c),d(arguments))}H.prototype.clone=function(){return this._runTask(Je("clone",k,...arguments),h(arguments))},H.prototype.mirror=function(){return this._runTask(Je("mirror",w,...arguments),h(arguments))},H.prototype.mv=function(D,q){return this._runTask(I(D,q),h(arguments))},H.prototype.checkoutLatestTag=function(D){var q=this;return this.pull(function(){q.tags(function(ve,Ne){q.checkout(Ne.latest,D)})})},H.prototype.pull=function(D,q,ve,Ne){return this._runTask(N(f(D,c),f(q,c),d(arguments)),h(arguments))},H.prototype.fetch=function(D,q){return this._runTask(P(f(D,c),f(q,c),d(arguments)),h(arguments))},H.prototype.silent=function(D){return console.warn("simple-git deprecation notice: git.silent: logging should be configured using the `debug` library / `DEBUG` environment variable, this will be an error in version 3"),this},H.prototype.tags=function(D,q){return this._runTask(rt(d(arguments)),h(arguments))},H.prototype.rebase=function(){return this._runTask(Ie(["rebase",...d(arguments)]),h(arguments))},H.prototype.reset=function(D){return this._runTask(z(ge(D),d(arguments)),h(arguments))},H.prototype.revert=function(D){let q=h(arguments);return typeof D!="string"?this._runTask(a("Commit must be a string"),q):this._runTask(Ie(["revert",...d(arguments,0,!0),D]),q)},H.prototype.addTag=function(D){let q=typeof D=="string"?ct(D):a("Git.addTag requires a tag name");return this._runTask(q,h(arguments))},H.prototype.addAnnotatedTag=function(D,q){return this._runTask(Re(D,q),h(arguments))},H.prototype.deleteLocalBranch=function(D,q,ve){return this._runTask(x(D,typeof q=="boolean"?q:!1),h(arguments))},H.prototype.deleteLocalBranches=function(D,q,ve){return this._runTask(b(D,typeof q=="boolean"?q:!1),h(arguments))},H.prototype.branch=function(D,q){return this._runTask(v(d(arguments)),h(arguments))},H.prototype.branchLocal=function(D){return this._runTask(y(),h(arguments))},H.prototype.raw=function(D){let q=!Array.isArray(D),ve=[].slice.call(q?arguments:D,0);for(let bt=0;bte.removeEventListener("abort",a))}}]:void 0}function d$(e){return typeof e=="string"&&e.trim().toLowerCase()==="-c"}function h$(e,t){if(d$(e)&&/^\s*protocol(.[a-z]+)?.allow/.test(t))throw new qn(void 0,"unsafe","Configuring protocol.allow is not permitted without enabling allowUnsafeExtProtocol")}function p$(e,t){if(/^\s*--(upload|receive)-pack/.test(e))throw new qn(void 0,"unsafe","Use of --upload-pack or --receive-pack is not permitted without enabling allowUnsafePack");if(t==="clone"&&/^\s*-u\b/.test(e))throw new qn(void 0,"unsafe","Use of clone with option -u is not permitted without enabling allowUnsafePack");if(t==="push"&&/^\s*--exec\b/.test(e))throw new qn(void 0,"unsafe","Use of push with option --exec is not permitted without enabling allowUnsafePack")}function m$({allowUnsafeProtocolOverride:e=!1,allowUnsafePack:t=!1}={}){return{type:"spawn.args",action(r,n){return r.forEach((i,a)=>{let s=aNp(i))).then(s.done)}return{type:"spawn.after",action(i,a){return El(this,arguments,function*(s,{spawned:o,close:l}){var c,u;let f=r(),d=!0,h=()=>void(d=!1);(c=o.stdout)==null||c.on("data",h),(u=o.stderr)==null||u.on("data",h),o.on("error",h),o.on("close",p=>f.close(p)),o.on("exit",p=>f.exit(p));try{yield f.result,d&&(yield Np(50)),l(f.exitCode)}catch(p){l(f.exitCode,p)}})}}}oe();var y$="Invalid value supplied for custom binary, requires a single string or an array containing either one or two strings",vb="Invalid value supplied for custom binary, restricted characters must be removed or supply the unsafe.allowUnsafeCustomBinary option";function w$(e){return!e||!/^([a-z]:)?([a-z0-9/.\\_-]+)$/i.test(e)}function yb(e,t){if(e.length<1||e.length>2)throw new qn(void 0,"binary",y$);if(e.some(w$))if(t)console.warn(vb);else throw new qn(void 0,"binary",vb);let[n,i]=e;return{binary:n,prefix:i}}function b$(e,t=["git"],r=!1){let n=yb(Sn(t),r);e.on("binary",i=>{n=yb(Sn(i),r)}),e.append("spawn.binary",()=>n.binary),e.append("spawn.args",i=>n.prefix?[n.prefix,...i]:i)}Ai();function _$(e){return!!(e.exitCode&&e.stdErr.length)}function x$(e){return Buffer.concat([...e.stdOut,...e.stdErr])}function S$(e=!1,t=_$,r=x$){return(n,i)=>!e&&n||!t(i)?n:r(i)}function wb(e){return{type:"task.error",action(t,r){let n=e(t.error,{stdErr:r.stdErr,stdOut:r.stdOut,exitCode:r.exitCode});return Buffer.isBuffer(n)?{error:new wr(void 0,n.toString("utf-8"))}:{error:n}}}}oe();var E$=class{constructor(){this.plugins=new Set,this.events=new _x.EventEmitter}on(e,t){this.events.on(e,t)}reconfigure(e,t){this.events.emit(e,t)}append(e,t){let r=Te(this.plugins,{type:e,action:t});return()=>this.plugins.delete(r)}add(e){let t=[];return Sn(e).forEach(r=>r&&this.plugins.add(Te(t,r))),()=>{t.forEach(r=>this.plugins.delete(r))}}exec(e,t,r){let n=t,i=Object.freeze(Object.create(r));for(let a of this.plugins)a.type===e&&(n=a.action(n,i));return n}};oe();function A$(e){let t="--progress",r=["checkout","clone","fetch","pull","push"];return[{type:"spawn.args",action(a,s){return r.includes(s.method)?Cb(a,t):a}},{type:"spawn.after",action(a,s){var o;s.commands.includes(t)&&((o=s.spawned.stderr)==null||o.on("data",l=>{let c=/^([\s\S]+?):\s*(\d+)% \((\d+)\/(\d+)\)/.exec(l.toString("utf8"));c&&e({method:s.method,stage:k$(c[1]),progress:Fe(c[2]),processed:Fe(c[3]),total:Fe(c[4])})}))}}]}function k$(e){return String(e.toLowerCase().split(" ",1))||"unknown"}oe();function T$(e){let t=Mb(e,["uid","gid"]);return{type:"spawn.options",action(r){return $r($r({},t),r)}}}function C$({block:e,stdErr:t=!0,stdOut:r=!0}){if(e>0)return{type:"spawn.after",action(n,i){var a,s;let o;function l(){o&&clearTimeout(o),o=setTimeout(u,e)}function c(){var f,d;(f=i.spawned.stdout)==null||f.off("data",l),(d=i.spawned.stderr)==null||d.off("data",l),i.spawned.off("exit",c),i.spawned.off("close",c),o&&clearTimeout(o)}function u(){c(),i.kill(new qn(void 0,"timeout","block timeout reached"))}r&&((a=i.spawned.stdout)==null||a.on("data",l)),t&&((s=i.spawned.stderr)==null||s.on("data",l)),i.spawned.on("exit",c),i.spawned.on("close",c),l()}}}Pl();function P$(){return{type:"spawn.args",action(e){let t=[],r;function n(i){(r=r||[]).push(...i)}for(let i=0;iTu(s)&&G2(s)||s));break}t.push(a)}return r?[...t,"--",...r.map(String)]:t}}}oe();var R$=c$();function M$(e,t){var r;let n=new E$,i=$b(e&&(typeof e=="string"?{baseDir:e}:e)||{},t);if(!Qp(i.baseDir))throw new u$(i,"Cannot use simple-git on a directory that does not exist");return Array.isArray(i.config)&&n.add(g$(i.config)),n.add(m$(i.unsafe)),n.add(P$()),n.add(v$(i.completion)),i.abort&&n.add(f$(i.abort)),i.progress&&n.add(A$(i.progress)),i.timeout&&n.add(C$(i.timeout)),i.spawnOptions&&n.add(T$(i.spawnOptions)),n.add(wb(S$(!0))),i.errors&&n.add(wb(i.errors)),b$(n,i.binary,(r=i.unsafe)==null?void 0:r.allowUnsafeCustomBinary),new R$(i,n)}Is();var xx=M$;g();var Sx=require("obsidian"),Hu="YYYY-MM-DD",_m=`${Hu} HH:mm`,xm=`${Hu} HH:mm:ss`,Uu=40,Fs="conflict-files-obsidian-git.md",Ye={commitMessage:"vault backup: {{date}}",autoCommitMessage:"vault backup: {{date}}",commitDateFormat:xm,autoSaveInterval:0,autoPushInterval:0,autoPullInterval:0,autoPullOnBoot:!1,disablePush:!1,pullBeforePush:!0,disablePopups:!1,showErrorNotices:!0,disablePopupsForNoChanges:!1,listChangedFilesInMessageBody:!1,showStatusBar:!0,updateSubmodules:!1,syncMethod:"merge",customMessageOnAutoBackup:!1,autoBackupAfterFileChange:!1,treeStructure:!1,refreshSourceControl:Sx.Platform.isDesktopApp,basePath:"",differentIntervalCommitAndPush:!1,changedFilesInStatusBar:!1,showedMobileNotice:!1,refreshSourceControlTimer:7e3,showBranchStatusBar:!0,setLastSaveToLastCommit:!1,submoduleRecurseCheckout:!1,gitDir:"",showFileMenu:!0,authorInHistoryView:"hide",dateInHistoryView:!1,diffStyle:"split",lineAuthor:{show:!1,followMovement:"inactive",authorDisplay:"initials",showCommitHash:!1,dateTimeFormatOptions:"date",dateTimeFormatCustomString:_m,dateTimeTimezone:"viewer-local",coloringMaxAge:"1y",colorNew:{r:255,g:150,b:150},colorOld:{r:120,g:160,b:255},textColorCss:"var(--text-muted)",ignoreWhitespace:!1,gutterSpacingFallbackLength:5}},kt={type:"git-view",name:"Source Control",icon:"git-pull-request"},Lr={type:"git-history-view",name:"History",icon:"history"},ki={type:"split-diff-view",name:"Diff view",icon:"diff"},Ti={type:"diff-view",name:"Diff View",icon:"git-pull-request"},Gu="C:\\Program Files\\Git\\cmd\\git.exe",zu="git_credentials_input",wa="obsidian_askpass.sh",Ex=`#!/bin/sh + +PROMPT="$1" +TEMP_FILE="$OBSIDIAN_GIT_CREDENTIALS_INPUT" + +cleanup() { + rm -f "$TEMP_FILE" "$TEMP_FILE.response" +} +trap cleanup EXIT + +echo "$PROMPT" > "$TEMP_FILE" + +while [ ! -e "$TEMP_FILE.response" ]; do + if [ ! -e "$TEMP_FILE" ]; then + echo "Trigger file got removed: Abort" >&2 + exit 1 + fi + sleep 0.1 +done + +RESPONSE=$(cat "$TEMP_FILE.response") + +echo "$RESPONSE" +`,Ax=["3dm","3ds","3g2","3gp","7z","a","aac","adp","afdesign","afphoto","afpub","ai","aif","aiff","alz","ape","apk","appimage","ar","arj","asf","au","avi","bak","baml","bh","bin","bk","bmp","btif","bz2","bzip2","cab","caf","cgm","class","cmx","cpio","cr2","cur","dat","dcm","deb","dex","djvu","dll","dmg","dng","doc","docm","docx","dot","dotm","dra","DS_Store","dsk","dts","dtshd","dvb","dwg","dxf","ecelp4800","ecelp7470","ecelp9600","egg","eol","eot","epub","exe","f4v","fbs","fh","fla","flac","flatpak","fli","flv","fpx","fst","fvt","g3","gh","gif","graffle","gz","gzip","h261","h263","h264","icns","ico","ief","img","ipa","iso","jar","jpeg","jpg","jpgv","jpm","jxr","key","ktx","lha","lib","lvp","lz","lzh","lzma","lzo","m3u","m4a","m4v","mar","mdi","mht","mid","midi","mj2","mka","mkv","mmr","mng","mobi","mov","movie","mp3","mp4","mp4a","mpeg","mpg","mpga","mxu","nef","npx","numbers","nupkg","o","odp","ods","odt","oga","ogg","ogv","otf","ott","pages","pbm","pcx","pdb","pdf","pea","pgm","pic","png","pnm","pot","potm","potx","ppa","ppam","ppm","pps","ppsm","ppsx","ppt","pptm","pptx","psd","pya","pyc","pyo","pyv","qt","rar","ras","raw","resources","rgb","rip","rlc","rmf","rmvb","rpm","rtf","rz","s3m","s7z","scpt","sgi","shar","snap","sil","sketch","slk","smv","snk","so","stl","suo","sub","swf","tar","tbz","tbz2","tga","tgz","thmx","tif","tiff","tlz","ttc","ttf","txz","udf","uvh","uvi","uvm","uvp","uvs","uvu","viv","vob","war","wav","wax","wbmp","wdp","weba","webm","webp","whl","wim","wm","wma","wmv","wmx","woff","woff2","wrm","wvx","xbm","xif","xla","xlam","xls","xlsb","xlsm","xlsx","xlt","xltm","xltx","xm","xmind","xpi","xpm","xwd","xz","z","zip","zipx"];g();var kx=require("obsidian"),O$={options:[],placeholder:"",allowEmpty:!1,onlySelection:!1,initialValue:void 0,obscure:!1},$e=class extends kx.SuggestModal{constructor(t,r){if(super(t.app),this.config={...O$,...r},this.setPlaceholder(this.config.placeholder),this.config.obscure){this.inputEl.type="password";let n=this.containerEl.querySelector(".prompt-input-container");n.addClass("git-obscure-prompt"),n.setAttr("git-is-obscured","true");let i=n==null?void 0:n.createDiv({cls:"search-input-clear-button"});i.style.marginRight="32px",i.id="git-show-password",i.addEventListener("click",()=>{n.getAttr("git-is-obscured")==="true"?(this.inputEl.type="text",n.setAttr("git-is-obscured","false")):(this.inputEl.type="password",n.setAttr("git-is-obscured","true"))})}}openAndGetResult(){return new Promise(t=>{this.resolve=t,this.open(),this.config.initialValue!=null&&(this.inputEl.value=this.config.initialValue,this.inputEl.dispatchEvent(new Event("input")))})}onClose(){new Promise(t=>setTimeout(t,10)).then(()=>{this.resolve&&this.resolve(void 0)})}getSuggestions(t){return this.config.onlySelection?this.config.options:this.config.allowEmpty?[t.length>0?t:" ",...this.config.options]:[t.length>0?t:"...",...this.config.options]}renderSuggestion(t,r){this.config.obscure?r.hide():r.setText(t)}onChooseSuggestion(t,r){if(this.resolve){let n;this.config.allowEmpty&&t===" "?n="":t==="..."?n=void 0:n=t,this.resolve(n)}}};g();function Tx(e,t){let r=Object.assign({},e.lineAuthor,t.lineAuthor);return Object.assign({},e,t,{lineAuthor:r})}var $s=class extends Error{constructor(r){super("No network connection available");this.originalError=r}};g();var cT=ze(Vx()),uT=ze(lT()),Kn=require("obsidian");var Gg=(e,t)=>e==="."||t==null||t.length===0||t==="."?!0:t.length>=e.length?t.startsWith(e):e.startsWith(t);function nn(e,t){let r;if(t){if(t.button===0||t.button===1){let n=Kn.Keymap.isModEvent(t);r=e.workspace.getLeaf(n)}}else r=e.workspace.getLeaf(!1);return r}function Tn(e,t,r,n,i){if(t.button==2){let a=e.vault.getAbstractFileByPath(r);if(a!=null){let s=new Kn.Menu;e.workspace.trigger("file-menu",s,a,i,n),s.showAtPosition({x:t.pageX,y:t.pageY})}else{let s=new Kn.Menu;e.workspace.trigger("obsidian-git:menu",s,r,i,n),s.showAtPosition({x:t.pageX,y:t.pageY})}}}function Ii(e){throw new Error("Impossible branch: "+e)}function zg(e){return`rgb(${e.r},${e.g},${e.b})`}function fT(e){var a;let t=(a=cT.fromString(e))==null?void 0:a.toRgbaArray();if(t===void 0)return;let[r,n,i]=t;return{r,g:n,b:i}}function dT(e){return e.diff(Kn.moment.unix(0),"seconds")}function hT(e){if(e.length!==0)return e.slice().sort()[Math.floor(e.length/2)]}function pT(e,t){return(0,uT.default)(e,t,{strict:!0})}function ql(e,t){return new Proxy(e,{get(r,n){return n==="length"?Math.min(t,r.length):r[n]}})}function mT(e,t,r){return e.length<=t?new Array(t-e.length).fill(r).join("")+e:e.substring(e.length-t)}function gT(e,t){if(t<=0)return e;let r=new Array(t).fill(" ").join(""),n=e.substring(t,e.length);return r+n}function Vg(e,t,r){return e<=t&&t<=r}function Fi(e){let[t,...r]=e.split("/");return[t,r.length===0?void 0:r.join("/")]}function Cn(e){return e.endsWith("/")?e:e.split("/").last().replace(/\.md$/,"")}function vT(e){return e===1?"1 minute":`${e} minutes`}function FB(e){let t=e.lastIndexOf(".");return e.substring(t+1)}function Ws(e){if(e.endsWith(".md"))return!1;let t=FB(e);return Ax.includes(t)}function Wg(e){return(e.startsWith("https://github.com/")||e.startsWith("https://gitlab.com/"))&&(e.endsWith(".git")||(e=e+".git")),e}function qs(e,t){let r=t.vault.getAbstractFileByPath(e);if(!(r instanceof Kn.TFile))return!1;try{return!!t.viewRegistry.getTypeByExtension(r.extension)}catch(n){return!0}}function yT({isFolder:e,gitRelativePath:t}){let r="/";return r+=t,e&&(r+="/"),r.replace(/([\\!#*?[\]])/g,String.raw`\$1`).replace(/\s(?=\s*$)/g,String.raw`\ `)}g();var wT=require("obsidian"),Ys=class{constructor(t){this.plugin=t,this.app=t.app}getRelativeVaultPath(t){return this.plugin.settings.basePath?this.plugin.settings.basePath+"/"+t:t}getRelativeRepoPath(t,r=!0){return r&&this.plugin.settings.basePath.length>0?t.substring(this.plugin.settings.basePath.length+1):t}unload(){}_getTreeStructure(t,r=0){let n=[];for(t=[...t];t.length>0;){let i=t.first(),a=i.path.substring(r);if(a.contains("/")){let s=a.substring(0,a.indexOf("/")),o=t.filter(c=>c.path.substring(r).startsWith(s+"/"));o.forEach(c=>t.remove(c));let l=i.path.substring(0,a.indexOf("/")+r);n.push({title:s,path:l,vaultPath:this.getRelativeVaultPath(l),children:this._getTreeStructure(o,(r>0?r+s.length:s.length)+1)})}else n.push({title:a,data:i,path:i.path,vaultPath:this.getRelativeVaultPath(i.path)}),t.remove(i)}return n}simplify(t){var r,n,i,a;for(let s of t){for(;;){let o=((r=s.children)==null?void 0:r.length)==1,l=((i=(n=s.children)==null?void 0:n.first())==null?void 0:i.data)==null;if(!(s.children!=null&&o&&l))break;let c=s.children.first();s.title+="/"+c.title,s.data=c.data,s.path=c.path,s.vaultPath=c.vaultPath,s.children=c.children}s.children!=null&&this.simplify(s.children),(a=s.children)==null||a.sort((o,l)=>{let c=(l.data==null?1:0)-(o.data==null?1:0);return c!=0?c:o.title.localeCompare(l.title)})}return t.sort((s,o)=>{let l=(o.data==null?1:0)-(s.data==null?1:0);return l!=0?l:s.title.localeCompare(o.title)})}getTreeStructure(t){let r=this._getTreeStructure(t);return this.simplify(r)}async formatCommitMessage(t){let r;if(t.includes("{{numFiles}}")){r=await this.status();let n=r.staged.length;t=t.replace("{{numFiles}}",String(n))}if(t.includes("{{hostname}}")){let n=this.plugin.localStorage.getHostname()||"";t=t.replace("{{hostname}}",n)}if(t.includes("{{files}}")){r=r!=null?r:await this.status();let n={},i="";if(r.staged.length<100){r.staged.forEach(s=>{s.index in n?n[s.index].push(s.path):n[s.index]=[s.path]});let a=[];for(let[s,o]of Object.entries(n))a.push(s+" "+o.join(" "));i=a.join(", ")}else i="Too many files to list";t=t.replace("{{files}}",i)}if(t=t.replace("{{date}}",(0,wT.moment)().format(this.plugin.settings.commitDateFormat)),this.plugin.settings.listChangedFilesInMessageBody){let n=r!=null?r:await this.status(),i="";n.staged.length<100?i=n.staged.map(a=>a.path).join(` +`):i="Too many files to list",t=t+` + +Affected files: +`+i}return t}};var Ce=class extends Ys{constructor(r){super(r);this.useDefaultWindowsGitPath=!1}async setGitInstance(r=!1){var n;if(this.isGitInstalled()){let i=this.app.vault.adapter,a=i.getBasePath(),s=a;this.plugin.settings.basePath&&(await i.exists((0,Jn.normalizePath)(this.plugin.settings.basePath))?s=De.join(a,this.plugin.settings.basePath):r||new Jn.Notice("ObsidianGit: Base path does not exist")),this.absoluteRepoPath=s,this.git=xx({baseDir:s,binary:this.plugin.localStorage.getGitPath()||(this.useDefaultWindowsGitPath?Gu:void 0),config:["core.quotepath=off"],unsafe:{allowUnsafeCustomBinary:!0}});let o=this.plugin.localStorage.getPATHPaths(),l=this.plugin.localStorage.getEnvVars(),c=this.plugin.settings.gitDir;if(o.length>0){let v=process.env.PATH+":"+o.join(":");process.env.PATH=v}c&&(process.env.GIT_DIR=c);for(let v of l){let[y,b]=v.split("=");process.env[y]=b}let u="simple-git",f=",",h=((n=localStorage.debug)!=null?n:"").split(f);if(!h.includes(u)&&!h.includes(`-${u}`)&&(h.push(u),xT.default.enable(h.join(f))),await this.git.checkIsRepo()){let v=await this.git.revparse("--show-cdup"),y=(0,Yl.resolve)(s+Yl.sep+v);this.absoluteRepoPath=y,await this.git.cwd(y)}let p=De.join(a,this.app.vault.configDir,"plugins","obsidian-git"),m=De.join(p,wa);process.env.SSH_ASKPASS==null&&(process.env.SSH_ASKPASS=m),process.env.OBSIDIAN_GIT_CREDENTIALS_INPUT=De.join(p,zu),process.env.SSH_ASKPASS==m&&this.askpass().catch(v=>this.plugin.displayError(v))}}getRelativeVaultPath(r){let i=this.app.vault.adapter.getBasePath(),a=De.join(this.absoluteRepoPath,r),s=De.relative(i,a);return Jn.Platform.isWin&&(s=s.replace(/\\/g,"/")),s}getRelativeRepoPath(r,n=!0){if(n){let a=this.plugin.app.vault.adapter.getBasePath(),s=this.absoluteRepoPath,o=De.join(a,r),l=De.relative(s,o);return Jn.Platform.isWin&&(l=l.replace(/\\/g,"/")),l}return r}async askpass(){let r=this.app.vault.adapter,n=r.getBasePath(),i=De.join(n,this.app.vault.configDir,"plugins","obsidian-git"),a=this.app.vault.configDir+"/plugins/obsidian-git/";await this.addAskPassScriptToExclude(),await _r.writeFile(De.join(i,wa),Ex),await _r.chmod(De.join(i,wa),493),this.watchAbortController=new AbortController;let{signal:s}=this.watchAbortController;try{let o=_r.watch(i,{signal:s});for await(let l of o){if(l.filename!=zu)continue;let c=a+zu;if(!await r.exists(c))continue;let u=await r.read(c),f;u.length>60&&(f=new Jn.Notice(u,999999));let d=await new $e(this.plugin,{allowEmpty:!0,obscure:!0,placeholder:u.length>60?"Enter a response to the message.":u}).openAndGetResult();f==null||f.hide(),await r.exists(c)&&await r.write(`${c}.response`,d!=null?d:"")}}catch(o){this.plugin.displayError(o),await _r.rm(De.join(i,wa),{force:!0}),await _r.rm(De.join(i,`${wa}.response`),{force:!0}),await new Promise(l=>setTimeout(l,5e3)),this.plugin.log("Retry watch for ask pass"),await this.askpass()}}async addAskPassScriptToExclude(){try{let r=await this.git.revparse(["--path-format=absolute","--git-path","info/exclude"]),n=De.join(this.app.vault.configDir,"plugins","obsidian-git",wa),i=this.getRelativeRepoPath(n,!0);(await _r.readFile(r,"utf-8")).split(` +`).some(l=>l.contains(i))||await _r.appendFile(r,i+` +`)}catch(r){console.error("Error while adding askpass script to exclude file:",r)}}unload(){var r;(r=this.watchAbortController)==null||r.abort()}async status(){this.plugin.setPluginState({gitAction:1});let r=await this.git.status();this.plugin.setPluginState({gitAction:0});let n=r.files.map(i=>{let a=this.formatPath(i);return{path:a.path,from:a.from,index:i.index==="?"?"U":i.index,workingDir:i.working_dir==="?"?"U":i.working_dir,vaultPath:this.getRelativeVaultPath(a.path)}});return{all:n,changed:n.filter(i=>i.workingDir!==" "),staged:n.filter(i=>i.index!==" "&&i.index!="U"),conflicted:r.conflicted.map(i=>this.formatPath({path:i}).path)}}async submoduleAwareHeadRevisonInContainingDirectory(r){let n=this.getRelativeRepoPath(r),a=["-C",De.dirname(n),"rev-parse","HEAD"],s=this.git.raw(a);return s.catch(o=>console.warn("obsidian-git: rev-parse error:",o)),s}async getSubmodulePaths(){return new Promise(r=>{this.git.outputHandler((n,i,a,s)=>{if(!(s.contains("submodule")&&s.contains("foreach")))return;let o="",l=this.app.vault.adapter.getBasePath()+(this.plugin.settings.basePath?"/"+this.plugin.settings.basePath:"");i.on("data",c=>{o+=c.toString("utf8")}),i.on("end",()=>{let u=o.split(` +`).map(f=>{let d=f.match(/'([^']*)'/);if(d!=null)return l+"/"+d[1]+Yl.sep}).filter(f=>!!f);u.reverse(),r(u)})}),this.git.subModule(["foreach","--recursive",""]).then(()=>{this.git.outputHandler(()=>{})},n=>this.plugin.displayError(n))})}formatPath(r,n=!1){function i(a){if(a!=null)return a.startsWith('"')&&a.endsWith('"')?a.substring(1,a.length-1):a}return n?{from:i(r.from),path:i(r.path)}:{path:i(r.path)}}async blame(r,n,i){if(r=this.getRelativeRepoPath(r),!await this.isTracked(r))return"untracked";let a=await this.getSubmoduleOfFile(r),s=a?["-C",a.submodule]:[],o=a?a.relativeFilepath:r;s.push("blame","--porcelain"),i&&s.push("-w");let l=`-C${Uu}`;switch(n){case"inactive":break;case"same-commit":s.push("-C",l);break;case"all-commits":s.push("-C","-C",l);break;default:Ii(n)}s.push("--",o);let c=await this.git.raw(s);return $B(c)}async isTracked(r){let n=await this.getSubmoduleOfFile(r),i=n?["-C",n.submodule]:[],a=n?n.relativeFilepath:r;return i.push("ls-files","--",a),this.git.raw(i).then(s=>s.trim()!=="")}async commitAll({message:r}){if(this.plugin.settings.updateSubmodules){this.plugin.setPluginState({gitAction:4});let i=await this.getSubmodulePaths();for(let a of i)await this.git.cwd({path:a,root:!1}).add("-A"),await this.git.cwd({path:a,root:!1}).commit(await this.formatCommitMessage(r))}this.plugin.setPluginState({gitAction:3}),await this.git.add("-A"),this.plugin.setPluginState({gitAction:4});let n=await this.git.commit(await this.formatCommitMessage(r));return this.app.workspace.trigger("obsidian-git:head-change"),n.summary.changes}async commit({message:r,amend:n}){this.plugin.setPluginState({gitAction:4});let i=(await this.git.commit(await this.formatCommitMessage(r),n?["--amend"]:[])).summary.changes;return this.app.workspace.trigger("obsidian-git:head-change"),this.plugin.setPluginState({gitAction:0}),i}async stage(r,n){this.plugin.setPluginState({gitAction:3}),r=this.getRelativeRepoPath(r,n),await this.git.add(["--",r]),this.plugin.setPluginState({gitAction:0})}async stageAll({dir:r}){this.plugin.setPluginState({gitAction:3}),await this.git.add(r!=null?r:"-A"),this.plugin.setPluginState({gitAction:0})}async unstageAll({dir:r}){this.plugin.setPluginState({gitAction:3}),await this.git.reset(r!=null?["--",r]:[]),this.plugin.setPluginState({gitAction:0})}async unstage(r,n){this.plugin.setPluginState({gitAction:3}),r=this.getRelativeRepoPath(r,n),await this.git.reset(["--",r]),this.plugin.setPluginState({gitAction:0})}async discard(r){this.plugin.setPluginState({gitAction:3}),await this.isTracked(r)?await this.git.checkout(["--",r]):await this.app.vault.adapter.rmdir(this.getRelativeVaultPath(r),!0),this.plugin.setPluginState({gitAction:0})}async hashObject(r){r=this.getRelativeRepoPath(r);let n=await this.getSubmoduleOfFile(r),i=n?["-C",n.submodule]:[],a=n?n.relativeFilepath:r;return i.push("hash-object","--",a),this.git.raw(i)}async discardAll({dir:r}){return this.discard(r!=null?r:".")}async pull(){this.plugin.setPluginState({gitAction:2});try{this.plugin.settings.updateSubmodules&&await this.git.subModule(["update","--remote","--merge","--recursive"]);let r=await this.branchInfo(),n=await this.git.revparse([r.current]);if(!r.tracking&&this.plugin.settings.updateSubmodules){this.plugin.log("No tracking branch found. Ignoring pull of main repo and updating submodules only.");return}await this.git.fetch();let i=await this.git.revparse([r.tracking]);if(n!==i){if(this.plugin.settings.syncMethod==="merge"||this.plugin.settings.syncMethod==="rebase")try{switch(this.plugin.settings.syncMethod){case"merge":await this.git.merge([r.tracking]);break;case"rebase":await this.git.rebase([r.tracking])}}catch(o){this.plugin.displayError(`Pull failed (${this.plugin.settings.syncMethod}): ${"message"in o?o.message:o}`);return}else if(this.plugin.settings.syncMethod==="reset")try{await this.git.raw(["update-ref",`refs/heads/${r.current}`,i]),await this.unstageAll({})}catch(o){this.plugin.displayError(`Sync failed (${this.plugin.settings.syncMethod}): ${"message"in o?o.message:o}`)}this.app.workspace.trigger("obsidian-git:head-change");let a=await this.git.revparse([r.current]);return(await this.git.diff([`${n}..${a}`,"--name-only"])).split(/\r\n|\r|\n/).filter(o=>o.length>0).map(o=>({path:o,workingDir:"P",vaultPath:this.getRelativeVaultPath(o)}))}else return[]}catch(r){this.convertErrors(r)}}async push(){this.plugin.setPluginState({gitAction:5});try{if(this.plugin.settings.updateSubmodules){let s=await this.git.env({...process.env,OBSIDIAN_GIT:1}).subModule(["foreach","--recursive",`tracking=$(git for-each-ref --format='%(upstream:short)' "$(git symbolic-ref -q HEAD)"); echo $tracking; if [ ! -z "$(git diff --shortstat $tracking)" ]; then git push; fi`]);console.log(s)}let r=await this.git.status(),n=r.tracking,i=r.current;if(!n&&this.plugin.settings.updateSubmodules){this.plugin.log("No tracking branch found. Ignoring push of main repo and updating submodules only.");return}let a=(await this.git.diffSummary([i,n,"--"])).changed;return await this.git.env({...process.env,OBSIDIAN_GIT:1}).push(),a}catch(r){this.convertErrors(r)}}async getUnpushedCommits(){let r=await this.git.status(),n=r.tracking,i=r.current;return n==null||i==null?0:(await this.git.diffSummary([i,n,"--"])).changed}async canPush(){if(this.plugin.settings.updateSubmodules===!0)return!0;let r=await this.git.status(),n=r.tracking,i=r.current;return n?(await this.git.diffSummary([i,n,"--"])).changed!==0:!1}async checkRequirements(){return this.isGitInstalled()?await this.git.checkIsRepo()?"valid":"missing-repo":"missing-git"}async branchInfo(){let r=await this.git.status(),n=await this.git.branch(["--no-color"]);return{current:r.current||void 0,tracking:r.tracking||void 0,branches:n.all}}async getRemoteUrl(r){try{return await this.git.remote(["get-url",r])||void 0}catch(n){if(String(n).contains(r))return;throw n}}async log(r,n=!0,i,a){let s;r&&(s=this.getRelativeRepoPath(r,n));let o={file:s,maxCount:i,"--diff-merges":"first-parent","--name-status":null};return a&&(o[a]=null),(await this.git.log(o)).all.map(c=>{var u,f,d,h;return{...c,author:{name:c.author_name,email:c.author_email},refs:c.refs.split(", ").filter(p=>p.length>0),diff:{...c.diff,files:(f=(u=c.diff)==null?void 0:u.files.map(p=>({...p,status:p.status,path:p.file,hash:c.hash,vaultPath:this.getRelativeVaultPath(p.file),fromPath:p.from,fromVaultPath:p.from!=null?this.getRelativeVaultPath(p.from):void 0,binary:p.binary})))!=null?f:[]},fileName:(h=(d=c.diff)==null?void 0:d.files.first())==null?void 0:h.file}})}async show(r,n,i=!0){let a=this.getRelativeRepoPath(n,i);return this.git.show([r+":"+a])}async checkout(r,n){if(n&&(r=`${n}/${r}`),await this.git.checkout(r),this.plugin.settings.submoduleRecurseCheckout){let i=await this.getSubmodulePaths();for(let a of i){let s=await this.git.cwd({path:a,root:!1}).branch();Object.keys(s.branches).includes(r)&&await this.git.cwd({path:a,root:!1}).checkout(r)}}}async createBranch(r){await this.git.checkout(["-b",r])}async deleteBranch(r,n){await this.git.branch([n?"-D":"-d",r])}async branchIsMerged(r){return!(await this.git.branch(["--no-merged"])).all.contains(r)}async init(){await this.git.init(!1)}async clone(r,n,i){await this.git.clone(r,De.join(this.app.vault.adapter.getBasePath(),n),i?["--depth",`${i}`]:[])}async setConfig(r,n){n==null?await this.git.raw(["config","--local","--unset",r]):await this.git.addConfig(r,n)}async getConfig(r){let i=(await this.git.listConfig("local")).all[r];if(typeof i=="string"||i==null)return i;throw new Error("Config value is not a string")}async fetch(r){await this.git.fetch(r!=null?[r]:[])}async setRemote(r,n){(await this.getRemotes()).includes(r)?await this.git.remote(["set-url",r,n]):await this.git.remote(["add",r,n])}async getRemoteBranches(r){let n=await this.git.branch(["-r","--list",`${r}*`]),i=[];for(let a in n.branches)i.push(n.branches[a].name);return i}async getRemotes(){let r=await this.git.remote([]);return r?r.trim().split(` +`):[]}async removeRemote(r){await this.git.removeRemote(r)}async updateUpstreamBranch(r){try{await this.git.branch(["--set-upstream-to",r])}catch(n){try{await this.git.branch(["--set-upstream",r])}catch(i){await this.git.push(["--set-upstream",...Fi(r)])}}}updateGitPath(r){return this.setGitInstance()}updateBasePath(r){return this.setGitInstance(!0)}async getDiffString(r,n=!1,i){return n?await this.git.diff(["--cached","--",r]):i?await this.git.show([`${i}`,"--",r]):await this.git.diff(["--",r])}async diff(r,n,i){return await this.git.diff([`${n}..${i}`,"--",r])}async rawCommand(r){let n=r.split(" ");return await this.git.raw(n[0],...n.slice(1))}async getSubmoduleOfFile(r){if(!await this.app.vault.adapter.exists(De.dirname(r)))return;let n=await this.git.raw(["-C",De.dirname(r),"rev-parse","--show-toplevel"],l=>l&&console.warn("get-submodule-of-file",l==null?void 0:l.message));if(n=n.trim(),(await this.git.raw(["-C",De.dirname(r),"rev-parse","--show-superproject-working-tree"],l=>l&&console.warn("get-submodule-of-file",l==null?void 0:l.message))).trim()==="")return;let s=this.app.vault.adapter.getFullPath(De.normalize(r)),o=De.relative(n,s);return{submodule:n,relativeFilepath:o}}async getLastCommitTime(){let r=await this.git.log({n:1});if(r!=null&&r.latest!=null)return new Date(r.latest.date)}isGitInstalled(){let r=this.plugin.localStorage.getGitPath(),n=(0,Yg.spawnSync)(r||"git",["--version"],{stdio:"ignore"});if(n.error)if(Jn.Platform.isWin&&!r){this.plugin.log(`Git not found in PATH. Checking standard installation path(${Gu}) of Git for Windows.`);let i=(0,Yg.spawnSync)(Gu,["--version"],{stdio:"ignore"});if(i.error)return console.error(i.error),!1;this.useDefaultWindowsGitPath=!0}else return console.error(n.error),!1;else this.useDefaultWindowsGitPath=!1;return!0}convertErrors(r){if(r instanceof wr){let n=String(r.message);if(n.contains("Could not resolve host")||n.contains("Unable to resolve host")||n.match(/ssh: connect to host .*? port .*?: Operation timed out/)!=null||n.match(/ssh: connect to host .*? port .*?: Network is unreachable/)!=null||n.match(/ssh: connect to host .*? port .*?: Undefined error: 0/)!=null)throw new $s(n)}throw r}async isFileTrackedByLFS(r){try{return(await this.git.raw(["check-attr","filter",r])).includes("filter: lfs")}catch(n){let i=n instanceof Error?n.message:String(n);return this.plugin.displayError(`Error checking LFS status: ${i}`),!1}}},ST={hash:"000000",isZeroCommit:!0,summary:""};function $B(e){let r=e.replace(`\r +`,` +`).split(` +`),n={commits:new Map,hashPerLine:[void 0],originalFileLineNrPerLine:[void 0],finalFileLineNrPerLine:[void 0],groupSizePerStartingLine:new Map},i=1;for(let a=0;a=4&&r.groupSizePerStartingLine.set(t,parseInt(e[3])),parseInt(e[2])!==t)throw Error(`git-blame output is out of order: ${t} vs ${e[2]}`);return n}function DB(e,t,r){let n=e[0],i=e.slice(1).join(" "),a=t.hashPerLine[r],s=t.commits.get(a)||{hash:a,author:{},committer:{},previous:{}};switch(n){case"summary":s.summary=i;break;case"author":s.author.name=i;break;case"author-mail":s.author.email=_T(i);break;case"author-time":s.author.epochSeconds=parseInt(i);break;case"author-tz":s.author.tz=i;break;case"committer":s.committer.name=i;break;case"committer-mail":s.committer.email=_T(i);break;case"committer-time":s.committer.epochSeconds=parseInt(i);break;case"committer-tz":s.committer.tz=i;break;case"previous":s.previous.commitHash=i;break;case"filename":s.previous.filename=i;break}t.commits.set(a,s)}function NB(e){if(e.summary===void 0)throw Error(`Summary not provided for commit: ${e.hash}`);qg(e.author)&&(e.author=void 0),qg(e.committer)&&(e.committer=void 0),qg(e.previous)&&(e.previous=void 0),e.isZeroCommit=!!e.hash.match(/^0*$/)}function qg(e){return!e||Object.keys(e).length===0}function bT(e){return e.length>0&&e[0].trim()===e[0]}function _T(e){let t=e.startsWith("<")?e.substring(1):e;return t.endsWith(">")?t.substring(0,t.length-1):t}g();var iC=require("@codemirror/state");g();var DT=require("@codemirror/state"),qf=require("obsidian");g();var Xg=class{constructor(){this.eventsPerFilepath=new Map;this.startRemoveStalesSubscribersInterval()}ifFilepathDefinedTransformSubscribers(t,r){if(t)return this.ensureInitialized(t),r(this.eventsPerFilepath.get(t))}forEachSubscriber(t){this.eventsPerFilepath.forEach(r=>r.forEach(t))}ensureInitialized(t){this.eventsPerFilepath.get(t)||this.eventsPerFilepath.set(t,new Set)}startRemoveStalesSubscribersInterval(){this.removeStalesSubscribersTimer=window.setInterval(()=>this==null?void 0:this.forEachSubscriber(t=>t==null?void 0:t.removeIfStale()),6e4)}clear(){window.clearInterval(this.removeStalesSubscribersTimer),this.eventsPerFilepath.clear()}},Xs=new Xg;g();var zf=require("@codemirror/state"),OT=ze(Zg());g();var U=require("obsidian");g();g();function an(){}an.prototype={diff:function(t,r){var n,i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},a=i.callback;typeof i=="function"&&(a=i,i={});var s=this;function o(E){return E=s.postProcess(E,i),a?(setTimeout(function(){a(E)},0),!0):E}t=this.castInput(t,i),r=this.castInput(r,i),t=this.removeEmpty(this.tokenize(t,i)),r=this.removeEmpty(this.tokenize(r,i));var l=r.length,c=t.length,u=1,f=l+c;i.maxEditLength!=null&&(f=Math.min(f,i.maxEditLength));var d=(n=i.timeout)!==null&&n!==void 0?n:1/0,h=Date.now()+d,p=[{oldPos:-1,lastComponent:void 0}],m=this.extractCommon(p[0],r,t,0,i);if(p[0].oldPos+1>=c&&m+1>=l)return o(ET(s,p[0].lastComponent,r,t,s.useLongestToken));var v=-1/0,y=1/0;function b(){for(var E=Math.max(v,-u);E<=Math.min(y,u);E+=2){var _=void 0,k=p[E-1],w=p[E+1];k&&(p[E-1]=void 0);var A=!1;if(w){var S=w.oldPos-E;A=w&&0<=S&&S=c&&m+1>=l)return o(ET(s,_.lastComponent,r,t,s.useLongestToken));p[E]=_,_.oldPos+1>=c&&(y=Math.min(y,E-1)),m+1>=l&&(v=Math.max(v,E+1))}u++}if(a)(function E(){setTimeout(function(){if(u>f||Date.now()>h)return a();b()||E()},0)})();else for(;u<=f&&Date.now()<=h;){var x=b();if(x)return x}},addToPath:function(t,r,n,i,a){var s=t.lastComponent;return s&&!a.oneChangePerToken&&s.added===r&&s.removed===n?{oldPos:t.oldPos+i,lastComponent:{count:s.count+1,added:r,removed:n,previousComponent:s.previousComponent}}:{oldPos:t.oldPos+i,lastComponent:{count:1,added:r,removed:n,previousComponent:s}}},extractCommon:function(t,r,n,i,a){for(var s=r.length,o=n.length,l=t.oldPos,c=l-i,u=0;c+1h.length?m:h}),f.value=e.join(d)}else f.value=e.join(r.slice(c,c+f.count));c+=f.count,f.added||(u+=f.count)}}return a}var tq=new an;function AT(e,t){var r;for(r=0;rt.length&&(r=e.length-t.length);var n=t.length;e.length0&&t[s]!=t[a];)a=i[a];t[s]==t[a]&&a++}a=0;for(var o=r;o0&&e[o]!=t[a];)a=i[a];e[o]==t[a]&&a++}return a}var Lf="a-zA-Z0-9_\\u{C0}-\\u{FF}\\u{D8}-\\u{F6}\\u{F8}-\\u{2C6}\\u{2C8}-\\u{2D7}\\u{2DE}-\\u{2FF}\\u{1E00}-\\u{1EFF}",jB=new RegExp("[".concat(Lf,"]+|\\s+|[^").concat(Lf,"]"),"ug"),Nf=new an;Nf.equals=function(e,t,r){return r.ignoreCase&&(e=e.toLowerCase(),t=t.toLowerCase()),e.trim()===t.trim()};Nf.tokenize=function(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},r;if(t.intlSegmenter){if(t.intlSegmenter.resolvedOptions().granularity!="word")throw new Error('The segmenter passed must have a granularity of "word"');r=Array.from(t.intlSegmenter.segment(e),function(a){return a.segment})}else r=e.match(jB)||[];var n=[],i=null;return r.forEach(function(a){/\s/.test(a)?i==null?n.push(a):n.push(n.pop()+a):/\s/.test(i)?n[n.length-1]==i?n.push(n.pop()+a):n.push(i+a):n.push(a),i=a}),n};Nf.join=function(e){return e.map(function(t,r){return r==0?t:t.replace(/^\s+/,"")}).join("")};Nf.postProcess=function(e,t){if(!e||t.oneChangePerToken)return e;var r=null,n=null,i=null;return e.forEach(function(a){a.added?n=a:a.removed?i=a:((n||i)&&CT(r,i,n,a),r=a,n=null,i=null)}),(n||i)&&CT(r,i,n,null),e};function CT(e,t,r,n){if(t&&r){var i=t.value.match(/^\s*/)[0],a=t.value.match(/\s*$/)[0],s=r.value.match(/^\s*/)[0],o=r.value.match(/\s*$/)[0];if(e){var l=AT(i,s);e.value=Qg(e.value,s,l),t.value=Xl(t.value,l),r.value=Xl(r.value,l)}if(n){var c=kT(a,o);n.value=Jg(n.value,o,c),t.value=$f(t.value,c),r.value=$f(r.value,c)}}else if(r)e&&(r.value=r.value.replace(/^\s*/,"")),n&&(n.value=n.value.replace(/^\s*/,""));else if(e&&n){var u=n.value.match(/^\s*/)[0],f=t.value.match(/^\s*/)[0],d=t.value.match(/\s*$/)[0],h=AT(u,f);t.value=Xl(t.value,h);var p=kT(Xl(u,h),d);t.value=$f(t.value,p),n.value=Jg(n.value,u,p),e.value=Qg(e.value,u,u.slice(0,u.length-p.length))}else if(n){var m=n.value.match(/^\s*/)[0],v=t.value.match(/\s*$/)[0],y=TT(v,m);t.value=$f(t.value,y)}else if(e){var b=e.value.match(/\s*$/)[0],x=t.value.match(/^\s*/)[0],E=TT(b,x);t.value=Xl(t.value,E)}}var HB=new an;HB.tokenize=function(e){var t=new RegExp("(\\r?\\n)|[".concat(Lf,"]+|[^\\S\\n\\r]+|[^").concat(Lf,"]"),"ug");return e.match(t)||[]};var Bf=new an;Bf.tokenize=function(e,t){t.stripTrailingCr&&(e=e.replace(/\r\n/g,` +`));var r=[],n=e.split(/(\n|\r\n)/);n[n.length-1]||n.pop();for(var i=0;ie.length)&&(t=e.length);for(var r=0,n=new Array(t);r0?f(I.lines.slice(-s.context)):[],h-=m.length,p-=m.length)}(P=m).push.apply(P,Kg(T.map(function(J){return(S.added?"+":"-")+J}))),S.added?y+=T.length:v+=T.length}else{if(h)if(T.length<=s.context*2&&x(0,$i.normalizePath)(a.substring(t.length))):i=n,i}async mkdir(t){return this.adapter.mkdir(t)}async rmdir(t,r){var n,i;return this.adapter.rmdir(t,(i=(n=r==null?void 0:r.options)==null?void 0:n.recursive)!=null?i:!1)}async stat(t){if(t.endsWith(this.gitDir+"/index")){if(this.index!==void 0&&this.indexctime!=null&&this.indexmtime!=null)return{isFile:()=>!0,isDirectory:()=>!1,isSymbolicLink:()=>!1,size:this.index.length,type:"file",ctimeMs:this.indexctime,mtimeMs:this.indexmtime};{let n=await this.adapter.stat(t);if(n==null)throw{code:"ENOENT"};return this.indexctime=n.ctime,this.indexmtime=n.mtime,{ctimeMs:n.ctime,mtimeMs:n.mtime,size:n.size,type:"file",isFile:()=>!0,isDirectory:()=>!1,isSymbolicLink:()=>!1}}}t==="."&&(t="/");let r=this.vault.getAbstractFileByPath(t);if(this.maybeLog("Stat: "+t),r instanceof $i.TFile)return this.maybeLog("Reuse stat"),{ctimeMs:r.stat.ctime,mtimeMs:r.stat.mtime,size:r.stat.size,type:"file",isFile:()=>!0,isDirectory:()=>!1,isSymbolicLink:()=>!1};{let n=await this.adapter.stat(t);if(n)return{ctimeMs:n.ctime,mtimeMs:n.mtime,size:n.size,type:n.type==="folder"?"directory":n.type,isFile:()=>n.type==="file",isDirectory:()=>n.type==="folder",isSymbolicLink:()=>!1};throw{code:"ENOENT"}}}async unlink(t){return this.adapter.remove(t)}async lstat(t){return this.stat(t)}async readlink(t){throw new Error(`readlink of (${t}) is not implemented.`)}async symlink(t){throw new Error(`symlink of (${t}) is not implemented.`)}async saveAndClear(){this.index!==void 0&&await this.adapter.writeBinary(this.plugin.gitManager.getRelativeVaultPath(this.gitDir+"/index"),this.index,{ctime:this.indexctime,mtime:this.indexmtime}),this.clearIndex()}clearIndex(){this.index=void 0,this.indexctime=void 0,this.indexmtime=void 0}get gitDir(){return this.plugin.settings.gitDir||".git"}maybeLog(t){}};var sn=class extends Ys{constructor(r){super(r);this.FILE=0;this.HEAD=1;this.WORKDIR=2;this.STAGE=3;this.status_mapping={"000":" ","003":"AD","020":"??","022":"A ","023":"AM",100:"D ",101:" D",103:"MD",110:"DA",111:" ",113:"MM",120:"DA",121:" M",122:"M ",123:"MM"};this.noticeLength=999999;this.fs=new Hf(this.app.vault,this.plugin)}getRepo(){return{fs:this.fs,dir:this.plugin.settings.basePath,gitdir:this.plugin.settings.gitDir||void 0,onAuth:()=>{var r,n;return{username:(r=this.plugin.localStorage.getUsername())!=null?r:void 0,password:(n=this.plugin.localStorage.getPassword())!=null?n:void 0}},onAuthFailure:async()=>{new Sa.Notice("Authentication failed. Please try with different credentials");let r=await new $e(this.plugin,{placeholder:"Specify your username"}).openAndGetResult();if(r){let n=await new $e(this.plugin,{placeholder:"Specify your password/personal access token"}).openAndGetResult();if(n)return this.plugin.localStorage.setUsername(r),this.plugin.localStorage.setPassword(n),{username:r,password:n}}return{cancel:!0}},http:{async request({url:r,method:n,headers:i,body:a}){let s;a&&(s=(await rj(a)).buffer);let o=await(0,Sa.requestUrl)({url:r,method:n,headers:i,body:s,throw:!1});return{url:r,method:n,headers:o.headers,body:[new Uint8Array(o.arrayBuffer)],statusCode:o.status,statusMessage:o.status.toString()}}}}}async wrapFS(r){try{let n=await r;return await this.fs.saveAndClear(),n}catch(n){throw await this.fs.saveAndClear(),n}}async status(){let r,n=window.setTimeout(()=>{r=new Sa.Notice("This takes longer: Getting status",this.noticeLength)},2e4);try{this.plugin.setPluginState({gitAction:1});let i=(await this.wrapFS(ie.statusMatrix({...this.getRepo()}))).map(l=>this.getFileStatusResult(l)),a=i.filter(l=>l.workingDir!==" "),s=i.filter(l=>l.index!==" "&&l.index!=="U"),o=[];return window.clearTimeout(n),r==null||r.hide(),{all:i,changed:a,staged:s,conflicted:o}}catch(i){throw window.clearTimeout(n),r==null||r.hide(),this.plugin.displayError(i),i}}async commitAll({message:r,status:n,unstagedFiles:i}){try{return await this.checkAuthorInfo(),await this.stageAll({status:n,unstagedFiles:i}),this.commit({message:r})}catch(a){throw this.plugin.displayError(a),a}}async commit({message:r}){try{await this.checkAuthorInfo(),this.plugin.setPluginState({gitAction:4});let n=await this.formatCommitMessage(r),i=this.plugin.localStorage.getConflict(),a;if(i){let s=await this.branchInfo();a=[s.current,s.tracking]}await this.wrapFS(ie.commit({...this.getRepo(),message:n,parent:a})),this.plugin.localStorage.setConflict(!1);return}catch(n){throw this.plugin.displayError(n),n}}async stage(r,n){let i=this.getRelativeRepoPath(r,n),a;n?a=r:a=this.getRelativeVaultPath(r);try{this.plugin.setPluginState({gitAction:3}),await this.app.vault.adapter.exists(a)?await this.wrapFS(ie.add({...this.getRepo(),filepath:i})):await this.wrapFS(ie.remove({...this.getRepo(),filepath:i}))}catch(s){throw this.plugin.displayError(s),s}}async stageAll({dir:r,status:n,unstagedFiles:i}){try{if(n)await Promise.all(n.changed.map(a=>a.workingDir!=="D"?this.wrapFS(ie.add({...this.getRepo(),filepath:a.path})):ie.remove({...this.getRepo(),filepath:a.path})));else{let a=i!=null?i:await this.getUnstagedFiles(r!=null?r:".");await Promise.all(a.map(({path:s,deleted:o})=>o?ie.remove({...this.getRepo(),filepath:s}):this.wrapFS(ie.add({...this.getRepo(),filepath:s}))))}}catch(a){throw this.plugin.displayError(a),a}}async unstage(r,n){try{this.plugin.setPluginState({gitAction:3}),r=this.getRelativeRepoPath(r,n),await this.wrapFS(ie.resetIndex({...this.getRepo(),filepath:r}))}catch(i){throw this.plugin.displayError(i),i}}async unstageAll({dir:r,status:n}){try{let i;n?i=n.staged.map(a=>a.path):i=(await this.getStagedFiles(r!=null?r:".")).map(({path:s})=>s),await this.wrapFS(Promise.all(i.map(a=>ie.resetIndex({...this.getRepo(),filepath:a}))))}catch(i){throw this.plugin.displayError(i),i}}async discard(r){try{this.plugin.setPluginState({gitAction:3}),await this.wrapFS(ie.checkout({...this.getRepo(),filepaths:[r],force:!0}))}catch(n){throw this.plugin.displayError(n),n}}async discardAll({dir:r,status:n}){let i=[];n?r!=null?i=n.changed.filter(a=>a.path.startsWith(r)).map(a=>a.path):i=n.changed.map(a=>a.path):i=(await this.getUnstagedFiles(r)).map(({path:a})=>a);try{await this.wrapFS(ie.checkout({...this.getRepo(),filepaths:i,force:!0}))}catch(a){throw this.plugin.displayError(a),a}}getProgressText(r,n){let i=`${r} progress:`;return n.phase&&(i=`${i} ${n.phase}:`),n.loaded&&(i=`${i} ${n.loaded}`,n.total&&(i=`${i} of ${n.total}`)),i}resolveRef(r){return this.wrapFS(ie.resolveRef({...this.getRepo(),ref:r}))}async pull(){let r=this.showNotice("Initializing pull");try{this.plugin.setPluginState({gitAction:2});let n=await this.resolveRef("HEAD");await this.fetch();let i=await this.branchInfo();await this.checkAuthorInfo(),(await this.wrapFS(ie.merge({...this.getRepo(),ours:i.current,theirs:i.tracking,abortOnConflict:!1}))).alreadyMerged||await this.wrapFS(ie.checkout({...this.getRepo(),ref:i.current,onProgress:l=>{r!==void 0&&(r.noticeEl.innerText=this.getProgressText("Checkout",l))},remote:i.remote})),r==null||r.hide();let s=await this.resolveRef("HEAD"),o=await this.getFileChangesCount(n,s);return this.showNotice("Finished pull",!1),o.map(l=>({path:l.path,workingDir:"P",index:"P",vaultPath:this.getRelativeVaultPath(l.path)}))}catch(n){throw r==null||r.hide(),n instanceof wl.MergeConflictError&&await this.plugin.handleConflict(n.data.filepaths.map(i=>this.getRelativeVaultPath(i))),this.plugin.displayError(n),n}}async push(){if(!await this.canPush())return 0;let r=this.showNotice("Initializing push");try{this.plugin.setPluginState({gitAction:1});let n=await this.branchInfo(),i=n.tracking,a=n.current,s=(await this.getFileChangesCount(a,i)).length;return this.plugin.setPluginState({gitAction:5}),await this.wrapFS(ie.push({...this.getRepo(),onProgress:o=>{r!==void 0&&(r.noticeEl.innerText=this.getProgressText("Pushing",o))}})),r==null||r.hide(),s}catch(n){throw r==null||r.hide(),this.plugin.displayError(n),n}}async getUnpushedCommits(){let r=await this.branchInfo(),n=r.tracking,i=r.current;if(n==null||i==null)return 0;let a=await this.resolveRef(i),s=await this.resolveRef(n);return(await this.getFileChangesCount(a,s)).length}async canPush(){let r=await this.branchInfo(),n=r.tracking,i=r.current,a=await this.resolveRef(i),s=await this.resolveRef(n);return a!=s}async checkRequirements(){return await this.plugin.app.vault.adapter.exists(`${this.getRepo().dir}/.git/HEAD`)?"valid":"missing-repo"}async branchInfo(){var r,n;try{let i=await ie.currentBranch(this.getRepo())||"",a=await ie.listBranches(this.getRepo()),s=(r=await this.getConfig(`branch.${i}.remote`))!=null?r:"origin",o=(n=await this.getConfig(`branch.${i}.merge`))==null?void 0:n.split("refs/heads")[1],l=o?s+o:void 0;return{current:i,tracking:l,branches:a,remote:s}}catch(i){throw this.plugin.displayError(i),i}}async getCurrentRemote(){var i;let r=await ie.currentBranch(this.getRepo())||"";return(i=await this.getConfig(`branch.${r}.remote`))!=null?i:"origin"}async checkout(r,n){try{return this.wrapFS(ie.checkout({...this.getRepo(),ref:r,force:!!n,remote:n}))}catch(i){throw this.plugin.displayError(i),i}}async createBranch(r){try{await this.wrapFS(ie.branch({...this.getRepo(),ref:r,checkout:!0}))}catch(n){throw this.plugin.displayError(n),n}}async deleteBranch(r){try{await this.wrapFS(ie.deleteBranch({...this.getRepo(),ref:r}))}catch(n){throw this.plugin.displayError(n),n}}branchIsMerged(r){return Promise.resolve(!0)}async init(){try{await this.wrapFS(ie.init(this.getRepo()))}catch(r){throw this.plugin.displayError(r),r}}async clone(r,n,i){let a=this.showNotice("Initializing clone");try{await this.wrapFS(ie.clone({...this.getRepo(),dir:n,url:r,depth:i,onProgress:s=>{a!==void 0&&(a.noticeEl.innerText=this.getProgressText("Cloning",s))}})),a==null||a.hide()}catch(s){throw a==null||a.hide(),this.plugin.displayError(s),s}}async setConfig(r,n){try{return this.wrapFS(ie.setConfig({...this.getRepo(),path:r,value:n}))}catch(i){throw this.plugin.displayError(i),i}}async getConfig(r){try{return this.wrapFS(ie.getConfig({...this.getRepo(),path:r}))}catch(n){throw this.plugin.displayError(n),n}}async fetch(r){let n=this.showNotice("Initializing fetch");try{let i={...this.getRepo(),onProgress:a=>{n!==void 0&&(n.noticeEl.innerText=this.getProgressText("Fetching",a))},remote:r!=null?r:await this.getCurrentRemote()};await this.wrapFS(ie.fetch(i)),n==null||n.hide()}catch(i){throw this.plugin.displayError(i),n==null||n.hide(),i}}async setRemote(r,n){try{await this.wrapFS(ie.addRemote({...this.getRepo(),remote:r,url:n,force:!0}))}catch(i){throw this.plugin.displayError(i),i}}async getRemoteBranches(r){let n=[];return n.push(...await this.wrapFS(ie.listBranches({...this.getRepo(),remote:r}))),n.remove("HEAD"),n=n.map(i=>`${r}/${i}`),n}async getRemotes(){return(await this.wrapFS(ie.listRemotes({...this.getRepo()}))).map(r=>r.remote)}async removeRemote(r){await this.wrapFS(ie.deleteRemote({...this.getRepo(),remote:r}))}async getRemoteUrl(r){var n;return(n=(await this.wrapFS(ie.listRemotes({...this.getRepo()}))).filter(i=>i.remote==r)[0])==null?void 0:n.url}async log(r,n=!0,i,a){let s=await this.wrapFS(ie.log({...this.getRepo(),depth:i,ref:a}));return Promise.all(s.map(async o=>{let l=o.commit.message.split(` + +`);return{message:l[0],author:{name:o.commit.author.name,email:o.commit.author.email},body:l.slice(1).join(` + +`),date:new Date(o.commit.committer.timestamp).toDateString(),diff:{changed:0,files:(await this.getFileChangesCount(o.commit.parent.first(),o.oid)).map(c=>({path:c.path,status:c.type,vaultPath:this.getRelativeVaultPath(c.path),hash:o.oid}))},hash:o.oid,refs:[]}}))}updateBasePath(r){return this.getRepo().dir=r,Promise.resolve()}async updateUpstreamBranch(r){let[n,i]=Fi(r),a=await this.branchInfo();await this.wrapFS(ie.push({...this.getRepo(),remote:n,remoteRef:i})),await this.setConfig(`branch.${a.current}.merge`,`refs/heads/${i}`)}updateGitPath(r){return Promise.resolve()}async getFileChangesCount(r,n){return this.walkDifference({walkers:[ie.TREE({ref:r}),ie.TREE({ref:n})]})}async walkDifference({walkers:r,dir:n}){return await this.wrapFS(ie.walk({...this.getRepo(),trees:r,map:async function(a,[s,o]){if(!Gg(a,n))return null;if(await(s==null?void 0:s.type())==="tree"||await(o==null?void 0:o.type())==="tree")return;let l=await(s==null?void 0:s.oid()),c=await(o==null?void 0:o.oid()),u="equal";if(l!==c&&(u="M"),l===void 0&&(u="A"),c===void 0&&(u="D"),l===void 0&&c===void 0&&(console.log("Something weird happened:"),console.log(s),console.log(o)),u!=="equal")return{path:a,type:u}}}))}async getStagedFiles(r="."){return(await this.walkDifference({walkers:[ie.TREE({ref:"HEAD"}),ie.STAGE()],dir:r})).map(i=>({vaultPath:this.getRelativeVaultPath(i.path),path:i.path}))}async getUnstagedFiles(r="."){let n,i=window.setTimeout(()=>{n=new Sa.Notice("This takes longer: Getting status",this.noticeLength)},2e4);try{let a=this.getRepo(),s=await this.wrapFS(ie.walk({...a,trees:[ie.WORKDIR(),ie.STAGE()],map:async function(o,[l,c]){if(!c&&l&&await ie.isIgnored({...a,filepath:o})||!Gg(o,r))return null;let[u,f]=await Promise.all([l&&l.type(),c&&c.type()]),d=[u,f].includes("blob");if((u==="tree"||u==="special")&&!d)return;if(f==="commit")return null;if((f==="tree"||f==="special")&&!d)return;let h=f==="blob"?await c.oid():void 0,p;return u==="blob"&&f!=="blob"?p="42":u==="blob"&&(p=await l.oid()),p?p!==h?{path:o,deleted:!1}:null:{path:o,deleted:!0}}}));return window.clearTimeout(i),n==null||n.hide(),s}catch(a){throw window.clearTimeout(i),n==null||n.hide(),this.plugin.displayError(a),a}}async getDiffString(r,n=!1,i){let a=this.getRelativeVaultPath(r),s=async(c,[u])=>{if(r==c){let f=await u.oid();return(await ie.readBlob({...this.getRepo(),oid:f})).blob}};if(i){let c=await xl({...this.getRepo(),filepath:r,oid:i}).then(h=>new TextDecoder().decode(h.blob)).catch(h=>{if(!(h instanceof ie.Errors.NotFoundError))throw h}),u=await ie.readCommit({...this.getRepo(),oid:i}),f=await xl({...this.getRepo(),filepath:r,oid:u.commit.parent.first()}).then(h=>new TextDecoder().decode(h.blob)).catch(h=>{if(!(h instanceof ie.Errors.NotFoundError))throw h});return jf(a,f!=null?f:"",c!=null?c:"")}let o=(await ie.walk({...this.getRepo(),trees:[ie.STAGE()],map:s})).first(),l=new TextDecoder().decode(o);if(n){let c=await this.resolveRef("HEAD").then(f=>xl({...this.getRepo(),filepath:r,oid:f})).then(f=>new TextDecoder().decode(f.blob)).catch(f=>{if(!(f instanceof ie.Errors.NotFoundError))throw f});return jf(a,c!=null?c:"",l)}else{let c;return await this.app.vault.adapter.exists(a)?c=await this.app.vault.adapter.read(a):c="",jf(a,l,c)}}async getLastCommitTime(){let r=this.getRepo(),n=await this.resolveRef("HEAD"),a=(await ie.readCommit({...r,oid:n})).commit.committer.timestamp;return new Date(a*1e3)}getFileStatusResult(r){let n=this.status_mapping[`${r[this.HEAD]}${r[this.WORKDIR]}${r[this.STAGE]}`];return{index:n[0]=="?"?"U":n[0],workingDir:n[1]=="?"?"U":n[1],path:r[this.FILE],vaultPath:this.getRelativeVaultPath(r[this.FILE])}}async checkAuthorInfo(){let r=await this.getConfig("user.name"),n=await this.getConfig("user.email");if(!r||!n)throw Error("Git author name and email are not set. Please set both fields in the settings.")}showNotice(r,n=!0){if(!this.plugin.settings.disablePopups)return new Sa.Notice(r,n?this.noticeLength:void 0)}};function QB(e){let t=[e];return{next(){return Promise.resolve({done:t.length===0,value:t.pop()})},return(){return t=[],{}},[Symbol.asyncIterator](){return this}}}function ej(e){return e[Symbol.asyncIterator]?e[Symbol.asyncIterator]():e[Symbol.iterator]?e[Symbol.iterator]():e.next?e:QB(e)}async function tj(e,t){let r=ej(e);for(;;){let{value:n,done:i}=await r.next();if(n&&await t(n),i)break}r.return&&r.return()}async function rj(e){let t=0,r=[];await tj(e,a=>{r.push(a),t+=a.byteLength});let n=new Uint8Array(t),i=0;for(let a of r)n.set(a,i),i+=a.byteLength;return n}var nj="https://momentjs.com/docs/#/parsing/string-format/",ij="https://publish.obsidian.md/git-doc/Line+Authoring",Uf=class extends U.PluginSettingTab{constructor(r,n){super(r,n);this.plugin=n;this.lineAuthorColorSettings=new Map}get settings(){return this.plugin.settings}display(){let{containerEl:r}=this,n=this.plugin,i;n.settings.differentIntervalCommitAndPush?i="commit":i="commit-and-sync";let a=n.gitReady;r.empty(),a||(r.createEl("p",{text:"Git is not ready. When all settings are correct you can configure commit-sync, etc."}),r.createEl("br"));let s;if(a){new U.Setting(r).setName("Automatic").setHeading(),new U.Setting(r).setName("Split timers for automatic commit and sync").setDesc("Enable to use one interval for commit and another for sync.").addToggle(u=>u.setValue(n.settings.differentIntervalCommitAndPush).onChange(async f=>{n.settings.differentIntervalCommitAndPush=f,await n.saveSettings(),n.automaticsManager.reload("commit","push"),this.refreshDisplayWithDelay()})),new U.Setting(r).setName(`Auto ${i} interval (minutes)`).setDesc(`${n.settings.differentIntervalCommitAndPush?"Commit":"Commit and sync"} changes every X minutes. Set to 0 (default) to disable. (See below setting for further configuration!)`).addText(u=>{u.inputEl.type="number",this.setNonDefaultValue({text:u,settingsProperty:"autoSaveInterval"}),u.setPlaceholder(String(Ye.autoSaveInterval)),u.onChange(async f=>{f!==""?n.settings.autoSaveInterval=Number(f):n.settings.autoSaveInterval=Ye.autoSaveInterval,await n.saveSettings(),n.automaticsManager.reload("commit")})}),s=new U.Setting(r).setName(`Auto ${i} after stopping file edits`).setDesc(`Requires the ${i} interval not to be 0. + If turned on, do auto ${i} every ${vT(n.settings.autoSaveInterval)} after stopping file edits. + This also prevents auto ${i} while editing a file. If turned off, it's independent from the last file edit.`).addToggle(u=>u.setValue(n.settings.autoBackupAfterFileChange).onChange(async f=>{n.settings.autoBackupAfterFileChange=f,this.refreshDisplayWithDelay(),await n.saveSettings(),n.automaticsManager.reload("commit")})),this.mayDisableSetting(s,n.settings.setLastSaveToLastCommit),s=new U.Setting(r).setName(`Auto ${i} after latest commit`).setDesc(`If turned on, sets last auto ${i} timestamp to the latest commit timestamp. This reduces the frequency of auto ${i} when doing manual commits.`).addToggle(u=>u.setValue(n.settings.setLastSaveToLastCommit).onChange(async f=>{n.settings.setLastSaveToLastCommit=f,await n.saveSettings(),n.automaticsManager.reload("commit"),this.refreshDisplayWithDelay()})),this.mayDisableSetting(s,n.settings.autoBackupAfterFileChange),s=new U.Setting(r).setName("Auto push interval (minutes)").setDesc("Push commits every X minutes. Set to 0 (default) to disable.").addText(u=>{u.inputEl.type="number",this.setNonDefaultValue({text:u,settingsProperty:"autoPushInterval"}),u.setPlaceholder(String(Ye.autoPushInterval)),u.onChange(async f=>{f!==""?n.settings.autoPushInterval=Number(f):n.settings.autoPushInterval=Ye.autoPushInterval,await n.saveSettings(),n.automaticsManager.reload("push")})}),this.mayDisableSetting(s,!n.settings.differentIntervalCommitAndPush),new U.Setting(r).setName("Auto pull interval (minutes)").setDesc("Pull changes every X minutes. Set to 0 (default) to disable.").addText(u=>{u.inputEl.type="number",this.setNonDefaultValue({text:u,settingsProperty:"autoPullInterval"}),u.setPlaceholder(String(Ye.autoPullInterval)),u.onChange(async f=>{f!==""?n.settings.autoPullInterval=Number(f):n.settings.autoPullInterval=Ye.autoPullInterval,await n.saveSettings(),n.automaticsManager.reload("pull")})}),new U.Setting(r).setName(`Specify custom commit message on auto ${i}`).setDesc("You will get a pop up to specify your message.").addToggle(u=>u.setValue(n.settings.customMessageOnAutoBackup).onChange(async f=>{n.settings.customMessageOnAutoBackup=f,await n.saveSettings(),this.refreshDisplayWithDelay()})),s=new U.Setting(r).setName(`Commit message on auto ${i}`).setDesc("Available placeholders: {{date}} (see below), {{hostname}} (see below), {{numFiles}} (number of changed files in the commit) and {{files}} (changed files in commit message).").addTextArea(u=>{u.setPlaceholder(Ye.autoCommitMessage).onChange(async f=>{f===""?n.settings.autoCommitMessage=Ye.autoCommitMessage:n.settings.autoCommitMessage=f,await n.saveSettings()}),this.setNonDefaultValue({text:u,settingsProperty:"autoCommitMessage"})}),this.mayDisableSetting(s,n.settings.customMessageOnAutoBackup),new U.Setting(r).setName("Commit message").setHeading(),new U.Setting(r).setName("Commit message on manual commit").setDesc("Available placeholders: {{date}} (see below), {{hostname}} (see below), {{numFiles}} (number of changed files in the commit) and {{files}} (changed files in commit message).").addTextArea(u=>{u.setPlaceholder(Ye.commitMessage).onChange(async f=>{f===""?n.settings.commitMessage=Ye.commitMessage:n.settings.commitMessage=f,await n.saveSettings()}),this.setNonDefaultValue({text:u,settingsProperty:"commitMessage"})});let c=new U.Setting(r).setName("{{date}} placeholder format").addMomentFormat(u=>u.setDefaultFormat(n.settings.commitDateFormat).setValue(n.settings.commitDateFormat).onChange(async f=>{n.settings.commitDateFormat=f,await n.saveSettings()}));c.descEl.innerHTML=` + Specify custom date format. E.g. "${xm}. See Moment.js for more formats.`,new U.Setting(r).setName("{{hostname}} placeholder replacement").setDesc("Specify custom hostname for every device.").addText(u=>{var f;return u.setValue((f=n.localStorage.getHostname())!=null?f:"").onChange(d=>{n.localStorage.setHostname(d)})}),new U.Setting(r).setName("Preview commit message").addButton(u=>u.setButtonText("Preview").onClick(async()=>{let f=await n.gitManager.formatCommitMessage(n.settings.commitMessage);new U.Notice(`${f}`)})),new U.Setting(r).setName("List filenames affected by commit in the commit body").addToggle(u=>u.setValue(n.settings.listChangedFilesInMessageBody).onChange(async f=>{n.settings.listChangedFilesInMessageBody=f,await n.saveSettings()})),new U.Setting(r).setName("Pull").setHeading(),n.gitManager instanceof Ce&&new U.Setting(r).setName("Merge strategy").setDesc("Decide how to integrate commits from your remote branch into your local branch.").addDropdown(u=>{let f={merge:"Merge",rebase:"Rebase",reset:"Other sync service (Only updates the HEAD without touching the working directory)"};u.addOptions(f),u.setValue(n.settings.syncMethod),u.onChange(async d=>{n.settings.syncMethod=d,await n.saveSettings()})}),new U.Setting(r).setName("Pull on startup").setDesc("Automatically pull commits when Obsidian starts.").addToggle(u=>u.setValue(n.settings.autoPullOnBoot).onChange(async f=>{n.settings.autoPullOnBoot=f,await n.saveSettings()})),new U.Setting(r).setName("Commit-and-sync").setDesc("Commit-and-sync with default settings means staging everything -> committing -> pulling -> pushing. Ideally this is a single action that you do regularly to keep your local and remote repository in sync.").setHeading(),s=new U.Setting(r).setName("Push on commit-and-sync").setDesc(`Most of the time you want to push after committing. Turning this off turns a commit-and-sync action into commit ${n.settings.pullBeforePush?"and pull ":""}only. It will still be called commit-and-sync.`).addToggle(u=>u.setValue(!n.settings.disablePush).onChange(async f=>{n.settings.disablePush=!f,this.refreshDisplayWithDelay(),await n.saveSettings()})),new U.Setting(r).setName("Pull on commit-and-sync").setDesc(`On commit-and-sync, pull commits as well. Turning this off turns a commit-and-sync action into commit ${n.settings.disablePush?"":"and push "}only.`).addToggle(u=>u.setValue(n.settings.pullBeforePush).onChange(async f=>{n.settings.pullBeforePush=f,this.refreshDisplayWithDelay(),await n.saveSettings()})),n.gitManager instanceof Ce&&(new U.Setting(r).setName("Line author information").setHeading(),this.addLineAuthorInfoSettings())}new U.Setting(r).setName("History view").setHeading(),new U.Setting(r).setName("Show Author").setDesc("Show the author of the commit in the history view.").addDropdown(c=>{let u={hide:"Hide",full:"Full",initials:"Initials"};c.addOptions(u),c.setValue(n.settings.authorInHistoryView),c.onChange(async f=>{n.settings.authorInHistoryView=f,await n.saveSettings(),await n.refresh()})}),new U.Setting(r).setName("Show Date").setDesc("Show the date of the commit in the history view. The {{date}} placeholder format is used to display the date.").addToggle(c=>c.setValue(n.settings.dateInHistoryView).onChange(async u=>{n.settings.dateInHistoryView=u,await n.saveSettings(),await n.refresh()})),new U.Setting(r).setName("Source control view").setHeading(),new U.Setting(r).setName("Automatically refresh source control view on file changes").setDesc("On slower machines this may cause lags. If so, just disable this option.").addToggle(c=>c.setValue(n.settings.refreshSourceControl).onChange(async u=>{n.settings.refreshSourceControl=u,await n.saveSettings()})),new U.Setting(r).setName("Source control view refresh interval").setDesc("Milliseconds to wait after file change before refreshing the Source Control View.").addText(c=>{c.inputEl.type="number",this.setNonDefaultValue({text:c,settingsProperty:"refreshSourceControlTimer"}),c.setPlaceholder(String(Ye.refreshSourceControlTimer)),c.onChange(async f=>{f!==""&&Number.isInteger(Number(f))?n.settings.refreshSourceControlTimer=Math.max(Number(f),500):n.settings.refreshSourceControlTimer=Ye.refreshSourceControlTimer,await n.saveSettings(),n.setRefreshDebouncer()})}),new U.Setting(r).setName("Miscellaneous").setHeading(),n.gitManager instanceof Ce&&new U.Setting(r).setName("Diff view style").setDesc('Set the style for the diff view. Note that the actual diff in "Split" mode is not generated by Git, but the editor itself instead so it may differ from the diff generated by Git. One advantage of this is that you can edit the text in that view.').addDropdown(c=>{let u={split:"Split",git_unified:"Unified"};c.addOptions(u),c.setValue(n.settings.diffStyle),c.onChange(async f=>{n.settings.diffStyle=f,await n.saveSettings()})}),new U.Setting(r).setName("Disable informative notifications").setDesc("Disable informative notifications for git operations to minimize distraction (refer to status bar for updates).").addToggle(c=>c.setValue(n.settings.disablePopups).onChange(async u=>{n.settings.disablePopups=u,this.refreshDisplayWithDelay(),await n.saveSettings()})),new U.Setting(r).setName("Disable error notifications").setDesc("Disable errror notifications of any kind to minimize distraction (refer to status bar for updates).").addToggle(c=>c.setValue(!n.settings.showErrorNotices).onChange(async u=>{n.settings.showErrorNotices=!u,await n.saveSettings()})),n.settings.disablePopups||new U.Setting(r).setName("Hide notifications for no changes").setDesc("Don't show notifications when there are no changes to commit or push.").addToggle(c=>c.setValue(n.settings.disablePopupsForNoChanges).onChange(async u=>{n.settings.disablePopupsForNoChanges=u,await n.saveSettings()})),new U.Setting(r).setName("Show status bar").setDesc("Obsidian must be restarted for the changes to take affect.").addToggle(c=>c.setValue(n.settings.showStatusBar).onChange(async u=>{n.settings.showStatusBar=u,await n.saveSettings()})),new U.Setting(r).setName("File menu integration").setDesc('Add "Stage", "Unstage" and "Add to .gitignore" actions to the file menu.').addToggle(c=>c.setValue(n.settings.showFileMenu).onChange(async u=>{n.settings.showFileMenu=u,await n.saveSettings()})),new U.Setting(r).setName("Show branch status bar").setDesc("Obsidian must be restarted for the changes to take affect.").addToggle(c=>c.setValue(n.settings.showBranchStatusBar).onChange(async u=>{n.settings.showBranchStatusBar=u,await n.saveSettings()})),new U.Setting(r).setName("Show the count of modified files in the status bar").addToggle(c=>c.setValue(n.settings.changedFilesInStatusBar).onChange(async u=>{n.settings.changedFilesInStatusBar=u,await n.saveSettings()})),n.gitManager instanceof sn?new U.Setting(r).setName("Authentication/commit author").setHeading():new U.Setting(r).setName("Commit author").setHeading(),n.gitManager instanceof sn&&new U.Setting(r).setName("Username on your git server. E.g. your username on GitHub").addText(c=>{var u;c.setValue((u=n.localStorage.getUsername())!=null?u:""),c.onChange(f=>{n.localStorage.setUsername(f)})}),n.gitManager instanceof sn&&new U.Setting(r).setName("Password/Personal access token").setDesc("Type in your password. You won't be able to see it again.").addText(c=>{c.inputEl.autocapitalize="off",c.inputEl.autocomplete="off",c.inputEl.spellcheck=!1,c.onChange(u=>{n.localStorage.setPassword(u)})}),n.gitReady&&new U.Setting(r).setName("Author name for commit").addText(async c=>{var u;c.setValue((u=await n.gitManager.getConfig("user.name"))!=null?u:""),c.onChange(async f=>{await n.gitManager.setConfig("user.name",f==""?void 0:f)})}),n.gitReady&&new U.Setting(r).setName("Author email for commit").addText(async c=>{var u;c.setValue((u=await n.gitManager.getConfig("user.email"))!=null?u:""),c.onChange(async f=>{await n.gitManager.setConfig("user.email",f==""?void 0:f)})}),new U.Setting(r).setName("Advanced").setDesc("These settings usually don't need to be changed, but may be requried for special setups.").setHeading(),n.gitManager instanceof Ce&&(new U.Setting(r).setName("Update submodules").setDesc('"Commit-and-sync" and "pull" takes care of submodules. Missing features: Conflicted files, count of pulled/pushed/committed files. Tracking branch needs to be set for each submodule.').addToggle(c=>c.setValue(n.settings.updateSubmodules).onChange(async u=>{n.settings.updateSubmodules=u,await n.saveSettings()})),n.settings.updateSubmodules&&new U.Setting(r).setName("Submodule recurse checkout/switch").setDesc("Whenever a checkout happens on the root repository, recurse the checkout on the submodules (if the branches exist).").addToggle(c=>c.setValue(n.settings.submoduleRecurseCheckout).onChange(async u=>{n.settings.submoduleRecurseCheckout=u,await n.saveSettings()}))),n.gitManager instanceof Ce&&new U.Setting(r).setName("Custom Git binary path").addText(c=>{var u;c.setValue((u=n.localStorage.getGitPath())!=null?u:""),c.setPlaceholder("git"),c.onChange(f=>{n.localStorage.setGitPath(f),n.gitManager.updateGitPath(f||"git").catch(d=>n.displayError(d))})}),n.gitManager instanceof Ce&&new U.Setting(r).setName("Additional environment variables").setDesc("Use each line for a new environment variable in the format KEY=VALUE .").addTextArea(c=>{c.setPlaceholder("GIT_DIR=/path/to/git/dir"),c.setValue(n.localStorage.getEnvVars().join(` +`)),c.onChange(u=>{n.localStorage.setEnvVars(u.split(` +`))})}),n.gitManager instanceof Ce&&new U.Setting(r).setName("Additional PATH environment variable paths").setDesc("Use each line for one path").addTextArea(c=>{c.setValue(n.localStorage.getPATHPaths().join(` +`)),c.onChange(u=>{n.localStorage.setPATHPaths(u.split(` +`))})}),n.gitManager instanceof Ce&&new U.Setting(r).setName("Reload with new environment variables").setDesc("Removing previously added environment variables will not take effect until Obsidian is restarted.").addButton(c=>{c.setButtonText("Reload"),c.setCta(),c.onClick(async()=>{await n.gitManager.setGitInstance()})}),new U.Setting(r).setName("Custom base path (Git repository path)").setDesc(` + Sets the relative path to the vault from which the Git binary should be executed. + Mostly used to set the path to the Git repository, which is only required if the Git repository is below the vault root directory. Use "\\" instead of "/" on Windows. + `).addText(c=>{c.setValue(n.settings.basePath),c.setPlaceholder("directory/directory-with-git-repo"),c.onChange(async u=>{n.settings.basePath=u,await n.saveSettings(),n.gitManager.updateBasePath(u||"").catch(f=>n.displayError(f))})}),new U.Setting(r).setName("Custom Git directory path (Instead of '.git')").setDesc('Requires restart of Obsidian to take effect. Use "\\" instead of "/" on Windows.').addText(c=>{c.setValue(n.settings.gitDir),c.setPlaceholder(".git"),c.onChange(async u=>{n.settings.gitDir=u,await n.saveSettings()})}),new U.Setting(r).setName("Disable on this device").setDesc("Disables the plugin on this device. This setting is not synced.").addToggle(c=>c.setValue(n.localStorage.getPluginDisabled()).onChange(u=>{n.localStorage.setPluginDisabled(u),u?n.unloadPlugin():n.init({fromReload:!0}).catch(f=>n.displayError(f)),new U.Notice("Obsidian must be restarted for the changes to take affect.")})),new U.Setting(r).setName("Support").setHeading(),new U.Setting(r).setName("Donate").setDesc("If you like this Plugin, consider donating to support continued development.").addButton(c=>{c.buttonEl.outerHTML="Buy Me a Coffee at ko-fi.com"});let o=r.createDiv();o.setAttr("align","center"),o.setAttr("style","margin: var(--size-4-2)");let l=o.createEl("button");if(l.setText("Copy Debug Information"),l.onclick=async()=>{await window.navigator.clipboard.writeText(JSON.stringify({settings:this.plugin.settings,pluginVersion:this.plugin.manifest.version},null,4)),new U.Notice("Debug information copied to clipboard. May contain sensitive information!")},U.Platform.isDesktopApp){let c=r.createDiv();c.setAttr("align","center"),c.setText(`Debugging and logging: +You can always see the logs of this and every other plugin by opening the console with`);let u=r.createDiv();u.setAttr("align","center"),u.addClass("obsidian-git-shortcuts"),U.Platform.isMacOS===!0?u.createEl("kbd",{text:"CMD (\u2318) + OPTION (\u2325) + I"}):u.createEl("kbd",{text:"CTRL + SHIFT + I"})}}mayDisableSetting(r,n){n&&(r.setDisabled(n),r.setClass("obsidian-git-disabled"))}configureLineAuthorShowStatus(r){this.settings.lineAuthor.show=r,this.plugin.saveSettings(),r?this.plugin.lineAuthoringFeature.activateFeature():this.plugin.lineAuthoringFeature.deactivateFeature()}async lineAuthorSettingHandler(r,n){this.settings.lineAuthor[r]=n,await this.plugin.saveSettings(),this.plugin.lineAuthoringFeature.refreshLineAuthorViews()}beforeSaveSettings(){let r=this.settings.lineAuthor;r.authorDisplay!=="hide"&&(r.lastShownAuthorDisplay=r.authorDisplay),r.dateTimeFormatOptions!=="hide"&&(r.lastShownDateTimeFormatOptions=r.dateTimeFormatOptions)}addLineAuthorInfoSettings(){let r=new U.Setting(this.containerEl).setName("Show commit authoring information next to each line");if(this.plugin.lineAuthoringFeature.isAvailableOnCurrentPlatform()||r.setDesc("Only available on desktop currently.").setDisabled(!0),r.descEl.innerHTML=` + Feature guide and quick examples
+ The commit hash, author name and authoring date can all be individually toggled.
Hide everything, to only show the age-colored sidebar.`,r.addToggle(n=>n.setValue(this.settings.lineAuthor.show).onChange(i=>{this.configureLineAuthorShowStatus(i),this.refreshDisplayWithDelay()})),this.settings.lineAuthor.show){let n=new U.Setting(this.containerEl).setName("Follow movement and copies across files and commits").setDesc("").addDropdown(a=>{a.addOptions({inactive:"Do not follow (default)","same-commit":"Follow within same commit","all-commits":"Follow within all commits (maybe slow)"}),a.setValue(this.settings.lineAuthor.followMovement),a.onChange(s=>this.lineAuthorSettingHandler("followMovement",s))});if(n.descEl.innerHTML=` + By default (deactivated), each line only shows the newest commit where it was changed. +
+ With same commit, cut-copy-paste-ing of text is followed within the same commit and the original commit of authoring will be shown. +
+ With all commits, cut-copy-paste-ing text inbetween multiple commits will be detected. +
+ It uses git-blame and + for matches (at least ${Uu} characters) within the same (or all) commit(s), the originating commit's information is shown.`,new U.Setting(this.containerEl).setName("Show commit hash").addToggle(a=>{a.setValue(this.settings.lineAuthor.showCommitHash),a.onChange(s=>this.lineAuthorSettingHandler("showCommitHash",s))}),new U.Setting(this.containerEl).setName("Author name display").setDesc("If and how the author is displayed").addDropdown(a=>{let s={hide:"Hide",initials:"Initials (default)","first name":"First name","last name":"Last name",full:"Full name"};a.addOptions(s),a.setValue(this.settings.lineAuthor.authorDisplay),a.onChange(async o=>this.lineAuthorSettingHandler("authorDisplay",o))}),new U.Setting(this.containerEl).setName("Authoring date display").setDesc("If and how the date and time of authoring the line is displayed").addDropdown(a=>{let s={hide:"Hide",date:"Date (default)",datetime:"Date and time","natural language":"Natural language",custom:"Custom"};a.addOptions(s),a.setValue(this.settings.lineAuthor.dateTimeFormatOptions),a.onChange(async o=>{await this.lineAuthorSettingHandler("dateTimeFormatOptions",o),this.refreshDisplayWithDelay()})}),this.settings.lineAuthor.dateTimeFormatOptions==="custom"){let a=new U.Setting(this.containerEl);a.setName("Custom authoring date format").addText(s=>{s.setValue(this.settings.lineAuthor.dateTimeFormatCustomString),s.setPlaceholder("YYYY-MM-DD HH:mm"),s.onChange(async o=>{await this.lineAuthorSettingHandler("dateTimeFormatCustomString",o),a.descEl.innerHTML=this.previewCustomDateTimeDescriptionHtml(o)})}),a.descEl.innerHTML=this.previewCustomDateTimeDescriptionHtml(this.settings.lineAuthor.dateTimeFormatCustomString)}new U.Setting(this.containerEl).setName("Authoring date display timezone").addDropdown(a=>{let s={"viewer-local":"My local (default)","author-local":"Author's local",utc0000:"UTC+0000/Z"};a.addOptions(s),a.setValue(this.settings.lineAuthor.dateTimeTimezone),a.onChange(async o=>this.lineAuthorSettingHandler("dateTimeTimezone",o))}).descEl.innerHTML=` + The time-zone in which the authoring date should be shown. + Either your local time-zone (default), + the author's time-zone during commit creation or + UTC\xB100:00. + `;let i=new U.Setting(this.containerEl).setName("Oldest age in coloring");i.descEl.innerHTML=this.previewOldestAgeDescriptionHtml(this.settings.lineAuthor.coloringMaxAge)[0],i.addText(a=>{a.setPlaceholder("1y"),a.setValue(this.settings.lineAuthor.coloringMaxAge),a.onChange(async s=>{let[o,l]=this.previewOldestAgeDescriptionHtml(s);i.descEl.innerHTML=o,l&&(await this.lineAuthorSettingHandler("coloringMaxAge",s),this.refreshColorSettingsName("oldest"))})}),this.createColorSetting("newest"),this.createColorSetting("oldest"),new U.Setting(this.containerEl).setName("Text color").addText(a=>{a.setValue(this.settings.lineAuthor.textColorCss),a.onChange(async s=>{await this.lineAuthorSettingHandler("textColorCss",s)})}).descEl.innerHTML=` + The CSS color of the gutter text.
+ + It is higly recommended to use + + CSS variables + defined by themes + (e.g.
var(--text-muted)
or +
var(--text-on-accent)
, + because they automatically adapt to theme changes.
+ + See: + List of available CSS variables in Obsidian + + `,new U.Setting(this.containerEl).setName("Ignore whitespace and newlines in changes").addToggle(a=>{a.setValue(this.settings.lineAuthor.ignoreWhitespace),a.onChange(s=>this.lineAuthorSettingHandler("ignoreWhitespace",s))}).descEl.innerHTML=` + Whitespace and newlines are interpreted as + part of the document and in changes + by default (hence not ignored). + This makes the last line being shown as 'changed' + when a new subsequent line is added, + even if the previously last line's text is the same. +
+ If you don't care about purely-whitespace changes + (e.g. list nesting / quote indentation changes), + then activating this will provide more meaningful change detection. + `}}createColorSetting(r){let n=new U.Setting(this.containerEl).setName("").addText(i=>{let a=a0(r,this.settings.lineAuthor),s=a0(r,Ye.lineAuthor);i.setPlaceholder(zg(s)),i.setValue(zg(a)),i.onChange(async o=>{let l=fT(o);if(l!==void 0){let c=r==="newest"?"colorNew":"colorOld";await this.lineAuthorSettingHandler(c,l)}this.refreshColorSettingsDesc(r,l)})});this.lineAuthorColorSettings.set(r,n),this.refreshColorSettingsName(r),this.refreshColorSettingsDesc(r,a0(r,this.settings.lineAuthor))}refreshColorSettingsName(r){let n=this.lineAuthorColorSettings.get(r);if(n){let i=r==="oldest"?`oldest (${this.settings.lineAuthor.coloringMaxAge} or older)`:"newest";n.nameEl.innerText=`Color for ${i} commits`}}refreshColorSettingsDesc(r,n){let i=this.lineAuthorColorSettings.get(r);i&&(i.descEl.innerHTML=this.colorSettingPreviewDescHtml(r,this.settings.lineAuthor,n!==void 0))}colorSettingPreviewDescHtml(r,n,i){let a=i?s0(r,n):"rgba(127,127,127,0.3)",s=U.moment.unix(U.moment.now()/1e3).format("YYYY-MM-DD"),o=i?`abcdef Author Name ${s}`:"invalid color";return`Supports 'rgb(r,g,b)', 'hsl(h,s,l)', hex (#) and + named colors (e.g. 'black', 'purple'). Color preview: ${`
${o}
`}`}previewCustomDateTimeDescriptionHtml(r){let n=(0,U.moment)().format(r);return`
Format string to display the authoring date.
Currently: ${n}`}previewOldestAgeDescriptionHtml(r){let n=Gf(r);return[`The oldest age in the line author coloring. Everything older will have the same color. +
Smallest valid age is "1d". Currently: ${n!==void 0?`${n.asDays()} days`:"invalid!"}`,n]}setNonDefaultValue({settingsProperty:r,text:n}){let i=this.plugin.settings[r];Ye[r]!==i&&n.setValue(String(i))}refreshDisplayWithDelay(r=80){setTimeout(()=>this.display(),r)}};function a0(e,t){return e==="oldest"?t.colorOld:t.colorNew}function Gf(e){let t=U.moment.duration("P"+e.toUpperCase());return t.isValid()&&t.asDays()&&t.asDays()>=1?t:void 0}function IT(e,t,r){if(!(e===void 0||t===void 0||r===void 0))return`head${e}-obj${t}-path${r}`}var FT=zf.Annotation.define();function $T(e,t,r){return r.update({annotations:FT.of({key:e,la:t,lineOffsetsFromUnsavedChanges:new Map})})}function aj(e){return e.annotation(FT)}var Zs=zf.StateField.define({create:e=>{},update:(e,t)=>{var r;return(r=aj(t))!=null?r:sj(t,e)},compare:(e,t)=>(e==null?void 0:e.key)===(t==null?void 0:t.key)});function Vf(e){var a;let t=OT.sha256.create();if(!e)return t;let{la:r,key:n,lineOffsetsFromUnsavedChanges:i}=e;t.update(r==="untracked"?"t":"f"),t.update(n);for(let[s,o]of(a=i.entries())!=null?a:[])t.update([s,o]);return t}var Nr={get:void 0,save:void 0};function LT(e,t){Nr.get=e,Nr.save=t}function Wf(e){var t,r;return(r=(t=Gf(e.coloringMaxAge))==null?void 0:t.asDays())!=null?r:Gf(Ye.lineAuthor.coloringMaxAge).asDays()}function sj(e,t){if(t)return e.changes.empty||e.changes.iterChanges((r,n,i,a)=>{var p;let s=e.startState.doc,{newDoc:o}=e,l=s.lineAt(r).number,c=s.lineAt(n).number,u=o.lineAt(i).number,f=o.lineAt(a).number,d=c-l+1,h=f-u+1;for(let m=u;m<=f;m++){let v=(p=t.lineOffsetsFromUnsavedChanges.get(m))!=null?p:0,y=f===m,b=h-d;y&&(v+=b),t.lineOffsetsFromUnsavedChanges.set(m,v)}}),t}var o0=class{constructor(t){this.state=t;this.subscribeMe()}notifyLineAuthoring(t,r){if(this.view===void 0){console.warn(`Git: View is not defined for editor cache key. Unforeseen situation. id: ${t}`);return}let n=this.view.state,i=$T(t,r,n);this.view.dispatch(i)}updateToNewState(t){let r=this.lastSeenPath&&this.filepath!=this.lastSeenPath;return this.state=t,r&&(this.unsubscribeMe(this.lastSeenPath),this.subscribeMe()),this}removeIfStale(){this.view.destroyed&&this.unsubscribeMe(this.lastSeenPath)}subscribeMe(){this.filepath!==void 0&&(Xs.ifFilepathDefinedTransformSubscribers(this.filepath,t=>t.add(this)),this.lastSeenPath=this.filepath)}unsubscribeMe(t){Xs.ifFilepathDefinedTransformSubscribers(t,r=>r.delete(this))}get filepath(){var t,r;return(r=(t=this.state.field(qf.editorInfoField))==null?void 0:t.file)==null?void 0:r.path}get view(){return this.state.field(qf.editorEditorField)}},NT=DT.StateField.define({create:e=>new o0(e),update:(e,t)=>e.updateToNewState(t.state),compare:(e,t)=>e===t});g();function BT(){Ks=void 0,l0=[],Yf=0,Zf.clear(),Kf.clear(),Js.clear()}var Ks,Xf=()=>Ks;function jT(e,t){var i;let r=t.length;if(r<((i=Ks==null?void 0:Ks.length)!=null?i:0))return;Ks={gutter:e,length:r,text:t};let n=Nr.get();r!==n.gutterSpacingFallbackLength&&(n.gutterSpacingFallbackLength=r,Nr.save(n))}var l0=[],oj=15,Yf=0;function HT(e){l0[Yf]=e,Yf=(Yf+1)%oj}function UT(){return hT(l0)}var Zf=new Map,Kf=new Map,Js=new Set;g();var tC=require("@codemirror/state"),rC=require("@codemirror/view");g();var d0=require("@codemirror/view"),KT=ze(Zg()),ed=require("obsidian");g();g();var Jf={x:-10,y:-10};function GT(){Jf.x===-10&&window.addEventListener("mousedown",e=>{Jf.x=e.clientX,Jf.y=e.clientY})}function zT(){for(let e of Js)if(lj(e,Jf))return e}function lj(e,t){let{x:r,y:n,width:i,height:a}=e.getBoundingClientRect();return r<=t.x&&t.x<=r+i&&n<=t.y&&t.y<=n+a}g();var Kl={};var VT="data-commit";function WT(e,t,r){if(t.hasFocus())return;let n=zT();if(!n)return;let i=uj(n);i&&(!i.isZeroCommit&&!i.isWaitingGutter&&cj(i,e),c0("showCommitHash",e),c0("authorDisplay",e),c0("dateTimeFormatOptions",e))}function cj(e,t){t.addItem(r=>r.setTitle("Copy commit hash").setIcon("copy").setSection("obs-git-line-author-copy").onClick(n=>navigator.clipboard.writeText(e.hash)))}function c0(e,t){var l,c;let r,n,i=Kl.plugin.settings.lineAuthor,a=i[e],s=typeof a=="boolean"?a:a!=="hide",o=Ye.lineAuthor[e];if(e==="showCommitHash")r="Show commit hash",n=a;else if(e==="authorDisplay"){let u=(l=i.lastShownAuthorDisplay)!=null?l:o;r="Show author "+(s?a:u),n=s?"hide":u}else if(e==="dateTimeFormatOptions"){let u=(c=i.lastShownDateTimeFormatOptions)!=null?c:o;r="Show "+(s?a:u),r+=r.contains("date")?"":" date",n=s?"hide":u}else Ii(e);t.addItem(u=>u.setTitle(r).setSection("obs-git-line-author-configure").setChecked(s).onClick(f=>{var d,h;return(h=(d=Kl.plugin)==null?void 0:d.settingsTab)==null?void 0:h.lineAuthorSettingHandler(e,n)}))}function qT(e,t,r){r.setAttr(VT,JSON.stringify({hash:e.hash,isZeroCommit:e.isZeroCommit,isWaitingGutter:t}))}function uj(e){let t=e.getAttr(VT);return t?JSON.parse(t):void 0}g();function s0(e,t){return e==="oldest"?Qf(0,!1,t).color:Qf(void 0,!0,t).color}function Qf(e,t,r){let n=Wf(r),i=Date.now()/1e3,a=e!=null?e:0,o=(t?0:i-a)/60/60/24,l=Math.pow(Math.clamp(o/n,0,1),1/2.3),c=fj(),u=r.colorNew,f=r.colorOld,d=c?.4:1,h=u0(u.r,f.r,l)*d,p=u0(u.g,f.g,l)*d,m=u0(u.b,f.b,l)*d;return{color:`rgba(${h},${p},${m},${c?.75:.25})`,daysSinceCommit:o}}function u0(e,t,r){return e+(t-e)*r}function fj(){var e;return((e=window.app)==null?void 0:e.getTheme())==="obsidian"}function YT(e){document.body.style.setProperty("--obs-git-gutter-text",e.textColorCss)}g();function XT(e,t,r){let n;for(let i=t;i<=r;i++){let a=e.hashPerLine[i],s=e.commits.get(a);(!n||s.isZeroCommit||dj(s,n))&&(n=s)}return n}function dj(e,t){var i,a,s,o;let r=(a=(i=e.author)==null?void 0:i.epochSeconds)!=null?a:0,n=(o=(s=t.author)==null?void 0:s.epochSeconds)!=null?o:0;return r>n}var ZT="-",hj="+",pj=3,mj="*",gj=/\S/g,vj="%",Qs=class e extends d0.GutterMarker{constructor(r){super();this.text=r}eq(r){return r instanceof e&&this.text===r.text}toDOM(){return document.createTextNode(this.text)}destroy(r){r&&(document.body.contains(r)||r.remove())}},f0=class extends d0.GutterMarker{constructor(r,n,i,a,s,o){super();this.lineAuthoring=r;this.startLine=n;this.endLine=i;this.key=a;this.settings=s;this.options=o;this.point=!1;this.elementClass="obs-git-blame-gutter"}eq(r){return this.key===(r==null?void 0:r.key)&&this.startLine===(r==null?void 0:r.startLine)&&this.endLine===(r==null?void 0:r.endLine)&&(this==null?void 0:this.options)===(r==null?void 0:r.options)}toDOM(){var r;return this.precomputedDomProvider=(r=this.precomputedDomProvider)!=null?r:this.computeDom(),this.precomputedDomProvider()}destroy(r){r&&(document.body.contains(r)||(Js.delete(r),r.remove()))}computeDom(){let r=XT(this.lineAuthoring,this.startLine,this.endLine),n=r.isZeroCommit?"":this.renderNonZeroCommit(r);return!r.isZeroCommit&&this.options!=="waiting-for-result"?jT(this,n):n=this.adaptTextForFakeCommit(r,n,this.options),this.createHtmlNode(r,n,this.options==="waiting-for-result")}createHtmlNode(r,n,i){var c;let a=window.createDiv();a.innerText=n;let{color:s,daysSinceCommit:o}=Qf((c=r==null?void 0:r.author)==null?void 0:c.epochSeconds,r==null?void 0:r.isZeroCommit,this.settings);a.style.backgroundColor=s,qT(r,i,a);function l(){let u=a.cloneNode(!0);return Js.add(u),i||HT(o),u}return l}renderNonZeroCommit(r){let n=this.settings.showCommitHash?this.renderHash(r):"",i=this.settings.authorDisplay==="hide"?"":`${this.renderAuthorName(r,this.settings.authorDisplay)}`,a=this.settings.dateTimeFormatOptions==="hide"?"":`${this.renderAuthoringDate(r,this.settings.dateTimeFormatOptions,this.settings.dateTimeFormatCustomString,this.settings.dateTimeTimezone)}`;return[n,i,a].filter(o=>o.length>=1).join(" ")}renderHash(r){return r.hash.substring(0,6)}renderAuthorName(r,n){var o,l,c,u;let i=(l=(o=r==null?void 0:r.author)==null?void 0:o.name)!=null?l:"",a=i.split(" ").filter(f=>f.length>=1),s;switch(n){case"initials":s=a.map(f=>f[0].toUpperCase()).join("");break;case"first name":s=(c=a.first())!=null?c:ZT;break;case"last name":s=(u=a.last())!=null?u:ZT;break;case"full":s=i;break;default:return Ii(n)}return pT(r==null?void 0:r.author,r==null?void 0:r.committer)||(s=s+mj),s}renderAuthoringDate(r,n,i,a){var c;let s="?";if(((c=r==null?void 0:r.author)==null?void 0:c.epochSeconds)===void 0)return s;let o;switch(n){case"date":o=Hu;break;case"datetime":o=_m;break;case"custom":o=i;break;case"natural language":o=u=>{let f=u.diff((0,ed.moment)());return ed.moment.duration(f).humanize(!0)};break;default:return Ii(n)}let l=ed.moment.unix(r.author.epochSeconds);switch(a){case"viewer-local":break;case"author-local":l=l.utcOffset(r.author.tz),typeof o=="string"&&(o+=" Z");break;case"utc0000":l=l.utc(),typeof o=="string"&&(o+="[Z]");break;default:return Ii(a)}return typeof o=="string"?l.format(o):o(l)}adaptTextForFakeCommit(r,n,i){var l,c,u,f;let a=(c=(l=Xf())==null?void 0:l.text)!=null?c:n,s=i!=="waiting-for-result"&&r.isZeroCommit?hj:vj;n=a.replace(gj,s);let o=(f=(u=Nr.get())==null?void 0:u.gutterSpacingFallbackLength)!=null?f:n.length;if(n=mT(n,o,s),i!=="waiting-for-result"&&r.isZeroCommit){let d=Math.min(o,pj);n=gT(n,o-d)}return n}};function Ea(e,t,r,n,i,a){let s=KT.sha256.create();s.update(Object.values(i).join(",")),s.update(`s${t}-e${r}-k${n}-o${a}`);let o=s.hex(),l=Zf.get(o);if(l)return l;let c=new f0(e,t,r,n,i,a);return Zf.set(o,c),c}g();var JT=require("obsidian");function h0(){var t,r;let e=(r=(t=Nr.get())==null?void 0:t.gutterSpacingFallbackLength)!=null?r:Ye.lineAuthor.gutterSpacingFallbackLength;return new Qs(Array(e).fill("-").join(""))}function p0(e){let{lineAuthoring:t,ageForInitialRender:r}=yj(e);return Ea(t,1,1,"initialGutter"+r,e,"waiting-for-result")}function yj(e){var a;let t=(a=UT())!=null?a:Wf(e)*.25,r=(0,JT.moment)().add(-t,"days"),n={name:"",epochSeconds:dT(r),tz:"+0000"},i={hash:"waiting-for-result",author:n,committer:n,isZeroCommit:!1};return{lineAuthoring:{hashPerLine:[void 0,"waiting-for-result"],commits:new Map([["waiting-for-result",i]])},ageForInitialRender:t}}g();function QT(e,t){return Ea({hashPerLine:[void 0,"000000"],commits:new Map([["000000",ST]])},1,1,e,t)}var m0=new Qs(""),nC=(0,rC.gutter)({class:"line-author-gutter-container",markers(e){let t=e.state.field(Zs,!1);return wj(e,t)},lineMarkerChange(e){let t=Vf(e.state.field(Zs));return Vf(e.startState.field(Zs))!==t},renderEmptyElements:!0,initialSpacer:e=>(eC(e),h0()),updateSpacer:(e,t)=>{var r,n;return eC(t.view),(n=(r=Xf())==null?void 0:r.gutter)!=null?n:h0()}});function wj(e,t){let r=Vf(t),n=e.state.doc,i=new Map;for(let u=1;u<=n.lines;u++){let f=n.line(u).from,d=e.lineBlockAt(f).to;i.set(u,[f,d]),r.update([f,d,0])}let a=Nr.get();r.update("s"+Object.values(Nr).join(","));let s=r.hex(),o=Kf.get(s);if(o)return o;let{result:l,allowCache:c}=bj(n,i,a,t);return c&&Kf.set(s,l),l}function bj(e,t,r,n){let i=!0,a=e.lines,s=[];function o(f,d,h){return s.push(h.range(f,d))}let l=_j(a,n),c=e.length===0,u=e.iterLines(a,a+1).next().value==="";for(let f=1;f<=a;f++){let[d,h]=t.get(f),p=e.lineAt(h).number;if(c){o(d,h,m0);continue}if(f===a&&u){o(d,h,m0);continue}if(n===void 0){o(d,h,p0(r)),i=!1;continue}let{key:m,la:v}=n;if(v==="untracked"){o(d,h,QT(v,r));continue}let y=v.hashPerLine.length-1,b=l[f],x=l[p];if(x&&x>y&&o(d,h,m0),b!==void 0&&Vg(1,b,y)&&x!==void 0&&Vg(1,x,y)){o(d,h,Ea(v,b,x,m,r));continue}if(y<1){o(d,h,p0(r)),i=!1;continue}let E=Math.clamp(b!=null?b:f,1,y),_=Math.clamp(x!=null?x:p,1,y);o(d,h,Ea(v,E,_,m+"computing",r,"waiting-for-result"))}return{result:tC.RangeSet.of(s,!0),allowCache:i}}function _j(e,t){if(!(t!=null&&t.lineOffsetsFromUnsavedChanges))return Array.from(new Array(e+1),i=>i);let r=[void 0],n=0;for(let i=1;i<=e;i++){let a=t.lineOffsetsFromUnsavedChanges.get(i);n+=a!=null?a:0,r[i]=a===void 0?i-n:void 0}return r}function eC(e){e.dom.querySelectorAll(".cm-gutters").forEach(r=>{r!=null&&r.style&&(r.style.marginLeft||(r.style.marginLeft="unset"))})}var td=class{constructor(t){this.plugin=t;this.lineAuthorings=new Map}async trackChanged(t){return this.trackChangedHelper(t).catch(r=>(console.warn("Git: Error in trackChanged."+r),Promise.reject(r)))}async trackChangedHelper(t){if(t){if(t.path===void 0){console.warn("Git: Attempted to track change of undefined filepath. Unforeseen situation.");return}return this.computeLineAuthorInfo(t.path)}}destroy(){this.lineAuthorings.clear(),Xs.clear(),BT()}async computeLineAuthorInfo(t){let r=this.plugin.lineAuthoringFeature.isAvailableOnCurrentPlatform().gitManager,n=await r.submoduleAwareHeadRevisonInContainingDirectory(t),i=await r.hashObject(t),a=IT(n,i,t);if(a!==void 0){if(!this.lineAuthorings.has(a)){let s=await r.blame(t,this.plugin.settings.lineAuthor.followMovement,this.plugin.settings.lineAuthor.ignoreWhitespace);this.lineAuthorings.set(a,s)}this.notifyComputationResultToSubscribers(t,a)}}notifyComputationResultToSubscribers(t,r){Xs.ifFilepathDefinedTransformSubscribers(t,n=>n.forEach(i=>i.notifyLineAuthoring(r,this.lineAuthorings.get(r))))}},aC=iC.Prec.high([NT,Zs,nC]);var rd=class{constructor(t){this.plg=t;this.codeMirrorExtensions=[];this.handleWorkspaceLeaf=t=>{if(!this.lineAuthorInfoProvider){console.warn("Git: undefined lineAuthorInfoProvider. Unexpected situation.");return}let r=t==null?void 0:t.view;!(r instanceof Aa.MarkdownView)||r.file==null||(r==null?void 0:r.allowNoFile)===!0||this.lineAuthorInfoProvider.trackChanged(r.file).catch(console.error)}}onLoadPlugin(){this.plg.registerEditorExtension(this.codeMirrorExtensions),LT(()=>this.plg.settings.lineAuthor,t=>{this.plg.settings.lineAuthor=t,this.plg.saveSettings()})}conditionallyActivateBySettings(){this.plg.settings.lineAuthor.show&&this.activateFeature()}activateFeature(){try{if(!this.isAvailableOnCurrentPlatform().available)return;YT(this.plg.settings.lineAuthor),this.lineAuthorInfoProvider=new td(this.plg),this.createEventHandlers(),this.activateCodeMirrorExtensions(),console.log(this.plg.manifest.name+": Enabled line authoring.")}catch(t){console.warn("Git: Error while loading line authoring feature.",t),this.deactivateFeature()}}deactivateFeature(){var t;this.destroyEventHandlers(),this.deactivateCodeMirrorExtensions(),(t=this.lineAuthorInfoProvider)==null||t.destroy(),this.lineAuthorInfoProvider=void 0,console.log(this.plg.manifest.name+": Disabled line authoring.")}isAvailableOnCurrentPlatform(){return{available:this.plg.useSimpleGit&&Aa.Platform.isDesktopApp,gitManager:this.plg.gitManager instanceof Ce?this.plg.gitManager:void 0}}refreshLineAuthorViews(){this.plg.settings.lineAuthor.show&&(this.deactivateFeature(),this.activateFeature())}activateCodeMirrorExtensions(){this.codeMirrorExtensions.push(aC),this.plg.app.workspace.updateOptions(),this.plg.app.workspace.iterateAllLeaves(this.handleWorkspaceLeaf)}deactivateCodeMirrorExtensions(){for(let t of this.codeMirrorExtensions)this.codeMirrorExtensions.remove(t);this.plg.app.workspace.updateOptions()}createEventHandlers(){this.gutterContextMenuEvent=this.createGutterContextMenuHandler(),this.fileOpenEvent=this.createFileOpenEvent(),this.workspaceLeafChangeEvent=this.createWorkspaceLeafChangeEvent(),this.fileModificationEvent=this.createVaultFileModificationHandler(),this.refreshOnCssChangeEvent=this.createCssRefreshHandler(),this.fileRenameEvent=this.createFileRenameEvent(),GT(),this.plg.registerEvent(this.gutterContextMenuEvent),this.plg.registerEvent(this.refreshOnCssChangeEvent),this.plg.registerEvent(this.fileOpenEvent),this.plg.registerEvent(this.workspaceLeafChangeEvent),this.plg.registerEvent(this.fileModificationEvent),this.plg.registerEvent(this.fileRenameEvent)}destroyEventHandlers(){this.plg.app.workspace.offref(this.refreshOnCssChangeEvent),this.plg.app.workspace.offref(this.fileOpenEvent),this.plg.app.workspace.offref(this.workspaceLeafChangeEvent),this.plg.app.workspace.offref(this.refreshOnCssChangeEvent),this.plg.app.vault.offref(this.fileRenameEvent),this.plg.app.workspace.offref(this.gutterContextMenuEvent)}createFileOpenEvent(){return this.plg.app.workspace.on("file-open",t=>{var r;return void((r=this.lineAuthorInfoProvider)==null?void 0:r.trackChanged(t).catch(console.error))})}createWorkspaceLeafChangeEvent(){return this.plg.app.workspace.on("active-leaf-change",this.handleWorkspaceLeaf)}createFileRenameEvent(){return this.plg.app.vault.on("rename",(t,r)=>{var n;return t instanceof Aa.TFile&&((n=this.lineAuthorInfoProvider)==null?void 0:n.trackChanged(t))})}createVaultFileModificationHandler(){return this.plg.app.vault.on("modify",t=>{var r;return t instanceof Aa.TFile&&((r=this.lineAuthorInfoProvider)==null?void 0:r.trackChanged(t))})}createCssRefreshHandler(){return this.plg.app.workspace.on("css-change",()=>this.refreshLineAuthorViews())}createGutterContextMenuHandler(){return this.plg.app.workspace.on("editor-menu",WT)}};g();var nd=class{constructor(t){this.plugin=t;this.tasks=[]}addTask(t,r){this.tasks.push({task:t,onFinished:r!=null?r:()=>{}}),this.tasks.length===1&&this.handleTask()}handleTask(){if(this.tasks.length>0){let t=this.tasks[0];t.task().then(r=>{t.onFinished(r),this.tasks.shift(),this.handleTask()},r=>{this.plugin.displayError(r),t.onFinished(void 0),this.tasks.shift(),this.handleTask()})}}clear(){this.tasks=[]}};g();var Br=require("obsidian");var id=class{constructor(t,r){this.statusBarEl=t;this.plugin=r;this.messages=[];this.base="obsidian-git-statusbar-";this.statusBarEl.setAttribute("data-tooltip-position","top"),r.registerEvent(r.app.workspace.on("obsidian-git:refreshed",()=>{this.refreshCommitTimestamp().catch(console.error)}))}displayMessage(t,r){this.messages.push({message:`Git: ${t.slice(0,100)}`,timeout:r}),this.display()}display(){this.messages.length>0&&!this.currentMessage?(this.currentMessage=this.messages.shift(),this.statusBarEl.addClass(this.base+"message"),this.statusBarEl.ariaLabel="",this.statusBarEl.setText(this.currentMessage.message),this.lastMessageTimestamp=Date.now()):this.currentMessage?Date.now()-this.lastMessageTimestamp>=this.currentMessage.timeout&&(this.currentMessage=null,this.lastMessageTimestamp=null):this.displayState()}displayState(){switch((this.statusBarEl.getText().length>3||!this.statusBarEl.hasChildNodes())&&(this.statusBarEl.empty(),this.conflictEl=this.statusBarEl.createDiv(),this.conflictEl.setAttribute("data-tooltip-position","top"),this.conflictEl.style.float="left",this.iconEl=this.statusBarEl.createDiv(),this.iconEl.style.float="left",this.textEl=this.statusBarEl.createDiv(),this.textEl.style.float="right",this.textEl.style.marginLeft="5px"),this.plugin.localStorage.getConflict()?((0,Br.setIcon)(this.conflictEl,"alert-circle"),this.conflictEl.ariaLabel="You have merge conflicts. Resolve them and commit afterwards.",this.conflictEl.style.marginRight="5px",this.conflictEl.addClass(this.base+"conflict")):(this.conflictEl.empty(),this.conflictEl.style.marginRight=""),this.plugin.state.gitAction){case 0:this.displayFromNow();break;case 1:this.statusBarEl.ariaLabel="Checking repository status...",(0,Br.setIcon)(this.iconEl,"refresh-cw"),this.statusBarEl.addClass(this.base+"status");break;case 3:this.statusBarEl.ariaLabel="Adding files...",(0,Br.setIcon)(this.iconEl,"archive"),this.statusBarEl.addClass(this.base+"add");break;case 4:this.statusBarEl.ariaLabel="Committing changes...",(0,Br.setIcon)(this.iconEl,"git-commit"),this.statusBarEl.addClass(this.base+"commit");break;case 5:this.statusBarEl.ariaLabel="Pushing changes...",(0,Br.setIcon)(this.iconEl,"upload"),this.statusBarEl.addClass(this.base+"push");break;case 2:this.statusBarEl.ariaLabel="Pulling changes...",(0,Br.setIcon)(this.iconEl,"download"),this.statusBarEl.addClass(this.base+"pull");break;default:this.statusBarEl.ariaLabel="Failed on initialization!",(0,Br.setIcon)(this.iconEl,"alert-triangle"),this.statusBarEl.addClass(this.base+"failed-init");break}}displayFromNow(){var n;let t=this.lastCommitTimestamp,r=this.plugin.state.offlineMode;if(t){let i=(0,Br.moment)(t).fromNow();this.statusBarEl.ariaLabel=`${r?"Offline: ":""}Last Commit: ${i}`,(n=this.unPushedCommits)!=null&&n&&(this.statusBarEl.ariaLabel+=` +(${this.unPushedCommits} unpushed commits)`)}else this.statusBarEl.ariaLabel=r?"Git is offline":"Git is ready";r?(0,Br.setIcon)(this.iconEl,"globe"):(0,Br.setIcon)(this.iconEl,"check"),this.plugin.settings.changedFilesInStatusBar&&this.plugin.cachedStatus&&this.textEl.setText(this.plugin.cachedStatus.changed.length.toString()),this.statusBarEl.addClass(this.base+"idle")}async refreshCommitTimestamp(){this.lastCommitTimestamp=await this.plugin.gitManager.getLastCommitTime(),this.unPushedCommits=await this.plugin.gitManager.getUnpushedCommits()}remove(){this.statusBarEl.remove()}};g();var sd=require("obsidian"),ad=class extends sd.SuggestModal{constructor(r){super(r.app);this.plugin=r;this.resolve=null;this.setPlaceholder("Type your message and select optional the version with the added date.")}openAndGetResult(){return new Promise(r=>{this.resolve=r,this.open()})}onClose(){new Promise(r=>setTimeout(r,10)).then(()=>{this.resolve&&this.resolve(void 0)})}getSuggestions(r){let n=(0,sd.moment)().format(this.plugin.settings.commitDateFormat);return r==""&&(r="..."),[r,`${n}: ${r}`,`${r}: ${n}`]}renderSuggestion(r,n){n.innerText=r}onChooseSuggestion(r,n){this.resolve&&this.resolve(r)}};g();var sC=require("obsidian"),Jl=class{constructor(t){this.plugin=t}saveLastAuto(t,r){r==="backup"?this.plugin.localStorage.setLastAutoBackup(t.toString()):r==="pull"?this.plugin.localStorage.setLastAutoPull(t.toString()):r==="push"&&this.plugin.localStorage.setLastAutoPush(t.toString())}loadLastAuto(){var t,r,n;return{backup:new Date((t=this.plugin.localStorage.getLastAutoBackup())!=null?t:""),pull:new Date((r=this.plugin.localStorage.getLastAutoPull())!=null?r:""),push:new Date((n=this.plugin.localStorage.getLastAutoPush())!=null?n:"")}}async init(){await this.setUpAutoCommitAndSync();let t=this.loadLastAuto();if(this.plugin.settings.differentIntervalCommitAndPush&&this.plugin.settings.autoPushInterval>0){let r=this.diff(this.plugin.settings.autoPushInterval,t.push);this.startAutoPush(r)}if(this.plugin.settings.autoPullInterval>0){let r=this.diff(this.plugin.settings.autoPullInterval,t.pull);this.startAutoPull(r)}}unload(){this.clearAutoPull(),this.clearAutoPush(),this.clearAutoCommitAndSync()}reload(...t){t.contains("commit")&&(this.clearAutoCommitAndSync(),this.plugin.settings.autoSaveInterval>0&&this.startAutoCommitAndSync(this.plugin.settings.autoSaveInterval)),t.contains("push")&&(this.clearAutoPush(),this.plugin.settings.differentIntervalCommitAndPush&&this.plugin.settings.autoPushInterval>0&&this.startAutoPush(this.plugin.settings.autoPushInterval)),t.contains("pull")&&(this.clearAutoPull(),this.plugin.settings.autoPullInterval>0&&this.startAutoPull(this.plugin.settings.autoPullInterval))}async setUpAutoCommitAndSync(){if(this.plugin.settings.setLastSaveToLastCommit){this.clearAutoCommitAndSync();let t=await this.plugin.gitManager.getLastCommitTime();t&&this.saveLastAuto(t,"backup")}if(!this.timeoutIDCommitAndSync&&!this.plugin.autoCommitDebouncer){let t=this.loadLastAuto();if(this.plugin.settings.autoSaveInterval>0){let r=this.diff(this.plugin.settings.autoSaveInterval,t.backup);this.startAutoCommitAndSync(r)}}}startAutoCommitAndSync(t){let r=(t!=null?t:this.plugin.settings.autoSaveInterval)*6e4;this.plugin.settings.autoBackupAfterFileChange?t===0?this.doAutoCommitAndSync():this.plugin.autoCommitDebouncer=(0,sC.debounce)(()=>this.doAutoCommitAndSync(),r,!0):(r>2147483647&&(r=2147483647),this.timeoutIDCommitAndSync=window.setTimeout(()=>this.doAutoCommitAndSync(),r))}doAutoCommitAndSync(){this.plugin.promiseQueue.addTask(async()=>{if(this.plugin.settings.setLastSaveToLastCommit){let t=await this.plugin.gitManager.getLastCommitTime();if(t){this.saveLastAuto(t,"backup");let r=this.diff(this.plugin.settings.autoSaveInterval,t);if(r>0)return this.startAutoCommitAndSync(r),!1}}return this.plugin.settings.differentIntervalCommitAndPush?await this.plugin.commit({fromAuto:!0}):await this.plugin.commitAndSync({fromAutoBackup:!0}),!0},t=>{t!==!1&&(this.saveLastAuto(new Date,"backup"),this.startAutoCommitAndSync())})}startAutoPull(t){let r=(t!=null?t:this.plugin.settings.autoPullInterval)*6e4;r>2147483647&&(r=2147483647),this.timeoutIDPull=window.setTimeout(()=>this.doAutoPull(),r)}doAutoPull(){this.plugin.promiseQueue.addTask(()=>this.plugin.pullChangesFromRemote(),()=>{this.saveLastAuto(new Date,"pull"),this.startAutoPull()})}startAutoPush(t){let r=(t!=null?t:this.plugin.settings.autoPushInterval)*6e4;r>2147483647&&(r=2147483647),this.timeoutIDPush=window.setTimeout(()=>this.doAutoPush(),r)}doAutoPush(){this.plugin.promiseQueue.addTask(()=>this.plugin.push(),()=>{this.saveLastAuto(new Date,"push"),this.startAutoPush()})}clearAutoCommitAndSync(){var r;let t=!1;return this.timeoutIDCommitAndSync&&(window.clearTimeout(this.timeoutIDCommitAndSync),this.timeoutIDCommitAndSync=void 0,t=!0),this.plugin.autoCommitDebouncer&&((r=this.plugin.autoCommitDebouncer)==null||r.cancel(),this.plugin.autoCommitDebouncer=void 0,t=!0),t}clearAutoPull(){return this.timeoutIDPull?(window.clearTimeout(this.timeoutIDPull),this.timeoutIDPull=void 0,!0):!1}clearAutoPush(){return this.timeoutIDPush?(window.clearTimeout(this.timeoutIDPush),this.timeoutIDPush=void 0,!0):!1}diff(t,r){let i=t-Math.round((new Date().getTime()-r.getTime())/1e3/60);return Math.max(0,i)}};g();var ka=require("obsidian");g();var Ql=require("obsidian");async function oC(e,t,r){let n=await cC(t,r);if(n.result==="failure"){new Ql.Notice(n.reason);return}let{isGitHub:i,branch:a,repo:s,user:o,filePath:l}=n;if(i){let c=e.getCursor("from").line+1,u=e.getCursor("to").line+1;c===u?window.open(`https://github.com/${o}/${s}/blob/${a}/${l}?plain=1#L${c}`):window.open(`https://github.com/${o}/${s}/blob/${a}/${l}?plain=1#L${c}-L${u}`)}else new Ql.Notice("It seems like you are not using GitHub")}async function lC(e,t){let r=await cC(e,t);if(r.result==="failure"){new Ql.Notice(r.reason);return}let{isGitHub:n,branch:i,repo:a,user:s,filePath:o}=r;n?window.open(`https://github.com/${s}/${a}/commits/${i}/${o}`):new Ql.Notice("It seems like you are not using GitHub")}async function cC(e,t){let r=await t.branchInfo(),n=r.tracking,i=r.current,a,s=t.getRelativeRepoPath(e.path);if(t instanceof Ce){let l=await t.getSubmoduleOfFile(t.getRelativeRepoPath(e.path));if(l){s=l.relativeFilepath;let c=await t.git.cwd({path:l.submodule,root:!1}).status();if(n=c.tracking||void 0,i=c.current||void 0,n){let u=n.substring(0,n.indexOf("/")),f=await t.git.cwd({path:l.submodule,root:!1}).getConfig(`remote.${u}.url`,"local");if(f.value!=null)a=f.value;else return{result:"failure",reason:"Failed to get remote url of submodule"}}}}if(n==null)return{result:"failure",reason:"Remote branch is not configured"};if(i==null)return{result:"failure",reason:"Failed to get current branch name"};if(a==null){let l=n.substring(0,n.indexOf("/"));if(a=await t.getConfig(`remote.${l}.url`),a==null)return{result:"failure",reason:"Failed to get remote url"}}let o=a.match(/(?:^https:\/\/github\.com\/(.+)\/(.+?)(?:\.git)?$)|(?:^[a-zA-Z]+@github\.com:(.+)\/(.+?)(?:\.git)?$)/);if(o==null)return{result:"failure",reason:"Could not parse remote url"};{let[l,c,u,f,d]=o;return{result:"success",isGitHub:!!l,repo:u||d,user:c||f,branch:i,filePath:s}}}g();var uC=require("obsidian"),od=class extends uC.FuzzySuggestModal{constructor(t,r){super(t.app),this.plugin=t,this.changedFiles=r,this.setPlaceholder("Not supported files will be opened by default app!")}getItems(){return this.changedFiles}getItemText(t){if(t.index=="U"&&t.workingDir=="U")return`Untracked | ${t.vaultPath}`;let r="",n="";return t.workingDir!=" "&&(r=`Working Dir: ${t.workingDir} `),t.index!=" "&&(n=`Index: ${t.index}`),`${r}${n} | ${t.vaultPath}`}onChooseItem(t,r){this.plugin.app.metadataCache.getFirstLinkpathDest(t.vaultPath,"")==null?this.app.openWithDefaultApp(t.vaultPath):this.plugin.app.workspace.openLinkText(t.vaultPath,"/")}};g();var fC=require("obsidian"),ld=class extends fC.Modal{constructor(r,n){super(r);this.content=n;this.resolve=null}openAndGetReslt(){return new Promise(r=>{this.resolve=r,this.open()})}onOpen(){let{contentEl:r,titleEl:n}=this;n.setText("Edit .gitignore");let i=r.createDiv(),a=i.createEl("textarea",{text:this.content,cls:["obsidian-git-textarea"],attr:{rows:10,cols:30,wrap:"off"}});i.createEl("button",{cls:["mod-cta","obsidian-git-center-button"],text:"Save"}).addEventListener("click",()=>{this.resolve(a.value),this.close()})}onClose(){let{contentEl:r}=this;r.empty(),this.resolve&&this.resolve(void 0)}};function dC(e){let t=e.app;e.addCommand({id:"edit-gitignore",name:"Edit .gitignore",callback:async()=>{let r=e.gitManager.getRelativeVaultPath(".gitignore");await t.vault.adapter.exists(r)||await t.vault.adapter.write(r,"");let n=await t.vault.adapter.read(r),a=await new ld(t,n).openAndGetReslt();a!==void 0&&(await t.vault.adapter.write(r,a),await e.refresh())}}),e.addCommand({id:"open-git-view",name:"Open source control view",callback:async()=>{var i;let r=t.workspace.getLeavesOfType(kt.type),n;r.length===0?(n=(i=t.workspace.getRightLeaf(!1))!=null?i:t.workspace.getLeaf(),await n.setViewState({type:kt.type})):n=r.first(),await t.workspace.revealLeaf(n),t.workspace.trigger("obsidian-git:refresh")}}),e.addCommand({id:"open-history-view",name:"Open history view",callback:async()=>{var i;let r=t.workspace.getLeavesOfType(Lr.type),n;r.length===0?(n=(i=t.workspace.getRightLeaf(!1))!=null?i:t.workspace.getLeaf(),await n.setViewState({type:Lr.type})):n=r.first(),await t.workspace.revealLeaf(n),t.workspace.trigger("obsidian-git:refresh")}}),e.addCommand({id:"open-diff-view",name:"Open diff view",checkCallback:r=>{let n=t.workspace.getActiveFile();if(r)return n!==null;{let i=e.gitManager.getRelativeRepoPath(n.path,!0);e.tools.openDiff({aFile:i,aRef:""})}}}),e.addCommand({id:"view-file-on-github",name:"Open file on GitHub",editorCallback:(r,{file:n})=>{if(n)return oC(r,n,e.gitManager)}}),e.addCommand({id:"view-history-on-github",name:"Open file history on GitHub",editorCallback:(r,{file:n})=>{if(n)return lC(n,e.gitManager)}}),e.addCommand({id:"pull",name:"Pull",callback:()=>e.promiseQueue.addTask(()=>e.pullChangesFromRemote())}),e.addCommand({id:"fetch",name:"Fetch",callback:()=>e.promiseQueue.addTask(()=>e.fetch())}),e.addCommand({id:"switch-to-remote-branch",name:"Switch to remote branch",callback:()=>e.promiseQueue.addTask(()=>e.switchRemoteBranch())}),e.addCommand({id:"add-to-gitignore",name:"Add file to .gitignore",checkCallback:r=>{let n=t.workspace.getActiveFile();if(r)return n!==null;e.addFileToGitignore(n.path,n instanceof ka.TFolder).catch(i=>e.displayError(i))}}),e.addCommand({id:"push",name:"Commit-and-sync",callback:()=>e.promiseQueue.addTask(()=>e.commitAndSync({fromAutoBackup:!1}))}),e.addCommand({id:"backup-and-close",name:"Commit-and-sync and then close Obsidian",callback:()=>e.promiseQueue.addTask(async()=>{await e.commitAndSync({fromAutoBackup:!1}),window.close()})}),e.addCommand({id:"commit-push-specified-message",name:"Commit-and-sync with specific message",callback:()=>e.promiseQueue.addTask(()=>e.commitAndSync({fromAutoBackup:!1,requestCustomMessage:!0}))}),e.addCommand({id:"commit",name:"Commit all changes",callback:()=>e.promiseQueue.addTask(()=>e.commit({fromAuto:!1}))}),e.addCommand({id:"commit-specified-message",name:"Commit all changes with specific message",callback:()=>e.promiseQueue.addTask(()=>e.commit({fromAuto:!1,requestCustomMessage:!0}))}),e.addCommand({id:"commit-staged",name:"Commit staged",callback:()=>e.promiseQueue.addTask(()=>e.commit({fromAuto:!1,requestCustomMessage:!1,onlyStaged:!0}))}),ka.Platform.isDesktopApp&&e.addCommand({id:"commit-amend-staged-specified-message",name:"Amend staged",callback:()=>e.promiseQueue.addTask(()=>e.commit({fromAuto:!1,requestCustomMessage:!0,onlyStaged:!0,amend:!0}))}),e.addCommand({id:"commit-staged-specified-message",name:"Commit staged with specific message",callback:()=>e.promiseQueue.addTask(()=>e.commit({fromAuto:!1,requestCustomMessage:!0,onlyStaged:!0}))}),e.addCommand({id:"push2",name:"Push",callback:()=>e.promiseQueue.addTask(()=>e.push())}),e.addCommand({id:"stage-current-file",name:"Stage current file",checkCallback:r=>{let n=t.workspace.getActiveFile();if(r)return n!==null;e.promiseQueue.addTask(()=>e.stageFile(n))}}),e.addCommand({id:"unstage-current-file",name:"Unstage current file",checkCallback:r=>{let n=t.workspace.getActiveFile();if(r)return n!==null;e.promiseQueue.addTask(()=>e.unstageFile(n))}}),e.addCommand({id:"edit-remotes",name:"Edit remotes",callback:()=>e.editRemotes().catch(r=>e.displayError(r))}),e.addCommand({id:"remove-remote",name:"Remove remote",callback:()=>e.removeRemote().catch(r=>e.displayError(r))}),e.addCommand({id:"set-upstream-branch",name:"Set upstream branch",callback:()=>e.setUpstreamBranch().catch(r=>e.displayError(r))}),e.addCommand({id:"delete-repo",name:"CAUTION: Delete repository",callback:async()=>{await t.vault.adapter.exists(`${e.settings.basePath}/.git`)?await new $e(e,{options:["NO","YES"],placeholder:"Do you really want to delete the repository (.git directory)? plugin action cannot be undone.",onlySelection:!0}).openAndGetResult()==="YES"&&(await t.vault.adapter.rmdir(`${e.settings.basePath}/.git`,!0),new ka.Notice("Successfully deleted repository. Reloading plugin..."),e.unloadPlugin(),await e.init({fromReload:!0})):new ka.Notice("No repository found")}}),e.addCommand({id:"init-repo",name:"Initialize a new repo",callback:()=>e.createNewRepo().catch(r=>e.displayError(r))}),e.addCommand({id:"clone-repo",name:"Clone an existing remote repo",callback:()=>e.cloneNewRepo().catch(r=>e.displayError(r))}),e.addCommand({id:"list-changed-files",name:"List changed files",callback:async()=>{if(await e.isAllInitialized())try{let r=await e.updateCachedStatus();if(r.changed.length+r.staged.length>500){e.displayError("Too many changes to display");return}new od(e,r.all).open()}catch(r){e.displayError(r)}}}),e.addCommand({id:"switch-branch",name:"Switch branch",callback:()=>{e.switchBranch().catch(r=>e.displayError(r))}}),e.addCommand({id:"create-branch",name:"Create new branch",callback:()=>{e.createBranch().catch(r=>e.displayError(r))}}),e.addCommand({id:"delete-branch",name:"Delete branch",callback:()=>{e.deleteBranch().catch(r=>e.displayError(r))}}),e.addCommand({id:"discard-all",name:"CAUTION: Discard all changes",callback:async()=>{if(!await e.isAllInitialized())return!1;await new $e(e,{options:["NO","YES"],placeholder:"Do you want to discard all changes to tracked files? plugin action cannot be undone.",onlySelection:!0}).openAndGetResult()==="YES"&&e.promiseQueue.addTask(()=>e.discardAll())}}),e.addCommand({id:"raw-command",name:"Raw command",checkCallback:r=>{let n=e.gitManager;if(r)return n instanceof Ce;e.tools.runRawCommand().catch(i=>e.displayError(i))}}),e.addCommand({id:"toggle-line-author-info",name:"Toggle line author information",callback:()=>{var r;return(r=e.settingsTab)==null?void 0:r.configureLineAuthorShowStatus(!e.settings.lineAuthor.show)}})}g();var cd=class{constructor(t){this.plugin=t;this.prefix=this.plugin.manifest.id+":",this.app=t.app}migrate(){let t=["password","hostname","conflict","lastAutoPull","lastAutoBackup","lastAutoPush","gitPath","pluginDisabled"];for(let r of t){let n=localStorage.getItem(this.prefix+r);this.app.loadLocalStorage(this.prefix+r)==null&&n!=null&&n!=null&&(this.app.saveLocalStorage(this.prefix+r,n),localStorage.removeItem(this.prefix+r))}}getPassword(){return this.app.loadLocalStorage(this.prefix+"password")}setPassword(t){return this.app.saveLocalStorage(this.prefix+"password",t)}getUsername(){return this.app.loadLocalStorage(this.prefix+"username")}setUsername(t){return this.app.saveLocalStorage(this.prefix+"username",t)}getHostname(){return this.app.loadLocalStorage(this.prefix+"hostname")}setHostname(t){return this.app.saveLocalStorage(this.prefix+"hostname",t)}getConflict(){return this.app.loadLocalStorage(this.prefix+"conflict")=="true"}setConflict(t){return this.app.saveLocalStorage(this.prefix+"conflict",`${t}`)}getLastAutoPull(){return this.app.loadLocalStorage(this.prefix+"lastAutoPull")}setLastAutoPull(t){return this.app.saveLocalStorage(this.prefix+"lastAutoPull",t)}getLastAutoBackup(){return this.app.loadLocalStorage(this.prefix+"lastAutoBackup")}setLastAutoBackup(t){return this.app.saveLocalStorage(this.prefix+"lastAutoBackup",t)}getLastAutoPush(){return this.app.loadLocalStorage(this.prefix+"lastAutoPush")}setLastAutoPush(t){return this.app.saveLocalStorage(this.prefix+"lastAutoPush",t)}getGitPath(){return this.app.loadLocalStorage(this.prefix+"gitPath")}setGitPath(t){return this.app.saveLocalStorage(this.prefix+"gitPath",t)}getPATHPaths(){var t,r;return(r=(t=this.app.loadLocalStorage(this.prefix+"PATHPaths"))==null?void 0:t.split(":"))!=null?r:[]}setPATHPaths(t){return this.app.saveLocalStorage(this.prefix+"PATHPaths",t.join(":"))}getEnvVars(){var t;return JSON.parse((t=this.app.loadLocalStorage(this.prefix+"envVars"))!=null?t:"[]")}setEnvVars(t){return this.app.saveLocalStorage(this.prefix+"envVars",JSON.stringify(t))}getPluginDisabled(){return this.app.loadLocalStorage(this.prefix+"pluginDisabled")=="true"}setPluginDisabled(t){return this.app.saveLocalStorage(this.prefix+"pluginDisabled",`${t}`)}};g();var eo=require("obsidian");var ec=class{constructor(t){this.plugin=t}async hasTooBigFiles(t){let r=await this.plugin.gitManager.branchInfo(),n=r.tracking?Fi(r.tracking)[0]:null;if(!n)return!1;let i=await this.plugin.gitManager.getRemoteUrl(n);if(i!=null&&i.includes("github.com")){let a=[],s=this.plugin.gitManager;for(let o of t){let l=this.plugin.app.vault.getAbstractFileByPath(o.vaultPath),c=!1;if(l instanceof eo.TFile)l.stat.size>=1e8&&(c=!0);else{let u=await this.plugin.app.vault.adapter.stat(o.vaultPath);u&&u.size>=1e8&&(c=!0)}if(c){let u=!1;s instanceof Ce&&(u=await s.isFileTrackedByLFS(o.path)),u||a.push(o)}}if(a.length>0)return this.plugin.displayError(`Aborted commit, because the following files are too big: +- ${a.map(o=>o.vaultPath).join(` +- `)} +Please remove them or add to .gitignore.`),!0}return!1}async writeAndOpenFile(t){t!==void 0&&await this.plugin.app.vault.adapter.write(Fs,t);let r=!1;this.plugin.app.workspace.iterateAllLeaves(n=>{n.getDisplayText()!=""&&Fs.startsWith(n.getDisplayText())&&(r=!0)}),r||await this.plugin.app.workspace.openLinkText(Fs,"/",!0)}openDiff({aFile:t,bFile:r,aRef:n,bRef:i,event:a}){var l,c;let s=this.plugin.settings.diffStyle;eo.Platform.isMobileApp&&(s="git_unified");let o={aFile:t,bFile:r!=null?r:t,aRef:n,bRef:i};s=="split"?(l=nn(this.plugin.app,a))==null||l.setViewState({type:ki.type,active:!0,state:o}):s=="git_unified"&&((c=nn(this.plugin.app,a))==null||c.setViewState({type:Ti.type,active:!0,state:o}))}async runRawCommand(){let t=this.plugin.gitManager;if(!(t instanceof Ce))return;let n=await new $e(this.plugin,{placeholder:"push origin master",allowEmpty:!1}).openAndGetResult();n!==void 0&&this.plugin.promiseQueue.addTask(async()=>{let i=new eo.Notice(`Running '${n}'...`,999999);try{let a=await t.rawCommand(n);a?(i.setMessage(a),window.setTimeout(()=>i.hide(),5e3)):i.hide()}catch(a){throw i.hide(),a}})}};g();g();g();g();var je;(function(e){e.INSERT="insert",e.DELETE="delete",e.CONTEXT="context"})(je||(je={}));var hC={LINE_BY_LINE:"line-by-line",SIDE_BY_SIDE:"side-by-side"},pC={LINES:"lines",WORDS:"words",NONE:"none"},mC={WORD:"word",CHAR:"char"},Ta;(function(e){e.AUTO="auto",e.DARK="dark",e.LIGHT="light"})(Ta||(Ta={}));g();var xj=["-","[","]","/","{","}","(",")","*","+","?",".","\\","^","$","|"],Sj=RegExp("["+xj.join("\\")+"]","g");function gC(e){return e.replace(Sj,"\\$&")}function g0(e){return e&&e.replace(/\\/g,"/")}function vC(e){let t,r,n,i=0;for(t=0,n=e.length;t1?r[r.length-1]:t}function wC(e,t){return t.reduce((r,n)=>r||e.startsWith(n),!1)}var bC=["a/","b/","i/","w/","c/","o/"];function Li(e,t,r){let n=r!==void 0?[...bC,r]:bC,i=t?new RegExp(`^${gC(t)} "?(.+?)"?$`):new RegExp('^"?(.+?)"?$'),[,a=""]=i.exec(e)||[],s=n.find(l=>a.indexOf(l)===0);return(s?a.slice(s.length):a).replace(/\s+\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}(?:\.\d+)? [+-]\d{4}.*$/,"")}function Ej(e,t){return Li(e,"---",t)}function Aj(e,t){return Li(e,"+++",t)}function _C(e,t={}){let r=[],n=null,i=null,a=null,s=null,o=null,l=null,c=null,u="--- ",f="+++ ",d="@@",h=/^old mode (\d{6})/,p=/^new mode (\d{6})/,m=/^deleted file mode (\d{6})/,v=/^new file mode (\d{6})/,y=/^copy from "?(.+)"?/,b=/^copy to "?(.+)"?/,x=/^rename from "?(.+)"?/,E=/^rename to "?(.+)"?/,_=/^similarity index (\d+)%/,k=/^dissimilarity index (\d+)%/,w=/^index ([\da-z]+)\.\.([\da-z]+)\s*(\d{6})?/,A=/^Binary files (.*) and (.*) differ/,S=/^GIT binary patch/,T=/^index ([\da-z]+),([\da-z]+)\.\.([\da-z]+)/,P=/^mode (\d{6}),(\d{6})\.\.(\d{6})/,I=/^new file mode (\d{6})/,N=/^deleted file mode (\d{6}),(\d{6})/,L=e.replace(/\\ No newline at end of file/g,"").replace(/\r\n?/g,` +`).split(` +`);function ee(){i!==null&&n!==null&&(n.blocks.push(i),i=null)}function fe(){n!==null&&(!n.oldName&&l!==null&&(n.oldName=l),!n.newName&&c!==null&&(n.newName=c),n.newName&&(r.push(n),n=null)),l=null,c=null}function J(){ee(),fe(),n={blocks:[],deletedLines:0,addedLines:0}}function Q(z){ee();let Y;n!==null&&((Y=/^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@.*/.exec(z))?(n.isCombined=!1,a=parseInt(Y[1],10),o=parseInt(Y[2],10)):(Y=/^@@@ -(\d+)(?:,\d+)? -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@@.*/.exec(z))?(n.isCombined=!0,a=parseInt(Y[1],10),s=parseInt(Y[2],10),o=parseInt(Y[3],10)):(z.startsWith(d)&&console.error("Failed to parse lines, starting in 0!"),a=0,o=0,n.isCombined=!1)),i={lines:[],oldStartLine:a,oldStartLine2:s,newStartLine:o,header:z}}function Pe(z){if(n===null||i===null||a===null||o===null)return;let Y={content:z},O=n.isCombined?["+ "," +","++"]:["+"],he=n.isCombined?["- "," -","--"]:["-"];wC(z,O)?(n.addedLines++,Y.type=je.INSERT,Y.oldNumber=void 0,Y.newNumber=o++):wC(z,he)?(n.deletedLines++,Y.type=je.DELETE,Y.oldNumber=a++,Y.newNumber=void 0):(Y.type=je.CONTEXT,Y.oldNumber=a++,Y.newNumber=o++),i.lines.push(Y)}function ge(z,Y){let O=Y;for(;O{if(!z||z.startsWith("*"))return;let O,he=L[Y-1],Ge=L[Y+1],gt=L[Y+2];if(z.startsWith("diff --git")||z.startsWith("diff --combined")){if(J(),(O=/^diff --git "?([a-ciow]\/.+)"? "?([a-ciow]\/.+)"?/.exec(z))&&(l=Li(O[1],void 0,t.dstPrefix),c=Li(O[2],void 0,t.srcPrefix)),n===null)throw new Error("Where is my file !!!");n.isGitDiff=!0;return}if(z.startsWith("Binary files")&&!(n!=null&&n.isGitDiff)){if(J(),(O=/^Binary files "?([a-ciow]\/.+)"? and "?([a-ciow]\/.+)"? differ/.exec(z))&&(l=Li(O[1],void 0,t.dstPrefix),c=Li(O[2],void 0,t.srcPrefix)),n===null)throw new Error("Where is my file !!!");n.isBinary=!0;return}if((!n||!n.isGitDiff&&n&&z.startsWith(u)&&Ge.startsWith(f)&>.startsWith(d))&&J(),n!=null&&n.isTooBig)return;if(n&&(typeof t.diffMaxChanges=="number"&&n.addedLines+n.deletedLines>t.diffMaxChanges||typeof t.diffMaxLineLength=="number"&&z.length>t.diffMaxLineLength)){n.isTooBig=!0,n.addedLines=0,n.deletedLines=0,n.blocks=[],i=null;let ct=typeof t.diffTooBigMessage=="function"?t.diffTooBigMessage(r.length):"Diff too big to be displayed";Q(ct);return}if(z.startsWith(u)&&Ge.startsWith(f)||z.startsWith(f)&&he.startsWith(u)){if(n&&!n.oldName&&z.startsWith("--- ")&&(O=Ej(z,t.srcPrefix))){n.oldName=O,n.language=yC(n.oldName,n.language);return}if(n&&!n.newName&&z.startsWith("+++ ")&&(O=Aj(z,t.dstPrefix))){n.newName=O,n.language=yC(n.newName,n.language);return}}if(n&&(z.startsWith(d)||n.isGitDiff&&n.oldName&&n.newName&&!i)){Q(z);return}if(i&&(z.startsWith("+")||z.startsWith("-")||z.startsWith(" "))){Pe(z);return}let Re=!ge(z,Y);if(n===null)throw new Error("Where is my file !!!");(O=h.exec(z))?n.oldMode=O[1]:(O=p.exec(z))?n.newMode=O[1]:(O=m.exec(z))?(n.deletedFileMode=O[1],n.isDeleted=!0):(O=v.exec(z))?(n.newFileMode=O[1],n.isNew=!0):(O=y.exec(z))?(Re&&(n.oldName=O[1]),n.isCopy=!0):(O=b.exec(z))?(Re&&(n.newName=O[1]),n.isCopy=!0):(O=x.exec(z))?(Re&&(n.oldName=O[1]),n.isRename=!0):(O=E.exec(z))?(Re&&(n.newName=O[1]),n.isRename=!0):(O=A.exec(z))?(n.isBinary=!0,n.oldName=Li(O[1],void 0,t.srcPrefix),n.newName=Li(O[2],void 0,t.dstPrefix),Q("Binary file")):S.test(z)?(n.isBinary=!0,Q(z)):(O=_.exec(z))?n.unchangedPercentage=parseInt(O[1],10):(O=k.exec(z))?n.changedPercentage=parseInt(O[1],10):(O=w.exec(z))?(n.checksumBefore=O[1],n.checksumAfter=O[2],O[3]&&(n.mode=O[3])):(O=T.exec(z))?(n.checksumBefore=[O[2],O[3]],n.checksumAfter=O[1]):(O=P.exec(z))?(n.oldMode=[O[2],O[3]],n.newMode=O[1]):(O=I.exec(z))?(n.newFileMode=O[1],n.isNew=!0):(O=N.exec(z))&&(n.deletedFileMode=O[1],n.isDeleted=!0)}),ee(),fe(),r}g();g();g();function Qn(){}Qn.prototype={diff:function(t,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},i=n.callback;typeof n=="function"&&(i=n,n={}),this.options=n;var a=this;function s(m){return i?(setTimeout(function(){i(void 0,m)},0),!0):m}t=this.castInput(t),r=this.castInput(r),t=this.removeEmpty(this.tokenize(t)),r=this.removeEmpty(this.tokenize(r));var o=r.length,l=t.length,c=1,u=o+l;n.maxEditLength&&(u=Math.min(u,n.maxEditLength));var f=[{newPos:-1,components:[]}],d=this.extractCommon(f[0],r,t,0);if(f[0].newPos+1>=o&&d+1>=l)return s([{value:this.join(r),count:r.length}]);function h(){for(var m=-1*c;m<=c;m+=2){var v=void 0,y=f[m-1],b=f[m+1],x=(b?b.newPos:0)-m;y&&(f[m-1]=void 0);var E=y&&y.newPos+1=o&&x+1>=l)return s(Tj(a,v.components,r,t,a.useLongestToken));f[m]=v}c++}if(i)(function m(){setTimeout(function(){if(c>u)return i();h()||m()},0)})();else for(;c<=u;){var p=h();if(p)return p}},pushComponent:function(t,r,n){var i=t[t.length-1];i&&i.added===r&&i.removed===n?t[t.length-1]={count:i.count+1,added:r,removed:n}:t.push({count:1,added:r,removed:n})},extractCommon:function(t,r,n,i){for(var a=r.length,s=n.length,o=t.newPos,l=o-i,c=0;o+1h.length?m:h}),c.value=e.join(u)}else c.value=e.join(r.slice(o,o+c.count));o+=c.count,c.added||(l+=c.count)}}var d=t[s-1];return s>1&&typeof d.value=="string"&&(d.added||d.removed)&&e.equals("",d.value)&&(t[s-2].value+=d.value,t.pop()),t}function Cj(e){return{newPos:e.newPos,components:e.components.slice(0)}}var Pj=new Qn;function EC(e,t,r){return Pj.diff(e,t,r)}var xC=/^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/,SC=/\S/,w0=new Qn;w0.equals=function(e,t){return this.options.ignoreCase&&(e=e.toLowerCase(),t=t.toLowerCase()),e===t||this.options.ignoreWhitespace&&!SC.test(e)&&!SC.test(t)};w0.tokenize=function(e){for(var t=e.split(/([^\S\r\n]+|[()[\]{}'"\r\n]|\b)/),r=0;r{let n=e(t).trim(),i=e(r).trim();return Fj(n,i)/(n.length+i.length)}}function ro(e){function t(n,i,a=new Map){let s=1/0,o;for(let l=0;l0||o.indexB>0)&&(x=v.concat(x)),(n.length>d||i.length>h)&&(x=x.concat(b)),x}return r}var Tt={INSERTS:"d2h-ins",DELETES:"d2h-del",CONTEXT:"d2h-cntx",INFO:"d2h-info",INSERT_CHANGES:"d2h-ins d2h-change",DELETE_CHANGES:"d2h-del d2h-change"},Ca={matching:pC.NONE,matchWordsThreshold:.25,maxLineLengthHighlight:1e4,diffStyle:mC.WORD,colorScheme:Ta.LIGHT},Pn="/",TC=to(e=>e.value),$j=ro(TC);function _0(e){return e.indexOf("dev/null")!==-1}function Lj(e){return e.replace(/(]*>((.|\n)*?)<\/ins>)/g,"")}function Dj(e){return e.replace(/(]*>((.|\n)*?)<\/del>)/g,"")}function no(e){switch(e){case je.CONTEXT:return Tt.CONTEXT;case je.INSERT:return Tt.INSERTS;case je.DELETE:return Tt.DELETES}}function io(e){switch(e){case Ta.DARK:return"d2h-dark-color-scheme";case Ta.AUTO:return"d2h-auto-color-scheme";case Ta.LIGHT:default:return"d2h-light-color-scheme"}}function Nj(e){return e?2:1}function Di(e){return e.slice(0).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")}function jr(e,t,r=!0){let n=Nj(t);return{prefix:e.substring(0,n),content:r?Di(e.substring(n)):e.substring(n)}}function Pa(e){let t=g0(e.oldName),r=g0(e.newName);if(t!==r&&!_0(t)&&!_0(r)){let n=[],i=[],a=t.split(Pn),s=r.split(Pn),o=a.length,l=s.length,c=0,u=o-1,f=l-1;for(;cc&&f>c&&a[u]===s[f];)i.unshift(s[f]),u-=1,f-=1;let d=n.join(Pn),h=i.join(Pn),p=a.slice(c,u+1).join(Pn),m=s.slice(c,f+1).join(Pn);return d.length&&h.length?d+Pn+"{"+p+" \u2192 "+m+"}"+Pn+h:d.length?d+Pn+"{"+p+" \u2192 "+m+"}":h.length?"{"+p+" \u2192 "+m+"}"+Pn+h:t+" \u2192 "+r}else return _0(r)?t:r}function ao(e){return`d2h-${vC(Pa(e)).toString().slice(-6)}`}function so(e){let t="file-changed";return e.isRename||e.isCopy?t="file-renamed":e.isNew?t="file-added":e.isDeleted?t="file-deleted":e.newName!==e.oldName&&(t="file-renamed"),t}function fd(e,t,r,n={}){let{matching:i,maxLineLengthHighlight:a,matchWordsThreshold:s,diffStyle:o}=Object.assign(Object.assign({},Ca),n),l=jr(e,r,!1),c=jr(t,r,!1);if(l.content.length>a||c.content.length>a)return{oldLine:{prefix:l.prefix,content:Di(l.content)},newLine:{prefix:c.prefix,content:Di(c.content)}};let u=o==="char"?EC(l.content,c.content):AC(l.content,c.content),f=[];if(o==="word"&&i==="words"){let h=u.filter(v=>v.removed),p=u.filter(v=>v.added);$j(p,h).forEach(v=>{v[0].length===1&&v[1].length===1&&TC(v[0][0],v[1][0]){let m=p.added?"ins":p.removed?"del":null,v=f.indexOf(p)>-1?' class="d2h-change"':"",y=Di(p.value);return m!==null?`${h}<${m}${v}>${y}`:`${h}${y}`},"");return{oldLine:{prefix:l.prefix,content:Lj(d)},newLine:{prefix:c.prefix,content:Dj(d)}}}var CC="file-summary",Bj="icon",jj={colorScheme:Ca.colorScheme},dd=class{constructor(t,r={}){this.hoganUtils=t,this.config=Object.assign(Object.assign({},jj),r)}render(t){let r=t.map(n=>this.hoganUtils.render(CC,"line",{fileHtmlId:ao(n),oldName:n.oldName,newName:n.newName,fileName:Pa(n),deletedLines:"-"+n.deletedLines,addedLines:"+"+n.addedLines},{fileIcon:this.hoganUtils.template(Bj,so(n))})).join(` +`);return this.hoganUtils.render(CC,"wrapper",{colorScheme:io(this.config.colorScheme),filesNumber:t.length,files:r})}};g();var S0=Object.assign(Object.assign({},Ca),{renderNothingWhenEmpty:!1,matchingMaxComparisons:2500,maxLineSizeInBlockForComparison:200}),rc="generic",PC="line-by-line",Hj="icon",Uj="tag",nc=class{constructor(t,r={}){this.hoganUtils=t,this.config=Object.assign(Object.assign({},S0),r)}render(t){let r=t.map(n=>{let i;return n.blocks.length?i=this.generateFileHtml(n):i=this.generateEmptyDiff(),this.makeFileDiffHtml(n,i)}).join(` +`);return this.hoganUtils.render(rc,"wrapper",{colorScheme:io(this.config.colorScheme),content:r})}makeFileDiffHtml(t,r){if(this.config.renderNothingWhenEmpty&&Array.isArray(t.blocks)&&t.blocks.length===0)return"";let n=this.hoganUtils.template(PC,"file-diff"),i=this.hoganUtils.template(rc,"file-path"),a=this.hoganUtils.template(Hj,"file"),s=this.hoganUtils.template(Uj,so(t));return n.render({file:t,fileHtmlId:ao(t),diffs:r,filePath:i.render({fileDiffName:Pa(t)},{fileIcon:a,fileTag:s})})}generateEmptyDiff(){return this.hoganUtils.render(rc,"empty-diff",{contentClass:"d2h-code-line",CSSLineClass:Tt})}generateFileHtml(t){let r=ro(to(n=>jr(n.content,t.isCombined).content));return t.blocks.map(n=>{let i=this.hoganUtils.render(rc,"block-header",{CSSLineClass:Tt,blockHeader:t.isTooBig?n.header:Di(n.header),lineClass:"d2h-code-linenumber",contentClass:"d2h-code-line"});return this.applyLineGroupping(n).forEach(([a,s,o])=>{if(s.length&&o.length&&!a.length)this.applyRematchMatching(s,o,r).map(([l,c])=>{let{left:u,right:f}=this.processChangedLines(t,t.isCombined,l,c);i+=u,i+=f});else if(a.length)a.forEach(l=>{let{prefix:c,content:u}=jr(l.content,t.isCombined);i+=this.generateSingleLineHtml(t,{type:Tt.CONTEXT,prefix:c,content:u,oldNumber:l.oldNumber,newNumber:l.newNumber})});else if(s.length||o.length){let{left:l,right:c}=this.processChangedLines(t,t.isCombined,s,o);i+=l,i+=c}else console.error("Unknown state reached while processing groups of lines",a,s,o)}),i}).join(` +`)}applyLineGroupping(t){let r=[],n=[],i=[];for(let a=0;a0)&&(r.push([[],n,i]),n=[],i=[]),s.type===je.CONTEXT?r.push([[s],[],[]]):s.type===je.INSERT&&n.length===0?r.push([[],[],[s]]):s.type===je.INSERT&&n.length>0?i.push(s):s.type===je.DELETE&&n.push(s)}return(n.length||i.length)&&(r.push([[],n,i]),n=[],i=[]),r}applyRematchMatching(t,r,n){let i=t.length*r.length,a=Math.max.apply(null,[0].concat(t.concat(r).map(o=>o.content.length)));return i{let i;return n.blocks.length?i=this.generateFileHtml(n):i=this.generateEmptyDiff(),this.makeFileDiffHtml(n,i)}).join(` +`);return this.hoganUtils.render(ic,"wrapper",{colorScheme:io(this.config.colorScheme),content:r})}makeFileDiffHtml(t,r){if(this.config.renderNothingWhenEmpty&&Array.isArray(t.blocks)&&t.blocks.length===0)return"";let n=this.hoganUtils.template(Gj,"file-diff"),i=this.hoganUtils.template(ic,"file-path"),a=this.hoganUtils.template(zj,"file"),s=this.hoganUtils.template(Vj,so(t));return n.render({file:t,fileHtmlId:ao(t),diffs:r,filePath:i.render({fileDiffName:Pa(t)},{fileIcon:a,fileTag:s})})}generateEmptyDiff(){return{right:"",left:this.hoganUtils.render(ic,"empty-diff",{contentClass:"d2h-code-side-line",CSSLineClass:Tt})}}generateFileHtml(t){let r=ro(to(n=>jr(n.content,t.isCombined).content));return t.blocks.map(n=>{let i={left:this.makeHeaderHtml(n.header,t),right:this.makeHeaderHtml("")};return this.applyLineGroupping(n).forEach(([a,s,o])=>{if(s.length&&o.length&&!a.length)this.applyRematchMatching(s,o,r).map(([l,c])=>{let{left:u,right:f}=this.processChangedLines(t.isCombined,l,c);i.left+=u,i.right+=f});else if(a.length)a.forEach(l=>{let{prefix:c,content:u}=jr(l.content,t.isCombined),{left:f,right:d}=this.generateLineHtml({type:Tt.CONTEXT,prefix:c,content:u,number:l.oldNumber},{type:Tt.CONTEXT,prefix:c,content:u,number:l.newNumber});i.left+=f,i.right+=d});else if(s.length||o.length){let{left:l,right:c}=this.processChangedLines(t.isCombined,s,o);i.left+=l,i.right+=c}else console.error("Unknown state reached while processing groups of lines",a,s,o)}),i}).reduce((n,i)=>({left:n.left+i.left,right:n.right+i.right}),{left:"",right:""})}applyLineGroupping(t){let r=[],n=[],i=[];for(let a=0;a0)&&(r.push([[],n,i]),n=[],i=[]),s.type===je.CONTEXT?r.push([[s],[],[]]):s.type===je.INSERT&&n.length===0?r.push([[],[],[s]]):s.type===je.INSERT&&n.length>0?i.push(s):s.type===je.DELETE&&n.push(s)}return(n.length||i.length)&&(r.push([[],n,i]),n=[],i=[]),r}applyRematchMatching(t,r,n){let i=t.length*r.length,a=Math.max.apply(null,[0].concat(t.concat(r).map(o=>o.content.length)));return i'),n.b(` +`+r),n.b(' '),n.b(` +`+r),n.b(n.rp("'),n.b(n.v(n.f("fileName",e,t,0))),n.b(""),n.b(` +`+r),n.b(' '),n.b(` +`+r),n.b(' '),n.b(n.v(n.f("addedLines",e,t,0))),n.b(""),n.b(` +`+r),n.b(' '),n.b(n.v(n.f("deletedLines",e,t,0))),n.b(""),n.b(` +`+r),n.b(" "),n.b(` +`+r),n.b(" "),n.b(` +`+r),n.b(""),n.fl()},partials:{"'),n.b(` +`+r),n.b('
'),n.b(` +`+r),n.b(' Files changed ('),n.b(n.v(n.f("filesNumber",e,t,0))),n.b(")"),n.b(` +`+r),n.b(' hide'),n.b(` +`+r),n.b(' show'),n.b(` +`+r),n.b("
"),n.b(` +`+r),n.b('
    '),n.b(` +`+r),n.b(" "),n.b(n.t(n.f("files",e,t,0))),n.b(` +`+r),n.b("
"),n.b(` +`+r),n.b(""),n.fl()},partials:{},subs:{}});st["generic-block-header"]=new ut.Template({code:function(e,t,r){var n=this;return n.b(r=r||""),n.b(""),n.b(` +`+r),n.b(' '),n.b(` +`+r),n.b(' '),n.b(` +`+r),n.b('
'),n.s(n.f("blockHeader",e,t,1),e,t,0,156,173,"{{ }}")&&(n.rs(e,t,function(i,a,s){s.b(s.t(s.f("blockHeader",i,a,0)))}),e.pop()),n.s(n.f("blockHeader",e,t,1),e,t,1,0,0,"")||n.b(" "),n.b("
"),n.b(` +`+r),n.b(" "),n.b(` +`+r),n.b(""),n.fl()},partials:{},subs:{}});st["generic-empty-diff"]=new ut.Template({code:function(e,t,r){var n=this;return n.b(r=r||""),n.b(""),n.b(` +`+r),n.b(' '),n.b(` +`+r),n.b('
'),n.b(` +`+r),n.b(" File without changes"),n.b(` +`+r),n.b("
"),n.b(` +`+r),n.b(" "),n.b(` +`+r),n.b(""),n.fl()},partials:{},subs:{}});st["generic-file-path"]=new ut.Template({code:function(e,t,r){var n=this;return n.b(r=r||""),n.b(''),n.b(` +`+r),n.b(n.rp("'),n.b(n.v(n.f("fileDiffName",e,t,0))),n.b(""),n.b(` +`+r),n.b(n.rp(""),n.b(` +`+r),n.b('"),n.fl()},partials:{""),n.b(` +`+r),n.b(' '),n.b(` +`+r),n.b(" "),n.b(n.t(n.f("lineNumber",e,t,0))),n.b(` +`+r),n.b(" "),n.b(` +`+r),n.b(' '),n.b(` +`+r),n.b('
'),n.b(` +`+r),n.s(n.f("prefix",e,t,1),e,t,0,162,238,"{{ }}")&&(n.rs(e,t,function(i,a,s){s.b(' '),s.b(s.t(s.f("prefix",i,a,0))),s.b(""),s.b(` +`+r)}),e.pop()),n.s(n.f("prefix",e,t,1),e,t,1,0,0,"")||(n.b('  '),n.b(` +`+r)),n.s(n.f("content",e,t,1),e,t,0,371,445,"{{ }}")&&(n.rs(e,t,function(i,a,s){s.b(' '),s.b(s.t(s.f("content",i,a,0))),s.b(""),s.b(` +`+r)}),e.pop()),n.s(n.f("content",e,t,1),e,t,1,0,0,"")||(n.b('
'),n.b(` +`+r)),n.b("
"),n.b(` +`+r),n.b(" "),n.b(` +`+r),n.b(""),n.fl()},partials:{},subs:{}});st["generic-wrapper"]=new ut.Template({code:function(e,t,r){var n=this;return n.b(r=r||""),n.b('
'),n.b(` +`+r),n.b(" "),n.b(n.t(n.f("content",e,t,0))),n.b(` +`+r),n.b("
"),n.fl()},partials:{},subs:{}});st["icon-file-added"]=new ut.Template({code:function(e,t,r){var n=this;return n.b(r=r||""),n.b('"),n.fl()},partials:{},subs:{}});st["icon-file-changed"]=new ut.Template({code:function(e,t,r){var n=this;return n.b(r=r||""),n.b('"),n.fl()},partials:{},subs:{}});st["icon-file-deleted"]=new ut.Template({code:function(e,t,r){var n=this;return n.b(r=r||""),n.b('"),n.fl()},partials:{},subs:{}});st["icon-file-renamed"]=new ut.Template({code:function(e,t,r){var n=this;return n.b(r=r||""),n.b('"),n.fl()},partials:{},subs:{}});st["icon-file"]=new ut.Template({code:function(e,t,r){var n=this;return n.b(r=r||""),n.b('"),n.fl()},partials:{},subs:{}});st["line-by-line-file-diff"]=new ut.Template({code:function(e,t,r){var n=this;return n.b(r=r||""),n.b('
'),n.b(` +`+r),n.b('
'),n.b(` +`+r),n.b(" "),n.b(n.t(n.f("filePath",e,t,0))),n.b(` +`+r),n.b("
"),n.b(` +`+r),n.b('
'),n.b(` +`+r),n.b('
'),n.b(` +`+r),n.b(' '),n.b(` +`+r),n.b(' '),n.b(` +`+r),n.b(" "),n.b(n.t(n.f("diffs",e,t,0))),n.b(` +`+r),n.b(" "),n.b(` +`+r),n.b("
"),n.b(` +`+r),n.b("
"),n.b(` +`+r),n.b("
"),n.b(` +`+r),n.b("
"),n.fl()},partials:{},subs:{}});st["line-by-line-numbers"]=new ut.Template({code:function(e,t,r){var n=this;return n.b(r=r||""),n.b('
'),n.b(n.v(n.f("oldNumber",e,t,0))),n.b("
"),n.b(` +`+r),n.b('
'),n.b(n.v(n.f("newNumber",e,t,0))),n.b("
"),n.fl()},partials:{},subs:{}});st["side-by-side-file-diff"]=new ut.Template({code:function(e,t,r){var n=this;return n.b(r=r||""),n.b('
'),n.b(` +`+r),n.b('
'),n.b(` +`+r),n.b(" "),n.b(n.t(n.f("filePath",e,t,0))),n.b(` +`+r),n.b("
"),n.b(` +`+r),n.b('
'),n.b(` +`+r),n.b('
'),n.b(` +`+r),n.b('
'),n.b(` +`+r),n.b(' '),n.b(` +`+r),n.b(' '),n.b(` +`+r),n.b(" "),n.b(n.t(n.d("diffs.left",e,t,0))),n.b(` +`+r),n.b(" "),n.b(` +`+r),n.b("
"),n.b(` +`+r),n.b("
"),n.b(` +`+r),n.b("
"),n.b(` +`+r),n.b('
'),n.b(` +`+r),n.b('
'),n.b(` +`+r),n.b(' '),n.b(` +`+r),n.b(' '),n.b(` +`+r),n.b(" "),n.b(n.t(n.d("diffs.right",e,t,0))),n.b(` +`+r),n.b(" "),n.b(` +`+r),n.b("
"),n.b(` +`+r),n.b("
"),n.b(` +`+r),n.b("
"),n.b(` +`+r),n.b("
"),n.b(` +`+r),n.b("
"),n.fl()},partials:{},subs:{}});st["tag-file-added"]=new ut.Template({code:function(e,t,r){var n=this;return n.b(r=r||""),n.b('ADDED'),n.fl()},partials:{},subs:{}});st["tag-file-changed"]=new ut.Template({code:function(e,t,r){var n=this;return n.b(r=r||""),n.b('CHANGED'),n.fl()},partials:{},subs:{}});st["tag-file-deleted"]=new ut.Template({code:function(e,t,r){var n=this;return n.b(r=r||""),n.b('DELETED'),n.fl()},partials:{},subs:{}});st["tag-file-renamed"]=new ut.Template({code:function(e,t,r){var n=this;return n.b(r=r||""),n.b('RENAMED'),n.fl()},partials:{},subs:{}});var sc=class{constructor({compiledTemplates:t={},rawTemplates:r={}}){let n=Object.entries(r).reduce((i,[a,s])=>{let o=C0.compile(s,{asString:!1});return Object.assign(Object.assign({},i),{[a]:o})},{});this.preCompiledTemplates=Object.assign(Object.assign(Object.assign({},st),t),n)}static compile(t){return C0.compile(t,{asString:!1})}render(t,r,n,i,a){let s=this.templateKey(t,r);try{return this.preCompiledTemplates[s].render(n,i,a)}catch(o){throw new Error(`Could not find template to render '${s}'`)}}template(t,r){return this.preCompiledTemplates[this.templateKey(t,r)]}templateKey(t,r){return`${t}-${r}`}};var qj=Object.assign(Object.assign(Object.assign({},S0),E0),{outputFormat:hC.LINE_BY_LINE,drawFileList:!0});function IC(e,t={}){let r=Object.assign(Object.assign({},qj),t),n=typeof e=="string"?_C(e,r):e,i=new sc(r),{colorScheme:a}=r,s={colorScheme:a},o=r.drawFileList?new dd(i,s).render(n):"",l=r.outputFormat==="side-by-side"?new ac(i,r).render(n):new nc(i,r).render(n);return o+l}var pd=require("obsidian");var Ra=class extends pd.ItemView{constructor(r,n){super(r);this.plugin=n;this.gettingDiff=!1;this.parser=new DOMParser,this.navigation=!0,this.gitRefreshRef=this.app.workspace.on("obsidian-git:status-changed",()=>{this.refresh().catch(console.error)})}getViewType(){return Ti.type}getDisplayText(){var r;if(((r=this.state)==null?void 0:r.bFile)!=null){let n=this.state.bFile.split("/").last();return n!=null&&n.endsWith(".md")&&(n=n.slice(0,-3)),`Diff: ${n}`}return Ti.name}getIcon(){return Ti.icon}async setState(r,n){this.state=r,pd.Platform.isMobile&&(this.leaf.view.titleEl.textContent=this.getDisplayText()),await this.refresh()}getState(){return this.state}onClose(){return this.app.workspace.offref(this.gitRefreshRef),this.app.workspace.offref(this.gitViewRefreshRef),super.onClose()}async onOpen(){return await this.refresh(),super.onOpen()}async refresh(){var r;if((r=this.state)!=null&&r.bFile&&!this.gettingDiff&&this.plugin.gitManager){this.gettingDiff=!0;try{let n=await this.plugin.gitManager.getDiffString(this.state.bFile,this.state.aRef=="HEAD",this.state.bRef);this.contentEl.empty();let i=this.plugin.gitManager.getRelativeVaultPath(this.state.bFile);if(!n){if(this.plugin.gitManager instanceof Ce&&await this.plugin.gitManager.isTracked(this.state.bFile))n=[`--- ${this.state.aFile}`,`+++ ${this.state.bFile}`,""].join(` +`);else if(await this.app.vault.adapter.exists(i)){let a=await this.app.vault.adapter.read(i);n=[...`--- /dev/null ++++ ${this.state.bFile} +@@ -0,0 +1,${a.split(` +`).length} @@`.split(` +`),...a.split(` +`).map(o=>`+${o}`)].join(` +`)}}if(n){let a=this.parser.parseFromString(IC(n),"text/html").querySelector(".d2h-file-diff");this.contentEl.append(a)}else{let a=this.contentEl.createDiv({cls:"obsidian-git-center"});a.createSpan({text:"\u26A0\uFE0F",attr:{style:"font-size: 2em"}}),a.createEl("br"),a.createSpan({text:"File not found: "+this.state.bFile})}}finally{this.gettingDiff=!1}}}};g();var ho=require("obsidian");var po=require("@codemirror/commands");g();var Me=require("@codemirror/view"),Ee=require("@codemirror/state");g();var P0="\u037C",FC=typeof Symbol=="undefined"?"__"+P0:Symbol.for(P0),R0=typeof Symbol=="undefined"?"__styleSet"+Math.floor(Math.random()*1e8):Symbol("styleSet"),$C=typeof globalThis!="undefined"?globalThis:typeof window!="undefined"?window:{},md=class{constructor(t,r){this.rules=[];let{finish:n}=r||{};function i(s){return/^@/.test(s)?[s]:s.split(/,\s*/)}function a(s,o,l,c){let u=[],f=/^@(\w+)\b/.exec(s[0]),d=f&&f[1]=="keyframes";if(f&&o==null)return l.push(s[0]+";");for(let h in o){let p=o[h];if(/&/.test(h))a(h.split(/,\s*/).map(m=>s.map(v=>m.replace(/&/,v))).reduce((m,v)=>m.concat(v)),p,l);else if(p&&typeof p=="object"){if(!f)throw new RangeError("The value of a property ("+h+") should be a primitive value.");a(i(h),p,u,d)}else p!=null&&u.push(h.replace(/_.*/,"").replace(/[A-Z]/g,m=>"-"+m.toLowerCase())+": "+p+";")}(u.length||d)&&l.push((n&&!f&&!c?s.map(n):s).join(", ")+" {"+u.join(" ")+"}")}for(let s in t)a(i(s),t[s],this.rules)}getRules(){return this.rules.join(` +`)}static newName(){let t=$C[FC]||1;return $C[FC]=t+1,P0+t.toString(36)}static mount(t,r,n){let i=t[R0],a=n&&n.nonce;i?a&&i.setNonce(a):i=new M0(t,a),i.mount(Array.isArray(r)?r:[r],t)}},LC=new Map,M0=class{constructor(t,r){let n=t.ownerDocument||t,i=n.defaultView;if(!t.head&&t.adoptedStyleSheets&&i.CSSStyleSheet){let a=LC.get(n);if(a)return t[R0]=a;this.sheet=new i.CSSStyleSheet,LC.set(n,this)}else this.styleTag=n.createElement("style"),r&&this.styleTag.setAttribute("nonce",r);this.modules=[],t[R0]=this}mount(t,r){let n=this.sheet,i=0,a=0;for(let s=0;s-1&&(this.modules.splice(l,1),a--,l=-1),l==-1){if(this.modules.splice(a++,0,o),n)for(let c=0;cc){let f=e.slice(t,r).indexOf(n.slice(i,a));if(f>-1)return[new ft(t,t+f,i,i),new ft(t+f+c,r,a,a)]}else if(c>l){let f=n.slice(i,a).indexOf(e.slice(t,r));if(f>-1)return[new ft(t,t,i,i+f),new ft(r,r,i+f+l,a)]}if(l==1||c==1)return[new ft(t,r,i,a)];let u=r3(e,t,r,n,i,a);if(u){let[f,d,h]=u;return Oa(e,t,f,n,i,d).concat(Oa(e,f+h,r,n,d+h,a))}return Xj(e,t,r,n,i,a)}var oc=1e9;function Xj(e,t,r,n,i,a){let s=r-t,o=a-i;if(oc<1e9&&Math.min(s,o)>oc*16)return Math.min(s,o)>oc*64?[new ft(t,r,i,a)]:DC(e,t,r,n,i,a);let l=Math.ceil((s+o)/2);O0.reset(l),I0.reset(l);let c=(h,p)=>e.charCodeAt(t+h)==n.charCodeAt(i+p),u=(h,p)=>e.charCodeAt(r-h-1)==n.charCodeAt(a-p-1),f=(s-o)%2!=0?I0:null,d=f?null:O0;for(let h=0;hoc)return DC(e,t,r,n,i,a);let p=O0.advance(h,s,o,l,f,!1,c)||I0.advance(h,s,o,l,d,!0,u);if(p)return Zj(e,t,r,t+p[0],n,i,a,i+p[1])}return[new ft(t,r,i,a)]}var bd=class{constructor(){this.vec=[]}reset(t){this.len=t<<1;for(let r=0;rr)this.end+=2;else if(f>n)this.start+=2;else if(a){let d=i+(r-n)-l;if(d>=0&&d=r-u)return[h,i+h-d]}else{let h=r-a.vec[d];if(u>=h)return[u,f]}}}return null}},O0=new bd,I0=new bd;function Zj(e,t,r,n,i,a,s,o){let l=!1;return!co(e,n)&&++n==r&&(l=!0),!co(i,o)&&++o==s&&(l=!0),l?[new ft(t,r,a,s)]:Oa(e,t,n,i,a,o).concat(Oa(e,n,r,i,o,s))}function t3(e,t){let r=1,n=Math.min(e,t);for(;rr||u>a||e.slice(o,c)!=n.slice(l,u)){if(s==1)return o-t-(co(e,o)?0:1);s=s>>1}else{if(c==r||u==a)return c-t;o=c,l=u}}}function B0(e,t,r,n,i,a){if(t==r||i==a||e.charCodeAt(r-1)!=n.charCodeAt(a-1))return 0;let s=t3(r-t,a-i);for(let o=r,l=a;;){let c=o-s,u=l-s;if(c>1}else{if(c==t||u==i)return r-c;o=c,l=u}}}function F0(e,t,r,n,i,a,s,o){let l=n.slice(i,a),c=null;for(;;){if(c||s=r)break;let d=e.slice(u,f),h=-1;for(;(h=l.indexOf(d,h+1))!=-1;){let p=N0(e,f,r,n,i+h+d.length,a),m=B0(e,t,u,n,i,i+h),v=d.length+p+m;(!c||c[2]>1}}function r3(e,t,r,n,i,a){let s=r-t,o=a-i;if(si.fromA-t&&n.toB>i.fromB-t&&(e[r-1]=new ft(n.fromA,i.toA,n.fromB,i.toB),e.splice(r--,1))}}function Kj(e,t,r){for(;;){n3(r,1);let n=!1;for(let i=0;i3||o>3){let l=i==e.length-1?t.length:e[i+1].fromA,c=a.fromA-n,u=l-a.toA,f=BC(t,a.fromA,Math.min(c,5)),d=NC(t,a.toA,Math.min(u,5)),h=a.fromA-f,p=d-a.toA;if(!s||!o){let m=Math.max(s,o),[v,y,b]=s?[t,a.fromA,a.toA]:[r,a.fromB,a.toB];h&&p&&(m>h&&t.slice(f,a.fromA)==v.slice(b-h,b)?(a=e[i]=new ft(f,f+s,a.fromB-h,a.toB-h),f=a.fromA,d=NC(t,a.toA,Math.min(l-a.toA,5))):m>p&&t.slice(a.toA,d)==v.slice(y,y+p)&&(a=e[i]=new ft(d-s,d,a.fromB+p,a.toB+p),d=a.toA,f=BC(t,a.fromA,Math.min(a.fromA-n,5))),h=a.fromA-f,p=d-a.toA)}if(h||p)a=e[i]=new ft(a.fromA-h,a.toA+p,a.fromB-h,a.toB+p);else if(s){if(!o){let m=HC(t,a.fromA,a.toA),v,y=m<0?-1:jC(t,a.toA,a.fromA);m>-1&&(v=m-a.fromA)<=u&&t.slice(a.fromA,m)==t.slice(a.toA,a.toA+v)?a=e[i]=a.offset(v):y>-1&&(v=a.toA-y)<=c&&t.slice(a.fromA-v,a.fromA)==t.slice(y,a.toA)&&(a=e[i]=a.offset(-v))}}else{let m=HC(r,a.fromB,a.toB),v,y=m<0?-1:jC(r,a.toB,a.fromB);m>-1&&(v=m-a.fromB)<=u&&r.slice(a.fromB,m)==r.slice(a.toB,a.toB+v)?a=e[i]=a.offset(v):y>-1&&(v=a.toB-y)<=c&&r.slice(a.fromB-v,a.fromB)==r.slice(y,a.toB)&&(a=e[i]=a.offset(-v))}n=a.toA}}return n3(e,3),e}var Ma;try{Ma=new RegExp("[\\p{Alphabetic}\\p{Number}]","u")}catch(e){}function i3(e){return e>48&&e<58||e>64&&e<91||e>96&&e<123}function a3(e,t){if(t==e.length)return 0;let r=e.charCodeAt(t);return r<192?i3(r)?1:0:Ma?!o3(r)||t==e.length-1?Ma.test(String.fromCharCode(r))?1:0:Ma.test(e.slice(t,t+2))?2:0:0}function s3(e,t){if(!t)return 0;let r=e.charCodeAt(t-1);return r<192?i3(r)?1:0:Ma?!l3(r)||t==1?Ma.test(String.fromCharCode(r))?1:0:Ma.test(e.slice(t-2,t))?2:0:0}function NC(e,t,r){if(t==e.length||!s3(e,t))return t;for(let n=t,i=t+r;;){let a=a3(e,n);if(!a)return n;if(n+=a,n>i)return t}}function BC(e,t,r){if(!t||!a3(e,t))return t;for(let n=t,i=t-r;;){let a=s3(e,n);if(!a)return n;if(n-=a,ne>=55296&&e<=56319,l3=e=>e>=56320&&e<=57343;function co(e,t){return!t||t==e.length||!o3(e.charCodeAt(t-1))||!l3(e.charCodeAt(t))}function Qj(e,t,r){var n;return oc=((n=r==null?void 0:r.scanLimit)!==null&&n!==void 0?n:1e9)>>1,Kj(e,t,Oa(e,0,e.length,t,0,t.length))}function c3(e,t,r){return Jj(Qj(e,t,r),e,t)}var Rn=Ee.Facet.define({combine:e=>e[0]}),$0=Ee.StateEffect.define(),uo=Ee.StateField.define({create(e){return null},update(e,t){for(let r of t.effects)r.is($0)&&(e=r.value);return e}});var lo=class e{constructor(t,r,n,i,a){this.changes=t,this.fromA=r,this.toA=n,this.fromB=i,this.toB=a}offset(t,r){return t||r?new e(this.changes,this.fromA+t,this.toA+t,this.fromB+r,this.toB+r):this}get endA(){return Math.max(this.fromA,this.toA-1)}get endB(){return Math.max(this.fromB,this.toB-1)}static build(t,r,n){return u3(c3(t.toString(),r.toString(),n),t,r,0,0)}static updateA(t,r,n,i,a){return WC(VC(t,i,!0,n.length),t,r,n,a)}static updateB(t,r,n,i,a){return WC(VC(t,i,!1,r.length),t,r,n,a)}};function UC(e,t,r,n){let i=r.lineAt(e),a=n.lineAt(t);return i.to==e&&a.to==t&&eu+1&&m>f+1)break;d.push(h.offset(-l+n,-c+i)),[u,f]=GC(h.toA+n,h.toB+i,t,r),s++}a.push(new lo(d,l,Math.max(l,u),c,Math.max(c,f)))}return a}var gd=1e3;function zC(e,t,r,n){let i=0,a=e.length;for(;;){if(i==a){let u=0,f=0;i&&({toA:u,toB:f}=e[i-1]);let d=t-(r?u:f);return[u+d,f+d]}let s=i+a>>1,o=e[s],[l,c]=r?[o.fromA,o.toA]:[o.fromB,o.toB];if(l>t)a=s;else if(c<=t)i=s+1;else return n?[o.fromA,o.fromB]:[o.toA,o.toB]}}function VC(e,t,r,n){let i=[];return t.iterChangedRanges((a,s,o,l)=>{let c=0,u=r?t.length:n,f=0,d=r?n:t.length;a>gd&&([c,f]=zC(e,a-gd,r,!0)),s=c?i[i.length-1]={fromA:p.fromA,fromB:p.fromB,toA:u,toB:d,diffA:p.diffA+m,diffB:p.diffB+v}:i.push({fromA:c,toA:u,fromB:f,toB:d,diffA:m,diffB:v})}),i}function WC(e,t,r,n,i){if(!e.length)return t;let a=[];for(let s=0,o=0,l=0,c=0;;s++){let u=s==e.length?null:e[s],f=u?u.fromA+o:r.length,d=u?u.fromB+l:n.length;for(;cf||v.toB+l>d)break;a.push(v.offset(o,l)),c++}if(!u)break;let h=u.toA+o+u.diffA,p=u.toB+l+u.diffB,m=c3(r.sliceString(f,h),n.sliceString(d,p),i);for(let v of u3(m,r,n,f,d))a.push(v);for(o+=u.diffA,l+=u.diffB;ch&&v.fromB+l>p)break;c++}}return a}var e7={scanLimit:500},f3=Me.ViewPlugin.fromClass(class{constructor(e){({deco:this.deco,gutter:this.gutter}=XC(e))}update(e){(e.docChanged||e.viewportChanged||t7(e.startState,e.state)||r7(e.startState,e.state))&&({deco:this.deco,gutter:this.gutter}=XC(e.view))}},{decorations:e=>e.deco}),vd=Ee.Prec.low((0,Me.gutter)({class:"cm-changeGutter",markers:e=>{var t;return((t=e.plugin(f3))===null||t===void 0?void 0:t.gutter)||Ee.RangeSet.empty}}));function t7(e,t){return e.field(uo,!1)!=t.field(uo,!1)}function r7(e,t){return e.facet(Rn)!=t.facet(Rn)}var qC=Me.Decoration.line({class:"cm-changedLine"}),n7=Me.Decoration.mark({class:"cm-changedText"}),i7=Me.Decoration.mark({tagName:"ins",class:"cm-insertedLine"}),a7=Me.Decoration.mark({tagName:"del",class:"cm-deletedLine"}),YC=new class extends Me.GutterMarker{constructor(){super(...arguments),this.elementClass="cm-changedLineGutter"}};function s7(e,t,r,n,i,a){let s=r?e.fromA:e.fromB,o=r?e.toA:e.toB,l=0;if(s!=o){i.add(s,s,qC),i.add(s,o,r?a7:i7),a&&a.add(s,s,YC);for(let c=t.iterRange(s,o-1),u=s;!c.next().done;){if(c.lineBreak){u++,i.add(u,u,qC),a&&a.add(u,u,YC);continue}let f=u+c.value.length;if(n)for(;l=c)break;(a?u.toA:u.toB)>l&&s7(u,e.state.doc,a,n,s,o)}return{deco:s.finish(),gutter:o&&o.finish()}}var oo=class extends Me.WidgetType{constructor(t){super(),this.height=t}eq(t){return this.height==t.height}toDOM(){let t=document.createElement("div");return t.className="cm-mergeSpacer",t.style.height=this.height+"px",t}updateDOM(t){return t.style.height=this.height+"px",!0}get estimatedHeight(){return this.height}ignoreEvent(){return!1}},_d=Ee.StateEffect.define({map:(e,t)=>e.map(t)}),lc=Ee.StateField.define({create:()=>Me.Decoration.none,update:(e,t)=>{for(let r of t.effects)if(r.is(_d))return r.value;return e.map(t.changes)},provide:e=>Me.EditorView.decorations.from(e)}),yd=.01;function ZC(e,t){if(e.size!=t.size)return!1;let r=e.iter(),n=t.iter();for(;r.value;){if(r.from!=n.from||Math.abs(r.value.spec.widget.height-n.value.spec.widget.height)>1)return!1;r.next(),n.next()}return!0}function o7(e,t,r){let n=new Ee.RangeSetBuilder,i=new Ee.RangeSetBuilder,a=e.state.field(lc).iter(),s=t.state.field(lc).iter(),o=0,l=0,c=0,u=0,f=e.viewport,d=t.viewport;for(let v=0;;v++){let y=vyd&&(u+=k,i.add(l,l,Me.Decoration.widget({widget:new oo(k),block:!0,side:-1})))}if(b>o+1e3&&of.from&&ld.from){let E=Math.min(f.from-o,d.from-l);o+=E,l+=E,v--}else if(y)o=y.toA,l=y.toB;else break;for(;a.value&&a.fromyd&&i.add(t.state.doc.length,t.state.doc.length,Me.Decoration.widget({widget:new oo(h),block:!0,side:1}));let p=n.finish(),m=i.finish();ZC(p,e.state.field(lc))||e.dispatch({effects:_d.of(p)}),ZC(m,t.state.field(lc))||t.dispatch({effects:_d.of(m)})}var L0=Ee.StateEffect.define({map:(e,t)=>t.mapPos(e)}),D0=class extends Me.WidgetType{constructor(t){super(),this.lines=t}eq(t){return this.lines==t.lines}toDOM(t){let r=document.createElement("div");return r.className="cm-collapsedLines",r.textContent=t.state.phrase("$ unchanged lines",this.lines),r.addEventListener("click",n=>{let i=t.posAtDOM(n.target);t.dispatch({effects:L0.of(i)});let{side:a,sibling:s}=t.state.facet(Rn);s&&s().dispatch({effects:L0.of(l7(i,t.state.field(uo),a=="a"))})}),r}ignoreEvent(t){return t instanceof MouseEvent}get estimatedHeight(){return 27}};function l7(e,t,r){let n=0,i=0;for(let a=0;;a++){let s=a=e)return i+(e-n);[n,i]=r?[s.toA,s.toB]:[s.toB,s.toA]}}var c7=Ee.StateField.define({create(e){return Me.Decoration.none},update(e,t){e=e.map(t.changes);for(let r of t.effects)r.is(L0)&&(e=e.update({filter:n=>n!=r.value}));return e},provide:e=>Me.EditorView.decorations.from(e)});function KC({margin:e=3,minSize:t=4}){return c7.init(r=>u7(r,e,t))}function u7(e,t,r){let n=new Ee.RangeSetBuilder,i=e.facet(Rn).side=="a",a=e.field(uo),s=1;for(let o=0;;o++){let l=o=r&&n.add(e.doc.line(c).from,e.doc.line(u).to,Me.Decoration.replace({widget:new D0(f),block:!0})),!l)break;s=e.doc.lineAt(Math.min(e.doc.length,i?l.toA:l.toB)).number}return n.finish()}var f7=Me.EditorView.styleModule.of(new md({".cm-mergeView":{overflowY:"auto"},".cm-mergeViewEditors":{display:"flex",alignItems:"stretch"},".cm-mergeViewEditor":{flexGrow:1,flexBasis:0,overflow:"hidden"},".cm-merge-revert":{width:"1.6em",flexGrow:0,flexShrink:0,position:"relative"},".cm-merge-revert button":{position:"absolute",display:"block",width:"100%",boxSizing:"border-box",textAlign:"center",background:"none",border:"none",font:"inherit",cursor:"pointer"}})),d7=Me.EditorView.baseTheme({".cm-mergeView & .cm-scroller, .cm-mergeView &":{height:"auto !important",overflowY:"visible !important"},"&.cm-merge-a .cm-changedLine, .cm-deletedChunk":{backgroundColor:"rgba(160, 128, 100, .08)"},"&.cm-merge-b .cm-changedLine":{backgroundColor:"rgba(100, 160, 128, .08)"},"&light.cm-merge-a .cm-changedText, &light .cm-deletedChunk .cm-deletedText":{background:"linear-gradient(#ee443366, #ee443366) bottom/100% 2px no-repeat"},"&dark.cm-merge-a .cm-changedText, &dark .cm-deletedChunk .cm-deletedText":{background:"linear-gradient(#ffaa9966, #ffaa9966) bottom/100% 2px no-repeat"},"&light.cm-merge-b .cm-changedText":{background:"linear-gradient(#22bb2266, #22bb2266) bottom/100% 2px no-repeat"},"&dark.cm-merge-b .cm-changedText":{background:"linear-gradient(#88ff8866, #88ff8866) bottom/100% 2px no-repeat"},".cm-insertedLine, .cm-deletedLine":{textDecoration:"none"},".cm-deletedChunk":{paddingLeft:"6px","& .cm-chunkButtons":{position:"absolute",insetInlineEnd:"5px"},"& button":{border:"none",cursor:"pointer",color:"white",margin:"0 2px",borderRadius:"3px","&[name=accept]":{background:"#2a2"},"&[name=reject]":{background:"#d43"}}},".cm-collapsedLines":{padding:"5px 5px 5px 10px",cursor:"pointer","&:before":{content:'"\u299A"',marginInlineEnd:"7px"},"&:after":{content:'"\u299A"',marginInlineStart:"7px"}},"&light .cm-collapsedLines":{color:"#444",background:"linear-gradient(to bottom, transparent 0, #f3f3f3 30%, #f3f3f3 70%, transparent 100%)"},"&dark .cm-collapsedLines":{color:"#ddd",background:"linear-gradient(to bottom, transparent 0, #222 30%, #222 70%, transparent 100%)"},".cm-changeGutter":{width:"3px",paddingLeft:"1px"},"&light.cm-merge-a .cm-changedLineGutter, &light .cm-deletedLineGutter":{background:"#e43"},"&dark.cm-merge-a .cm-changedLineGutter, &dark .cm-deletedLineGutter":{background:"#fa9"},"&light.cm-merge-b .cm-changedLineGutter":{background:"#2b2"},"&dark.cm-merge-b .cm-changedLineGutter":{background:"#8f8"}}),JC=new Ee.Compartment,wd=new Ee.Compartment,xd=class{constructor(t){this.revertDOM=null,this.revertToA=!1,this.revertToLeft=!1,this.measuring=-1,this.diffConf=t.diffConfig||e7;let r=[Ee.Prec.low(f3),d7,f7,lc,Me.EditorView.updateListener.of(f=>{this.measuring<0&&(f.heightChanged||f.viewportChanged)&&!f.transactions.some(d=>d.effects.some(h=>h.is(_d)))&&this.measure()})],n=[Rn.of({side:"a",sibling:()=>this.b,highlightChanges:t.highlightChanges!==!1,markGutter:t.gutter!==!1})];t.gutter!==!1&&n.push(vd);let i=Ee.EditorState.create({doc:t.a.doc,selection:t.a.selection,extensions:[t.a.extensions||[],Me.EditorView.editorAttributes.of({class:"cm-merge-a"}),wd.of(n),r]}),a=[Rn.of({side:"b",sibling:()=>this.a,highlightChanges:t.highlightChanges!==!1,markGutter:t.gutter!==!1})];t.gutter!==!1&&a.push(vd);let s=Ee.EditorState.create({doc:t.b.doc,selection:t.b.selection,extensions:[t.b.extensions||[],Me.EditorView.editorAttributes.of({class:"cm-merge-b"}),wd.of(a),r]});this.chunks=lo.build(i.doc,s.doc,this.diffConf);let o=[uo.init(()=>this.chunks),JC.of(t.collapseUnchanged?KC(t.collapseUnchanged):[])];i=i.update({effects:Ee.StateEffect.appendConfig.of(o)}).state,s=s.update({effects:Ee.StateEffect.appendConfig.of(o)}).state,this.dom=document.createElement("div"),this.dom.className="cm-mergeView",this.editorDOM=this.dom.appendChild(document.createElement("div")),this.editorDOM.className="cm-mergeViewEditors";let l=t.orientation||"a-b",c=document.createElement("div");c.className="cm-mergeViewEditor";let u=document.createElement("div");u.className="cm-mergeViewEditor",this.editorDOM.appendChild(l=="a-b"?c:u),this.editorDOM.appendChild(l=="a-b"?u:c),this.a=new Me.EditorView({state:i,parent:c,root:t.root,dispatchTransactions:f=>this.dispatch(f,this.a)}),this.b=new Me.EditorView({state:s,parent:u,root:t.root,dispatchTransactions:f=>this.dispatch(f,this.b)}),this.setupRevertControls(!!t.revertControls,t.revertControls=="b-to-a",t.renderRevertControl),t.parent&&t.parent.appendChild(this.dom),this.scheduleMeasure()}dispatch(t,r){if(t.some(n=>n.docChanged)){let n=t[t.length-1],i=t.reduce((s,o)=>s.compose(o.changes),Ee.ChangeSet.empty(t[0].startState.doc.length));this.chunks=r==this.a?lo.updateA(this.chunks,n.newDoc,this.b.state.doc,i,this.diffConf):lo.updateB(this.chunks,this.a.state.doc,n.newDoc,i,this.diffConf),r.update([...t,n.state.update({effects:$0.of(this.chunks)})]);let a=r==this.a?this.b:this.a;a.update([a.state.update({effects:$0.of(this.chunks)})]),this.scheduleMeasure()}else r.update(t)}reconfigure(t){if("diffConfig"in t&&(this.diffConf=t.diffConfig),"orientation"in t){let a=t.orientation!="b-a";if(a!=(this.editorDOM.firstChild==this.a.dom.parentNode)){let s=this.a.dom.parentNode,o=this.b.dom.parentNode;s.remove(),o.remove(),this.editorDOM.insertBefore(a?s:o,this.editorDOM.firstChild),this.editorDOM.appendChild(a?o:s),this.revertToLeft=!this.revertToLeft,this.revertDOM&&(this.revertDOM.textContent="")}}if("revertControls"in t||"renderRevertControl"in t){let a=!!this.revertDOM,s=this.revertToA,o=this.renderRevert;"revertControls"in t&&(a=!!t.revertControls,s=t.revertControls=="b-to-a"),"renderRevertControl"in t&&(o=t.renderRevertControl),this.setupRevertControls(a,s,o)}let r="highlightChanges"in t,n="gutter"in t,i="collapseUnchanged"in t;if(r||n||i){let a=[],s=[];if(r||n){let o=this.a.state.facet(Rn),l=n?t.gutter!==!1:o.markGutter,c=r?t.highlightChanges!==!1:o.highlightChanges;a.push(wd.reconfigure([Rn.of({side:"a",sibling:()=>this.b,highlightChanges:c,markGutter:l}),l?vd:[]])),s.push(wd.reconfigure([Rn.of({side:"b",sibling:()=>this.a,highlightChanges:c,markGutter:l}),l?vd:[]]))}if(i){let o=JC.reconfigure(t.collapseUnchanged?KC(t.collapseUnchanged):[]);a.push(o),s.push(o)}this.a.dispatch({effects:a}),this.b.dispatch({effects:s})}this.scheduleMeasure()}setupRevertControls(t,r,n){this.revertToA=r,this.revertToLeft=this.revertToA==(this.editorDOM.firstChild==this.a.dom.parentNode),this.renderRevert=n,!t&&this.revertDOM?(this.revertDOM.remove(),this.revertDOM=null):t&&!this.revertDOM?(this.revertDOM=this.editorDOM.insertBefore(document.createElement("div"),this.editorDOM.firstChild.nextSibling),this.revertDOM.addEventListener("mousedown",i=>this.revertClicked(i)),this.revertDOM.className="cm-merge-revert"):this.revertDOM&&(this.revertDOM.textContent="")}scheduleMeasure(){if(this.measuring<0){let t=this.dom.ownerDocument.defaultView||window;this.measuring=t.requestAnimationFrame(()=>{this.measuring=-1,this.measure()})}}measure(){o7(this.a,this.b,this.chunks),this.revertDOM&&this.updateRevertButtons()}updateRevertButtons(){let t=this.revertDOM,r=t.firstChild,n=this.a.viewport,i=this.b.viewport;for(let a=0;an.to||s.fromB>i.to)break;if(s.fromA-1&&(this.dom.ownerDocument.defaultView||window).cancelAnimationFrame(this.measuring),this.dom.remove()}};function QC(e){let t=e.nextSibling;return e.remove(),t}var Sd=require("@codemirror/search"),fo=require("@codemirror/state"),Hr=require("@codemirror/view");var Ia=class extends ho.ItemView{constructor(r,n){super(r);this.plugin=n;this.refreshing=!1;this.ignoreNextModification=!1;this.navigation=!0,this.registerEvent(this.app.workspace.on("obsidian-git:status-changed",()=>{this.mergeView?this.updateRefEditors().catch(console.error):this.createMergeView().catch(console.error)})),this.intervalRef=window.setInterval(()=>{this.mergeView&&this.updateRefEditors().catch(console.error)},30*1e3),this.registerEvent(this.app.vault.on("modify",i=>{this.state.bRef==null&&i.path===this.state.bFile&&(this.ignoreNextModification?this.ignoreNextModification=!1:this.updateModifiableEditor().catch(console.error))})),this.registerEvent(this.app.vault.on("delete",i=>{this.state.bRef==null&&i.path===this.state.bFile&&this.createMergeView().catch(console.error)})),this.registerEvent(this.app.vault.on("create",i=>{this.state.bRef==null&&i.path===this.state.bFile&&this.createMergeView().catch(console.error)})),this.registerEvent(this.app.vault.on("rename",(i,a)=>{this.state.bRef==null&&(i.path===this.state.bFile||a===this.state.bFile)&&this.createMergeView().catch(console.error)})),this.fileSaveDebouncer=(0,ho.debounce)(i=>{let a=this.state.bFile;a&&(this.ignoreNextModification=!0,this.plugin.app.vault.adapter.write(a,i).catch(s=>this.plugin.displayError(s)))},1e3,!1)}getViewType(){return ki.type}getDisplayText(){var r;if(((r=this.state)==null?void 0:r.bFile)!=null){let n=this.state.bFile.split("/").last();return n!=null&&n.endsWith(".md")&&(n=n.slice(0,-3)),`Diff: ${n}`}return ki.name}getIcon(){return ki.icon}async setState(r,n){this.state=r,ho.Platform.isMobile&&(this.leaf.view.titleEl.textContent=this.getDisplayText()),await super.setState(r,n),await this.createMergeView()}getState(){return this.state}onClose(){return window.clearInterval(this.intervalRef),super.onClose()}async onOpen(){return await this.createMergeView(),super.onOpen()}async gitShow(r,n){try{return await this.plugin.gitManager.show(r,n,!1)}catch(i){if(i instanceof wr&&(i.message.includes("does not exist")||i.message.includes("unknown revision or path")||i.message.includes("exists on disk, but not in")||i.message.includes("fatal: bad object")))return i.message.includes("fatal: bad object")&&this.plugin.displayError(i.message),"";throw i}}async bShouldBeEditable(){if(this.state.bRef!=null)return!1;let r=this.plugin.gitManager.getRelativeVaultPath(this.state.bFile);return await this.app.vault.adapter.exists(r)}async updateModifiableEditor(){if(!this.mergeView||this.refreshing)return;let r=this.mergeView.b;this.refreshing=!0;let n=await this.app.vault.adapter.read(this.state.bFile);if(n!=r.state.doc.toString()){let i=r.state.update({changes:{from:0,to:r.state.doc.length,insert:n},annotations:[fo.Transaction.remote.of(!0)]});r.dispatch(i)}this.refreshing=!1}async updateRefEditors(){if(!this.mergeView||this.refreshing)return;let r=this.mergeView.a,n=this.mergeView.b;this.refreshing=!0;let i=await this.gitShow(this.state.aRef,this.state.aFile),a;if(this.state.bRef!=null&&(a=await this.gitShow(this.state.bRef,this.state.bFile)),i!=r.state.doc.toString()){let s=r.state.update({changes:{from:0,to:r.state.doc.length,insert:i}});r.dispatch(s)}if(a!=null&&a!=n.state.doc.toString()){let s=n.state.update({changes:{from:0,to:n.state.doc.length,insert:a}});n.dispatch(s)}this.refreshing=!1}async createMergeView(){var r,n,i;if((r=this.state)!=null&&r.aFile&&((n=this.state)!=null&&n.bFile)&&!this.refreshing&&this.plugin.gitManager){this.refreshing=!0,(i=this.mergeView)==null||i.destroy();let a=this.containerEl.children[1];a.empty(),this.contentEl.addClass("git-split-diff-view"),this.bIsEditable=await this.bShouldBeEditable();let s=await this.gitShow(this.state.aRef,this.state.aFile),o;if(this.state.bRef!=null)o=await this.gitShow(this.state.bRef,this.state.bFile);else{let p=this.plugin.gitManager.getRelativeVaultPath(this.state.bFile);await this.app.vault.adapter.exists(p)?o=await this.app.vault.adapter.read(p):o=""}let l=[(0,Hr.lineNumbers)(),(0,Sd.highlightSelectionMatches)(),(0,Hr.drawSelection)(),Hr.keymap.of([...po.standardKeymap,po.indentWithTab]),(0,po.history)(),(0,Sd.search)(),Hr.EditorView.lineWrapping],c=this,u=Hr.ViewPlugin.define(p=>({update(m){if(m.docChanged&&!m.transactions.some(v=>v.annotation(fo.Transaction.remote))){let v=p.state.doc.toString();c.fileSaveDebouncer(v)}}})),f={doc:s,extensions:[...l,Hr.EditorView.editable.of(!1),fo.EditorState.readOnly.of(!0)]},d=[...l];this.bIsEditable?d.push(u):d.push(Hr.EditorView.editable.of(!1),fo.EditorState.readOnly.of(!0));let h={doc:o,extensions:d};a.addClasses(["cm-s-obsidian","mod-cm6","markdown-source-view","cm-content"]),this.mergeView=new xd({b:h,a:f,collapseUnchanged:{minSize:6,margin:4},diffConfig:{scanLimit:this.bIsEditable?1e3:1e4},parent:a}),this.refreshing=!1}}};g();var CP=require("obsidian");g();g();g();var d3="5";typeof window!="undefined"&&(window.__svelte||(window.__svelte={v:new Set})).v.add(d3);g();g();var mo="[",Fa="[!",$a="]",Ni={};var dt=Symbol(),Yt=Symbol("filename"),h3=Symbol("hmr");g();g();var h7=["allowfullscreen","async","autofocus","autoplay","checked","controls","default","disabled","formnovalidate","hidden","indeterminate","ismap","loop","multiple","muted","nomodule","novalidate","open","playsinline","readonly","required","reversed","seamless","selected","webkitdirectory"];var MZ=[...h7,"formNoValidate","isMap","noModule","playsInline","readOnly","value","inert","volume","defaultValue","defaultChecked","srcObject"];var p7=["touchstart","touchmove"];function p3(e){return p7.includes(e)}g();g();g();var Ed=!0;g();var G=!1;g();var on=Array.isArray,cc=Array.from,j0=Object.keys,It=Object.defineProperty,Ur=Object.getOwnPropertyDescriptor,H0=Object.getOwnPropertyDescriptors,U0=Object.prototype,m3=Array.prototype,La=Object.getPrototypeOf;function G0(e){return typeof e=="function"}var xr=()=>{};function Ad(e){for(var t=0;t0)){let n=Array.from(Na);var r=ii;vo(!0);try{for(let i of n)i.f&1024&&Zt(i,4096),Hi(i)&&ja(i)}finally{vo(r)}Na.clear()}return t}function R3(e,t){var r=e.reactions;if(r!==null)for(var n=ji(),i=r.length,a=0;an.line)return a.component}}return null}var _7=Symbol("ADD_OWNER");function Z0(e,t){if(t.owners!==null)for(;e;){if(e.owners===null){t.owners=null;break}for(let r of e.owners)t.owners.add(r);e=e.parent}}function L3(e,t){return e.owners===null?!0:e.owners.has(t)||e.parent!==null&&L3(e.parent,t)}function D3(e){var t,r;return(r=(t=e==null?void 0:e.owners)==null?void 0:t.values().next().value)!=null?r:D3(e.parent)}var x7=!1;function N3(e){if(x7)return;let t=$3();if(t&&!L3(e,t)){let r=D3(e);r[Yt]!==t[Yt]?X0(t[Yt],r[Yt]):X0()}}function _e(e,t=null,r){var c,u;var n=null;if(G&&ti&&(n=ri("CreatedAt")),typeof e!="object"||e===null||Sr in e)return e;let i=La(e);if(i!==U0&&i!==m3)return e;var a=new Map,s=on(e),o=ht(0);s&&a.set("length",ht(e.length,n));var l;if(G)if(l={parent:t,owners:null},r){let f=(u=(c=r.v)==null?void 0:c[Da])==null?void 0:u.owners;l.owners=f?new Set(f):null}else l.owners=t===null?pe!==null?new Set([pe.function]):null:new Set;return new Proxy(e,{defineProperty(f,d,h){(!("value"in h)||h.configurable===!1||h.enumerable===!1||h.writable===!1)&&A3();var p=a.get(d);return p===void 0?(p=ht(h.value,n),a.set(d,p)):re(p,_e(h.value,l)),!0},deleteProperty(f,d){var h=a.get(d);if(h===void 0)d in f&&a.set(d,ht(dt,n));else{if(s&&typeof d=="string"){var p=a.get("length"),m=Number(d);Number.isInteger(m)&&m=_.v&&re(_,k+1)}B3(o)}return!0},ownKeys(f){R(o);var d=Reflect.ownKeys(f).filter(m=>{var v=a.get(m);return v===void 0||v.v!==dt});for(var[h,p]of a)p.v!==dt&&!(h in f)&&d.push(h);return d},setPrototypeOf(){k3()}})}function B3(e,t=1){re(e,e.v+t)}function Md(e){return e!==null&&typeof e=="object"&&Sr in e?e[Sr]:e}function j3(){let e=Array.prototype,t=Array.__svelte_cleanup;t&&t();let{indexOf:r,lastIndexOf:n,includes:i}=e;e.indexOf=function(a,s){let o=r.call(this,a,s);if(o===-1){for(let l=s!=null?s:0;l{e.indexOf=r,e.lastIndexOf=n,e.includes=i}}var K0,H3,U3,G3;function Od(){if(K0===void 0){K0=window,H3=document;var e=Element.prototype,t=Node.prototype;U3=Ur(t,"firstChild").get,G3=Ur(t,"nextSibling").get,e.__click=void 0,e.__className="",e.__attributes=null,e.__styles=null,e.__e=void 0,Text.prototype.__t=void 0,G&&(e.__svelte_meta=null,j3())}}function qr(e=""){return document.createTextNode(e)}function Pt(e){return U3.call(e)}function $t(e){return G3.call(e)}function j(e,t){if(!ae)return Pt(e);var r=Pt(ue);if(r===null)r=ue.appendChild(qr());else if(t&&r.nodeType!==3){var n=qr();return r==null||r.before(n),tt(n),n}return tt(r),r}function cr(e,t){var i,a;if(!ae){var r=Pt(e);return r instanceof Comment&&r.data===""?$t(r):r}if(t&&((i=ue)==null?void 0:i.nodeType)!==3){var n=qr();return(a=ue)==null||a.before(n),tt(n),n}return ue}function Z(e,t=1,r=!1){let n=ae?ue:e;for(var i;t--;)i=n,n=$t(n);if(!ae)return n;var a=n==null?void 0:n.nodeType;if(r&&a!==3){var s=qr();return n===null?i==null||i.after(s):n.before(s),tt(s),s}return tt(n),n}function So(e){e.textContent=""}g();function Xe(e){var i;var t=2050;te===null?t|=256:te.f|=1048576;var r=de!==null&&de.f&2?de:null;let n={children:null,ctx:pe,deps:null,equals:Td,f:t,fn:e,reactions:null,v:null,version:0,parent:r!=null?r:te};return G&&ti&&(n.created=ri("CreatedAt")),r!==null&&((i=r.children)!=null?i:r.children=[]).push(n),n}function tv(e){let t=Xe(e);return t.equals=go,t}function Q0(e){var t=e.children;if(t!==null){e.children=null;for(var r=0;r{Lt(t)}}function W3(e){let t=Ua(64,e,!0);return(r={})=>new Promise(n=>{r.outro?un(t,()=>{Lt(t),n(void 0)}):(Lt(t),n(void 0))})}function Er(e){return Ua(4,e,!1)}function lr(e){return Ua(8,e,!0)}function Ae(e){return G&&It(e,"name",{value:"{expression}"}),ur(e)}function ur(e,t=0){return Ua(24|t,e,!0)}function Nt(e,t=!0){return Ua(40,e,!0,t)}function lv(e){var t=e.teardown;if(t!==null){let r=$d,n=de;iv(!0),Rt(null);try{t.call(null)}finally{iv(r),Rt(n)}}}function cv(e){var t=e.deriveds;if(t!==null){e.deriveds=null;for(var r=0;r{Lt(e),t&&t()})}function dv(e,t){var r=e.length;if(r>0){var n=()=>--r||t();for(var i of e)i.out(n)}else t()}function Fd(e,t,r){if(!(e.f&8192)){if(e.f^=8192,e.transitions!==null)for(let s of e.transitions)(s.is_global||r)&&t.push(s);for(var n=e.first;n!==null;){var i=n.next,a=(n.f&65536)!==0||(n.f&32)!==0;Fd(n,t,a?r:!1),n=i}}}function zi(e){Y3(e,!0)}function Y3(e,t){if(e.f&8192){Hi(e)&&ja(e),e.f^=8192;for(var r=e.first;r!==null;){var n=r.next,i=(r.f&65536)!==0||(r.f&32)!==0;Y3(r,i?t:!1),r=n}if(e.transitions!==null)for(let a of e.transitions)(a.is_global||t)&&a.in()}}g();var Ld=!1,Z3=!1,hv=[],X3=[];function K3(){Ld=!1;let e=hv.slice();hv=[],Ad(e)}function A7(){Z3=!1;let e=X3.slice();X3=[],Ad(e)}function fr(e){Ld||(Ld=!0,queueMicrotask(K3)),hv.push(e)}function J3(){Ld&&K3(),Z3&&A7()}g();function mc(e){if(G){let t=new Error(`lifecycle_outside_component +\`${e}(...)\` can only be used during component initialisation +https://svelte.dev/e/lifecycle_outside_component`);throw t.name="Svelte error",t}else throw new Error("https://svelte.dev/e/lifecycle_outside_component")}var iP=0,C7=1,Q3=new WeakSet,Dd=!1,Nd=iP,gc=!1,Ao=null,ii=!1,$d=!1;function vo(e){ii=e}function iv(e){$d=e}var Ga=[],ko=0,vc=[],de=null;function Rt(e){de=e}var te=null;function ot(e){te=e}var ln=null;function M3(e){ln=e}var Ct=null,Ar=0,ni=null;function O3(e){ni=e}var aP=1,ai=!1,fc=null;var pe=null;var Wr=null;function Cd(){return++aP}function ji(){return!ei||pe!==null&&pe.l===null}function Hi(e){var s,o,l,c;var t=e.f;if(t&2048)return!0;if(t&4096){var r=e.deps,n=(t&256)!==0;if(r!==null){var i;if(t&512){for(i=0;ie.version)return!0}}(!n||te!==null&&!ai)&&Zt(e,1024)}return!1}function eP(e,t){for(var r=t;r!==null;){if(r.f&128)try{r.fn(e);return}catch(n){r.f^=128}r=r.parent}throw Dd=!1,e}function tP(e){return(e.f&16384)===0&&(e.parent===null||(e.parent.f&128)===0)}function To(e,t,r,n){var u,f;if(Dd){if(r===null&&(Dd=!1),tP(t))throw e;return}if(r!==null&&(Dd=!0),!G||n===null||!(e instanceof Error)||Q3.has(e)){eP(e,t);return}Q3.add(e);let i=[],a=(u=t.fn)==null?void 0:u.name;a&&i.push(a);let s=n;for(;s!==null;){if(G){var o=(f=s.function)==null?void 0:f[Yt];if(o){let d=o.split("/").pop();i.push(d)}}s=s.p}let l=/Firefox/.test(navigator.userAgent)?" ":" ";It(e,"message",{value:e.message+` +${i.map(d=>` +${l}in ${d}`).join("")} +`}),It(e,"component_stack",{value:i});let c=e.stack;if(c){let d=c.split(` +`),h=[];for(let p=0;p0)for(u.length=Ar+Ct.length,f=0;fe.fn)),vc=[]}function sP(){if(ko>1e3){ko=0;try{_3()}catch(e){if(G&&It(e,"stack",{value:""}),Ao!==null)if(G)try{To(e,Ao,null,null)}catch(t){throw rP(),t}else To(e,Ao,null,null);else throw G&&rP(),e}}ko++}function oP(e){var t=e.length;if(t!==0){sP();var r=ii;ii=!0;try{for(var n=0;n1001)return;let e=Ga;Ga=[],oP(e),gc||(ko=0,Ao=null,G&&(vc=[]))}function wo(e){Nd===iP&&(gc||(gc=!0,queueMicrotask(M7))),Ao=e;for(var t=e;t.parent!==null;){t=t.parent;var r=t.f;if(r&96){if(!(r&1024))return;t.f^=1024}}Ga.push(t)}function lP(e,t){var r=e.first,n=[];e:for(;r!==null;){var i=r.f,a=(i&32)!==0,s=a&&(i&1024)!==0,o=r.next;if(!s&&!(i&8192))if(i&8){if(a)r.f^=1024;else try{Hi(r)&&ja(r)}catch(f){To(f,r,null,r.ctx)}var l=r.first;if(l!==null){r=l;continue}}else i&4&&n.push(r);if(o===null){let f=r.parent;for(;f!==null;){if(e===f)break e;var c=f.next;if(c!==null){r=c;continue e}f=f.parent}}r=o}for(var u=0;u0||i.length>0)&&Co(),ko=0,Ao=null,G&&(vc=[]),n}finally{Nd=t,Ga=r}}function R(e){var f,d;var t=e.f,r=(t&2)!==0;if(r&&t&16384){var n=rv(e);return pc(e),n}if(fc!==null&&fc.add(e),de!==null){ln!==null&&ln.includes(e)&&T3();var i=de.deps;Ct===null&&i!==null&&i[Ar]===e?Ar++:Ct===null?Ct=[e]:Ct.push(e),ni!==null&&te!==null&&te.f&1024&&!(te.f&32)&&ni.includes(e)&&(Zt(te,2048),wo(te))}else if(r&&e.deps===null)for(var a=e,s=a.parent,o=a;s!==null;)if(s.f&2){var l=s;o=l,s=l.parent}else{var c=s;(f=c.deriveds)!=null&&f.includes(o)||((d=c.deriveds)!=null?d:c.deriveds=[]).push(o);break}if(r&&(a=e,Hi(a)&&nv(a)),G&&ti&&uc!==null&&de!==null&&uc.reaction===de){if(e.debug)e.debug();else if(e.created){var u=uc.entries.get(e);u===void 0&&(u={read:[]},uc.entries.set(e,u)),u.read.push(ri("TracedAt"))}}return e.v}function He(e){let t=de;try{return de=null,e()}finally{de=t}}var O7=-7169;function Zt(e,t){e.f=e.f&O7|t}function Ze(e,t=!1,r){pe={p:pe,c:null,e:null,m:!1,s:e,x:null,l:null},ei&&!t&&(pe.l={s:null,u:null,r1:[],r2:ht(!1)}),G&&(pe.function=r,Wr=r)}function Ke(e){var s,o;let t=pe;if(t!==null){e!==void 0&&(t.x=e);let l=t.e;if(l!==null){var r=te,n=de;t.e=null;try{for(var i=0;i{if(r!==void 0)return r;E3(t)},set:n=>{r=n}})}};e("$state"),e("$effect"),e("$derived"),e("$inspect"),e("$props"),e("$bindable")}g();var cP=new Map;function uP(e,t){var r=cP.get(e);r||(r=new Set,cP.set(e,r)),r.add(t)}g();g();g();g();g();g();function pv(e){ae&&Pt(e)!==null&&So(e)}var fP=!1;function mv(){fP||(fP=!0,document.addEventListener("reset",e=>{Promise.resolve().then(()=>{var t;if(!e.defaultPrevented)for(let r of e.target.elements)(t=r.__on_r)==null||t.call(r)})},{capture:!0}))}function Hd(e){var t=de,r=te;Rt(null),ot(null);try{return e()}finally{Rt(t),ot(r)}}function gv(e,t,r,n=r){e.addEventListener(t,()=>Hd(r));let i=e.__on_r;i?e.__on_r=()=>{i(),n(!0)}:e.__on_r=()=>n(!0),mv()}var vv=new Set,Ud=new Set;function dP(e,t,r,n){function i(a){if(n.capture||Po.call(t,a),!a.cancelBubble)return Hd(()=>r.call(this,a))}return e.startsWith("pointer")||e.startsWith("touch")||e==="wheel"?fr(()=>{t.addEventListener(e,i,n)}):t.addEventListener(e,i,n),i}function kr(e,t,r,n,i){var a={capture:n,passive:i},s=dP(e,t,r,a);(t===document.body||t===window||t===document)&&Xr(()=>{t.removeEventListener(e,s,a)})}function mt(e){for(var t=0;t{throw x});throw d}}finally{e.__root=t,delete e.currentTarget,Rt(u),ot(f)}}}g();var F7;function hP(){F7=void 0}g();g();function Gd(e){var t=document.createElement("template");return t.innerHTML=e,t.content}function In(e,t){var r=te;r.nodes_start===null&&(r.nodes_start=e,r.nodes_end=t)}function se(e,t){var r=(t&1)!==0,n=(t&2)!==0,i,a=!e.startsWith("");return()=>{if(ae)return In(ue,null),ue;i===void 0&&(i=Gd(a?e:""+e),r||(i=Pt(i)));var s=n?document.importNode(i,!0):i.cloneNode(!0);if(r){var o=Pt(s),l=s.lastChild;In(o,l)}else In(s,s);return s}}function si(){if(ae)return In(ue,null),ue;var e=document.createDocumentFragment(),t=document.createComment(""),r=qr();return e.append(t,r),In(t,r),e}function ne(e,t){if(ae){te.nodes_end=ue,Ft();return}e!==null&&e.before(t)}var zd=!0;function Oe(e,t){var n;var r=t==null?"":typeof t=="object"?t+"":t;r!==((n=e.__t)!=null?n:e.__t=e.nodeValue)&&(e.__t=r,e.nodeValue=r==null?"":r+"")}function Vi(e,t){return pP(e,t)}function wv(e,t){var s;Od(),t.intro=(s=t.intro)!=null?s:!1;let r=t.target,n=ae,i=ue;try{for(var a=Pt(r);a&&(a.nodeType!==8||a.data!==mo);)a=$t(a);if(!a)throw Ni;or(!0),tt(a),Ft();let o=pP(e,{...t,anchor:a});if(ue===null||ue.nodeType!==8||ue.data!==$a)throw bo(),Ni;return or(!1),o}catch(o){if(o===Ni)return t.recover===!1&&x3(),Od(),So(r),or(!1),Vi(e,t);throw o}finally{or(n),tt(i),hP()}}var Ro=new Map;function pP(e,{target:t,anchor:r,props:n={},events:i,context:a,intro:s=!0}){Od();var o=new Set,l=f=>{for(var d=0;d{var f=r!=null?r:t.appendChild(qr());return Nt(()=>{if(a){Ze({});var d=pe;d.c=a}i&&(n.$$events=i),ae&&In(f,null),zd=s,c=e(f,n)||{},zd=!0,ae&&(te.nodes_end=ue),a&&Ke()}),()=>{var p;for(var d of o){t.removeEventListener(d,Po);var h=Ro.get(d);--h===0?(document.removeEventListener(d,Po),Ro.delete(d)):Ro.set(d,h)}Ud.delete(l),f!==r&&((p=f.parentNode)==null||p.removeChild(f))}});return yv.set(c,u),c}var yv=new WeakMap;function oi(e,t){let r=yv.get(e);return r?(yv.delete(e),r(t)):(G&&F3(),Promise.resolve())}g();g();g();g();function ye(e,t,r=!1){ae&&Ft();var n=e,i=null,a=null,s=dt,o=r?65536:0,l=!1;let c=(f,d=!0)=>{l=!0,u(d,f)},u=(f,d)=>{if(s===(s=f))return;let h=!1;if(ae){let p=n.data===Fa;!!s===p&&(n=xo(),tt(n),or(!1),h=!0)}s?(i?zi(i):d&&(i=Nt(()=>d(n))),a&&un(a,()=>{a=null})):(a?zi(a):d&&(a=Nt(()=>d(n))),i&&un(i,()=>{i=null})),h&&or(!0)};ur(()=>{l=!1,t(c),l||u(null,null)},o),ae&&(n=ue)}g();g();g();var yc=null;function Tr(e,t){return t}function U7(e,t,r,n){for(var i=[],a=t.length,s=0;s0&&i.length===0&&r!==null;if(o){var l=r.parentNode;So(l),l.append(r),n.clear(),Wi(e,t[0].prev,t[a-1].next)}dv(i,()=>{for(var c=0;c{var d=r(),h=on(d)?d:d==null?[]:cc(d),p=h.length;if(f&&p===0)return;f=p===0;let m=!1;if(ae){var v=s.data===Fa;v!==(p===0)&&(s=xo(),tt(s),or(!1),m=!0)}if(ae){for(var y=null,b,x=0;x0&&tt(xo())}if(!ae){var k=de;G7(h,o,s,i,t,(k.f&8192)!==0,n,r)}a!==null&&(p===0?u?zi(u):u=Nt(()=>a(s)):u!==null&&un(u,()=>{u=null})),m&&or(!0),r()}),ae&&(s=ue)}function G7(e,t,r,n,i,a,s,o){var ee,fe,J,Q;var l=(i&8)!==0,c=(i&3)!==0,u=e.length,f=t.items,d=t.first,h=d,p,m=null,v,y=[],b=[],x,E,_,k;if(l)for(k=0;k0){var L=i&4&&u===0?r:null;if(l){for(k=0;k{var Pe;if(v!==void 0)for(_ of v)(Pe=_.a)==null||Pe.apply()}),te.first=t.first&&t.first.e,te.last=m&&m.e}function z7(e,t,r,n){n&1&&yo(e.v,t),n&2?yo(e.i,r):e.i=r}function vP(e,t,r,n,i,a,s,o,l,c){var u=yc,f=(l&1)!==0,d=(l&16)===0,h=f?d?Bi(i):ht(i):i,p=l&2?ht(s):s;G&&f&&(h.debug=()=>{var v=typeof p=="number"?s:p.v;c()[v]});var m={i:p,v:h,k:a,a:null,e:null,prev:r,next:n};yc=m;try{return m.e=Nt(()=>o(e,h,p),ae),m.e.prev=r&&r.e,m.e.next=n&&n.e,r===null?t.first=m:(r.next=m,r.e.next=m.e),n!==null&&(n.prev=m,n.e.prev=m.e),m}finally{yc=u}}function mP(e,t,r){for(var n=e.next?e.next.e.nodes_start:r,i=t?t.e.nodes_start:r,a=e.e.nodes_start;a!==n;){var s=$t(a);i.before(a),a=s}}function Wi(e,t,r){t===null?e.first=r:(t.next=r,t.e.next=r&&r.e),r!==null&&(r.prev=t,r.e.prev=t&&t.e)}g();g();g();g();g();g();function wt(e,t){fr(()=>{var i;var r=e.getRootNode(),n=r.host?r:(i=r.head)!=null?i:r.ownerDocument.head;if(!n.querySelector("#"+t.hash)){let a=document.createElement("style");a.id=t.hash,a.textContent=t.code,n.appendChild(a),G&&uP(t.hash,a)}})}g();g();g();g();g();function me(e,t,r,n){var a;var i=(a=e.__attributes)!=null?a:e.__attributes={};if(ae&&(i[t]=e.getAttribute(t),t==="src"||t==="srcset"||t==="href"&&e.nodeName==="LINK")){n||X7(e,t,r!=null?r:"");return}i[t]!==(i[t]=r)&&(t==="style"&&"__styles"in e&&(e.__styles={}),t==="loading"&&(e[g3]=r),r==null?e.removeAttribute(t):typeof r!="string"&&Y7(e).includes(t)?e[t]=r:e.setAttribute(t,r))}var wP=new Map;function Y7(e){var t=wP.get(e.nodeName);if(t)return t;wP.set(e.nodeName,t=[]);for(var r,n=e,i=Element.prototype;i!==n;){r=H0(n);for(var a in r)r[a].set&&t.push(a);n=La(n)}return t}function X7(e,t,r){var n;G&&(t==="srcset"&&Z7(e,r)||xv((n=e.getAttribute(t))!=null?n:"",r)||I3(t,e.outerHTML.replace(e.innerHTML,e.innerHTML&&"..."),String(r)))}function xv(e,t){return e===t?!0:new URL(e,document.baseURI).href===new URL(t,document.baseURI).href}function bP(e){return e.split(",").map(t=>t.trim().split(" ").filter(Boolean))}function Z7(e,t){var r=bP(e.srcset),n=bP(t);return n.length===r.length&&n.every(([i,a],s)=>a===r[s][1]&&(xv(r[s][0],i)||xv(i,r[s][0])))}g();function lt(e,t,r){if(r){if(e.classList.contains(t))return;e.classList.add(t)}else{if(!e.classList.contains(t))return;e.classList.remove(t)}}g();g();g();g();var K7=Ed?()=>performance.now():()=>Date.now(),fn={tick:e=>(Ed?requestAnimationFrame:xr)(e),now:()=>K7(),tasks:new Set};function _P(){let e=fn.now();fn.tasks.forEach(t=>{t.c(e)||(fn.tasks.delete(t),t.f())}),fn.tasks.size!==0&&fn.tick(_P)}function xP(e){let t;return fn.tasks.size===0&&fn.tick(_P),{promise:new Promise(r=>{fn.tasks.add(t={c:e,f:r})}),abort(){fn.tasks.delete(t)}}}function Vd(e,t){e.dispatchEvent(new CustomEvent(t))}function t9(e){if(e==="float")return"cssFloat";if(e==="offset")return"cssOffset";if(e.startsWith("--"))return e;let t=e.split("-");return t.length===1?t[0]:t[0]+t.slice(1).map(r=>r[0].toUpperCase()+r.slice(1)).join("")}function SP(e){let t={},r=e.split(";");for(let n of r){let[i,a]=n.split(":");if(!i||a===void 0)break;let s=t9(i.trim());t[s]=a.trim()}return t}var r9=e=>e;function dn(e,t,r,n){var b;var i=(e&1)!==0,a=(e&2)!==0,s=i&&a,o=(e&4)!==0,l=s?"both":i?"in":"out",c,u=t.inert,f,d;function h(){var _;var x=de,E=te;Rt(null),ot(null);try{return c!=null?c:c=r()(t,(_=n==null?void 0:n())!=null?_:{},{direction:l})}finally{Rt(x),ot(E)}}var p={is_global:o,in(){var x;if(t.inert=u,!i){d==null||d.abort(),(x=d==null?void 0:d.reset)==null||x.call(d);return}a||f==null||f.abort(),Vd(t,"introstart"),f=Sv(t,h(),d,1,()=>{Vd(t,"introend"),f==null||f.abort(),f=c=void 0})},out(x){if(!a){x==null||x(),c=void 0;return}t.inert=!0,Vd(t,"outrostart"),d=Sv(t,h(),f,0,()=>{Vd(t,"outroend"),x==null||x()})},stop:()=>{f==null||f.abort(),d==null||d.abort()}},m=te;if(((b=m.transitions)!=null?b:m.transitions=[]).push(p),i&&zd){var v=o;if(!v){for(var y=m.parent;y&&y.f&65536;)for(;(y=y.parent)&&!(y.f&16););v=!y||(y.f&32768)!==0}v&&Er(()=>{He(()=>p.in())})}}function Sv(e,t,r,n,i){var a=n===1;if(G0(t)){var s,o=!1;return fr(()=>{if(!o){var v=t({direction:a?"in":"out"});s=Sv(e,v,r,n,i)}}),{abort:()=>{o=!0,s==null||s.abort()},deactivate:()=>s.deactivate(),reset:()=>s.reset(),t:()=>s.t()}}if(r==null||r.deactivate(),!(t!=null&&t.duration))return i(),{abort:xr,deactivate:xr,reset:xr,t:()=>n};let{delay:l=0,css:c,tick:u,easing:f=r9}=t;var d=[];if(a&&r===void 0&&(u&&u(0,1),c)){var h=SP(c(0,1));d.push(h,h)}var p=()=>1-n,m=e.animate(d,{duration:l});return m.onfinish=()=>{var A;var v=(A=r==null?void 0:r.t())!=null?A:1-n;r==null||r.abort();var y=n-v,b=t.duration*Math.abs(y),x=[];if(b>0){if(c)for(var E=Math.ceil(b/16.666666666666668),_=0;_<=E;_+=1){var k=v+y*f(_/E),w=c(k,1-k);x.push(SP(w))}p=()=>{var S=m.currentTime;return v+y*f(S/b)},u&&xP(()=>{if(m.playState!=="running")return!1;var S=p();return u(S,1-S),!0})}m=e.animate(x,{duration:b,fill:"forwards"}),m.onfinish=()=>{p=()=>n,u==null||u(n,1-n),i()}},{abort:()=>{m&&(m.cancel(),m.effect=null,m.onfinish=xr)},deactivate:()=>{i=xr},reset:()=>{n===0&&(u==null||u(1,0))},t:()=>p()}}g();g();function kv(e,t,r=t){var n=ji();gv(e,"input",i=>{G&&e.type==="checkbox"&&V0();var a=i?e.defaultValue:e.value;if(a=Ev(e)?Av(a):a,r(a),n&&a!==(a=t())){var s=e.selectionStart,o=e.selectionEnd;e.value=a!=null?a:"",o!==null&&(e.selectionStart=s,e.selectionEnd=Math.min(o,e.value.length))}}),(ae&&e.defaultValue!==e.value||He(t)==null&&e.value)&&r(Ev(e)?Av(e.value):e.value),lr(()=>{G&&e.type==="checkbox"&&V0();var i=t();Ev(e)&&i===Av(e.value)||e.type==="date"&&!i&&!e.value||i!==e.value&&(e.value=i!=null?i:"")})}function Ev(e){var t=e.type;return t==="number"||t==="range"}function Av(e){return e===""?null:+e}g();g();g();g();g();g();function EP(e,t){return e===t||(e==null?void 0:e[Sr])===t}function Ue(e={},t,r,n){return Er(()=>{var i,a;return lr(()=>{i=a,a=(n==null?void 0:n())||[],He(()=>{e!==r(...a)&&(t(e,...a),i&&EP(r(...i),e)&&t(null,...i))})}),()=>{fr(()=>{a&&EP(r(...a),e)&&t(null,...a)})}}),e}g();g();g();g();g();g();g();g();g();function Tv(e){pe===null&&mc("onMount"),ei&&pe.l!==null?c9(pe).m.push(e):Dt(()=>{let t=He(e);if(typeof t=="function")return t})}function AP(e){pe===null&&mc("onDestroy"),Tv(()=>()=>He(e))}function c9(e){var r;var t=e.l;return(r=t.u)!=null?r:t.u={a:[],b:[],m:[]}}var qd=!1;function Cv(e){var t=qd;try{return qd=!1,[e(),qd]}finally{qd=t}}function kP(e){for(var t=te,r=te;t!==null&&!(t.f&96);)t=t.parent;try{return ot(t),e()}finally{ot(r)}}function Fn(e,t,r,n){var w,A;var i=(r&1)!==0,a=!ei||(r&2)!==0,s=(r&8)!==0,o=(r&16)!==0,l=!1,c;s?[c,l]=Cv(()=>e[t]):c=e[t];var u=Sr in e||kd in e,f=(A=(w=Ur(e,t))==null?void 0:w.set)!=null?A:u&&s&&t in e?S=>e[t]=S:void 0,d=n,h=!0,p=!1,m=()=>(p=!0,h&&(h=!1,o?d=He(n):d=n),d);c===void 0&&n!==void 0&&(f&&a&&S3(t),c=m(),f&&f(c));var v;if(a)v=()=>{var S=e[t];return S===void 0?m():(h=!0,p=!1,S)};else{var y=kP(()=>(i?Xe:tv)(()=>e[t]));y.f|=131072,v=()=>{var S=R(y);return S!==void 0&&(d=void 0),S===void 0?d:S}}if(!(r&4))return v;if(f){var b=e.$$legacy;return function(S,T){return arguments.length>0?((!a||!T||b||l)&&f(T?v():S),S):v()}}var x=!1,E=!1,_=Bi(c),k=kP(()=>Xe(()=>{var S=v(),T=R(_);return x?(x=!1,E=!0,T):(E=!1,_.v=S)}));return i||(k.equals=go),function(S,T){if(fc!==null&&(x=E,v(),R(_)),arguments.length>0){let P=T?R(k):a&&s?_e(S):S;return k.equals(P)||(x=!0,re(_,P),p&&d!==void 0&&(d=P),He(()=>R(k))),S}return R(k)}}g();g();g();g();function TP(e){return new Pv(e)}var li,Zr,Pv=class{constructor(t){Tc(this,li);Tc(this,Zr);var a,s;var r=new Map,n=(o,l)=>{var c=Bi(l);return r.set(o,c),c};let i=new Proxy({...t.props||{},$$events:{}},{get(o,l){var c;return R((c=r.get(l))!=null?c:n(l,Reflect.get(o,l)))},has(o,l){var c;return l===kd?!0:(R((c=r.get(l))!=null?c:n(l,Reflect.get(o,l))),Reflect.has(o,l))},set(o,l,c){var u;return re((u=r.get(l))!=null?u:n(l,c),c),Reflect.set(o,l,c)}});Cc(this,Zr,(t.hydrate?wv:Vi)(t.component,{target:t.target,anchor:t.anchor,props:i,context:t.context,intro:(a=t.intro)!=null?a:!1,recover:t.recover})),(!((s=t==null?void 0:t.props)!=null&&s.$$host)||t.sync===!1)&&Co(),Cc(this,li,i.$$events);for(let o of Object.keys(Ht(this,Zr)))o==="$set"||o==="$destroy"||o==="$on"||It(this,o,{get(){return Ht(this,Zr)[o]},set(l){Ht(this,Zr)[o]=l},enumerable:!0});Ht(this,Zr).$set=o=>{Object.assign(i,o)},Ht(this,Zr).$destroy=()=>{oi(Ht(this,Zr))}}$set(t){Ht(this,Zr).$set(t)}$on(t,r){Ht(this,li)[t]=Ht(this,li)[t]||[];let n=(...i)=>r.call(this,...i);return Ht(this,li)[t].push(n),()=>{Ht(this,li)[t]=Ht(this,li)[t].filter(i=>i!==n)}}$destroy(){Ht(this,Zr).$destroy()}};li=new WeakMap,Zr=new WeakMap;var x9;typeof HTMLElement=="function"&&(x9=class extends HTMLElement{constructor(t,r,n){super();Pr(this,"$$ctor");Pr(this,"$$s");Pr(this,"$$c");Pr(this,"$$cn",!1);Pr(this,"$$d",{});Pr(this,"$$r",!1);Pr(this,"$$p_d",{});Pr(this,"$$l",{});Pr(this,"$$l_u",new Map);Pr(this,"$$me");this.$$ctor=t,this.$$s=r,n&&this.attachShadow({mode:"open"})}addEventListener(t,r,n){if(this.$$l[t]=this.$$l[t]||[],this.$$l[t].push(r),this.$$c){let i=this.$$c.$on(t,r);this.$$l_u.set(r,i)}super.addEventListener(t,r,n)}removeEventListener(t,r,n){if(super.removeEventListener(t,r,n),this.$$c){let i=this.$$l_u.get(r);i&&(i(),this.$$l_u.delete(r))}}async connectedCallback(){if(this.$$cn=!0,!this.$$c){let t=function(i){return a=>{let s=document.createElement("slot");i!=="default"&&(s.name=i),ne(a,s)}};if(await Promise.resolve(),!this.$$cn||this.$$c)return;let r={},n=S9(this);for(let i of this.$$s)i in n&&(i==="default"&&!this.$$d.children?(this.$$d.children=t(i),r.default=!0):r[i]=t(i));for(let i of this.attributes){let a=this.$$g_p(i.name);a in this.$$d||(this.$$d[a]=Rv(a,i.value,this.$$p_d,"toProp"))}for(let i in this.$$p_d)!(i in this.$$d)&&this[i]!==void 0&&(this.$$d[i]=this[i],delete this[i]);this.$$c=TP({component:this.$$ctor,target:this.shadowRoot||this,props:{...this.$$d,$$slots:r,$$host:this}}),this.$$me=ov(()=>{lr(()=>{var i;this.$$r=!0;for(let a of j0(this.$$c)){if(!((i=this.$$p_d[a])!=null&&i.reflect))continue;this.$$d[a]=this.$$c[a];let s=Rv(a,this.$$d[a],this.$$p_d,"toAttribute");s==null?this.removeAttribute(this.$$p_d[a].attribute||a):this.setAttribute(this.$$p_d[a].attribute||a,s)}this.$$r=!1})});for(let i in this.$$l)for(let a of this.$$l[i]){let s=this.$$c.$on(i,a);this.$$l_u.set(a,s)}this.$$l={}}}attributeChangedCallback(t,r,n){var i;this.$$r||(t=this.$$g_p(t),this.$$d[t]=Rv(t,n,this.$$p_d,"toProp"),(i=this.$$c)==null||i.$set({[t]:this.$$d[t]}))}disconnectedCallback(){this.$$cn=!1,Promise.resolve().then(()=>{!this.$$cn&&this.$$c&&(this.$$c.$destroy(),this.$$me(),this.$$c=void 0)})}$$g_p(t){return j0(this.$$p_d).find(r=>this.$$p_d[r].attribute===t||!this.$$p_d[r].attribute&&r.toLowerCase()===t)||t}});function Rv(e,t,r,n){var a;let i=(a=r[e])==null?void 0:a.type;if(t=i==="Boolean"&&typeof t!="boolean"?t!=null:t,!n||!r[e])return t;if(n==="toAttribute")switch(i){case"Object":case"Array":return t==null?null:JSON.stringify(t);case"Boolean":return t?"":null;case"Number":return t==null?null:t;default:return t}else switch(i){case"Object":case"Array":return t&&JSON.parse(t);case"Boolean":return t;case"Number":return t!=null?+t:t;default:return t}}function S9(e){let t={};return e.childNodes.forEach(r=>{t[r.slot||"default"]=!0}),t}g();g();g();function Mo(e,t,r,n){function i(a){return a instanceof r?a:new r(function(s){s(a)})}return new(r||(r=Promise))(function(a,s){function o(u){try{c(n.next(u))}catch(f){s(f)}}function l(u){try{c(n.throw(u))}catch(f){s(f)}}function c(u){u.done?a(u.value):i(u.value).then(o,l)}c((n=n.apply(e,t||[])).next())})}var Iv=require("obsidian");g();var Mv=require("obsidian");g();function A9(e){let t=e-1;return t*t*t+1}function Ln(e,{delay:t=0,duration:r=400,easing:n=A9,axis:i="y"}={}){let a=getComputedStyle(e),s=+a.opacity,o=i==="y"?"height":"width",l=parseFloat(a[o]),c=i==="y"?["top","bottom"]:["left","right"],u=c.map(y=>`${y[0].toUpperCase()}${y.slice(1)}`),f=parseFloat(a[`padding${u[0]}`]),d=parseFloat(a[`padding${u[1]}`]),h=parseFloat(a[`margin${u[0]}`]),p=parseFloat(a[`margin${u[1]}`]),m=parseFloat(a[`border${u[0]}Width`]),v=parseFloat(a[`border${u[1]}Width`]);return{delay:t,duration:r,easing:n,css:y=>`overflow: hidden;opacity: ${Math.min(y*20,1)*s};${o}: ${y*l}px;padding-${c[0]}: ${y*f}px;padding-${c[1]}: ${y*d}px;margin-${c[0]}: ${y*h}px;margin-${c[1]}: ${y*p}px;border-${c[0]}-width: ${y*m}px;border-${c[1]}-width: ${y*v}px;`}}g();var Yd=require("obsidian");var k9=se('
'),T9=se('
'),C9={hash:"svelte-1wbh8tp",code:"main.svelte-1wbh8tp .nav-file-title:where(.svelte-1wbh8tp) {align-items:center;}"};function wc(e,t){Ze(t,!0),wt(e,C9);let r=_e([]),n=Xe(()=>t.view.leaf.getRoot().side=="left"?"right":"left");Dt(()=>{for(let y of r)y&&(0,Yd.setIcon)(y,y.getAttr("data-icon"))});function i(y){y.stopPropagation(),Ws(t.diff.path)?a(y):s(y)}function a(y){var b;y.stopPropagation();let x=t.view.app.vault.getAbstractFileByPath(t.diff.vaultPath);x instanceof Yd.TFile&&((b=nn(t.view.app,y))===null||b===void 0||b.openFile(x).catch(E=>t.view.plugin.displayError(E)))}function s(y){var b;t.view.plugin.tools.openDiff({event:y,aFile:(b=t.diff.fromPath)!==null&&b!==void 0?b:t.diff.path,aRef:`${t.diff.hash}^`,bFile:t.diff.path,bRef:t.diff.hash})}var o=T9();o.__click=i;var l=j(o),c=j(l),u=j(c,!0);Ae(()=>Oe(u,Cn(t.diff.vaultPath))),B(c);var f=Z(c,2),d=j(f),h=j(d);{var p=y=>{var b=k9();b.__click=a,Ue(b,x=>r[0]=x,()=>r==null?void 0:r[0]),kr("auxclick",b,a),ne(y,b)};ye(h,y=>{qs(t.diff.vaultPath,t.view.app)&&y(p)})}B(d);var m=Z(d,2),v=j(m,!0);B(m),B(f),B(l),B(o),Ae(()=>{me(l,"data-path",t.diff.vaultPath),me(l,"data-tooltip-position",R(n)),me(l,"aria-label",t.diff.vaultPath),me(m,"data-type",t.diff.status),Oe(v,t.diff.status)}),kr("auxclick",o,y=>{y.stopPropagation(),y.button==2?Tn(t.view.app,y,t.diff.vaultPath,t.view.leaf,"git-history"):i(y)}),ne(e,o),Ke()}mt(["click"]);g();var P9=se("
"),R9=(e,t,r)=>t(R(r)),M9=se(''),O9=se(''),I9=se('
'),F9={hash:"svelte-1lnl15d",code:"main.svelte-1lnl15d .nav-folder-title-content:where(.svelte-1lnl15d) {display:flex;align-items:center;}"};function bc(e,t){Ze(t,!0),wt(e,F9);let r=Fn(t,"topLevel",3,!1),n=_e({}),i=Xe(()=>t.view.leaf.getRoot().side=="left"?"right":"left");function a(o){n[o.title]=!n[o.title]}var s=I9();Cr(s,21,()=>t.hierarchy.children,Tr,(o,l)=>{var c=si(),u=cr(c);{var f=h=>{var p=P9(),m=j(p);wc(m,{get diff(){return R(l).data},get view(){return t.view}}),B(p),ne(h,p)},d=h=>{var p=O9(),m=j(p);m.__click=[R9,a,l];var v=Z(j(m),2),y=Z(v,2),b=j(y,!0);B(y),B(m);var x=Z(m,2);{var E=_=>{var k=M9(),w=j(k);bc(w,{get hierarchy(){return R(l)},get plugin(){return t.plugin},get view(){return t.view}}),B(k),dn(3,k,()=>Ln,()=>({duration:150})),ne(_,k)};ye(x,_=>{n[R(l).title]||_(E)})}B(p),Ae(()=>{lt(p,"is-collapsed",n[R(l).title]),me(m,"data-tooltip-position",R(i)),me(m,"aria-label",R(l).vaultPath),lt(v,"is-collapsed",n[R(l).title]),Oe(b,R(l).title)}),ne(h,p)};ye(u,h=>{R(l).data?h(f):h(d,!1)})}ne(o,c)}),B(s),Ae(()=>lt(s,"topLevel",r())),ne(e,s),Ke()}mt(["click"]);var $9=(e,t)=>re(t,!R(t)),L9=se('
'),D9=se('
'),N9=se('
'),B9=se(''),j9=se('
'),H9={hash:"svelte-45h",code:""};function Ov(e,t){Ze(t,!0),wt(e,H9);let r=Xe(()=>({title:"",path:"",vaultPath:"",children:t.plugin.gitManager.getTreeStructure(t.log.diff.files)})),n=Xe(()=>t.view.leaf.getRoot().side=="left"?"right":"left"),i=pt(!0);function a(_){let k=_.author.name;if(t.plugin.settings.authorInHistoryView=="full")return k;if(t.plugin.settings.authorInHistoryView=="initials")return k.split(" ").filter(A=>A.length>0).map(A=>A[0].toUpperCase()).join("")}var s=j9(),o=j(s),l=j(o);Ae(()=>{var _;return me(l,"aria-label",`${t.log.refs.length>0?t.log.refs.join(", ")+` +`:""}${(_=t.log.author)==null?void 0:_.name} +${(0,Mv.moment)(t.log.date).format(t.plugin.settings.commitDateFormat)} +${t.log.message}`)}),l.__click=[$9,i];var c=j(l),u=Z(c,2),f=j(u);{var d=_=>{var k=L9(),w=j(k,!0);Ae(()=>Oe(w,t.log.refs.join(", "))),B(k),ne(_,k)};ye(f,_=>{t.log.refs.length>0&&_(d)})}var h=Z(f,2);{var p=_=>{var k=D9(),w=j(k,!0);Ae(()=>Oe(w,a(t.log))),B(k),ne(_,k)};ye(h,_=>{var k;t.plugin.settings.authorInHistoryView!="hide"&&((k=t.log.author)!=null&&k.name)&&_(p)})}var m=Z(h,2);{var v=_=>{var k=N9(),w=j(k,!0);Ae(()=>Oe(w,(0,Mv.moment)(t.log.date).format(t.plugin.settings.commitDateFormat))),B(k),ne(_,k)};ye(m,_=>{t.plugin.settings.dateInHistoryView&&_(v)})}var y=Z(m,2),b=j(y,!0);B(y),B(u),B(l);var x=Z(l,2);{var E=_=>{var k=B9(),w=j(k);{var A=T=>{bc(T,{get hierarchy(){return R(r)},get plugin(){return t.plugin},get view(){return t.view},topLevel:!0})},S=T=>{var P=si(),I=cr(P);Cr(I,17,()=>t.log.diff.files,Tr,(N,L)=>{wc(N,{get view(){return t.view},get diff(){return R(L)}})}),ne(T,P)};ye(w,T=>{t.showTree?T(A):T(S,!1)})}B(k),dn(3,k,()=>Ln,()=>({duration:150})),ne(_,k)};ye(x,_=>{R(i)||_(E)})}B(o),B(s),Ae(()=>{lt(o,"is-collapsed",R(i)),me(l,"data-tooltip-position",R(n)),lt(c,"is-collapsed",R(i)),Oe(b,t.log.message)}),ne(e,s),Ke()}mt(["click"]);function U9(e,t){t().catch(console.error)}var G9=(e,t,r,n)=>{re(t,!R(t)),(0,Iv.setIcon)(r[0],R(t)?"list":"folder"),n(n().settings.treeStructure=R(t),!0),n().saveSettings()},z9=se(''),V9=se('
'),W9={hash:"svelte-45h",code:""};function Fv(e,t){Ze(t,!0),wt(e,W9);let r=Fn(t,"plugin",15),n=pt(!1),i=_e([]),a=pt(void 0),s=pt(_e(r().settings.treeStructure)),o,l;Dt(()=>{l&&l.empty()}),o=t.view.app.workspace.on("obsidian-git:head-change",()=>void c().catch(console.error)),Dt(()=>{i.forEach(x=>(0,Iv.setIcon)(x,x.getAttr("data-icon")))}),AP(()=>{t.view.app.workspace.offref(o)}),Tv(()=>{let x=new IntersectionObserver(_=>{_[0].isIntersecting&&!R(n)&&u().catch(console.error)}),E=document.querySelector("#sentinel");return E&&x.observe(E),()=>{x.disconnect()}}),c().catch(console.error);function c(){return Mo(this,void 0,void 0,function*(){var x;if(!r().gitReady){re(a,void 0);return}re(n,!0);let E=r().gitManager instanceof Ce,_;((x=R(a)===null||R(a)===void 0?void 0:R(a).length)!==null&&x!==void 0?x:0)==0?_=E?50:10:_=R(a).length,re(a,_e(yield r().gitManager.log(void 0,!1,_))),re(n,!1)})}function u(){return Mo(this,void 0,void 0,function*(){var x;if(!r().gitReady||R(a)===void 0)return;re(n,!0);let _=r().gitManager instanceof Ce?50:10,k=yield r().gitManager.log(void 0,!1,_,(x=R(a).last())===null||x===void 0?void 0:x.hash);R(a).push(...k.slice(1)),re(n,!1)})}var f=V9(),d=j(f),h=j(d),p=j(h);p.__click=[G9,s,i,r],Ue(p,x=>i[0]=x,()=>i==null?void 0:i[0]);var m=Z(p,2);m.__click=[U9,c],Ue(m,x=>i[1]=x,()=>i==null?void 0:i[1]),B(h),B(d);var v=Z(d,2),y=j(v);{var b=x=>{var E=z9();Cr(E,21,()=>R(a),Tr,(_,k)=>{Ov(_,{get view(){return t.view},get showTree(){return R(s)},get log(){return R(k)},get plugin(){return r()}})}),B(E),ne(x,E)};ye(y,x=>{R(a)&&x(b)})}_o(4),B(v),B(f),Ae(()=>{me(p,"data-icon",R(s)?"list":"folder"),lt(m,"loading",R(n))}),ne(e,f),Ke()}mt(["click"]);var _c=class extends CP.ItemView{constructor(t,r){super(t),this.plugin=r,this.hoverPopover=null}getViewType(){return Lr.type}getDisplayText(){return Lr.name}getIcon(){return Lr.icon}onClose(){return this._view&&oi(this._view),super.onClose()}reload(){this._view&&oi(this._view),this._view=Vi(Fv,{target:this.contentEl,props:{plugin:this.plugin,view:this}})}onOpen(){return this.reload(),super.onOpen()}};g();var PP=require("obsidian"),Xd=class extends PP.FuzzySuggestModal{constructor(r,n){super(r.app);this.branches=n;this.setPlaceholder("Select branch to checkout")}getItems(){return this.branches}getItemText(r){return r}onChooseItem(r,n){this.resolve(r)}openAndGetReslt(){return new Promise(r=>{this.resolve=r,this.open()})}onClose(){new Promise(r=>setTimeout(r,10)).then(()=>{this.resolve&&this.resolve(void 0)})}};g();var $P=require("obsidian");g();var qa=require("obsidian");g();var RP=require("obsidian"),qi=class extends RP.Modal{constructor(r,n,i){super(r);this.deletion=n;this.filename=i;this.resolve=null}myOpen(){return this.open(),new Promise(r=>{this.resolve=r})}onOpen(){let{contentEl:r,titleEl:n}=this;n.setText(`${this.deletion?"Delete":"Discard"} this file?`),r.createEl("p").setText(`Do you really want to ${this.deletion?"delete":"discard the changes of"} "${this.filename}"`);let i=r.createDiv({cls:"modal-button-container"}),a=i.createEl("button",{cls:"mod-warning",text:this.deletion?"Delete":"Discard"});a.addEventListener("click",()=>{this.resolve&&this.resolve(!0),this.close()}),a.addEventListener("keypress",()=>{this.resolve&&this.resolve(!0),this.close()});let s=i.createEl("button",{text:"Cancel"});s.addEventListener("click",()=>(this.resolve&&this.resolve(!1),this.close())),s.addEventListener("keypress",()=>(this.resolve&&this.resolve(!1),this.close()))}onClose(){let{contentEl:r}=this;r.empty()}};g();var Zd=require("obsidian");g();g();var q9=ze(MP()),Yi=require("obsidian");function za(e,t,r){let n=e.target;app.workspace.trigger("hover-link",{event:e,source:t.getViewType(),hoverParent:t,targetEl:n,linktext:r})}function Y9(e,t){t.view.app.vault.getAbstractFileByPath(t.change.vaultPath)&&za(e,t.view,t.change.vaultPath)}function X9(e,t){e.stopPropagation(),t.manager.stage(t.change.path,!1).catch(r=>t.view.plugin.displayError(r)).finally(()=>{t.view.app.workspace.trigger("obsidian-git:refresh")})}function Z9(e,t){e.stopPropagation();let r=t.change.workingDir=="U";new qi(t.view.app,r,t.change.vaultPath).myOpen().then(n=>{if(n===!0)return r?t.view.app.vault.adapter.remove(t.change.vaultPath).finally(()=>{t.view.app.workspace.trigger("obsidian-git:refresh")}):t.manager.discard(t.change.path).finally(()=>{t.view.app.workspace.trigger("obsidian-git:refresh")})},n=>t.view.plugin.displayError(n))}var K9=se('
'),J9=se('
'),Q9={hash:"svelte-1wbh8tp",code:"main.svelte-1wbh8tp .nav-file-title:where(.svelte-1wbh8tp) {align-items:center;}"};function Sc(e,t){Ze(t,!0),wt(e,Q9);let r=_e([]),n=Xe(()=>t.view.leaf.getRoot().side=="left"?"right":"left");Dt(()=>{for(let x of r)x&&(0,Zd.setIcon)(x,x.getAttr("data-icon"))});function i(x){x.stopPropagation(),Ws(t.change.path)?a(x):s(x)}function a(x){var E;x.stopPropagation();let _=t.view.app.vault.getAbstractFileByPath(t.change.vaultPath);_ instanceof Zd.TFile&&((E=nn(t.view.app,x))===null||E===void 0||E.openFile(_).catch(k=>t.view.plugin.displayError(k)))}function s(x){x.stopPropagation(),t.view.plugin.tools.openDiff({aFile:t.change.path,aRef:"",event:x})}var o=J9();o.__mouseover=[Y9,t],o.__click=i;var l=j(o),c=j(l),u=j(c,!0);Ae(()=>Oe(u,Cn(t.change.vaultPath))),B(c);var f=Z(c,2),d=j(f),h=j(d);{var p=x=>{var E=K9();E.__click=a,Ue(E,_=>r[0]=_,()=>r==null?void 0:r[0]),kr("auxclick",E,a),ne(x,E)};ye(h,x=>{qs(t.change.vaultPath,t.view.app)&&x(p)})}var m=Z(h,2);m.__click=[Z9,t],Ue(m,x=>r[1]=x,()=>r==null?void 0:r[1]);var v=Z(m,2);v.__click=[X9,t],Ue(v,x=>r[2]=x,()=>r==null?void 0:r[2]),B(d);var y=Z(d,2),b=j(y,!0);B(y),B(f),B(l),B(o),Ae(()=>{me(l,"data-path",t.change.vaultPath),me(l,"data-tooltip-position",R(n)),me(l,"aria-label",t.change.vaultPath),me(y,"data-type",t.change.workingDir),Oe(b,t.change.workingDir)}),kr("auxclick",o,x=>{x.stopPropagation(),x.button==2?Tn(t.view.app,x,t.change.vaultPath,t.view.leaf,"git-source-control"):i(x)}),ne(e,o),Ke()}mt(["mouseover","click"]);g();var OP=require("obsidian");function eH(e,t){t.view.app.vault.getAbstractFileByPath(t.change.vaultPath)&&za(e,t.view,t.change.vaultPath)}var tH=se('
'),rH={hash:"svelte-1wbh8tp",code:"main.svelte-1wbh8tp .nav-file-title:where(.svelte-1wbh8tp) {align-items:center;}"};function Ec(e,t){Ze(t,!0),wt(e,rH);let r=Xe(()=>t.view.leaf.getRoot().side=="left"?"right":"left");function n(f){var d;f.stopPropagation();let h=t.view.app.vault.getAbstractFileByPath(t.change.vaultPath);h instanceof OP.TFile&&((d=nn(t.view.app,f))===null||d===void 0||d.openFile(h).catch(p=>t.view.plugin.displayError(p)))}var i=tH();i.__mouseover=[eH,t],i.__click=n;var a=j(i),s=j(a),o=j(s,!0);Ae(()=>Oe(o,Cn(t.change.vaultPath))),B(s);var l=Z(s,2),c=j(l),u=j(c,!0);B(c),B(l),B(a),B(i),Ae(()=>{me(a,"data-path",t.change.vaultPath),me(a,"data-tooltip-position",R(r)),me(a,"aria-label",t.change.vaultPath),me(c,"data-type",t.change.workingDir),Oe(u,t.change.workingDir)}),kr("auxclick",i,f=>{f.stopPropagation(),f.button==2?Tn(t.view.app,f,t.change.vaultPath,t.view.leaf,"git-source-control"):n(f)}),ne(e,i),Ke()}mt(["mouseover","click"]);g();var Kd=require("obsidian");function nH(e,t){t.view.app.vault.getFileByPath(t.change.vaultPath)&&za(e,t.view,t.change.vaultPath)}function iH(e,t){e.stopPropagation(),t.manager.unstage(t.change.path,!1).catch(r=>t.view.plugin.displayError(r)).finally(()=>{t.view.app.workspace.trigger("obsidian-git:refresh")})}var aH=se('
'),sH=se('
'),oH={hash:"svelte-1wbh8tp",code:"main.svelte-1wbh8tp .nav-file-title:where(.svelte-1wbh8tp) {align-items:center;}"};function Ac(e,t){Ze(t,!0),wt(e,oH);let r=_e([]),n=Xe(()=>t.view.leaf.getRoot().side=="left"?"right":"left");Dt(()=>{for(let b of r)b&&(0,Kd.setIcon)(b,b.getAttr("data-icon"))});function i(b){b.stopPropagation(),Ws(t.change.path)?a(b):s(b)}function a(b){var x;b.stopPropagation();let E=t.view.app.vault.getAbstractFileByPath(t.change.vaultPath);E instanceof Kd.TFile&&((x=nn(t.view.app,b))===null||x===void 0||x.openFile(E).catch(_=>t.view.plugin.displayError(_)))}function s(b){b.stopPropagation(),t.view.plugin.tools.openDiff({aFile:t.change.path,aRef:"HEAD",bRef:"",event:b})}var o=sH();o.__mouseover=[nH,t],o.__click=i;var l=j(o),c=j(l),u=j(c,!0);Ae(()=>Oe(u,Cn(t.change.vaultPath))),B(c);var f=Z(c,2),d=j(f),h=j(d);{var p=b=>{var x=aH();x.__click=a,Ue(x,E=>r[0]=E,()=>r==null?void 0:r[0]),ne(b,x)};ye(h,b=>{qs(t.change.vaultPath,t.view.app)&&b(p)})}var m=Z(h,2);m.__click=[iH,t],Ue(m,b=>r[1]=b,()=>r==null?void 0:r[1]),B(d);var v=Z(d,2),y=j(v,!0);B(v),B(f),B(l),B(o),Ae(()=>{me(l,"data-path",t.change.vaultPath),me(l,"data-tooltip-position",R(n)),me(l,"aria-label",t.change.vaultPath),me(v,"data-type",t.change.index),Oe(y,t.change.index)}),kr("auxclick",o,b=>{b.stopPropagation(),b.button==2?Tn(t.view.app,b,t.change.vaultPath,t.view.leaf,"git-source-control"):i(b)}),ne(e,o),Ke()}mt(["mouseover","click"]);g();g();var lH=se(''),cH=se("
");function Va(e,t){Ze(t,!0);var r=cH(),n=j(r);{var i=a=>{var s=lH(),o=j(s),l=j(o),c=j(l,!0);B(l),B(o),B(s),Ae(()=>{me(o,"aria-label","And "+(t.files.length-500)+" more files"),Oe(c,"And "+(t.files.length-500)+" more files")}),ne(a,s)};ye(n,a=>{t.files.length>500&&a(i)})}B(r),ne(e,r),Ke()}var fH=se("
"),dH=(e,t,r)=>t(R(r)),hH=(e,t,r)=>t(e,R(r).path),pH=se('
'),mH=(e,t,r)=>t(e,R(r)),gH=(e,t,r)=>t(e,R(r).path),vH=se('
',1),yH=se(''),wH=se(''),bH=se('
'),_H={hash:"svelte-hup5mn",code:"main.svelte-hup5mn .nav-folder-title:where(.svelte-hup5mn) {align-items:center;}"};function Wa(e,t){Ze(t,!0),wt(e,_H);var r,n;let i=Fn(t,"topLevel",3,!1),a=_e({});for(let p of t.hierarchy.children)a[p.title]=((n=(r=p.children)===null||r===void 0?void 0:r.length)!==null&&n!==void 0?n:0)>100;let s=Xe(()=>t.view.leaf.getRoot().side=="left"?"right":"left");function o(p,m){p.stopPropagation(),t.plugin.gitManager.stageAll({dir:m}).catch(v=>t.plugin.displayError(v)).finally(()=>{t.view.app.workspace.trigger("obsidian-git:refresh")})}function l(p,m){p.stopPropagation(),t.plugin.gitManager.unstageAll({dir:m}).catch(v=>t.plugin.displayError(v)).finally(()=>{t.view.app.workspace.trigger("obsidian-git:refresh")})}function c(p,m){p.stopPropagation(),new qi(t.view.app,!1,m.vaultPath).myOpen().then(v=>{if(v===!0)return t.plugin.gitManager.discardAll({dir:m.path,status:t.plugin.cachedStatus}).finally(()=>{t.view.app.workspace.trigger("obsidian-git:refresh")})},v=>t.plugin.displayError(v))}function u(p){a[p.title]=!a[p.title]}var f=bH(),d=j(f);Cr(d,17,()=>ql(t.hierarchy.children,500),Tr,(p,m)=>{var v=si(),y=cr(v);{var b=E=>{var _=fH(),k=j(_);{var w=S=>{Ac(S,{get change(){return R(m).data},get manager(){return t.plugin.gitManager},get view(){return t.view}})},A=S=>{var T=si(),P=cr(T);{var I=L=>{Sc(L,{get change(){return R(m).data},get manager(){return t.plugin.gitManager},get view(){return t.view}})},N=L=>{var ee=si(),fe=cr(ee);{var J=Q=>{Ec(Q,{get change(){return R(m).data},get view(){return t.view}})};ye(fe,Q=>{t.fileType==2&&Q(J)},!0)}ne(L,ee)};ye(P,L=>{t.fileType==1?L(I):L(N,!1)},!0)}ne(S,T)};ye(k,S=>{t.fileType==0?S(w):S(A,!1)})}B(_),ne(E,_)},x=E=>{var _=wH();_.__click=[dH,u,m];var k=j(_),w=Z(j(k),2),A=Z(w,2),S=j(A,!0);B(A);var T=Z(A,2),P=j(T),I=j(P);{var N=J=>{var Q=pH();Q.__click=[hH,l,m],ne(J,Q)},L=J=>{var Q=vH(),Pe=cr(Q);Pe.__click=[mH,c,m];var ge=Z(Pe,2);ge.__click=[gH,o,m],ne(J,Q)};ye(I,J=>{t.fileType==0?J(N):J(L,!1)})}_o(2),B(P),B(T),B(k);var ee=Z(k,2);{var fe=J=>{var Q=yH(),Pe=j(Q);Wa(Pe,{get hierarchy(){return R(m)},get plugin(){return t.plugin},get view(){return t.view},get fileType(){return t.fileType}}),B(Q),dn(3,Q,()=>Ln,()=>({duration:150})),ne(J,Q)};ye(ee,J=>{a[R(m).title]||J(fe)})}B(_),Ae(()=>{lt(_,"is-collapsed",a[R(m).title]),me(k,"data-tooltip-position",R(s)),me(k,"aria-label",R(m).vaultPath),lt(w,"is-collapsed",a[R(m).title]),Oe(S,R(m).title)}),kr("auxclick",_,J=>Tn(t.view.app,J,R(m).vaultPath,t.view.leaf,"git-source-control")),ne(E,_)};ye(y,E=>{R(m).data?E(b):E(x,!1)})}ne(p,v)});var h=Z(d,2);Va(h,{get files(){return t.hierarchy.children}}),B(f),Ae(()=>lt(f,"topLevel",i())),ne(e,f),Ke()}mt(["click"]);function xH(e,t,r,n,i,a){return Mo(this,void 0,void 0,function*(){if(re(t,!0),R(r)){if(yield n().tools.hasTooBigFiles(R(r).staged))return n().setPluginState({gitAction:0}),!1;n().promiseQueue.addTask(()=>n().gitManager.commit({message:R(i)}).then(()=>re(i,_e(n().settings.commitMessage))).finally(a))}})}function IP(e,t,r,n,i){re(t,!0),r().promiseQueue.addTask(()=>r().gitManager.stageAll({status:R(n)}).finally(i))}function FP(e,t,r,n,i){re(t,!0),r().promiseQueue.addTask(()=>r().gitManager.unstageAll({status:R(n)}).finally(i))}function SH(e,t,r,n){re(t,!0),r().promiseQueue.addTask(()=>r().push().finally(n))}function EH(e,t,r,n){re(t,!0),r().promiseQueue.addTask(()=>r().pullChangesFromRemote().finally(n))}function AH(e,t,r){e.stopPropagation(),new qi(t().app,!1,r().gitManager.getRelativeVaultPath("/")).myOpen().then(n=>{n===!0&&r().promiseQueue.addTask(()=>r().gitManager.discardAll({status:r().cachedStatus}).finally(()=>{t().app.workspace.trigger("obsidian-git:refresh")}))},console.error)}var kH=(e,t,r,n)=>{re(t,!R(t)),(0,qa.setIcon)(r[6],R(t)?"list":"folder"),n().settings.treeStructure=R(t),n().saveSettings()},TH=(e,t)=>re(t,""),CH=se('
'),PH=(e,t)=>re(t,!R(t)),RH=se(" ",1),MH=se(''),OH=(e,t)=>re(t,!R(t)),IH=se(" ",1),FH=se(''),$H=(e,t)=>re(t,!R(t)),LH=se(" ",1),DH=se(''),NH=se(''),BH=se(''),jH=se('
'),HH={hash:"svelte-11adhly",code:`.commit-msg-input.svelte-11adhly {width:100%;overflow:hidden;resize:none;padding:7px 5px;background-color:var(--background-modifier-form-field);}.git-commit-msg.svelte-11adhly {position:relative;padding:0;width:calc(100% - var(--size-4-8));margin:4px auto;}main.svelte-11adhly .git-tools:where(.svelte-11adhly) .files-count:where(.svelte-11adhly) {padding-left:var(--size-2-1);width:11px;display:flex;align-items:center;justify-content:center;}.nav-folder-title.svelte-11adhly {align-items:center;}.git-commit-msg-clear-button.svelte-11adhly {position:absolute;background:transparent;border-radius:50%;color:var(--search-clear-button-color);cursor:var(--cursor);top:-4px;right:2px;bottom:0px;line-height:0;height:var(--input-height);width:28px;margin:auto;padding:0 0;text-align:center;display:flex;justify-content:center;align-items:center;transition:color 0.15s ease-in-out;}.git-commit-msg-clear-button.svelte-11adhly:after {content:"";height:var(--search-clear-button-size);width:var(--search-clear-button-size);display:block;background-color:currentColor;mask-image:url("data:image/svg+xml,");mask-repeat:no-repeat;-webkit-mask-image:url("data:image/svg+xml,");-webkit-mask-repeat:no-repeat;}`};function Lv(e,t){Ze(t,!0),wt(e,HH);let r=Fn(t,"plugin",7),n=Fn(t,"view",7),i=pt(!1),a=pt(void 0),s=pt(_e([])),o=pt(_e(r().settings.commitMessage)),l=_e([]),c=pt(void 0),u=pt(void 0),f=pt(void 0),d=pt(!0),h=pt(!0),p=pt(!0),m=pt(0),v=pt(_e(r().settings.treeStructure));n().registerEvent(n().app.workspace.on("obsidian-git:loading-status",()=>re(i,!0))),n().registerEvent(n().app.workspace.on("obsidian-git:status-changed",()=>void b().catch(console.error))),n().plugin.cachedStatus==null?n().plugin.refresh().catch(console.error):b().catch(console.error),Dt(()=>{l.forEach(O=>(0,qa.setIcon)(O,O.getAttr("data-icon")))}),Dt(()=>{l.forEach(O=>{var he,Ge;!O||O.id!="push"||(qa.Platform.isMobile?(O.removeClass("button-border"),R(m)>0&&O.addClass("button-border")):((he=O.firstElementChild)===null||he===void 0||he.removeAttribute("color"),R(m)>0&&((Ge=O.firstElementChild)===null||Ge===void 0||Ge.setAttr("color","var(--text-accent)"))))})}),n().scope=new qa.Scope(r().app.scope),n().scope.register(["Ctrl"],"Enter",O=>y());function y(){if(re(i,!0),R(a)){let O=R(a).staged.length>0;r().promiseQueue.addTask(()=>r().commitAndSync({fromAutoBackup:!1,commitMessage:R(o),onlyStaged:O}).then(()=>{re(o,_e(r().settings.commitMessage))}).finally(x))}}function b(){return Mo(this,void 0,void 0,function*(){if(!r().gitReady){re(a,void 0);return}if(re(m,_e(yield r().gitManager.getUnpushedCommits())),re(a,_e(r().cachedStatus)),re(i,!1),r().lastPulledFiles&&r().lastPulledFiles!=R(s)&&(re(s,_e(r().lastPulledFiles)),re(f,_e({title:"",path:"",vaultPath:"",children:r().gitManager.getTreeStructure(R(s))}))),R(a)){let O=(he,Ge)=>he.vaultPath.split("/").last().localeCompare(Cn(Ge.vaultPath));R(a).changed.sort(O),R(a).staged.sort(O),re(c,_e({title:"",path:"",vaultPath:"",children:r().gitManager.getTreeStructure(R(a).changed)})),re(u,_e({title:"",path:"",vaultPath:"",children:r().gitManager.getTreeStructure(R(a).staged)}))}else re(c,void 0),re(u,void 0)})}function x(){n().app.workspace.trigger("obsidian-git:refresh")}let E=Xe(()=>(R(o).match(/\n/g)||[]).length+1||1);var _=jH(),k=j(_),w=j(k),A=j(w);A.__click=y,Ue(A,O=>l[0]=O,()=>l==null?void 0:l[0]);var S=Z(A,2);S.__click=[xH,i,a,r,o,x],Ue(S,O=>l[1]=O,()=>l==null?void 0:l[1]);var T=Z(S,2);T.__click=[IP,i,r,a,x],Ue(T,O=>l[2]=O,()=>l==null?void 0:l[2]);var P=Z(T,2);P.__click=[FP,i,r,a,x],Ue(P,O=>l[3]=O,()=>l==null?void 0:l[3]);var I=Z(P,2);I.__click=[SH,i,r,x],Ue(I,O=>l[4]=O,()=>l==null?void 0:l[4]);var N=Z(I,2);N.__click=[EH,i,r,x],Ue(N,O=>l[5]=O,()=>l==null?void 0:l[5]);var L=Z(N,2);L.__click=[kH,v,l,r],Ue(L,O=>l[6]=O,()=>l==null?void 0:l[6]);var ee=Z(L,2);ee.__click=x,Ue(ee,O=>l[7]=O,()=>l==null?void 0:l[7]),B(w),B(k);var fe=Z(k,2),J=j(fe);pv(J);var Q=Z(J,2);{var Pe=O=>{var he=CH();he.__click=[TH,o],me(he,"aria-label","Clear"),ne(O,he)};ye(Q,O=>{R(o)&&O(Pe)})}B(fe);var ge=Z(fe,2),z=j(ge);{var Y=O=>{var he=BH(),Ge=j(he),gt=j(Ge);gt.__click=[PH,h];var Re=j(gt),ct=Z(Re,4),rt=j(ct),Et=j(rt);Et.__click=[FP,i,r,a,x],Ue(Et,Bt=>l[8]=Bt,()=>l==null?void 0:l[8]),B(rt);var Ie=Z(rt,2),H=j(Ie,!0);B(Ie),B(ct),B(gt);var Je=Z(gt,2);{var D=Bt=>{var Kt=MH(),ci=j(Kt);{var Ya=jt=>{Wa(jt,{get hierarchy(){return R(u)},get plugin(){return r()},get view(){return n()},get fileType(){return 0},topLevel:!0})},Oo=jt=>{var Zi=RH(),Dn=cr(Zi);Cr(Dn,17,()=>ql(R(a).staged,500),Tr,(Io,Fo)=>{Ac(Io,{get change(){return R(Fo)},get view(){return n()},get manager(){return r().gitManager}})});var ui=Z(Dn,2);Va(ui,{get files(){return R(a).staged}}),ne(jt,Zi)};ye(ci,jt=>{R(v)?jt(Ya):jt(Oo,!1)})}B(Kt),dn(3,Kt,()=>Ln,()=>({duration:150})),ne(Bt,Kt)};ye(Je,Bt=>{R(h)&&Bt(D)})}B(Ge);var q=Z(Ge,2),ve=j(q);ve.__click=[OH,d];var Ne=j(ve),bt=Z(Ne,4),Xi=j(bt),Dv=j(Xi);Dv.__click=[AH,n,r];var Nv=Z(Dv,2);Nv.__click=[IP,i,r,a,x],Ue(Nv,Bt=>l[9]=Bt,()=>l==null?void 0:l[9]),B(Xi);var Bv=Z(Xi,2),DP=j(Bv,!0);B(Bv),B(bt),B(ve);var NP=Z(ve,2);{var BP=Bt=>{var Kt=FH(),ci=j(Kt);{var Ya=jt=>{Wa(jt,{get hierarchy(){return R(c)},get plugin(){return r()},get view(){return n()},get fileType(){return 1},topLevel:!0})},Oo=jt=>{var Zi=IH(),Dn=cr(Zi);Cr(Dn,17,()=>ql(R(a).changed,500),Tr,(Io,Fo)=>{Sc(Io,{get change(){return R(Fo)},get view(){return n()},get manager(){return r().gitManager}})});var ui=Z(Dn,2);Va(ui,{get files(){return R(a).changed}}),ne(jt,Zi)};ye(ci,jt=>{R(v)?jt(Ya):jt(Oo,!1)})}B(Kt),dn(3,Kt,()=>Ln,()=>({duration:150})),ne(Bt,Kt)};ye(NP,Bt=>{R(d)&&Bt(BP)})}B(q);var jP=Z(q,2);{var HP=Bt=>{var Kt=NH(),ci=j(Kt);ci.__click=[$H,p];var Ya=Z(j(ci),4),Oo=j(Ya,!0);B(Ya),B(ci);var jt=Z(ci,2);{var Zi=Dn=>{var ui=DH(),Io=j(ui);{var Fo=Xa=>{Wa(Xa,{get hierarchy(){return R(f)},get plugin(){return r()},get view(){return n()},get fileType(){return 2},topLevel:!0})},UP=Xa=>{var jv=LH(),Hv=cr(jv);Cr(Hv,17,()=>R(s),Tr,(zP,VP)=>{Ec(zP,{get change(){return R(VP)},get view(){return n()}})});var GP=Z(Hv,2);Va(GP,{get files(){return R(s)}}),ne(Xa,jv)};ye(Io,Xa=>{R(v)?Xa(Fo):Xa(UP,!1)})}B(ui),dn(3,ui,()=>Ln,()=>({duration:150})),ne(Dn,ui)};ye(jt,Dn=>{R(p)&&Dn(Zi)})}B(Kt),Ae(()=>{lt(Kt,"is-collapsed",!R(p)),Oe(Oo,R(s).length)}),ne(Bt,Kt)};ye(jP,Bt=>{R(s).length>0&&R(f)&&Bt(HP)})}B(he),Ae(()=>{lt(Ge,"is-collapsed",!R(h)),lt(Re,"is-collapsed",!R(h)),Oe(H,R(a).staged.length),lt(q,"is-collapsed",!R(d)),lt(Ne,"is-collapsed",!R(d)),Oe(DP,R(a).changed.length)}),ne(O,he)};ye(z,O=>{R(a)&&R(u)&&R(c)&&O(Y)})}B(ge),B(_),Ae(()=>{me(_,"data-type",kt.type),me(L,"data-icon",R(v)?"list":"folder"),lt(ee,"loading",R(i)),me(J,"rows",R(E))}),kv(J,()=>R(o),O=>re(o,O)),ne(e,_),Ke()}mt(["click"]);var kc=class extends $P.ItemView{constructor(t,r){super(t),this.plugin=r,this.hoverPopover=null}getViewType(){return kt.type}getDisplayText(){return kt.name}getIcon(){return kt.icon}onClose(){return this._view&&oi(this._view),super.onClose()}reload(){this._view&&oi(this._view),this._view=Vi(Lv,{target:this.contentEl,props:{plugin:this.plugin,view:this}})}onOpen(){return this.reload(),super.onOpen()}};g();var Jd=class{constructor(t,r){this.statusBarEl=t;this.plugin=r;this.statusBarEl.addClass("mod-clickable"),this.statusBarEl.onClickEvent(n=>{this.plugin.switchBranch().catch(i=>r.displayError(i))})}async display(){if(this.plugin.gitReady){let t=await this.plugin.gitManager.branchInfo();t.current!=null?this.statusBarEl.setText(t.current):this.statusBarEl.empty()}else this.statusBarEl.empty()}remove(){this.statusBarEl.remove()}};var Qd=class extends xe.Plugin{constructor(){super(...arguments);this.automaticsManager=new Jl(this);this.tools=new ec(this);this.localStorage=new cd(this);this.state={gitAction:0,offlineMode:!1};this.gitReady=!1;this.promiseQueue=new nd(this);this.intervalsToClear=[];this.lineAuthoringFeature=new rd(this)}setPluginState(r){var n;this.state=Object.assign(this.state,r),(n=this.statusBar)==null||n.display()}async updateCachedStatus(){var r,n;return this.app.workspace.trigger("obsidian-git:loading-status"),this.cachedStatus=await this.gitManager.status(),this.cachedStatus.conflicted.length>0?(this.localStorage.setConflict(!0),await((r=this.branchBar)==null?void 0:r.display())):(this.localStorage.setConflict(!1),await((n=this.branchBar)==null?void 0:n.display())),this.app.workspace.trigger("obsidian-git:status-changed",this.cachedStatus),this.cachedStatus}async refresh(){if(!this.gitReady)return;let r=this.app.workspace.getLeavesOfType(kt.type),n=this.app.workspace.getLeavesOfType(Lr.type);(this.settings.changedFilesInStatusBar||r.some(i=>{var a;return!((a=i.isDeferred)!=null&&a)})||n.some(i=>{var a;return!((a=i.isDeferred)!=null&&a)}))&&await this.updateCachedStatus().catch(i=>this.displayError(i)),this.app.workspace.trigger("obsidian-git:refreshed")}refreshUpdatedHead(){this.lineAuthoringFeature.refreshLineAuthorViews()}async onload(){console.log("loading "+this.manifest.name+" plugin: v"+this.manifest.version),Kl.plugin=this,this.localStorage.migrate(),await this.loadSettings(),await this.migrateSettings(),this.settingsTab=new Uf(this.app,this),this.addSettingTab(this.settingsTab),this.localStorage.getPluginDisabled()||(this.registerStuff(),this.app.workspace.onLayoutReady(()=>this.init({fromReload:!1}).catch(r=>this.displayError(r))))}onExternalSettingsChange(){this.reloadSettings().catch(r=>this.displayError(r))}async reloadSettings(){let r=JSON.stringify(this.settings);await this.loadSettings();let n=JSON.stringify(this.settings);r!==n&&(this.log("Reloading settings"),this.unloadPlugin(),await this.init({fromReload:!0}),this.app.workspace.getLeavesOfType(kt.type).forEach(i=>{var a;if(!((a=i.isDeferred)!=null&&a))return i.view.reload()}),this.app.workspace.getLeavesOfType(Lr.type).forEach(i=>{var a;if(!((a=i.isDeferred)!=null&&a))return i.view.reload()}))}registerStuff(){this.registerEvent(this.app.workspace.on("obsidian-git:refresh",()=>{this.refresh().catch(r=>this.displayError(r))})),this.registerEvent(this.app.workspace.on("obsidian-git:head-change",()=>{this.refreshUpdatedHead()})),this.registerEvent(this.app.workspace.on("file-menu",(r,n,i)=>{this.handleFileMenu(r,n,i,"file-manu")})),this.registerEvent(this.app.workspace.on("obsidian-git:menu",(r,n,i)=>{this.handleFileMenu(r,n,i,"obsidian-git:menu")})),this.registerEvent(this.app.workspace.on("active-leaf-change",r=>{this.onActiveLeafChange(r)})),this.registerEvent(this.app.vault.on("modify",()=>{var r;this.debRefresh(),(r=this.autoCommitDebouncer)==null||r.call(this)})),this.registerEvent(this.app.vault.on("delete",()=>{var r;this.debRefresh(),(r=this.autoCommitDebouncer)==null||r.call(this)})),this.registerEvent(this.app.vault.on("create",()=>{var r;this.debRefresh(),(r=this.autoCommitDebouncer)==null||r.call(this)})),this.registerEvent(this.app.vault.on("rename",()=>{var r;this.debRefresh(),(r=this.autoCommitDebouncer)==null||r.call(this)})),this.registerView(kt.type,r=>new kc(r,this)),this.registerView(Lr.type,r=>new _c(r,this)),this.registerView(Ti.type,r=>new Ra(r,this)),this.registerView(ki.type,r=>new Ia(r,this)),this.addRibbonIcon("git-pull-request","Open Git source control",async()=>{var i;let r=this.app.workspace.getLeavesOfType(kt.type),n;r.length===0?(n=(i=this.app.workspace.getRightLeaf(!1))!=null?i:this.app.workspace.getLeaf(),await n.setViewState({type:kt.type})):n=r.first(),await this.app.workspace.revealLeaf(n)}),this.registerHoverLinkSource(kt.type,{display:"Git View",defaultMod:!0}),this.lineAuthoringFeature.onLoadPlugin(),this.setRefreshDebouncer(),dC(this)}setRefreshDebouncer(){var r;(r=this.debRefresh)==null||r.cancel(),this.debRefresh=(0,xe.debounce)(()=>{this.settings.refreshSourceControl&&this.refresh().catch(console.error)},this.settings.refreshSourceControlTimer,!0)}async addFileToGitignore(r,n){let i=this.gitManager.getRelativeRepoPath(r,!0),a=yT({isFolder:n,gitRelativePath:i});return await this.app.vault.adapter.append(this.gitManager.getRelativeVaultPath(".gitignore"),` +`+a),this.refresh()}handleFileMenu(r,n,i,a){if(!this.gitReady||!this.settings.showFileMenu||!n)return;let s;if(typeof n=="string"?s=n:s=n.path,i=="file-explorer-context-menu"&&(r.addItem(o=>{o.setTitle("Git: Stage").setIcon("plus-circle").setSection("action").onClick(l=>{this.promiseQueue.addTask(async()=>{n instanceof xe.TFile?await this.gitManager.stage(n.path,!0):await this.gitManager.stageAll({dir:this.gitManager.getRelativeRepoPath(s,!0)}),this.displayMessage(`Staged ${s}`)})})}),r.addItem(o=>{o.setTitle("Git: Unstage").setIcon("minus-circle").setSection("action").onClick(l=>{this.promiseQueue.addTask(async()=>{n instanceof xe.TFile?await this.gitManager.unstage(n.path,!0):await this.gitManager.unstageAll({dir:this.gitManager.getRelativeRepoPath(s,!0)}),this.displayMessage(`Unstaged ${s}`)})})}),r.addItem(o=>{o.setTitle("Git: Add to .gitignore").setIcon("file-x").setSection("action").onClick(l=>{this.addFileToGitignore(s,n instanceof xe.TFolder).catch(c=>this.displayError(c))})})),i=="git-source-control"){r.addItem(l=>{l.setTitle("Git: Add to .gitignore").setIcon("file-x").setSection("action").onClick(c=>{this.addFileToGitignore(s,n instanceof xe.TFolder).catch(u=>this.displayError(u))})});let o=this.app.vault.adapter;a==="obsidian-git:menu"&&o instanceof xe.FileSystemAdapter&&(r.addItem(l=>{l.setTitle("Open in default app").setIcon("arrow-up-right").setSection("action").onClick(c=>{this.app.openWithDefaultApp(s)})}),r.addItem(l=>{l.setTitle("Show in system explorer").setIcon("arrow-up-right").setSection("action").onClick(c=>{window.electron.shell.showItemInFolder(LP.join(o.getBasePath(),s))})}))}}async migrateSettings(){this.settings.mergeOnPull!=null&&(this.settings.syncMethod=this.settings.mergeOnPull?"merge":"rebase",this.settings.mergeOnPull=void 0,await this.saveSettings()),this.settings.autoCommitMessage===void 0&&(this.settings.autoCommitMessage=this.settings.commitMessage,await this.saveSettings()),this.settings.gitPath!=null&&(this.localStorage.setGitPath(this.settings.gitPath),this.settings.gitPath=void 0,await this.saveSettings()),this.settings.username!=null&&(this.localStorage.setPassword(this.settings.username),this.settings.username=void 0,await this.saveSettings())}unloadPlugin(){var r,n;this.gitReady=!1,this.lineAuthoringFeature.deactivateFeature(),this.automaticsManager.unload(),(r=this.branchBar)==null||r.remove(),(n=this.statusBar)==null||n.remove(),this.statusBar=void 0,this.branchBar=void 0,this.gitManager.unload(),this.promiseQueue.clear();for(let i of this.intervalsToClear)window.clearInterval(i);this.intervalsToClear=[],this.debRefresh.cancel()}onunload(){this.unloadPlugin(),console.log("unloading "+this.manifest.name+" plugin")}async loadSettings(){let r=await this.loadData();r==null&&(r={showedMobileNotice:!0}),this.settings=Tx(Ye,r)}async saveSettings(){var r;(r=this.settingsTab)==null||r.beforeSaveSettings(),await this.saveData(this.settings)}get useSimpleGit(){return xe.Platform.isDesktopApp}async init({fromReload:r=!1}){var n;if(this.settings.showStatusBar&&!this.statusBar){let i=this.addStatusBarItem();this.statusBar=new id(i,this),this.intervalsToClear.push(window.setInterval(()=>{var a;return(a=this.statusBar)==null?void 0:a.display()},1e3))}try{this.useSimpleGit?(this.gitManager=new Ce(this),await this.gitManager.setGitInstance()):this.gitManager=new sn(this);let i=await this.gitManager.checkRequirements();switch(i){case"missing-git":this.displayError(`Cannot run git command. Trying to run: '${this.localStorage.getGitPath()||"git"}' .`);break;case"missing-repo":new xe.Notice("Can't find a valid git repository. Please create one via the given command or clone an existing repo.",1e4);break;case"valid":if(this.gitReady=!0,this.setPluginState({gitAction:0}),xe.Platform.isDesktop&&this.settings.showBranchStatusBar&&!this.branchBar){let a=this.addStatusBarItem();this.branchBar=new Jd(a,this),this.intervalsToClear.push(window.setInterval(()=>{var s;return void((s=this.branchBar)==null?void 0:s.display().catch(console.error))},6e4))}await((n=this.branchBar)==null?void 0:n.display()),this.lineAuthoringFeature.conditionallyActivateBySettings(),this.app.workspace.trigger("obsidian-git:refresh"),this.app.workspace.trigger("obsidian-git:head-change"),!r&&this.settings.autoPullOnBoot&&this.promiseQueue.addTask(()=>this.pullChangesFromRemote()),await this.automaticsManager.init();break;default:this.log("Something weird happened. The 'checkRequirements' result is "+i)}}catch(i){this.displayError(i),console.error(i)}}async createNewRepo(){try{await this.gitManager.init(),new xe.Notice("Initialized new repo"),await this.init({fromReload:!0})}catch(r){this.displayError(r)}}async cloneNewRepo(){let n=await new $e(this,{placeholder:"Enter remote URL"}).openAndGetResult();if(n){let i="Vault Root",a=await new $e(this,{options:this.gitManager instanceof sn?[i]:[],placeholder:"Enter directory for clone. It needs to be empty or not existent.",allowEmpty:this.gitManager instanceof sn}).openAndGetResult();if(a==null)return;if(a===i&&(a="."),a=(0,xe.normalizePath)(a),a==="/"&&(a="."),a==="."){let f=await new $e(this,{options:["NO","YES"],placeholder:`Does your remote repo contain a ${this.app.vault.configDir} directory at the root?`,onlySelection:!0}).openAndGetResult();if(f===void 0){new xe.Notice("Aborted clone");return}else if(f==="YES"){let d="DELETE ALL YOUR LOCAL CONFIG AND PLUGINS";if(await new $e(this,{options:["Abort clone",d],placeholder:`To avoid conflicts, the local ${this.app.vault.configDir} directory needs to be deleted.`,onlySelection:!0}).openAndGetResult()===d)await this.app.vault.adapter.rmdir(this.app.vault.configDir,!0);else{new xe.Notice("Aborted clone");return}}}let s=await new $e(this,{placeholder:"Specify depth of clone. Leave empty for full clone.",allowEmpty:!0}).openAndGetResult(),o;if(s!==""&&(o=parseInt(s),isNaN(o))){new xe.Notice("Invalid depth. Aborting clone.");return}new xe.Notice(`Cloning new repo into "${a}"`);let l=this.settings.basePath,c=a&&a!==".";c&&(this.settings.basePath=a);try{await this.gitManager.clone(Wg(n),a,o),new xe.Notice("Cloned new repo."),new xe.Notice("Please restart Obsidian"),c&&await this.saveSettings()}catch(u){this.displayError(u),this.settings.basePath=l,await this.saveSettings()}}}async isAllInitialized(){return this.gitReady||await this.init({fromReload:!0}),this.gitReady}async pullChangesFromRemote(){if(!await this.isAllInitialized())return;let r=await this.pull();if(r!==!1){if(r||this.displayMessage("Pull: Everything is up-to-date"),this.gitManager instanceof Ce){let n=await this.updateCachedStatus();n.conflicted.length>0&&(this.displayError(`You have conflicts in ${n.conflicted.length} ${n.conflicted.length==1?"file":"files"}`),await this.handleConflict(n.conflicted))}this.app.workspace.trigger("obsidian-git:refresh"),this.setPluginState({gitAction:0})}}async commitAndSync({fromAutoBackup:r,requestCustomMessage:n=!1,commitMessage:i,onlyStaged:a=!1}){!await this.isAllInitialized()||(this.settings.syncMethod=="reset"&&this.settings.pullBeforePush&&await this.pull(),!await this.commit({fromAuto:r,requestCustomMessage:n,commitMessage:i,onlyStaged:a}))||(this.settings.syncMethod!="reset"&&this.settings.pullBeforePush&&await this.pull(),this.settings.disablePush||(await this.remotesAreSet()&&await this.gitManager.canPush()?await this.push():this.displayMessage("No commits to push")),this.setPluginState({gitAction:0}))}async commit({fromAuto:r,requestCustomMessage:n=!1,onlyStaged:i=!1,commitMessage:a,amend:s=!1}){if(!await this.isAllInitialized())return!1;try{let o=this.localStorage.getConflict(),l,c,u;if(this.gitManager instanceof Ce){if(await this.mayDeleteConflictFile(),c=await this.updateCachedStatus(),c.conflicted.length==0&&(o=!1),r&&c.conflicted.length>0)return this.displayError(`Did not commit, because you have conflicts in ${c.conflicted.length} ${c.conflicted.length==1?"file":"files"}. Please resolve them and commit per command.`),await this.handleConflict(c.conflicted),!1;l=[...c.changed,...c.staged]}else{if(r&&o)return this.displayError("Did not commit, because you have conflicts. Please resolve them and commit per command."),!1;if(o)await this.mayDeleteConflictFile(),c=await this.updateCachedStatus(),l=[...c.changed,...c.staged];else{let f=this.gitManager;i?l=await f.getStagedFiles():(u=await f.getUnstagedFiles(),l=u.map(({path:d})=>({vaultPath:this.gitManager.getRelativeVaultPath(d),path:d})))}}if(await this.tools.hasTooBigFiles(l))return this.setPluginState({gitAction:0}),!1;if(l.length!==0||o){let f=a!=null?a:a=r?this.settings.autoCommitMessage:this.settings.commitMessage;if(r&&this.settings.customMessageOnAutoBackup||n){!this.settings.disablePopups&&r&&new xe.Notice("Auto backup: Please enter a custom commit message. Leave empty to abort");let p=await new ad(this).openAndGetResult();if(p!=null&&p!=""&&p!="...")f=p;else return this.setPluginState({gitAction:0}),!1}let d;i?d=await this.gitManager.commit({message:f,amend:s}):d=await this.gitManager.commitAll({message:f,status:c,unstagedFiles:u,amend:s}),this.gitManager instanceof Ce&&await this.updateCachedStatus();let h=!1;d===void 0&&(h=!0,d=l.length),this.displayMessage(`Committed${h?" approx.":""} ${d} ${d==1?"file":"files"}`)}else this.displayMessage("No changes to commit");return this.app.workspace.trigger("obsidian-git:refresh"),!0}catch(o){return this.displayError(o),!1}}async push(){if(!await this.isAllInitialized()||!await this.remotesAreSet())return!1;let r=this.localStorage.getConflict();try{this.gitManager instanceof Ce&&await this.mayDeleteConflictFile();let n;if(this.gitManager instanceof Ce&&(n=await this.updateCachedStatus()).conflicted.length>0)return this.displayError(`Cannot push. You have conflicts in ${n.conflicted.length} ${n.conflicted.length==1?"file":"files"}`),await this.handleConflict(n.conflicted),!1;if(this.gitManager instanceof sn&&r)return this.displayError("Cannot push. You have conflicts"),!1;this.log("Pushing....");let i=await this.gitManager.push();return i!==void 0&&(i>0?this.displayMessage(`Pushed ${i} ${i==1?"file":"files"} to remote`):this.displayMessage("No commits to push")),this.setPluginState({offlineMode:!1}),this.app.workspace.trigger("obsidian-git:refresh"),!0}catch(n){return n instanceof $s?this.handleNoNetworkError(n):this.displayError(n),!1}}async pull(){if(!await this.remotesAreSet())return!1;try{this.log("Pulling....");let r=await this.gitManager.pull()||[];return this.setPluginState({offlineMode:!1}),r.length>0&&(this.displayMessage(`Pulled ${r.length} ${r.length==1?"file":"files"} from remote`),this.lastPulledFiles=r),r.length}catch(r){return this.displayError(r),!1}}async fetch(){if(await this.remotesAreSet())try{await this.gitManager.fetch(),this.displayMessage("Fetched from remote"),this.setPluginState({offlineMode:!1}),this.app.workspace.trigger("obsidian-git:refresh")}catch(r){this.displayError(r)}}async mayDeleteConflictFile(){let r=this.app.vault.getAbstractFileByPath(Fs);r&&(this.app.workspace.iterateAllLeaves(n=>{var i;n.view instanceof xe.MarkdownView&&((i=n.view.file)==null?void 0:i.path)==r.path&&n.detach()}),await this.app.vault.delete(r))}async stageFile(r){return await this.isAllInitialized()?(await this.gitManager.stage(r.path,!0),this.displayMessage(`Staged ${r.path}`),this.app.workspace.trigger("obsidian-git:refresh"),this.setPluginState({gitAction:0}),!0):!1}async unstageFile(r){return await this.isAllInitialized()?(await this.gitManager.unstage(r.path,!0),this.displayMessage(`Unstaged ${r.path}`),this.app.workspace.trigger("obsidian-git:refresh"),this.setPluginState({gitAction:0}),!0):!1}async switchBranch(){var i;if(!await this.isAllInitialized())return;let r=await this.gitManager.branchInfo(),n=await new Xd(this,r.branches).openAndGetReslt();if(n!=null)return await this.gitManager.checkout(n),this.displayMessage(`Switched to ${n}`),this.app.workspace.trigger("obsidian-git:refresh"),await((i=this.branchBar)==null?void 0:i.display()),n}async switchRemoteBranch(){var a;if(!await this.isAllInitialized())return;let r=await this.selectRemoteBranch()||"",[n,i]=Fi(r);if(i!=null&&n!=null)return await this.gitManager.checkout(i,n),this.displayMessage(`Switched to ${r}`),await((a=this.branchBar)==null?void 0:a.display()),r}async createBranch(){var n;if(!await this.isAllInitialized())return;let r=await new $e(this,{placeholder:"Create new branch"}).openAndGetResult();if(r!=null)return await this.gitManager.createBranch(r),this.displayMessage(`Created new branch ${r}`),await((n=this.branchBar)==null?void 0:n.display()),r}async deleteBranch(){var i;if(!await this.isAllInitialized())return;let r=await this.gitManager.branchInfo();r.current&&r.branches.remove(r.current);let n=await new $e(this,{options:r.branches,placeholder:"Delete branch",onlySelection:!0}).openAndGetResult();if(n!=null){let a=!1;if(!await this.gitManager.branchIsMerged(n)){let o=await new $e(this,{options:["YES","NO"],placeholder:"This branch isn't merged into HEAD. Force delete?",onlySelection:!0}).openAndGetResult();if(o!=="YES")return;a=o==="YES"}return await this.gitManager.deleteBranch(n,a),this.displayMessage(`Deleted branch ${n}`),await((i=this.branchBar)==null?void 0:i.display()),n}}async remotesAreSet(){return this.settings.updateSubmodules||(await this.gitManager.branchInfo()).tracking?!0:(new xe.Notice("No upstream branch is set. Please select one."),await this.setUpstreamBranch())}async setUpstreamBranch(){let r=await this.selectRemoteBranch();return r==null?(this.displayError("Aborted. No upstream-branch is set!",1e4),this.setPluginState({gitAction:0}),!1):(await this.gitManager.updateUpstreamBranch(r),this.displayMessage(`Set upstream branch to ${r}`),this.setPluginState({gitAction:0}),!0)}async discardAll(){await this.gitManager.discardAll({status:this.cachedStatus}),new xe.Notice("All local changes have been discarded. New files remain untouched."),this.app.workspace.trigger("obsidian-git:refresh")}async handleConflict(r){this.localStorage.setConflict(!0);let n;r!==void 0&&(n=["# Conflicts","Please resolve them and commit them using the commands `Git: Commit all changes` followed by `Git: Push`","(This file will automatically be deleted before commit)","[[#Additional Instructions]] available below file list","",...r.map(i=>{let a=this.app.vault.getAbstractFileByPath(i);return a instanceof xe.TFile?`- [[${this.app.metadataCache.fileToLinktext(a,"/")}]]`:`- Not a file: ${i}`}),` +# Additional Instructions +I strongly recommend to use "Source mode" for viewing the conflicted files. For simple conflicts, in each file listed above replace every occurrence of the following text blocks with the desired text. + +\`\`\`diff +<<<<<<< HEAD + File changes in local repository +======= + File changes in remote repository +>>>>>>> origin/main +\`\`\``]),await this.tools.writeAndOpenFile(n==null?void 0:n.join(` +`))}async editRemotes(){if(!await this.isAllInitialized())return;let r=await this.gitManager.getRemotes(),i=await new $e(this,{options:r,placeholder:"Select or create a new remote by typing its name and selecting it"}).openAndGetResult();if(i){let a=await this.gitManager.getRemoteUrl(i),o=await new $e(this,{initialValue:a}).openAndGetResult();if(o)return await this.gitManager.setRemote(i,Wg(o)),i}}async selectRemoteBranch(){let r=await this.gitManager.getRemotes(),n;r.length===0&&(n=await this.editRemotes(),n==null&&(r=await this.gitManager.getRemotes()));let i=new $e(this,{options:r,placeholder:"Select or create a new remote by typing its name and selecting it"}),a=n!=null?n:await i.openAndGetResult();if(a){this.displayMessage("Fetching remote branches"),await this.gitManager.fetch(a);let s=await this.gitManager.getRemoteBranches(a);return await new $e(this,{options:s,placeholder:"Select or create a new remote branch by typing its name and selecting it"}).openAndGetResult()}}async removeRemote(){if(!await this.isAllInitialized())return;let r=await this.gitManager.getRemotes(),i=await new $e(this,{options:r,placeholder:"Select a remote"}).openAndGetResult();i&&await this.gitManager.removeRemote(i)}onActiveLeafChange(r){var s,o;let n=r==null?void 0:r.view;if(!(n!=null&&n.getState().file)&&!(n instanceof Ra||n instanceof Ia))return;let i=this.app.workspace.getLeavesOfType(kt.type).first(),a=this.app.workspace.getLeavesOfType(Lr.type).first();if((s=i==null?void 0:i.view.containerEl.querySelector("div.nav-file-title.is-active"))==null||s.removeClass("is-active"),(o=a==null?void 0:a.view.containerEl.querySelector("div.nav-file-title.is-active"))==null||o.removeClass("is-active"),(r==null?void 0:r.view)instanceof Ra||(r==null?void 0:r.view)instanceof Ia){let l=r.view.state.bFile;this.lastDiffViewState=r.view.getState();let c;i&&r.view.state.aRef=="HEAD"?c=i.view.containerEl.querySelector(`div.staged div.nav-file-title[data-path='${l}']`):i&&r.view.state.aRef==""?c=i.view.containerEl.querySelector(`div.changes div.nav-file-title[data-path='${l}']`):a&&(c=a.view.containerEl.querySelector(`div.nav-file-title[data-path='${l}']`)),c==null||c.addClass("is-active")}else this.lastDiffViewState=void 0}handleNoNetworkError(r){this.state.offlineMode?this.log("Encountered network error, but already in offline mode"):this.displayError("Git: Going into offline mode. Future network errors will no longer be displayed.",2e3),this.setPluginState({gitAction:0,offlineMode:!0})}displayMessage(r,n=4*1e3){var i;(i=this.statusBar)==null||i.displayMessage(r.toLowerCase(),n),this.settings.disablePopups||(!this.settings.disablePopupsForNoChanges||!r.startsWith("No changes"))&&new xe.Notice(r,5*1e3),this.log(r)}displayError(r,n=10*1e3){var a;if(r instanceof wl.UserCanceledError){new xe.Notice("Aborted");return}let i;r instanceof Error?i=r:i=new Error(String(r)),this.setPluginState({gitAction:0}),this.settings.showErrorNotices&&new xe.Notice(i.message,n),console.error(`${this.manifest.id}:`,i.stack),(a=this.statusBar)==null||a.displayMessage(i.message.toLowerCase(),n)}log(...r){console.log(`${this.manifest.id}:`,...r)}}; +/*! Bundled license information: + +ieee754/index.js: + (*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh *) + +buffer/index.js: + (*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + *) + +safe-buffer/index.js: + (*! safe-buffer. MIT License. Feross Aboukhadijeh *) + +crc-32/crc32.js: + (*! crc32.js (C) 2014-present SheetJS -- http://sheetjs.com *) + +js-sha256/src/sha256.js: + (** + * [js-sha256]{@link https://github.com/emn178/js-sha256} + * + * @version 0.9.0 + * @author Chen, Yi-Cyuan [emn178@gmail.com] + * @copyright Chen, Yi-Cyuan 2014-2017 + * @license MIT + *) + +feather-icons/dist/feather.js: + (*! + Copyright (c) 2016 Jed Watson. + Licensed under the MIT License (MIT), see + http://jedwatson.github.io/classnames + *) +*/ + +/* nosourcemap */ \ No newline at end of file diff --git a/content/.obsidian/plugins/obsidian-git/manifest.json b/content/.obsidian/plugins/obsidian-git/manifest.json new file mode 100644 index 00000000..58ddbd07 --- /dev/null +++ b/content/.obsidian/plugins/obsidian-git/manifest.json @@ -0,0 +1,10 @@ +{ + "author": "Vinzent", + "authorUrl": "https://github.com/Vinzent03", + "id": "obsidian-git", + "name": "Git", + "description": "Integrate Git version control with automatic backup and other advanced features.", + "isDesktopOnly": false, + "fundingUrl": "https://ko-fi.com/vinzent", + "version": "2.33.0" +} diff --git a/content/.obsidian/plugins/obsidian-git/obsidian_askpass.sh b/content/.obsidian/plugins/obsidian-git/obsidian_askpass.sh new file mode 100755 index 00000000..2e5eb5d2 --- /dev/null +++ b/content/.obsidian/plugins/obsidian-git/obsidian_askpass.sh @@ -0,0 +1,23 @@ +#!/bin/sh + +PROMPT="$1" +TEMP_FILE="$OBSIDIAN_GIT_CREDENTIALS_INPUT" + +cleanup() { + rm -f "$TEMP_FILE" "$TEMP_FILE.response" +} +trap cleanup EXIT + +echo "$PROMPT" > "$TEMP_FILE" + +while [ ! -e "$TEMP_FILE.response" ]; do + if [ ! -e "$TEMP_FILE" ]; then + echo "Trigger file got removed: Abort" >&2 + exit 1 + fi + sleep 0.1 +done + +RESPONSE=$(cat "$TEMP_FILE.response") + +echo "$RESPONSE" diff --git a/content/.obsidian/plugins/obsidian-git/styles.css b/content/.obsidian/plugins/obsidian-git/styles.css new file mode 100644 index 00000000..9c490e7c --- /dev/null +++ b/content/.obsidian/plugins/obsidian-git/styles.css @@ -0,0 +1,605 @@ +@keyframes loading { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} + +.workspace-leaf-content[data-type="git-view"] .button-border { + border: 2px solid var(--interactive-accent); + border-radius: var(--radius-s); +} + +.workspace-leaf-content[data-type="git-view"] .view-content { + padding: 0; +} + +.workspace-leaf-content[data-type="git-history-view"] .view-content { + padding: 0; +} + +.loading > svg { + animation: 2s linear infinite loading; + transform-origin: 50% 50%; + display: inline-block; +} + +.obsidian-git-center { + margin: auto; + text-align: center; + width: 50%; +} + +.obsidian-git-textarea { + display: block; + margin-left: auto; + margin-right: auto; +} + +.obsidian-git-disabled { + opacity: 0.5; +} + +.obsidian-git-center-button { + display: block; + margin: 20px auto; +} + +.tooltip.mod-left { + overflow-wrap: break-word; +} + +.tooltip.mod-right { + overflow-wrap: break-word; +} +.git-tools { + display: flex; + margin-left: auto; +} +.git-tools .type { + padding-left: var(--size-2-1); + display: flex; + align-items: center; + justify-content: center; + width: 11px; +} + +.git-tools .type[data-type="M"] { + color: orange; +} +.git-tools .type[data-type="D"] { + color: red; +} +.git-tools .buttons { + display: flex; +} +.git-tools .buttons > * { + padding: 0 0; + height: auto; +} + +.is-active .git-tools .buttons > * { + color: var(--nav-item-color-active); +} + +.git-author { + color: var(--text-accent); +} + +.git-date { + color: var(--text-accent); +} + +.git-ref { + color: var(--text-accent); +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-d-none { + display: none; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-wrapper { + text-align: left; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-file-header { + background-color: var(--background-primary); + border-bottom: 1px solid var(--interactive-accent); + font-family: var(--font-monospace); + height: 35px; + padding: 5px 10px; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-file-header, +.workspace-leaf-content[data-type="diff-view"] .d2h-file-stats { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-file-stats { + font-size: 14px; + margin-left: auto; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-lines-added { + border: 1px solid #b4e2b4; + border-radius: 5px 0 0 5px; + color: #399839; + padding: 2px; + text-align: right; + vertical-align: middle; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-lines-deleted { + border: 1px solid #e9aeae; + border-radius: 0 5px 5px 0; + color: #c33; + margin-left: 1px; + padding: 2px; + text-align: left; + vertical-align: middle; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-file-name-wrapper { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + font-size: 15px; + width: 100%; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-file-name { + overflow-x: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-file-wrapper { + border: 1px solid var(--background-modifier-border); + border-radius: 3px; + margin-bottom: 1em; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-file-collapse { + -webkit-box-pack: end; + -ms-flex-pack: end; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + border: 1px solid var(--background-modifier-border); + border-radius: 3px; + cursor: pointer; + display: none; + font-size: 12px; + justify-content: flex-end; + padding: 4px 8px; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-file-collapse.d2h-selected { + background-color: #c8e1ff; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-file-collapse-input { + margin: 0 4px 0 0; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-diff-table { + border-collapse: collapse; + font-family: Menlo, Consolas, monospace; + font-size: 13px; + width: 100%; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-files-diff { + width: 100%; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-file-diff { + overflow-y: hidden; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-file-side-diff { + display: inline-block; + margin-bottom: -8px; + margin-right: -4px; + overflow-x: scroll; + overflow-y: hidden; + width: 50%; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-code-line { + padding: 0 8em; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-code-line, +.workspace-leaf-content[data-type="diff-view"] .d2h-code-side-line { + display: inline-block; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + white-space: nowrap; + width: 100%; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-code-side-line { + padding: 0 4.5em; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-code-line-ctn { + word-wrap: normal; + background: none; + display: inline-block; + padding: 0; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + vertical-align: middle; + white-space: pre; + width: 100%; +} + +.theme-light .workspace-leaf-content[data-type="diff-view"] .d2h-code-line del, +.theme-light + .workspace-leaf-content[data-type="diff-view"] + .d2h-code-side-line + del { + background-color: #ffb6ba; +} + +.theme-dark .workspace-leaf-content[data-type="diff-view"] .d2h-code-line del, +.theme-dark + .workspace-leaf-content[data-type="diff-view"] + .d2h-code-side-line + del { + background-color: #8d232881; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-code-line del, +.workspace-leaf-content[data-type="diff-view"] .d2h-code-line ins, +.workspace-leaf-content[data-type="diff-view"] .d2h-code-side-line del, +.workspace-leaf-content[data-type="diff-view"] .d2h-code-side-line ins { + border-radius: 0.2em; + display: inline-block; + margin-top: -1px; + text-decoration: none; + vertical-align: middle; +} + +.theme-light .workspace-leaf-content[data-type="diff-view"] .d2h-code-line ins, +.theme-light + .workspace-leaf-content[data-type="diff-view"] + .d2h-code-side-line + ins { + background-color: #97f295; + text-align: left; +} + +.theme-dark .workspace-leaf-content[data-type="diff-view"] .d2h-code-line ins, +.theme-dark + .workspace-leaf-content[data-type="diff-view"] + .d2h-code-side-line + ins { + background-color: #1d921996; + text-align: left; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-code-line-prefix { + word-wrap: normal; + background: none; + display: inline; + padding: 0; + white-space: pre; +} + +.workspace-leaf-content[data-type="diff-view"] .line-num1 { + float: left; +} + +.workspace-leaf-content[data-type="diff-view"] .line-num1, +.workspace-leaf-content[data-type="diff-view"] .line-num2 { + -webkit-box-sizing: border-box; + box-sizing: border-box; + overflow: hidden; + padding: 0 0.5em; + text-overflow: ellipsis; + width: 3.5em; +} + +.workspace-leaf-content[data-type="diff-view"] .line-num2 { + float: right; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-code-linenumber { + background-color: var(--background-primary); + border: solid var(--background-modifier-border); + border-width: 0 1px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + color: var(--text-muted); + cursor: pointer; + display: inline-block; + position: absolute; + text-align: right; + width: 7.5em; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-code-linenumber:after { + content: "\200b"; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-code-side-linenumber { + background-color: var(--background-primary); + border: solid var(--background-modifier-border); + border-width: 0 1px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + color: var(--text-muted); + cursor: pointer; + display: inline-block; + overflow: hidden; + padding: 0 0.5em; + position: absolute; + text-align: right; + text-overflow: ellipsis; + width: 4em; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-diff-tbody tr { + position: relative; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-code-side-linenumber:after { + content: "\200b"; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-code-side-emptyplaceholder, +.workspace-leaf-content[data-type="diff-view"] .d2h-emptyplaceholder { + background-color: var(--background-primary); + border-color: var(--background-modifier-border); +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-code-line-prefix, +.workspace-leaf-content[data-type="diff-view"] .d2h-code-linenumber, +.workspace-leaf-content[data-type="diff-view"] .d2h-code-side-linenumber, +.workspace-leaf-content[data-type="diff-view"] .d2h-emptyplaceholder { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-code-linenumber, +.workspace-leaf-content[data-type="diff-view"] .d2h-code-side-linenumber { + direction: rtl; +} + +.theme-light .workspace-leaf-content[data-type="diff-view"] .d2h-del { + background-color: #fee8e9; + border-color: #e9aeae; +} + +.theme-light .workspace-leaf-content[data-type="diff-view"] .d2h-ins { + background-color: #dfd; + border-color: #b4e2b4; +} + +.theme-dark .workspace-leaf-content[data-type="diff-view"] .d2h-del { + background-color: #521b1d83; + border-color: #691d1d73; +} + +.theme-dark .workspace-leaf-content[data-type="diff-view"] .d2h-ins { + background-color: rgba(30, 71, 30, 0.5); + border-color: #13501381; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-info { + background-color: var(--background-primary); + border-color: var(--background-modifier-border); + color: var(--text-normal); +} + +.theme-light + .workspace-leaf-content[data-type="diff-view"] + .d2h-file-diff + .d2h-del.d2h-change { + background-color: #fdf2d0; +} + +.theme-dark + .workspace-leaf-content[data-type="diff-view"] + .d2h-file-diff + .d2h-del.d2h-change { + background-color: #55492480; +} + +.theme-light + .workspace-leaf-content[data-type="diff-view"] + .d2h-file-diff + .d2h-ins.d2h-change { + background-color: #ded; +} + +.theme-dark + .workspace-leaf-content[data-type="diff-view"] + .d2h-file-diff + .d2h-ins.d2h-change { + background-color: rgba(37, 78, 37, 0.418); +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-file-list-wrapper { + margin-bottom: 10px; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-file-list-wrapper a { + color: #3572b0; + text-decoration: none; +} + +.workspace-leaf-content[data-type="diff-view"] + .d2h-file-list-wrapper + a:visited { + color: #3572b0; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-file-list-header { + text-align: left; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-file-list-title { + font-weight: 700; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-file-list-line { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + text-align: left; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-file-list { + display: block; + list-style: none; + margin: 0; + padding: 0; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-file-list > li { + border-bottom: 1px solid var(--background-modifier-border); + margin: 0; + padding: 5px 10px; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-file-list > li:last-child { + border-bottom: none; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-file-switch { + cursor: pointer; + display: none; + font-size: 10px; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-icon { + fill: currentColor; + margin-right: 10px; + vertical-align: middle; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-deleted { + color: #c33; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-added { + color: #399839; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-changed { + color: #d0b44c; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-moved { + color: #3572b0; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-tag { + background-color: var(--background-primary); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + font-size: 10px; + margin-left: 5px; + padding: 0 2px; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-deleted-tag { + border: 2px solid #c33; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-added-tag { + border: 1px solid #399839; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-changed-tag { + border: 1px solid #d0b44c; +} + +.workspace-leaf-content[data-type="diff-view"] .d2h-moved-tag { + border: 1px solid #3572b0; +} + +/* ====================== Line Authoring Information ====================== */ + +.cm-gutterElement.obs-git-blame-gutter { + /* Add background color to spacing inbetween and around the gutter for better aesthetics */ + border-width: 0px 2px 0.2px 2px; + border-style: solid; + border-color: var(--background-secondary); + background-color: var(--background-secondary); +} + +.cm-gutterElement.obs-git-blame-gutter > div, +.line-author-settings-preview { + /* delegate text color to settings */ + color: var(--obs-git-gutter-text); + font-family: monospace; + height: 100%; /* ensure, that age-based background color occupies entire parent */ + text-align: right; + padding: 0px 6px 0px 6px; + white-space: pre; /* Keep spaces and do not collapse them. */ +} + +@media (max-width: 800px) { + /* hide git blame gutter not to superpose text */ + .cm-gutterElement.obs-git-blame-gutter { + display: none; + } +} + +.git-unified-diff-view, +.git-split-diff-view .cm-deletedLine .cm-changedText { + background-color: #ee443330; +} + +.git-unified-diff-view, +.git-split-diff-view .cm-insertedLine .cm-changedText { + background-color: #22bb2230; +} + +/* Limits the scrollbar to the view body */ +.git-view { + display: flex; + flex-direction: column; + position: relative; + height: 100%; +} + +.git-obscure-prompt[git-is-obscured="true"] #git-show-password:after { + -webkit-mask-image: url('data:image/svg+xml,'); +} + +.git-obscure-prompt[git-is-obscured="false"] #git-show-password:after { + -webkit-mask-image: url('data:image/svg+xml,'); +} + +/* Override styling of Codemirror merge view "collapsed lines" indicator */ +.git-split-diff-view .ͼ2 .cm-collapsedLines { + background: var(--interactive-normal); + border-radius: var(--radius-m); + color: var(--text-accent); + font-size: var(--font-small); + padding: var(--size-4-1) var(--size-4-1); +} +.git-split-diff-view .ͼ2 .cm-collapsedLines:hover { + background: var(--interactive-hover); + color: var(--text-accent-hover); +} diff --git a/content/.obsidian/types.json b/content/.obsidian/types.json new file mode 100644 index 00000000..ca822b2d --- /dev/null +++ b/content/.obsidian/types.json @@ -0,0 +1,8 @@ +{ + "types": { + "aliases": "aliases", + "cssclasses": "multitext", + "tags": "tags", + "date": "datetime" + } +} \ No newline at end of file diff --git a/content/.obsidian/workspace.json b/content/.obsidian/workspace.json new file mode 100644 index 00000000..42178b7e --- /dev/null +++ b/content/.obsidian/workspace.json @@ -0,0 +1,188 @@ +{ + "main": { + "id": "047752966b17c658", + "type": "split", + "children": [ + { + "id": "a71061d90a1b6d4f", + "type": "tabs", + "children": [ + { + "id": "d15cc232ee6055c1", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "posts/[template].md", + "mode": "source", + "source": false + }, + "icon": "lucide-file", + "title": "[template]" + } + } + ] + } + ], + "direction": "vertical" + }, + "left": { + "id": "7ab1b11f92d9c569", + "type": "split", + "children": [ + { + "id": "15bb497da7f92271", + "type": "tabs", + "children": [ + { + "id": "3c6e4b7f387eed99", + "type": "leaf", + "state": { + "type": "file-explorer", + "state": { + "sortOrder": "alphabetical", + "autoReveal": false + }, + "icon": "lucide-folder-closed", + "title": "Files" + } + }, + { + "id": "b8e9826230c264d3", + "type": "leaf", + "state": { + "type": "search", + "state": { + "query": "", + "matchingCase": false, + "explainSearch": false, + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical" + }, + "icon": "lucide-search", + "title": "Search" + } + }, + { + "id": "102bf640b5edeb22", + "type": "leaf", + "state": { + "type": "bookmarks", + "state": {}, + "icon": "lucide-bookmark", + "title": "Bookmarks" + } + } + ] + } + ], + "direction": "horizontal", + "width": 300 + }, + "right": { + "id": "4502ff0ef2b09043", + "type": "split", + "children": [ + { + "id": "7d9fc19a74e5388e", + "type": "tabs", + "children": [ + { + "id": "775cb5ae0cf93c9e", + "type": "leaf", + "state": { + "type": "backlink", + "state": { + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical", + "showSearch": false, + "searchQuery": "", + "backlinkCollapsed": false, + "unlinkedCollapsed": true + }, + "icon": "links-coming-in", + "title": "Backlinks" + } + }, + { + "id": "d4577ac1a8b75ec5", + "type": "leaf", + "state": { + "type": "outgoing-link", + "state": { + "linksCollapsed": false, + "unlinkedCollapsed": true + }, + "icon": "links-going-out", + "title": "Outgoing links" + } + }, + { + "id": "ff862ed2b9699bbf", + "type": "leaf", + "state": { + "type": "tag", + "state": { + "sortOrder": "frequency", + "useHierarchy": true, + "showSearch": false, + "searchQuery": "" + }, + "icon": "lucide-tags", + "title": "Tags" + } + }, + { + "id": "db4710cf5057d758", + "type": "leaf", + "state": { + "type": "outline", + "state": { + "followCursor": false, + "showSearch": false, + "searchQuery": "" + }, + "icon": "lucide-list", + "title": "Outline" + } + } + ] + } + ], + "direction": "horizontal", + "width": 300, + "collapsed": true + }, + "left-ribbon": { + "hiddenItems": { + "switcher:Open quick switcher": false, + "graph:Open graph view": false, + "canvas:Create new canvas": false, + "daily-notes:Open today's daily note": false, + "templates:Insert template": false, + "command-palette:Open command palette": false, + "obsidian-git:Open Git source control": false + } + }, + "active": "3c6e4b7f387eed99", + "lastOpenFiles": [ + "protecting-azure-app-service-with-authentication-settings", + "posts/[template] 1.md", + "posts/[template].md", + "2020-05-23.md", + "posts/template.md", + "posts/blog.md", + "posts/testing-v2-template/index.md", + "posts/testing-v2-template/img", + "posts/testing-v2-template", + "template.md", + "posts/bamboo-not-enough-space/index.md", + "posts/adding-audio-to-your-web-app-the-complete-guide/index.md", + "posts/avoid-multiple-lifecycle-hooks-in-azure-devops-deployment-job/index.md", + "posts/welcome.md", + "posts/a-note-on-ssl.md", + "posts/a-tale-of-two-caches-redis-and-cache-helper/index.md" + ] +} \ No newline at end of file diff --git a/content/posts/[template].md b/content/posts/[template].md new file mode 100644 index 00000000..1dc574d2 --- /dev/null +++ b/content/posts/[template].md @@ -0,0 +1,13 @@ +--- +title: your blog title +date: 2025-05-16T21:55:00 +draft: true +summary: your summary +categories: + - Draft +tags: + - draft +thumbnail: /posts/{{file_name}}/feature.png +--- + +{{your content goes here...}} \ No newline at end of file diff --git a/content/posts/a-note-on-ssl.md b/content/posts/a-note-on-ssl.md new file mode 100644 index 00000000..6b5ea3fc --- /dev/null +++ b/content/posts/a-note-on-ssl.md @@ -0,0 +1,117 @@ +--- +title: "A Note on SSL Certificate" +summary: This is a note about the Linkedin learning course SSL Certificates for Web Developers. +date: 2020-05-23T17:10:25+08:00 +draft: false +categories: ["Dev"] +tags: ["ssl", "cryptography", "https", "security", "linkedin-digest"] +thumbnail: https://images.unsplash.com/photo-1506967726964-da9127fdec36?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1000&q=60 +--- + +This is a note about the Linkedin learning course [SSL Certificates for Web Developers](https://www.linkedin.com/learning/ssl-certificates-for-web-developers). + +## Certificate and protocol + +### What are SSL/TLS stands for? + +They stands for *Secure Socket Layer* and *Transport Layer Security*. They are the protocol names. + +### What is HTTPS, and why we are using it? + +Https[ecure], a protocol on top of HTTP to secure the integrity of the data sending form the user to server. + +### What is a certificate, and what is it for? + +A certificate [^1] (`.crt`, `.cer`) certifies **the ownership of a public key**. A certificate contains: + +- organization, +- issuer (e.g. the Certificate Authority / Self-signed), +- valid period, +- url, +- **state / country** + +These information can be used to identify the certificate owner. + +The public key is used to **encrypt**/~~decrypt~~ the communication between computers. + +--- + +## Cryptography + +### Asymmetric VS. Symmetric + +Asymmetric cryptography requies a pair of keys. The *Public key* is used to encrypt messages while the *private key* is for decryption. + +In symmetric cryptography, both ends use the same password to encrypt + decrypt messages. + +### Why are we using both technologies? And how? + +In short: For the balance of security and speed, we use asymmetric cryptography to establish secure connection (*handshake*) and use symmetric cryptography for the data transmission. + +#### The Handshake + +The end user and the server use the same password to encrypt + decrypt the messages. This password is sent from a server to a user by following steps: + +- Validate the certificate... + 1. User makes a request to a web server. + 2. Web server responds with its *public key* certificate. + 3. User checks if the *public key* certificate is valid. +- If the certificate from web server is valid... + 1. User encrypts the password using server's public key, and send to web server. + 2. Server decrypts with its private key. + +After that, a secure connection is established and they shared the *same* password [^2]. + +--- + +## Types of certificate + +### Self-signed + +- Intra-communications between systems under same organization. +- Local development + +### CA + +- Subdomain: tied to 1 domain (e.g. `www.mydoma.in`) +- Wildcard: tied to a groups of subdomains (e.g. `*.mydoma.in`) +- Multi-domain: (e.g. `mydoma.in`, `myweb.site`, ...) + +--- + +## ACME (Automatic Certificate Management Environment) + +To configuring Let's Encrypt's ACME on server, we can make use of the [CertBot](https://certbot.eff.org/). For IIS, use [Certify](https://certifytheweb.com/). + +### + +--- + +## HSTS + +This can instruct the browser to interact with the server with HTTPS only. Redirect from HTTP to HTTPS is not required. This is achieved by adding a response header (`Strict-Transport-Security`). + +Example response header: + +```ini +Strict-Transport-Security: max-age=63072000; includeSubDomains; preload +``` + +### What HSTS is protecting us from? + +The **Man-in-the-Middle TLS Protocol Downgrade Attack.**[^3] In [this example](https://www.praetorian.com/blog/man-in-the-middle-tls-ssl-protocol-downgrade-attack), the hacker C sends a ARP cache table request to both the client A and server B: +![Manipulating Device ARP Cache Tables](https://assets.website-files.com/58866caeabc83d5e7c574c74/5cdc9328fcbd747340785c63_20140811-mitm-attack.png) + +Now the traffic from A to B is going through C, a typical **Man-in-the-Middle attack**. + +The next step is C try to have a **downgrade** on the TLS version. Since the browsers are backward-compatible on older TLS versions, C can therefore to make the version downgraded to the negotiated version in the handshake process. C can then intercept and decrypt the messages by making use of the security vulnerabilities of eariler TLS. + +### HSTS Preloading + +Avoid redirection of the first request too: https://hstspreload.org/ + + + +[^1]: the certificate does not depends on the protocol we use +[^2]:password is just for the same browsing session. +[^3]: I am not an expert on this area and I tried by best to digest that article and [this wiki](https://en.m.wikipedia.org/wiki/Downgrade_attack) to write the summary. \ No newline at end of file diff --git a/img/a-tale-of-two-caches-redis-and-cache-helper/thumbnail.png b/content/posts/a-tale-of-two-caches-redis-and-cache-helper/feature.png similarity index 100% rename from img/a-tale-of-two-caches-redis-and-cache-helper/thumbnail.png rename to content/posts/a-tale-of-two-caches-redis-and-cache-helper/feature.png diff --git a/content/posts/a-tale-of-two-caches-redis-and-cache-helper/index.md b/content/posts/a-tale-of-two-caches-redis-and-cache-helper/index.md new file mode 100644 index 00000000..7e693b9c --- /dev/null +++ b/content/posts/a-tale-of-two-caches-redis-and-cache-helper/index.md @@ -0,0 +1,237 @@ +--- +title: "A Tale of Two Caches: Redis and the cache helper" +summary: A note on how to add Redis and the cache helper to a .NET core Mvc app. +date: 2020-06-11T21:06:59+08:00 +lastmod: 2020-06-27T17:06:24+08:00 +draft: false +categories: ["Dev"] +tags: ["tutorial", "csharp", ".NET Core", "cache", "redis", "tag-helpers"] +thumbnail: /posts/a-tale-of-two-caches-redis-and-cache-helper/thumbnail.png +--- + +## Background ## + +Recently our team started a new project: a showcase page under our main website. The website is read-only and the content won't change frequently so we can have an aggressive caching policy. + +I built this **MVC** web app using **.NET Core 3.1** and deploy it as an IIS sub-site under the main website (which is a **.NET Framework** web app running on the IIS). + +### Table of Contents + +- [Redis](#redis) + - [NuGet package](#redis-nuget) + - [appsettings.json](#redis-appsettings) + - [Startup.cs](#redis-startup) + - [CacheService](#redis-cache-service) + - [Controller](#redis-controller) +- [Cache Tag Helper](#cache-tag-helper) + - [Example](#cache-tag-helper-example) + - [Explaination](#cache-tag-helper-exaplain) +- [Bonus: A note on @helper and other HTML helpers](#bonus) + +--- + +## Redis {#redis} ## +### Why? ### + +We are using [Redis](https://redis.io/) because it is simple, fast and we are already using it across all the main websites. + +### How? ### + +Here are some highlights: + +#### 1. NuGet packages {#redis-nuget} #### +```xml + + + + +``` + +`StackExchange.Redis.Extensions.Newtonsoft` is optional. [Start from .NET Core 3.0](https://devblogs.microsoft.com/dotnet/try-the-new-system-text-json-apis/) the default Json serializer will be `System.Text.Json`. If you want to use `Newtonsoft.Json` then you will need this package in your project. + +`StackExchange.Redis.Extensions.Core` and `StackExchange.Redis.Extensions.AspNetCore` are the useful package to connect/read/write Redis easier. Read [this documentation](https://stackexchange-redis-extensinos.gitbook.io/stackexchange-redis-extensions/) for more details. + +#### 2. appsettings.json {#redis-appsettings} #### + +A typical .NET Core project should have an `appsettings.json`. Add the following section: + +```json +{ + "Redis": { + "AllowAdmin": false, + "Ssl": false, + "ConnectTimeout": 6000, + "ConnectRetry": 2, + "Database": 0, + "Hosts": [ + { + "Host": "my-secret-redis-host.com", + "Port": "6379" + } + ] + } +} +``` +Here, `my-secret-redis-host.com` is the Redis host and We are using the database no. `0`. You can set multiple hosts. You can see a detailed configuration [here](https://stackexchange-redis-extensinos.gitbook.io/stackexchange-redis-extensions/configuration/json-configuration). + +#### 3. Startup.cs {#redis-startup} #### +Add the following code in `ConfigureServices()` +```cs +var redisConfiguration = Configuration.GetSection("Redis").Get(); +services.AddStackExchangeRedisExtensions(redisConfiguration); +``` +#### 5. CacheService {#redis-cache-service} #### +I created a `CacheService.cs` to help me reading/writing data in Redis. In this service: + +```cs +public CacheService(RedisConfiguration redisConfiguration, ILogger poolLogger) +{ + try + { + var connectionPoolManager = new RedisCacheConnectionPoolManager(redisConfiguration, poolLogger); + _redisClient = new RedisCacheClient(connectionPoolManager, serializer, redisConfiguration); + } + catch(Exception ex) + { + /* something wrong when connection to Redis servers. */ + } + _cacheDuration = 300; // cache period in seconds +} +``` + +We need a method to write data: +```csharp +public async Task AddAsync(string key, object value) +{ + try + { + bool added = await _redisClient.GetDbFromConfiguration().AddAsync(key, value, DateTimeOffset.Now.AddSeconds(_cacheDuration)); + return added; + } + catch (Exception ex) + { + /* something wrong when writing data to Redis */ + return false; + } +} +``` + +And we need a method to get cached data: +```csharp +public async Task TryGetAsync(string key) +{ + try + { + if(await _redisClient.GetDbFromConfiguration().ExistsAsync(key)) + { + return await _redisClient.GetDbFromConfiguration().GetAsync(key); + } + else + { + return default; + } + } + catch(Exception ex) + { + /* something wrong when writing data to Redis */ + return default; + } +} +``` + +I intentionally name this method `TryGetAsync()` because the cache may not exist or already expired when you try to get it from Redis. + +After that, let's go back to `Startup.cs` and register this service in `ConfigureService()`: +```cs +services.AddTransient(); +``` + +Remember to register this service **after** `services.AddStackExchangeRedisExtensions()`. + +#### 5. Controller {#redis-controller} ### +Inject the `CacheService` to the controller: +```csharp +public DemoController(CacheService cacheService) +{ + _cacheService = cacheService; +} + + +public async Task Demo(string name) +{ + var cacheKey = $"DemoApp:{name}"; + + // Try to get cached value from Redis. + string cachedResult = await _cacheService.TryGetAsync(cacheKey); + if(default != cachedResult) + { + return View(cachedResult); + } + + // Add a new entry to Redis before returning the message. + var message = $"Hello, {name}"; + if(null != sections && sections.Any()) + { + await _cacheService.AddAsync(cacheKey, message); + } + + return View(message); +} +``` + +> **Explain Like I'm Five**: +> +> You ask the shopkeeper in `Demo` bookstore do they have a specific book `name`. First, the shopkeeper looks for the book on the bookshelf named `Redis`. If he finds that book, he takes it out and gives it to you. +> +> If your book does not exist in the `Redis` bookstore, he has to go out and buy that book for you(!). However, he buys 2 identical copies. He gives you one and puts the other one on the `Redis` bookshelf, just in case another customer want that book later. + +--- + +## Cache Tag Helper {#cache-tag-helper} ## + +The [Cache Tag Helper](https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/built-in/cache-tag-helper?view=aspnetcore-3.1) is a tag that you can use in a **.NET Core MVC** app. Content encolsed by this `` tag will be cached in the internal cache provider. + +### Example {#cache-tag-helper-example} ### +```html + + @System.DateTime.Now + +``` + +### Explaination {#cache-tag-helper-exaplain} ### +In the above example, some attributes is set in the `` tag: +- `expires-after`: how long (in seconds) will this cache last for. +- `vary-by-route`: different copy will be cached when the route has a different value in the `name`param. +- `vary-by-user`: different user will see different cached copies. + +### How can I know if it is working? ### + +You will see the value rendered in the above example won't change for 60 seconds even `System.DateTime.Now` should show the current time. + +--- + +## Bonus: A note on `@helper` and other HTML helpers {#bonus} ## + +In the old days we can define some `@helper` functions in the razor view and (re)use it in the view. It's being removed since .NET Core 3.0 because the design of `@helper` function does not compatible with async Razor content anymore. + +### Successor of the HTML helpers? ### + +You can use the [**Tag Helpers in ASP.NET Core**](https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/intro?view=aspnetcore-3.1). Yes, the `` Tag Helper is one of the [built-in Tag Helpers in .NET Core](https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/intro?view=aspnetcore-3.1#built-in-aspnet-core-tag-helpers). + +In addition, you can use the [`PartialAsync()` method](https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.rendering.htmlhelperpartialextensions.partialasync?view=aspnetcore-3.1) to render the partial HTML markup **asynchronously**. + +```csharp +@await Html.PartialAsync("_PartialName") +``` + +--- + +**More references on the HTML helpers and Tag Helpers:** + +[What happened to the @helper directive in Razor ?](https://github.com/aspnet/Mvc/issues/4127) + +[Remove the @helper directive from Razor](https://github.com/aspnet/Razor/issues/281) + +[ASP.NET Core 1.0: Goodbye HTML helpers and hello TagHelpers!](https://dannyvanderkraan.wordpress.com/2016/04/19/asp-net-core-1-0-goodbye-html-helpers-and-hello-taghelpers/) diff --git a/content/posts/adding-audio-to-your-web-app-the-complete-guide/assets/audio_24000.mp3 b/content/posts/adding-audio-to-your-web-app-the-complete-guide/assets/audio_24000.mp3 new file mode 100644 index 00000000..17724c9e Binary files /dev/null and b/content/posts/adding-audio-to-your-web-app-the-complete-guide/assets/audio_24000.mp3 differ diff --git a/content/posts/adding-audio-to-your-web-app-the-complete-guide/feature.avif b/content/posts/adding-audio-to-your-web-app-the-complete-guide/feature.avif new file mode 100644 index 00000000..feed793b Binary files /dev/null and b/content/posts/adding-audio-to-your-web-app-the-complete-guide/feature.avif differ diff --git a/content/posts/adding-audio-to-your-web-app-the-complete-guide/img/choppy.png b/content/posts/adding-audio-to-your-web-app-the-complete-guide/img/choppy.png new file mode 100644 index 00000000..8b028298 Binary files /dev/null and b/content/posts/adding-audio-to-your-web-app-the-complete-guide/img/choppy.png differ diff --git a/content/posts/adding-audio-to-your-web-app-the-complete-guide/img/fig01.jpg b/content/posts/adding-audio-to-your-web-app-the-complete-guide/img/fig01.jpg new file mode 100644 index 00000000..217336d9 Binary files /dev/null and b/content/posts/adding-audio-to-your-web-app-the-complete-guide/img/fig01.jpg differ diff --git a/content/posts/adding-audio-to-your-web-app-the-complete-guide/img/smooth.png b/content/posts/adding-audio-to-your-web-app-the-complete-guide/img/smooth.png new file mode 100644 index 00000000..a9ea602e Binary files /dev/null and b/content/posts/adding-audio-to-your-web-app-the-complete-guide/img/smooth.png differ diff --git a/content/posts/adding-audio-to-your-web-app-the-complete-guide/index.md b/content/posts/adding-audio-to-your-web-app-the-complete-guide/index.md new file mode 100644 index 00000000..f44a35f0 --- /dev/null +++ b/content/posts/adding-audio-to-your-web-app-the-complete-guide/index.md @@ -0,0 +1,268 @@ +--- +title: "Adding Audio to Your Web App: The Complete Guide" +summary: Sound, rhythm, and harmony find their way into the inward places of the soul. +date: 2023-10-10T22:31:27-05:00 +draft: false +categories: ["Dev"] +tags: ["audio", programming, "web", "obs"] +--- + +As web developers, we're always on the lookout for ways to make our web applications more engaging. One effective way is by adding audio playback. Whether it's for music, podcasts, or sound effects, integrating audio can enhance the user experience. + +In this guide, we'll cover two simple methods for adding audio to your web application: using the HTML5 audio tag and JavaScript Web Audio API. We'll also cover some wired behaviours only exist on (mobile) Safari and their solutions. + +## **HTML5 `