diff --git a/01_grundlagen/docs/programmierrichtlinien.md b/01_grundlagen/docs/programmierrichtlinien.md deleted file mode 100644 index 8a89716..0000000 --- a/01_grundlagen/docs/programmierrichtlinien.md +++ /dev/null @@ -1,8 +0,0 @@ -# Programmierrichtlinien - -- Schreibe immer genau eine Anweisung in genau eine Zeile. -- Setze beim Beenden einer Anweisung das Semikolon. -- Verwende im Normalfall einfache Anführungszeichen zur Begrenzung von Strings. (prefer: Single Quote) -- Schreibe Konstanten, die der Konfiguration dienen, komplett in Großbuchstaben und verwende den Underscore \_ zur Worttrennung. (SCREAMING_SNAKE_CASE) -- Deklariere Konstanten, die der Konfiguration dienen, am Anfang deines Codes. -- Vor und nach einem Operator mit zwei Operanden (z. B. Additions- oder Zuweisungsoperator) steht ein Leerzeichen. diff --git a/01_grundlagen/faq/htmltagwrap.html b/01_grundlagen/faq/htmltagwrap.html deleted file mode 100644 index 8479108..0000000 --- a/01_grundlagen/faq/htmltagwrap.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - HTMLTagWrap - - - -
-
-

HTMLTagWrap

-

- Lorem ipsum dolor sit amet consectetur adipisicing elit. Ex id molestias pariatur voluptatibus exercitationem, - iusto eum autem quae nam adipisci labore provident optio cum doloribus numquam, cupiditate necessitatibus - ducimus praesentium? -

-
    -
  1. Listenpunkt
  2. -
  3. Listenpunkt
  4. -
  5. Listenpunkt
  6. -
  7. Listenpunkt
  8. -
  9. Listenpunkt
  10. -
-
-
- - - diff --git a/01_grundlagen/faq/style.css b/01_grundlagen/faq/style.css deleted file mode 100644 index 0a83079..0000000 --- a/01_grundlagen/faq/style.css +++ /dev/null @@ -1,9 +0,0 @@ -*, -html { - margin: 0; - padding: 0; -} - -body { - background-color: #ff9900; -} diff --git a/01_grundlagen/faq/substr.js b/01_grundlagen/faq/substr.js deleted file mode 100644 index 1477364..0000000 --- a/01_grundlagen/faq/substr.js +++ /dev/null @@ -1 +0,0 @@ -'test'.substr(1); diff --git a/01_grundlagen/faq/xyz-example.js b/01_grundlagen/faq/xyz-example.js deleted file mode 100644 index 7f41cc2..0000000 --- a/01_grundlagen/faq/xyz-example.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict'; - -let x = () => { - a = 3; -}; -let y = () => (a = 5); -let z = () => { - console.log(a); -}; - -x(); -y(); -z(); diff --git a/01_grundlagen/projekte/js-basics-alcohol-test-template/.gitignore b/01_grundlagen/projekte/js-basics-alcohol-test-template/.gitignore deleted file mode 100644 index 54f07af..0000000 --- a/01_grundlagen/projekte/js-basics-alcohol-test-template/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? \ No newline at end of file diff --git a/01_grundlagen/projekte/js-basics-alcohol-test-template/README.md b/01_grundlagen/projekte/js-basics-alcohol-test-template/README.md deleted file mode 100644 index 0161f6c..0000000 --- a/01_grundlagen/projekte/js-basics-alcohol-test-template/README.md +++ /dev/null @@ -1,21 +0,0 @@ -## Alcohol Test: Template - -Alcohol Test is an application that helps you obtain a rough estimate of your blood alcohol content. Users first enter their weight and then log beverages as needed. From this, the estimated current blood alcohol content (EBAC) is calculated. This template is the starting point from which you can begin your submission task. Let yourself go and don’t limit your creativity. - -## License and terms of use - -© Web Professional Institute Inc. All rights reserved. - -This material is provided solely for students enrolled in courses offered by Web Professional Institute Inc. By accessing or using this code, you acknowledge that it is strictly for educational use within the context of Web Professional Institute Inc. programs. - -**Usage Restrictions:** - -- Redistribution, sharing, or copying of this material outside the course environment is strictly prohibited. -- The content is designed to support your learning objectives and is not authorized for commercial projects, public repositories, or applications beyond the course scope. -- Unauthorized commercial use or open-source distribution is strictly prohibited and may result in expulsion from the program and legal action. - -**Agreement & Rights:** - -As a student, you have agreed to these terms as part of your enrollment agreement, which includes additional details on permitted uses, restrictions, and policies. The author and Web Professional Institute Inc. retain all rights to this material, including the code base and instructional content. - -For any questions regarding these terms, please contact Web Professional Institute Inc. for clarification. diff --git a/01_grundlagen/projekte/js-basics-alcohol-test-template/index.js b/01_grundlagen/projekte/js-basics-alcohol-test-template/index.js deleted file mode 100644 index 99c992a..0000000 --- a/01_grundlagen/projekte/js-basics-alcohol-test-template/index.js +++ /dev/null @@ -1,17 +0,0 @@ -const data = { - weight: 70, - drinks: [ - { - type: 'beer', - amount: 1, - }, - { - type: 'wine', - amount: 1, - }, - ], -}; - -// Your code here - -console.log(decideOnDrivingAbility(data)); diff --git a/01_grundlagen/projekte/js-basics-royal-flush-template/.gitignore b/01_grundlagen/projekte/js-basics-royal-flush-template/.gitignore deleted file mode 100644 index 54f07af..0000000 --- a/01_grundlagen/projekte/js-basics-royal-flush-template/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? \ No newline at end of file diff --git a/01_grundlagen/projekte/js-basics-royal-flush-template/Augabenstellung.md b/01_grundlagen/projekte/js-basics-royal-flush-template/Augabenstellung.md deleted file mode 100644 index 830ff22..0000000 --- a/01_grundlagen/projekte/js-basics-royal-flush-template/Augabenstellung.md +++ /dev/null @@ -1,160 +0,0 @@ -# Projektarbeit 1: Royal Flush\! - -## Einleitung - -Offensichtlich hat sich herumgesprochen, dass sich mit Online-Poker eine Menge Geld verdienen lässt. Dein Auftraggeber möchte eine neue Poker-Website entwickeln. Die Spiellogik benötigt viele spezielle Funktionen. Deswegen hat der Projektleiter dich dem Team zugeteilt. Jeder Entwickler programmiert nur einen kleinen Teil der Webanwendung. - -Natürlich fällt die Programmierung der **wichtigsten Funktion** in deinen Aufgabenbereich. - -## Technologien / Anforderungen - -- Setze **JavaScript – ECMAScript 2015 (ES6)** oder neuer ein. -- Externe JavaScript-Bibliotheken (oder aus Drittquellen übernommener Code) sind **nicht** zugelassen. -- Überprüft wird die Aufgabe im aktuellen **Chrome Browser**. -- Entwickle **kein grafisches User Interface (GUI)** — d. h. du benötigst auch kein HTML oder CSS. -- Verwende lediglich die **Konsolenausgabe**, um die Funktionalität der Anwendung zu demonstrieren. - ---- - -## Arbeitsschritt 1: Prüfung auf Name und Kartenfarbe - -Das neue Pokersystem repräsentiert eine Karte intern als String aus **Name** (z. B. `K` für King) und **Kartenfarbe** (z. B. `♠`). Die Kartenfarben verwenden ihre jeweiligen UTF-8-Zeichen. Beispielsweise wird die Karte Herzkönigin als `'Q♥'` und die Karte Kreuz 8 als `'8♣'` repräsentiert. - -Folgende Konstanten sind bereits vorgegeben: - -```javascript -const SUITS = '♠♥♦♣'; -const NAMES = [ - '2', - '3', - '4', - '5', - '6', - '7', - '8', - '9', - '10', - 'J', - 'Q', - 'K', - 'A', -]; -``` - -### Codebeispiel 361 - -Schreibe die Funktionen `toName` und `toSuit`, die eine Karte jeweils auf ihren Namen bzw. auf ihre Kartenfarbe abbilden. - -**Beispiele:** - -```javascript -toName('9♣'); // => '9' -toName('10♥'); // => '10' -toName('Q♥'); // => 'Q' -toSuit('9♣'); // => '♣' -toSuit('10♥'); // => '♥' -``` - ---- - -## Arbeitsschritt 2: Validierung - -### 🔨 Codebeispiel 362 - -Programmiere eine Funktion `isValidCard`, die prüft, ob es sich bei dem übergebenen String um eine valide Karte handelt. Eine String gilt dann als eine valide Repräsentation einer Karte, wenn er exakt der besprochenen Zusammensetzung aus Name und Farbe entspricht. - -**Beispiele:** - -```javascript -isValidCard('9♣'); // => true -isValidCard('11♣'); // => false -isValidCard('9X'); // => false -``` - -Eine Pokerhand besteht aus fünf Karten. Das Pokersystem repräsentiert diese als Arrays mit je fünf Elementen, bei denen es sich um Stringrepräsentationen von Karten handelt, z. B. `['9♣', '9♦', '9♠', '9♥', 'Q♥']`. - -Programmiere noch eine weitere Funktion `isValidHand`, die prüft, ob es sich bei einem übergebenen Array um eine valide Repräsentation einer Kartenhand handelt. Eine Kartenhand ist dann valide (und nur dann), wenn sie genau **fünf valide Karten** enthält. - -> **Wichtig:** Greife zur Implementierung von `isValidCard` auf die Funktionen `toName` und `toSuit` zurück. Genauso verwendest du `isValidCard` zur Realisierung von `isValidHand`. - ---- - -## Arbeitsschritt 3: Sortierung - -Um dem Spieler das Erfassen seiner Kartenhand zu erleichtern, müssen die Karten vorsortiert werden. - -### Codebeispiel 363 - -Programmiere dazu eine Funktion `sortHand`. - -1. Vergleiche zunächst nur anhand ihres **Namens**, so dass 2er, 3er …, Damen, Könige etc. direkt nebeneinander angeordnet werden. Um die korrekte Reihenfolge der Namen zu bestimmen, kannst du auf den **Indexwert von `NAMES`** zurückgreifen. Z. B. ist eine `'2'` mit Indexwert 0 weniger wert als ein Bube (`'J'`) mit Indexwert 9. -2. Berücksichtige in einer überarbeiteten Variante auch die **Kartenfarbe**. Es gilt die Reihenfolge aus dem String `SUITS`. Diese neue Sortierung soll dann die vorherige Variante ersetzen. - -**Beispiele:** - -```javascript -sortHand(['3♥', '2♥', '5♥', '2♣', '4♣']); -// => ['2♠', '2♥', '2♦', '2♣', 'Q♥'] // Korrektur: Die Kartenfarben sollten in der richtigen Reihenfolge stehen, dies ist ein Beispiel aus der Aufgabenstellung -sortHand(['3♥', '2♥', '5♥', '2♣', '4♣']); -// => ['2♣', '2♥', '3♥', '4♣', '5♥'] // Bei gleicher Zahl ist die Farbe entscheidend: ♣ ist höher als ♥ im Beispiel, wenn SUITS = '♠♥♦♣' -sortHand(['2♦', 'Q♥', '2♥', '2♣', '2♠']); -// => ['2♠', '2♥', '2♦', '2♣', 'Q♥'] // Falsche Ausgabe im Beispiel, richtige Sortierung basierend auf SUITS = '♠♥♦♣' -// => ['2♠', '2♥', '2♦', '2♣', 'Q♥'] -// Anmerkung: Basierend auf SUITS='♠♥♦♣', wäre die Reihenfolge ♠ > ♥ > ♦ > ♣. -// Für die Sortierung '2♠', '2♥', '2♦', '2♣', 'Q♥' bedeutet dies, dass ♠ den höchsten Indexwert hat, wenn die Sortierung aufsteigend ist. -``` - -> **Tipps zur Vorgehensweise:** -> -> - Parametrisiere `sort` mit einer Vergleichsfunktion `compareCards`, die zwei Karten entgegennimmt und einen positiven Wert, einen negativen Wert oder (bei identischen Karten) 0 zurückliefert. Du kannst das wie bei der numerischen Sortierung mit **Subtraktion** lösen. -> - Um den Vergleichswert zu bestimmen, vergleichst du zunächst nur die **Indexwerte der Namen**. -> - Um die Kartenfarbe zu berücksichtigen, kannst du einen Kartenpositionswert durch eine höhere Gewichtung des Indexwertes des Namens erhalten: -> $$\text{Kartenposition} = \text{Gewichtungsfaktor} \times \text{Position des Namens in NAMES} + \text{Position der Kartenfarbe in SUITS}$$ -> - Der **Gewichtungsfaktor** ist dabei idealerweise einfach die Anzahl der Kartenfarben (`SUITS.length`). - ---- - -## Arbeitsschritt 4: Kategorisierung - -### 🔨 Codebeispiel 364 - -- Eine Pokerhand, bei der alle Karten die **gleiche Kartenfarbe** aufweisen, heißt **Flush**. -- Eine Hand, die aus **fünf aufeinanderfolgenden Karten** besteht, heißt **Straight** (deutsch: Straße). -- Für den unwahrscheinlichen Fall, dass die Hand aus fünf aufeinanderfolgenden Karten in der gleichen Farbe besteht, spricht man von einem **Straight Flush**. -- Falls ein Straight Flush außerdem noch das **Ass (als höchste Karte)** enthält, liegt ein **Royal Flush** vor — das wertvollste Pokerblatt\! - -Entwickle Funktionen, die eine Pokerhand darauf prüfen, ob jeweils eine der oben genannten Kategorien vorliegt. Beachte auch, dass das Array die Karten nicht zwingend in aufsteigender Reihenfolge enthalten muss. - -**Beispiele:** - -```javascript -isFlush(['7♥', '2♥', 'Q♥', '10♥', '5♥']); // => true -isFlush(['7♥', '2♥', 'Q♥', '10♣', '5♥']); // => false -isStraight(['5♥', '6♦', '7♥', '8♣', '9♥']); // => true -isStraightFlush(['5♥', '6♥', '7♥', '8♥', '9♥']); // => true -isRoyalFlush(['10♥', 'J♥', 'Q♥', 'K♥', 'A♥']); // => true -isRoyalFlush(['10♥', 'J♥', 'Q♥', 'K♣', 'A♥']); // => false -isRoyalFlush(['K♥', 'A♥', 'Q♥', '10♥', 'J♥']); // => true -``` - -> **Tipp zur Vorgehensweise (Straight):** -> -> - Betrachte nur die Namen der Karten. -> - Sortiere diese und verbinde sie zu einem String (mittels `join()`). -> - Wenn dieser String in `NAMES.join()` enthalten ist, handelt es sich bei der ursprünglichen Hand um einen Straight. -> -> **Beispiel:** -> -> `['9♥', '6♦', '7♥', '5♣', '8♥']` $\to$ `['9', '6', '7', '5', '8']` $\to$ `['5', '6', '7', '8', '9']` $\to$ `'5,6,7,8,9'` -> -> `'5,6,7,8,9'` liegt innerhalb von `'2,3,4,5,6,7,8,9,10,J,Q,K,A'` und ist somit ein Straight. - ---- - -## Hinweise - -- Selbstverständlich kannst du die Implementierung der verlangten Funktionen jederzeit in weitere Funktionen unterteilen. -- Alle verlangten Funktionen lassen sich aber prinzipiell jeweils mit einem einzigen Ausdruck implementieren. Tatsächlich wären an keiner Stelle geschweifte Klammern nötig. Du kannst sie aber natürlich verwenden, falls du möchtest. -- Die verlangten Funktionen bauen aufeinander auf. So nutzt beispielsweise `isValidHand` die Funktion `isValidCard` und wird selbst in den darauffolgenden Funktionen weiterverwendet. -- Du musst lediglich die Funktionen liefern. Es ist nicht erforderlich, Werte per `prompt` o.ä. zu erfragen. -- Die in der Aufgabe genannten Angaben zur API sind grundsätzlich verpflichtend. D. h. du verwendest die in der Aufgabenstellung genannten **Funktionsnamen, Argumente, Argumentnamen, Rückgabewerte** usw. diff --git a/01_grundlagen/projekte/js-basics-royal-flush-template/README.md b/01_grundlagen/projekte/js-basics-royal-flush-template/README.md deleted file mode 100644 index f3657db..0000000 --- a/01_grundlagen/projekte/js-basics-royal-flush-template/README.md +++ /dev/null @@ -1,21 +0,0 @@ -## Royal Flush: Template - -Royal Flush is an application that allows you to check hands in Texas Hold'em. The goal is to check if a hand is valid. You should also be able to check whether it is a flush, a straight, a straight flush or a royal flush. - -## License and terms of use - -© Web Professional Institute Inc. All rights reserved. - -This material is provided solely for students enrolled in courses offered by Web Professional Institute Inc. By accessing or using this code, you acknowledge that it is strictly for educational use within the context of Web Professional Institute Inc. programs. - -**Usage Restrictions:** - -- Redistribution, sharing, or copying of this material outside the course environment is strictly prohibited. -- The content is designed to support your learning objectives and is not authorized for commercial projects, public repositories, or applications beyond the course scope. -- Unauthorized commercial use or open-source distribution is strictly prohibited and may result in expulsion from the program and legal action. - -**Agreement & Rights:** - -As a student, you have agreed to these terms as part of your enrollment agreement, which includes additional details on permitted uses, restrictions, and policies. The author and Web Professional Institute Inc. retain all rights to this material, including the code base and instructional content. - -For any questions regarding these terms, please contact Web Professional Institute Inc. for clarification. diff --git a/01_grundlagen/projekte/js-basics-royal-flush-template/index.js b/01_grundlagen/projekte/js-basics-royal-flush-template/index.js deleted file mode 100644 index 5aad92a..0000000 --- a/01_grundlagen/projekte/js-basics-royal-flush-template/index.js +++ /dev/null @@ -1,4 +0,0 @@ -const SUITS = '♠♥♦♣'; -const NAMES = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']; - -// Your code here diff --git a/01_grundlagen/uebungen/#o01_palindrom.html b/01_grundlagen/uebungen/#o01_palindrom.html deleted file mode 100644 index 22562f5..0000000 --- a/01_grundlagen/uebungen/#o01_palindrom.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Optionale Übung optional 01: Palindrom Checker - - - -
-
-
-

Optionale Übung 01: Palindrom Checker

- -

- Ein Palindrom ist ein Wort, das vorwärts und rückwärts gelesen dasselbe ist. Ein guter Weg, um das zu - überprüfen, ist, das Wort umzukehren und zu sehen, ob es dem Original entspricht. Allerdings sollte man - dabei die Groß- und Kleinschreibung sowie Leerzeichen oder Sonderzeichen berücksichtigen. -

-

- Schreibe eine JavaScript-Funktion namens isPalindrom, die eine Zeichenkette (string) als - Eingabe akzeptiert. Die Funktion soll true zurückgeben, wenn es sich bei der Zeichenkette um - ein Palindrom handelt, und false andernfalls. -

-

Beispiele:

-
    -
  • "anna"
  • -
  • "Lagerregal"
  • -
  • "Ein Esel lese nie"
  • -
-

Anforderungen:

-
    -
  • - Die Funktion soll nicht zwischen Groß- und Kleinschreibung unterscheiden (z. B. 'Anna' ist ein Palindrom). -
  • -
  • Leerzeichen und Satzzeichen sollen ignoriert werden.
  • -
-
-
-
- - - diff --git a/01_grundlagen/uebungen/o01_kontaktformular-adel.html b/01_grundlagen/uebungen/o01_kontaktformular-adel.html deleted file mode 100644 index dc8ec77..0000000 --- a/01_grundlagen/uebungen/o01_kontaktformular-adel.html +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - - - - -
-
-

Kontaktformular

- -
- -
-
-
- - -
-
- - - -
- - -
- - - - -
-
- -
-
- - -
-
-
- - - -
-
-
- - -
-
-
-
- - -
-
-
- - - - -
-
-
- - -
-
- -
-
- - -
-
- - -
-
- - -
-
-
- - -
-
-
- - -
-
-
- -
-
-
- - -
-
-
- - -
-
-
- - -
-
-
- - - -
-
-
- - - -
-
-
- -
-
-
- - - diff --git a/01_grundlagen/uebungen/o01_kontaktformular-ersin.html b/01_grundlagen/uebungen/o01_kontaktformular-ersin.html deleted file mode 100644 index b961164..0000000 --- a/01_grundlagen/uebungen/o01_kontaktformular-ersin.html +++ /dev/null @@ -1,209 +0,0 @@ - - - - - - FormularUebung - - - -
-
-

FormularUebung

- -
-
-
-
- - -
-
-
-
- - -
-
-
- -
-
-
- - -
-
-
-
- - -
-
-
- - -
-
-
- - -
-
-
-
- - -
-
-
- -
-
-
- - -
-
-
- -
-
-
- - -
-
-
- -
-
-
- - -
-
-
- -
-
-
- - -
-
-
- -
-
-
- -
-
-
-
-
-
- - - diff --git a/01_grundlagen/uebungen/u01_console-log.html b/01_grundlagen/uebungen/u01_console-log.html deleted file mode 100644 index 48be9bd..0000000 --- a/01_grundlagen/uebungen/u01_console-log.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - Übung 1: In die Konsole geloggt - - - -
-
-
-

Übung 1: In die Konsole geloggt

-

Gib deinen Namen in der Konsole aus.

-
-
-
- - - diff --git a/01_grundlagen/uebungen/u02_alert.html b/01_grundlagen/uebungen/u02_alert.html deleted file mode 100644 index f92db36..0000000 --- a/01_grundlagen/uebungen/u02_alert.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - Übung 2: Alarm! - - - -
-
-
-

Übung 2: Alarm!

-

- Gib den folgenden Text in einer Alert-Box aus: »Alert! Your console is on fire! Hurry! Write an email to the - fire department. -

-
-
-
- - - diff --git a/01_grundlagen/uebungen/u03_sekunden.html b/01_grundlagen/uebungen/u03_sekunden.html deleted file mode 100644 index 5be6a5e..0000000 --- a/01_grundlagen/uebungen/u03_sekunden.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - Übung 3: Sekunden - - - -
-
-
-

Übung 3: Sekunden

-

- Wie viele Minuten und Restsekunden haben 2000 Sekunden? Verwende console.log für die Ausgabe.
- Hinweise: Am einfachsten ist die Aufgabe mithilfe des Modulo-Operators zu lösen. - Nachkommastellen kannst du im Moment noch nicht entfernen. Darauf kommen wir später zurück. -

-
-
-
-
- - - diff --git a/01_grundlagen/uebungen/u04_glueck_codes.html b/01_grundlagen/uebungen/u04_glueck_codes.html deleted file mode 100644 index d18802c..0000000 --- a/01_grundlagen/uebungen/u04_glueck_codes.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - Übung 4: Glück & Codes - - - -
-
-
-

Übung 4: Glück & Codes

-

- Kennst du Glückszahlen und Namenscodes? Hier ist ein Namenscode mit einem interessanten Schema: - Multipliziere die Länge deines Vornamens mit der Länge deines Nachnamens und lass dir das Ergebnis in der - Konsole ausgeben. -

-
-
-
-
- - - diff --git a/01_grundlagen/uebungen/u05_typeof.html b/01_grundlagen/uebungen/u05_typeof.html deleted file mode 100644 index 8551bc9..0000000 --- a/01_grundlagen/uebungen/u05_typeof.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - Übung 5: Na? Was bist denn du? - - - -
-
-
-

Übung 5: Na? Was bist denn du?

-

- Welchen Datentyp hat das folgende Literal?
- '42' -

-
-
-
-
- - - diff --git a/01_grundlagen/uebungen/u06_rechnen.html b/01_grundlagen/uebungen/u06_rechnen.html deleted file mode 100644 index 68952e0..0000000 --- a/01_grundlagen/uebungen/u06_rechnen.html +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - Übung 6: Nur ein bisschen rechnen … - - - -
-
-
-

Übung 6: Nur ein bisschen rechnen …

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AusdruckRückgabewert
3 + 4
3 * 12
25 + 12
(12 - 3) / 3
12 % 3
12 * (44 / 11) / 3 + 67
-
-
-
- - - diff --git a/01_grundlagen/uebungen/u07_prompt-age.html b/01_grundlagen/uebungen/u07_prompt-age.html deleted file mode 100644 index d54cca5..0000000 --- a/01_grundlagen/uebungen/u07_prompt-age.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - Übung 7: Also sowas fragt man doch nicht! - - - -
-
-
-

Übung 7: Also sowas fragt man doch nicht!

-

- Fragen Sie nun nach dem Alter des Anwenders, speichern Sie es in einer Variable und geben Sie es über die - Konsole aus. Denken Sie daran, für die Variable einen sinnvollen Bezeichner zu wählen. -

-
-
-
-
- - - diff --git a/01_grundlagen/uebungen/u08_tax-totalprice.html b/01_grundlagen/uebungen/u08_tax-totalprice.html deleted file mode 100644 index f01cff1..0000000 --- a/01_grundlagen/uebungen/u08_tax-totalprice.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - Übung 8: Immer diese Steuern... - - - -
-
-
-

Übung 8: Immer diese Steuern...

-

- Preise könnten so viel angenehmer sein, wenn die verflixte Mehrwertsteuer nicht wäre. Aber wenn du die - Steuer schon selbst zahlen musst, kann dir wenigstens das Ausrechnen des Brutto-Preises jemand abnehmen: JS! - Schreibe also ein Programm, das dir den Bruttopreis zu $150 (netto) berechnet und ausgibt — Hinweis: Es - sollten $183 sein. -

-

Folgende Definitionen steht dir zur Verfügung:

-

- - 'use strict'
- const TAX_PERCENTAGE = 22
- let price = 150
- /* your code here */
- console.log(totalPrice)
-
-

-
-
-
-
- - - diff --git a/01_grundlagen/uebungen/u09_bezeichner.html b/01_grundlagen/uebungen/u09_bezeichner.html deleted file mode 100644 index dbc691a..0000000 --- a/01_grundlagen/uebungen/u09_bezeichner.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - Übung 9: Finden Sie geeignete Variablenbezeichner! - - - -
-
-

Übung 9: Finden Sie geeignete Variablenbezeichner!

-

Denken Sie sich geeignete Bezeichner für die Variablen folgender Tabelle aus:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
BedeutungVariablenbezeichner
Preis eines Buches in einem OnlineshopbookPrice, buchPreis
Anzahl der angemeldeten BenutzeruserNr, userAmount, loggedUserCount, angemeldeteBenutzer
Titel einer WebseitesiteTitle, pageTitle, websiteTitle
Höhe eines Hauses auf einer ImmobiliensitehausHoehe, houseHeight, buildingHeight, heightOfHouse
Typ eines Monitors auf der Site eines HerstellersmonitorTyp, screenType, monitorType, displayType
Fahrgestellnummer eines reparierten Autos auf der Website einer AutowerkstattreapariertFahrgestellNr, vinRepaired
-
-
- - - diff --git a/01_grundlagen/uebungen/u10_bezeichner-verbessern.html b/01_grundlagen/uebungen/u10_bezeichner-verbessern.html deleted file mode 100644 index 0144871..0000000 --- a/01_grundlagen/uebungen/u10_bezeichner-verbessern.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - Übung 10: Bezeichner verbessern - - - -
-
-

Übung 10: Bezeichner verbessern

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
BezeichnerBedeutungProblemVorschläge
bildNrInhalt-imageNr, imageNumber
bildidInhaltkein lowerCamelCasebildId, imgId, imageId
bildZählerAnzahl der hochgeladenen Bilderkeine SonderzeichenbildZaehler, imageCounter, imgCounter
zahlerFuerDie AktuelleZeileIn DerTabelleDie DieBenutzer AuflistetZähler für die aktuelle Zeile, in der Tabelle, die die Benutzer auflistet.zu langaktuelleZeileInBenutzerliste, userCountCurrentRow
urenKelvornAmeVorname des Sohns eines Enkelsfalsche Groß- und KleinschreibweiseurenkelVorname, greatGrandsonFirstName, firstNameGreatGrandson
xGeburtsdatumnicht aussagekräftiggebDatum, birthdate, dateOfBirth
yNummer der aktuellen Seitenicht aussagekräftigaktSeiteNr, currentPageNr
dDateinamenicht aussagekräftigfileName, filename
faqUeberschriftÜberschrift der Liste häufig gestellter Fragen-faqTitel, faqUeberschrift, faqTitle, faqHeadline, FAQHeadline
menHoehHöhe eines Menüskeine gängigen AbkürzungmenuHeight, navHeight
strNameStraßenname-strName, streetName
wanfWandfarbekeine gängigen AbkürzungwandFarbe, wallColor
PoStLeiTZaHlPostleitzahlfalsche Groß- und Kleinschreibweiseplz, postcode, zipCode, postalCode
PLZPostleitzahl-plz, postcode, zipCode, postalCode
plzPostleitzahl-plz, postcode, zipCode, postalCode
2.frageDie 2. FrageSyntaxfehlerfrageZwei, frage2, question2, questionTwo
anzahl?Die vom Benutzer eingegebene Anzahl von Produktexemplaren, die er kaufen möchte.SyntaxfehleranzProduktExemplar, anzahlProdukt, productAmount
wichtige Meldung!Die Variable enthält den Text einer wichtigen Systemmeldung.SyntaxfehlerwichtigeMeldung, importantMessage, systemMsg, alertMessage
piDie Zahl π (3.14…)KonfigurationsvariablePI, Math.PI
-
-
- - - diff --git a/01_grundlagen/uebungen/u11_rechnen-in-strings.html b/01_grundlagen/uebungen/u11_rechnen-in-strings.html deleted file mode 100644 index 6b6c5b8..0000000 --- a/01_grundlagen/uebungen/u11_rechnen-in-strings.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - Übung 11: Rechnen mit Strings? - - - -
-
-

Übung 11: Rechnen mit Strings?

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AusdruckRückgabewert
'Hallo' + 'Welt'HalloWelt
'Hallo' + ' Welt'Hallo Welt
'1' + '1'11
1 + 12
'1 + 1'1 + 1
-
-
- - - diff --git a/01_grundlagen/uebungen/u12_prompt-lieblingsessen.html b/01_grundlagen/uebungen/u12_prompt-lieblingsessen.html deleted file mode 100644 index 3a687d5..0000000 --- a/01_grundlagen/uebungen/u12_prompt-lieblingsessen.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - Übung 12: Mit prompt das Lieblingsessen erfragen - - - -
-
-
-

Übung 12: Mit prompt das Lieblingsessen erfragen

- -
    -
  1. - Fragen Sie den Benutzer nach seinem Lieblingsessen und seinem Lieblingsgetränk und speichern Sie beides in - passend benannte Variablen. -
  2. -
  3. - Verwenden Sie beide Variablen in einem Satz, den Sie über die Konsole ausgeben. Verketten Sie dabei die - Variablen mithilfe des Verkettungsoperators mit den restlichen Satzteilen . -
  4. -
  5. - Führen Sie die letzte Übung noch einmal durch, aber verwenden Sie dieses Mal Template String - Substitutions. -
  6. -
  7. - Wenn Sie ganz fleißig sind, können Sie als dritte Variante noch austesten, wie sich beide Varianten in der - gleichen Ausgabe verwenden lassen. -
  8. -
-
- -
-
-
-
-
- - - diff --git a/01_grundlagen/uebungen/u13_fehler-im-detail.html b/01_grundlagen/uebungen/u13_fehler-im-detail.html deleted file mode 100644 index 8ea8747..0000000 --- a/01_grundlagen/uebungen/u13_fehler-im-detail.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - Übung 13: Fehler im Detail - - - -
-
-
-

Übung 13: Fehler im Detail

- -

Im folgenden Code haben sich einige Fehler und auch Regelwidrigkeiten eingeschlichen.

-
- -
-
-
- - - diff --git a/01_grundlagen/uebungen/u14_rechnen-ausdruecke.html b/01_grundlagen/uebungen/u14_rechnen-ausdruecke.html deleted file mode 100644 index c641ede..0000000 --- a/01_grundlagen/uebungen/u14_rechnen-ausdruecke.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - Übung 14: Also, was sind das denn nur für Ausdrücke? - - - -
-
-

Übung 14: Also, was sind das denn nur für Ausdrücke?

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AusdruckRückgabewertDatentyp
'1.5' * 23number
'1,5' * 2NaNnumber
'1.5' + 2'1.52'string
Number('1.5') * 23number
Number('1,5') * 2NaNnumber
Number('3 Tage') * 7NaNnumber
Number('Seite 20') + 5NaNnumber
'9,2' + Number('11.7')'9,211.7'string
(NaN - 2) * (4 / 2)NaNnumber
alert(Number(17 / 2 + 1.3))undefined'undefined'
console.log(Number(17 / 2 + 1.3))undefined'undefined'
typeof 12.25'number'string
typeof typeof 12.25'string'string
-
-
- - - diff --git a/01_grundlagen/uebungen/u15-u17_reichweite-verbrauch.html b/01_grundlagen/uebungen/u15-u17_reichweite-verbrauch.html deleted file mode 100644 index 82d2687..0000000 --- a/01_grundlagen/uebungen/u15-u17_reichweite-verbrauch.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Übung 15 17: Reichweite & Verbrauch - - - -
-
-
-

Übung 15: Reichweite & Verbrauch

-
    -
  1. - Schreiben Sie ein Programm zur Kraftstoffverbrauchsberechnung für Pkws. Der Benutzer soll die gefahrenen - Kilometer (Strecke) und die verbrauchte Benzinmenge angeben. Das Programm ermittelt daraufhin den - Kraftstoffverbrauch auf 100 km und gibt ihn aus. - -
    - Hinweis: Verwenden Sie folgende Formel:
    - Verbrauch [l/100km] = Benzinmenge [l] / Strecke [km] × 100 -
    -
  2. -
  3. - Erweitern Sie das Programm derart, dass das Programm den Benutzer außerdem nach seiner Tankgröße fragt und - ergänzend die maximale Reichweite in Kilometern berechnet. -
    - Hinweis: Verwenden Sie folgende Formel:
    - Reichweite [km] = Tankgröße [l] × Strecke [km] / Benzinmenge [l] -
    -
  4. -
-
-
-

Übung 17: Reichweite & Verbrauch, Teil 2

-

Runde die Ausgaben von Übung 15 (Teil 1 der Übung) kaufmännisch (d. h. ab 0.5 aufrunden).

-
-
-
-
-
- - - diff --git a/01_grundlagen/uebungen/u16_rest-sekunden-2.html b/01_grundlagen/uebungen/u16_rest-sekunden-2.html deleted file mode 100644 index ac47a5a..0000000 --- a/01_grundlagen/uebungen/u16_rest-sekunden-2.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - Übung 16: Sekunden, Teil 2 - - - -
-
-
-

Übung 16: Sekunden, Teil 2

- Gib die Ergebnisse des Zeitrechners (Übung 3) abgerundet (ohne Nachkommastellen) in folgender Form aus: - mm:ss -
- -
-
-
- - - diff --git a/01_grundlagen/uebungen/u18_lottozahl.html b/01_grundlagen/uebungen/u18_lottozahl.html deleted file mode 100644 index dbacdf5..0000000 --- a/01_grundlagen/uebungen/u18_lottozahl.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - Übung 18: Lotto oder der »49-Seiten Würfel« - - - - - -
-
-
-

Übung 18: Lotto oder der »49-Seiten Würfel«

-

- Für Zufallszahlen von eins bis sechs ist ein Würfel wirklich praktisch — und sinnvoll. Für alle anderen - Fälle ist ein Zufallsgenerator natürlich unumgänglich und Pflichtprogramm. Zum Beispiel, wenn du Hilfe für - deine nächsten Lottozahlen benötigst … -

-

- Schreibe ein Programm, das genau eine Zufallszahl zwischen 1 und 49 ausgibt. Die Grenzwerte 1 und 49 sollen - dabei inklusive sein und Nachkommastellen sind nicht erwünscht. -

-
-
-
00
-
-
-
- - - diff --git a/01_grundlagen/uebungen/u19-20-22-darkside-quiz.html b/01_grundlagen/uebungen/u19-20-22-darkside-quiz.html deleted file mode 100644 index ab699fe..0000000 --- a/01_grundlagen/uebungen/u19-20-22-darkside-quiz.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - Übung 22: Die dunkle Seite schlägt zurück … - - - -
-
-
-

Übung 22: Die dunkle Seite schlägt zurück …

- -

- Endlich setzt du deinen Kampf gegen die dunkle Seite von JS fort (siehe Übung 20) und erstellst zwei neue - »Kampf-Sequenzen«: -

-

»What's the German word for if« (Mehrere Lösungsmöglichkeiten: wenn, falls).

-

»Now, please enter a string with a length between 8 and 15 characters …«

-
-
-

Übung 23: Die dunkle Seite schlägt zurück…

-

- Endlich setzen Sie Ihren Kampf gegen die dunkle Seite von JS fort (siehe Übung 20) und erstellen zwei neue - »Kampf-Sequenzen«: -

-
    -
  • »What's the German word for if« (Mehrere Lösungsmöglichkeiten: wenn, falls).
  • -
  • »Now, please enter a string with a length between 8 and 15 characters…«
  • -
-
-
-
- - - diff --git a/01_grundlagen/uebungen/u19-u20-quiz-1.html b/01_grundlagen/uebungen/u19-u20-quiz-1.html deleted file mode 100644 index 5fd9913..0000000 --- a/01_grundlagen/uebungen/u19-u20-quiz-1.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - Übung 19 und 20: Die dunkle Seite von JavaScript - - - -
-
-
-

Übung 19: Die dunkle Seite von JavaScript

-

- Programmieren Sie nun Stück für Stück ein kleines Quiz, in dem ein Spieler Fragen zu JS beantworten muss und - damit gegen Fehler und schlechten Code — also die dunkle Seite von JS — antritt. Möge der Source mit Ihnen - sein. -

-
    -
  1. -

    - Als ersten Schritt fragen Sie den Spieler nach seinem Namen, speichern diesen in eine Variable und - begrüßen ihn mittels einer Alert-Box. Ergänzen Sie den folgenden Code: -

    -
    -   'use strict'; let username = … alert(…); 
    -
  2. -
  3. -

    - Stellen Sie dem Spieler die Frage, ob er sich fit genug fühlt, um gegen das dunkle JavaScript - anzutreten. Es ist sinnvoll, bei der Frage die Antwortmöglichkeiten anzugeben. Die Antwort speichern Sie - in einer neuen Variable und erstellen als Nächstes eine - if-Verzweigung. Der Rumpf des if soll nur ausgewertet werden, wenn der Spieler - bestätigt, dass er sich stark genug fühlt, das Spiel zu beginnen. In den Rumpf schreiben wir ein - alert, das den Spielstart bestätigt und den Spieler anfeuert. -

    -

    - Für den Fall, dass der Spieler zu feige ist und einen mangelnden Fitness-Grad angegeben hat, schreiben - Sie eine weitere - if-Verzweigung, die den Fall abfängt und den Spieler mit Schimpf und Schande verabschiedet. - Natürlich dürfen Sie auch freundlich bleiben — ganz wie Sie mögen. -

    -
    - Tipp: Schon während Sie das Programm entwickeln, sollten Sie es immer wieder testen. - Führen Sie nach jeder Änderung das Programm erneut aus! -
    -
  4. -
  5. -

    - Nun kann es losgehen. Stellen Sie den Spieler vor seine erste Aufgabe. Deklarieren Sie nach dem alert - eine neue Variable, in der Sie die Antwort des Spielers zu folgender Frage speichern:
    - »Which Operator has the higher priority: * or + ?« -

    -

    - Um auf die Antwort reagieren zu können, schreiben Sie eine weitere - if-Verzweigung, deren Rumpf nur ausgewertet wird, wenn die Antwort stimmt. -

    -

    - alert gratuliert hier zur korrekten Antwort. Wenn Sie mögen, können Sie noch weitere - Verzweigungen mit Fragen einbauen. -

    -
  6. -
  7. -

    - Fügen Sie ein weiteres if für die Variante ein, in der der Spieler eine falsche Antwort - gibt. -

    -
  8. -
-
-
-

Übung 20: Die dunkle Seite von JavaScript

-

- Für Ihr Spiel ist else ebenfalls hilfreich. Zum Beispiel bei der Frage, ob der Spieler bereit zum Spielen - ist. Statt hier ein zweites - if einzubauen, können Sie else verwenden. -

-

Ersetzen Sie die if-Anweisungen an den richtigen Stellen durch ein else:

-
-
-

Übung 23: Die dunkle Seite schlägt zurück…

-

- Endlich setzen Sie Ihren Kampf gegen die dunkle Seite von JS fort (siehe Übung 20) und erstellen zwei neue - »Kampf-Sequenzen«: -

-
    -
  • »What's the German word for if« (Mehrere Lösungsmöglichkeiten: wenn, falls).
  • -
  • »Now, please enter a string with a length between 8 and 15 characters…«
  • -
-
-
-
- - - diff --git a/01_grundlagen/uebungen/u21_schaltjahr.html b/01_grundlagen/uebungen/u21_schaltjahr.html deleted file mode 100644 index be20c4b..0000000 --- a/01_grundlagen/uebungen/u21_schaltjahr.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - Übung 21: Die Sache mit dem Schaltjahr - - - -
-
-
-

Übung 21: Die Sache mit dem Schaltjahr

-

- Vielleicht gehören Sie zu den Menschen, die »die Sache mit dem Schaltjahr« spannend finden. Und falls Sie es - nicht spannend finden, schreiben Sie einfach trotzdem ein Programm, das berechnet, ob es sich bei einem Jahr - um ein Schaltjahr handelt. -

-

Fragen Sie den Anwender nach dem gewünschten Jahr und speichern Sie die Eingabe in einer Variable.

-

- Falls das betreffende Jahr ein Schaltjahr ist, soll die Konsole z.B. den Satz »0000 ist ein Schaltjahr!« - ausgeben; ansonsten »0000 ist KEIN Schaltjahr« — mit dem eingegeben Jahr statt 0000. -

-

Ein Jahr ist ein Schaltjahr, wenn das betreffende Jahr

-
    -
  • ganzzahlig durch 400 teilbar ist.
  • -
  • nicht ganzzahlig durch 100, aber ganzzahlig durch 4 teilbar ist.
  • -
- -
- Die Berechnung ist übrigens nicht zu 100 Prozent genau, aber für die nächsten 2000 Jahre passt es noch. -
-
-
-
-
- - - diff --git a/01_grundlagen/uebungen/u22-if-else-quiz-2.html b/01_grundlagen/uebungen/u22-if-else-quiz-2.html deleted file mode 100644 index f1d91d2..0000000 --- a/01_grundlagen/uebungen/u22-if-else-quiz-2.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - Übung 22: Die dunkle Seite schlägt zurück … - - - -
-
-

Übung 22: Die dunkle Seite schlägt zurück …

- -

- Endlich setzt du deinen Kampf gegen die dunkle Seite von JS fort (siehe Übung 20) und erstellst zwei neue - »Kampf-Sequenzen«: -

-

»What's the German word for if« (Mehrere Lösungsmöglichkeiten: wenn, falls).

-

»Now, please enter a string with a length between 8 and 15 characters …«

-
-
-

Übung 23: Die dunkle Seite schlägt zurück…

-

- Endlich setzen Sie Ihren Kampf gegen die dunkle Seite von JS fort (siehe Übung 20) und erstellen zwei neue - »Kampf-Sequenzen«: -

- -
-
- - - diff --git a/01_grundlagen/uebungen/u23_validierung-prompt.html b/01_grundlagen/uebungen/u23_validierung-prompt.html deleted file mode 100644 index a9d37a6..0000000 --- a/01_grundlagen/uebungen/u23_validierung-prompt.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Übung 23: Von guten und bösen Eingaben - - - -
-
-
-

Übung 23: Von guten und bösen Eingaben

-
    -
  1. - Nimm Angaben zu Vorname, Nachname, Alter und dem liebsten Heißgetränk eines Anwenders entgegen und - speichere diese in Variablen. -
  2. -
  3. - Diese Eingaben sollst du nun folgendermaßen validieren: -
      -
    • Vorname und Nachname müssen zwischen 2 und 100 Zeichen lang sein.
    • -
    • Das Alter muss eine Zahl unter 150 sein.
    • -
    • Die Eingabe für das Getränk muss c (coffee) oder t (tea) sein.
    • -
    -
  4. -
-
-
-
-
- - - diff --git a/01_grundlagen/uebungen/u24_leap-year-2.html b/01_grundlagen/uebungen/u24_leap-year-2.html deleted file mode 100644 index 046ed27..0000000 --- a/01_grundlagen/uebungen/u24_leap-year-2.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - Übung 24: Die Sache mit dem Schaltjahr — Teil 2 - - - -
-
-
-

Übung 24: Die Sache mit dem Schaltjahr — Teil 2

-

- Verschaffe deinem Schaltjahr-Tool aus Lektion 10 ein Facelifting. Mithilfe der logischen Operatoren kannst - du einige else einsparen und den Code einfacher, kürzer und übersichtlicher gestalten. -

- -

Ein Jahr ist ein Schaltjahr, wenn das betreffende Jahr

-
    -
  • ganzzahlig durch 400 teilbar ist.
  • -
  • nicht ganzzahlig durch 100, aber ganzzahlig durch 4 teilbar ist.
  • -
-
-
- Die Berechnung ist übrigens nicht zu 100 Prozent genau, aber für die nächsten 2000 Jahre passt es noch. -
-
- - -
-
-
-
- - - diff --git a/01_grundlagen/uebungen/u25_suche-im-heuhaufen.html b/01_grundlagen/uebungen/u25_suche-im-heuhaufen.html deleted file mode 100644 index 0cc7890..0000000 --- a/01_grundlagen/uebungen/u25_suche-im-heuhaufen.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - Übung 25: Wenn sie doch endlich mal jemand finden könnte… die Nadel im Heuhaufen… - - - -
-
-
-

Übung 25: Wenn sie doch endlich mal jemand finden könnte… die Nadel im Heuhaufen…

-

- Die meisten Menschen verwenden die Redewendung nur symbolisch. Sie heute aber nicht, denn Sie erhalten von - uns den Auftrag, die Nadel wirklich zu finden! -

- -

- Natürlich wollen wir Sie nicht wirklich im Heu wühlen lassen. Stattdessen erhalten Sie von uns einen - sauberen heulosen String. Das ist vermutlich auch angenehmer, falls Sie an Heuschnupfen leiden -

-

- Finden Sie nun heraus, an welcher Position sich die Nadel befindet, und loggen Sie diese Position in die - Konsole. -

-
Übrigens: Zählen gilt nicht!
-
- -
-
-
- - - diff --git a/01_grundlagen/uebungen/u26_vornamen-auslesen.html b/01_grundlagen/uebungen/u26_vornamen-auslesen.html deleted file mode 100644 index 6a7e027..0000000 --- a/01_grundlagen/uebungen/u26_vornamen-auslesen.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - Übung 26: Wenn ein Vorname nicht reicht… - - - -
-
-
-

Übung 26: Wenn ein Vorname nicht reicht…

-

- Vielleicht ist Ihnen aufgefallen, dass die Zerlegung nur richtig funktioniert, wenn der Name in der Form - 'Vorname Nachname' vorliegt. -

-

- Sollte ein Nutzer einen zweiten Vornamen angeben, ordnet das Programm den zweiten Vorname dem Nachnamen zu. - Sie würden für den Namen Ladislaus Coolio Jones fälschlicherweise Folgendes erhalten: -

-

Korrigieren Sie die Ausgabe des folgenden Codes mithilfe von lastIndexOf

-
-
-
- - - diff --git a/01_grundlagen/uebungen/u27-zerlegter-heribert.html b/01_grundlagen/uebungen/u27-zerlegter-heribert.html deleted file mode 100644 index 0ecfefc..0000000 --- a/01_grundlagen/uebungen/u27-zerlegter-heribert.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - Übung 27: Der zerlegte Heribert - - - -
-
-
-

Übung 27: Der zerlegte Heribert

-
    -
  1. Entfernen Sie die überflüssigen Leerzeichen.
  2. -
  3. Zerlegen Sie den Namen in Vor- und Nachnamen.
  4. -
-
-
-
-
- - - diff --git a/01_grundlagen/uebungen/u28_transformierte-ladislaus.html b/01_grundlagen/uebungen/u28_transformierte-ladislaus.html deleted file mode 100644 index d1209f2..0000000 --- a/01_grundlagen/uebungen/u28_transformierte-ladislaus.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - Übung 28: Der transformierte Ladislaus - - - -
-
-
-

Übung 28: Der transformierte Ladislaus

-

Und weil es so viel Freude macht:

-

- Speichern Sie den Namen »Ladislaus Jones« in einer Variable und kreieren Sie eine Ausgabe nach dem Schema - '<Nachname>, <Anfangsbuchstabe des Vornamens>.', also - 'Jones, L.'. -

-
- -
-
-
- - - diff --git a/01_grundlagen/uebungen/u29_fuehrende-nullen.html b/01_grundlagen/uebungen/u29_fuehrende-nullen.html deleted file mode 100644 index f3a1385..0000000 --- a/01_grundlagen/uebungen/u29_fuehrende-nullen.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - Übung 29: Führende Nullen, Teil 1 - - - -
-
-
-

Übung 29: Führende Nullen, Teil 1

-

- NerdWorld hat vor einiger Zeit sein Artikelnummer-Konzept geändert. Die neuen Artikelnummern beginnen stets - mit einer 0 — z.B. 0123. Leider gibt es bei den alten Nummern viele, die nicht über eine führenden 0 - verfügen. Sie können aber auch nicht einfach pauschal eine 0 ergänzen, da manche der alten Nummern bereits - mit einer 0 beginnen. In dem Fall soll keine weitere 0 vorangestellt werden. Ergänzen Sie das folgende - Programmfragment, so dass es für jede Belegung der Variable itemNumber (Artikelnummer) die richtige Nummer - im neuen Konzept ausgibt. Verwenden Sie dazu den ternären Operator! -

-
    -
  • 123 => 0123
  • -
  • 7 => 07
  • -
  • 07 => 07
  • -
  • 007 => 007
  • -
-
-
-
-
- - - diff --git a/01_grundlagen/uebungen/u30_quiz-dark-side.html b/01_grundlagen/uebungen/u30_quiz-dark-side.html deleted file mode 100644 index d1e4887..0000000 --- a/01_grundlagen/uebungen/u30_quiz-dark-side.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - Übung 30: Die dunkle Seite von JavaScript — der Kampf geht weiter - - - -
-
-
-

Übung 30: Die dunkle Seite von JavaScript — der Kampf geht weiter

- -

- Es wird Zeit, das Spiel weiter zu optimieren. Nimm dir eine der Fragen vor, die schon implementiert ist: -

-

»Was heißt if auf Deutsch?« (Mehrere Lösungsmöglichkeiten: wenn, falls).

-

- Der Code deckt schon drei verschiedene Lösungsmöglichkeiten ab. Aber was ist, wenn jemand statt - wenn Wenn oder WENN schreibt? -

-

- Das Thema Groß- und Kleinschreibung wird dir bei Benutzereingaben öfter begegnen. Für das Spiel würde es zum - Beispiel helfen, wenn der Spieler die Eingabe immer komplett kleinschreibt. Sicher ist der Spieler verwirrt, - wenn das Spiel seine Antwort Wenn als falsch quittiert. -

-

- Optimiere die betreffende Stelle im Spiel, indem du die Benutzereingabe in Kleinbuchstaben umwandelst — vor - Prüfung der if-Bedingung. -

-
-
-
- - - diff --git a/01_grundlagen/uebungen/u31_function-console.html b/01_grundlagen/uebungen/u31_function-console.html deleted file mode 100644 index 227bbed..0000000 --- a/01_grundlagen/uebungen/u31_function-console.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - Übung 31: In die Konsole geloggt, Teil 2 - - - -
-
-

Übung 31: In die Konsole geloggt, Teil 2

-

Schreiben Sie eine Funktion, die Ihren Namen in der Konsole ausgibt.

-
-
-
- - - diff --git a/01_grundlagen/uebungen/u32-tranformed-ladislaus.html b/01_grundlagen/uebungen/u32-tranformed-ladislaus.html deleted file mode 100644 index 2efa89b..0000000 --- a/01_grundlagen/uebungen/u32-tranformed-ladislaus.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - Übung 32: Der transformierte Ladislaus, Teil 2 - - - -
-
-
-

Übung 32: Der transformierte Ladislaus, Teil 2

-

- Schreiben Sie eine Funktion logTransformedName, die Vor- und Nachname als Parameter - entgegennimmt und einen String der Form -

-

- <Nachname>, <Anfangsbuchstabe des Vornamens>. -

-

ausgibt.

-
-
-
- - - diff --git a/01_grundlagen/uebungen/u33_newsletter.html b/01_grundlagen/uebungen/u33_newsletter.html deleted file mode 100644 index c82350e..0000000 --- a/01_grundlagen/uebungen/u33_newsletter.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - Übung 33: Hello, dear ${recipient} - - - -
-
-
-

Übung 33: Hello, dear ${recipient}

-
    -
  1. -

    - Stell dir vor, du arbeitest für ein Unternehmen, das Veranstaltungen organisiert. Du sollst für diesen - Auftraggeber Einladungen verschicken: -

    - - -
    -Dear Heribert,
    -
    -Thank you for your registration.
    -
    -Event Details:
    -- Event: Tech Conference
    -- Date: July 24
    -- Venue: Main Hall, Conference Center
    -
    -We look forward to seeing you at the event!
    -
    -Best regards,
    -The Event Team
    -                
    -
    -

    - Programmiere eine Funktion, die eine Einladung, simuliert durch eine Konsolenausgabe, für die Teilnehmer - generiert. Dabei soll statt Heribert ein beliebiger Name verwendbar sein. -

    - -

    Folgende Aufrufe erfolgen später aus der Datenbank:

    - -
    -showInvitationFor('Heribert');
    -showInvitationFor('Goldy');
    -showInvitationFor('Ladislaus');
    -                
    -
    -
  2. -
  3. -

    - Da unser Auftraggeber verschiedene Veranstaltungen zu verschiedenen Zeitpunkten organisiert, sollen im - nächsten Schritt zwei weitere Parameter angegeben werden, in dem die Art der Veranstaltung, sowie ein - Datum, jeweils als Text, übergeben wird. -

    -

    - Einen zweiten Parameter kannst du bei der Funktionsdefinition innerhalb der Klammern durch Komma - getrennt angeben. -

    - -
    -let showInvitationFor = (recipient, event, date) => {
    -  // ...
    -}
    -                
    -
    -

    - Es sind auch weitere Parameter möglich, aber hier benötigst du nur drei. Innerhalb des Rumpfes kannst du - die neuen Parameter wie gewohnt wie eine Variable verwenden. -

    -

    Folgende Aufrufe erfolgen später aus der Datenbank:

    - -
    -showInvitationFor('Heribert', 'Tech Conference', 'July 24');
    -showInvitationFor('Goldy', 'Art Workshop', 'August 15');
    -showInvitationFor('Ladislaus', 'Music Festival', 'September 10');
    -                
    -
    -
  4. -
  5. -

    - Dein Auftraggeber bietet auch einen VIP-Status für Teilnehmer an. Fall ein Teilnehmer diesen Status - gebucht hat, soll der einleitende Text der Einladung entsprechend angepasst werden: -

    -

    Standard-Version

    -

    Thank you for your registration.

    -

    VIP-Version

    -

    You have registered as a VIP! Enjoy exclusive benefits and access to VIP areas.

    -

    Folgende Aufrufe erfolgen später aus der Datenbank:

    - -
    -showInvitationFor('Heribert', 'Tech Conference', 'July 24', true);
    -showInvitationFor('Goldy', 'Art Workshop', 'August 15', false);
    -showInvitationFor('Ladislaus', 'Music Festival', 'September 10', true);
    -                
    -
    -
  6. -
-
-
-
-
- - - diff --git a/01_grundlagen/uebungen/u34-tranformed-ladislaus.html b/01_grundlagen/uebungen/u34-tranformed-ladislaus.html deleted file mode 100644 index afe1b5c..0000000 --- a/01_grundlagen/uebungen/u34-tranformed-ladislaus.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - Übung 34: Der transformierte Ladislaus, Teil 3 - - - -
-
-
-

Übung 34: Der transformierte Ladislaus, Teil 3

-

- Schreiben Sie eine Funktion transformName, die Vor- und Nachname als Parameter entgegennimmt - und einen String der Form -

-

- <Nachname>, <Anfangsbuchstabe des Vornamens>. -

-
-

Formular:

-
-
-
-
- - -
-
-
-
- - -
-
-
-
-
-
- - - - -
-
-
-
-

Transformierter Name:

-
-
-
- - - diff --git a/01_grundlagen/uebungen/u35_reichweite-verbrauch-1.html b/01_grundlagen/uebungen/u35_reichweite-verbrauch-1.html deleted file mode 100644 index 82e2f72..0000000 --- a/01_grundlagen/uebungen/u35_reichweite-verbrauch-1.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - Übung 35: Reichweite & Verbrauch, Teil 3 - - - -
-
-
-

Übung 35: Reichweite & Verbrauch, Teil 3

-

- Überarbeiten Sie Reichweite & Verbrauch, Teil 2 (Übung 18). Erstellen Sie passende Funktionen, die die - Benutzereingaben zurückgeben. -

-
-
- -
-
-
-
-
-
- - -
-
-
-
- - -
-
-
- -
-
-
- - -
-
-
- -
-
- - - -
-
-
- -
-
-
-
-
- - - diff --git a/01_grundlagen/uebungen/u35_reichweite-verbrauch-2.html b/01_grundlagen/uebungen/u35_reichweite-verbrauch-2.html deleted file mode 100644 index 29d2e6b..0000000 --- a/01_grundlagen/uebungen/u35_reichweite-verbrauch-2.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - Übung 35: Reichweite & Verbrauch, Teil 3 - - - -
-
-
-

Übung 35: Reichweite & Verbrauch, Teil 3

-

- Überarbeiten Sie Reichweite & Verbrauch, Teil 2 (Übung 18). Erstellen Sie passende Funktionen, die die - Benutzereingaben zurückgeben. -

-
-
- -
-
-
-
-
-
- - -
-
-
-
- - -
-
-
- -
-
-
- - -
-
-
- -
-
- - - -
-
-
- -
-
-
-
-
- - - diff --git a/01_grundlagen/uebungen/u36_kekse-array.html b/01_grundlagen/uebungen/u36_kekse-array.html deleted file mode 100644 index 63c2ee7..0000000 --- a/01_grundlagen/uebungen/u36_kekse-array.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - Übung 36: Kekse backen mit Arrays - - - -
-
-
-

Übung 36: Kekse backen mit Arrays

- - -

- Du möchtest ein digitales Rezeptbuch schreiben. Die Zutaten für das jeweilige Rezept stellst du in einem - Array zur Verfügung. -

- -
    -
  1. - Lege für das erste Rezept — Haferflocken-Kekse — ein Array mit den folgenden Zutaten an: - - -
    -1/4 cup vegetable oil
    -1 separated egg
    -1/2 cup sugar
    -1 tsp baking powder
    -                
    -
    -
  2. - -
  3. Da in der Liste das Mehl fehlt, musst du 1 EL Mehl (1 tsp flour) noch nachträglich ergänzen.
  4. - -
  5. - Beim Durchlesen der Liste fällt auf, dass die wohl wichtigste Zutat ebenfalls fehlt. Füge noch 100 g - Haferflocken (1 cup rolled oats) an die erste Position in die Zutatenliste ein. -
  6. -
  7. - Für Kekse ist es eigentlich besser, Butter statt Öl zu verwenden. Tausche das Öl in der Liste - dementsprechend gegen 75 g Butter (1/3 cup butter) aus. -
  8. - -
  9. - Wandle das Array nun in einen String um und speichere diesen in einer Variablen. Dabei sollen die Zutaten - als Liste ausgegeben werden. -
  10. - -
  11. - Und damit die Rezeptspielerei nicht total sinnlos war, bekommst du natürlich noch die Anleitung von uns - dazu. Speichere auch diese in einer Variable und gib das komplette Rezept in der Konsole aus. -
  12. -
- -

Anleitung:

-
- Melt the butter in a pan, add the rolled oats and mix everything well. Remove the mixture from heat and let - it cool. Add the sugar to the egg white and beat until stiff. Mix in the yolk, baking powder and flour. Now - mix in the cooled oat mixture. Shape small mounds of batter onto a baking sheet. These mounds should not be - too large, since the batter will spread out a little as it is baked. Bake for 15 minutes at 350 °F in a - pre-heated oven. -
-
-
-
-
- - - diff --git a/01_grundlagen/uebungen/u37-bus-stations.html b/01_grundlagen/uebungen/u37-bus-stations.html deleted file mode 100644 index 2f3368a..0000000 --- a/01_grundlagen/uebungen/u37-bus-stations.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - Übung 37: Die Kurzstreckenfahrt - - - -
-
-
-

Übung 37: Die Kurzstreckenfahrt

-

- Nach dem Backen möchtest du ein bisschen Zug fahren. Du selbst befindest dich in New York in der Nähe der - Haltestelle Astoria-Ditmars Blvd. Deine Freunde, die dich und deine Kekse schon freudig erwarten, wohnen bei - der Haltestelle Queensboro Plaza. Da du aber nur ein Kurzstrecken-Ticket lösen möchtest, musst du den Rest - der Strecke laufen. Deswegen benötigst du die Haltestellen-Liste (siehe Grafik) nur bis zur Haltestelle - Broadway. -

-

Hinweis: Für diese Übung bietet es sich an, mit `slice` und `indexOf` zu arbeiten.

- - - -
    -
  1. - Erstelle ein Array mit den Haltestellen der Linie W: - - -
    -'use strict';
    -
    -const LINE_W = [
    -  'Astoria-Ditmars Blvd',
    -  'Astoria Blvd',
    -  '30 Av',
    -  'Broadway',
    -  '36 Av',
    -  '39 Av',
    -  'Queensboro Plaza',
    -];
    -                
    -
    -
  2. - -
  3. Finde die Position der gewünschten Zielhaltestelle Broadway heraus.
  4. - -
  5. Entferne alle Haltestellen nach Broadway aus dem Array.
  6. - -
  7. - Schreibe eine Funktion, die dir nach Übergabe einer beliebigen Zielhaltestelle ein Array mit allen - Haltestellen ab Astoria-Ditmars Blvd bis zur Zielhaltestelle zurückgibt. -
  8. - -
  9. Erweitere die Funktion, sodass du auch die Starthaltestelle übergeben kannst.
  10. -
-
-
-
-
- - - diff --git a/01_grundlagen/uebungen/u38_alte-listen.html b/01_grundlagen/uebungen/u38_alte-listen.html deleted file mode 100644 index a98516a..0000000 --- a/01_grundlagen/uebungen/u38_alte-listen.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - Übung 38: Alte Listen - - - -
-
-
-

Übung 38: Alte Listen

- -

- NerdWorld stellt dir eine neue Aufgabe: Die Mitarbeiter haben Produkte früher in Excel-Listen verwaltet. Zu - Migrationszwecken haben die Mitarbeiter sie nun als CSV-Dateien (comma separated values) exportiert. Damit - sind dann alle Elemente in einer Liste durch Kommas getrennt. -

-

- Schreibe eine Funktion handleCsv, die einen übergebenen CSV-String in ein Array splittet und alphabetisch - sortiert. Logge das fertig verarbeitete Array als Liste (pro Produkt eine Zeile) in die Konsole. -

-
-
-
-
- - - diff --git a/01_grundlagen/uebungen/u39_sort-stadt-land-fluss.html b/01_grundlagen/uebungen/u39_sort-stadt-land-fluss.html deleted file mode 100644 index e1c8a35..0000000 --- a/01_grundlagen/uebungen/u39_sort-stadt-land-fluss.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - Übung 39: Stadt, Land, Fluss - - - -
-
-

Übung 39: Stadt, Land, Fluss

-

- Bei dem bekannten deutschen Quiz-Spiel »Stadt, Land, Fluss« müssen die Spieler zu bestimmten Kategorien Wörter - finden, die mit einem bestimmten Buchstaben beginnen. Jeder schreibt die Wörter für sich alleine auf. Sobald - einer der Spieler für jede Kategorie ein Wort gefunden hat, ruft er »Stop« und alle müssen das Aufschreiben - einstellen. Dann wird verglichen. Mehrfach gefundene Wörter werden gestrichen, alle anderen erhalten je nach - Spielregel und Variante Punkte. -

-

- Bei einer Variante des Spiels ist zusätzlich die Wortlänge ausschlaggebend. Das längste Wort bringt dabei die - meisten Punkte. Natürlich möchte niemand tatsächlich die Buchstaben der Wörter zählen. Dafür gibt es - schließlich JS. -

-

- Schreiben Sie eine Funktion, die Wörter einer Kategorie nach Länge sortiert. Das längste Wort soll dabei vorne - stehen. -

-
-
-
-
-
- - - - diff --git a/01_grundlagen/uebungen/u40_map-lueckentext.html b/01_grundlagen/uebungen/u40_map-lueckentext.html deleted file mode 100644 index 1d52050..0000000 --- a/01_grundlagen/uebungen/u40_map-lueckentext.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - Übung 40: Lückentext zu map - - - -
-
-

Übung 40: Lückentext zu map

-

- Wir wollen Sie bei der ersten Übung zu map nicht gleich ins kalte Wasser werfen. Stattdessen - haben wir einen kleinen Lückentext vorbereitet, bei dem Sie nur wenig ergänzen müssen. Ersetzen Sie die - Kommentare /* ??? */ durch den richtigen Code, um das angegebene Ergebnis zu erzielen. -

-
-
- - - diff --git a/01_grundlagen/uebungen/u41_tranformierte-ladislaus.html b/01_grundlagen/uebungen/u41_tranformierte-ladislaus.html deleted file mode 100644 index 2741196..0000000 --- a/01_grundlagen/uebungen/u41_tranformierte-ladislaus.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - Übung 41: Der transformierte Ladislaus, Teil 4 - - - -
-
-
-

Übung 41: Der transformierte Ladislaus, Teil 4

-

- Passen Sie die Funktion transformName aus Übung 34 so an, dass sie beliebig viele Vornamen (als Array) - verwerten kann. -

-

Zum Beispiel: 'L. C. B. Jones'

-
- -

Formular

-
-
-
-
- -
- -
- -
-
-
-
-
- - -
-
-
- -
-
-
- - - -
-
-
-
- -
-
Transformierter Name:
-
-
-
-
- - - diff --git a/01_grundlagen/uebungen/u42_filter-boardgames.html b/01_grundlagen/uebungen/u42_filter-boardgames.html deleted file mode 100644 index 3e09eae..0000000 --- a/01_grundlagen/uebungen/u42_filter-boardgames.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - Übung 42: Friedemann Friese - - - -
-
-
-

Übung 42: Friedemann Friese

-

- Ferdinand Füller mag Brettspiele von Friedemann Friese. Filtern Sie nur die Spiele aus der angegebenen Liste - der Brettspiele heraus, die mit dem Buchstaben F beginnen. -

-

Ersetzen Sie dazu die Kommentare /* ??? */ durch den richtigen Code.

-
-
-
-
- - - diff --git a/01_grundlagen/uebungen/u43_filter-results.html b/01_grundlagen/uebungen/u43_filter-results.html deleted file mode 100644 index 4a0fa45..0000000 --- a/01_grundlagen/uebungen/u43_filter-results.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - Übung 43: Lückentext zu filter - - - -
-
-
-

Übung 43: Lückentext zu filter

-

- Auch zu filter haben wir einen kleinen Lückentext vorbereitet. Ersetzen Sie wieder die - Kommentare /* ??? */ durch den richtigen Code, um das angegebene Ergebnis zu erzielen. -

-
-
-
-
- - - diff --git a/01_grundlagen/uebungen/u44_quersumme.html b/01_grundlagen/uebungen/u44_quersumme.html deleted file mode 100644 index b93724e..0000000 --- a/01_grundlagen/uebungen/u44_quersumme.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - Übung 44: Quersumme berechnen - - - -
-
-
-

Übung 44: Quersumme berechnen

-

- Schreibe eine Funktion digitSum, die die Quersumme einer übergebenen Zahl zurückgibt. - Hinweis: Die Quersumme ist die Summe aller Ziffern einer Zahl.
Tipp: - Verwenden Sie split(''). -

-
-
-
-
- - - diff --git a/01_grundlagen/uebungen/u45_quersummen-sortiert.html b/01_grundlagen/uebungen/u45_quersummen-sortiert.html deleted file mode 100644 index d84ff9a..0000000 --- a/01_grundlagen/uebungen/u45_quersummen-sortiert.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - Übung 45: Quersumme berechnen und Ergebnisse sortieren - - - -
-
-
-

Übung 45: Quersumme berechnen und Ergebnisse sortieren

-

- Na, haben wir den Mathematiker in dir geweckt? Verwende die Funktion digitSum aus der letzten - Übung. Nutze die Funktion dieses Mal, um gleich ein ganzes Array von Zahlen nach ihrer Quersumme zu - sortieren. -

-
-
-
-
- - - diff --git a/01_grundlagen/uebungen/u46_richtige-gewinner.html b/01_grundlagen/uebungen/u46_richtige-gewinner.html deleted file mode 100644 index fde3da0..0000000 --- a/01_grundlagen/uebungen/u46_richtige-gewinner.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - Übung 46: Richtige Gewinner - - - -
-
-
-

Übung 46: Richtige Gewinner

-

- Die Ausgabe der Gewinner aus dem letzten Beispiel (Codebeispiel 324) ist immer noch nicht ideal. Am Besten - wäre das folgende Ergebnis-Array: -

-
-            
-  [
-    '1st place: Heribert',
-    '2nd place: Friedlinde',
-    '3rd place: Tusnelda',
-    'Oswine',
-    'Ladislaus',
-  ]
-            
-          
-
-
-
-
- - - diff --git a/01_grundlagen/uebungen/u47_higher-order-fn-lueckentext.html b/01_grundlagen/uebungen/u47_higher-order-fn-lueckentext.html deleted file mode 100644 index 67cc15e..0000000 --- a/01_grundlagen/uebungen/u47_higher-order-fn-lueckentext.html +++ /dev/null @@ -1,173 +0,0 @@ - - - - - - Übung 47: Lückentext zu Higher-Order-Funktionen - - - -
-
-

Übung 47: Lückentext zu Higher-Order-Funktionen

-

- Das ist garantiert der letzte Lückentext für diese Lektion. Ersetzen Sie wieder die Kommentare - /* ??? */ durch den richtigen Code, um das angegebene Ergebnis zu erzielen. -

-
-
- - - diff --git a/01_grundlagen/uebungen/u48_froehliches-mixen.html b/01_grundlagen/uebungen/u48_froehliches-mixen.html deleted file mode 100644 index dfb529d..0000000 --- a/01_grundlagen/uebungen/u48_froehliches-mixen.html +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - Übung 48: Fröhliches Mixen mit Arrays - - - -
-
-

Übung 48: Fröhliches Mixen mit Arrays

- - Cocktail Party - -

- Nach so viel trockener Theorie hast du Durst. Du öffnest deinen Kühlschrank und siehst eine angebrochene - Packung Maracujasaft, die dringend verbraucht werden muss. Mit Maracujasaft lassen sich tatsächlich tolle - Cocktails zaubern, und gerade letztens hat dir ein Freund den Honolulu Flip empfohlen. Jetzt wäre es perfekt, - wenn in dem besagten Cocktail Maracujasaft enthalten wäre … -

-
-
- - - diff --git a/01_grundlagen/uebungen/uebungen-14-18.zip b/01_grundlagen/uebungen/uebungen-14-18.zip deleted file mode 100644 index cabfef0..0000000 Binary files a/01_grundlagen/uebungen/uebungen-14-18.zip and /dev/null differ diff --git a/01_grundlagen/uebungen/uebungen-19-26.zip b/01_grundlagen/uebungen/uebungen-19-26.zip deleted file mode 100644 index 2798a65..0000000 Binary files a/01_grundlagen/uebungen/uebungen-19-26.zip and /dev/null differ diff --git a/01_grundlagen/uebungen/uebungen-27-35.zip b/01_grundlagen/uebungen/uebungen-27-35.zip deleted file mode 100644 index 2030877..0000000 Binary files a/01_grundlagen/uebungen/uebungen-27-35.zip and /dev/null differ diff --git a/01_grundlagen/uebungen/uebungen-35-38-o1.zip b/01_grundlagen/uebungen/uebungen-35-38-o1.zip deleted file mode 100644 index 6b6feba..0000000 Binary files a/01_grundlagen/uebungen/uebungen-35-38-o1.zip and /dev/null differ diff --git a/01_grundlagen/uebungen/uebungen-39-45.zip b/01_grundlagen/uebungen/uebungen-39-45.zip deleted file mode 100644 index 62d0457..0000000 Binary files a/01_grundlagen/uebungen/uebungen-39-45.zip and /dev/null differ diff --git a/01_grundlagen/uebungen/uebungen-46-48.zip b/01_grundlagen/uebungen/uebungen-46-48.zip deleted file mode 100644 index a0bce1f..0000000 Binary files a/01_grundlagen/uebungen/uebungen-46-48.zip and /dev/null differ diff --git a/01_grundlagen/unterricht/tag01/01_tools-fuer-die-webentwicklung.md b/01_grundlagen/unterricht/tag01/01_tools-fuer-die-webentwicklung.md deleted file mode 100644 index 32aed44..0000000 --- a/01_grundlagen/unterricht/tag01/01_tools-fuer-die-webentwicklung.md +++ /dev/null @@ -1,28 +0,0 @@ -# Tools für die Webentwicklung - -### Markdown - -> **Definition:** Markdown ist eine einfache Syntax, um HTML-Code aus Textdokumenten zu generieren. Über die Markdown Syntax kann man das Schreiben von Dokumentationen und Notizen beschleunigen. - -**Links zum Lernen der Markdown-Syntax** - -- Markdown-Cheatsheet -- [Markdown-Cheatsheet](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) -- [Markdown.de](http://markdown.de/) - -**Markdown Editoren:** - -- [Auflistung von Markdown Editoren](https://dev.to/awwsmm/state-of-markdown-editors-2019-2k49) -- [Haroopad](http://pad.haroopress.com/) (Windows) -- [Macdown](https://macdown.app/) (Mac OS) -- [Typora](https://typora.io/) (Windows | Mac OS) -- [Joplin](https://joplinapp.org/) (Windows | Mac OS) -- [Obsidian](https://obsidian.md/) (Windows | Mac OS) -- [Marp](https://marp.app/) (Windows | Mac OS) - -### Emmet - -> **Definition:** Die Grundfunktion von Emmet ist es mit Abkürzungen rasch HTML und CSS Code schreiben zu können. Man gibt dabei im Editor die Abkürzungen ein, drückt auf die TAB Taste und schon erscheint statt der Abkürzung eine Menge HTML Code. - -- [Emmet Cheatsheet](https://docs.emmet.io/cheatsheet-a5.pdf) -- [Emmet.io](https://emmet.io/) diff --git a/01_grundlagen/unterricht/tag01/01_tools-fuer-die-webentwicklung.pdf b/01_grundlagen/unterricht/tag01/01_tools-fuer-die-webentwicklung.pdf deleted file mode 100644 index a46247b..0000000 Binary files a/01_grundlagen/unterricht/tag01/01_tools-fuer-die-webentwicklung.pdf and /dev/null differ diff --git a/01_grundlagen/unterricht/tag01/02_markdown-syntax.md b/01_grundlagen/unterricht/tag01/02_markdown-syntax.md deleted file mode 100644 index b4024c4..0000000 --- a/01_grundlagen/unterricht/tag01/02_markdown-syntax.md +++ /dev/null @@ -1,22 +0,0 @@ -# Markdown Syntax - -| Bezeichnung | Text | -| ----------- | ---------------------------- | -| Macdown | | -| Haroopad | | - -```js -function test() { - console.log('Hello World'); -} -``` - -**Fetter Text** -_kursiver Text_ - -> Zitattext - -## Todos - -- [ ] Markdown -- [ ] HTML & CSS lernen diff --git a/01_grundlagen/unterricht/tag01/03_emmet.html b/01_grundlagen/unterricht/tag01/03_emmet.html deleted file mode 100644 index 036799d..0000000 --- a/01_grundlagen/unterricht/tag01/03_emmet.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - Emmet - - -

Emmet Beispiele

- -

Lorem ipsum dolor sit amet consectetur, adipisicing elit. Voluptas, magnam.

- - - - - diff --git a/01_grundlagen/unterricht/tag01/04_html-grundgeruest.html b/01_grundlagen/unterricht/tag01/04_html-grundgeruest.html deleted file mode 100644 index 60c857c..0000000 --- a/01_grundlagen/unterricht/tag01/04_html-grundgeruest.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - HTML Grundgerüst - - - -
-
-

HTML Grundgerüst

-
-
- - - diff --git a/01_grundlagen/unterricht/tag02/01_console-log.html b/01_grundlagen/unterricht/tag02/01_console-log.html deleted file mode 100644 index 100068e..0000000 --- a/01_grundlagen/unterricht/tag02/01_console-log.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - console.log() - - - -
-
-

console.log()

-
-
- - - diff --git a/01_grundlagen/unterricht/tag02/02_alert-prompt-confirm.html b/01_grundlagen/unterricht/tag02/02_alert-prompt-confirm.html deleted file mode 100644 index 3fec2bd..0000000 --- a/01_grundlagen/unterricht/tag02/02_alert-prompt-confirm.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - alert(), prompt(), confirm() - - - -
-
-

alert(), prompt(), confirm()

- - -
-

alert()

-

- Die window.alert() Methode zeigt - einen Alert-Dialog mit optional spezifiziertem Inhalt und einem OK-Button an. -

-
- - -
-

prompt()

-

- Die window.prompt() zeigt ein - Dialogfenster mit einem Text-Eingabefeld an, mit einer optionalen Nachricht an den Benutzer. -

-
- -
-

confirm()

-

- Die window.confirm() Methode - zeigt ein modales Dialogfenster mit einem optionalen Text und zwei Buttons an, OK und Abbrechen. - Rückgabewert ist ein Boolean (true, false) -

-
-
-
- - - diff --git a/01_grundlagen/unterricht/tag02/03_use-strict.html b/01_grundlagen/unterricht/tag02/03_use-strict.html deleted file mode 100644 index 50faefb..0000000 --- a/01_grundlagen/unterricht/tag02/03_use-strict.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - use strict - JS in den strikten Modus setzen - - - -
-
-

use strict - JS in den strikten Modus setzen

-

Viele veraltete Sprachkonstrukte werden nicht mehr akzeptiert

-
-
- - - - - diff --git a/01_grundlagen/unterricht/tag02/04_kommentare.html b/01_grundlagen/unterricht/tag02/04_kommentare.html deleted file mode 100644 index 69e041a..0000000 --- a/01_grundlagen/unterricht/tag02/04_kommentare.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - Kommentare in JS - - - - - -
-
-

Kommentare in JS

- - -
-
-
- - - diff --git a/01_grundlagen/unterricht/tag02/05_rechnen-in-js.html b/01_grundlagen/unterricht/tag02/05_rechnen-in-js.html deleted file mode 100644 index e17e1b7..0000000 --- a/01_grundlagen/unterricht/tag02/05_rechnen-in-js.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - Rechnen in JS - - - -
-
-

Rechnen in JS

-

arithmetischen Operatoren

-
    -
  • + Addition
  • -
  • - Subtraktion
  • -
  • * Multiplikation
  • -
  • / Division
  • -
  • % Modulo - Rest einer ganzzahligen Division
  • -
  • ** Potenz (erst ab ECMAScript 2016)
  • -
-
-
- - - diff --git a/01_grundlagen/unterricht/tag02/06_strings.html b/01_grundlagen/unterricht/tag02/06_strings.html deleted file mode 100644 index da718ab..0000000 --- a/01_grundlagen/unterricht/tag02/06_strings.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - Datentyp - String - - - -
-
-

Datentyp - String

-

- - String Objekt - - - Das globale String-Objekt ist ein Konstruktor für Strings, auch Zeichenketten genannt. -

- -
-
-
- - - diff --git a/01_grundlagen/unterricht/tag02/07_strings-length.html b/01_grundlagen/unterricht/tag02/07_strings-length.html deleted file mode 100644 index c6fe12e..0000000 --- a/01_grundlagen/unterricht/tag02/07_strings-length.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - Datentyp - String - - - -
-
-

Datentyp - String

-

- - String Objekt - - - Das globale String-Objekt ist ein Konstruktor für Strings, auch Zeichenketten genannt. -

- -
-
-
- - - diff --git a/01_grundlagen/unterricht/tag02/08_literale.html b/01_grundlagen/unterricht/tag02/08_literale.html deleted file mode 100644 index 7a8da93..0000000 --- a/01_grundlagen/unterricht/tag02/08_literale.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - Literale - - - -
-
-

Literale

-

- Grundsätzlich gilt, dass jeder Wert — egal ob String oder Zahl — der direkt wörtlich (engl.: literally) im - Code steht, als Literal bezeichnet wird. Literale haben immer einen festen Wert. -

- -

Beispiele für Literale

-
    -
  • 42
  • -
  • 'Haus'
  • -
  • 'grün'
  • -
  • 5.47
  • -
  • 1998
  • -
  • 'Bitte geben Sie Ihren Namen ein'
  • -
  • 'use strict'
  • -
  • true
  • -
  • '1 + 4'
  • -
-
-
- - - diff --git a/01_grundlagen/unterricht/tag02/09_typeof.html b/01_grundlagen/unterricht/tag02/09_typeof.html deleted file mode 100644 index bf39acc..0000000 --- a/01_grundlagen/unterricht/tag02/09_typeof.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - Datentypen und der Befehl "typeof" in JS - - - -
-
-

Datentypen und der Befehl "typeof" in JS

-
-
-
- - - diff --git a/01_grundlagen/unterricht/tag02/10_prioritaeten.html b/01_grundlagen/unterricht/tag02/10_prioritaeten.html deleted file mode 100644 index 8775ccc..0000000 --- a/01_grundlagen/unterricht/tag02/10_prioritaeten.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - Prioritäten-Tabelle - - - -
-
-

Prioritäten-Tabelle

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Priorität / PräzedenzNameOperator
1GruppierungsoperatorKlammern ()
2typeof-Operatortypeof
3Multiplikation, Division, Modulo* / %
4Addition, Subtraktion+ -
5Zuweisungsoperator=
-
-
- - - diff --git a/01_grundlagen/unterricht/tag03/01_numbers.html b/01_grundlagen/unterricht/tag03/01_numbers.html deleted file mode 100644 index de003e5..0000000 --- a/01_grundlagen/unterricht/tag03/01_numbers.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - Numbers - - - - -
-
-

Numbers

- -
-
- - - diff --git a/01_grundlagen/unterricht/tag03/02_variablendeklaration.html b/01_grundlagen/unterricht/tag03/02_variablendeklaration.html deleted file mode 100644 index fd11a44..0000000 --- a/01_grundlagen/unterricht/tag03/02_variablendeklaration.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - Variablen in JS - - - -
-
-

Variablen in JS

-
-
- - - diff --git a/01_grundlagen/unterricht/tag03/03_prompt.html b/01_grundlagen/unterricht/tag03/03_prompt.html deleted file mode 100644 index 624ade5..0000000 --- a/01_grundlagen/unterricht/tag03/03_prompt.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - Prompt - Dialogfenster mit Eingabetextfeld in JS - - - -
-
-

Prompt - Dialogfenster mit Eingabetextfeld in JS

-
-
-
- - - diff --git a/01_grundlagen/unterricht/tag03/04_konstante-magic-number.html b/01_grundlagen/unterricht/tag03/04_konstante-magic-number.html deleted file mode 100644 index 46030b5..0000000 --- a/01_grundlagen/unterricht/tag03/04_konstante-magic-number.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - Konstante als Konfigurationsvariable (const) - - - -
-
-

Konstante als Konfigurationsvariable (const)

-
-
-
- - - diff --git a/01_grundlagen/unterricht/tag03/05_zusammengesetzte-zuweisungsoperatoren.html b/01_grundlagen/unterricht/tag03/05_zusammengesetzte-zuweisungsoperatoren.html deleted file mode 100644 index 02a1f9a..0000000 --- a/01_grundlagen/unterricht/tag03/05_zusammengesetzte-zuweisungsoperatoren.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - Zusammengesetzte Zuweisungsoperatoren - - - -
-
-

Zusammengesetzte Zuweisungsoperatoren

- -
    -
  • +=
  • -
  • -=
  • -
  • *=
  • -
  • /=
  • -
  • %=
  • -
  • **=
  • -
-
-
- - - diff --git a/01_grundlagen/unterricht/tag03/06_variablenbezeichner.html b/01_grundlagen/unterricht/tag03/06_variablenbezeichner.html deleted file mode 100644 index 31cc0ee..0000000 --- a/01_grundlagen/unterricht/tag03/06_variablenbezeichner.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Variablenbezeichner - - - -
-
-

Variablenbezeichner

-
-
- - - diff --git a/01_grundlagen/unterricht/tag03/07_verkettungsoperator.html b/01_grundlagen/unterricht/tag03/07_verkettungsoperator.html deleted file mode 100644 index 13c947c..0000000 --- a/01_grundlagen/unterricht/tag03/07_verkettungsoperator.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - Verkettungsoperator oder Konkatenationsoperator (+) - - - -
-
-

Verkettungsoperator oder Konkatenationsoperator (+)

- -
-
-
- - - diff --git a/01_grundlagen/unterricht/tag04/01_escape-notation.html b/01_grundlagen/unterricht/tag04/01_escape-notation.html deleted file mode 100644 index 2d1f662..0000000 --- a/01_grundlagen/unterricht/tag04/01_escape-notation.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - All Escape Characters - - - - - - -
-
-

All Escape Characters

- - -
-
-
- - - diff --git a/01_grundlagen/unterricht/tag04/02_implizite-typkonvertierung.html b/01_grundlagen/unterricht/tag04/02_implizite-typkonvertierung.html deleted file mode 100644 index dd47ffc..0000000 --- a/01_grundlagen/unterricht/tag04/02_implizite-typkonvertierung.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - Implizite Typkonvertierung - - - -
-
-

Implizite Typkonvertierung

-
-
- - - diff --git a/01_grundlagen/unterricht/tag04/03_explizite-typkonvertierung.html b/01_grundlagen/unterricht/tag04/03_explizite-typkonvertierung.html deleted file mode 100644 index 054c382..0000000 --- a/01_grundlagen/unterricht/tag04/03_explizite-typkonvertierung.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - Explizite Typkonvertierung - - - -
-
-

Explizite Typkonvertierung

-
-
-
- - - diff --git a/01_grundlagen/unterricht/tag04/04_nan-paradoxon.html b/01_grundlagen/unterricht/tag04/04_nan-paradoxon.html deleted file mode 100644 index ac97c24..0000000 --- a/01_grundlagen/unterricht/tag04/04_nan-paradoxon.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - NaN - Paradoxon - - - -
-
-

NaN - Paradoxon

-

Die NaN globale Eigenschaft ist ein Wert, der „Nicht eine Zahl“ (Not-a-Number) darstellt.

-
-
- - - diff --git a/01_grundlagen/unterricht/tag04/05_math-api.html b/01_grundlagen/unterricht/tag04/05_math-api.html deleted file mode 100644 index 5bf75a8..0000000 --- a/01_grundlagen/unterricht/tag04/05_math-api.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - Math Object in JS - - - -
-
-

Math Object in JS

-

- Math ist ein Standardobjekt, das Eigenschaften und Methoden für mathematische Konstanten und Funktionen - besitzt. -

- -
-
- - - diff --git a/01_grundlagen/unterricht/tag04/06_number-to-fixed.html b/01_grundlagen/unterricht/tag04/06_number-to-fixed.html deleted file mode 100644 index 99366a9..0000000 --- a/01_grundlagen/unterricht/tag04/06_number-to-fixed.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - Number.toFixed() - - - -
-
-

Number.toFixed()

-

Die toFixed() - Methode formatiert eine Zahl inf Festkommadarstellung

- -
-

Achtung: Rückgabewert ist ein String-Objekt der gegebenen Zahl in Festkommadarstellung

-
- - -
-
- - - diff --git a/01_grundlagen/unterricht/tag04/07_relationale-operatoren.html b/01_grundlagen/unterricht/tag04/07_relationale-operatoren.html deleted file mode 100644 index 57a863c..0000000 --- a/01_grundlagen/unterricht/tag04/07_relationale-operatoren.html +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - Relationale Operatoren & Vergleichoperator - - - -
-
-

Relationale Operatoren & Vergleichoperator

- -
    -
  • < kleiner
  • -
  • > größer
  • -
  • <= kleiner gleich
  • -
  • >= größer gleich
  • -
  • === identisch (strikt)
  • -
  • !== nicht identisch (strikt)
  • -
-
-
- - - diff --git a/01_grundlagen/unterricht/tag05/01_is-nan.html b/01_grundlagen/unterricht/tag05/01_is-nan.html deleted file mode 100644 index ab7757e..0000000 --- a/01_grundlagen/unterricht/tag05/01_is-nan.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - isNaN() - - - -
-
-

isNaN()

-

- Die isNaN() Methode prüft, ob ein Wert NaN ist. Bemerkung: Aufgrund innerer Zwänge weist die - isNaN Methode interessante Regeln auf. Alternativ kann die in ECMAScript 2015 definierte Methode - Number.isNaN() genutzt werden. -

- -
-
- - - diff --git a/01_grundlagen/unterricht/tag05/02_reichweite-verbrauch-formular.html b/01_grundlagen/unterricht/tag05/02_reichweite-verbrauch-formular.html deleted file mode 100644 index d02b8d3..0000000 --- a/01_grundlagen/unterricht/tag05/02_reichweite-verbrauch-formular.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - Formularbeispiel: Reichweite & Verbrauch - - - -
-
-

Formularbeispiel: Reichweite & Verbrauch

-

Berechne deinen PKW-Kraftstoffverbrauch, indem du folgende Felder ausfüllst:

- -
-
-
-
- - -
-
-
- - - -
-
-
- - -
-
-
- -
-
-
- - -
-
-
- - -
-
-
- -
-
-
-
-
-
-
- - - diff --git a/01_grundlagen/unterricht/tag05/03_contact-form.html b/01_grundlagen/unterricht/tag05/03_contact-form.html deleted file mode 100644 index 61407ab..0000000 --- a/01_grundlagen/unterricht/tag05/03_contact-form.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - HTML Kontaktformular - - - -
-
-

HTML Kontaktformular

- -
-
-
-
- - -
-
- -
-
- - -
-
- -
- - -
-
-
- - -
-
-
- - -
-
-
- - -
-
-
- -
-
-
- - -
-
-
-
-
-
- - - diff --git a/01_grundlagen/unterricht/tag05/04_cards-in-grid.html b/01_grundlagen/unterricht/tag05/04_cards-in-grid.html deleted file mode 100644 index 52d0757..0000000 --- a/01_grundlagen/unterricht/tag05/04_cards-in-grid.html +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - Col Grid von BS - - - - -
-
-

Col Grid von BS

-
-
-
-
- ... -
-
Card title
-

- Some quick example text to build on the card title and make up the bulk of the card’s content. -

- Go somewhere -
-
-
-
- -
-
-
- ... -
-
Card title
-

- Some quick example text to build on the card title and make up the bulk of the card’s content. -

- Go somewhere -
-
-
-
- -
-
-
- ... -
-
Card title
-

- Some quick example text to build on the card title and make up the bulk of the card’s content. -

- Go somewhere -
-
-
-
- -
-
-
- ... -
-
Card title
-

- Some quick example text to build on the card title and make up the bulk of the card’s content. -

- Go somewhere -
-
-
-
- -
-
-
- - - diff --git a/01_grundlagen/unterricht/tag05/alle-formularfelder.html b/01_grundlagen/unterricht/tag05/alle-formularfelder.html deleted file mode 100644 index e622969..0000000 --- a/01_grundlagen/unterricht/tag05/alle-formularfelder.html +++ /dev/null @@ -1,281 +0,0 @@ - - - - - - Alle Formularfelder - - - - -
-
-

Alle Formularfelder

-

- Link zu allen "Input"-Feldern: - https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input -

- -
- -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- -
- 0 - - 100 -
- -
- - - - -
- - -
- - - -
- - -
- - - -
- - -
- - -
- - -
- - -
- - -
- - -
- - - +49 (0)151 12 71 55 48 -
- - -
- - -
- - -
- - -
- -
- - -
- - -
- -
- -
- -
- - -
- -
- - -
- - -
- -
-
- - -
-
- - -
-
- - -
-
- -
- - -
- - - - - - - -
- - -
- - -
- - -
- - - MIME/Types -
- -
- - -
- - -
- - - -
- -
- - -
-
-
-
- - diff --git a/01_grundlagen/unterricht/tag05/meeting.md b/01_grundlagen/unterricht/tag05/meeting.md deleted file mode 100644 index 304123d..0000000 --- a/01_grundlagen/unterricht/tag05/meeting.md +++ /dev/null @@ -1,6 +0,0 @@ -# Meeting Fr. 19.06.2026 - -- [ ] 15:00 - 15:10 Uhr Ersin -- [ ] 15:10 - 15:20 Uhr Adel -- [ ] 15:20 - 15:30 Uhr Kahleel -- [ ] 15:30 - 15:40 Uhr Andreas diff --git a/01_grundlagen/unterricht/tag06/01_if-bsp.html b/01_grundlagen/unterricht/tag06/01_if-bsp.html deleted file mode 100644 index e102838..0000000 --- a/01_grundlagen/unterricht/tag06/01_if-bsp.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - if - Verzweigung - - - -
-
-

if - Verzweigung

-

- if (BEDINGUNG) { /* ANWEISUNGEN */ } -

-
-
- - - diff --git a/01_grundlagen/unterricht/tag06/02_if-discount-bsp.html b/01_grundlagen/unterricht/tag06/02_if-discount-bsp.html deleted file mode 100644 index 4f7bea1..0000000 --- a/01_grundlagen/unterricht/tag06/02_if-discount-bsp.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - if - Verzweigung - - - -
-
-

if - Verzweigung

-

- if (BEDINGUNG) { /* ANWEISUNGEN */ } -

-
-
- - - diff --git a/01_grundlagen/unterricht/tag06/03_if-else-bsp.html b/01_grundlagen/unterricht/tag06/03_if-else-bsp.html deleted file mode 100644 index dab0a8c..0000000 --- a/01_grundlagen/unterricht/tag06/03_if-else-bsp.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - if - Verzweigung - - - -
-
-

if - Verzweigung

-

- if (BEDINGUNG) { /* ANWEISUNGEN */ } else { /* ANSONSTEN ANWEISUNGEN */ } -

-
-
- - - diff --git a/01_grundlagen/unterricht/tag06/04_ternaerer-operator.html b/01_grundlagen/unterricht/tag06/04_ternaerer-operator.html deleted file mode 100644 index ca38de8..0000000 --- a/01_grundlagen/unterricht/tag06/04_ternaerer-operator.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - Ternärer Operator | Tertiärer Operator - - - -
-
-

Ternärer Operator | Tertiärer Operator

-
-
-
- - - diff --git a/01_grundlagen/unterricht/tag06/05_logischer-oder-operator.html b/01_grundlagen/unterricht/tag06/05_logischer-oder-operator.html deleted file mode 100644 index 023de37..0000000 --- a/01_grundlagen/unterricht/tag06/05_logischer-oder-operator.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - Logischer Operator | oder (||) - - - -
-
-

Logischer Operator | oder (||)

-
-
-
- - - diff --git a/01_grundlagen/unterricht/tag06/06_logischer-operator-oder-short-breakout.html b/01_grundlagen/unterricht/tag06/06_logischer-operator-oder-short-breakout.html deleted file mode 100644 index 7e0f171..0000000 --- a/01_grundlagen/unterricht/tag06/06_logischer-operator-oder-short-breakout.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - Logischer Operator - oder (||) - short breakout - - - -
-
-

Logischer Operator - oder (||) - short breakout

-
- Only null, undefined, 0, false, NaN and "" are falsy in JavaScript. Everything else is truthy. -
-
-
-
- - - diff --git a/01_grundlagen/unterricht/tag06/07_logischer-und-operator.html b/01_grundlagen/unterricht/tag06/07_logischer-und-operator.html deleted file mode 100644 index 0431c06..0000000 --- a/01_grundlagen/unterricht/tag06/07_logischer-und-operator.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - Logischer Operator - und (&&) - - - -
-
-

Logischer Operator - und (&&)

-
-
-
- - - diff --git a/01_grundlagen/unterricht/tag06/08_logischer-operator-und-short-breakout.html b/01_grundlagen/unterricht/tag06/08_logischer-operator-und-short-breakout.html deleted file mode 100644 index 1916b81..0000000 --- a/01_grundlagen/unterricht/tag06/08_logischer-operator-und-short-breakout.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - Logischer Operator - und (&&) - short breakout - - - -
-
-

Logischer Operator - und (&&) - short breakout

-
- Only null, undefined, 0, false, NaN and "" are falsy in JavaScript. Everything else is truthy. -
-
-
- - - diff --git a/01_grundlagen/unterricht/tag06/09_unaerer-operator.html b/01_grundlagen/unterricht/tag06/09_unaerer-operator.html deleted file mode 100644 index 636655b..0000000 --- a/01_grundlagen/unterricht/tag06/09_unaerer-operator.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - Unärer Operator - not (!) - - - -
-
-

Unärer Operator - not (!)

-

- - The logical NOT - - Der logische NICHT (!) (logische Komplementierung, Negation) Operator wandelt Wahrheit in Falschheit und - umgekehrt. Er wird typischerweise mit booleschen (logischen) Werten verwendet. Wenn er mit nicht-booleschen - Werten verwendet wird, gibt er false zurück, wenn sein einzelner Operand in - true umgewandelt werden kann; andernfalls wird true zurückgegeben. -

- - - -
- -
-
-
-
- - - diff --git a/01_grundlagen/unterricht/tag06/10_str-index-of.html b/01_grundlagen/unterricht/tag06/10_str-index-of.html deleted file mode 100644 index 9305341..0000000 --- a/01_grundlagen/unterricht/tag06/10_str-index-of.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - String.indexOf() | String.lastIndexOf() - - - -
-
-

String.indexOf() | String.lastIndexOf()

-
-

- String.indexOf() -

-

- Die indexOf() Methode gibt den Index der Zeichenkette innerhalb des aufrufenden String - Objekts des ersten Vorkommnis des angegebenen Wertes beginnend bei fromIndex zurück. Gibt - -1 zurück, wenn der Wert nicht gefunden wurde. -

-
-
- - - diff --git a/01_grundlagen/unterricht/tag06/11_str-substring.html b/01_grundlagen/unterricht/tag06/11_str-substring.html deleted file mode 100644 index b20e1fe..0000000 --- a/01_grundlagen/unterricht/tag06/11_str-substring.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - String.substring(startIndex, endIndex) - - - -
-
-

- String.substring(startIndex, endIndex) -

-

- Die substring() Methode gibt einen Teilstring eines Strings zwischen einem Index und einem - anderen (EndIndex), oder dem Ende der Zeichenkette zurück... -

-
-
- - - diff --git a/01_grundlagen/unterricht/tag06/12_str-substr.html b/01_grundlagen/unterricht/tag06/12_str-substr.html deleted file mode 100644 index d3701e9..0000000 --- a/01_grundlagen/unterricht/tag06/12_str-substr.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - String.substr(startIndex, length) DEPREACATED - - - -
-
-

- String.substr(startIndex, length) DEPREACATED -

-

- Die substr()-Methode von String-Werten gibt einen Teil dieses Strings zurück, beginnend am - angegebenen Index und wird um eine bestimmte Anzahl von Zeichen verlängert. -

-
-
- - - diff --git a/01_grundlagen/unterricht/tag07/01_str-trim.html b/01_grundlagen/unterricht/tag07/01_str-trim.html deleted file mode 100644 index 7448dcc..0000000 --- a/01_grundlagen/unterricht/tag07/01_str-trim.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - String.trim() - - - -
-
-

- - String.trim() - -

-

- Die trim() Methode entfernt Leerzeichen an beiden Enden einer Zeichenfolge. Das betrifft - Leerzeichen verschiedenster Art (space, tab, no-break space, etc.) und alle Zeilenumbruch einleitende Zeichen - (LF, CR, etc.). -

-
-
- - - diff --git a/01_grundlagen/unterricht/tag07/02_str-char-at.html b/01_grundlagen/unterricht/tag07/02_str-char-at.html deleted file mode 100644 index cbfadeb..0000000 --- a/01_grundlagen/unterricht/tag07/02_str-char-at.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - String.charAt() - - - -
-
-

- - String.charAt() - -

-

Die charAt()-Methode gibt das Zeichen an einer bestimmten Stelle eines Strings wieder.

-
-
- - - diff --git a/01_grundlagen/unterricht/tag07/03_str-to-lower-upper.html b/01_grundlagen/unterricht/tag07/03_str-to-lower-upper.html deleted file mode 100644 index 7cb509f..0000000 --- a/01_grundlagen/unterricht/tag07/03_str-to-lower-upper.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - String.toLowerCase() | String.toUpperCase() - - - -
- -
- - - diff --git a/01_grundlagen/unterricht/tag07/04_str-replace-replace-all.html b/01_grundlagen/unterricht/tag07/04_str-replace-replace-all.html deleted file mode 100644 index 0894e21..0000000 --- a/01_grundlagen/unterricht/tag07/04_str-replace-replace-all.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - String.replace(searchValue, replaceValue) - - - -
-
-

- - String.replace(searchValue, replaceValue) - -

-

- Die replace()-Methode gibt eine neue Zeichenkette zurück, in der einige oder alle - Übereinstimmungen mit einem Muster durch einen Ersatz ausgetauscht wurden. Das - Muster kann eine Zeichenkette (string) oder eine RegExp sein, als Ersatz dienen - eine Zeichenkette oder eine Funktion, welche für jede Übereinstimmung aufgerufen wird. -

-
-
-
- - - diff --git a/01_grundlagen/unterricht/tag07/05_str-includes.html b/01_grundlagen/unterricht/tag07/05_str-includes.html deleted file mode 100644 index ede9a30..0000000 --- a/01_grundlagen/unterricht/tag07/05_str-includes.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - String.includes() - - - -
-
-

- - String.includes() - -

-

- Die includes()-Methode gibt an, ob ein String innerhalb eines anderen Strings gefunden wird - und gibt dabei true oder false wieder. -

-
-
- - - diff --git a/01_grundlagen/unterricht/tag07/06_str-starts-with-ends-with.html b/01_grundlagen/unterricht/tag07/06_str-starts-with-ends-with.html deleted file mode 100644 index 99fdb8b..0000000 --- a/01_grundlagen/unterricht/tag07/06_str-starts-with-ends-with.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - String.startsWith() & String.endsWith() - - - -
-
-

String.startsWith() & String.endsWith()

-

- - String.startsWith() - -

-

- Die startsWith()-Methode stellt fest, ob ein String mit den Zeichen eines anderen Strings - beginnt, falls dies so ist, wird true, sonst wird false zurückgegeben. -

-

- - String.endsWith() - -

-

- Die Methode endsWith() bestimmt, ob ein String das Ende eines anderen Strings ist, und - liefert entsprechend true oder false zurück. -

-
-
-
- - - diff --git a/01_grundlagen/unterricht/tag07/07_str-pad-start-pad-end.html b/01_grundlagen/unterricht/tag07/07_str-pad-start-pad-end.html deleted file mode 100644 index 205605c..0000000 --- a/01_grundlagen/unterricht/tag07/07_str-pad-start-pad-end.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - String.padStart() & String.padEnd() - - - -
-
-

String.padStart() & String.padEnd()

-

- - String.padStart() - -

-

- The padStart() method pads the current string with another string (multiple times, if needed) - until the resulting string reaches the given length. The padding is applied from the start of the current - string. -

-
-

- - String.padEnd() - -

-

- The padEnd() method pads the current string with a given string (repeated, if needed) so that - the resulting string reaches a given length. The padding is applied from the end of the current string. -

-
-
- - - diff --git a/01_grundlagen/unterricht/tag07/08_str-repeat.html b/01_grundlagen/unterricht/tag07/08_str-repeat.html deleted file mode 100644 index eee4734..0000000 --- a/01_grundlagen/unterricht/tag07/08_str-repeat.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - String.repeat() - - - -
-
-

- - String.repeat() - -

-

- The repeat() method constructs and returns a new string which contains the specified number - of copies of the string on which it was called, concatenated together. -

-
-
- - - diff --git a/01_grundlagen/unterricht/tag07/09_funktionsdefinition.html b/01_grundlagen/unterricht/tag07/09_funktionsdefinition.html deleted file mode 100644 index eab726d..0000000 --- a/01_grundlagen/unterricht/tag07/09_funktionsdefinition.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - JS - Funktionsdefinition - - - -
-
-

JS - Funktionsdefinition

-
-
- - - diff --git a/01_grundlagen/unterricht/tag07/10_function-hoisting.html b/01_grundlagen/unterricht/tag07/10_function-hoisting.html deleted file mode 100644 index c2da12c..0000000 --- a/01_grundlagen/unterricht/tag07/10_function-hoisting.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - JS - Funktionsausdruck (function expression) ohne hochziehen - - - -
-
-

JS - Funktionsausdruck (function expression) ohne hochziehen

-
-
- - - diff --git a/01_grundlagen/unterricht/tag07/11_arrow-vs-classic-function-expression.html b/01_grundlagen/unterricht/tag07/11_arrow-vs-classic-function-expression.html deleted file mode 100644 index 84b7cca..0000000 --- a/01_grundlagen/unterricht/tag07/11_arrow-vs-classic-function-expression.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - Arrow expression (=>) vs. function expression (function) - - - -
-
-

Arrow expression (=>) vs. function expression (function)

- - -
-
- - - diff --git a/01_grundlagen/unterricht/tag07/12_function-expression-with-parameters.html b/01_grundlagen/unterricht/tag07/12_function-expression-with-parameters.html deleted file mode 100644 index da89d1d..0000000 --- a/01_grundlagen/unterricht/tag07/12_function-expression-with-parameters.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - Funktionsausdruck mit Paramtern - - - -
-
-

Funktionsausdruck mit Paramtern

-
-
- - - diff --git a/01_grundlagen/unterricht/tag07/13_volume-cube.html b/01_grundlagen/unterricht/tag07/13_volume-cube.html deleted file mode 100644 index 9cec2d4..0000000 --- a/01_grundlagen/unterricht/tag07/13_volume-cube.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - Kartonvolumen berechnen (cube) - - - -
-
-

Kartonvolumen berechnen (cube)

-
-
- - - diff --git a/01_grundlagen/unterricht/tag07/14_function-volume-cube.html b/01_grundlagen/unterricht/tag07/14_function-volume-cube.html deleted file mode 100644 index 5d2d156..0000000 --- a/01_grundlagen/unterricht/tag07/14_function-volume-cube.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - Kartonvolumen berechnen mit Funktion (cube) - - - -
-
-

Kartonvolumen berechnen mit Funktion (cube)

-
-
- - - diff --git a/01_grundlagen/unterricht/tag08/01_volume-tube.html b/01_grundlagen/unterricht/tag08/01_volume-tube.html deleted file mode 100644 index 19b7a16..0000000 --- a/01_grundlagen/unterricht/tag08/01_volume-tube.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - Zylindervolumen berechnen (tube) - - - -
-
-

Zylindervolumen berechnen (tube)

-
-
- - - diff --git a/01_grundlagen/unterricht/tag08/02_function-volume-tube.html b/01_grundlagen/unterricht/tag08/02_function-volume-tube.html deleted file mode 100644 index 244dbfe..0000000 --- a/01_grundlagen/unterricht/tag08/02_function-volume-tube.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - Zylindervolumen berechnen (tube) mit Funktion - - - -
-
-

Zylindervolumen berechnen (tube) mit Funktion

-
-
- - - diff --git a/01_grundlagen/unterricht/tag08/03_guard-function-volume-tube.html b/01_grundlagen/unterricht/tag08/03_guard-function-volume-tube.html deleted file mode 100644 index 5970608..0000000 --- a/01_grundlagen/unterricht/tag08/03_guard-function-volume-tube.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - Zylindervolumen berechnen (tube) mit Funktion und Guard - - - -
-
-

Zylindervolumen berechnen (tube) mit Funktion und Guard

-
-
- - - diff --git a/01_grundlagen/unterricht/tag08/04_rest-default-parameter.html b/01_grundlagen/unterricht/tag08/04_rest-default-parameter.html deleted file mode 100644 index d03c0dd..0000000 --- a/01_grundlagen/unterricht/tag08/04_rest-default-parameter.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - Rest- und Defaultparameter - - - -
-
-

Rest- und Defaultparameter

-
-
- - - diff --git a/01_grundlagen/unterricht/tag08/05_array-object.html b/01_grundlagen/unterricht/tag08/05_array-object.html deleted file mode 100644 index 08951fa..0000000 --- a/01_grundlagen/unterricht/tag08/05_array-object.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - Array Object - - - -
-
-

Array - Object

-

- Array Object - - Das JavaScript-Array ist ein globales Objekt und Konstruktor für das Erstellen von Arrays, welche - listenähnliche Objekte sind. -

-
-
- - - diff --git a/01_grundlagen/unterricht/tag08/06_ar-push.html b/01_grundlagen/unterricht/tag08/06_ar-push.html deleted file mode 100644 index 792e2f0..0000000 --- a/01_grundlagen/unterricht/tag08/06_ar-push.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - Array - ar.push() - - - -
-
-

Array - ar.push()

-

- - ar.push() - - - Die push() Methode fügt ein oder mehrere Elemente am Ende eines Arrays hinzu und gibt die - neue Länge des Arrays zurück. -

-
-
- - - diff --git a/01_grundlagen/unterricht/tag08/07_ar-pop.html b/01_grundlagen/unterricht/tag08/07_ar-pop.html deleted file mode 100644 index 6bdc6ed..0000000 --- a/01_grundlagen/unterricht/tag08/07_ar-pop.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - Array - ar.pop() - - - -
-
-

Array - ar.pop()

-

- - ar.pop() - - - Die pop() Methode entfernt das letzte Element eines Arrays und gibt dieses - zurück. Diese Methode ändert die Länge des Arrays. -

-
-
- - - diff --git a/01_grundlagen/unterricht/tag08/08_ar-unshift.html b/01_grundlagen/unterricht/tag08/08_ar-unshift.html deleted file mode 100644 index ced6aaa..0000000 --- a/01_grundlagen/unterricht/tag08/08_ar-unshift.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - Array - ar.unshift() - - - -
-
-

Array - ar.unshift()

-

- - ar.unshift() - - - Die unshift() Methode fügt ein oder mehrere Elemente am Anfang eines Arrays hinzu und gibt - die neue Länge des Arrays zurück. -

-
-
- - - diff --git a/01_grundlagen/unterricht/tag08/09_ar-shift.html b/01_grundlagen/unterricht/tag08/09_ar-shift.html deleted file mode 100644 index ee70291..0000000 --- a/01_grundlagen/unterricht/tag08/09_ar-shift.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - Array - ar.shift() - - - -
-
-

Array - ar.shift()

-

- - ar.shift() - - - Die shift() Methode entfernt das erste Element eines Arrays und gibt - dieses zurück. Diese Methode ändert die Länge des Arrays. -

-
-
- - - diff --git a/01_grundlagen/unterricht/tag08/10_ar-splice.html b/01_grundlagen/unterricht/tag08/10_ar-splice.html deleted file mode 100644 index ecc7bb5..0000000 --- a/01_grundlagen/unterricht/tag08/10_ar-splice.html +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - Array.splice() - - - -
-
-

Array - ar.splice()

-

- - ar.splice() - - - Die splice() Methode ändert den Inhalt eines Arrays durch das Entfernen vorhandener - Elemente und/oder Hinzufügen neuer Elemente. -

-
-
- - - diff --git a/01_grundlagen/unterricht/tag08/11_ar-slice.html b/01_grundlagen/unterricht/tag08/11_ar-slice.html deleted file mode 100644 index 7430a2d..0000000 --- a/01_grundlagen/unterricht/tag08/11_ar-slice.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - Array.slice() - - - -
-
-

Array - ar.slice()

-

- - ar.slice() - - - Die slice() Methode schreibt eine flache Kopie von einem Teil des Arrays in ein neues - Array-Objekt von begin bis end (end nicht enthalten). Das originale Array wird nicht - verändert. (side-effect-free) -

-
side-effect-free
-
-
-
- - - diff --git a/01_grundlagen/unterricht/tag08/12_ar-sort.html b/01_grundlagen/unterricht/tag08/12_ar-sort.html deleted file mode 100644 index d03dc89..0000000 --- a/01_grundlagen/unterricht/tag08/12_ar-sort.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - Array.sort() - - - -
-
-

Array - ar.sort()

-

- - ar.sort() - - - Die sort() Methode sortiert die Elemente eines Arrays in-place und gibt das - Array zurück. Standardmäßig werden alle Elemente in Strings umgewandelt und dann anhand ihrer UTF-16 - Codepoints miteinander verglichen. -

-
- Das angesprochene Array wird durch in-place-mutation ebenfalls sortiert. -
-
-
-
- - - diff --git a/01_grundlagen/unterricht/tag08/13_ar-index-last-index-of.html b/01_grundlagen/unterricht/tag08/13_ar-index-last-index-of.html deleted file mode 100644 index 70c2360..0000000 --- a/01_grundlagen/unterricht/tag08/13_ar-index-last-index-of.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - Array - ar.indexOf() - - - -
-
-

Array - ar.indexOf()

-

- - ar.indexOf() - - - Die Methode indexOf() gibt den Index zurück, an dem ein bestimmtes Element im Array zum - ersten Mal auftritt oder -1 wenn es nicht vorhanden ist. -

-
-
-
- - - diff --git a/01_grundlagen/unterricht/tag08/14_ar-join.html b/01_grundlagen/unterricht/tag08/14_ar-join.html deleted file mode 100644 index 984c3d4..0000000 --- a/01_grundlagen/unterricht/tag08/14_ar-join.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - Array - ar.join() - - - -
-
-

Array - ar.join()

-

- - ar.join() - - - Die join() Methode von Array Instanzen erstellt und gibt einen neuen String zurück, indem alle - Elemente in diesem Array verkettet werden, getrennt durch Kommas oder einem angegebenen Trennzeichen-String. - Wenn das Array nur ein Element hat, wird dieses Element ohne Verwendung des Trennzeichens zurückgegeben. -

-
-
-
- - - diff --git a/01_grundlagen/unterricht/tag09/01_str-split.html b/01_grundlagen/unterricht/tag09/01_str-split.html deleted file mode 100644 index 2ed8726..0000000 --- a/01_grundlagen/unterricht/tag09/01_str-split.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - String.split() - - - -
-
-

String - str.split()

-

- - str.split() - - - Die split() Methode teilt ein String Objekt in ein Array von Strings auf, indem der String - in Teilstrings zerteilt wird, wobei ein angegebenes Trennzeichen verwendet wird, um zu bestimmen, wo die - Aufteilung erfolgen soll. -

- -
-
-
- - - diff --git a/01_grundlagen/unterricht/tag09/02_ar-reverse.html b/01_grundlagen/unterricht/tag09/02_ar-reverse.html deleted file mode 100644 index dedf86a..0000000 --- a/01_grundlagen/unterricht/tag09/02_ar-reverse.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - Array.reverse() - - - -
-
-

Array - ar.reverse()

-

- - ar.reverse() - - - Die Methode von Array Instanzen kehrt ein Array in place um und gibt die Referenz auf dasselbe - Array zurück, wobei das erste Array-Element nun zum letzten und das letzte Array-Element zum ersten wird. Mit - anderen Worten, die Reihenfolge der Elemente im Array wird in die entgegengesetzte Richtung gedreht. -

-
-
-
- - - diff --git a/01_grundlagen/unterricht/tag09/03_ar-to-sorted-to-reversed-to-spliced.html b/01_grundlagen/unterricht/tag09/03_ar-to-sorted-to-reversed-to-spliced.html deleted file mode 100644 index baf4806..0000000 --- a/01_grundlagen/unterricht/tag09/03_ar-to-sorted-to-reversed-to-spliced.html +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - Array - Neue Methoden seit Juni 2023 - - - -
-
-

Array - Neue Methoden seit Juni 2023

-
-

Array - ar.toSorted()

-

- Die - - toSorted() - - Methode von Array Instanzen ist die kopierende Version der sort() Methode. Sie gibt ein neues - Array mit den Elementen in aufsteigender Reihenfolge zurück. -

-
-

Array - ar.toReversed()

-

- Die - - toReversed() - - Methode von Array Instanzen ist das kopierende Gegenstück der reverse() Methode. Sie gibt ein - neues Array mit den Elementen in umgekehrter Reihenfolge zurück. -

-

Array - ar.toSpliced()

-

- Die - - toSpliced() - - Methode von Array-Instanzen ist die kopierende Version der splice()-Methode. Sie gibt ein neues - Array zurück, bei dem einige Elemente entfernt und/oder an einem bestimmten Index ersetzt wurden. -

-
-
-
- - - diff --git a/01_grundlagen/unterricht/tag09/04_ar-sort-compare-fn.html b/01_grundlagen/unterricht/tag09/04_ar-sort-compare-fn.html deleted file mode 100644 index 031827a..0000000 --- a/01_grundlagen/unterricht/tag09/04_ar-sort-compare-fn.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - Array - ar.sort(compareFn) - - - -
-
-

Array - ar.sort(compareFn)

- Bubble sort -
-

- - ar.sort(compareFn) - - - Die sort() Methode sortiert die Elemente eines Arrays in-place und gibt das - Array zurück. Standardmäßig werden alle Elemente in Strings umgewandelt und dann anhand ihrer UTF-16 - Codepoints miteinander verglichen. -

-
- Das angesprochene Array wird durch in-place-mutation ebenfalls sortiert. -
- -
-

Rückgabewerte der Vergleichfunktion:

-
    -
  • Rückgabewert 0: Positionen bleiben stehen
  • -
  • Rückgabewert < 0: Positionen bleiben stehen
  • -
  • Rückgabewert > 0: Positionen vertauscht
  • -
-
-
-
- - - diff --git a/01_grundlagen/unterricht/tag09/05_ar-sort-compare-fn-bsp-admin.html b/01_grundlagen/unterricht/tag09/05_ar-sort-compare-fn-bsp-admin.html deleted file mode 100644 index 370ba62..0000000 --- a/01_grundlagen/unterricht/tag09/05_ar-sort-compare-fn-bsp-admin.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - Array - ar.sort(compareFn) - - - -
-
-

Array - ar.sort(compareFn)

- Bubble sort -
-

- - ar.sort(compareFn) - - - Die sort() Methode sortiert die Elemente eines Arrays in-place und gibt das - Array zurück. Standardmäßig werden alle Elemente in Strings umgewandelt und dann anhand ihrer UTF-16 - Codepoints miteinander verglichen. -

-
- Das angesprochene Array wird durch in-place-mutation ebenfalls sortiert. -
- -
-

Rückgabewerte der Vergleichfunktion:

-
    -
  • Rückgabewert 0: Positionen bleiben stehen
  • -
  • Rückgabewert < 0: Positionen bleiben stehen
  • -
  • Rückgabewert > 0: Positionen vertauscht
  • -
-
-
-
- - - diff --git a/01_grundlagen/unterricht/tag09/06_ar-map.html b/01_grundlagen/unterricht/tag09/06_ar-map.html deleted file mode 100644 index 5b95480..0000000 --- a/01_grundlagen/unterricht/tag09/06_ar-map.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - Array - ar.map() - - - -
-
-

Array - ar.map()

-

- ar.map() - - Die map() (engl. abbilden) Methode wendet auf jedes Element des Arrays die bereitgestellte - Funktion an und gibt das Ergebnis in einem neuen Array zurück. (side-effect-free) -

-
-
-
- - - diff --git a/01_grundlagen/unterricht/tag09/07_ar-filter.html b/01_grundlagen/unterricht/tag09/07_ar-filter.html deleted file mode 100644 index 10daac9..0000000 --- a/01_grundlagen/unterricht/tag09/07_ar-filter.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - Array - ar.filter() - - - -
-
-

Array - ar.filter()

-

- - ar.filter() - - - filter() erstellt ein neues Array mit allen Elementen, die den von der bereitgestellten - Funktion implementierten Test bestehen. (side-effect-free) -

-
-
-
- - - diff --git a/01_grundlagen/unterricht/tag09/08_ar-for-each.html b/01_grundlagen/unterricht/tag09/08_ar-for-each.html deleted file mode 100644 index a57654c..0000000 --- a/01_grundlagen/unterricht/tag09/08_ar-for-each.html +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - Array - ar.forEach() - - - -
-
-

Array - ar.forEach()

-

- - ar.forEach() - - - Die forEach() Methode führt eine übergebene Funktion für jedes Element eines Arrays aus. -

- -
-
-
- - - diff --git a/01_grundlagen/unterricht/tag09/09_ar-reduce.html b/01_grundlagen/unterricht/tag09/09_ar-reduce.html deleted file mode 100644 index 03ca6d5..0000000 --- a/01_grundlagen/unterricht/tag09/09_ar-reduce.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - Array - ar.reduce() - - - -
-
-

Array - ar.reduce()

-

- - ar.reduce() - - - Die reduce()-Methode reduziert ein Array auf einen einzigen Wert, indem es jeweils zwei - Elemente (von links nach rechts) durch eine gegebene Funktion reduziert. -

-
side-effect-free
- -
-
-
- - - diff --git a/01_grundlagen/unterricht/tag09/10_ar-some.html b/01_grundlagen/unterricht/tag09/10_ar-some.html deleted file mode 100644 index 8f5545c..0000000 --- a/01_grundlagen/unterricht/tag09/10_ar-some.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - Array - ar.some() - - - -
-
-

Array - ar.some()

-

- - ar.some() - - - Die Methode some() überprüft ob mindestens ein Element des Arrays den als Funktion - übergebenen Kriterien entspricht. -

-
side-effect-free
-
-
-
- - - diff --git a/01_grundlagen/unterricht/tag09/11_ar-every.html b/01_grundlagen/unterricht/tag09/11_ar-every.html deleted file mode 100644 index 8dc8418..0000000 --- a/01_grundlagen/unterricht/tag09/11_ar-every.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - Array - ar.every() - - - -
-
-

Array - ar.every()

-

- - ar.every() - - - Die every() Methode testet ob alle Elemente in einem Array einen Test bestehen, welcher - mittels einer implementierten Funktion bereitgestellt wird. -

-
side-effect-free
-
-
-
- - - diff --git a/01_grundlagen/unterricht/tag10/01_ar-optionale-parameter.html b/01_grundlagen/unterricht/tag10/01_ar-optionale-parameter.html deleted file mode 100644 index f5a0cdb..0000000 --- a/01_grundlagen/unterricht/tag10/01_ar-optionale-parameter.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - Array Methoden - optionale Parameter - - - -
-
-

Array Methoden - optionale Parameter

- - - - - - - - - - - - - - - - - - - - - - -
NameParameter der Callback-Funktion
map, filter, every, some, find, findIndex, forEach -
    -
  1. Value: Der Wert des aktuell betrachteten Elements aus dem Array.
  2. -
  3. Index: Ein laufender Index-Wert beginnend bei 0.
  4. -
  5. Array: Das komplette Array, auf dem map aufgerufen wird.
  6. -
-
reduce, reduceRight -
    -
  1. - previousValue: Ergebnis der letzten Ausführung des Callbacks. Beim ersten Aufruf - ist es der Initialwert von reduce. Falls es keinen Initialwert gibt, verwendet reduce stattdessen - den ersten Wert des Arrays. -
  2. -
  3. Value: Der Wert des aktuell betrachteten Elements aus dem Array.
  4. -
  5. Index: Ein laufender Index-Wert beginnend bei 0.
  6. -
  7. Array: Das komplette Array, auf dem reduce aufgerufen wird.
  8. -
-
sort1. & 2. element: Elemente, die miteinander zu vergleichen sind.
- -
-
-
- - - diff --git a/01_grundlagen/unterricht/tag10/02_ar-find.html b/01_grundlagen/unterricht/tag10/02_ar-find.html deleted file mode 100644 index e1b9446..0000000 --- a/01_grundlagen/unterricht/tag10/02_ar-find.html +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - Array - ar.find() - - - -
-
-

Array - ar.find()

-

- ar.find() - - - Die Methode find() gibt den Wert des Elements eines Arrays zurück, welches - als erstes die Bedingung einer bereitgestellten Testfunktion erfüllt. Andernfalls wird - undefined zurückgegeben. -

-
Side-effect-free
-
-
-
- - - diff --git a/01_grundlagen/unterricht/tag10/03_ar-find-index.html b/01_grundlagen/unterricht/tag10/03_ar-find-index.html deleted file mode 100644 index a4ee237..0000000 --- a/01_grundlagen/unterricht/tag10/03_ar-find-index.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - Array - ar.findIndex() - - - -
-
-

Array - ar.findIndex()

-

- - ar.findIndex() - -

- -

- - Die Methode findIndex() gibt den Index des Elements eines Arrays zurück, welches - als erstes die Bedingung einer bereitgestellten Testfunktion erfüllt. Andernfalls wird - -1 zurückgegeben. -

- -
Side-effect-free
-
-
-
- - - diff --git a/01_grundlagen/unterricht/tag10/04_local-scoping-mit-let-const.html b/01_grundlagen/unterricht/tag10/04_local-scoping-mit-let-const.html deleted file mode 100644 index 9d82c03..0000000 --- a/01_grundlagen/unterricht/tag10/04_local-scoping-mit-let-const.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - "Local Scoping" (Gültigkeitsbereiche) von let & const - - - -
-
-

"Local Scoping" (Gültigkeitsbereiche) von let & const

-

- Variablen deklariert mit let & const haben ihren eingegrenzten - Gültigkeitsbereich innerhalb von Codeblöcken ({}) -

-
-
- - - diff --git a/01_grundlagen/unterricht/tag10/05_local-scoping-mit-var.html b/01_grundlagen/unterricht/tag10/05_local-scoping-mit-var.html deleted file mode 100644 index 84ff283..0000000 --- a/01_grundlagen/unterricht/tag10/05_local-scoping-mit-var.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - "Local Scoping" (Gültigkeitsbereiche) von var - - - -
-
-

"Local Scoping" (Gültigkeitsbereiche) von var

-

- Variablen deklariert mit var haben ihren eingegrenzten Gültigkeitsbereich nur innerhalb von - Funktionsblöcken ({}) - "functio scope" -

-
-
- - - diff --git a/01_grundlagen/unterricht/tag10/06_local-scoping-code-bloecken.html b/01_grundlagen/unterricht/tag10/06_local-scoping-code-bloecken.html deleted file mode 100644 index 0397f9c..0000000 --- a/01_grundlagen/unterricht/tag10/06_local-scoping-code-bloecken.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - "local scoping" von Codeblöcken - - - - - -
-
-

"local scoping" von Codeblöcken

-
-
-
-
-
- -
-
- - - - - - - - - - - diff --git a/01_grundlagen/unterricht/tag10/07_local-scoping-iife.html b/01_grundlagen/unterricht/tag10/07_local-scoping-iife.html deleted file mode 100644 index 7d64024..0000000 --- a/01_grundlagen/unterricht/tag10/07_local-scoping-iife.html +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - "local scoping" mit IIFE (Immediately invoked function expression) - - - - - - -
-
-

"local scoping" mit IIFE (Immediately invoked function expression)

-
-
-
-
-
- -
-
- - - - - - - - - - - diff --git a/01_grundlagen/unterricht/tag10/08_prefer-const.html b/01_grundlagen/unterricht/tag10/08_prefer-const.html deleted file mode 100644 index f42e112..0000000 --- a/01_grundlagen/unterricht/tag10/08_prefer-const.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - "Prefer-const" Programmierrichtlinie (AirBnb | Google) - - - -
-
-

"Prefer-const" Programmierrichtlinie (AirBnb | Google)

-
-
- - - diff --git a/01_grundlagen/unterricht/tag10/09_schleifen/01_for-statement.html b/01_grundlagen/unterricht/tag10/09_schleifen/01_for-statement.html deleted file mode 100644 index 750e8e1..0000000 --- a/01_grundlagen/unterricht/tag10/09_schleifen/01_for-statement.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - JS for-statement (for...Schleife) - - - -
-
-

JS for-statement (for...Schleife)

-

- for-statement - - Die for Anweisung beschreibt eine Schleife mit drei optionalen Ausdrücken und einer oder - mehreren Anweisungen. -

-
-
- - - diff --git a/01_grundlagen/unterricht/tag10/09_schleifen/02_for-of-statement.html b/01_grundlagen/unterricht/tag10/09_schleifen/02_for-of-statement.html deleted file mode 100644 index b346bdb..0000000 --- a/01_grundlagen/unterricht/tag10/09_schleifen/02_for-of-statement.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - JS for- of statement (for... of Schleife) - - - -
-
-

JS - For of Statement (for ... of Schleife)

-

- for...of statement - - Mit dem for...of statement können sogenannte iterable objects durchlaufen werden (Array, - Map, Set, das "arguments" Objekt und weitere eingeschlossen), wobei auf jeden gefundenen Wert eigene - Statements ausgeführt werden können. -

-
-
- - - diff --git a/01_grundlagen/unterricht/tag10/09_schleifen/03_for-in-statement.html b/01_grundlagen/unterricht/tag10/09_schleifen/03_for-in-statement.html deleted file mode 100644 index 69d0fe9..0000000 --- a/01_grundlagen/unterricht/tag10/09_schleifen/03_for-in-statement.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - JS for- of statement (for... in Schleife) - - - -
-
-

JS - For in Statement (for ... in Schleife)

-

- - for...in statement - - - iteriert über alle zählbaren String-Eigenschaften eines Objekts (ignoriert Eigenschaften, die durch Symbole - gekennzeichnet sind), einschließlich geerbter zählbarer Eigenschaften. -

-
-
- - - diff --git a/01_grundlagen/unterricht/tag10/09_schleifen/04_while-statement.html b/01_grundlagen/unterricht/tag10/09_schleifen/04_while-statement.html deleted file mode 100644 index 9a04a27..0000000 --- a/01_grundlagen/unterricht/tag10/09_schleifen/04_while-statement.html +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - JS while-statement (while...Schleife) - - - -
-
-

JS while - (while - Schleife)

-

- while - Schleife - - Die while-Anweisung (Engl. statement) beschreibt eine Schleife, die solange durchlaufen - wird wie die Schleifenbedingung wahr (Engl. true) ergibt. Die Schleifenbedingung (Engl. condition) wird am - Anfang der Schleife ausgewertet. -

-
-
- - - diff --git a/01_grundlagen/unterricht/tag10/09_schleifen/05_do-while-statement.html b/01_grundlagen/unterricht/tag10/09_schleifen/05_do-while-statement.html deleted file mode 100644 index 55adc44..0000000 --- a/01_grundlagen/unterricht/tag10/09_schleifen/05_do-while-statement.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - JS while-statement (while...Schleife) - - - -
-
-

JS do...while - (do...while - Schleife)

- -

- do...while - Schleife - - - Die do...while-Anweisung (Engl. statement) beschreibt eine Schleife, die solange - durchlaufen wird wie die Schleifenbedingung wahr (Engl. true) ergibt. Die Schleifenbedingung (Engl. condition) - wird am Ende der Schleife ausgewertet. -

-
-
- - - diff --git a/01_grundlagen/unterricht/tag10/09_schleifen/schleifen-in-js.pdf b/01_grundlagen/unterricht/tag10/09_schleifen/schleifen-in-js.pdf deleted file mode 100644 index 1568f27..0000000 Binary files a/01_grundlagen/unterricht/tag10/09_schleifen/schleifen-in-js.pdf and /dev/null differ diff --git a/02_advanced/.vscode/extensions.json b/02_advanced/.vscode/extensions.json deleted file mode 100644 index bb659e6..0000000 --- a/02_advanced/.vscode/extensions.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "recommendations": [ - "kamikillerto.vscode-colorize", - "sleistner.vscode-fileutils", - "bierner.github-markdown-preview", - "bradgashler.htmltagwrap", - "zhuangtongfa.material-theme", - "techer.open-in-browser", - "esbenp.prettier-vscode", - "pdconsec.vscode-print", - "vscode-icons-team.vscode-icons", - "formulahendry.auto-rename-tag", - "tomoki1207.pdf" - ] -} diff --git a/02_advanced/.vscode/marp-theme.css b/02_advanced/.vscode/marp-theme.css deleted file mode 100644 index 90ea8da..0000000 --- a/02_advanced/.vscode/marp-theme.css +++ /dev/null @@ -1,332 +0,0 @@ -/* @theme marp-theme */ - -@charset "UTF-8"; -/*! - * Marp Dracula theme. - * @theme marp-theme - * @author Daniel Nicolas Gisolfi & modified by Philippe Botzek - * - * @auto-scaling true - * @size 4:3 960px 720px - * @size 16:9 1280px 720px - */ - -@import url('https://fonts.googleapis.com/css?family=Lato:400,900|IBM+Plex+Sans:400,700'); - -:root { - --dracula-background: #282a36; - --dracula-current-line: #44475a; - --dracula-foreground: #f8f8f2; - --dracula-comment: #6272a4; - --dracula-cyan: #8be9fd; - --dracula-green: #50fa7b; - --dracula-orange: #ffb86c; - --dracula-pink: #ff79c6; - --dracula-purple: #bd93f9; - --dracula-red: #ff5555; - --dracula-yellow: #f1fa8c; -} - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: var(--dracula-background); -} - -/* Dracula Foreground */ -.hljs, -.hljs-subst, -.hljs-typing, -.hljs-variable, -.hljs-template-variable { - color: var(--dracula-foreground); -} - -/* Dracula Comment */ -.hljs-comment, -.hljs-quote, -.hljs-deletion { - color: var(--dracula-comment); -} - -/* Dracula Cyan */ -.hljs-meta .hljs-doctag, -.hljs-built_in, -.hljs-selector-tag, -.hljs-section, -.hljs-link, -.hljs-class { - color: var(--dracula-cyan); -} - -/* Dracula Green */ -.hljs-title { - color: var(--dracula-green); -} - -/* Dracula Orange */ -.hljs-params { - color: var(--dracula-orange); -} - -/* Dracula Pink */ -.hljs-keyword { - color: var(--dracula-pink); -} - -/* Dracula Purple */ -.hljs-literal, -.hljs-number { - color: var(--dracula-purple); -} - -/* Dracula Red */ -.hljs-regexp { - color: var(--dracula-red); -} - -/* Dracula Yellow */ -.hljs-string, -.hljs-name, -.hljs-type, -.hljs-attr, -.hljs-symbol, -.hljs-bullet, -.hljs-addition, -.hljs-template-tag { - color: var(--dracula-yellow); -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-literal, -.hljs-title, -.hljs-section, -.hljs-doctag, -.hljs-type, -.hljs-name, -.hljs-strong { - font-weight: bold; -} - -.hljs-params, -.hljs-emphasis { - font-style: italic; -} - -svg[data-marp-fitting='svg'] { - max-height: 580px; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 0.5em 0 0 0; - color: var(--dracula-pink); -} -h1 strong, -h2 strong, -h3 strong, -h4 strong, -h5 strong, -h6 strong { - font-weight: inherit; -} - -h1 { - font-size: 1.8em; -} - -h2 { - font-size: 1.5em; -} - -h3 { - font-size: 1.3em; -} - -h4 { - font-size: 1.1em; -} - -h5 { - font-size: 1em; -} - -h6 { - font-size: 0.9em; -} - -p, -blockquote { - margin: 1em 0 0 0; -} - -ul > li, -ol > li { - margin: 0.3em 0 0 0; - color: var(--dracula-cyan); -} -ul > li > p, -ol > li > p { - margin: 0.6em 0 0 0; -} - -code { - display: inline-block; - font-family: 'IBM Plex Mono', monospace; - font-size: 0.8em; - letter-spacing: 0; - margin: -0.1em 0.15em; - padding: 0.1em 0.2em; - vertical-align: baseline; - color: var(--dracula-green); -} - -pre { - display: block; - margin: 1em 0 0 0; - min-height: 1em; - overflow: visible; -} -pre code { - box-sizing: border-box; - margin: 0; - min-width: 100%; - padding: 0.5em; - font-size: 0.7em; -} -pre code svg[data-marp-fitting='svg'] { - max-height: calc(580px - 1em); -} - -blockquote { - margin: 1em 0 0 0; - padding: 0 1em; - position: relative; - color: var(--dracula-orange); -} -blockquote::after, -blockquote::before { - content: '“'; - display: block; - font-family: 'Times New Roman', serif; - font-weight: bold; - position: absolute; - color: var(--dracula-green); -} -blockquote::before { - top: 0; - left: 0; -} -blockquote::after { - right: 0; - bottom: 0; - transform: rotate(180deg); -} -blockquote > *:first-child { - margin-top: 0; -} - -mark { - background: transparent; -} - -table { - border-spacing: 0; - border-collapse: collapse; - margin: 1em 0 0 0; -} -table th, -table td { - padding: 0.2em 0.4em; - border-width: 1px; - border-style: solid; -} - -section { - font-size: 35px; - font-family: 'IBM Plex Sans'; - line-height: 1.35; - letter-spacing: 1.25px; - padding: 70px; - color: var(--dracula-foreground); - background-color: var(--dracula-background); -} -section > *:first-child, -section > header:first-child + * { - margin-top: 0; -} -section a, -section mark { - color: var(--dracula-red); -} -section code { - background: var(--dracula-current-line); - color: var(--dracula-current-green); -} -section h1 strong, -section h2 strong, -section h3 strong, -section h4 strong, -section h5 strong, -section h6 strong { - color: var(--dracula-current-line); -} -section pre > code { - background: var(--dracula-current-line); -} -section header, -section footer, -section section::after, -section blockquote::before, -section blockquote::after { - color: var(--dracula-comment); -} -section table th, -section table td { - border-color: var(--dracula-current-line); -} -section table thead th { - background: var(--dracula-current-line); - color: var(--dracula-yellow); -} -section table tbody > tr:nth-child(even) td, -section table tbody > tr:nth-child(even) th { - background: var(--dracula-current-line); -} - -header, -footer, -section::after { - box-sizing: border-box; - font-size: 66%; - height: 70px; - line-height: 50px; - overflow: hidden; - padding: 10px 25px; - position: absolute; - color: var(--dracula-comment); -} - -header { - left: 0; - right: 0; - top: 0; -} - -footer { - left: 0; - right: 0; - bottom: 0; -} - -section::after { - right: 0; - bottom: 0; - font-size: 80%; -} diff --git a/02_advanced/.vscode/settings.json b/02_advanced/.vscode/settings.json deleted file mode 100644 index 3fa021c..0000000 --- a/02_advanced/.vscode/settings.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "workbench.iconTheme": "vscode-icons", - "workbench.colorTheme": "One Dark Pro", - "prettier.printWidth": 120, - "prettier.singleQuote": true, - "editor.hover.enabled": "on", - "editor.wordWrap": "on", - "explorer.confirmDelete": false, - "explorer.confirmDragAndDrop": false, - "editor.quickSuggestionsDelay": 600, - "editor.tabSize": 2, - "editor.formatOnSave": true, - "emmet.includeLanguages": { - "javascript": "javascriptreact", - "ejs": "html" - }, - "html.format.unformatted": "wbr,%", - "files.associations": { - "*.ejs": "html" - }, - "editor.fontFamily": "'MesloLGS NF', Hack, Consolas, 'Courier New', monospace", - "oneDarkPro.markdownStyle": false, - "explorer.compactFolders": false, - "workbench.editor.labelFormat": "short", - "editor.hover.delay": 800, - "editor.bracketPairColorization.enabled": true, - "editor.guides.bracketPairs": "active", - "markdown.marp.themes": ["./.vscode/marp-theme.css"], - "markdown-preview-github-styles.colorTheme": "light" -} diff --git a/02_advanced/.vscode/snippets.code-snippets b/02_advanced/.vscode/snippets.code-snippets deleted file mode 100644 index 259f93d..0000000 --- a/02_advanced/.vscode/snippets.code-snippets +++ /dev/null @@ -1,73 +0,0 @@ -{ - "Output HTML Element": { - "scope": "html", - "prefix": "output", - "body": ["
"], - "description": "generate a div Element with output alert and alert secondary class" - }, - "Bootstrap html": { - "scope": "html", - "prefix": "!bs", - "body": [ - "", - "", - "\t", - "\t\t", - "\t\t", - "\t\t$0", - "\t\t", - "\t", - "\t", - "\t\t
", - "\t\t\t
", - "\t\t\t\t

$0

", - "\t\t\t
", - "\t\t
", - "\t\t", - "\t", - "" - ], - "description": "Generate HTML with Bootstrap CDN and script-tag" - }, - "$ und $$ helper function": { - "scope": "javascript,typescript", - "prefix": "$$$", - "body": [ - "const $ = (qs) => document.querySelector(qs);", - "const $$ = (qs) => Array.from(document.querySelectorAll(qs));" - ], - "description": "$ and $$ shorthand helper function" - }, - - "JavaScript Dateivorlage": { - "scope": "javascript,typescript", - "prefix": "vjs", - "body": [ - "'use strict';", - "", - "(() => {", - "", - "\t// === DOM & VARS =======", - "\tconst DOM = {};", - "", - "\t// === INIT =============", - "\tconst init = () => {", - "", - "\t}", - "", - "\t// === EVENTHANDLER =====", - "", - "\t// === XHR/FETCH ========", - "", - "\t// === FUNCTIONS ========", - "", - "\tinit();", - "", - "})();" - ], - "description": "JavaScript Dateivorlage" - } -} diff --git a/02_advanced/MATERIAL/advanced-js/lesson_01/examples/names_params.js b/02_advanced/MATERIAL/advanced-js/lesson_01/examples/names_params.js deleted file mode 100644 index e11c920..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_01/examples/names_params.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -const foo = ({ a = 1, b = 2 }) => `a: ${a}, b: ${b}`; - -console.log(foo({ a: 7 })); // => a: 7, b: 2 -console.log(foo({ b: 7 })); // => a: 1, b: 7 -console.log(foo({ a: 7, b: 8 })); // => a: 7, b: 8 diff --git a/02_advanced/MATERIAL/advanced-js/lesson_01/examples/prod_csv.js b/02_advanced/MATERIAL/advanced-js/lesson_01/examples/prod_csv.js deleted file mode 100644 index 54a1c98..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_01/examples/prod_csv.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict'; - -const productsFromCSV = (csv) => - csv - .split('\n') - .slice(1) - .map((str) => str.trim()); - -const productsCSV = `name, category, price - Klingon Letter Opener, Office Warfare, 19.99 - Backpack of Holding, Travel, 29.99 - Tardis Alarmclock, Merchandise, 15.99`; - -const products = productsFromCSV(productsCSV); -console.log(products); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_01/examples/prod_csv_dest.js b/02_advanced/MATERIAL/advanced-js/lesson_01/examples/prod_csv_dest.js deleted file mode 100644 index e34db47..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_01/examples/prod_csv_dest.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict'; - -const productFromCSV = (productString) => { - const [name, category, price] = productString.split(', '); - return { - name: name, - category: category, - price: price, - }; -}; - -const product = productFromCSV('Backpack of Holding, Travel, 29.99'); -console.dir(product); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_01/examples/prod_csv_object.js b/02_advanced/MATERIAL/advanced-js/lesson_01/examples/prod_csv_object.js deleted file mode 100644 index fb59358..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_01/examples/prod_csv_object.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict'; - -const productFromCSV = (productString) => { - const productArray = productString.split(', '); - - const name = productArray[0]; - const category = productArray[1]; - const price = productArray[2]; - - return { - name: name, - category: category, - price: price, - }; -}; - -const product = productFromCSV('Backpack of Holding, Travel, 29.99'); -console.dir(product); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_01/examples/prod_csv_params.js b/02_advanced/MATERIAL/advanced-js/lesson_01/examples/prod_csv_params.js deleted file mode 100644 index 28f7334..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_01/examples/prod_csv_params.js +++ /dev/null @@ -1,25 +0,0 @@ -'use strict'; - -const trim = (s) => s.match(/\W*(.+)\W*/)[1]; - -const productFromArray = ([name, category, price]) => ({ - name, - category, - price, -}); - -const productsFromCSV = (csv) => - csv - .split('\n') - .slice(1) - .map(trim) - .map((s) => s.split(', ')) - .map(productFromArray); - -const productsCSV = `name, category, price - Klingon Letter Opener, Office Warfare, 19.99 - Backpack of Holding, Travel, 29.99 - Tardis Alarmclock, Merchandise, 15.99`; - -const products = productsFromCSV(productsCSV); -console.log(products); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_01/examples/prod_csv_trim.js b/02_advanced/MATERIAL/advanced-js/lesson_01/examples/prod_csv_trim.js deleted file mode 100644 index abd7f26..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_01/examples/prod_csv_trim.js +++ /dev/null @@ -1,23 +0,0 @@ -'use strict'; - -const trim = (s) => s.match(/\W*(.+)\W*/)[1]; - -const productFromCSV = (productString) => { - const [name, category, price] = productString.split(', '); - return { - name, - category, - price, - }; -}; - -const productsFromCSV = (csv) => - csv.split('\n').slice(1).map(trim).map(productFromCSV); - -const productsCSV = `name, category, price - Klingon Letter Opener, Office Warfare, 19.99 - Backpack of Holding, Travel, 29.99 - Tardis Alarmclock, Merchandise, 15.99`; - -const products = productsFromCSV(productsCSV); -console.log(products); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_01/examples/prod_obj_dest.js b/02_advanced/MATERIAL/advanced-js/lesson_01/examples/prod_obj_dest.js deleted file mode 100644 index 6a1489a..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_01/examples/prod_obj_dest.js +++ /dev/null @@ -1,12 +0,0 @@ -'use strict'; - -const formatProduct = ({ name, price }) => - `* ${name} - buy now for only $${price}`; - -const product = { - name: 'Klingon Letter Opener', - category: 'Office Warfare', - price: '19.99', -}; - -console.log(formatProduct(product)); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_01/solutions/distance/index.js b/02_advanced/MATERIAL/advanced-js/lesson_01/solutions/distance/index.js deleted file mode 100644 index eedc0e2..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_01/solutions/distance/index.js +++ /dev/null @@ -1,8 +0,0 @@ -'use strict'; - -const distance = ( - { x: xOrigin, y: yOrigin }, - { x: xDestination, y: yDestination } -) => Math.sqrt((yDestination - yOrigin) ** 2 + (xDestination - xOrigin) ** 2); - -console.log(distance({ x: 1, y: 1 }, { x: 5, y: 1 })); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_01/solutions/transformed_name/index.js b/02_advanced/MATERIAL/advanced-js/lesson_01/solutions/transformed_name/index.js deleted file mode 100644 index de83190..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_01/solutions/transformed_name/index.js +++ /dev/null @@ -1,6 +0,0 @@ -'use strict'; - -const logTransformedName = ({ firstName, lastName }) => - console.log(`${lastName}, ${firstName.charAt(0)}.`); - -logTransformedName({ firstName: 'Ladislaus', lastName: 'Jones' }); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_02/examples/factorial.js b/02_advanced/MATERIAL/advanced-js/lesson_02/examples/factorial.js deleted file mode 100644 index c3f11bc..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_02/examples/factorial.js +++ /dev/null @@ -1,13 +0,0 @@ -function factorial(n) { - // Base case: if n is 0, return 1 - if (n === 0) { - return 1; - } - // Recursive case: n * factorial of (n - 1) - return n * factorial(n - 1); -} - -// Test cases -console.log(factorial(5)); // => 120 -console.log(factorial(3)); // => 6 -console.log(factorial(0)); // => 1 diff --git a/02_advanced/MATERIAL/advanced-js/lesson_02/examples/fibonacci.js b/02_advanced/MATERIAL/advanced-js/lesson_02/examples/fibonacci.js deleted file mode 100644 index b533f92..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_02/examples/fibonacci.js +++ /dev/null @@ -1,23 +0,0 @@ -function fibonacci(n) { - // Base cases - if (n === 0) { - return 0; - } - - if (n === 1) { - return 1; - } - - // Recursive case - return fibonacci(n - 1) + fibonacci(n - 2); -} - -// Test cases -console.log(fibonacci(0)); // => 0 -console.log(fibonacci(1)); // => 1 -console.log(fibonacci(2)); // => 1 -console.log(fibonacci(3)); // => 2 -console.log(fibonacci(4)); // => 3 -console.log(fibonacci(5)); // => 5 -console.log(fibonacci(6)); // => 8 -console.log(fibonacci(10)); // => 55 diff --git a/02_advanced/MATERIAL/advanced-js/lesson_02/examples/fibonacciMemo.js b/02_advanced/MATERIAL/advanced-js/lesson_02/examples/fibonacciMemo.js deleted file mode 100644 index 536cfaf..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_02/examples/fibonacciMemo.js +++ /dev/null @@ -1,17 +0,0 @@ -function fibonacciMemo(n, memo = {}) { - // Base Cases - if (n === 0) return 0; - if (n === 1) return 1; - - // Test if value already calculated - if (memo[n]) { - return memo[n]; - } - - // Recursive Case with Memoization - memo[n] = fibonacciMemo(n - 1, memo) + fibonacciMemo(n - 2, memo); - return memo[n]; -} - -// Test Cases -console.log(fibonacciMemo(50)); // => 12586269025 diff --git a/02_advanced/MATERIAL/advanced-js/lesson_02/examples/sumArray.js b/02_advanced/MATERIAL/advanced-js/lesson_02/examples/sumArray.js deleted file mode 100644 index 87013cd..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_02/examples/sumArray.js +++ /dev/null @@ -1,13 +0,0 @@ -function sumArray(arr) { - // Base case: when the array is empty, return 0 - if (arr.length === 0) { - return 0; - } - // Recursive case: add the first element to the sum of the rest of the array - return arr[0] + sumArray(arr.slice(1)); -} - -// Test cases -console.log(sumArray([1, 2, 3, 4, 5])); // => 15 -console.log(sumArray([10, -2, 33, 47])); // => 88 -console.log(sumArray([])); // => 0 diff --git a/02_advanced/MATERIAL/advanced-js/lesson_02/examples/sumArrayIndex.js b/02_advanced/MATERIAL/advanced-js/lesson_02/examples/sumArrayIndex.js deleted file mode 100644 index fe1c852..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_02/examples/sumArrayIndex.js +++ /dev/null @@ -1,13 +0,0 @@ -function sumArrayIndex(arr, index = 0) { - // Base case: when index is greater than or equal to the length of the array return 0 - if (index >= arr.length) { - return 0; - } - // Recursive case: add the current element to the sum of the rest of the array - return arr[index] + sumArrayIndex(arr, index + 1); -} - -// Test cases -console.log(sumArrayIndex([1, 2, 3, 4, 5])); // => 15 -console.log(sumArrayIndex([10, -2, 33, 47])); // => 88 -console.log(sumArrayIndex([])); // => 0 diff --git a/02_advanced/MATERIAL/advanced-js/lesson_02/solutions/combinations/index.js b/02_advanced/MATERIAL/advanced-js/lesson_02/solutions/combinations/index.js deleted file mode 100644 index 513928d..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_02/solutions/combinations/index.js +++ /dev/null @@ -1,19 +0,0 @@ -function combinations(n, k) { - // Base Cases - if (k === 0 || k === n) { - return 1; - } - // If k is greater than n, there are no combinations - if (k > n) { - return 0; - } - // Recursive Cases - return combinations(n - 1, k - 1) + combinations(n - 1, k); -} - -// Test Cases -console.log(combinations(5, 2)); // => 10 -console.log(combinations(6, 3)); // => 20 -console.log(combinations(4, 0)); // => 1 -console.log(combinations(4, 4)); // => 1 -console.log(combinations(5, 6)); // => 0 diff --git a/02_advanced/MATERIAL/advanced-js/lesson_02/solutions/deepestLevel/index.js b/02_advanced/MATERIAL/advanced-js/lesson_02/solutions/deepestLevel/index.js deleted file mode 100644 index 7cd1551..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_02/solutions/deepestLevel/index.js +++ /dev/null @@ -1,27 +0,0 @@ -function findDeepestLevel(arr, currentLevel = 1) { - // Base case: when the array is empty, return the current level - if (arr.length === 0) { - return currentLevel; - } - - let maxLevel = currentLevel; - - for (let i = 0; i < arr.length; i++) { - if (Array.isArray(arr[i])) { - // Recursive case: if the element is an array, call the function recursively - const depth = findDeepestLevel(arr[i], currentLevel + 1); - if (depth > maxLevel) { - maxLevel = depth; - } - } - } - - return maxLevel; -} - -// Test cases -console.log(findDeepestLevel([1, [2, [3, [4]], 5]])); // => 4 -console.log(findDeepestLevel([1, 2, 3, 4, 5])); // => 1 -console.log(findDeepestLevel([])); // => 1 -console.log(findDeepestLevel([1, [2], [3, [4, [5]]]])); // => 4 -console.log(findDeepestLevel([1, [2, [3]], [4, [5, [6]]]])); // => 4 diff --git a/02_advanced/MATERIAL/advanced-js/lesson_02/solutions/findMax/index.js b/02_advanced/MATERIAL/advanced-js/lesson_02/solutions/findMax/index.js deleted file mode 100644 index fa4a584..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_02/solutions/findMax/index.js +++ /dev/null @@ -1,19 +0,0 @@ -function findMax(arr) { - // Base case: empty array - if (arr.length === 0) { - return null; - } - // Base case: array with one element - if (arr.length === 1) { - return arr[0]; - } - // Recursive case: return the maximum of the first element and the maximum of the rest of the array - const subMax = findMax(arr.slice(1)); - return arr[0] > subMax ? arr[0] : subMax; -} - -// Test cases -console.log(findMax([1, 5, 3, 9, 2])); // => 9 -console.log(findMax([-10, -20, -3, -4])); // => -3 -console.log(findMax([42])); // => 42 -console.log(findMax([])); // => null diff --git a/02_advanced/MATERIAL/advanced-js/lesson_02/solutions/reverseString/index.js b/02_advanced/MATERIAL/advanced-js/lesson_02/solutions/reverseString/index.js deleted file mode 100644 index 128e926..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_02/solutions/reverseString/index.js +++ /dev/null @@ -1,14 +0,0 @@ -function reverseString(str) { - // Base case: if the string has only one character, return it - if (str.length <= 1) { - return str; - } - // Recursive case: return the last character of the string and call the function with the rest of the string - return reverseString(str.slice(1)) + str[0]; -} - -// Test cases -console.log(reverseString('hello')); // => "olleh" -console.log(reverseString('Recursion')); // => "noisruceR" -console.log(reverseString('')); // => "" -console.log(reverseString('A')); // => "A" diff --git a/02_advanced/MATERIAL/advanced-js/lesson_02/solutions/sumNestedArray/index.js b/02_advanced/MATERIAL/advanced-js/lesson_02/solutions/sumNestedArray/index.js deleted file mode 100644 index 34a326a..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_02/solutions/sumNestedArray/index.js +++ /dev/null @@ -1,26 +0,0 @@ -function sumNestedArray(arr) { - // Base case: when the array is empty, return 0 - if (arr.length === 0) { - return 0; - } - - let sum = 0; - - for (let element of arr) { - if (Array.isArray(element)) { - // Recursive case: if the element is an array, sum its elements - sum += sumNestedArray(element); - } else if (typeof element === 'number') { - sum += element; - } - } - - return sum; -} - -// Test cases -console.log(sumNestedArray([1, [2, [3, 4], 5], 6])); // => 21 -console.log(sumNestedArray([[[[1]]], 2, [3, [4, [5]]]])); // => 15 -console.log(sumNestedArray([])); // => 0 -console.log(sumNestedArray([10, [20, [30, [40]]]])); // => 100 -console.log(sumNestedArray([1, 'a', [2, 'b', [3, 4]], 5])); // => 15 (ignores non-numbers) diff --git a/02_advanced/MATERIAL/advanced-js/lesson_02/solutions/sumRecursive/index.js b/02_advanced/MATERIAL/advanced-js/lesson_02/solutions/sumRecursive/index.js deleted file mode 100644 index 33b0c6e..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_02/solutions/sumRecursive/index.js +++ /dev/null @@ -1,12 +0,0 @@ -function sumRecursive(n) { - if (n === 0) { - return 0; - } - - return n + sumRecursive(n - 1); -} - -// Test Cases -console.log(sumRecursive(5)); // => 15 (5 + 4 + 3 + 2 + 1) -console.log(sumRecursive(10)); // => 55 (10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1) -console.log(sumRecursive(0)); // => 0 diff --git a/02_advanced/MATERIAL/advanced-js/lesson_03/examples/promise_4.js b/02_advanced/MATERIAL/advanced-js/lesson_03/examples/promise_4.js deleted file mode 100644 index a283095..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_03/examples/promise_4.js +++ /dev/null @@ -1,15 +0,0 @@ -const tryWork = (resolve, reject) => { - const ergebnis = 21 * 2; - if (Math.random() < 0.5) { - resolve(ergebnis); - } else { - reject('nope'); - } -}; - -const p4 = new Promise(tryWork); - -p4.then( - (result) => console.log('OK: ' + result), - (reason) => console.log('KO: ' + reason) -); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_03/examples/promise_stack_trace.js b/02_advanced/MATERIAL/advanced-js/lesson_03/examples/promise_stack_trace.js deleted file mode 100644 index 1eece7b..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_03/examples/promise_stack_trace.js +++ /dev/null @@ -1,17 +0,0 @@ -const tryWork = (resolve, reject) => { - const ergebnis = 21 * 2; - if (Math.random() < 0.5) { - resolve(ergebnis); - } else { - reject(new Error('nope')); - } -}; - -new Promise(tryWork) - .then(() => new Promise(tryWork)) - .then(() => new Promise(tryWork)) - .then((result) => console.log('OK: ' + result)) - .catch((err) => { - console.log('KO: ' + err.message); - console.log(err.stack); - }); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_03/examples/promise_wait.js b/02_advanced/MATERIAL/advanced-js/lesson_03/examples/promise_wait.js deleted file mode 100644 index 1976a53..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_03/examples/promise_wait.js +++ /dev/null @@ -1,12 +0,0 @@ -const wait = () => new Promise((resolve) => setTimeout(resolve, 1000)); - -wait() - .then(() => { - console.log('The'); - return wait(); - }) - .then(() => { - console.log('pyramid'); - return wait(); - }); -// etc... diff --git a/02_advanced/MATERIAL/advanced-js/lesson_03/examples/pyramid_of_doom.js b/02_advanced/MATERIAL/advanced-js/lesson_03/examples/pyramid_of_doom.js deleted file mode 100644 index 61c36f5..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_03/examples/pyramid_of_doom.js +++ /dev/null @@ -1,26 +0,0 @@ -// print a phrase, a word at a time: -// the pyramid of doom appears - -setTimeout(() => { - console.log('The'); - - setTimeout(() => { - console.log('pyramid'); - - setTimeout(() => { - console.log('of'); - - setTimeout(() => { - console.log('doom'); - - setTimeout(() => { - console.log('keeps'); - - setTimeout(() => { - console.log('growing.'); - }, 1000); - }, 1000); - }, 1000); - }, 1000); - }, 1000); -}, 1000); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_03/examples/pyramid_of_doom_avoided.js b/02_advanced/MATERIAL/advanced-js/lesson_03/examples/pyramid_of_doom_avoided.js deleted file mode 100644 index f72d23b..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_03/examples/pyramid_of_doom_avoided.js +++ /dev/null @@ -1,17 +0,0 @@ -// print a phrase, a word at a time: -// use promises to avoid the pyramid of doom - -const printDelay = (time, str) => - new Promise((resolve) => - setTimeout(() => { - console.log(str); - resolve(); - }, time) - ); - -printDelay(1000, 'The') - .then(() => printDelay(1000, 'pyramid')) - .then(() => printDelay(1000, 'of')) - .then(() => printDelay(1000, 'doom')) - .then(() => printDelay(1000, 'is')) - .then(() => printDelay(1000, 'defeated.')); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_03/examples/read_file_async.js b/02_advanced/MATERIAL/advanced-js/lesson_03/examples/read_file_async.js deleted file mode 100644 index eee6b85..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_03/examples/read_file_async.js +++ /dev/null @@ -1,9 +0,0 @@ -const fs = require('fs'); - -fs.readFile('data/file.txt', 'UTF8', (error, content) => { - if (error) { - console.log('could not read file'); - } else { - console.log(content); - } -}); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_03/examples/read_file_promise.js b/02_advanced/MATERIAL/advanced-js/lesson_03/examples/read_file_promise.js deleted file mode 100644 index babb5e8..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_03/examples/read_file_promise.js +++ /dev/null @@ -1,17 +0,0 @@ -const fs = require('fs'); - -const getFileContent = (path, encoding = 'utf-8') => { - return new Promise((resolve, reject) => { - fs.readFile(path, encoding, (error, data) => { - if (error) { - reject(error); - } else { - resolve(data); - } - }); - }); -}; - -getFileContent('data/file.txt') - .then((data) => console.log(data)) - .catch((err) => console.error(`Something went wrong: ${err}`)); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_03/examples/read_file_promises.js b/02_advanced/MATERIAL/advanced-js/lesson_03/examples/read_file_promises.js deleted file mode 100644 index 6f10bc7..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_03/examples/read_file_promises.js +++ /dev/null @@ -1,9 +0,0 @@ -const fs = require('fs'); - -const getFileContent = (path, encoding = 'utf-8') => { - return fs.promises.readFile(path, encoding); -}; - -getFileContent('data/file.txt') - .then((data) => console.log(data)) - .catch((err) => console.error(`Something went wrong: ${err}`)); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_03/examples/read_file_util_promisify.js b/02_advanced/MATERIAL/advanced-js/lesson_03/examples/read_file_util_promisify.js deleted file mode 100644 index 4140c18..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_03/examples/read_file_util_promisify.js +++ /dev/null @@ -1,8 +0,0 @@ -const fs = require('fs'); -const util = require('util'); - -const getFileContent = util.promisify(fs.readFile); - -getFileContent('data/file.txt', 'UTF8') - .then((data) => console.log(data)) - .catch((err) => console.error(`Something went wrong: ${err}`)); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/dns_lookup/solution_1.js b/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/dns_lookup/solution_1.js deleted file mode 100644 index 74387dd..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/dns_lookup/solution_1.js +++ /dev/null @@ -1,29 +0,0 @@ -const dns = require('dns'); - -const IP_V = 4; // we use IP protocol version 4 -const URL = 'de.webmasters-europe.org'; - -// Solution 1: Detailed variant with Promise object -const getIp = (url, ip) => { - return new Promise((resolve, reject) => { - dns.lookup(url, ip, (error, data) => { - if (error) { - reject(error); - } else { - resolve({ address: data, family: ip }); - } - }); - }); -}; - -getIp(URL, IP_V) - .then((data) => console.log(`IP adress = ${data.address}`)) - .catch((err) => console.error(err)); - -// dns.lookup(URL, IP_V, (error, address) => { -// if (error) { -// console.log('error: could not lookup host'); -// } else { -// console.log('IP address = ' + address); -// } -// }); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/dns_lookup/solution_2.js b/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/dns_lookup/solution_2.js deleted file mode 100644 index 2133e5f..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/dns_lookup/solution_2.js +++ /dev/null @@ -1,21 +0,0 @@ -const dns = require('dns'); - -const IP_V = 4; // we use IP protocol version 4 -const URL = 'de.webmasters-europe.org'; - -// Solution 2: Variant with promises subobject -const getIpPromises = (url, ip) => { - return dns.promises.lookup(url, ip); -}; - -getIpPromises(URL, IP_V) - .then((data) => console.log(`IP adress = ${data.address}`)) - .catch((err) => console.error(err)); - -// dns.lookup(URL, IP_V, (error, address) => { -// if (error) { -// console.log('error: could not lookup host'); -// } else { -// console.log('IP address = ' + address); -// } -// }); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/dns_lookup/solution_3.js b/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/dns_lookup/solution_3.js deleted file mode 100644 index b086b54..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/dns_lookup/solution_3.js +++ /dev/null @@ -1,20 +0,0 @@ -const dns = require('dns'); -const util = require('util'); - -const IP_V = 4; // we use IP protocol version 4 -const URL = 'de.webmasters-europe.org'; - -// Solution 3: Variant with util module -const getIpPromisify = util.promisify(dns.lookup); - -getIpPromisify(URL, IP_V) - .then((data) => console.log(`IP adress = ${data.address}`)) - .catch((err) => console.error(err)); - -// dns.lookup(URL, IP_V, (error, address) => { -// if (error) { -// console.log('error: could not lookup host'); -// } else { -// console.log('IP address = ' + address); -// } -// }); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/getFileContent/data/file_1.txt b/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/getFileContent/data/file_1.txt deleted file mode 100644 index 62d7e98..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/getFileContent/data/file_1.txt +++ /dev/null @@ -1 +0,0 @@ -This is the contents of file 01. \ No newline at end of file diff --git a/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/getFileContent/data/file_2.txt b/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/getFileContent/data/file_2.txt deleted file mode 100644 index 77e704a..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/getFileContent/data/file_2.txt +++ /dev/null @@ -1 +0,0 @@ -This is the contents of file 02. \ No newline at end of file diff --git a/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/getFileContent/data/file_3.txt b/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/getFileContent/data/file_3.txt deleted file mode 100644 index d1837d5..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/getFileContent/data/file_3.txt +++ /dev/null @@ -1 +0,0 @@ -This is the contents of file 03. \ No newline at end of file diff --git a/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/getFileContent/data/file_4.txt b/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/getFileContent/data/file_4.txt deleted file mode 100644 index 5eed5fe..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/getFileContent/data/file_4.txt +++ /dev/null @@ -1 +0,0 @@ -This is the contents of file 04. \ No newline at end of file diff --git a/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/getFileContent/data/file_5.txt b/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/getFileContent/data/file_5.txt deleted file mode 100644 index 1e63085..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/getFileContent/data/file_5.txt +++ /dev/null @@ -1 +0,0 @@ -This is the contents of file 05. \ No newline at end of file diff --git a/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/getFileContent/data/file_6.txt b/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/getFileContent/data/file_6.txt deleted file mode 100644 index 996b394..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/getFileContent/data/file_6.txt +++ /dev/null @@ -1 +0,0 @@ -This is the contents of file 06. \ No newline at end of file diff --git a/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/getFileContent/index.js b/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/getFileContent/index.js deleted file mode 100644 index e743cf2..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/getFileContent/index.js +++ /dev/null @@ -1,30 +0,0 @@ -const fs = require('fs'); - -const getFileContent = (name, encoding = 'UTF8') => { - return new Promise((resolve, reject) => { - fs.readFile(name, encoding, (error, content) => { - if (error) { - reject(`could not read file ${name}`); - } else { - resolve(content); - } - }); - }); -}; - -Promise.all([ - getFileContent('data/file_1.txt'), - getFileContent('data/file_2.txt'), - getFileContent('data/file_3.txt'), - getFileContent('data/file_4.txt'), - getFileContent('data/file_5.txt'), - getFileContent('data/file_6.txt'), -]) - .then((contents) => - contents.forEach((content) => { - console.log(content); - }) - ) - .catch((error) => { - console.log(error); - }); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/printWords/index.js b/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/printWords/index.js deleted file mode 100644 index c2a221c..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_03/solutions/printWords/index.js +++ /dev/null @@ -1,18 +0,0 @@ -// print a phrase, a word at a time: -// workaround to avoid the pyramid of doom - -const words = 'The pyramid of doom keeps growing.'; - -const printWords = (str = '', idx = 0) => { - const words = str.split(/\s/); - // Guard - if (idx >= words.length) return ''; - - console.log(words[idx]); - - setTimeout(() => { - printWords(str, ++idx); - }, 1000); -}; - -printWords(words); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_04/examples/chess.js b/02_advanced/MATERIAL/advanced-js/lesson_04/examples/chess.js deleted file mode 100644 index 6e553e1..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_04/examples/chess.js +++ /dev/null @@ -1,50 +0,0 @@ -'use strict'; - -const board2string = (board) => board.map((row) => row.join('')).join('\n'); - -const execMove = (board, move) => { - const originX = fieldToXPosition(originField(move)); - const originY = fieldToYPosition(originField(move)); - const targetX = fieldToXPosition(targetField(move)); - const targetY = fieldToYPosition(targetField(move)); - - board[targetY][targetX] = board[originY][originX]; - board[originY][originX] = emptyBoard()[originY][originX]; - return board; -}; - -const boardInStartPosition = () => [ - ['♜', '♞', '♝', '♛', '♚', '♝', '♞', '♜'], - ['♟', '♟', '♟', '♟', '♟', '♟', '♟', '♟'], - ['◻', '▦', '◻', '▦', '◻', '▦', '◻', '▦'], - ['▦', '◻', '▦', '◻', '▦', '◻', '▦', '◻'], - ['◻', '▦', '◻', '▦', '◻', '▦', '◻', '▦'], - ['▦', '◻', '▦', '◻', '▦', '◻', '▦', '◻'], - ['♙', '♙', '♙', '♙', '♙', '♙', '♙', '♙'], - ['♖', '♘', '♗', '♕', '♔', '♗', '♘', '♖'], -]; - -const emptyBoard = () => [ - ['◻', '▦', '◻', '▦', '◻', '▦', '◻', '▦'], - ['▦', '◻', '▦', '◻', '▦', '◻', '▦', '◻'], - ['◻', '▦', '◻', '▦', '◻', '▦', '◻', '▦'], - ['▦', '◻', '▦', '◻', '▦', '◻', '▦', '◻'], - ['◻', '▦', '◻', '▦', '◻', '▦', '◻', '▦'], - ['▦', '◻', '▦', '◻', '▦', '◻', '▦', '◻'], - ['◻', '▦', '◻', '▦', '◻', '▦', '◻', '▦'], - ['▦', '◻', '▦', '◻', '▦', '◻', '▦', '◻'], -]; - -const originField = (move) => move.substr(0, 2); -const targetField = (move) => move.substr(2); - -const fieldToXPosition = (field) => letterToChessIndex(field.charAt(0)); -const fieldToYPosition = (field) => numberToChessIndex(field.charAt(1)); -const letterToChessIndex = (letter) => 'abcdefgh'.indexOf(letter); -const numberToChessIndex = (num) => 8 - num; - -console.log(board2string(boardInStartPosition())); - -console.log('\n'); - -console.log(board2string(execMove(boardInStartPosition(), 'e2e4'))); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_04/examples/chess_exec.js b/02_advanced/MATERIAL/advanced-js/lesson_04/examples/chess_exec.js deleted file mode 100644 index 284cb05..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_04/examples/chess_exec.js +++ /dev/null @@ -1,56 +0,0 @@ -'use strict'; - -const board2string = (board) => board.map((row) => row.join('')).join('\n'); - -const execMoves = (moves) => moves.reduce(execMove, boardInStartPosition()); - -const execMove = (board, move) => { - const originX = fieldToXPosition(originField(move)); - const originY = fieldToYPosition(originField(move)); - const targetX = fieldToXPosition(targetField(move)); - const targetY = fieldToYPosition(targetField(move)); - - board[targetY][targetX] = board[originY][originX]; - board[originY][originX] = emptyBoard()[originY][originX]; - return board; -}; - -const boardInStartPosition = () => [ - ['♜', '♞', '♝', '♛', '♚', '♝', '♞', '♜'], - ['♟', '♟', '♟', '♟', '♟', '♟', '♟', '♟'], - ['◻', '▦', '◻', '▦', '◻', '▦', '◻', '▦'], - ['▦', '◻', '▦', '◻', '▦', '◻', '▦', '◻'], - ['◻', '▦', '◻', '▦', '◻', '▦', '◻', '▦'], - ['▦', '◻', '▦', '◻', '▦', '◻', '▦', '◻'], - ['♙', '♙', '♙', '♙', '♙', '♙', '♙', '♙'], - ['♖', '♘', '♗', '♕', '♔', '♗', '♘', '♖'], -]; - -const emptyBoard = () => [ - ['◻', '▦', '◻', '▦', '◻', '▦', '◻', '▦'], - ['▦', '◻', '▦', '◻', '▦', '◻', '▦', '◻'], - ['◻', '▦', '◻', '▦', '◻', '▦', '◻', '▦'], - ['▦', '◻', '▦', '◻', '▦', '◻', '▦', '◻'], - ['◻', '▦', '◻', '▦', '◻', '▦', '◻', '▦'], - ['▦', '◻', '▦', '◻', '▦', '◻', '▦', '◻'], - ['◻', '▦', '◻', '▦', '◻', '▦', '◻', '▦'], - ['▦', '◻', '▦', '◻', '▦', '◻', '▦', '◻'], -]; - -const originField = (move) => move.substr(0, 2); -const targetField = (move) => move.substr(2); - -const fieldToXPosition = (field) => letterToChessIndex(field.charAt(0)); -const fieldToYPosition = (field) => numberToChessIndex(field.charAt(1)); -const letterToChessIndex = (letter) => 'abcdefgh'.indexOf(letter); -const numberToChessIndex = (num) => 8 - num; - -console.log(board2string(boardInStartPosition())); - -console.log('\n'); - -console.log(board2string(execMove(boardInStartPosition(), 'e2e4'))); - -console.log('\n'); - -console.log(board2string(execMoves(['e2e4', 'e7e5', 'f2f4']))); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_04/examples/chess_final.js b/02_advanced/MATERIAL/advanced-js/lesson_04/examples/chess_final.js deleted file mode 100644 index 8280ec6..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_04/examples/chess_final.js +++ /dev/null @@ -1,55 +0,0 @@ -'use strict'; - -const board2string = (board) => board.map((row) => row.join('')).join('\n'); - -const positionHistoryForMoves = (moves) => - moves.map((move, i) => moves.slice(0, i + 1)).map(execMoves); - -const execMoves = (moves) => moves.reduce(execMove, boardInStartPosition()); - -const execMove = (board, move) => { - const originX = fieldToXPosition(originField(move)); - const originY = fieldToYPosition(originField(move)); - const targetX = fieldToXPosition(targetField(move)); - const targetY = fieldToYPosition(targetField(move)); - - board[targetY][targetX] = board[originY][originX]; - board[originY][originX] = emptyBoard()[originY][originX]; - return board; -}; - -const boardInStartPosition = () => [ - ['♜', '♞', '♝', '♛', '♚', '♝', '♞', '♜'], - ['♟', '♟', '♟', '♟', '♟', '♟', '♟', '♟'], - ['◻', '▦', '◻', '▦', '◻', '▦', '◻', '▦'], - ['▦', '◻', '▦', '◻', '▦', '◻', '▦', '◻'], - ['◻', '▦', '◻', '▦', '◻', '▦', '◻', '▦'], - ['▦', '◻', '▦', '◻', '▦', '◻', '▦', '◻'], - ['♙', '♙', '♙', '♙', '♙', '♙', '♙', '♙'], - ['♖', '♘', '♗', '♕', '♔', '♗', '♘', '♖'], -]; - -const emptyBoard = () => [ - ['◻', '▦', '◻', '▦', '◻', '▦', '◻', '▦'], - ['▦', '◻', '▦', '◻', '▦', '◻', '▦', '◻'], - ['◻', '▦', '◻', '▦', '◻', '▦', '◻', '▦'], - ['▦', '◻', '▦', '◻', '▦', '◻', '▦', '◻'], - ['◻', '▦', '◻', '▦', '◻', '▦', '◻', '▦'], - ['▦', '◻', '▦', '◻', '▦', '◻', '▦', '◻'], - ['◻', '▦', '◻', '▦', '◻', '▦', '◻', '▦'], - ['▦', '◻', '▦', '◻', '▦', '◻', '▦', '◻'], -]; - -const originField = (move) => move.substr(0, 2); -const targetField = (move) => move.substr(2); - -const fieldToXPosition = (field) => letterToChessIndex(field.charAt(0)); -const fieldToYPosition = (field) => numberToChessIndex(field.charAt(1)); -const letterToChessIndex = (letter) => 'abcdefgh'.indexOf(letter); -const numberToChessIndex = (num) => 8 - num; - -const history = positionHistoryForMoves(['e2e4', 'e7e5', 'f2f4']); - -console.log(history); - -history.forEach((position) => console.log(board2string(position), '\n')); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_04/examples/grades_table.js b/02_advanced/MATERIAL/advanced-js/lesson_04/examples/grades_table.js deleted file mode 100644 index 6427e39..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_04/examples/grades_table.js +++ /dev/null @@ -1,14 +0,0 @@ -const gradesTable = [ - ['Name', 'Mathematics', 'English', 'Biology'], - ['Anna', 85, 92, 78], - ['Ben', 90, 88, 84], - ['Clara', 76, 95, 89], -]; - -// Change Anna's math grade to 88 -gradesTable[1][1] = 88; - -// Add a new row for another student -gradesTable.push(['David', 82, 79, 91]); - -console.log(gradesTable); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_04/examples/inventory.js b/02_advanced/MATERIAL/advanced-js/lesson_04/examples/inventory.js deleted file mode 100644 index 4a93baf..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_04/examples/inventory.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict'; - -const inventory = [ - [ - // Category: Electronics - ['Shelf 1', 'Laptop', 10], - ['Shelf 2', 'Smartphone', 25], - ], - [ - // Category: Clothing - ['Shelf 1', 'T-Shirts', 50], - ['Shelf 2', 'Jeans', 30], - ], - [ - // Category: Groceries - ['Shelf 1', 'Milk', 100], - ['Shelf 2', 'Bread', 80], - ], -]; - -// Increase the number of laptops -inventory[0][0][2] += 5; // New quantity: 15 - -// Add a new shelf to a category -inventory[1].push(['Shelf 3', 'Pants', 20]); - -console.log(inventory); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_04/solutions/cocktails/index.js b/02_advanced/MATERIAL/advanced-js/lesson_04/solutions/cocktails/index.js deleted file mode 100644 index c1a2abd..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_04/solutions/cocktails/index.js +++ /dev/null @@ -1,50 +0,0 @@ -'use strict'; - -const isMixableWithMyIngredients = (cocktailRecipe) => - isMixableWith(cocktailRecipe, ingredientsFromMyBar); - -const isMixableWith = (cocktailRecipe, availableIngredients) => - cocktailRecipe.every((ingredientFromRecipe) => - hasIngredient(availableIngredients, ingredientFromRecipe) - ); - -const hasIngredient = (listOfIngredients, searchedIngredient) => - listOfIngredients.includes(searchedIngredient); - -const honoluluFlip = [ - 'Maracuja Juice', - 'Pineapple Juice', - 'Lemon Juice', - 'Grapefruit Juice', - 'Crushed Ice', -]; -const casualFriday = ['Vodka', 'Lime Juice', 'Apple Juice', 'Cucumber']; - -const pinkDolly = [ - 'Vodka', - 'Orange Juice', - 'Pineapple Juice', - 'Grenadine', - 'Cream', - 'Coco Syrup', -]; -const cocktailRecipes = [honoluluFlip, casualFriday, pinkDolly]; - -const ingredientsFromMyBar = [ - 'Pineapple', - 'Maracuja Juice', - 'Cream', - 'Grapefruit Juice', - 'Crushed Ice', - 'Milk', - 'Vodka', - 'Apple Juice', - 'Aperol', - 'Pineapple Juice', - 'Lime Juice', - 'Lemons', - 'Cucumber', -]; - -console.log(cocktailRecipes.find(isMixableWithMyIngredients)); -// => [ 'Vodka', 'Lime Juice', 'Apple Juice', 'Cucumber' ] diff --git a/02_advanced/MATERIAL/advanced-js/lesson_04/solutions/geoquiz_1/index.js b/02_advanced/MATERIAL/advanced-js/lesson_04/solutions/geoquiz_1/index.js deleted file mode 100644 index a1ee9b8..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_04/solutions/geoquiz_1/index.js +++ /dev/null @@ -1,20 +0,0 @@ -'use strict'; - -const countriesWithCapital = [ - ['UK', 'London'], - ['France', 'Paris'], - ['Germany', 'Berlin'], - ['Switzerland', 'Bern'], - ['Austria', 'Vienna'], - ['Russia', 'Moscow'], -]; - -const capitalOf = (country) => { - const capitalIndex = 1; - const countryIndex = 0; - return countriesWithCapital.find( - (countryWithCapital) => countryWithCapital[countryIndex] === country - )[capitalIndex]; -}; - -console.log(capitalOf('Switzerland')); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_04/solutions/geoquiz_2/index.js b/02_advanced/MATERIAL/advanced-js/lesson_04/solutions/geoquiz_2/index.js deleted file mode 100644 index 0b1b56b..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_04/solutions/geoquiz_2/index.js +++ /dev/null @@ -1,20 +0,0 @@ -'use strict'; - -const countriesWithCapital = [ - ['UK', 'London'], - ['France', 'Paris'], - ['Germany', 'Berlin'], - ['Switzerland', 'Bern'], - ['Austria', 'Vienna'], - ['Russia', 'Moscow'], -]; - -const countryForCapital = (capital) => { - const capitalIndex = 1; - const countryIndex = 0; - return countriesWithCapital.find( - (countryWithCapital) => countryWithCapital[capitalIndex] === capital - )[countryIndex]; -}; - -console.log(countryForCapital('Berlin')); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_04/solutions/grades_table/index.js b/02_advanced/MATERIAL/advanced-js/lesson_04/solutions/grades_table/index.js deleted file mode 100644 index 534d1e3..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_04/solutions/grades_table/index.js +++ /dev/null @@ -1,46 +0,0 @@ -'use strict'; - -const gradesTable = [ - ['Name', 'Mathematics', 'English', 'Biology', 'History'], - ['Anna', 85, 92, 78, 88], - ['Ben', 90, 88, 84, 79], - ['Clara', 76, 95, 89, 91], - ['David', 82, 79, 91, 85], -]; - -// Helper: Calculates average of an array of numbers -const getAverage = (numbers) => { - const sum = numbers.reduce((acc, curr) => acc + curr, 0); - const avg = sum / numbers.length; - return Number(avg.toFixed(2)); -}; - -// 1. Calculate average per student -const calculateAvgGrades = (table) => { - // We take the rows (excluding header), and map each row to a single average value - return table.slice(1).map((row) => { - const grades = row.slice(1); // Remove student name - return getAverage(grades); - }); -}; - -// 2. Calculate average per subject -const calculateAvgSubjects = (table) => { - const headers = table[0].slice(1); // Get subject names ['Mathematics', 'English', ...] - const rows = table.slice(1); // Get data rows - - // We map over the headers to create a result for each subject column - return headers.map((_, colIndex) => { - // For the current column, extract the value from every row - // Note: colIndex starts at 0, but in the row data, grades start at index 1 - const columnGrades = rows.map((row) => row[colIndex + 1]); - return getAverage(columnGrades); - }); -}; - -// Tests -console.log('Student Averages:', calculateAvgGrades(gradesTable)); -// Expected: [85.75, 85.25, 87.75, 84.25] - -console.log('Subject Averages:', calculateAvgSubjects(gradesTable)); -// Expected: [83.25, 88.50, 85.50, 85.75] diff --git a/02_advanced/MATERIAL/advanced-js/lesson_04/solutions/image_edit/index.js b/02_advanced/MATERIAL/advanced-js/lesson_04/solutions/image_edit/index.js deleted file mode 100644 index 0b61d39..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_04/solutions/image_edit/index.js +++ /dev/null @@ -1,41 +0,0 @@ -'use strict'; - -const image = [ - [ - // Row 1 - [100, 150, 200], // Pixel 1 - [50, 100, 150], // Pixel 2 - ], - [ - // Row 2 - [25, 75, 125], // Pixel 3 - [200, 225, 250], // Pixel 4 - ], -]; - -const increaseBrightness = (image, value) => { - // Iterate through each line of the image - return image.map((row) => - // Iterate through every pixel in the line - row.map((pixel) => - // Increase each RGB value by 'value' and make sure that it does not exceed 255 - pixel.map((component) => Math.min(component + value, 255)) - ) - ); -}; - -const newImage = increaseBrightness(image, 30); -console.log(newImage); -/* -Expected outcome: - [ - [ - [130, 180, 230], - [80, 130, 180], - ], - [ - [55, 105, 155], - [230, 255, 255], - ], - ] -*/ diff --git a/02_advanced/MATERIAL/advanced-js/lesson_04/solutions/inventory/index.js b/02_advanced/MATERIAL/advanced-js/lesson_04/solutions/inventory/index.js deleted file mode 100644 index 5d5ba81..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_04/solutions/inventory/index.js +++ /dev/null @@ -1,47 +0,0 @@ -'use strict'; - -const inventory = [ - [ - // Category: Electronics - ['Shelf 1', 'Laptop', 10], - ['Shelf 2', 'Smartphone', 25], - ], - [ - // Category: Clothing - ['Shelf 1', 'T-Shirts', 50], - ['Shelf 2', 'Jeans', 30], - ], - [ - // Category: Groceries - ['Shelf 1', 'Milk', 100], - ['Shelf 2', 'Bread', 80], - ], -]; - -// Add new category “Books" -inventory.push([ - ['Shelf 1', 'Novels', 40], - ['Shelf 2', 'Non-fiction', 35], -]); - -console.log(inventory); -/* Expected outcome: -[ - [ // Electronics - ['Shelf 1', 'Laptop', 10], - ['Shelf 2', 'Smartphone', 25], - ], - [ // Clothing - ['Shelf 1', 'T-Shirts', 50], - ['Shelf 2', 'Jeans', 30], - ], - [ // Groceries - ['Shelf 1', 'Milk', 100], - ['Shelf 2', 'Bread', 80], - ], - [ // Books - ['Shelf 1', 'Novels', 40], - ['Shelf 2', 'Non-fiction', 35], - ], -] -*/ diff --git a/02_advanced/MATERIAL/advanced-js/lesson_04/solutions/pokemon/index.js b/02_advanced/MATERIAL/advanced-js/lesson_04/solutions/pokemon/index.js deleted file mode 100644 index 3fb0b4d..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_04/solutions/pokemon/index.js +++ /dev/null @@ -1,21 +0,0 @@ -'use strict'; - -const evolutionStages = [ - ['Pidgey', 'Pidgeotto', 'Pidgeot'], - ['Vulpix', 'Ninetales'], - ['Dratini', 'Dragonair', 'Dragonite'], -]; - -const stagesFor = (pokemon) => - evolutionStages.find((stages) => stages.includes(pokemon)); - -const stagesAfter = (pokemon) => - stagesFor(pokemon).slice(stagesFor(pokemon).indexOf(pokemon) + 1); - -const stagesBefore = (pokemon) => - stagesFor(pokemon).slice(0, stagesFor(pokemon).indexOf(pokemon)); - -console.log(stagesFor('Vulpix')); // => [ 'Vulpix', 'Ninetales' ] -console.log(stagesAfter('Dratini')); // => [ 'Dragonair', 'Dragonite' ] -console.log(stagesBefore('Pidgeot')); // => [ 'Pidgey', 'Pidgeotto' ] -console.log(stagesBefore('Dragonair')); // => [ 'Dratini' ] diff --git a/02_advanced/MATERIAL/advanced-js/lesson_04/solutions/shopping_list/index.js b/02_advanced/MATERIAL/advanced-js/lesson_04/solutions/shopping_list/index.js deleted file mode 100644 index 7903be1..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_04/solutions/shopping_list/index.js +++ /dev/null @@ -1,20 +0,0 @@ -'use strict'; - -const shoppingList = [ - ['Fruits', 'Apples', 'Bananas', 'Oranges'], - ['Vegetables', 'Carrots', 'Broccoli', 'Spinach'], - ['Dairy', 'Milk', 'Cheese', 'Yogurt'], -]; - -// Your code here -shoppingList[0][2] = 'Grapes'; // Replace 'Bananas' with 'Grapes' -shoppingList[1][2] = 'Tomatoes'; // Replace 'Broccoli' with 'Tomatoes' -shoppingList[2][2] = 'Butter'; // Replace 'Cheese' with 'Butter' - -console.log(shoppingList); -// Expected outcome: -// [ -// ['Fruits', 'Apples', 'Grapes', 'Oranges'], -// ['Vegetables', 'Carrots', 'Tomatoes', 'Spinach'], -// ['Dairy', 'Milk', 'Butter', 'Yogurt'], -// ] diff --git a/02_advanced/MATERIAL/advanced-js/lesson_05/examples/displayPosts.html b/02_advanced/MATERIAL/advanced-js/lesson_05/examples/displayPosts.html deleted file mode 100644 index 4fb53c3..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_05/examples/displayPosts.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - Display Posts - - -

List of Posts

- - - - - diff --git a/02_advanced/MATERIAL/advanced-js/lesson_05/examples/displayPostsDetails.html b/02_advanced/MATERIAL/advanced-js/lesson_05/examples/displayPostsDetails.html deleted file mode 100644 index 9496034..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_05/examples/displayPostsDetails.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - Display Post Details - - -

List of Posts

- - -
-

-

- -
- - - - diff --git a/02_advanced/MATERIAL/advanced-js/lesson_05/examples/fetchAPIData.js b/02_advanced/MATERIAL/advanced-js/lesson_05/examples/fetchAPIData.js deleted file mode 100644 index c99cd3e..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_05/examples/fetchAPIData.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict'; - -async function fetchData() { - try { - const response = await fetch('https://dummyjson.com/posts'); - if (!response.ok) { - throw new Error('Network response was not ok'); - } - const data = await response.json(); - console.log(data); - } catch (error) { - console.error('Problem with the fetch operation:', error); - } -} - -fetchData(); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_05/examples/jsonToObj.js b/02_advanced/MATERIAL/advanced-js/lesson_05/examples/jsonToObj.js deleted file mode 100644 index 9a6e96b..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_05/examples/jsonToObj.js +++ /dev/null @@ -1,21 +0,0 @@ -'use strict'; - -const person = { - name: 'John Doe', - age: 30, - profession: 'Web Developer', -}; - -// Convert JavaScript object to JSON string -const jsonString = JSON.stringify(person); -console.log(jsonString); -// => {"name":"John Doe","age":30,"profession":"Web Developer"} - -try { - // Convert JSON string back to JavaScript object - const parsedPerson = JSON.parse(jsonString); - console.log(parsedPerson.name); // => John Doe - console.log(parsedPerson.age); // => 30 -} catch (error) { - console.error('Invalid JSON:', error); -} diff --git a/02_advanced/MATERIAL/advanced-js/lesson_05/examples/try_catch.js b/02_advanced/MATERIAL/advanced-js/lesson_05/examples/try_catch.js deleted file mode 100644 index 0dd9dde..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_05/examples/try_catch.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict'; - -async function getData(url) { - try { - const response = await fetch(url); - if (!response.ok) { - // Handle HTTP errors by throwing an exception - throw new Error(`HTTP error! status: ${response.status}`); - } - const data = await response.json(); - return data; - } catch (error) { - // Centralized error logging and fallback behavior - console.error('Error fetching data:', error); - // Optionally, return a default value or handle the error gracefully - return null; - } -} - -// Usage -getData('https://dummyjson.com/posts') - .then((data) => { - if (data) { - console.log('Data:', data); - } else { - console.log('No data received'); - } - }) - .catch((error) => { - console.error('Error in getData:', error); - }); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_05/solutions/fetchUsers/index.js b/02_advanced/MATERIAL/advanced-js/lesson_05/solutions/fetchUsers/index.js deleted file mode 100644 index 860da25..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_05/solutions/fetchUsers/index.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -async function fetchUsers() { - try { - const response = await fetch('https://dummyjson.com/users'); - const data = await response.json(); - console.log(data.users); - } catch (error) { - console.log(error); - } -} - -// Call the function -fetchUsers(); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_05/solutions/jsonBook/index.js b/02_advanced/MATERIAL/advanced-js/lesson_05/solutions/jsonBook/index.js deleted file mode 100644 index 233c47c..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_05/solutions/jsonBook/index.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -const book = { - title: 'The Great Gatsby', - author: 'F. Scott Fitzgerald', - year: 1925, -}; - -const jsonString = JSON.stringify(book); -console.log(jsonString); - -const jsonObject = JSON.parse(jsonString); -console.log(jsonObject.title); -console.log(jsonObject.author); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_07/examples/data/products.csv b/02_advanced/MATERIAL/advanced-js/lesson_07/examples/data/products.csv deleted file mode 100644 index 38fe75a..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_07/examples/data/products.csv +++ /dev/null @@ -1,9 +0,0 @@ -Code,Short Description,Tagline,Quantity,Price -MUG0007,coffee mug with LCD level indicator,never again reach for the empty mug,20,49.90 -MUG0013,coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling,put the smart into coffee reading,20,99.90 -OFF3145,pen with pre-warmed ink (tested on the South Pole),the pen is mightier than the cold,50,29.90 -COM1001,ambidextrous computer mouse,end the dictate of left and right,10,19.90 -COM0404,Easter egg themed webcam for your monitor,put an Easter egg on hardware too,20,149.90 -COM0001,Vulcan language vi cheatsheet,learn vi and Vulcan at the same time,3,9.90 -COM1536,Klingon language emacs cheatsheet,learn emacs and Klingon at the same time,50,9.90 -MOB0555,smartphone case with built-in screen,never miss a message,20,39.90 \ No newline at end of file diff --git a/02_advanced/MATERIAL/advanced-js/lesson_07/examples/data/products.html b/02_advanced/MATERIAL/advanced-js/lesson_07/examples/data/products.html deleted file mode 100644 index ceecd0f..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_07/examples/data/products.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - Products - - - -
-
-
    -
  • -

    coffee mug with LCD level indicator

    -

    never again reach for the empty mug

    -

    Price: EUR 49.90

    - -
  • -

    coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

    -

    put the smart into coffee reading

    -

    Price: EUR 99.90

    - -
  • -

    pen with pre-warmed ink (tested on the South Pole)

    -

    the pen is mightier than the cold

    -

    Price: EUR 29.90

    - -
  • -

    ambidextrous computer mouse

    -

    end the dictate of left and right

    -

    Price: EUR 19.90

    - -
  • -

    Easter egg themed webcam for your monitor

    -

    put an Easter egg on hardware too

    -

    Price: EUR 149.90

    - -
  • -

    Vulcan language vi cheatsheet

    -

    learn vi and Vulcan at the same time

    -

    Price: EUR 9.90

    -

    Last items in stock!

    -
  • -

    Klingon language emacs cheatsheet

    -

    learn emacs and Klingon at the same time

    -

    Price: EUR 9.90

    - -
  • -

    smartphone case with built-in screen

    -

    never miss a message

    -

    Price: EUR 39.90

    - -
  • -
-
- - - \ No newline at end of file diff --git a/02_advanced/MATERIAL/advanced-js/lesson_07/examples/data/products.html.gz b/02_advanced/MATERIAL/advanced-js/lesson_07/examples/data/products.html.gz deleted file mode 100644 index c670ddf..0000000 Binary files a/02_advanced/MATERIAL/advanced-js/lesson_07/examples/data/products.html.gz and /dev/null differ diff --git a/02_advanced/MATERIAL/advanced-js/lesson_07/examples/products_async_busy.js b/02_advanced/MATERIAL/advanced-js/lesson_07/examples/products_async_busy.js deleted file mode 100644 index e3a7dac..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_07/examples/products_async_busy.js +++ /dev/null @@ -1,10 +0,0 @@ -const fs = require('fs'); - -fs.readFile('data/products.csv', 'UTF8', (error, data) => { - console.log(data); // 2 output -}); - -for (let i = 0; i < 2000000000; i++) { - // be busy for a few seconds -} -console.log('ready'); // 1 output diff --git a/02_advanced/MATERIAL/advanced-js/lesson_07/examples/products_to_html.js b/02_advanced/MATERIAL/advanced-js/lesson_07/examples/products_to_html.js deleted file mode 100644 index e602bea..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_07/examples/products_to_html.js +++ /dev/null @@ -1,32 +0,0 @@ -const fs = require('fs'); - -const data = fs.readFileSync('data/products.csv', 'UTF8'); - -const STOCK_WARN_AMOUNT = 5; - -const products = data.split('\n'); -products.shift(); // remove header - -const recordToHTML = (record) => { - const fields = record.split(','); - const html = `
  • -

    ${fields[1]}

    -

    ${fields[2]}

    -

    Price: EUR ${fields[4]}

    - ${ - Number(fields[3]) <= STOCK_WARN_AMOUNT - ? '

    Last items in stock!

    ' - : '' - } -
  • `; - - return html; -}; - -const entries = products.filter((row) => row !== '').map(recordToHTML); - -console.log(''); - -console.log('ready'); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_07/examples/products_to_html_async.js b/02_advanced/MATERIAL/advanced-js/lesson_07/examples/products_to_html_async.js deleted file mode 100644 index f30465f..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_07/examples/products_to_html_async.js +++ /dev/null @@ -1,39 +0,0 @@ -const fs = require('fs'); - -const STOCK_WARN_AMOUNT = 5; - -// Function to convert a CSV record to HTML -const recordToHTML = (record) => { - const fields = record.split(','); - const html = `
  • -

    ${fields[1]}

    -

    ${fields[2]}

    -

    Price: EUR ${fields[4]}

    - ${ - Number(fields[3]) <= STOCK_WARN_AMOUNT - ? '

    Last items in stock!

    ' - : '' - } -
  • `; - - return html; -}; - -// Asynchronous version -fs.readFile('data/products.csv', 'UTF8', (err, data) => { - if (err) { - console.error(err); - return; - } - - const products = data.split('\n'); - products.shift(); // remove header - - const entries = products.filter((row) => row !== '').map(recordToHTML); - - console.log(''); - - console.log('ready'); -}); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_07/examples/read_products.js b/02_advanced/MATERIAL/advanced-js/lesson_07/examples/read_products.js deleted file mode 100644 index fe01e55..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_07/examples/read_products.js +++ /dev/null @@ -1,5 +0,0 @@ -const fs = require('fs'); // commonjs - -const data = fs.readFileSync('data/products.csv', 'utf-8'); - -console.log(data); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_07/solutions/mixedCSV/solution_1.js b/02_advanced/MATERIAL/advanced-js/lesson_07/solutions/mixedCSV/solution_1.js deleted file mode 100644 index 23cb653..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_07/solutions/mixedCSV/solution_1.js +++ /dev/null @@ -1,34 +0,0 @@ -// some, but not all fields are quoted - solution 1 - -const mixedCSV = - '"very big, soft computer mouse","the cutest peripheral ever",10,39.90'; - -let fields = []; -let index = 0; -let state = 'outside'; - -mixedCSV.split('').forEach((char) => { - if (state === 'quoted') { - fields[index] += char; // => [",v,e,r,y..."] - if (char === '"') { - state = 'outside'; - index += 1; - } - } else if (state === 'unquoted') { - if (char === ',') { - state = 'outside'; - index += 1; - } else { - fields[index] += char; - } - } else if (state === 'outside') { - fields[index] = char; //=> [",... - if (char === '"') { - state = 'quoted'; - } else if (char !== ',') { - state = 'unquoted'; - } - } -}); - -console.log(fields); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_07/solutions/mixedCSV/solution_2.js b/02_advanced/MATERIAL/advanced-js/lesson_07/solutions/mixedCSV/solution_2.js deleted file mode 100644 index 47f3585..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_07/solutions/mixedCSV/solution_2.js +++ /dev/null @@ -1,28 +0,0 @@ -// some, but not all fields are quoted - solution 2/2 - -const mixedCSV = - '"very big, soft computer mouse",' + '"the cutest peripheral ever",10,39.90'; - -let fields = []; - -const mixedCSVToArray = (s) => - findCommaPositions(',' + s + ',') - .map((position, i, positions) => s.slice(position, positions[i + 1] - 1)) - .slice(0, -1); - -const findCommaPositions = (s) => - s - .split('') - .reduce( - (positions, char, position) => - char === ',' && isEven(countQuotes(s.slice(0, position))) - ? positions.concat(position) - : positions, - [] - ); - -const countQuotes = (s) => s.split('').filter((c) => c === '"').length; - -const isEven = (num) => num % 2 === 0; - -console.log(mixedCSVToArray(mixedCSV)); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_07/solutions/quotedCSV/index.js b/02_advanced/MATERIAL/advanced-js/lesson_07/solutions/quotedCSV/index.js deleted file mode 100644 index 7832a01..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_07/solutions/quotedCSV/index.js +++ /dev/null @@ -1,7 +0,0 @@ -// all fields are quoted - -const quotedCSV = - '"very big, soft computer mouse","the cutest peripheral ever","10","39.90"'; - -const fields = quotedCSV.split('","'); -console.log(fields); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_08/examples/compress_file.js b/02_advanced/MATERIAL/advanced-js/lesson_08/examples/compress_file.js deleted file mode 100644 index eedfc40..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_08/examples/compress_file.js +++ /dev/null @@ -1,5 +0,0 @@ -const fs = require('fs'); -const zlib = require('zlib'); - -const data = fs.readFileSync('data/products.html', 'UTF8'); -fs.writeFileSync('data/products.html.gz', zlib.gzipSync(data)); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_08/examples/compress_streams.js b/02_advanced/MATERIAL/advanced-js/lesson_08/examples/compress_streams.js deleted file mode 100644 index 224710b..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_08/examples/compress_streams.js +++ /dev/null @@ -1,9 +0,0 @@ -const fs = require('fs'); -const zlib = require('zlib'); - -const gzipCompressor = zlib.createGzip(); - -const inputStream = fs.createReadStream('data/products.html'); -const outputStream = fs.createWriteStream('data/products.html.gz'); - -inputStream.pipe(gzipCompressor).pipe(outputStream); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_08/examples/create_hash.js b/02_advanced/MATERIAL/advanced-js/lesson_08/examples/create_hash.js deleted file mode 100644 index 920fc4a..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_08/examples/create_hash.js +++ /dev/null @@ -1,6 +0,0 @@ -const crypto = require('crypto'); - -const data = 'Ich werde verschlüsselt!'; -const hash = crypto.createHash('sha256').update(data).digest('hex'); // 256-bit SHA-2 hash algorithm - -console.log(hash); // 4803bce8b78d10b6bae3224c041f7c7311dedc056386870e50e6b56a109f4ee8 diff --git a/02_advanced/MATERIAL/advanced-js/lesson_08/examples/data/file.txt b/02_advanced/MATERIAL/advanced-js/lesson_08/examples/data/file.txt deleted file mode 100644 index 0cdffb2..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_08/examples/data/file.txt +++ /dev/null @@ -1 +0,0 @@ -I am a text from a text file with the name file.txt \ No newline at end of file diff --git a/02_advanced/MATERIAL/advanced-js/lesson_08/examples/data/file_1.txt b/02_advanced/MATERIAL/advanced-js/lesson_08/examples/data/file_1.txt deleted file mode 100644 index 78686f0..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_08/examples/data/file_1.txt +++ /dev/null @@ -1 +0,0 @@ -I am a text from a text file with the name file_1.txt \ No newline at end of file diff --git a/02_advanced/MATERIAL/advanced-js/lesson_08/examples/data/file_2.txt b/02_advanced/MATERIAL/advanced-js/lesson_08/examples/data/file_2.txt deleted file mode 100644 index cfde461..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_08/examples/data/file_2.txt +++ /dev/null @@ -1 +0,0 @@ -I am a text from a text file with the name file_2.txt \ No newline at end of file diff --git a/02_advanced/MATERIAL/advanced-js/lesson_08/examples/data/file_3.txt b/02_advanced/MATERIAL/advanced-js/lesson_08/examples/data/file_3.txt deleted file mode 100644 index 22b9a04..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_08/examples/data/file_3.txt +++ /dev/null @@ -1 +0,0 @@ -I am a text from a text file with the name file_3.txt \ No newline at end of file diff --git a/02_advanced/MATERIAL/advanced-js/lesson_08/examples/data/products.csv b/02_advanced/MATERIAL/advanced-js/lesson_08/examples/data/products.csv deleted file mode 100644 index 38fe75a..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_08/examples/data/products.csv +++ /dev/null @@ -1,9 +0,0 @@ -Code,Short Description,Tagline,Quantity,Price -MUG0007,coffee mug with LCD level indicator,never again reach for the empty mug,20,49.90 -MUG0013,coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling,put the smart into coffee reading,20,99.90 -OFF3145,pen with pre-warmed ink (tested on the South Pole),the pen is mightier than the cold,50,29.90 -COM1001,ambidextrous computer mouse,end the dictate of left and right,10,19.90 -COM0404,Easter egg themed webcam for your monitor,put an Easter egg on hardware too,20,149.90 -COM0001,Vulcan language vi cheatsheet,learn vi and Vulcan at the same time,3,9.90 -COM1536,Klingon language emacs cheatsheet,learn emacs and Klingon at the same time,50,9.90 -MOB0555,smartphone case with built-in screen,never miss a message,20,39.90 \ No newline at end of file diff --git a/02_advanced/MATERIAL/advanced-js/lesson_08/examples/data/products.html b/02_advanced/MATERIAL/advanced-js/lesson_08/examples/data/products.html deleted file mode 100644 index ceecd0f..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_08/examples/data/products.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - Products - - - -
    -
    -
      -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: EUR 49.90

      - -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: EUR 99.90

      - -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: EUR 29.90

      - -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: EUR 19.90

      - -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: EUR 149.90

      - -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: EUR 9.90

      -

      Last items in stock!

      -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: EUR 9.90

      - -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: EUR 39.90

      - -
    • -
    -
    - - - \ No newline at end of file diff --git a/02_advanced/MATERIAL/advanced-js/lesson_08/examples/data/products.html.gz b/02_advanced/MATERIAL/advanced-js/lesson_08/examples/data/products.html.gz deleted file mode 100644 index c670ddf..0000000 Binary files a/02_advanced/MATERIAL/advanced-js/lesson_08/examples/data/products.html.gz and /dev/null differ diff --git a/02_advanced/MATERIAL/advanced-js/lesson_08/examples/products_to_html_file.js b/02_advanced/MATERIAL/advanced-js/lesson_08/examples/products_to_html_file.js deleted file mode 100644 index 9cc1350..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_08/examples/products_to_html_file.js +++ /dev/null @@ -1,72 +0,0 @@ -const fs = require('fs'); - -const STOCK_WARN_AMOUNT = 5; - -// Function to convert a CSV record to HTML -const recordToHTML = (record) => { - const fields = record.split(','); - const html = `
  • -

    ${fields[1]}

    -

    ${fields[2]}

    -

    Price: EUR ${fields[4]}

    - ${ - Number(fields[3]) <= STOCK_WARN_AMOUNT - ? '

    Last items in stock!

    ' - : '' - } -
  • `; - - return html; -}; - -// Asynchronous version -fs.readFile('data/products.csv', 'UTF8', (err, data) => { - if (err) { - console.error(err); - return; - } - - const products = data.split('\n'); - products.shift(); // remove header - - const entries = products.filter((row) => row !== '').map(recordToHTML); - - writeToFile(entries); -}); - -const writeToFile = (entries) => { - const headerStr = ` - - - - - Products - - - -
    -
    `; - const footerStr = `
    -
    - - -`; - - const html = `${headerStr} - ${footerStr}`; - - fs.writeFile('data/products.html', html, (err) => { - if (err) { - console.error(err); - return; - } - console.log('File written successfully'); - }); - - console.log('Writing file...'); -}; diff --git a/02_advanced/MATERIAL/advanced-js/lesson_08/solutions/compress_products/data/products.csv b/02_advanced/MATERIAL/advanced-js/lesson_08/solutions/compress_products/data/products.csv deleted file mode 100644 index 38fe75a..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_08/solutions/compress_products/data/products.csv +++ /dev/null @@ -1,9 +0,0 @@ -Code,Short Description,Tagline,Quantity,Price -MUG0007,coffee mug with LCD level indicator,never again reach for the empty mug,20,49.90 -MUG0013,coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling,put the smart into coffee reading,20,99.90 -OFF3145,pen with pre-warmed ink (tested on the South Pole),the pen is mightier than the cold,50,29.90 -COM1001,ambidextrous computer mouse,end the dictate of left and right,10,19.90 -COM0404,Easter egg themed webcam for your monitor,put an Easter egg on hardware too,20,149.90 -COM0001,Vulcan language vi cheatsheet,learn vi and Vulcan at the same time,3,9.90 -COM1536,Klingon language emacs cheatsheet,learn emacs and Klingon at the same time,50,9.90 -MOB0555,smartphone case with built-in screen,never miss a message,20,39.90 \ No newline at end of file diff --git a/02_advanced/MATERIAL/advanced-js/lesson_08/solutions/compress_products/data/products.html.gz b/02_advanced/MATERIAL/advanced-js/lesson_08/solutions/compress_products/data/products.html.gz deleted file mode 100644 index c670ddf..0000000 Binary files a/02_advanced/MATERIAL/advanced-js/lesson_08/solutions/compress_products/data/products.html.gz and /dev/null differ diff --git a/02_advanced/MATERIAL/advanced-js/lesson_08/solutions/compress_products/index.js b/02_advanced/MATERIAL/advanced-js/lesson_08/solutions/compress_products/index.js deleted file mode 100644 index cd4ed48..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_08/solutions/compress_products/index.js +++ /dev/null @@ -1,73 +0,0 @@ -const fs = require('fs'); -const zlib = require('zlib'); - -const STOCK_WARN_AMOUNT = 5; - -// Function to convert a CSV record to HTML -const recordToHTML = (record) => { - const fields = record.split(','); - const html = `
  • -

    ${fields[1]}

    -

    ${fields[2]}

    -

    Price: EUR ${fields[4]}

    - ${ - Number(fields[3]) <= STOCK_WARN_AMOUNT - ? '

    Last items in stock!

    ' - : '' - } -
  • `; - - return html; -}; - -// Asynchronous version -fs.readFile('data/products.csv', 'UTF8', (err, data) => { - if (err) { - console.error(err); - return; - } - - const products = data.split('\n'); - products.shift(); // remove header - - const entries = products.filter((row) => row !== '').map(recordToHTML); - - writeToFile(entries); -}); - -const writeToFile = (entries) => { - const headerStr = ` - - - - - Products - - - -
    -
    `; - const footerStr = `
    -
    - - -`; - - const html = `${headerStr} - ${footerStr}`; - - try { - const compressed = zlib.gzipSync(html); - fs.writeFileSync('data/products.html.gz', compressed); - } catch (err) { - console.error(err); - return; - } - - console.log('file written'); -}; diff --git a/02_advanced/MATERIAL/advanced-js/lesson_08/solutions/compress_products_nopipe/data/products.csv b/02_advanced/MATERIAL/advanced-js/lesson_08/solutions/compress_products_nopipe/data/products.csv deleted file mode 100644 index 38fe75a..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_08/solutions/compress_products_nopipe/data/products.csv +++ /dev/null @@ -1,9 +0,0 @@ -Code,Short Description,Tagline,Quantity,Price -MUG0007,coffee mug with LCD level indicator,never again reach for the empty mug,20,49.90 -MUG0013,coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling,put the smart into coffee reading,20,99.90 -OFF3145,pen with pre-warmed ink (tested on the South Pole),the pen is mightier than the cold,50,29.90 -COM1001,ambidextrous computer mouse,end the dictate of left and right,10,19.90 -COM0404,Easter egg themed webcam for your monitor,put an Easter egg on hardware too,20,149.90 -COM0001,Vulcan language vi cheatsheet,learn vi and Vulcan at the same time,3,9.90 -COM1536,Klingon language emacs cheatsheet,learn emacs and Klingon at the same time,50,9.90 -MOB0555,smartphone case with built-in screen,never miss a message,20,39.90 \ No newline at end of file diff --git a/02_advanced/MATERIAL/advanced-js/lesson_08/solutions/compress_products_nopipe/data/products.html b/02_advanced/MATERIAL/advanced-js/lesson_08/solutions/compress_products_nopipe/data/products.html deleted file mode 100644 index ceecd0f..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_08/solutions/compress_products_nopipe/data/products.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - Products - - - -
    -
    -
      -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: EUR 49.90

      - -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: EUR 99.90

      - -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: EUR 29.90

      - -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: EUR 19.90

      - -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: EUR 149.90

      - -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: EUR 9.90

      -

      Last items in stock!

      -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: EUR 9.90

      - -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: EUR 39.90

      - -
    • -
    -
    - - - \ No newline at end of file diff --git a/02_advanced/MATERIAL/advanced-js/lesson_08/solutions/compress_products_nopipe/data/products.html.gz b/02_advanced/MATERIAL/advanced-js/lesson_08/solutions/compress_products_nopipe/data/products.html.gz deleted file mode 100644 index c670ddf..0000000 Binary files a/02_advanced/MATERIAL/advanced-js/lesson_08/solutions/compress_products_nopipe/data/products.html.gz and /dev/null differ diff --git a/02_advanced/MATERIAL/advanced-js/lesson_08/solutions/compress_products_nopipe/index.js b/02_advanced/MATERIAL/advanced-js/lesson_08/solutions/compress_products_nopipe/index.js deleted file mode 100644 index 1bfb57d..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_08/solutions/compress_products_nopipe/index.js +++ /dev/null @@ -1,9 +0,0 @@ -const fs = require('fs'); -const zlib = require('zlib'); - -const inputStream = fs.createReadStream('data/products.html'); -const outputStream = fs.createWriteStream('data/products.html.gz'); - -inputStream.on('data', (data) => { - outputStream.write(zlib.gzipSync(data)); -}); diff --git a/02_advanced/MATERIAL/advanced-js/lesson_08/solutions/password_generator/index.js b/02_advanced/MATERIAL/advanced-js/lesson_08/solutions/password_generator/index.js deleted file mode 100644 index 909a38f..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_08/solutions/password_generator/index.js +++ /dev/null @@ -1,17 +0,0 @@ -const crypto = require('crypto'); - -const PASSWORD_LENGTH = 10; -const s = '23456789abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ!.,;#$%/+*'; - -const buf = crypto.randomBytes(PASSWORD_LENGTH); - -console.log(buf); // gibt ein Buffer Objekt zurück (z.B. ) -const password = Array.from(buf); - -constole.log(password); // gibt ein Array zurück mit Werten zwischen 0 und 255 (z.B. [ 144, 127, 61, 29, 31, 125, 125, 125, 125, 125 ]) - -password - .map((byte) => s.charAt(byte % s.length)) // gibt ein Array zurück mit den Zeichen aus s (z.B. [ '3', '7', 'h', 'G', 'J', 'z', 'z', 'z', 'z', 'z' ]) - .join(''); // wandelt das Array in einen String um. - -console.log(password); // gibt das generierte Passwort zurück (z.B. '37hGJzzzzz') diff --git a/02_advanced/MATERIAL/advanced-js/lesson_09/solutions/os_cores/index.js b/02_advanced/MATERIAL/advanced-js/lesson_09/solutions/os_cores/index.js deleted file mode 100644 index b8fb79b..0000000 --- a/02_advanced/MATERIAL/advanced-js/lesson_09/solutions/os_cores/index.js +++ /dev/null @@ -1,12 +0,0 @@ -'use strict'; - -// Import the 'os' module to access operating system-related utility methods -const os = require('os'); - -// Get the platform of the operating system (e.g., 'linux', 'win32', 'darwin') -const system = os.platform(); - -// Get the number of CPU cores available on the machine -const cpus = os.cpus().length; - -console.log(`I am running on a machine with ${system} and ${cpus} cores.`); diff --git a/02_advanced/MATERIAL/favicon/README.md b/02_advanced/MATERIAL/favicon/README.md deleted file mode 100644 index 37c0513..0000000 --- a/02_advanced/MATERIAL/favicon/README.md +++ /dev/null @@ -1,8 +0,0 @@ -```html - - - - - - -``` diff --git a/02_advanced/MATERIAL/pexels-frantisek-1294136-10266419.jpg b/02_advanced/MATERIAL/pexels-frantisek-1294136-10266419.jpg deleted file mode 100644 index 56b8bf1..0000000 Binary files a/02_advanced/MATERIAL/pexels-frantisek-1294136-10266419.jpg and /dev/null differ diff --git a/02_advanced/MATERIAL/special-elite-v20-latin.zip b/02_advanced/MATERIAL/special-elite-v20-latin.zip deleted file mode 100644 index 85e22d5..0000000 Binary files a/02_advanced/MATERIAL/special-elite-v20-latin.zip and /dev/null differ diff --git a/02_advanced/MATERIAL/special-elite-v20-latin/special-elite-v20-latin-regular.woff2 b/02_advanced/MATERIAL/special-elite-v20-latin/special-elite-v20-latin-regular.woff2 deleted file mode 100644 index 569a27e..0000000 Binary files a/02_advanced/MATERIAL/special-elite-v20-latin/special-elite-v20-latin-regular.woff2 and /dev/null differ diff --git a/02_advanced/agenda.md b/02_advanced/agenda.md deleted file mode 100644 index 4ce20d7..0000000 --- a/02_advanced/agenda.md +++ /dev/null @@ -1,314 +0,0 @@ ---- -marp: true -theme: default ---- - -## JavaScript Grundlagen Teil 1. - ---- - -#### Tag 01 - -**Inhalt:** - -- Vorstellungsrunde -- Einrichtung der IDE -- Tools für die Webentwicklung (Emmet, Markdown, VS-Code) -- Arbeiten mit VSCode -- Konsolenausgaben mit `console.log()` - -**Übungen:** - -- Übungen Content Factory - ---- - -#### Tag 02 - -**Inhalt:** - -- Dialogfenster in JS `prompt()`, `alert()`, `confirm()` -- Kommentare in JS -- Rechnen in JS -- Datentyp String, Number, Boolean -- literal und typeof -- Prioritätsreihenfolge - -**Übungen:** - -Übung 3 - 6 - ---- - -#### Tag 03 - -**Inhalt:** - -- Variablen und Konstanten in JS -- Zusammengesetzte Zuweisungsoperatoren -- Increment & Decrement -- Strings verketten mit + - -**Übungen:** - -Übung 7 - 12 - ---- - -#### Tag 04 - -**Inhalt:** - -- Escape-Notation -- Implizite und explizite Typkonvertierung -- NaN - Paradoxon -- Math Object -- Number.toFixed() - -**Übungen:** - -Übung 14 - 18 - ---- - -#### Tag 05 - -**Inhalt:** - -- Repetition der Inhalte -- Relationale Operatoren & Vergleichoperatoren -- isNaN -- Lexikographische Vergleiche -- **Exkurs: HTML-Formularfelder** -- 1:1 Meeting - -**Übungen:** - -Übung Kontaktformular mit HTML und BS - ---- - -#### Tag 06 - -**Inhalt:** - -- **Exkurs: HTML Formularfelder mit BS** -- if else Verzweigung und ternärer Operator -- logische Operatoren UND und ODER -- unärer Operator (!) -- String Methoden Part I - -**Übungen:** - -Übung 19 - 26 - ---- - -#### Tag 07 - -**Inhalt:** - -- String Methoden Part II -- Funktionen in JS -- Funktionen mit Übergabeparameter -- Funktionen mit Rückgabewerten - -**Übungen:** - -Übung 26 - 35 - ---- - -#### Tag 08 - -**Inhalt:** - -- Funktionen mit Übergabeparameter -- Funktionen mit Rückgabewerten -- Guards -- Array Part 1 - -**Übungen:** - -Übung 35 - 38 - ---- - -#### Tag 09 - -**Inhalt:** - -- Array Methoden toSorted, toReversed, toSpliced -- toSorted, toReversed -- Array sort mit "compare function" -- Array: Higher Order Funktionen Part (sort map, forEach, reduce, some, every) - -**Übungen:** - -Übung 39 - 48 - ---- - -#### Tag 10 - -**Inhalt:** - -- Array.find und Array.findIndex -- Alle Array Higher Order Funktionen im Überblick -- local scoping -- **Exkurs: Schleifen** - -**Übungen:** - -Übung 46 - 48 - ---- - -## JavaScript für Fortgeschrittene - ---- - -#### Tag 11 - -**Inhalt:** - -- Einführung in JS für Fortgeschrittene -- Objekte in JS - -**Übungen:** - -Projektarbeit -Abschlussquiz - JS Grundlagen - ---- - -#### Tag 12 - -**Inhalt:** - -- Destructuring von Objekten und Arrays -- Rekursion - -**Übungen:** - -Übung 01 - 10 - ---- - -#### Tag 13 - -**Inhalt:** - -- Promises -- Callback-Hell -- Installation von node (npm) und Windows Terminal (für Node) -- **Exkurs: Statische Webseite mit Sass und HTML** -- **Exkurs: Versionierung mit Github Part I** - -**Übungen:** - ---- - -#### Tag 14 - -**Inhalt:** - -- Promise Aufbau -- Promise in Funktionen -- File System von Node -- commonjs vs esm -- async await - -**Übungen:** - -Übung 09 - 11 - ---- - -#### Tag 15 - -**Inhalt:** - -- Wiederholung der Inhalte -- Promise.all() -- **Exkurs: Switch Case Abfragen** -- **Exkurs: Statische Webseite mit Sass und HTML** -- **Exkurs: Versionierung mit Github Part I** -- 1:1 Meeting - ---- - -#### Tag 16 - -**Inhalt:** - -- **Exkurs: Statische Webseite mit Sass und HTML Part II** -- Mehrdimensionale Arrays - -**Übungen:** - -Projektarbeiten -Übungen 11 -13 - ---- - -#### Tag 17 - -**Inhalt:** - -- Chess-Beispiel -- Arbeiten mit Fetch API -- fetch mit Promise und async...await -- Joke API auslesen -- **Exkurs: Versionierung mit Github Part I** - -**Übungen:** - -Übungen 14 - 24 - ---- - -#### Tag 18 - -**Inhalt:** - -- XML-HttpRequest und AJAX mit jQuery -- Node Installation (Wiederholung) -- Node Standardbib - - fs - -**Übungen:** - -Projektarbeit - ---- - -#### Tag 19 - -**Inhalt:** - -- NPM Befehle -- CSV to HTML -- Node Standardbib - - zlib (stream) - - Crypto -- Abschluss von JS für Fortgeschrittene -- Projektvorstellung 1 + 2 - -**Übungen:** - -Übungen 25 - 31 - ---- - -#### Tag 20 - -**Inhalt:** - -- **Einrichtung von Git** -- **Exkurs: Webseite mit Gulp, SASS, HTML/CSS, JS** - -**Übungen:** - -Projektarbeit -Übungen 31 - 32 diff --git a/02_advanced/docs/nodejs-installation.md b/02_advanced/docs/nodejs-installation.md deleted file mode 100644 index 862e2c3..0000000 --- a/02_advanced/docs/nodejs-installation.md +++ /dev/null @@ -1,114 +0,0 @@ -## NVM - Node Version Manager - -nvm ist ein Versionsmanager für node.js. Über nvm können mehrere unterschiedliche Node Versionen installiert werden. NVM wird über die Konsole aufgerufen und ist mit verschiedenen Shells kompatibel (sh, dash, ksh, zsh, bash). - -#### Links - -- (Win) -- (Mac OS) - -#### Installation Windows - -1. Lade den NVM-Installer über folgenden Link herunter: -2. Installiere NVM über den [Installer](https://github.com/coreybutler/nvm-windows/releases/download/1.2.2/nvm-setup.zip) -3. Sollte vorher bereits NodeJS global ohne NVM installiert worden sein, wird empfohlen die vorherige NodeJS Version zu [deinstallieren](https://stackoverflow.com/a/55300310). - -### Installation Mac OS - -- Installiere NVM über die Konsole mit: - -```bash -curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash -``` - -- Füge den Pfad zum NVM Ordner zur Shell-Config hinzu. (`~/.bash_profile`, `~/.zshrc`, `~/.profile`, or `~/.bashrc`). - -```bash -export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")" -[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm -``` - -- Aktuelle Informationen zur Installation findet man unter folgendem Link: - -#### Erste Schritte - -Sobald NVM erfolgreich installiert wurde kann man über nvm in der Konsole eine neue Node Version mit folgendem Befehl installieren: - -```bash -nvm install [NODE VERSIONSNUMMER] -``` - -> Hinweis: Die aktuellste Versionsnummer von NodeJS findet man am einfachsten auf der [NodeJS-Seite](https://nodejs.org/en/) - -Installierte Node Versionen auflisten - -```bash -nvm list -``` - -Node Version verwenden/wechseln - -```bash -nvm use [NODE VERSIONSNUMMER] -``` - -Node Version als Standard einrichten - -```bash -nvm alias default [NODE VERSIONSNUMMER] -``` - -## Node.js - -### Definition - -Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. - -## Neues Projekt erstellen - -- Über die Konsole in den Projektordner gehen. - -Projektordner wechsel über "change directory" (cd) - -```bash -cd [projektpfad] -``` - -- Eigene Package.json Datei generieren (nur einmalig bei einem neuen Projekt notwendig.) - -```bash -npm init -``` - -- Module installieren, die nur für die Entwicklung benötigt werden. (devDependicies) - -| Befehl | Zweck | -| ------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------- | -| `npm install Modul@Version` | installiere Modul in der Version Version (semantic versioning) | -| `npm install Modul@Version --save`
    `npm install Modul@Version -S` | Modul wird in der Datei `package.json` unter dependencies hinzugefügt (Mittlerweile default) | -| `npm install Modul@Version --save-dev`
    `npm install Modul@Version -D` | Modul wird in der Datei `package.json` unter devdependencies hinzugefügt | -| `npm install Modul@Version --global`
    `npm install Modul@Version -g` | Modul wird global installiert. (Von jedem Ordner aus anwendbar) | -| `npm uninstall Modul@Version` | entfernt Modul aus `node_modules` | -| `npm uninstall Modul@Version --save` | entfernt Modul aus `node_modules` und aus der dependencies- Eigenschaft in der `package.json`. | -| `npm update Modul` | Aktualisiert Modul auf die neueste Version | -| `npm update Modul --save` |  Aktualisiert Modul auf die neueste Version und auch die Versionsnummer der dependencies- Eigenschaft in der `package.json`. | -| `npm init` | erstellt eine package.json-Datei (der Befehl fragt die Eigenschaften ab) | -| `npm init --yes` | erstellt eine package.json-Datei (der Befehl setzt Default-Werte ein) | -| `npm list` | listet alle installierten Module auf. | -| `npm search` | Suchbegriff sucht Module, deren Namen den Suchbegriff enthält | - -# Globale Module - -## SASS - -### Definition - -> Sass is the most mature, stable, and powerful professional grade CSS extension language in the world. - -Sass ist eine CSS-Preprocessor Sprache. - -```bash -npm install sass -g -``` - -## Liste von verwendeten Modulen diff --git a/02_advanced/docs/nodejs-installation.pdf b/02_advanced/docs/nodejs-installation.pdf deleted file mode 100644 index c12907f..0000000 Binary files a/02_advanced/docs/nodejs-installation.pdf and /dev/null differ diff --git a/02_advanced/faq/interval-funktionreferenz.js b/02_advanced/faq/interval-funktionreferenz.js deleted file mode 100644 index 3769d79..0000000 --- a/02_advanced/faq/interval-funktionreferenz.js +++ /dev/null @@ -1,11 +0,0 @@ -const sayHello = () => { - console.log('Say hello'); -}; - -const iv = setInterval(sayHello, 500); - -const double = (n, i) => { - return n * 2 + i; -}; - -const numbers = [1, '2', 3].map(double); diff --git a/02_advanced/projekte/js-advanced-dashboard-template/.gitignore b/02_advanced/projekte/js-advanced-dashboard-template/.gitignore deleted file mode 100644 index 54f07af..0000000 --- a/02_advanced/projekte/js-advanced-dashboard-template/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? \ No newline at end of file diff --git a/02_advanced/projekte/js-advanced-dashboard-template/README.md b/02_advanced/projekte/js-advanced-dashboard-template/README.md deleted file mode 100644 index 601f2df..0000000 --- a/02_advanced/projekte/js-advanced-dashboard-template/README.md +++ /dev/null @@ -1,17 +0,0 @@ -## License and terms of use - -© Web Professional Institute Inc. All rights reserved. - -This material is provided solely for students enrolled in courses offered by Web Professional Institute Inc. By accessing or using this code, you acknowledge that it is strictly for educational use within the context of Web Professional Institute Inc. programs. - -**Usage Restrictions:** - -- Redistribution, sharing, or copying of this material outside the course environment is strictly prohibited. -- The content is designed to support your learning objectives and is not authorized for commercial projects, public repositories, or applications beyond the course scope. -- Unauthorized commercial use or open-source distribution is strictly prohibited and may result in expulsion from the program and legal action. - -**Agreement & Rights:** - -As a student, you have agreed to these terms as part of your enrollment agreement, which includes additional details on permitted uses, restrictions, and policies. The author and Web Professional Institute Inc. retain all rights to this material, including the code base and instructional content. - -For any questions regarding these terms, please contact Web Professional Institute Inc. for clarification. diff --git a/02_advanced/projekte/js-advanced-dashboard-template/index.html b/02_advanced/projekte/js-advanced-dashboard-template/index.html deleted file mode 100644 index 0d354ae..0000000 --- a/02_advanced/projekte/js-advanced-dashboard-template/index.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - Recipe Explorer Dashboard - - - -

    Recipe Explorer Dashboard

    - -
    - - -
    - -
    Loading...
    -
    - - - - - - - - - - - - -
    Recipe NameCuisinePreparation Time (mins)
    - - - - - - - diff --git a/02_advanced/projekte/js-advanced-dashboard-template/scripts.js b/02_advanced/projekte/js-advanced-dashboard-template/scripts.js deleted file mode 100644 index 69b0e04..0000000 --- a/02_advanced/projekte/js-advanced-dashboard-template/scripts.js +++ /dev/null @@ -1,122 +0,0 @@ -(() => { - // ===== DOM & VARIABLES ===== - const RECIPES_URL = 'https://dummyjson.com/recipes'; - - const searchInput = document.querySelector('#search-input'); - const searchButton = document.querySelector('#search-button'); - const recipesTableBody = document.querySelector('#recipes-table tbody'); - const loadingIndicator = document.querySelector('#loading'); - const errorMessage = document.querySelector('#error-message'); - - const modal = document.querySelector('#recipe-modal'); - const modalTitle = document.querySelector('#modal-title'); - const modalImage = document.querySelector('#modal-image'); - const modalCategory = document.querySelector('#modal-category'); - const modalTime = document.querySelector('#modal-time'); - const modalIngredients = document.querySelector('#modal-ingredients'); - const modalInstructions = document.querySelector('#modal-instructions'); - const closeModal = document.querySelector('.close'); - - let allRecipes = []; - - // ===== INIT ===== - const init = () => { - // TODO: Fetch and display all recipes on initial load - - // Event Listeners - closeModal.addEventListener('click', closeModalEvent); - window.addEventListener('click', windowClickEvent); - }; - - // ===== EVENT LISTENERS ===== - const searchButtonEvent = () => { - const query = searchInput.value.trim().toLowerCase(); - if (query !== '') { - // TODO: Implement search functionality - } else { - // TODO: Display all recipes if search input is empty - } - }; - - // Close Modal Event - const closeModalEvent = () => { - modal.style.display = 'none'; - }; - - // Close Modal when clicking outside the modal content - const windowClickEvent = (event) => { - if (event.target == modal) { - modal.style.display = 'none'; - } - }; - - // ===== FUNCTIONS ===== - // Fetches all recipes from the API and displays them. - const fetchAndDisplayRecipes = async () => { - showLoading(true); - showError(false, ''); - - try { - // TODO: Fetch data from API - } catch (error) { - console.error(error); - showError(true, 'An error occurred while fetching recipes.'); - } finally { - showLoading(false); - } - }; - - // Searches for recipes by name and displays the results. - const searchRecipes = async (query) => { - showLoading(true); - showError(false, ''); - - try { - // TODO: Search for recipes by name - } catch (error) { - console.error(error); - showError(true, 'An error occurred while searching for recipes.'); - } finally { - showLoading(false); - } - }; - - // Displays a list of recipes in the table. - const displayRecipes = (recipes) => { - clearTable(); - - // TODO: Iterate over the recipes and display them in the table - }; - - // Displays detailed information about a selected recipe in a modal. - const showRecipeDetails = (recipe) => { - // TODO: Calculate total preparation time - // TODO: Set image source - // TODO: Populate ingredients - // TODO: Show modal - }; - - // Shows or hides the loading indicator. - const showLoading = (show) => { - loadingIndicator.style.display = show ? 'block' : 'none'; - }; - - // Displays or hides an error message. - const showError = (show, message) => { - if (show) { - errorMessage.textContent = message; - errorMessage.style.display = 'block'; - } else { - errorMessage.textContent = ''; - errorMessage.style.display = 'none'; - } - }; - - // Clears the recipes table. - const clearTable = () => { - recipesTableBody.innerHTML = ''; - }; - - // ===== CALL INIT ===== - init(); -})(); diff --git a/02_advanced/projekte/js-advanced-dashboard-template/styles.css b/02_advanced/projekte/js-advanced-dashboard-template/styles.css deleted file mode 100644 index fc642eb..0000000 --- a/02_advanced/projekte/js-advanced-dashboard-template/styles.css +++ /dev/null @@ -1,124 +0,0 @@ -body { - font-family: Arial, sans-serif; - margin: 20px; -} - -h1 { - text-align: center; - color: #4d7c0f; -} - -#search-container { - text-align: center; - margin-bottom: 20px; -} - -#search-input { - width: 300px; - padding: 10px; - font-size: 16px; - border: 2px solid #65a30d; - border-radius: 5px; -} - -#search-button { - padding: 10px 20px; - font-size: 16px; - cursor: pointer; - background-color: #4d7c0f; - color: white; - border: none; - border-radius: 5px; - margin-left: 10px; -} - -#search-button:hover { - background-color: #65a30d; - transition: 0.1s; -} - -#recipes-table { - width: 100%; - border-collapse: collapse; - margin-bottom: 20px; - max-width: 1000px; - margin-inline: auto; -} - -#recipes-table th, -#recipes-table td { - border: 1px solid #ddd; - padding: 12px; - text-align: left; -} - -#recipes-table th { - background-color: #4d7c0f; - color: white; -} - -#recipes-table tr:nth-child(even) { - background-color: #f9f9f9; -} - -#recipes-table tr:hover { - background-color: #ecfccb; - cursor: pointer; -} - -/* Modal styling */ -.modal { - display: none; - position: fixed; - z-index: 1; - padding-top: 100px; - left: 0; - top: 0; - width: 100%; - height: 100%; - overflow: auto; - background-color: rgba(0, 0, 0, 0.4); -} - -.modal-content { - background-color: #fff; - margin: auto; - padding: 20px; - border: 1px solid #888; - width: 60%; - border-radius: 10px; - position: relative; -} - -.close { - color: #aaa; - position: absolute; - top: 15px; - right: 25px; - font-size: 30px; - font-weight: bold; - cursor: pointer; -} - -.close:hover, -.close:focus { - color: black; - text-decoration: none; -} - -/* Loading Indicator */ -#loading { - display: none; - text-align: center; - font-size: 18px; - color: #4d7c0f; -} - -/* Error Message */ -#error-message { - display: none; - text-align: center; - color: red; - font-size: 18px; - margin-bottom: 20px; -} diff --git a/02_advanced/projekte/js-advanced-javascript-cafe-template/.gitignore b/02_advanced/projekte/js-advanced-javascript-cafe-template/.gitignore deleted file mode 100644 index 54f07af..0000000 --- a/02_advanced/projekte/js-advanced-javascript-cafe-template/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? \ No newline at end of file diff --git a/02_advanced/projekte/js-advanced-javascript-cafe-template/README.md b/02_advanced/projekte/js-advanced-javascript-cafe-template/README.md deleted file mode 100644 index 601f2df..0000000 --- a/02_advanced/projekte/js-advanced-javascript-cafe-template/README.md +++ /dev/null @@ -1,17 +0,0 @@ -## License and terms of use - -© Web Professional Institute Inc. All rights reserved. - -This material is provided solely for students enrolled in courses offered by Web Professional Institute Inc. By accessing or using this code, you acknowledge that it is strictly for educational use within the context of Web Professional Institute Inc. programs. - -**Usage Restrictions:** - -- Redistribution, sharing, or copying of this material outside the course environment is strictly prohibited. -- The content is designed to support your learning objectives and is not authorized for commercial projects, public repositories, or applications beyond the course scope. -- Unauthorized commercial use or open-source distribution is strictly prohibited and may result in expulsion from the program and legal action. - -**Agreement & Rights:** - -As a student, you have agreed to these terms as part of your enrollment agreement, which includes additional details on permitted uses, restrictions, and policies. The author and Web Professional Institute Inc. retain all rights to this material, including the code base and instructional content. - -For any questions regarding these terms, please contact Web Professional Institute Inc. for clarification. diff --git a/02_advanced/projekte/js-advanced-javascript-cafe-template/index.js b/02_advanced/projekte/js-advanced-javascript-cafe-template/index.js deleted file mode 100644 index b74d7a5..0000000 --- a/02_advanced/projekte/js-advanced-javascript-cafe-template/index.js +++ /dev/null @@ -1,76 +0,0 @@ -'use strict'; - -const menu = [ - { - category: 'Beverages', - items: [ - { name: 'Coffee', price: 3.5 }, - { name: 'Tea', price: 2.5 }, - { name: 'Juice', price: 4 }, - ], - }, - { - category: 'Pastries', - items: [ - { name: 'Croissant', price: 2.75 }, - { name: 'Muffin', price: 2.5 }, - { name: 'Bagel', price: 2.25 }, - ], - }, - { - category: 'Sandwiches', - items: [ - { name: 'Ham Sandwich', price: 5.5 }, - { name: 'Veggie Sandwich', price: 5 }, - { name: 'Turkey Sandwich', price: 6 }, - ], - }, -]; - -// ADD YOUR CODE BELOW -const listMenuItems = (menu) => {}; - -const calculateAveragePrice = (menu) => {}; - -const findItemsByCategory = (menu, categoryName) => {}; - -// ===== TEST CASES (DO NOT MODIFY) ===== - -// 1. List All Menu Items -const menuItems = listMenuItems(menu); -console.log('All Menu Items:\n', menuItems); - -// 2. Calculate Average Price -const averagePrice = calculateAveragePrice(menu); -console.log('Average Price of All Items:', averagePrice); - -// 3. Find Items by Category -const searchCategory = 'Pastries'; -const pastries = findItemsByCategory(menu, searchCategory); -console.log(`Items in "${searchCategory}" \nItems:`, pastries); - -/* -===== EXPECTED OUTPUT ===== - -All Menu Items: -[ - 'Coffee', - 'Tea', - 'Juice', - 'Croissant', - 'Muffin', - 'Bagel', - 'Ham Sandwich', - 'Veggie Sandwich', - 'Turkey Sandwich' -] - -Average Price of All Items: 3.78 - -Items in "Pastries" -Items: [ - { name: 'Croissant', price: 2.75 }, - { name: 'Muffin', price: 2.5 }, - { name: 'Bagel', price: 2.25 } -] -*/ diff --git a/02_advanced/uebungen/#u14_avg-scores/index.html b/02_advanced/uebungen/#u14_avg-scores/index.html deleted file mode 100644 index 995b2d3..0000000 --- a/02_advanced/uebungen/#u14_avg-scores/index.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - Übung 14: Durchschnittsnoten berechnen - - - -
    -
    -
    -

    Übung 14: Durchschnittsnoten berechnen

    -

    - Durchschnitt pro Schüler (calculateAvgGrades): Schreibe eine Funktion, die die - Durchschnittsnote jedes Schülers (zeilenweise) berechnet. Das Ergebnis soll ein Array mit den - Durchschnittswerten der Schüler (Anna, Ben, Clara, David) sein. -

    - -

    - Durchschnitt pro Fach (calculateAvgSubjects): Schreibe eine Funktion, die die - Durchschnittsnote jedes Fachs (spaltenweise) berechnet. Das Ergebnis soll ein Array mit den - Durchschnittswerten der Fächer (Mathematics, English, Biology, History) sein. -

    -
    -
    -
    -
    - - - diff --git a/02_advanced/uebungen/u01_transform-name/index.html b/02_advanced/uebungen/u01_transform-name/index.html deleted file mode 100644 index 819a4c0..0000000 --- a/02_advanced/uebungen/u01_transform-name/index.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - Übung 1: Vorname vor Nachname oder Nachname vor Vorname? - - - -
    -
    -
    -

    Übung 1: Vorname vor Nachname oder Nachname vor Vorname?

    -

    - Wenn dich der Name der Übung beim Lesen genauso verwirrt wie uns beim Schreiben, dann liegt das daran, dass - die Reihenfolge von Vor- und Nachnamen nicht immer eindeutig ist. Manchmal heißt es - Max Mustermann und manchmal auch Mustermann, Max. Damit Benutzer der - Funktion logTransformedName (aus der Übung Der transformierte Ladislaus, Teil 2 der letzten Class) nicht - auch so verwirrt sind, stelle sie besser auf named parameters um. -

    -
    -
    -
    - - - diff --git a/02_advanced/uebungen/u02_distance/index.html b/02_advanced/uebungen/u02_distance/index.html deleted file mode 100644 index 0e9bad2..0000000 --- a/02_advanced/uebungen/u02_distance/index.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - Übung 2: Ist es noch weit? Sind wir schon da? - - - -
    -
    -
    -

    Übung 2: Ist es noch weit? Sind wir schon da?

    -

    Die Formel zur Berechnung von Entfernungen lautet:

    - -
    Math.sqrt((yDestination - yOrigin) ** 2 + (xDestination - xOrigin) ** 2);
    -
    -

    Schreibe eine Funktion distance, die du z. B. folgendermaßen aufrufen kannst:

    - -
    distance({ x: 1, y: 1 }, { x: 5, y: 1 }); // => 4
    -
    -
    -
    -
    - - - diff --git a/02_advanced/uebungen/u03_profile-card/index.html b/02_advanced/uebungen/u03_profile-card/index.html deleted file mode 100644 index f498d80..0000000 --- a/02_advanced/uebungen/u03_profile-card/index.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - Übung 3: Profilcard mit destructuring - - - -
    -
    -
    -

    Übung 3: Profilcard mit destructuring

    -

    - Erstelle eine Funktion namens createProfileCard, die die Informationen einer Person - entgegennimmt und daraus eine Bootstrap Card im HTML-Format generiert. Nutze dabei die generatePersonData - Funktion, um die Personendaten zu formatieren. Die Funktion soll so angepasst werden, dass sie Destructuring - für die übergebenen Parameter verwendet. -

    -
    - -
    -
    -
    - - - diff --git a/02_advanced/uebungen/u04_countdown-btn/index.html b/02_advanced/uebungen/u04_countdown-btn/index.html deleted file mode 100644 index 73331f0..0000000 --- a/02_advanced/uebungen/u04_countdown-btn/index.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - Übung 4: Button Countdown mit Settings - - - -
    -
    -
    -

    Übung 4: Button Countdown mit Settings

    -

    - Entwickle einen funktionalen Button, der nach einem Klick einen Countdown in der Schaltfläche anzeigt und - nach Ablauf des Countdowns automatisch wieder aktiviert wird. -

    -

    Szenario

    -

    - Du arbeitest als Frontend-Entwickler für ein Unternehmen, das Online-Formulare für Messeaufträge anbietet. - Um sicherzustellen, dass Benutzer die Formulare nicht versehentlich oder mehrfach absenden, soll ein Button - implementiert werden, der nach dem Absenden für eine bestimmte Zeit (z.B. 5 Sekunden) deaktiviert wird. - Während dieser Zeit soll ein Countdown in der Schaltfläche angezeigt werden, der die verbleibende Zeit bis - zur Reaktivierung des Buttons anzeigt. -

    -

    Aufgaben

    - -
      -
    1. - HTML-Struktur: Erstelle einen einfachen HTML-Button mit einer Klasse (z.B. button-send). -
    2. -
    3. - JavaScript-Funktionalität: -
        -
      • Implementiere einen Event-Listener für den Klick auf den Button.
      • - -
      • Erstelle eine Countdown-Funktion, die beim Klicken auf den Button gestartet wird.
      • - -
      • - Während des Countdowns soll der Button deaktiviert und der aktuelle Countdown-Wert in der Schaltfläche - angezeigt werden. -
      • - -
      • - Nach Ablauf des Countdowns soll der Button wieder aktiviert und der ursprüngliche Text in der - Schaltfläche wiederhergestellt werden. -
      • -
      -
    4. -
    5. - Countdown-Anzeige: Der Countdown soll in der Schaltfläche des Buttons angezeigt werden. - Das Format der Anzeige (z.B. "5...", "4...", "3...") kannst du selbst wählen. -
    6. -
    7. - Deaktivierung: Stelle sicher, dass der Button während des Countdowns deaktiviert ist, um - Mehrfachklicks zu verhindern. -
    8. -
    9. - Reaktivierung: Sobald der Countdown abgelaufen ist, soll der Button automatisch wieder - aktiviert werden. -
    10. -
    11. - Countdown-Wert konfigurierbar machen: Ermögliche es, den Countdown-Wert (z.B. 5 Sekunden) - über ein Settings-Objekt einzustellen. aktiviert werden. -
    12. -
    -

    Viel Erfolg bei der Umsetzung!

    -
    - - -
    -
    - - - diff --git a/02_advanced/uebungen/u05_sum-rekursiv/index.html b/02_advanced/uebungen/u05_sum-rekursiv/index.html deleted file mode 100644 index c2df425..0000000 --- a/02_advanced/uebungen/u05_sum-rekursiv/index.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - Übung 5: Summe einer Zahlenreihe rekursiv berechnen - - - - -
    -
    -
    -

    Übung 5: Summe einer Zahlenreihe rekursiv berechnen

    -

    - Schreibe eine rekursive Funktion in JavaScript, die die Summe aller Zahlen von n bis - 1 berechnet. -

    -

    Hinweise

    - -
      -
    • Definiere einen Basisfall, der die Rekursion beendet.
    • -
    • Der rekursive Fall sollte das Problem in ein kleineres Teilproblem zerlegen.
    • -
    -

    Viel Erfolg bei der Umsetzung!

    -
    -
    -
    - - - diff --git a/02_advanced/uebungen/u06_binomialkoeffizienten/index.html b/02_advanced/uebungen/u06_binomialkoeffizienten/index.html deleted file mode 100644 index 3f309bd..0000000 --- a/02_advanced/uebungen/u06_binomialkoeffizienten/index.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - Optionale Übung 6: Berechnung von Kombinationen mit Rekursion - - - -
    -
    -
    -

    Optionale Übung 6: Berechnung von Kombinationen mit Rekursion

    -

    - Implementiere eine rekursive Funktion in JavaScript, die die Anzahl der Kombinationen berechnet, in denen - man k Elemente aus einer Menge von n Elementen auswählen kann (also den - Binomialkoeffizienten). -

    -

    Hinweise

    - -
      -
    • - Die Formel für Kombinationen lautet:
      -
    • -
    • - Definiere geeignete Basisfälle, zum Beispiel wenn k gleich 0 oder - n ist. -
    • -
    -
    -
    -
    - - - diff --git a/02_advanced/uebungen/u07_string-rekursiv/index.html b/02_advanced/uebungen/u07_string-rekursiv/index.html deleted file mode 100644 index 621bd89..0000000 --- a/02_advanced/uebungen/u07_string-rekursiv/index.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - Übung 7: Rekursive Umkehrung eines Strings - - - -
    -
    -
    -

    Übung 7: Rekursive Umkehrung eines Strings

    -

    Schreibe eine rekursive Funktion in JavaScript, die einen gegebenen String umkehrt.

    -
    -
    -
    - - - diff --git a/02_advanced/uebungen/u08_max-rekursiv/index.html b/02_advanced/uebungen/u08_max-rekursiv/index.html deleted file mode 100644 index f651fcd..0000000 --- a/02_advanced/uebungen/u08_max-rekursiv/index.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - Übung 8: Rekursive Suche des Maximums in einem Array - - - -
    -
    -
    -

    Übung 8: Rekursive Suche des Maximums in einem Array

    -

    - Schreibe eine rekursive Funktion in JavaScript, die das größte Element in einem Array von Zahlen findet. -

    -
    -
    -
    - - - diff --git a/02_advanced/uebungen/u09_level-rekursiv/index.html b/02_advanced/uebungen/u09_level-rekursiv/index.html deleted file mode 100644 index c074db0..0000000 --- a/02_advanced/uebungen/u09_level-rekursiv/index.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - Übung 9: Tiefste Ebene eines verschachtelten Arrays finden - - - -
    -
    -
    -

    Übung 9 (advanced): Tiefste Ebene eines verschachtelten Arrays finden

    -

    - Schreibe eine rekursive Funktion in JavaScript, die die tiefste Ebene eines verschachtelten Arrays bestimmt. - Die Funktion soll die maximale Verschachtelungstiefe des Arrays zurückgeben. -

    -
    -
    -
    - - - diff --git a/02_advanced/uebungen/u10_sum-array-rekursiv/index.html b/02_advanced/uebungen/u10_sum-array-rekursiv/index.html deleted file mode 100644 index 288fbe2..0000000 --- a/02_advanced/uebungen/u10_sum-array-rekursiv/index.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - Übung 10: Summe aller Zahlen in einem verschachtelten Array - - - -
    -
    -
    -

    Übung 10: Summe aller Zahlen in einem verschachtelten Array

    -

    - Schreibe eine rekursive Funktion in JavaScript, die die Summe aller Zahlen in einem verschachtelten Array - berechnet. Das Array kann beliebig tief verschachtelt sein und enthält nur Zahlen oder weitere Arrays. -

    -
    -
    -
    - - - diff --git a/02_advanced/uebungen/u11_pyramide-break.zip b/02_advanced/uebungen/u11_pyramide-break.zip deleted file mode 100644 index 7a88501..0000000 Binary files a/02_advanced/uebungen/u11_pyramide-break.zip and /dev/null differ diff --git a/02_advanced/uebungen/u11_pyramide-break/index.js b/02_advanced/uebungen/u11_pyramide-break/index.js deleted file mode 100644 index 1698d2a..0000000 --- a/02_advanced/uebungen/u11_pyramide-break/index.js +++ /dev/null @@ -1,61 +0,0 @@ -// Variante 1 - -const sentence = 'Dies ist eine Übung um der callback Hölle zu entkommen.'; - -const printWords = (sentence) => { - const wordArr = sentence.split(' '); - - for (let i = 0; i < wordArr.length; i++) { - setTimeout(() => { - console.log(wordArr[i]); - }, 1000 * i); - } -}; - -const printWordsRek = (sentence, idxWort = 0) => { - const wordArr = sentence.split(' '); - - // Basis-Fall - if (idxWort >= wordArr.length) { - return ''; - } - - // rekursiver mist :) - setTimeout(() => { - printWordsRek(sentence, idxWort + 1); - }, 1000); - - // Ausgabe des Wortes - console.log(wordArr[idxWort]); -}; - -printWords(sentence); -printWordsRek(sentence); - -// setTimeout(() => { -// console.log('The'); - -// setTimeout(() => { -// console.log('pyramid'); - -// setTimeout(() => { -// console.log('of'); - -// setTimeout(() => { -// console.log('doom'); - -// setTimeout(() => { -// console.log('keeps'); - -// setTimeout(() => { -// console.log('growing.'); -// }, 1000); -// }, 1000); -// }, 1000); -// }, 1000); -// }, 1000); -// }, 1000); - -// Übung 11: Die Pyramide abbrechen - -// Schreibe das Codebeispiel 96 so um, dass keine Pyramide entsteht. Benutze dazu, wie im Text angedeutet, eine Funktion, die das n-te Wort ausgibt und sich per setTimeout(…) mit n + 1 als Parameter aufruft, solange noch Wörter im Satz vorhanden sind. diff --git a/02_advanced/uebungen/u12_mehrere-dateien-auslesen/data/file01.txt b/02_advanced/uebungen/u12_mehrere-dateien-auslesen/data/file01.txt deleted file mode 100644 index e6c377d..0000000 --- a/02_advanced/uebungen/u12_mehrere-dateien-auslesen/data/file01.txt +++ /dev/null @@ -1 +0,0 @@ -Ich bin file 01 \ No newline at end of file diff --git a/02_advanced/uebungen/u12_mehrere-dateien-auslesen/data/file02.txt b/02_advanced/uebungen/u12_mehrere-dateien-auslesen/data/file02.txt deleted file mode 100644 index 68d1965..0000000 --- a/02_advanced/uebungen/u12_mehrere-dateien-auslesen/data/file02.txt +++ /dev/null @@ -1 +0,0 @@ -Ich bin file 02 \ No newline at end of file diff --git a/02_advanced/uebungen/u12_mehrere-dateien-auslesen/data/file03.txt b/02_advanced/uebungen/u12_mehrere-dateien-auslesen/data/file03.txt deleted file mode 100644 index 47225cc..0000000 --- a/02_advanced/uebungen/u12_mehrere-dateien-auslesen/data/file03.txt +++ /dev/null @@ -1 +0,0 @@ -Ich bin file 03 \ No newline at end of file diff --git a/02_advanced/uebungen/u12_mehrere-dateien-auslesen/data/file04.txt b/02_advanced/uebungen/u12_mehrere-dateien-auslesen/data/file04.txt deleted file mode 100644 index e33d153..0000000 --- a/02_advanced/uebungen/u12_mehrere-dateien-auslesen/data/file04.txt +++ /dev/null @@ -1 +0,0 @@ -Ich bin file 04 \ No newline at end of file diff --git a/02_advanced/uebungen/u12_mehrere-dateien-auslesen/data/file05.txt b/02_advanced/uebungen/u12_mehrere-dateien-auslesen/data/file05.txt deleted file mode 100644 index ad9f9c3..0000000 --- a/02_advanced/uebungen/u12_mehrere-dateien-auslesen/data/file05.txt +++ /dev/null @@ -1 +0,0 @@ -Ich bin file 05 \ No newline at end of file diff --git a/02_advanced/uebungen/u12_mehrere-dateien-auslesen/data/file06.txt b/02_advanced/uebungen/u12_mehrere-dateien-auslesen/data/file06.txt deleted file mode 100644 index e1d09b7..0000000 --- a/02_advanced/uebungen/u12_mehrere-dateien-auslesen/data/file06.txt +++ /dev/null @@ -1 +0,0 @@ -Ich bin file 06 \ No newline at end of file diff --git a/02_advanced/uebungen/u12_mehrere-dateien-auslesen/index.js b/02_advanced/uebungen/u12_mehrere-dateien-auslesen/index.js deleted file mode 100644 index 4bc173c..0000000 --- a/02_advanced/uebungen/u12_mehrere-dateien-auslesen/index.js +++ /dev/null @@ -1,29 +0,0 @@ -// const fs = require('node:fs'); // commonjs -import fs from 'node:fs'; // esm - module Schreibweise - -const getFileBy = (path, encoding = 'utf-8') => { - return new Promise((resolve, reject) => { - // async process - fs.readFile(path, encoding, (error, data) => { - if (error) { - reject(error); - } - resolve(data); - }); - }); -}; - -Promise.all([ - getFileBy('data/file01.txt'), - getFileBy('data/file02.txt'), - getFileBy('data/file03.txt'), - getFileBy('data/file04.txt'), - getFileBy('data/file05.txt'), - getFileBy('data/file06.txt'), -]) - .then((data) => { - console.log(data); - }) - .catch((err) => { - console.log(err); - }); diff --git a/02_advanced/uebungen/u12_mehrere-dateien-auslesen/package.json b/02_advanced/uebungen/u12_mehrere-dateien-auslesen/package.json deleted file mode 100644 index 5a98782..0000000 --- a/02_advanced/uebungen/u12_mehrere-dateien-auslesen/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "u12_mehrere-dateien-auslesen", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "module" -} diff --git a/02_advanced/uebungen/u13_dns-lookup/index.js b/02_advanced/uebungen/u13_dns-lookup/index.js deleted file mode 100644 index 21cbe70..0000000 --- a/02_advanced/uebungen/u13_dns-lookup/index.js +++ /dev/null @@ -1,54 +0,0 @@ -// const dns = require('node:dns'); // commonjs -import dns from 'node:dns'; // esm module -import util from 'node:util'; -import color from 'chalk'; - -const IP_V = 4; // we use IP protocol version 4 -const URL = 'google.de'; - -const getIpBy = (url, ipVersion = 4) => { - return new Promise((resolve, reject) => { - // async process - dns.lookup(url, ipVersion, (error, address) => { - if (error) { - reject(error); - } else { - resolve({ address: address, family: ipVersion }); - } - }); - }); -}; - -// Promises Unterobjekt von Node -const getPromisesIpBy = (url, ipVersion = 4) => { - // async process - return dns.promises.lookup(url, ipVersion); -}; - -// Promisify Helferfunktion -const getPromisifyIpBy = util.promisify(dns.lookup); - -// Test Cases: -getIpBy(URL, IP_V) - .then((data) => { - console.log(data); - }) - .catch((err) => { - console.log(color.red(err)); - }); - -getPromisesIpBy(URL) - .then((data) => { - console.log(data); - }) - .catch((err) => { - console.log(color.red(err)); - }); - -getPromisifyIpBy(URL, IP_V) - .then((data) => { - console.log(data); - }) - .catch((err) => { - console.log(color.red(err)); - }); diff --git a/02_advanced/uebungen/u13_dns-lookup/package-lock.json b/02_advanced/uebungen/u13_dns-lookup/package-lock.json deleted file mode 100644 index 2701339..0000000 --- a/02_advanced/uebungen/u13_dns-lookup/package-lock.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "u13_dns-lookup", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "u13_dns-lookup", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "chalk": "^5.6.2" - } - }, - "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - } - } -} diff --git a/02_advanced/uebungen/u13_dns-lookup/package.json b/02_advanced/uebungen/u13_dns-lookup/package.json deleted file mode 100644 index ff2ddb6..0000000 --- a/02_advanced/uebungen/u13_dns-lookup/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "u13_dns-lookup", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "module", - "dependencies": { - "chalk": "^5.6.2" - } -} diff --git a/02_advanced/uebungen/u15_shopping-list/index.html b/02_advanced/uebungen/u15_shopping-list/index.html deleted file mode 100644 index ebed89b..0000000 --- a/02_advanced/uebungen/u15_shopping-list/index.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - Übung 15: Einkaufsliste bearbeiten - - - -
    -
    -
    -

    Übung 15: Einkaufsliste bearbeiten

    -

    - Erstelle eine Einkaufsliste als zweidimensionales Array mit Kategorien und Artikeln. Führe folgende - Änderungen durch: -

    - -
      -
    1. Entferne das zweite Element aus jeder Kategorie.
    2. -
    3. Füge jeweils ein neues Element hinzu.
    4. -
    -
    -
    -
    - - - diff --git a/02_advanced/uebungen/u16_geoquiz/index.html b/02_advanced/uebungen/u16_geoquiz/index.html deleted file mode 100644 index 8d3de98..0000000 --- a/02_advanced/uebungen/u16_geoquiz/index.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - Übung 16: Geoquiz - - - -
    -
    -
    -

    Übung 16: Geoquiz

    -

    - Eine Schule gibt die Entwicklung eines Geoquiz in Auftrag, bei dem Schüler die Hauptstädte verschiedener - Staaten nennen müssen. Deine Aufgabe besteht in der Entwicklung der Lösungsfunktion - getCapitalOf, die eine Hauptstadt zum übergebenen Staat (country) zurückliefert. -

    - -
      -
    1. Entferne das zweite Element aus jeder Kategorie.
    2. -
    3. Füge jeweils ein neues Element hinzu.
    4. -
    -
    -
    -
    - - - diff --git a/02_advanced/uebungen/u17_inventory-modification/index.html b/02_advanced/uebungen/u17_inventory-modification/index.html deleted file mode 100644 index 39ef653..0000000 --- a/02_advanced/uebungen/u17_inventory-modification/index.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - Übung 17: Lagerbestand erweitern - - - -
    -
    -
    -

    Übung 17: Lagerbestand erweitern

    -

    - Füge eine neue Kategorie «Books» zu dem bestehenden dreidimensionalen Lagerbestandssystem - hinzu und trage zwei neue Produkte mit deren Lagerorten und Mengen ein. -

    -
    -
    -
    - - - diff --git a/02_advanced/uebungen/u18_3d-array-selection/index.html b/02_advanced/uebungen/u18_3d-array-selection/index.html deleted file mode 100644 index aa5ef26..0000000 --- a/02_advanced/uebungen/u18_3d-array-selection/index.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - Übung 18: 3D Array Zugriff - - - -
    -
    -
    -

    Übung 18: 3D Array Zugriff

    -

    - Greife auf das zweite Produkt in der «Clothing»-Kategorie zu und ändere die Menge von - «Jeans» von 30 auf 25. -

    -
    -
    -
    - - - diff --git a/02_advanced/uebungen/u19_brightness-increase/index.html b/02_advanced/uebungen/u19_brightness-increase/index.html deleted file mode 100644 index 24218d9..0000000 --- a/02_advanced/uebungen/u19_brightness-increase/index.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - Übung 19: Bildbearbeitung – Helligkeit erhöhen - - - -
    -
    -
    -

    Übung 19: Bildbearbeitung – Helligkeit erhöhen

    -

    - Schreibe eine Funktion increaseBrightness, die die Helligkeit aller Pixel in einem 3D Bildarray - um einen bestimmten Wert erhöht. Stelle sicher, dass die RGB-Werte nicht über 255 hinausgehen. -

    -

    - Die Funktion nimmt ein dreidimensionales Array image und einen Wert value als - Parameter. Ziel ist es, die Helligkeit jedes Pixels im Bild zu erhöhen, indem jeder RGB-Wert um - value erhöht wird. Stelle dabe sicher, dass kein RGB-Wert den maximalen Wert von - 255 überschreitet. -

    -
    -
    -
    - - - diff --git a/02_advanced/uebungen/u20_geoquiz-2/index.html b/02_advanced/uebungen/u20_geoquiz-2/index.html deleted file mode 100644 index 72bf11f..0000000 --- a/02_advanced/uebungen/u20_geoquiz-2/index.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - Übung 20: Geoquiz — Teil 2 - - - -
    -
    -
    -

    Übung 20: Geoquiz — Teil 2

    -

    - In der erweiterten Ausbaustufe sollen die Schüler den Staat zu einer Hauptstadt nennen. Deine Aufgabe ist es - erneut, eine Lösungsfunktion zu programmieren. Dieses Mal nimmt getCountryForCapital eine - Hauptstadt (capital) entgegen und liefert den zugehörigen Staat zurück. -

    -

    - Die Funktion soll auf die bestehende Konstante countriesWithCapital zugreifen. Es ist nicht - erlaubt, die Struktur der Daten in der Konstante zu ändern. -

    -
    -
    -
    - - - diff --git a/02_advanced/uebungen/u21_pokemon-evolution/index.html b/02_advanced/uebungen/u21_pokemon-evolution/index.html deleted file mode 100644 index 5a0c1f4..0000000 --- a/02_advanced/uebungen/u21_pokemon-evolution/index.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - Übung 21: Pokémon — Evolution - - - -
    -
    -
    -

    Übung 21: Pokémon — Evolution

    -

    - Kennst du Pokémon? Allen Pokémon-Spielen ist gemein, dass es Pokémon (Phantasiewesen) gibt, die über - verschiedene Evolutionsstufen verfügen. Ein Pokémon kann sich bis zu zweimal weiterentwickeln. D. h. es gibt - maximal drei Stufen: seine Anfangsstufe und bis zu zwei Folgestufen. Jede dieser Stufen trägt einen neuen - Pokémon-Namen — keiner dieser Namen kann doppelt vorkommen. Einen guten Überblick über die Stufen bei - Pokémon GO findest du auf https://pokemondb.net/evolution. -

    -
      -
    1. - Schreibe eine Funktion stagesFor, der du eine Pokémon-Evolutionsstufe übergibst und die dir - alle dazugehörigen Evolutionsstufen als Array zurückliefert. Als Daten verwendest du exemplarisch die - Evolutionsstufen von Pidgey, Vulpix und Dratini. -
    2. -
    3. - Entwickle die Funktionen stagesAfter und stagesBefore, die dir nur die Stufen - vor bzw. nach der angefragten Stufe zurückliefern. -
    4. -
    -
    -
    -
    - - - diff --git a/02_advanced/uebungen/u22_cocktail-mixing-2/index.html b/02_advanced/uebungen/u22_cocktail-mixing-2/index.html deleted file mode 100644 index 0cf1ab5..0000000 --- a/02_advanced/uebungen/u22_cocktail-mixing-2/index.html +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - Übung 22: Fröhliches Mixen mit Arrays - - - -
    -
    -
    -

    Übung 22: Fröhliches Mixen mit Arrays

    -

    - Du möchtest mal wieder Cocktails mixen. Aber heute konntest du dich nicht so recht für einen bestimmten - Cocktail entscheiden. Am besten wäre es, wenn du aus mehreren Rezepten herausfinden könntest, für welches du - die passenden Zutaten vorrätig hast. Nun wird es etwas kniffliger, denn du benötigst ein Array, das die - Rezepte wiederum in Form von Arrays aus Zutaten enthält. -

    -

    Die Konsole soll die Zutaten des ersten gefundenen Cocktails loggen.

    -
    -
    -
    - - - diff --git a/02_advanced/uebungen/u23_fetch-users/index.html b/02_advanced/uebungen/u23_fetch-users/index.html deleted file mode 100644 index 4f120cf..0000000 --- a/02_advanced/uebungen/u23_fetch-users/index.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - Übung 23: Fetch API – Einfache Datenabfrage - - - -
    -
    -
    -

    Übung 23: Fetch API – Einfache Datenabfrage

    -

    - Erstelle eine Funktion fetchUsers, die mithilfe der Fetch API eine Liste von Benutzern von der - DummyJSON-API abruft. Verwende async/await und try/catch, um Netzwerkfehler abzufangen. Die abgerufenen - Daten sollen dann in der Konsole ausgegeben werden. -

    -

    - Hinweis: Verwende die URL - https://dummyjson.com/users für den Fetch-Aufruf. -

    -
    -
    -
    -
    - - - diff --git a/02_advanced/uebungen/u24_obj-in-json/index.html b/02_advanced/uebungen/u24_obj-in-json/index.html deleted file mode 100644 index 0f51036..0000000 --- a/02_advanced/uebungen/u24_obj-in-json/index.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - Übung 24: Objekt in JSON umwandeln - - - -
    -
    -
    -

    Übung 24: Objekt in JSON umwandeln

    -

    - Gegeben ist ein JavaScript-Objekt book. Konvertiere dieses Objekt in einen JSON-String und - parse anschließend die Zeichenkette zurück in ein JavaScript-Objekt. Gib den Titel und den Autor des Buches - in der Konsole aus. -

    -

    Folgendes sollte in der Konsole ausgegeben werden:

    - - -
    -// JSON-String
    -{"title":"The Great Gatsby","author":"F. Scott Fitzgerald","year":1925}
    -
    -// JavaScript Object
    -The Great Gatsby
    -F. Scott Fitzgerald
    -            
    -
    -
    -
    -
    - - - diff --git a/02_advanced/uebungen/u25_csv-quotes/README.md b/02_advanced/uebungen/u25_csv-quotes/README.md deleted file mode 100644 index 4f034ff..0000000 --- a/02_advanced/uebungen/u25_csv-quotes/README.md +++ /dev/null @@ -1,15 +0,0 @@ -## Übung 25: CSV-Datensätze mit Anführungszeichen - -Bisher haben wir die Felder in einem CSV-Datensatz einfach mit der Anweisung: - -```js -record.split(','); -``` - -in einzelne Felder zerlegt. In der Praxis kann es aber vorkommen, dass ein einzelnes Feld ein Komma enthält. Das Problem wird üblicherweise gelöst, indem die einzelnen Felder noch mit Anführungszeichen umgeben werden. Hier ist ein Beispiel: - -```js -'very big, soft computer mouse', 'the cutest peripheral ever', '10', '39.90'; -``` - -Das erste Feld enthält ein Komma (very big, soft computer mouse), trotzdem ist die Unterteilung eindeutig. Schreibe ein kurzes Programm, das diesen Datensatz korrekt zerlegt und die einzelnen Felder ausgibt: diff --git a/02_advanced/uebungen/u25_csv-quotes/index.js b/02_advanced/uebungen/u25_csv-quotes/index.js deleted file mode 100644 index 6752fbd..0000000 --- a/02_advanced/uebungen/u25_csv-quotes/index.js +++ /dev/null @@ -1,14 +0,0 @@ -const csvStr = "'very big, soft computer mouse', 'the cutest peripheral ever', '10', '39.90'"; - -console.log(csvStr.slice(1, csvStr.length - 1).split(/', '/)); - -// Übung 25: CSV-Datensätze mit Anführungszeichen -// Bisher haben wir die Felder in einem CSV-Datensatz einfach mit der Anweisung: - -// record.split(',') - -// in einzelne Felder zerlegt. In der Praxis kann es aber vorkommen, dass ein einzelnes Feld ein Komma enthält. Das Problem wird üblicherweise gelöst, indem die einzelnen Felder noch mit Anführungszeichen umgeben werden. Hier ist ein Beispiel: - -// 'very big, soft computer mouse', 'the cutest peripheral ever', '10', '39.90' - -// Das erste Feld enthält ein Komma (very big, soft computer mouse), trotzdem ist die Unterteilung eindeutig. Schreibe ein kurzes Programm, das diesen Datensatz korrekt zerlegt und die einzelnen Felder ausgibt: diff --git a/02_advanced/uebungen/u26_csv-quotes2/Regex-erklaerung.md b/02_advanced/uebungen/u26_csv-quotes2/Regex-erklaerung.md deleted file mode 100644 index f8e11a3..0000000 --- a/02_advanced/uebungen/u26_csv-quotes2/Regex-erklaerung.md +++ /dev/null @@ -1,51 +0,0 @@ -# Regex Beispiel - -Am besten löst man das mit einem regulären Ausdruck, der entweder nach **Inhalten in Anführungszeichen** sucht _oder_ nach **Inhalten ohne Kommas**. - -Hier ist der passende Reguläre Ausdruck: - -`/"([^"\\]*(?:\\.[^"\\]*)*)"|([^,]+)/g` - ---- - -### Wie der Regex funktioniert - -Der Ausdruck nutzt das **ODER-Prinzip (`|`)**, um zwei Szenarien zu matchen: - -1. **`"([^"\\]*(?:\\.[^"\\]*)*)"` (Gruppe 1):** Matcht alles, was in doppelten Anführungszeichen steht. Er erlaubt sogar escaped Anführungszeichen (`\"`) im Text. -2. **`([^,]+)` (Gruppe 2):** Wenn keine Anführungszeichen da sind, matcht er alles bis zum nächsten Komma. - ---- - -### Anwendung in JavaScript (Beispiel) - -Da du das Ergebnis sicherlich in einem Array von einzelnen Werten brauchst, kannst du den Regex wie folgt anwenden. Hierbei nutzen wir `matchAll`, um die Treffer sauber zu trennen und die Anführungszeichen direkt zu entfernen: - -```javascript -const input = '"very big, soft computer mouse","the cutest peripheral ever",10,39.90'; -const regex = /"([^"\\]*(?:\\.[^"\\]*)*)"|([^,]+)/g; - -const matches = [...input.matchAll(regex)]; - -const result = matches.map((match) => { - // Wenn Gruppe 1 existiert, war es ein String in Anführungszeichen - // Wenn Gruppe 2 existiert, war es ein unberührter Wert (Zahl) - const value = match[1] !== undefined ? match[1] : match[2].trim(); - - // Optional: Datentypen konvertieren - if (!isNaN(value) && value !== '') { - return Number(value); - } - return value; -}); - -console.log(result); -``` - -### Das Ergebnis (Output) - -Nach dem Parsen erhältst du ein sauberes Array, bei dem die Kommas innerhalb der Strings ignoriert wurden und die Zahlen einsatzbereit sind: - -```json -["very big, soft computer mouse", "the cutest peripheral ever", 10, 39.9] -``` diff --git a/02_advanced/uebungen/u26_csv-quotes2/data/csvDatei.csv b/02_advanced/uebungen/u26_csv-quotes2/data/csvDatei.csv deleted file mode 100644 index bb9c3a2..0000000 --- a/02_advanced/uebungen/u26_csv-quotes2/data/csvDatei.csv +++ /dev/null @@ -1 +0,0 @@ -"very big, soft computer mouse","the cutest peripheral ever",10,39.90 \ No newline at end of file diff --git a/02_advanced/uebungen/u26_csv-quotes2/data/products.csv b/02_advanced/uebungen/u26_csv-quotes2/data/products.csv deleted file mode 100644 index 0c68aaa..0000000 --- a/02_advanced/uebungen/u26_csv-quotes2/data/products.csv +++ /dev/null @@ -1,11 +0,0 @@ -Code,Short Description,Tagline,Quantity,Price -MUG0007,coffee mug with LCD level indicator,never again reach for the empty mug,20,49.90 -MUG0013,coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling,put the smart into coffee reading,20,99.90 -OFF3145,pen with pre-warmed ink (tested on the South Pole),the pen is mightier than the cold,50,29.90 -COM1001,ambidextrous computer mouse,end the dictate of left and right,10,19.90 -COM0404,Easter egg themed webcam for your monitor,put an Easter egg on hardware too,20,149.90 -COM0001,Vulcan language vi cheatsheet,learn vi and Vulcan at the same time,3,9.90 -COM1536,Klingon language emacs cheatsheet,learn emacs and Klingon at the same time,50,9.90 -MOB0555,smartphone case with built-in screen,never miss a message,20,39.90 - - diff --git a/02_advanced/uebungen/u26_csv-quotes2/index-andreas.js b/02_advanced/uebungen/u26_csv-quotes2/index-andreas.js deleted file mode 100644 index 097aaf1..0000000 --- a/02_advanced/uebungen/u26_csv-quotes2/index-andreas.js +++ /dev/null @@ -1,58 +0,0 @@ -import fs from 'node:fs'; -import color from 'chalk'; - -const data = fs.readFileSync('data/products.csv', 'utf-8'); -const productAr = data.split('\n').map((row) => row.replace('\n', '')); -const headerAr = productAr.shift().split(/\s*,\s*/); - -console.log(productAr); - -// console.log(headerAr); -// console.log('======='); -// console.log(productAr); - -const convertCsvToJson = (products, headerAr) => { - let jsonStr = '[\n'; - - products.forEach((row, idxRow) => { - jsonStr += ' {\n'; - row - .trim() - .split(',') - .forEach((elem, idxElem, ar) => { - if (ar.length === idxElem + 1) { - if (isNaN(elem)) { - jsonStr += ` "${headerAr[idxElem]}": "${elem}"\n`; - } else { - jsonStr += ` "${headerAr[idxElem]}": ${Number(elem)}\n`; - } - } else { - if (isNaN(elem)) { - jsonStr += ` "${headerAr[idxElem]}": "${elem}",\n`; - } else { - jsonStr += ` "${headerAr[idxElem]}": ${Number(elem)},\n`; - } - } - }); - - if (products.length === idxRow + 1) { - jsonStr += ` }\n`; - } else { - jsonStr += ` },\n`; - } - }); - - jsonStr += ']'; - - console.log(color.yellow(`${jsonStr}`)); - - fs.writeFile('products.json', jsonStr, 'utf-8', (err) => { - if (err) { - console.log(err); - } else { - console.log(color.green('file created!')); - } - }); -}; - -convertCsvToJson(productAr, headerAr); diff --git a/02_advanced/uebungen/u26_csv-quotes2/index-ersin.js b/02_advanced/uebungen/u26_csv-quotes2/index-ersin.js deleted file mode 100644 index 20f7d5f..0000000 --- a/02_advanced/uebungen/u26_csv-quotes2/index-ersin.js +++ /dev/null @@ -1,21 +0,0 @@ -import fs from 'node:fs'; -import papa from 'papaparse'; - -//https://www.npmjs.com/package/papaparse - -const data = fs.readFileSync('data/csvDatei.csv', 'utf-8').trim(); - -const parsed = papa.parse(data, { - dynamicTyping: true, -}); - -const dataRow = parsed.data[0]; - -const result = { - name: dataRow[0], - description: dataRow[1], - quantity: dataRow[2], - price: dataRow[3], -}; - -console.log(JSON.stringify(result, null, 2)); diff --git a/02_advanced/uebungen/u26_csv-quotes2/index-phil.js b/02_advanced/uebungen/u26_csv-quotes2/index-phil.js deleted file mode 100644 index 3d34be8..0000000 --- a/02_advanced/uebungen/u26_csv-quotes2/index-phil.js +++ /dev/null @@ -1,62 +0,0 @@ -import fs from 'node:fs'; -import color from 'chalk'; - -const data = fs.readFileSync('data/products.csv', 'utf-8'); - -const toCamelCase = (str) => { - return str - .trim() - .toLowerCase() - .replace(/[^a-zA-Z0-9]+(.)/g, (match, chr) => chr.toUpperCase()); -}; - -const convertCsvToJson = (products, ar) => { - const resultAr = products.map((str) => { - const fields = str.split(/\s*,\s*/); - - const labels = ar.map((label, idx) => { - return [label, isNaN(fields[idx]) ? fields[idx] : Number(fields[idx])]; - }); - - const obj = Object.fromEntries(labels); - - // console.log(labels); // Entries Array - //console.log(obj); - - return obj; - - // return { - // [ar[0]]: fields[0], - // [ar[1]]: fields[1], - // [ar[2]]: fields[2], - // [ar[3]]: Number(fields[3]), - // [ar[4]]: Number(fields[4]), - // }; - }); - // console.log(resultAr); - - const jsonStr = JSON.stringify(resultAr, '', 2); - - fs.writeFile('products.json', jsonStr, 'utf-8', (err) => { - if (err) { - console.log(err); - } else { - console.log(color.green('file created!')); - } - }); -}; - -const productAr = data - .split('\n') - .map((row) => row.replace('\n', '')) - .filter((row) => row !== ''); - -const headerAr = productAr - .shift() - .split(/\s*,\s*/) - .map(toCamelCase); - -// console.log('======='); -// console.log(productAr); - -convertCsvToJson(productAr, headerAr); diff --git a/02_advanced/uebungen/u26_csv-quotes2/index.js b/02_advanced/uebungen/u26_csv-quotes2/index.js deleted file mode 100644 index 72846e5..0000000 --- a/02_advanced/uebungen/u26_csv-quotes2/index.js +++ /dev/null @@ -1,23 +0,0 @@ -// Übung 26: CSV-Datensätze mit Anführungszeichen — Teil 2 -// In der Praxis finden sich auch CSV-Datensätze, in denen manche Felder mit Anführungszeichen umgeben sind und manche nicht. - -// Schreibe ein Programm, das auch mit diesen Fällen zurechtkommt. Folgender Datensatz soll korrekt zerlegt werden: - -const mixedCSV = '"very big, soft computer mouse","the cutest peripheral ever",10,39.90'; -const regex = /"([^"\\]*(?:\\.[^"\\]*)*)"|([^,]+)/g; - -const matches = [...mixedCSV.matchAll(regex)]; - -const result = matches.map((match) => { - // Wenn Gruppe 1 existiert, war es ein String in Anführungszeichen - // Wenn Gruppe 2 existiert, war es ein unberührter Wert (Zahl) - const value = match[1] !== undefined ? match[1] : match[2].trim(); - - // Optional: Datentypen konvertieren - if (!isNaN(value) && value !== '') { - return Number(value); - } - return value; -}); - -console.log(result); diff --git a/02_advanced/uebungen/u26_csv-quotes2/package-lock.json b/02_advanced/uebungen/u26_csv-quotes2/package-lock.json deleted file mode 100644 index 23c37fa..0000000 --- a/02_advanced/uebungen/u26_csv-quotes2/package-lock.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "u26_csv-quotes2", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "u26_csv-quotes2", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "chalk": "^5.6.2", - "papaparse": "^5.5.4" - } - }, - "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/papaparse": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.5.4.tgz", - "integrity": "sha512-SwzWD9gl/ElwYLCI0nUja1mFJzjq2D8ziShfNBa7zCHzkOozeOGDwHWQ+tvCzEZcewecWZ5U7kUopDnG+DFYEQ==", - "license": "MIT" - } - } -} diff --git a/02_advanced/uebungen/u26_csv-quotes2/package.json b/02_advanced/uebungen/u26_csv-quotes2/package.json deleted file mode 100644 index cea6b4b..0000000 --- a/02_advanced/uebungen/u26_csv-quotes2/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "u26_csv-quotes2", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "module", - "dependencies": { - "chalk": "^5.6.2", - "papaparse": "^5.5.4" - } -} diff --git a/02_advanced/uebungen/u26_csv-quotes2/products.json b/02_advanced/uebungen/u26_csv-quotes2/products.json deleted file mode 100644 index df6d194..0000000 --- a/02_advanced/uebungen/u26_csv-quotes2/products.json +++ /dev/null @@ -1,58 +0,0 @@ -[ - { - "code": "MUG0007", - "shortDescription": "coffee mug with LCD level indicator", - "tagline": "never again reach for the empty mug", - "quantity": 20, - "price": 49.9 - }, - { - "code": "MUG0013", - "shortDescription": "coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling", - "tagline": "put the smart into coffee reading", - "quantity": 20, - "price": 99.9 - }, - { - "code": "OFF3145", - "shortDescription": "pen with pre-warmed ink (tested on the South Pole)", - "tagline": "the pen is mightier than the cold", - "quantity": 50, - "price": 29.9 - }, - { - "code": "COM1001", - "shortDescription": "ambidextrous computer mouse", - "tagline": "end the dictate of left and right", - "quantity": 10, - "price": 19.9 - }, - { - "code": "COM0404", - "shortDescription": "Easter egg themed webcam for your monitor", - "tagline": "put an Easter egg on hardware too", - "quantity": 20, - "price": 149.9 - }, - { - "code": "COM0001", - "shortDescription": "Vulcan language vi cheatsheet", - "tagline": "learn vi and Vulcan at the same time", - "quantity": 3, - "price": 9.9 - }, - { - "code": "COM1536", - "shortDescription": "Klingon language emacs cheatsheet", - "tagline": "learn emacs and Klingon at the same time", - "quantity": 50, - "price": 9.9 - }, - { - "code": "MOB0555", - "shortDescription": "smartphone case with built-in screen", - "tagline": "never miss a message", - "quantity": 20, - "price": 39.9 - } -] \ No newline at end of file diff --git a/02_advanced/uebungen/u27_zlip.zip b/02_advanced/uebungen/u27_zlip.zip deleted file mode 100644 index 3a52c5d..0000000 Binary files a/02_advanced/uebungen/u27_zlip.zip and /dev/null differ diff --git a/02_advanced/uebungen/u27_zlip/Regex-erklaerung.md b/02_advanced/uebungen/u27_zlip/Regex-erklaerung.md deleted file mode 100644 index f8e11a3..0000000 --- a/02_advanced/uebungen/u27_zlip/Regex-erklaerung.md +++ /dev/null @@ -1,51 +0,0 @@ -# Regex Beispiel - -Am besten löst man das mit einem regulären Ausdruck, der entweder nach **Inhalten in Anführungszeichen** sucht _oder_ nach **Inhalten ohne Kommas**. - -Hier ist der passende Reguläre Ausdruck: - -`/"([^"\\]*(?:\\.[^"\\]*)*)"|([^,]+)/g` - ---- - -### Wie der Regex funktioniert - -Der Ausdruck nutzt das **ODER-Prinzip (`|`)**, um zwei Szenarien zu matchen: - -1. **`"([^"\\]*(?:\\.[^"\\]*)*)"` (Gruppe 1):** Matcht alles, was in doppelten Anführungszeichen steht. Er erlaubt sogar escaped Anführungszeichen (`\"`) im Text. -2. **`([^,]+)` (Gruppe 2):** Wenn keine Anführungszeichen da sind, matcht er alles bis zum nächsten Komma. - ---- - -### Anwendung in JavaScript (Beispiel) - -Da du das Ergebnis sicherlich in einem Array von einzelnen Werten brauchst, kannst du den Regex wie folgt anwenden. Hierbei nutzen wir `matchAll`, um die Treffer sauber zu trennen und die Anführungszeichen direkt zu entfernen: - -```javascript -const input = '"very big, soft computer mouse","the cutest peripheral ever",10,39.90'; -const regex = /"([^"\\]*(?:\\.[^"\\]*)*)"|([^,]+)/g; - -const matches = [...input.matchAll(regex)]; - -const result = matches.map((match) => { - // Wenn Gruppe 1 existiert, war es ein String in Anführungszeichen - // Wenn Gruppe 2 existiert, war es ein unberührter Wert (Zahl) - const value = match[1] !== undefined ? match[1] : match[2].trim(); - - // Optional: Datentypen konvertieren - if (!isNaN(value) && value !== '') { - return Number(value); - } - return value; -}); - -console.log(result); -``` - -### Das Ergebnis (Output) - -Nach dem Parsen erhältst du ein sauberes Array, bei dem die Kommas innerhalb der Strings ignoriert wurden und die Zahlen einsatzbereit sind: - -```json -["very big, soft computer mouse", "the cutest peripheral ever", 10, 39.9] -``` diff --git a/02_advanced/uebungen/u27_zlip/data/csvDatei.csv b/02_advanced/uebungen/u27_zlip/data/csvDatei.csv deleted file mode 100644 index bb9c3a2..0000000 --- a/02_advanced/uebungen/u27_zlip/data/csvDatei.csv +++ /dev/null @@ -1 +0,0 @@ -"very big, soft computer mouse","the cutest peripheral ever",10,39.90 \ No newline at end of file diff --git a/02_advanced/uebungen/u27_zlip/data/products.csv b/02_advanced/uebungen/u27_zlip/data/products.csv deleted file mode 100644 index 0c68aaa..0000000 --- a/02_advanced/uebungen/u27_zlip/data/products.csv +++ /dev/null @@ -1,11 +0,0 @@ -Code,Short Description,Tagline,Quantity,Price -MUG0007,coffee mug with LCD level indicator,never again reach for the empty mug,20,49.90 -MUG0013,coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling,put the smart into coffee reading,20,99.90 -OFF3145,pen with pre-warmed ink (tested on the South Pole),the pen is mightier than the cold,50,29.90 -COM1001,ambidextrous computer mouse,end the dictate of left and right,10,19.90 -COM0404,Easter egg themed webcam for your monitor,put an Easter egg on hardware too,20,149.90 -COM0001,Vulcan language vi cheatsheet,learn vi and Vulcan at the same time,3,9.90 -COM1536,Klingon language emacs cheatsheet,learn emacs and Klingon at the same time,50,9.90 -MOB0555,smartphone case with built-in screen,never miss a message,20,39.90 - - diff --git a/02_advanced/uebungen/u27_zlip/index.js b/02_advanced/uebungen/u27_zlip/index.js deleted file mode 100644 index 8bfee7e..0000000 --- a/02_advanced/uebungen/u27_zlip/index.js +++ /dev/null @@ -1,63 +0,0 @@ -import fs from 'node:fs'; -import zlib from 'node:zlib'; -import color from 'chalk'; - -const data = fs.readFileSync('data/products.csv', 'utf-8'); - -const toCamelCase = (str) => { - return str - .trim() - .toLowerCase() - .replace(/[^a-zA-Z0-9]+(.)/g, (match, chr) => chr.toUpperCase()); -}; - -const convertCsvToJson = (products, ar) => { - const resultAr = products.map((str) => { - const fields = str.split(/\s*,\s*/); - - const labels = ar.map((label, idx) => { - return [label, isNaN(fields[idx]) ? fields[idx] : Number(fields[idx])]; - }); - - const obj = Object.fromEntries(labels); - - // console.log(labels); // Entries Array - //console.log(obj); - - return obj; - - // return { - // [ar[0]]: fields[0], - // [ar[1]]: fields[1], - // [ar[2]]: fields[2], - // [ar[3]]: Number(fields[3]), - // [ar[4]]: Number(fields[4]), - // }; - }); - // console.log(resultAr); - - const jsonStr = JSON.stringify(resultAr, '', 2); - - fs.writeFile('products.json.gz', zlib.gzipSync(jsonStr), 'utf-8', (err) => { - if (err) { - console.log(err); - } else { - console.log(color.green('file created!')); - } - }); -}; - -const productAr = data - .split('\n') - .map((row) => row.replace('\n', '')) - .filter((row) => row !== ''); - -const headerAr = productAr - .shift() - .split(/\s*,\s*/) - .map(toCamelCase); - -// console.log('======='); -// console.log(productAr); - -convertCsvToJson(productAr, headerAr); diff --git a/02_advanced/uebungen/u27_zlip/package.json b/02_advanced/uebungen/u27_zlip/package.json deleted file mode 100644 index 5de40fb..0000000 --- a/02_advanced/uebungen/u27_zlip/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "u27_zlib", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "module", - "dependencies": { - "chalk": "^5.6.2", - "papaparse": "^5.5.4" - } -} diff --git a/02_advanced/uebungen/u27_zlip/products.json.gz b/02_advanced/uebungen/u27_zlip/products.json.gz deleted file mode 100644 index 0a70aa1..0000000 Binary files a/02_advanced/uebungen/u27_zlip/products.json.gz and /dev/null differ diff --git a/02_advanced/uebungen/u28_password-generator/index.js b/02_advanced/uebungen/u28_password-generator/index.js deleted file mode 100644 index 269bad7..0000000 --- a/02_advanced/uebungen/u28_password-generator/index.js +++ /dev/null @@ -1,54 +0,0 @@ -// const crypto = require('node:crypto'); -import crypto from 'node:crypto'; -import _ from 'lodash'; - -const PASSWORD_LENGTH = 10; -const s = '23456789abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ!.,;#$%/+*'; - -const buf = crypto.randomBytes(PASSWORD_LENGTH); - -console.log(buf, Array.from(buf)); - -const password = Array.from(buf) - .map((byte) => s.charAt(byte % s.length)) - .join(''); - -const getPassword = (amount = 10) => { - const chars = '23456789abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ!.,;#$%/+*'.split(''); - return _.shuffle(chars).slice(0, amount).join(''); -}; - -console.log(password); -console.log(getPassword()); - -// Source - https://stackoverflow.com/a/2450976 -// Posted by ChristopheD, modified by community. See post 'Timeline' for change history -// Retrieved 2026-07-10, License - CC BY-SA 4.0 - -function shuffle(array) { - let currentIndex = array.length; - - // While there remain elements to shuffle... - while (currentIndex != 0) { - // Pick a remaining element... - let randomIndex = Math.floor(Math.random() * currentIndex); - currentIndex--; - - // And swap it with the current element. - [array[currentIndex], array[randomIndex]] = [array[randomIndex], array[currentIndex]]; - } - return array; -} - -// Used like so -let arr = [2, 11, 37, 42]; -shuffle(arr); -console.log(arr); - -// Übung 28: Passwortgenerator - -// Was macht der folgende Code? - -// OK: Der Titel verrät es schon. Versuche dennoch, das Programm zu verstehen! Benutze die Dokumentation der Standardbibliothek, um nachzuschlagen, was crypto.randomBytes(…) genau macht! - -// Bonusfrage: Warum sind in den Zeichen «1», «i» und «l» nicht enthalten, genau so wenig wie «0» und «o»? diff --git a/02_advanced/uebungen/u28_password-generator/package-lock.json b/02_advanced/uebungen/u28_password-generator/package-lock.json deleted file mode 100644 index 52a643b..0000000 --- a/02_advanced/uebungen/u28_password-generator/package-lock.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "u28_password-generator", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "u28_password-generator", - "version": "1.0.0", - "dependencies": { - "lodash": "^4.18.1" - } - }, - "node_modules/lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "license": "MIT" - } - } -} diff --git a/02_advanced/uebungen/u28_password-generator/package.json b/02_advanced/uebungen/u28_password-generator/package.json deleted file mode 100644 index 5b21d63..0000000 --- a/02_advanced/uebungen/u28_password-generator/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "u28_password-generator", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "type": "module", - "dependencies": { - "lodash": "^4.18.1" - } -} diff --git a/02_advanced/uebungen/u29_stream.zip b/02_advanced/uebungen/u29_stream.zip deleted file mode 100644 index 50d970a..0000000 Binary files a/02_advanced/uebungen/u29_stream.zip and /dev/null differ diff --git a/02_advanced/uebungen/u29_stream/data/products.html b/02_advanced/uebungen/u29_stream/data/products.html deleted file mode 100644 index 3b6c967..0000000 --- a/02_advanced/uebungen/u29_stream/data/products.html +++ /dev/null @@ -1,8769 +0,0 @@ - - - - - - Products - - - -
    -
    -
      -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    • -

      coffee mug with LCD level indicator

      -

      never again reach for the empty mug

      -

      Price: $49.90

      -
    • -
    • -

      coffee mug with bluetooth-connected coffee grounds scanner for automatized fortune telling

      -

      put the smart into coffee reading

      -

      Price: $99.90

      -
    • -
    • -

      pen with pre-warmed ink (tested on the South Pole)

      -

      the pen is mightier than the cold

      -

      Price: $29.90

      -
    • -
    • -

      ambidextrous computer mouse

      -

      end the dictate of left and right

      -

      Price: $19.90

      -
    • -
    • -

      Easter egg themed webcam for your monitor

      -

      put an Easter egg on hardware too

      -

      Price: $149.90

      -
    • -
    • -

      Vulcan language vi cheatsheet

      -

      learn vi and Vulcan at the same time

      -

      Price: $9.90

      -

      Nur noch wenige Exemplare verfügbar!

      -
    • -
    • -

      Klingon language emacs cheatsheet

      -

      learn emacs and Klingon at the same time

      -

      Price: $9.90

      -
    • -
    • -

      smartphone case with built-in screen

      -

      never miss a message

      -

      Price: $39.90

      -
    • -
    -
    -
    - - diff --git a/02_advanced/uebungen/u29_stream/data/products.html.gz b/02_advanced/uebungen/u29_stream/data/products.html.gz deleted file mode 100644 index 562cdac..0000000 Binary files a/02_advanced/uebungen/u29_stream/data/products.html.gz and /dev/null differ diff --git a/02_advanced/uebungen/u29_stream/index.js b/02_advanced/uebungen/u29_stream/index.js deleted file mode 100644 index 8b506d2..0000000 --- a/02_advanced/uebungen/u29_stream/index.js +++ /dev/null @@ -1,21 +0,0 @@ -// const fs = require('node:fs'); -// const zlib = require('node:zlib'); -import fs from 'node:fs'; -import zlib from 'node:zlib'; - -const gzipCompressor = zlib.createGzip(); - -const inputStream = fs.createReadStream('data/products.html'); -const outputStream = fs.createWriteStream('data/products.html.gz'); - -inputStream.on('data', (data) => { - console.log('Pakete (data chunks) werden geladen: ', data.length); - //outputStream.write(zlib.gzipSync(data)); -}); - -inputStream.pipe(gzipCompressor).pipe(outputStream); - -// Übung 29: Datenströme -// Schreibe Codebeispiel 239 um, ohne die Funktion pipe(…) zu verwenden! - -// TIPP: Um eine Datei päckchenweise lesen- und schreiben zu können, gibt es für das fs Modul die Methoden createReadStream und createWriteStream. diff --git a/02_advanced/uebungen/u29_stream/package.json b/02_advanced/uebungen/u29_stream/package.json deleted file mode 100644 index 4d15df4..0000000 --- a/02_advanced/uebungen/u29_stream/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "03_stream", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "module" -} diff --git a/02_advanced/uebungen/u32_os-info.zip b/02_advanced/uebungen/u32_os-info.zip deleted file mode 100644 index a89049d..0000000 Binary files a/02_advanced/uebungen/u32_os-info.zip and /dev/null differ diff --git a/02_advanced/uebungen/u32_os-info/index.js b/02_advanced/uebungen/u32_os-info/index.js deleted file mode 100644 index 117ce07..0000000 --- a/02_advanced/uebungen/u32_os-info/index.js +++ /dev/null @@ -1,35 +0,0 @@ -import os from 'node:os'; -import color from 'chalk'; - -const platform = os.platform(); - -const cpu = os.cpus().length; - -console.log(color.yellow(`I am running on a machine with ${platform} and ${cpu} cores.`)); - -//console.log(os.cpus()); //gibt ein array aus jeweils cpu kernen -console.log(os.type()); // Darwin -console.log(os.version()); // Darwin mit kernelversion -console.log(os.totalmem()); //RAM in bytes -console.log(os.freemem()); -console.log(os.availableParallelism()); // 8 -> ein programm sollte max 8 parallele tasks ausführen? -console.log(os.arch()); // cpu architektur -> arm64 -console.log(os.machine()); // arm64 -//console.log(os.networkInterfaces()); -console.log(os.hostname()); //MacBookAir -console.log(os.release()); // die releasenr und nicht datum -console.log(os.userInfo()); // Object mit Userinfos -console.log(os.userInfo().username); - -// Übung 32: Information zum Betriebssystem und der Anzahl der vorhandenen CPUs - -// Im Kontext einer Monitoring-Lösung benötigt ein Kunde eine kleine CLI (Command Line Interface)-Anwendung, die es erlaubt, das aktuelle Betriebssystem und die Anzahl der CPUs auf dem jeweiligen Rechner zu ermitteln. - -// Vorgehensweise - -// 1.Schau dir die Online-Dokumentation zum os-Modul der Standardbibliothek an. -// 2.Erstelle dann ein kurzes Node.js-Programm, das ausgibt, auf welcher Plattform es gerade läuft (also etwa »linux«, »darwin« (OS X) oder »win32«) und wie viele Kerne der Rechner hat. - -// Hier eine mögliche Beispielausgabe: - -// I am running on a machine with linux and 2 cores. diff --git a/02_advanced/uebungen/u32_os-info/package-lock.json b/02_advanced/uebungen/u32_os-info/package-lock.json deleted file mode 100644 index eb6d226..0000000 --- a/02_advanced/uebungen/u32_os-info/package-lock.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "u32_os-info", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "u32_os-info", - "version": "1.0.0", - "dependencies": { - "chalk": "^5.6.2" - } - }, - "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - } - } -} diff --git a/02_advanced/uebungen/u32_os-info/package.json b/02_advanced/uebungen/u32_os-info/package.json deleted file mode 100644 index 9343eb1..0000000 --- a/02_advanced/uebungen/u32_os-info/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "u32_os-info", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "type": "module", - "dependencies": { - "chalk": "^5.6.2" - } -} diff --git a/02_advanced/uebungen/uebungen-14-20.zip b/02_advanced/uebungen/uebungen-14-20.zip deleted file mode 100644 index 56f0129..0000000 Binary files a/02_advanced/uebungen/uebungen-14-20.zip and /dev/null differ diff --git a/02_advanced/uebungen/uebungen-21-24.zip b/02_advanced/uebungen/uebungen-21-24.zip deleted file mode 100644 index 5fb2ddb..0000000 Binary files a/02_advanced/uebungen/uebungen-21-24.zip and /dev/null differ diff --git a/02_advanced/uebungen/uebungen_1-10.zip b/02_advanced/uebungen/uebungen_1-10.zip deleted file mode 100644 index a5f1b13..0000000 Binary files a/02_advanced/uebungen/uebungen_1-10.zip and /dev/null differ diff --git a/02_advanced/unterricht/tag11/01_objekte.html b/02_advanced/unterricht/tag11/01_objekte.html deleted file mode 100644 index 14282ca..0000000 --- a/02_advanced/unterricht/tag11/01_objekte.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - Object - object - - - - -
    -
    -

    Objekt - object

    -

    - Der - Object-Typ - repräsentiert einen von JavaScript's Datentypen. Er wird verwendet, um verschiedene Schlüsselkollektionen und - komplexere Entitäten zu speichern. Objekte können mit dem Object()-Konstruktor oder der - Objekt-Initialisierer-Syntax erstellt werden. -

    -
    -
    -
    - - - diff --git a/02_advanced/unterricht/tag11/02_objekte-bsp.html b/02_advanced/unterricht/tag11/02_objekte-bsp.html deleted file mode 100644 index b617c48..0000000 --- a/02_advanced/unterricht/tag11/02_objekte-bsp.html +++ /dev/null @@ -1,238 +0,0 @@ - - - - - - Objekte in JS - Beispiele - - - -
    -
    -

    Objekte in JS - Beispiele

    -
    -
    -
    - - - diff --git a/02_advanced/unterricht/tag11/03_objekte-mit-this.html b/02_advanced/unterricht/tag11/03_objekte-mit-this.html deleted file mode 100644 index 39e33e6..0000000 --- a/02_advanced/unterricht/tag11/03_objekte-mit-this.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - Object - object - - - - -
    -
    -

    Objekt - object

    -

    - Der - Object-Typ - repräsentiert einen von JavaScript's Datentypen. Er wird verwendet, um verschiedene Schlüsselkollektionen und - komplexere Entitäten zu speichern. Objekte können mit dem Object()-Konstruktor oder der - Objekt-Initialisierer-Syntax erstellt werden. -

    -
    -
    -
    - - - diff --git a/02_advanced/unterricht/tag11/03_schnittstellenformate/persons.json b/02_advanced/unterricht/tag11/03_schnittstellenformate/persons.json deleted file mode 100644 index b5b538b..0000000 --- a/02_advanced/unterricht/tag11/03_schnittstellenformate/persons.json +++ /dev/null @@ -1,14 +0,0 @@ -[ - { - "firstName": "Max", - "lastName": "Mustermann", - "age": 38, - "hobbies": ["Tennis", "Schach"] - }, - { - "firstName": "Jane", - "lastName": "Doe", - "age": 24, - "hobbies": ["Zocken", "Tanzen"] - } -] diff --git a/02_advanced/unterricht/tag11/03_schnittstellenformate/persons.xml b/02_advanced/unterricht/tag11/03_schnittstellenformate/persons.xml deleted file mode 100644 index 53b1606..0000000 --- a/02_advanced/unterricht/tag11/03_schnittstellenformate/persons.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - Max - Mustermann - 38 - - Tennis - Schach - - - - Jane - Doe - 24 - - Zocken - Tanzen - - - \ No newline at end of file diff --git a/02_advanced/unterricht/tag11/04_object-keys-values-entries.html b/02_advanced/unterricht/tag11/04_object-keys-values-entries.html deleted file mode 100644 index 3d49b71..0000000 --- a/02_advanced/unterricht/tag11/04_object-keys-values-entries.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - Object Methoden - keys(), values(), entries() - - - -
    -
    -

    Object Methoden - keys(), values(), entries()

    -
    -
    - - - diff --git a/02_advanced/unterricht/tag12/01_csv-to-obj.html b/02_advanced/unterricht/tag12/01_csv-to-obj.html deleted file mode 100644 index 75f5e54..0000000 --- a/02_advanced/unterricht/tag12/01_csv-to-obj.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - CSV to Obj mit destructuring - - - -
    -
    -

    CSV to Obj mit destructuring

    -
    -
    -
    - - - diff --git a/02_advanced/unterricht/tag12/02_destructuring.html b/02_advanced/unterricht/tag12/02_destructuring.html deleted file mode 100644 index cc4e68f..0000000 --- a/02_advanced/unterricht/tag12/02_destructuring.html +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - Destructuring von Objekten und Arrays in JS - - - -
    -
    -

    Destructuring von Objekten und Arrays in JS

    -
    -
    - - - diff --git a/02_advanced/unterricht/tag12/03_destructuring-with-object.html b/02_advanced/unterricht/tag12/03_destructuring-with-object.html deleted file mode 100644 index 027c2ac..0000000 --- a/02_advanced/unterricht/tag12/03_destructuring-with-object.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - JS - Destructuring mit Objekten - - - -
    -
    -

    JS - Destructuring mit Objekten

    -
    -
    -
    - - - diff --git a/02_advanced/unterricht/tag12/04_destructuring-with-rest-operator.html b/02_advanced/unterricht/tag12/04_destructuring-with-rest-operator.html deleted file mode 100644 index 6a61ac9..0000000 --- a/02_advanced/unterricht/tag12/04_destructuring-with-rest-operator.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - JS - Destructuring mir Rest-Parameter (...) - - - -
    -
    -

    JS - Destructuring mir Rest-Parameter (...)

    -
    -
    -
    - - - diff --git a/02_advanced/unterricht/tag12/05_destructuring-in-paramerterliste.html b/02_advanced/unterricht/tag12/05_destructuring-in-paramerterliste.html deleted file mode 100644 index ab6d30a..0000000 --- a/02_advanced/unterricht/tag12/05_destructuring-in-paramerterliste.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - JS - Destructuring in der Parameterliste mit Defaultwerten - - - -
    -
    -

    JS - Destructuring in der Parameterliste mit Defaultwerten

    -
    -
    - - - diff --git a/02_advanced/unterricht/tag12/06_rekursion.html b/02_advanced/unterricht/tag12/06_rekursion.html deleted file mode 100644 index 04a05ff..0000000 --- a/02_advanced/unterricht/tag12/06_rekursion.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - Rekursion in JS - - - -
    -
    -

    Rekursion in JS

    -
    -
    -
    - - - diff --git a/02_advanced/unterricht/tag12/07_rekursion-rate-zahl.html b/02_advanced/unterricht/tag12/07_rekursion-rate-zahl.html deleted file mode 100644 index 71c56dc..0000000 --- a/02_advanced/unterricht/tag12/07_rekursion-rate-zahl.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - Rekursion - Beispiel Zahl raten - - - -
    -
    -

    Rekursion - Beispiel Zahl raten

    -
    -
    -
    - - - diff --git a/02_advanced/unterricht/tag12/08_rekursion-mit-closure.html b/02_advanced/unterricht/tag12/08_rekursion-mit-closure.html deleted file mode 100644 index 5b1cad7..0000000 --- a/02_advanced/unterricht/tag12/08_rekursion-mit-closure.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - Rekursion - Beispiel Zahl raten - - - -
    -
    -

    Rekursion - Beispiel Zahl raten

    -
    -
    -
    - - - diff --git a/02_advanced/unterricht/tag12/09_rekursion-fakultaet.html b/02_advanced/unterricht/tag12/09_rekursion-fakultaet.html deleted file mode 100644 index 93e2d83..0000000 --- a/02_advanced/unterricht/tag12/09_rekursion-fakultaet.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - Rekursion Beispiel: Fakultät errechnen - - - -
    -
    -

    Rekursion Beispiel: Fakultät errechnen

    -
    -
    - - - diff --git a/02_advanced/unterricht/tag12/10_rekursion-fibonacci.html b/02_advanced/unterricht/tag12/10_rekursion-fibonacci.html deleted file mode 100644 index 9b906f0..0000000 --- a/02_advanced/unterricht/tag12/10_rekursion-fibonacci.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - Rekursion Beispiel: Fibonacci-Reihenfolge errechnen - - - -
    -
    -

    Rekursion Beispiel: Fibonacci-Reihenfolge errechnen

    -
    -
    - - - diff --git a/02_advanced/unterricht/tag12/10_rekursion-fibonacci.md b/02_advanced/unterricht/tag12/10_rekursion-fibonacci.md deleted file mode 100644 index 206826a..0000000 --- a/02_advanced/unterricht/tag12/10_rekursion-fibonacci.md +++ /dev/null @@ -1,126 +0,0 @@ -# Erklärung `fibonacci`-Funktion - -## Wie funktioniert `fibonacci(4)`? - -Bei der Rekursion verzweigt sich die Funktion wie ein Baum, weil in jedem Schritt _zwei_ neue Aufrufe gestartet werden: `fibonacci(n - 1)` und `fibonacci(n - 2)`. JavaScript arbeitet diesen Baum von **oben nach unten** und von **links nach rechts** ab. - -### Der Ablauf Schritt für Schritt - -Hier ist die exakte Reihenfolge, wie JavaScript die Funktionen aufruft und auflöst: - -1. **`fibonacci(4)`** wird aufgerufen. - -- Da $n > 1$, will die Funktion `fibonacci(3) + fibonacci(2)` rechnen. Sie muss aber **zuerst** den linken Teil (`fibonacci(3)`) komplett berechnen. - -2. **`fibonacci(3)`** wird aufgerufen. - -- Will `fibonacci(2) + fibonacci(1)` rechnen. Wartet auf den linken Teil (`fibonacci(2)`). - -3. **`fibonacci(2)`** wird aufgerufen. - -- Will `fibonacci(1) + fibonacci(0)` rechnen. Wartet auf links (`fibonacci(1)`). - -4. **`fibonacci(1)`** wird aufgerufen. - -- **Base Case greift!** Gibt **`1`** zurück. - -5. Zurück bei `fibonacci(2)`: Der linke Teil ist bereit (`1`). Jetzt wird der rechte Teil (`fibonacci(0)`) aufgerufen. -6. **`fibonacci(0)`** wird aufgerufen. - -- **Base Case greift!** Gibt **`0`** zurück. - -7. **`fibonacci(2)` wird aufgelöst:** Rechnet `1 + 0` und gibt **`1`** zurück an `fibonacci(3)`. -8. Zurück bei `fibonacci(3)`: Der linke Teil ist bereit (`1`). Jetzt wird der rechte Teil (`fibonacci(1)`) aufgerufen. -9. **`fibonacci(1)`** wird aufgerufen. - -- **Base Case greift!** Gibt **`1`** zurück. - -10. **`fibonacci(3)` wird aufgelöst:** Rechnet `1 + 1` (Ergebnis aus Schritt 7 + Schritt 9) und gibt **`2`** zurück an `fibonacci(4)`. -11. Zurück bei `fibonacci(4)`: Der linke Teil (`fibonacci(3)`) ist endlich fertig und hat den Wert `2`. Jetzt wird der komplette rechte Ast (**`fibonacci(2)`**) berechnet. -12. **`fibonacci(2)`** wird aufgerufen (für die rechte Seite von `fibonacci(4)`). - -- Ruft intern wieder `fibonacci(1)` (gibt `1`) und `fibonacci(0)` (gibt `0`) auf. -- Rechnet `1 + 0` und gibt **`1`** zurück. - -13. **`fibonacci(4)` wird final aufgelöst:** \* Rechnet das Ergebnis von links (`2`) + das Ergebnis von rechts (`1`). - -- **Endergebnis: `3**`. - ---- - -## Die Schritte mit `console.log` sichtbar machen - -Ja, das kann man wunderbar mit `console.log` sichtbar machen! Am besten fügt man eine Einrückung (`indent`) hinzu, die sich mit jeder Ebene vertieft. So sieht man direkt die "Baumstruktur" in der Konsole. - -Hier ist der modifizierte Code: - -```javascript -const fibonacciMitLog = (n, ebene = 0) => { - // Erzeugt Leerzeichen für die visuelle Einrückung in der Konsole - const einrückung = ' '.repeat(ebene); - - console.log(`${einrückung}▶️ Rufe fibonacci(${n}) auf`); - - // Base cases - if (n === 0) { - console.log(`${einrückung}↩️ Base Case: fibonacci(0) gibt 0 zurück`); - return 0; - } - - if (n === 1) { - console.log(`${einrückung}↩️ Base Case: fibonacci(1) gibt 1 zurück`); - return 1; - } - - // Rekursive Aufrufe - console.log(`${einrückung}⏳ Berechne links: fibonacci(${n - 1})`); - const links = fibonacciMitLog(n - 1, ebene + 1); - - console.log(`${einrückung}⏳ Berechne rechts: fibonacci(${n - 2})`); - const rechts = fibonacciMitLog(n - 2, ebene + 1); - - const ergebnis = links + rechts; - console.log(`${einrückung}✅ fibonacci(${n}) fertig! ${links} + ${rechts} = ${ergebnis}`); - - return ergebnis; -}; - -// Testlauf -console.log('--- START DER BERECHNUNG ---'); -fibonacciMitLog(4); -``` - -### Das Ergebnis in der Konsole: - -Wenn du diesen Code ausführst, siehst du exakt, wie JavaScript durch die Ebenen wandert: - -```text ---- START DER BERECHNUNG --- -▶️ Rufe fibonacci(4) auf -⏳ Berechne links: fibonacci(3) - ▶️ Rufe fibonacci(3) auf - ⏳ Berechne links: fibonacci(2) - ▶️ Rufe fibonacci(2) auf - ⏳ Berechne links: fibonacci(1) - ▶️ Rufe fibonacci(1) auf - ↩️ Base Case: fibonacci(1) gibt 1 zurück - ⏳ Berechne rechts: fibonacci(0) - ▶️ Rufe fibonacci(0) auf - ↩️ Base Case: fibonacci(0) gibt 0 zurück - ✅ fibonacci(2) fertig! 1 + 0 = 1 - ⏳ Berechne rechts: fibonacci(1) - ▶️ Rufe fibonacci(1) auf - ↩️ Base Case: fibonacci(1) gibt 1 zurück - ✅ fibonacci(3) fertig! 1 + 1 = 2 -⏳ Berechne rechts: fibonacci(2) - ▶️ Rufe fibonacci(2) auf - ⏳ Berechne links: fibonacci(1) - ▶️ Rufe fibonacci(1) auf - ↩️ Base Case: fibonacci(1) gibt 1 zurück - ⏳ Berechne rechts: fibonacci(0) - ▶️ Rufe fibonacci(0) auf - ↩️ Base Case: fibonacci(0) gibt 0 zurück - ✅ fibonacci(2) fertig! 1 + 0 = 1 -✅ fibonacci(4) fertig! 2 + 1 = 3 - -``` diff --git a/02_advanced/unterricht/tag12/11_rekursion-sum-ohne-reduce.html b/02_advanced/unterricht/tag12/11_rekursion-sum-ohne-reduce.html deleted file mode 100644 index 7dae036..0000000 --- a/02_advanced/unterricht/tag12/11_rekursion-sum-ohne-reduce.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - Rekursion Beispiel: Summe eine Arrays errechnen - - - -
    -
    -

    Rekursion Beispiel: Summe eine Arrays errechnen

    -
    -
    - - - diff --git a/02_advanced/unterricht/tag12/data/products.csv b/02_advanced/unterricht/tag12/data/products.csv deleted file mode 100644 index 88b1ce0..0000000 --- a/02_advanced/unterricht/tag12/data/products.csv +++ /dev/null @@ -1,4 +0,0 @@ -name, category, price -Klingon Letter Opener, Office Warfare, 19.99 -Backpack of Holding, Travel, 29.99 -Tardis Alarmclock, Merchandise, 15.99 diff --git a/02_advanced/unterricht/tag13/01_pyramid-of-doom.html b/02_advanced/unterricht/tag13/01_pyramid-of-doom.html deleted file mode 100644 index 09e48f8..0000000 --- a/02_advanced/unterricht/tag13/01_pyramid-of-doom.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - The Pyramid Of The Doom - callback hell - Beispiele - - - - - -
    -
    -

    The Pyramid Of The Doom - callback hell - Beispiele

    - - - -
    -
    1
    -
    2
    -
    3
    -
    4
    -
    -
    -
    - - - diff --git a/02_advanced/unterricht/tag13/02_promise-aufbau.html b/02_advanced/unterricht/tag13/02_promise-aufbau.html deleted file mode 100644 index af49229..0000000 --- a/02_advanced/unterricht/tag13/02_promise-aufbau.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - Promise Object - Syntax - - - -
    -
    -

    Promise Objekt - Syntaxaufbau

    -

    - Das - Promise - Objekt stellt eine Repräsentation einer eventuellen Ausführung (oder eines Fehlschlags) einer - asynchronen - Operation und den daraus resultierenden Ergebnissen dar. -

    - -
    -
    - - - diff --git a/02_advanced/unterricht/tag13/03_node-fs-async.js b/02_advanced/unterricht/tag13/03_node-fs-async.js deleted file mode 100644 index 906c218..0000000 --- a/02_advanced/unterricht/tag13/03_node-fs-async.js +++ /dev/null @@ -1,26 +0,0 @@ -const fs = require('fs'); // Modul aus der Standardlibrary von node - -const getFile = (path = '') => { - return new Promise((resolve, reject) => { - //asynchrones auslesen einer Datei - fs.readFile(path, 'utf-8', (error, data) => { - if (error) { - // console.error(error); - reject(error); - } - // console.log(data); - resolve(data); - }); - }); -}; - -console.log('weiter im code'); - -// Funktionsaufruf einer Funktion, die asynchrone Prozesse -getFile('02_promise-aufbau.html') - .then((data) => { - console.log(data); - }) - .catch((error) => { - console.error(error); - }); diff --git a/02_advanced/unterricht/tag13/04_node-hello.js b/02_advanced/unterricht/tag13/04_node-hello.js deleted file mode 100644 index 9ef7de5..0000000 --- a/02_advanced/unterricht/tag13/04_node-hello.js +++ /dev/null @@ -1,2 +0,0 @@ -// console ist aus dem Node core (Standard-library) -console.log('Hello JS from system (node)'); diff --git a/02_advanced/unterricht/tag13/05_website/assets/css/main.css b/02_advanced/unterricht/tag13/05_website/assets/css/main.css deleted file mode 100644 index 2aa9f82..0000000 --- a/02_advanced/unterricht/tag13/05_website/assets/css/main.css +++ /dev/null @@ -1,36 +0,0 @@ -.header-main { - width: 100%; - height: 400px; - background-color: #222; - color: white; - display: flex; - justify-content: center; - align-items: center; -} -.header-main .content-box figure figcaption { - display: none; -} - -.menu-main { - background-color: tomato; -} -.menu-main ul { - list-style: none; - display: flex; -} -.menu-main ul li { - border-right: 1px solid #333; -} -.menu-main ul li:last-child { - border-right: none; -} -.menu-main ul li a { - text-decoration: none; - text-transform: uppercase; - letter-spacing: 1px; - color: white; - display: inline-block; - padding: 0.5rem 1rem; -} - -/*# sourceMappingURL=main.css.map */ diff --git a/02_advanced/unterricht/tag13/05_website/assets/css/main.css.map b/02_advanced/unterricht/tag13/05_website/assets/css/main.css.map deleted file mode 100644 index ca1f3ec..0000000 --- a/02_advanced/unterricht/tag13/05_website/assets/css/main.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sourceRoot":"","sources":["../scss/main.scss"],"names":[],"mappings":"AAGA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAII;EACE;;;AAOR;EACE;;AACA;EACE;EACA;;AACA;EACE;;AACA;EACE;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA","file":"main.css"} \ No newline at end of file diff --git a/02_advanced/unterricht/tag13/05_website/assets/js/main.js b/02_advanced/unterricht/tag13/05_website/assets/js/main.js deleted file mode 100644 index 77b5667..0000000 --- a/02_advanced/unterricht/tag13/05_website/assets/js/main.js +++ /dev/null @@ -1,19 +0,0 @@ -'use strict'; - -(() => { - // === DOM & VARS ======= - const DOM = {}; - - // === INIT ============= - const init = () => { - console.log('init...'); - }; - - // === EVENTHANDLER ===== - - // === XHR/FETCH ======== - - // === FUNCTIONS ======== - - init(); -})(); diff --git a/02_advanced/unterricht/tag13/05_website/assets/scss/main.scss b/02_advanced/unterricht/tag13/05_website/assets/scss/main.scss deleted file mode 100644 index 1b24ef4..0000000 --- a/02_advanced/unterricht/tag13/05_website/assets/scss/main.scss +++ /dev/null @@ -1,43 +0,0 @@ -// sass assets/scss/main.scss:assets/css/main.css - -// Header Bereich -.header-main { - width: 100%; - height: 400px; - background-color: #222; - color: white; - display: flex; - justify-content: center; - align-items: center; - - .content-box { - figure { - figcaption { - display: none; - } - } - } -} - -// Menu Main -.menu-main { - background-color: tomato; - ul { - list-style: none; - display: flex; - li { - border-right: 1px solid #333; - &:last-child { - border-right: none; - } - a { - text-decoration: none; - text-transform: uppercase; - letter-spacing: 1px; - color: white; - display: inline-block; - padding: 0.5rem 1rem; - } - } - } -} diff --git a/02_advanced/unterricht/tag13/05_website/index.html b/02_advanced/unterricht/tag13/05_website/index.html deleted file mode 100644 index bbe4fe6..0000000 --- a/02_advanced/unterricht/tag13/05_website/index.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - Webseite mit Sass - - - - - -
    -
    -
    - Logo -
    Webseite mit Sass
    -
    -
    -
    - - -
    -
    -

    Webseite mit Sass

    -
    -
    - - - diff --git a/02_advanced/unterricht/tag14/01_promise-and-readfile/data/products.csv b/02_advanced/unterricht/tag14/01_promise-and-readfile/data/products.csv deleted file mode 100644 index 88b1ce0..0000000 --- a/02_advanced/unterricht/tag14/01_promise-and-readfile/data/products.csv +++ /dev/null @@ -1,4 +0,0 @@ -name, category, price -Klingon Letter Opener, Office Warfare, 19.99 -Backpack of Holding, Travel, 29.99 -Tardis Alarmclock, Merchandise, 15.99 diff --git a/02_advanced/unterricht/tag14/01_promise-and-readfile/index.js b/02_advanced/unterricht/tag14/01_promise-and-readfile/index.js deleted file mode 100644 index 7781cde..0000000 --- a/02_advanced/unterricht/tag14/01_promise-and-readfile/index.js +++ /dev/null @@ -1,31 +0,0 @@ -// fs = FileSystem Modul aus der Node Standardbib -// const fs = require('fs'); // commonjs - Node Schreibweise -// const chalk = require('chalk'); -import fs from 'fs'; // module - ESM Schreibweise -import chalk from 'chalk'; - -// Funktion mir einem asynchronen Prozess -const getContentBy = (path) => { - return new Promise((resolve, reject) => { - // asynchroner Prozess - fs.readFile(path, 'utf-8', (err, data) => { - if (err) { - // console.error(err); - reject(err); - } - // console.log(data); - resolve(data); - }); - }); -}; - -// Funktionsaufruf einer Funktion mit asynchronen Prozess -getContentBy('data/products.csv') - .then((data) => { - console.log(chalk.yellow(data)); - }) - .catch((err) => { - console.error(chalk.red(err)); - }); - -console.log('weiter im code...'); diff --git a/02_advanced/unterricht/tag14/01_promise-and-readfile/package-lock.json b/02_advanced/unterricht/tag14/01_promise-and-readfile/package-lock.json deleted file mode 100644 index 8ae141d..0000000 --- a/02_advanced/unterricht/tag14/01_promise-and-readfile/package-lock.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "01_promise-and-readfile", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "01_promise-and-readfile", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "chalk": "^5.6.2" - } - }, - "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - } - } -} diff --git a/02_advanced/unterricht/tag14/01_promise-and-readfile/package.json b/02_advanced/unterricht/tag14/01_promise-and-readfile/package.json deleted file mode 100644 index 43aa1ff..0000000 --- a/02_advanced/unterricht/tag14/01_promise-and-readfile/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "01_promise-and-readfile", - "version": "1.0.0", - "description": "", - "license": "ISC", - "author": "", - "type": "module", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "dependencies": { - "chalk": "^5.6.2" - } -} diff --git a/02_advanced/unterricht/tag14/02_commonjs-vs-esm/commonjs/index.js b/02_advanced/unterricht/tag14/02_commonjs-vs-esm/commonjs/index.js deleted file mode 100644 index 78a1ca0..0000000 --- a/02_advanced/unterricht/tag14/02_commonjs-vs-esm/commonjs/index.js +++ /dev/null @@ -1,27 +0,0 @@ -// commonjs - Schreibweise mit "require" -const fs = require('node:fs'); // "fs" ist ein Modul aus der Node Standardbib und kann mit Prefix "node:" hervorgehoben werden -const chalk = require('chalk'); - -const getFileBy = (path, encoding = 'utf-8') => { - return new Promise((resolve, reject) => { - // async process - fs.readFile(path, encoding, (err, data) => { - if (err) { - // console.error(err); - reject(err); - } - - // console.log(data); - resolve(data); - }); - }); -}; - -// Funktionsaufruf von Funktion mit async process -getFileBy('package.json') - .then((data) => { - console.log(chalk.yellow(data)); - }) - .catch((err) => { - console.log(chalk.red(err)); - }); diff --git a/02_advanced/unterricht/tag14/02_commonjs-vs-esm/commonjs/package-lock.json b/02_advanced/unterricht/tag14/02_commonjs-vs-esm/commonjs/package-lock.json deleted file mode 100644 index abd9845..0000000 --- a/02_advanced/unterricht/tag14/02_commonjs-vs-esm/commonjs/package-lock.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "name": "commonjs", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "commonjs", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "chalk": "^4.1.2" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - } - } -} diff --git a/02_advanced/unterricht/tag14/02_commonjs-vs-esm/commonjs/package.json b/02_advanced/unterricht/tag14/02_commonjs-vs-esm/commonjs/package.json deleted file mode 100644 index ec0af72..0000000 --- a/02_advanced/unterricht/tag14/02_commonjs-vs-esm/commonjs/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "commonjs", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "commonjs", - "dependencies": { - "chalk": "^4.1.2" - } -} diff --git a/02_advanced/unterricht/tag14/02_commonjs-vs-esm/module/index.js b/02_advanced/unterricht/tag14/02_commonjs-vs-esm/module/index.js deleted file mode 100644 index 05c38c6..0000000 --- a/02_advanced/unterricht/tag14/02_commonjs-vs-esm/module/index.js +++ /dev/null @@ -1,27 +0,0 @@ -// esm - Schreibweise mit "import" -import fs from 'node:fs'; // "fs" ist ein Modul aus der Node Standardbib und kann mit Prefix "node:" hervorgehoben werden -import chalk from 'chalk'; - -const getFileBy = (path, encoding = 'utf-8') => { - return new Promise((resolve, reject) => { - // async process - fs.readFile(path, encoding, (err, data) => { - if (err) { - // console.error(err); - reject(err); - } - - // console.log(data); - resolve(data); - }); - }); -}; - -// Funktionsaufruf von Funktion mit async process -getFileBy('package.json') - .then((data) => { - console.log(chalk.yellow(data)); - }) - .catch((err) => { - console.log(chalk.red(err)); - }); diff --git a/02_advanced/unterricht/tag14/02_commonjs-vs-esm/module/package-lock.json b/02_advanced/unterricht/tag14/02_commonjs-vs-esm/module/package-lock.json deleted file mode 100644 index c961078..0000000 --- a/02_advanced/unterricht/tag14/02_commonjs-vs-esm/module/package-lock.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "module", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "module", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "chalk": "^5.6.2" - } - }, - "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - } - } -} diff --git a/02_advanced/unterricht/tag14/02_commonjs-vs-esm/module/package.json b/02_advanced/unterricht/tag14/02_commonjs-vs-esm/module/package.json deleted file mode 100644 index 8fe75f7..0000000 --- a/02_advanced/unterricht/tag14/02_commonjs-vs-esm/module/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "module", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "module", - "dependencies": { - "chalk": "^5.6.2" - } -} diff --git a/02_advanced/unterricht/tag14/03_fs-promises/index.js b/02_advanced/unterricht/tag14/03_fs-promises/index.js deleted file mode 100644 index 5071e5f..0000000 --- a/02_advanced/unterricht/tag14/03_fs-promises/index.js +++ /dev/null @@ -1,40 +0,0 @@ -// esm - Schreibweise mit "import" -import fs from 'node:fs'; // "fs" ist ein Modul aus der Node Standardbib und kann mit Prefix "node:" hervorgehoben werden -import color from 'chalk'; - -const getFileBy = (path, encoding = 'utf-8') => { - return new Promise((resolve, reject) => { - // async process - fs.readFile(path, encoding, (err, data) => { - if (err) { - // console.error(err); - reject(err); - } - - // console.log(data); - resolve(data); - }); - }); -}; - -const getPromisesFileBy = (path, encoding = 'utf-8') => { - // Unterobjekt "promises" von fs besitzt Ummantelung von Promise-Objekt und Verarbeitung der Callback-Funktion - return fs.promises.readFile(path, encoding); -}; - -// Funktionsaufruf von Funktion mit async process -getFileBy('package.json') - .then((data) => { - console.log(color.yellow(data)); - }) - .catch((err) => { - console.log(color.red(err)); - }); - -getPromisesFileBy('package.json') - .then((data) => { - console.log(color.green(data)); - }) - .catch((err) => { - console.log(color.magenta(err)); - }); diff --git a/02_advanced/unterricht/tag14/03_fs-promises/package-lock.json b/02_advanced/unterricht/tag14/03_fs-promises/package-lock.json deleted file mode 100644 index c961078..0000000 --- a/02_advanced/unterricht/tag14/03_fs-promises/package-lock.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "module", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "module", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "chalk": "^5.6.2" - } - }, - "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - } - } -} diff --git a/02_advanced/unterricht/tag14/03_fs-promises/package.json b/02_advanced/unterricht/tag14/03_fs-promises/package.json deleted file mode 100644 index 3eb6d46..0000000 --- a/02_advanced/unterricht/tag14/03_fs-promises/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "03_fs-promises", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "module", - "dependencies": { - "chalk": "^5.6.2" - } -} diff --git a/02_advanced/unterricht/tag14/04_async-await/index.js b/02_advanced/unterricht/tag14/04_async-await/index.js deleted file mode 100644 index 2f5174c..0000000 --- a/02_advanced/unterricht/tag14/04_async-await/index.js +++ /dev/null @@ -1,35 +0,0 @@ -// esm - Schreibweise mit "import" -import fs from 'node:fs'; // "fs" ist ein Modul aus der Node Standardbib und kann mit Prefix "node:" hervorgehoben werden -import color from 'chalk'; - -// async ... await -const getFileBy = async (path, encoding = 'utf-8') => { - try { - const result = await fs.promises.readFile(path, encoding); - return result; - } catch (error) { - throw new Error(error); - } -}; - -const getPromiseFileBy = (path, encoding = 'utf-8') => { - return new Promise((resolve, reject) => { - fs.readFile(path, encoding, (err, data) => { - if (err) { - reject(err); - } - resolve(data); - }); - }); -}; - -getFileBy('package.json') - .then((data) => { - console.log(color.green(data)); - }) - .catch((err) => { - console.log(color.magenta(err)); - }) - .finally(() => { - console.log(color.yellow('process finished')); - }); diff --git a/02_advanced/unterricht/tag14/04_async-await/package-lock.json b/02_advanced/unterricht/tag14/04_async-await/package-lock.json deleted file mode 100644 index c961078..0000000 --- a/02_advanced/unterricht/tag14/04_async-await/package-lock.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "module", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "module", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "chalk": "^5.6.2" - } - }, - "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - } - } -} diff --git a/02_advanced/unterricht/tag14/04_async-await/package.json b/02_advanced/unterricht/tag14/04_async-await/package.json deleted file mode 100644 index f5025c6..0000000 --- a/02_advanced/unterricht/tag14/04_async-await/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "04_async-await", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "module", - "dependencies": { - "chalk": "^5.6.2" - } -} diff --git a/02_advanced/unterricht/tag14/05_promise-all/data/file01.txt b/02_advanced/unterricht/tag14/05_promise-all/data/file01.txt deleted file mode 100644 index 002ff75..0000000 --- a/02_advanced/unterricht/tag14/05_promise-all/data/file01.txt +++ /dev/null @@ -1 +0,0 @@ -Ich bin file01 \ No newline at end of file diff --git a/02_advanced/unterricht/tag14/05_promise-all/data/file02.txt b/02_advanced/unterricht/tag14/05_promise-all/data/file02.txt deleted file mode 100644 index be27611..0000000 --- a/02_advanced/unterricht/tag14/05_promise-all/data/file02.txt +++ /dev/null @@ -1 +0,0 @@ -Ich bin file02 \ No newline at end of file diff --git a/02_advanced/unterricht/tag14/05_promise-all/data/file03.txt b/02_advanced/unterricht/tag14/05_promise-all/data/file03.txt deleted file mode 100644 index 175a629..0000000 --- a/02_advanced/unterricht/tag14/05_promise-all/data/file03.txt +++ /dev/null @@ -1 +0,0 @@ -Ich bin file03 \ No newline at end of file diff --git a/02_advanced/unterricht/tag14/05_promise-all/data/file04.txt b/02_advanced/unterricht/tag14/05_promise-all/data/file04.txt deleted file mode 100644 index 56c5513..0000000 --- a/02_advanced/unterricht/tag14/05_promise-all/data/file04.txt +++ /dev/null @@ -1 +0,0 @@ -Ich bin file04 \ No newline at end of file diff --git a/02_advanced/unterricht/tag14/05_promise-all/index.js b/02_advanced/unterricht/tag14/05_promise-all/index.js deleted file mode 100644 index cf0b718..0000000 --- a/02_advanced/unterricht/tag14/05_promise-all/index.js +++ /dev/null @@ -1,28 +0,0 @@ -import fs from 'node:fs'; -import color from 'chalk'; - -const getFileBy = (path, encoding = 'utf-8') => { - return fs.promises.readFile(path, encoding); -}; - -// getFileBy('data/file01.txt') -// .then((data) => { -// console.log(color.green(data)); -// }) -// .catch((err) => { -// console.log(color.red(err)); -// }); - -Promise.all([ - getFileBy('data/file01.txt'), - getFileBy('data/file02.txt'), - // getFileBy('data/404'), - getFileBy('data/file03.txt'), - getFileBy('data/file04.txt'), -]) - .then((data) => { - console.log(data); - }) - .catch((err) => { - console.log(err); - }); diff --git a/02_advanced/unterricht/tag14/05_promise-all/package-lock.json b/02_advanced/unterricht/tag14/05_promise-all/package-lock.json deleted file mode 100644 index 41b7e29..0000000 --- a/02_advanced/unterricht/tag14/05_promise-all/package-lock.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "05_promise-all", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "05_promise-all", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "chalk": "^5.6.2" - } - }, - "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - } - } -} diff --git a/02_advanced/unterricht/tag14/05_promise-all/package.json b/02_advanced/unterricht/tag14/05_promise-all/package.json deleted file mode 100644 index 8cddb19..0000000 --- a/02_advanced/unterricht/tag14/05_promise-all/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "05_promise-all", - "version": "1.0.0", - "description": "", - "keywords": [], - "license": "ISC", - "author": "", - "type": "module", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "dependencies": { - "chalk": "^5.6.2" - } -} diff --git a/02_advanced/unterricht/tag15/01_util-promisify/data/file.txt b/02_advanced/unterricht/tag15/01_util-promisify/data/file.txt deleted file mode 100644 index df8d891..0000000 --- a/02_advanced/unterricht/tag15/01_util-promisify/data/file.txt +++ /dev/null @@ -1 +0,0 @@ -Ich bin eine Datei! \ No newline at end of file diff --git a/02_advanced/unterricht/tag15/01_util-promisify/index.js b/02_advanced/unterricht/tag15/01_util-promisify/index.js deleted file mode 100644 index a6cb679..0000000 --- a/02_advanced/unterricht/tag15/01_util-promisify/index.js +++ /dev/null @@ -1,16 +0,0 @@ -// const fs = require('fs'); -// const util = require('util'); -import fs from 'node:fs'; -import util from 'node:util'; - -// util.promisify fängt das letzte Argument als Callback-Funktion ab und ummantel die Funktion mit einem Promise-Objekt. -// Das ummantelte Promise-Objekt wird zusätzlich von einer weiteren Funktion mit den Argumenten ummantelt. - -// https://javascript.info/promisify -// https://medium.com/trabe/understanding-nodes-promisify-and-callbackify-d2b04efde0e0 - -const getFileContent = util.promisify(fs.readFile); - -getFileContent('data/file.txt', 'utf8') - .then((data) => console.log(data)) - .catch((err) => console.error(`Something went wrong: ${err}`)); diff --git a/02_advanced/unterricht/tag15/01_util-promisify/package.json b/02_advanced/unterricht/tag15/01_util-promisify/package.json deleted file mode 100644 index 88a38aa..0000000 --- a/02_advanced/unterricht/tag15/01_util-promisify/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "01_util-promisify", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "module" -} diff --git a/02_advanced/unterricht/tag15/02_switch-case/index.html b/02_advanced/unterricht/tag15/02_switch-case/index.html deleted file mode 100644 index aec6951..0000000 --- a/02_advanced/unterricht/tag15/02_switch-case/index.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - Switch Case - - - -
    -
    -

    Switch Case

    -

    - Die - switch-Anweisung wertet einen Ausdruck aus, vergleicht den Wert des Ausdrucks mit einer Reihe von - case-Klauseln und führt Anweisungen nach der ersten case-Klausel mit - passendem Wert aus, bis eine break-Anweisung erreicht wird. Die default-Klausel einer - switch-Anweisung wird angesprungen, wenn keine case-Klausel den Wert des Ausdrucks trifft. -

    -
    -
    -
    - - - diff --git a/02_advanced/unterricht/tag15/03_README.md b/02_advanced/unterricht/tag15/03_README.md deleted file mode 100644 index 0654265..0000000 --- a/02_advanced/unterricht/tag15/03_README.md +++ /dev/null @@ -1 +0,0 @@ -# Exkurs: Webseite mit Sass und package.json (scripts) diff --git a/02_advanced/unterricht/tag15/meeting.md b/02_advanced/unterricht/tag15/meeting.md deleted file mode 100644 index 94030df..0000000 --- a/02_advanced/unterricht/tag15/meeting.md +++ /dev/null @@ -1,6 +0,0 @@ -# Meeting Fr. 03.07.2026 - -- [x] 15:35 - 15:45 Uhr Kahleel -- [x] 15:45 - 15:55 Uhr Adel -- [x] 15:55 - 16:05 Uhr Andreas -- [x] 16:05 - 15:15 Uhr Ersin diff --git a/02_advanced/unterricht/tag16/01_README.md b/02_advanced/unterricht/tag16/01_README.md deleted file mode 100644 index a0904cb..0000000 --- a/02_advanced/unterricht/tag16/01_README.md +++ /dev/null @@ -1 +0,0 @@ -# Exkurs: Webseite mit Sass und package.json (scripts) Part II diff --git a/02_advanced/unterricht/tag16/02_mehrdim-array/index.html b/02_advanced/unterricht/tag16/02_mehrdim-array/index.html deleted file mode 100644 index bbb2b94..0000000 --- a/02_advanced/unterricht/tag16/02_mehrdim-array/index.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - - Mehrdimensionales Array - - - -
    -
    -

    Mehrdimensionales Array

    -
    -
    - - - diff --git a/02_advanced/unterricht/tag17/01_chess-vorlage/index.html b/02_advanced/unterricht/tag17/01_chess-vorlage/index.html deleted file mode 100644 index ff28112..0000000 --- a/02_advanced/unterricht/tag17/01_chess-vorlage/index.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - Chess Vorlage - - - -
    -
    -

    Chess Vorlage

    -
    -
    - - - diff --git a/02_advanced/unterricht/tag17/02_chess-move/index.html b/02_advanced/unterricht/tag17/02_chess-move/index.html deleted file mode 100644 index 36bc077..0000000 --- a/02_advanced/unterricht/tag17/02_chess-move/index.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - Chess Move - - - - -
    -
    -

    Chess Move

    -
    -
    -
    - - - diff --git a/02_advanced/unterricht/tag17/03_chess-moves/index.html b/02_advanced/unterricht/tag17/03_chess-moves/index.html deleted file mode 100644 index 80763e6..0000000 --- a/02_advanced/unterricht/tag17/03_chess-moves/index.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - Chess Moves - - - - -
    -
    -

    Chess Move

    -
    -
    -
    - - - diff --git a/02_advanced/unterricht/tag17/04_getMovesHistoryArray/index.html b/02_advanced/unterricht/tag17/04_getMovesHistoryArray/index.html deleted file mode 100644 index a20b87a..0000000 --- a/02_advanced/unterricht/tag17/04_getMovesHistoryArray/index.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - History Values in einem Array bleiben - - - -
    -
    -

    History Values in einem Array bleiben

    -

    Alle vergangenen Schachzüge sollen in einer Array Position vorliegen

    -
    -
    - - - diff --git a/02_advanced/unterricht/tag17/05_chess-final/index.html b/02_advanced/unterricht/tag17/05_chess-final/index.html deleted file mode 100644 index f1d4ce4..0000000 --- a/02_advanced/unterricht/tag17/05_chess-final/index.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - Chess Moves - - - - -
    -
    -

    Chess Move

    -
    -
    -
    - - - diff --git a/02_advanced/unterricht/tag17/06_fetch-api/index.html b/02_advanced/unterricht/tag17/06_fetch-api/index.html deleted file mode 100644 index 8a2837f..0000000 --- a/02_advanced/unterricht/tag17/06_fetch-api/index.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - Fetch API - - - -
    -
    -

    Fetch API

    -

    - Die Fetch API bietet eine Schnittstelle - zum Abrufen von Ressourcen (einschließlich über das Netzwerk). Sie ist ein leistungsfähigerer und flexiblerer - Ersatz für XMLHttpRequest. -

    -
    -
    - - - diff --git a/02_advanced/unterricht/tag17/07_fetch-api-promise/index.html b/02_advanced/unterricht/tag17/07_fetch-api-promise/index.html deleted file mode 100644 index 6654e1c..0000000 --- a/02_advanced/unterricht/tag17/07_fetch-api-promise/index.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - Fetch API - - - -
    -
    -

    Fetch API

    -

    - Die Fetch API bietet eine Schnittstelle - zum Abrufen von Ressourcen (einschließlich über das Netzwerk). Sie ist ein leistungsfähigerer und flexiblerer - Ersatz für XMLHttpRequest. -

    -
    -
    - - - diff --git a/02_advanced/unterricht/tag17/08_fetch-api-async-await/index.html b/02_advanced/unterricht/tag17/08_fetch-api-async-await/index.html deleted file mode 100644 index 92f6ef6..0000000 --- a/02_advanced/unterricht/tag17/08_fetch-api-async-await/index.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - Fetch API - - - -
    -
    -

    Fetch API

    -

    - Die Fetch API bietet eine Schnittstelle - zum Abrufen von Ressourcen (einschließlich über das Netzwerk). Sie ist ein leistungsfähigerer und flexiblerer - Ersatz für XMLHttpRequest. -

    -
    -
    - - - diff --git a/02_advanced/unterricht/tag17/09_json-stringify-parse/index.html b/02_advanced/unterricht/tag17/09_json-stringify-parse/index.html deleted file mode 100644 index f6b558b..0000000 --- a/02_advanced/unterricht/tag17/09_json-stringify-parse/index.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - JSON.stringify() & JSON.parse() - - - -
    -
    -

    JSON.stringify() & JSON.parse()

    -

    - Im Gegensatz zu den meisten globalen Objekten ist - JSON kein - Konstruktor. Sie können es nicht mit dem new Operator verwenden oder das JSON Objekt als Funktion aufrufen. - Alle Eigenschaften und Methoden von JSON sind statisch (genau wie das Math Objekt). -

    -
    -
    - - - diff --git a/02_advanced/unterricht/tag17/09_json-stringify-parse/tableGrades.json b/02_advanced/unterricht/tag17/09_json-stringify-parse/tableGrades.json deleted file mode 100644 index 19a12b4..0000000 --- a/02_advanced/unterricht/tag17/09_json-stringify-parse/tableGrades.json +++ /dev/null @@ -1,26 +0,0 @@ -[ - { - "name": "Anna", - "scores": [ - { "name": "Mathematics", "score": 85 }, - { "name": "English", "score": 92 }, - { "name": "Biology", "score": 78 } - ] - }, - { - "name": "Ben", - "scores": [ - { "name": "Mathematics", "score": 76 }, - { "name": "English", "score": 95 }, - { "name": "Biology", "score": 89 } - ] - }, - { - "name": "Clara", - "scores": [ - { "name": "Mathematics", "score": 85 }, - { "name": "English", "score": 92 }, - { "name": "Biology", "score": 78 } - ] - } -] diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/css/main.css b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/css/main.css deleted file mode 100644 index c4c9af6..0000000 --- a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/css/main.css +++ /dev/null @@ -1,12133 +0,0 @@ -@charset "UTF-8"; -/*! - * Bootstrap v5.3.8 (https://getbootstrap.com/) - * Copyright 2011-2025 The Bootstrap Authors - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -:root, -[data-bs-theme=light] { - --bs-blue: #0d6efd; - --bs-indigo: #6610f2; - --bs-purple: #6f42c1; - --bs-pink: #d63384; - --bs-red: #dc3545; - --bs-orange: #fd7e14; - --bs-yellow: #ffc107; - --bs-green: #198754; - --bs-teal: #20c997; - --bs-cyan: #0dcaf0; - --bs-black: #000; - --bs-white: #fff; - --bs-gray: #6c757d; - --bs-gray-dark: #343a40; - --bs-gray-100: #f8f9fa; - --bs-gray-200: #e9ecef; - --bs-gray-300: #dee2e6; - --bs-gray-400: #ced4da; - --bs-gray-500: #adb5bd; - --bs-gray-600: #6c757d; - --bs-gray-700: #495057; - --bs-gray-800: #343a40; - --bs-gray-900: #212529; - --bs-primary: #0d6efd; - --bs-secondary: #6c757d; - --bs-success: #198754; - --bs-info: #0dcaf0; - --bs-warning: #ffc107; - --bs-danger: #dc3545; - --bs-light: #f8f9fa; - --bs-dark: #212529; - --bs-primary-rgb: 13, 110, 253; - --bs-secondary-rgb: 108, 117, 125; - --bs-success-rgb: 25, 135, 84; - --bs-info-rgb: 13, 202, 240; - --bs-warning-rgb: 255, 193, 7; - --bs-danger-rgb: 220, 53, 69; - --bs-light-rgb: 248, 249, 250; - --bs-dark-rgb: 33, 37, 41; - --bs-primary-text-emphasis: rgb(5.2, 44, 101.2); - --bs-secondary-text-emphasis: rgb(43.2, 46.8, 50); - --bs-success-text-emphasis: rgb(10, 54, 33.6); - --bs-info-text-emphasis: rgb(5.2, 80.8, 96); - --bs-warning-text-emphasis: rgb(102, 77.2, 2.8); - --bs-danger-text-emphasis: rgb(88, 21.2, 27.6); - --bs-light-text-emphasis: #495057; - --bs-dark-text-emphasis: #495057; - --bs-primary-bg-subtle: rgb(206.6, 226, 254.6); - --bs-secondary-bg-subtle: rgb(225.6, 227.4, 229); - --bs-success-bg-subtle: rgb(209, 231, 220.8); - --bs-info-bg-subtle: rgb(206.6, 244.4, 252); - --bs-warning-bg-subtle: rgb(255, 242.6, 205.4); - --bs-danger-bg-subtle: rgb(248, 214.6, 217.8); - --bs-light-bg-subtle: rgb(251.5, 252, 252.5); - --bs-dark-bg-subtle: #ced4da; - --bs-primary-border-subtle: rgb(158.2, 197, 254.2); - --bs-secondary-border-subtle: rgb(196.2, 199.8, 203); - --bs-success-border-subtle: rgb(163, 207, 186.6); - --bs-info-border-subtle: rgb(158.2, 233.8, 249); - --bs-warning-border-subtle: rgb(255, 230.2, 155.8); - --bs-danger-border-subtle: rgb(241, 174.2, 180.6); - --bs-light-border-subtle: #e9ecef; - --bs-dark-border-subtle: #adb5bd; - --bs-white-rgb: 255, 255, 255; - --bs-black-rgb: 0, 0, 0; - --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0)); - --bs-body-font-family: var(--bs-font-sans-serif); - --bs-body-font-size: 1rem; - --bs-body-font-weight: 400; - --bs-body-line-height: 1.5; - --bs-body-color: #212529; - --bs-body-color-rgb: 33, 37, 41; - --bs-body-bg: #fff; - --bs-body-bg-rgb: 255, 255, 255; - --bs-emphasis-color: #000; - --bs-emphasis-color-rgb: 0, 0, 0; - --bs-secondary-color: rgba(33, 37, 41, 0.75); - --bs-secondary-color-rgb: 33, 37, 41; - --bs-secondary-bg: #e9ecef; - --bs-secondary-bg-rgb: 233, 236, 239; - --bs-tertiary-color: rgba(33, 37, 41, 0.5); - --bs-tertiary-color-rgb: 33, 37, 41; - --bs-tertiary-bg: #f8f9fa; - --bs-tertiary-bg-rgb: 248, 249, 250; - --bs-heading-color: inherit; - --bs-link-color: #0d6efd; - --bs-link-color-rgb: 13, 110, 253; - --bs-link-decoration: underline; - --bs-link-hover-color: rgb(10.4, 88, 202.4); - --bs-link-hover-color-rgb: 10, 88, 202; - --bs-code-color: #d63384; - --bs-highlight-color: #212529; - --bs-highlight-bg: rgb(255, 242.6, 205.4); - --bs-border-width: 1px; - --bs-border-style: solid; - --bs-border-color: #dee2e6; - --bs-border-color-translucent: rgba(0, 0, 0, 0.175); - --bs-border-radius: 0.375rem; - --bs-border-radius-sm: 0.25rem; - --bs-border-radius-lg: 0.5rem; - --bs-border-radius-xl: 1rem; - --bs-border-radius-xxl: 2rem; - --bs-border-radius-2xl: var(--bs-border-radius-xxl); - --bs-border-radius-pill: 50rem; - --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); - --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); - --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175); - --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075); - --bs-focus-ring-width: 0.25rem; - --bs-focus-ring-opacity: 0.25; - --bs-focus-ring-color: rgba(13, 110, 253, 0.25); - --bs-form-valid-color: #198754; - --bs-form-valid-border-color: #198754; - --bs-form-invalid-color: #dc3545; - --bs-form-invalid-border-color: #dc3545; -} - -[data-bs-theme=dark] { - color-scheme: dark; - --bs-body-color: #dee2e6; - --bs-body-color-rgb: 222, 226, 230; - --bs-body-bg: #212529; - --bs-body-bg-rgb: 33, 37, 41; - --bs-emphasis-color: #fff; - --bs-emphasis-color-rgb: 255, 255, 255; - --bs-secondary-color: rgba(222, 226, 230, 0.75); - --bs-secondary-color-rgb: 222, 226, 230; - --bs-secondary-bg: #343a40; - --bs-secondary-bg-rgb: 52, 58, 64; - --bs-tertiary-color: rgba(222, 226, 230, 0.5); - --bs-tertiary-color-rgb: 222, 226, 230; - --bs-tertiary-bg: rgb(42.5, 47.5, 52.5); - --bs-tertiary-bg-rgb: 43, 48, 53; - --bs-primary-text-emphasis: rgb(109.8, 168, 253.8); - --bs-secondary-text-emphasis: rgb(166.8, 172.2, 177); - --bs-success-text-emphasis: rgb(117, 183, 152.4); - --bs-info-text-emphasis: rgb(109.8, 223.2, 246); - --bs-warning-text-emphasis: rgb(255, 217.8, 106.2); - --bs-danger-text-emphasis: rgb(234, 133.8, 143.4); - --bs-light-text-emphasis: #f8f9fa; - --bs-dark-text-emphasis: #dee2e6; - --bs-primary-bg-subtle: rgb(2.6, 22, 50.6); - --bs-secondary-bg-subtle: rgb(21.6, 23.4, 25); - --bs-success-bg-subtle: rgb(5, 27, 16.8); - --bs-info-bg-subtle: rgb(2.6, 40.4, 48); - --bs-warning-bg-subtle: rgb(51, 38.6, 1.4); - --bs-danger-bg-subtle: rgb(44, 10.6, 13.8); - --bs-light-bg-subtle: #343a40; - --bs-dark-bg-subtle: #1a1d20; - --bs-primary-border-subtle: rgb(7.8, 66, 151.8); - --bs-secondary-border-subtle: rgb(64.8, 70.2, 75); - --bs-success-border-subtle: rgb(15, 81, 50.4); - --bs-info-border-subtle: rgb(7.8, 121.2, 144); - --bs-warning-border-subtle: rgb(153, 115.8, 4.2); - --bs-danger-border-subtle: rgb(132, 31.8, 41.4); - --bs-light-border-subtle: #495057; - --bs-dark-border-subtle: #343a40; - --bs-heading-color: inherit; - --bs-link-color: rgb(109.8, 168, 253.8); - --bs-link-hover-color: rgb(138.84, 185.4, 254.04); - --bs-link-color-rgb: 110, 168, 254; - --bs-link-hover-color-rgb: 139, 185, 254; - --bs-code-color: rgb(230.4, 132.6, 181.2); - --bs-highlight-color: #dee2e6; - --bs-highlight-bg: rgb(102, 77.2, 2.8); - --bs-border-color: #495057; - --bs-border-color-translucent: rgba(255, 255, 255, 0.15); - --bs-form-valid-color: rgb(117, 183, 152.4); - --bs-form-valid-border-color: rgb(117, 183, 152.4); - --bs-form-invalid-color: rgb(234, 133.8, 143.4); - --bs-form-invalid-border-color: rgb(234, 133.8, 143.4); -} - -*, -*::before, -*::after { - box-sizing: border-box; -} - -@media (prefers-reduced-motion: no-preference) { - :root { - scroll-behavior: smooth; - } -} - -body { - margin: 0; - font-family: var(--bs-body-font-family); - font-size: var(--bs-body-font-size); - font-weight: var(--bs-body-font-weight); - line-height: var(--bs-body-line-height); - color: var(--bs-body-color); - text-align: var(--bs-body-text-align); - background-color: var(--bs-body-bg); - -webkit-text-size-adjust: 100%; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} - -hr { - margin: 1rem 0; - color: inherit; - border: 0; - border-top: var(--bs-border-width) solid; - opacity: 0.25; -} - -h6, .h6, h5, .h5, h4, .h4, h3, .h3, h2, .h2, h1, .h1 { - margin-top: 0; - margin-bottom: 0.5rem; - font-weight: 500; - line-height: 1.2; - color: var(--bs-heading-color); -} - -h1, .h1 { - font-size: calc(1.375rem + 1.5vw); -} -@media (min-width: 1200px) { - h1, .h1 { - font-size: 2.5rem; - } -} - -h2, .h2 { - font-size: calc(1.325rem + 0.9vw); -} -@media (min-width: 1200px) { - h2, .h2 { - font-size: 2rem; - } -} - -h3, .h3 { - font-size: calc(1.3rem + 0.6vw); -} -@media (min-width: 1200px) { - h3, .h3 { - font-size: 1.75rem; - } -} - -h4, .h4 { - font-size: calc(1.275rem + 0.3vw); -} -@media (min-width: 1200px) { - h4, .h4 { - font-size: 1.5rem; - } -} - -h5, .h5 { - font-size: 1.25rem; -} - -h6, .h6 { - font-size: 1rem; -} - -p { - margin-top: 0; - margin-bottom: 1rem; -} - -abbr[title] { - text-decoration: underline dotted; - cursor: help; - text-decoration-skip-ink: none; -} - -address { - margin-bottom: 1rem; - font-style: normal; - line-height: inherit; -} - -ol, -ul { - padding-left: 2rem; -} - -ol, -ul, -dl { - margin-top: 0; - margin-bottom: 1rem; -} - -ol ol, -ul ul, -ol ul, -ul ol { - margin-bottom: 0; -} - -dt { - font-weight: 700; -} - -dd { - margin-bottom: 0.5rem; - margin-left: 0; -} - -blockquote { - margin: 0 0 1rem; -} - -b, -strong { - font-weight: bolder; -} - -small, .small { - font-size: 0.875em; -} - -mark, .mark { - padding: 0.1875em; - color: var(--bs-highlight-color); - background-color: var(--bs-highlight-bg); -} - -sub, -sup { - position: relative; - font-size: 0.75em; - line-height: 0; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -a { - color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1)); - text-decoration: underline; -} -a:hover { - --bs-link-color-rgb: var(--bs-link-hover-color-rgb); -} - -a:not([href]):not([class]), a:not([href]):not([class]):hover { - color: inherit; - text-decoration: none; -} - -pre, -code, -kbd, -samp { - font-family: var(--bs-font-monospace); - font-size: 1em; -} - -pre { - display: block; - margin-top: 0; - margin-bottom: 1rem; - overflow: auto; - font-size: 0.875em; -} -pre code { - font-size: inherit; - color: inherit; - word-break: normal; -} - -code { - font-size: 0.875em; - color: var(--bs-code-color); - word-wrap: break-word; -} -a > code { - color: inherit; -} - -kbd { - padding: 0.1875rem 0.375rem; - font-size: 0.875em; - color: var(--bs-body-bg); - background-color: var(--bs-body-color); - border-radius: 0.25rem; -} -kbd kbd { - padding: 0; - font-size: 1em; -} - -figure { - margin: 0 0 1rem; -} - -img, -svg { - vertical-align: middle; -} - -table { - caption-side: bottom; - border-collapse: collapse; -} - -caption { - padding-top: 0.5rem; - padding-bottom: 0.5rem; - color: var(--bs-secondary-color); - text-align: left; -} - -th { - text-align: inherit; - text-align: -webkit-match-parent; -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - -label { - display: inline-block; -} - -button { - border-radius: 0; -} - -button:focus:not(:focus-visible) { - outline: 0; -} - -input, -button, -select, -optgroup, -textarea { - margin: 0; - font-family: inherit; - font-size: inherit; - line-height: inherit; -} - -button, -select { - text-transform: none; -} - -[role=button] { - cursor: pointer; -} - -select { - word-wrap: normal; -} -select:disabled { - opacity: 1; -} - -[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator { - display: none !important; -} - -button, -[type=button], -[type=reset], -[type=submit] { - -webkit-appearance: button; -} -button:not(:disabled), -[type=button]:not(:disabled), -[type=reset]:not(:disabled), -[type=submit]:not(:disabled) { - cursor: pointer; -} - -::-moz-focus-inner { - padding: 0; - border-style: none; -} - -textarea { - resize: vertical; -} - -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0; -} - -legend { - float: left; - width: 100%; - padding: 0; - margin-bottom: 0.5rem; - line-height: inherit; - font-size: calc(1.275rem + 0.3vw); -} -@media (min-width: 1200px) { - legend { - font-size: 1.5rem; - } -} -legend + * { - clear: left; -} - -::-webkit-datetime-edit-fields-wrapper, -::-webkit-datetime-edit-text, -::-webkit-datetime-edit-minute, -::-webkit-datetime-edit-hour-field, -::-webkit-datetime-edit-day-field, -::-webkit-datetime-edit-month-field, -::-webkit-datetime-edit-year-field { - padding: 0; -} - -::-webkit-inner-spin-button { - height: auto; -} - -[type=search] { - -webkit-appearance: textfield; - outline-offset: -2px; -} -[type=search]::-webkit-search-cancel-button { - cursor: pointer; - filter: grayscale(1); -} - -/* rtl:raw: -[type="tel"], -[type="url"], -[type="email"], -[type="number"] { - direction: ltr; -} -*/ -::-webkit-search-decoration { - -webkit-appearance: none; -} - -::-webkit-color-swatch-wrapper { - padding: 0; -} - -::file-selector-button { - font: inherit; - -webkit-appearance: button; -} - -output { - display: inline-block; -} - -iframe { - border: 0; -} - -summary { - display: list-item; - cursor: pointer; -} - -progress { - vertical-align: baseline; -} - -[hidden] { - display: none !important; -} - -.lead { - font-size: 1.25rem; - font-weight: 300; -} - -.display-1 { - font-weight: 300; - line-height: 1.2; - font-size: calc(1.625rem + 4.5vw); -} -@media (min-width: 1200px) { - .display-1 { - font-size: 5rem; - } -} - -.display-2 { - font-weight: 300; - line-height: 1.2; - font-size: calc(1.575rem + 3.9vw); -} -@media (min-width: 1200px) { - .display-2 { - font-size: 4.5rem; - } -} - -.display-3 { - font-weight: 300; - line-height: 1.2; - font-size: calc(1.525rem + 3.3vw); -} -@media (min-width: 1200px) { - .display-3 { - font-size: 4rem; - } -} - -.display-4 { - font-weight: 300; - line-height: 1.2; - font-size: calc(1.475rem + 2.7vw); -} -@media (min-width: 1200px) { - .display-4 { - font-size: 3.5rem; - } -} - -.display-5 { - font-weight: 300; - line-height: 1.2; - font-size: calc(1.425rem + 2.1vw); -} -@media (min-width: 1200px) { - .display-5 { - font-size: 3rem; - } -} - -.display-6 { - font-weight: 300; - line-height: 1.2; - font-size: calc(1.375rem + 1.5vw); -} -@media (min-width: 1200px) { - .display-6 { - font-size: 2.5rem; - } -} - -.list-unstyled { - padding-left: 0; - list-style: none; -} - -.list-inline { - padding-left: 0; - list-style: none; -} - -.list-inline-item { - display: inline-block; -} -.list-inline-item:not(:last-child) { - margin-right: 0.5rem; -} - -.initialism { - font-size: 0.875em; - text-transform: uppercase; -} - -.blockquote { - margin-bottom: 1rem; - font-size: 1.25rem; -} -.blockquote > :last-child { - margin-bottom: 0; -} - -.blockquote-footer { - margin-top: -1rem; - margin-bottom: 1rem; - font-size: 0.875em; - color: #6c757d; -} -.blockquote-footer::before { - content: "— "; -} - -.img-fluid { - max-width: 100%; - height: auto; -} - -.img-thumbnail { - padding: 0.25rem; - background-color: var(--bs-body-bg); - border: var(--bs-border-width) solid var(--bs-border-color); - border-radius: var(--bs-border-radius); - max-width: 100%; - height: auto; -} - -.figure { - display: inline-block; -} - -.figure-img { - margin-bottom: 0.5rem; - line-height: 1; -} - -.figure-caption { - font-size: 0.875em; - color: var(--bs-secondary-color); -} - -.container, -.container-fluid, -.container-xxl, -.container-xl, -.container-lg, -.container-md, -.container-sm { - --bs-gutter-x: 1.5rem; - --bs-gutter-y: 0; - width: 100%; - padding-right: calc(var(--bs-gutter-x) * 0.5); - padding-left: calc(var(--bs-gutter-x) * 0.5); - margin-right: auto; - margin-left: auto; -} - -@media (min-width: 576px) { - .container-sm, .container { - max-width: 540px; - } -} -@media (min-width: 768px) { - .container-md, .container-sm, .container { - max-width: 720px; - } -} -@media (min-width: 992px) { - .container-lg, .container-md, .container-sm, .container { - max-width: 960px; - } -} -@media (min-width: 1200px) { - .container-xl, .container-lg, .container-md, .container-sm, .container { - max-width: 1140px; - } -} -@media (min-width: 1400px) { - .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container { - max-width: 1320px; - } -} -:root { - --bs-breakpoint-xs: 0; - --bs-breakpoint-sm: 576px; - --bs-breakpoint-md: 768px; - --bs-breakpoint-lg: 992px; - --bs-breakpoint-xl: 1200px; - --bs-breakpoint-xxl: 1400px; -} - -.row { - --bs-gutter-x: 1.5rem; - --bs-gutter-y: 0; - display: flex; - flex-wrap: wrap; - margin-top: calc(-1 * var(--bs-gutter-y)); - margin-right: calc(-0.5 * var(--bs-gutter-x)); - margin-left: calc(-0.5 * var(--bs-gutter-x)); -} -.row > * { - flex-shrink: 0; - width: 100%; - max-width: 100%; - padding-right: calc(var(--bs-gutter-x) * 0.5); - padding-left: calc(var(--bs-gutter-x) * 0.5); - margin-top: var(--bs-gutter-y); -} - -.col { - flex: 1 0 0; -} - -.row-cols-auto > * { - flex: 0 0 auto; - width: auto; -} - -.row-cols-1 > * { - flex: 0 0 auto; - width: 100%; -} - -.row-cols-2 > * { - flex: 0 0 auto; - width: 50%; -} - -.row-cols-3 > * { - flex: 0 0 auto; - width: 33.33333333%; -} - -.row-cols-4 > * { - flex: 0 0 auto; - width: 25%; -} - -.row-cols-5 > * { - flex: 0 0 auto; - width: 20%; -} - -.row-cols-6 > * { - flex: 0 0 auto; - width: 16.66666667%; -} - -.col-auto { - flex: 0 0 auto; - width: auto; -} - -.col-1 { - flex: 0 0 auto; - width: 8.33333333%; -} - -.col-2 { - flex: 0 0 auto; - width: 16.66666667%; -} - -.col-3 { - flex: 0 0 auto; - width: 25%; -} - -.col-4 { - flex: 0 0 auto; - width: 33.33333333%; -} - -.col-5 { - flex: 0 0 auto; - width: 41.66666667%; -} - -.col-6 { - flex: 0 0 auto; - width: 50%; -} - -.col-7 { - flex: 0 0 auto; - width: 58.33333333%; -} - -.col-8 { - flex: 0 0 auto; - width: 66.66666667%; -} - -.col-9 { - flex: 0 0 auto; - width: 75%; -} - -.col-10 { - flex: 0 0 auto; - width: 83.33333333%; -} - -.col-11 { - flex: 0 0 auto; - width: 91.66666667%; -} - -.col-12 { - flex: 0 0 auto; - width: 100%; -} - -.offset-1 { - margin-left: 8.33333333%; -} - -.offset-2 { - margin-left: 16.66666667%; -} - -.offset-3 { - margin-left: 25%; -} - -.offset-4 { - margin-left: 33.33333333%; -} - -.offset-5 { - margin-left: 41.66666667%; -} - -.offset-6 { - margin-left: 50%; -} - -.offset-7 { - margin-left: 58.33333333%; -} - -.offset-8 { - margin-left: 66.66666667%; -} - -.offset-9 { - margin-left: 75%; -} - -.offset-10 { - margin-left: 83.33333333%; -} - -.offset-11 { - margin-left: 91.66666667%; -} - -.g-0, -.gx-0 { - --bs-gutter-x: 0; -} - -.g-0, -.gy-0 { - --bs-gutter-y: 0; -} - -.g-1, -.gx-1 { - --bs-gutter-x: 0.25rem; -} - -.g-1, -.gy-1 { - --bs-gutter-y: 0.25rem; -} - -.g-2, -.gx-2 { - --bs-gutter-x: 0.5rem; -} - -.g-2, -.gy-2 { - --bs-gutter-y: 0.5rem; -} - -.g-3, -.gx-3 { - --bs-gutter-x: 1rem; -} - -.g-3, -.gy-3 { - --bs-gutter-y: 1rem; -} - -.g-4, -.gx-4 { - --bs-gutter-x: 1.5rem; -} - -.g-4, -.gy-4 { - --bs-gutter-y: 1.5rem; -} - -.g-5, -.gx-5 { - --bs-gutter-x: 3rem; -} - -.g-5, -.gy-5 { - --bs-gutter-y: 3rem; -} - -@media (min-width: 576px) { - .col-sm { - flex: 1 0 0; - } - .row-cols-sm-auto > * { - flex: 0 0 auto; - width: auto; - } - .row-cols-sm-1 > * { - flex: 0 0 auto; - width: 100%; - } - .row-cols-sm-2 > * { - flex: 0 0 auto; - width: 50%; - } - .row-cols-sm-3 > * { - flex: 0 0 auto; - width: 33.33333333%; - } - .row-cols-sm-4 > * { - flex: 0 0 auto; - width: 25%; - } - .row-cols-sm-5 > * { - flex: 0 0 auto; - width: 20%; - } - .row-cols-sm-6 > * { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-sm-auto { - flex: 0 0 auto; - width: auto; - } - .col-sm-1 { - flex: 0 0 auto; - width: 8.33333333%; - } - .col-sm-2 { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-sm-3 { - flex: 0 0 auto; - width: 25%; - } - .col-sm-4 { - flex: 0 0 auto; - width: 33.33333333%; - } - .col-sm-5 { - flex: 0 0 auto; - width: 41.66666667%; - } - .col-sm-6 { - flex: 0 0 auto; - width: 50%; - } - .col-sm-7 { - flex: 0 0 auto; - width: 58.33333333%; - } - .col-sm-8 { - flex: 0 0 auto; - width: 66.66666667%; - } - .col-sm-9 { - flex: 0 0 auto; - width: 75%; - } - .col-sm-10 { - flex: 0 0 auto; - width: 83.33333333%; - } - .col-sm-11 { - flex: 0 0 auto; - width: 91.66666667%; - } - .col-sm-12 { - flex: 0 0 auto; - width: 100%; - } - .offset-sm-0 { - margin-left: 0; - } - .offset-sm-1 { - margin-left: 8.33333333%; - } - .offset-sm-2 { - margin-left: 16.66666667%; - } - .offset-sm-3 { - margin-left: 25%; - } - .offset-sm-4 { - margin-left: 33.33333333%; - } - .offset-sm-5 { - margin-left: 41.66666667%; - } - .offset-sm-6 { - margin-left: 50%; - } - .offset-sm-7 { - margin-left: 58.33333333%; - } - .offset-sm-8 { - margin-left: 66.66666667%; - } - .offset-sm-9 { - margin-left: 75%; - } - .offset-sm-10 { - margin-left: 83.33333333%; - } - .offset-sm-11 { - margin-left: 91.66666667%; - } - .g-sm-0, - .gx-sm-0 { - --bs-gutter-x: 0; - } - .g-sm-0, - .gy-sm-0 { - --bs-gutter-y: 0; - } - .g-sm-1, - .gx-sm-1 { - --bs-gutter-x: 0.25rem; - } - .g-sm-1, - .gy-sm-1 { - --bs-gutter-y: 0.25rem; - } - .g-sm-2, - .gx-sm-2 { - --bs-gutter-x: 0.5rem; - } - .g-sm-2, - .gy-sm-2 { - --bs-gutter-y: 0.5rem; - } - .g-sm-3, - .gx-sm-3 { - --bs-gutter-x: 1rem; - } - .g-sm-3, - .gy-sm-3 { - --bs-gutter-y: 1rem; - } - .g-sm-4, - .gx-sm-4 { - --bs-gutter-x: 1.5rem; - } - .g-sm-4, - .gy-sm-4 { - --bs-gutter-y: 1.5rem; - } - .g-sm-5, - .gx-sm-5 { - --bs-gutter-x: 3rem; - } - .g-sm-5, - .gy-sm-5 { - --bs-gutter-y: 3rem; - } -} -@media (min-width: 768px) { - .col-md { - flex: 1 0 0; - } - .row-cols-md-auto > * { - flex: 0 0 auto; - width: auto; - } - .row-cols-md-1 > * { - flex: 0 0 auto; - width: 100%; - } - .row-cols-md-2 > * { - flex: 0 0 auto; - width: 50%; - } - .row-cols-md-3 > * { - flex: 0 0 auto; - width: 33.33333333%; - } - .row-cols-md-4 > * { - flex: 0 0 auto; - width: 25%; - } - .row-cols-md-5 > * { - flex: 0 0 auto; - width: 20%; - } - .row-cols-md-6 > * { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-md-auto { - flex: 0 0 auto; - width: auto; - } - .col-md-1 { - flex: 0 0 auto; - width: 8.33333333%; - } - .col-md-2 { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-md-3 { - flex: 0 0 auto; - width: 25%; - } - .col-md-4 { - flex: 0 0 auto; - width: 33.33333333%; - } - .col-md-5 { - flex: 0 0 auto; - width: 41.66666667%; - } - .col-md-6 { - flex: 0 0 auto; - width: 50%; - } - .col-md-7 { - flex: 0 0 auto; - width: 58.33333333%; - } - .col-md-8 { - flex: 0 0 auto; - width: 66.66666667%; - } - .col-md-9 { - flex: 0 0 auto; - width: 75%; - } - .col-md-10 { - flex: 0 0 auto; - width: 83.33333333%; - } - .col-md-11 { - flex: 0 0 auto; - width: 91.66666667%; - } - .col-md-12 { - flex: 0 0 auto; - width: 100%; - } - .offset-md-0 { - margin-left: 0; - } - .offset-md-1 { - margin-left: 8.33333333%; - } - .offset-md-2 { - margin-left: 16.66666667%; - } - .offset-md-3 { - margin-left: 25%; - } - .offset-md-4 { - margin-left: 33.33333333%; - } - .offset-md-5 { - margin-left: 41.66666667%; - } - .offset-md-6 { - margin-left: 50%; - } - .offset-md-7 { - margin-left: 58.33333333%; - } - .offset-md-8 { - margin-left: 66.66666667%; - } - .offset-md-9 { - margin-left: 75%; - } - .offset-md-10 { - margin-left: 83.33333333%; - } - .offset-md-11 { - margin-left: 91.66666667%; - } - .g-md-0, - .gx-md-0 { - --bs-gutter-x: 0; - } - .g-md-0, - .gy-md-0 { - --bs-gutter-y: 0; - } - .g-md-1, - .gx-md-1 { - --bs-gutter-x: 0.25rem; - } - .g-md-1, - .gy-md-1 { - --bs-gutter-y: 0.25rem; - } - .g-md-2, - .gx-md-2 { - --bs-gutter-x: 0.5rem; - } - .g-md-2, - .gy-md-2 { - --bs-gutter-y: 0.5rem; - } - .g-md-3, - .gx-md-3 { - --bs-gutter-x: 1rem; - } - .g-md-3, - .gy-md-3 { - --bs-gutter-y: 1rem; - } - .g-md-4, - .gx-md-4 { - --bs-gutter-x: 1.5rem; - } - .g-md-4, - .gy-md-4 { - --bs-gutter-y: 1.5rem; - } - .g-md-5, - .gx-md-5 { - --bs-gutter-x: 3rem; - } - .g-md-5, - .gy-md-5 { - --bs-gutter-y: 3rem; - } -} -@media (min-width: 992px) { - .col-lg { - flex: 1 0 0; - } - .row-cols-lg-auto > * { - flex: 0 0 auto; - width: auto; - } - .row-cols-lg-1 > * { - flex: 0 0 auto; - width: 100%; - } - .row-cols-lg-2 > * { - flex: 0 0 auto; - width: 50%; - } - .row-cols-lg-3 > * { - flex: 0 0 auto; - width: 33.33333333%; - } - .row-cols-lg-4 > * { - flex: 0 0 auto; - width: 25%; - } - .row-cols-lg-5 > * { - flex: 0 0 auto; - width: 20%; - } - .row-cols-lg-6 > * { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-lg-auto { - flex: 0 0 auto; - width: auto; - } - .col-lg-1 { - flex: 0 0 auto; - width: 8.33333333%; - } - .col-lg-2 { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-lg-3 { - flex: 0 0 auto; - width: 25%; - } - .col-lg-4 { - flex: 0 0 auto; - width: 33.33333333%; - } - .col-lg-5 { - flex: 0 0 auto; - width: 41.66666667%; - } - .col-lg-6 { - flex: 0 0 auto; - width: 50%; - } - .col-lg-7 { - flex: 0 0 auto; - width: 58.33333333%; - } - .col-lg-8 { - flex: 0 0 auto; - width: 66.66666667%; - } - .col-lg-9 { - flex: 0 0 auto; - width: 75%; - } - .col-lg-10 { - flex: 0 0 auto; - width: 83.33333333%; - } - .col-lg-11 { - flex: 0 0 auto; - width: 91.66666667%; - } - .col-lg-12 { - flex: 0 0 auto; - width: 100%; - } - .offset-lg-0 { - margin-left: 0; - } - .offset-lg-1 { - margin-left: 8.33333333%; - } - .offset-lg-2 { - margin-left: 16.66666667%; - } - .offset-lg-3 { - margin-left: 25%; - } - .offset-lg-4 { - margin-left: 33.33333333%; - } - .offset-lg-5 { - margin-left: 41.66666667%; - } - .offset-lg-6 { - margin-left: 50%; - } - .offset-lg-7 { - margin-left: 58.33333333%; - } - .offset-lg-8 { - margin-left: 66.66666667%; - } - .offset-lg-9 { - margin-left: 75%; - } - .offset-lg-10 { - margin-left: 83.33333333%; - } - .offset-lg-11 { - margin-left: 91.66666667%; - } - .g-lg-0, - .gx-lg-0 { - --bs-gutter-x: 0; - } - .g-lg-0, - .gy-lg-0 { - --bs-gutter-y: 0; - } - .g-lg-1, - .gx-lg-1 { - --bs-gutter-x: 0.25rem; - } - .g-lg-1, - .gy-lg-1 { - --bs-gutter-y: 0.25rem; - } - .g-lg-2, - .gx-lg-2 { - --bs-gutter-x: 0.5rem; - } - .g-lg-2, - .gy-lg-2 { - --bs-gutter-y: 0.5rem; - } - .g-lg-3, - .gx-lg-3 { - --bs-gutter-x: 1rem; - } - .g-lg-3, - .gy-lg-3 { - --bs-gutter-y: 1rem; - } - .g-lg-4, - .gx-lg-4 { - --bs-gutter-x: 1.5rem; - } - .g-lg-4, - .gy-lg-4 { - --bs-gutter-y: 1.5rem; - } - .g-lg-5, - .gx-lg-5 { - --bs-gutter-x: 3rem; - } - .g-lg-5, - .gy-lg-5 { - --bs-gutter-y: 3rem; - } -} -@media (min-width: 1200px) { - .col-xl { - flex: 1 0 0; - } - .row-cols-xl-auto > * { - flex: 0 0 auto; - width: auto; - } - .row-cols-xl-1 > * { - flex: 0 0 auto; - width: 100%; - } - .row-cols-xl-2 > * { - flex: 0 0 auto; - width: 50%; - } - .row-cols-xl-3 > * { - flex: 0 0 auto; - width: 33.33333333%; - } - .row-cols-xl-4 > * { - flex: 0 0 auto; - width: 25%; - } - .row-cols-xl-5 > * { - flex: 0 0 auto; - width: 20%; - } - .row-cols-xl-6 > * { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-xl-auto { - flex: 0 0 auto; - width: auto; - } - .col-xl-1 { - flex: 0 0 auto; - width: 8.33333333%; - } - .col-xl-2 { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-xl-3 { - flex: 0 0 auto; - width: 25%; - } - .col-xl-4 { - flex: 0 0 auto; - width: 33.33333333%; - } - .col-xl-5 { - flex: 0 0 auto; - width: 41.66666667%; - } - .col-xl-6 { - flex: 0 0 auto; - width: 50%; - } - .col-xl-7 { - flex: 0 0 auto; - width: 58.33333333%; - } - .col-xl-8 { - flex: 0 0 auto; - width: 66.66666667%; - } - .col-xl-9 { - flex: 0 0 auto; - width: 75%; - } - .col-xl-10 { - flex: 0 0 auto; - width: 83.33333333%; - } - .col-xl-11 { - flex: 0 0 auto; - width: 91.66666667%; - } - .col-xl-12 { - flex: 0 0 auto; - width: 100%; - } - .offset-xl-0 { - margin-left: 0; - } - .offset-xl-1 { - margin-left: 8.33333333%; - } - .offset-xl-2 { - margin-left: 16.66666667%; - } - .offset-xl-3 { - margin-left: 25%; - } - .offset-xl-4 { - margin-left: 33.33333333%; - } - .offset-xl-5 { - margin-left: 41.66666667%; - } - .offset-xl-6 { - margin-left: 50%; - } - .offset-xl-7 { - margin-left: 58.33333333%; - } - .offset-xl-8 { - margin-left: 66.66666667%; - } - .offset-xl-9 { - margin-left: 75%; - } - .offset-xl-10 { - margin-left: 83.33333333%; - } - .offset-xl-11 { - margin-left: 91.66666667%; - } - .g-xl-0, - .gx-xl-0 { - --bs-gutter-x: 0; - } - .g-xl-0, - .gy-xl-0 { - --bs-gutter-y: 0; - } - .g-xl-1, - .gx-xl-1 { - --bs-gutter-x: 0.25rem; - } - .g-xl-1, - .gy-xl-1 { - --bs-gutter-y: 0.25rem; - } - .g-xl-2, - .gx-xl-2 { - --bs-gutter-x: 0.5rem; - } - .g-xl-2, - .gy-xl-2 { - --bs-gutter-y: 0.5rem; - } - .g-xl-3, - .gx-xl-3 { - --bs-gutter-x: 1rem; - } - .g-xl-3, - .gy-xl-3 { - --bs-gutter-y: 1rem; - } - .g-xl-4, - .gx-xl-4 { - --bs-gutter-x: 1.5rem; - } - .g-xl-4, - .gy-xl-4 { - --bs-gutter-y: 1.5rem; - } - .g-xl-5, - .gx-xl-5 { - --bs-gutter-x: 3rem; - } - .g-xl-5, - .gy-xl-5 { - --bs-gutter-y: 3rem; - } -} -@media (min-width: 1400px) { - .col-xxl { - flex: 1 0 0; - } - .row-cols-xxl-auto > * { - flex: 0 0 auto; - width: auto; - } - .row-cols-xxl-1 > * { - flex: 0 0 auto; - width: 100%; - } - .row-cols-xxl-2 > * { - flex: 0 0 auto; - width: 50%; - } - .row-cols-xxl-3 > * { - flex: 0 0 auto; - width: 33.33333333%; - } - .row-cols-xxl-4 > * { - flex: 0 0 auto; - width: 25%; - } - .row-cols-xxl-5 > * { - flex: 0 0 auto; - width: 20%; - } - .row-cols-xxl-6 > * { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-xxl-auto { - flex: 0 0 auto; - width: auto; - } - .col-xxl-1 { - flex: 0 0 auto; - width: 8.33333333%; - } - .col-xxl-2 { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-xxl-3 { - flex: 0 0 auto; - width: 25%; - } - .col-xxl-4 { - flex: 0 0 auto; - width: 33.33333333%; - } - .col-xxl-5 { - flex: 0 0 auto; - width: 41.66666667%; - } - .col-xxl-6 { - flex: 0 0 auto; - width: 50%; - } - .col-xxl-7 { - flex: 0 0 auto; - width: 58.33333333%; - } - .col-xxl-8 { - flex: 0 0 auto; - width: 66.66666667%; - } - .col-xxl-9 { - flex: 0 0 auto; - width: 75%; - } - .col-xxl-10 { - flex: 0 0 auto; - width: 83.33333333%; - } - .col-xxl-11 { - flex: 0 0 auto; - width: 91.66666667%; - } - .col-xxl-12 { - flex: 0 0 auto; - width: 100%; - } - .offset-xxl-0 { - margin-left: 0; - } - .offset-xxl-1 { - margin-left: 8.33333333%; - } - .offset-xxl-2 { - margin-left: 16.66666667%; - } - .offset-xxl-3 { - margin-left: 25%; - } - .offset-xxl-4 { - margin-left: 33.33333333%; - } - .offset-xxl-5 { - margin-left: 41.66666667%; - } - .offset-xxl-6 { - margin-left: 50%; - } - .offset-xxl-7 { - margin-left: 58.33333333%; - } - .offset-xxl-8 { - margin-left: 66.66666667%; - } - .offset-xxl-9 { - margin-left: 75%; - } - .offset-xxl-10 { - margin-left: 83.33333333%; - } - .offset-xxl-11 { - margin-left: 91.66666667%; - } - .g-xxl-0, - .gx-xxl-0 { - --bs-gutter-x: 0; - } - .g-xxl-0, - .gy-xxl-0 { - --bs-gutter-y: 0; - } - .g-xxl-1, - .gx-xxl-1 { - --bs-gutter-x: 0.25rem; - } - .g-xxl-1, - .gy-xxl-1 { - --bs-gutter-y: 0.25rem; - } - .g-xxl-2, - .gx-xxl-2 { - --bs-gutter-x: 0.5rem; - } - .g-xxl-2, - .gy-xxl-2 { - --bs-gutter-y: 0.5rem; - } - .g-xxl-3, - .gx-xxl-3 { - --bs-gutter-x: 1rem; - } - .g-xxl-3, - .gy-xxl-3 { - --bs-gutter-y: 1rem; - } - .g-xxl-4, - .gx-xxl-4 { - --bs-gutter-x: 1.5rem; - } - .g-xxl-4, - .gy-xxl-4 { - --bs-gutter-y: 1.5rem; - } - .g-xxl-5, - .gx-xxl-5 { - --bs-gutter-x: 3rem; - } - .g-xxl-5, - .gy-xxl-5 { - --bs-gutter-y: 3rem; - } -} -.table { - --bs-table-color-type: initial; - --bs-table-bg-type: initial; - --bs-table-color-state: initial; - --bs-table-bg-state: initial; - --bs-table-color: var(--bs-emphasis-color); - --bs-table-bg: var(--bs-body-bg); - --bs-table-border-color: var(--bs-border-color); - --bs-table-accent-bg: transparent; - --bs-table-striped-color: var(--bs-emphasis-color); - --bs-table-striped-bg: rgba(var(--bs-emphasis-color-rgb), 0.05); - --bs-table-active-color: var(--bs-emphasis-color); - --bs-table-active-bg: rgba(var(--bs-emphasis-color-rgb), 0.1); - --bs-table-hover-color: var(--bs-emphasis-color); - --bs-table-hover-bg: rgba(var(--bs-emphasis-color-rgb), 0.075); - width: 100%; - margin-bottom: 1rem; - vertical-align: top; - border-color: var(--bs-table-border-color); -} -.table > :not(caption) > * > * { - padding: 0.5rem 0.5rem; - color: var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color))); - background-color: var(--bs-table-bg); - border-bottom-width: var(--bs-border-width); - box-shadow: inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg))); -} -.table > tbody { - vertical-align: inherit; -} -.table > thead { - vertical-align: bottom; -} - -.table-group-divider { - border-top: calc(var(--bs-border-width) * 2) solid currentcolor; -} - -.caption-top { - caption-side: top; -} - -.table-sm > :not(caption) > * > * { - padding: 0.25rem 0.25rem; -} - -.table-bordered > :not(caption) > * { - border-width: var(--bs-border-width) 0; -} -.table-bordered > :not(caption) > * > * { - border-width: 0 var(--bs-border-width); -} - -.table-borderless > :not(caption) > * > * { - border-bottom-width: 0; -} -.table-borderless > :not(:first-child) { - border-top-width: 0; -} - -.table-striped > tbody > tr:nth-of-type(odd) > * { - --bs-table-color-type: var(--bs-table-striped-color); - --bs-table-bg-type: var(--bs-table-striped-bg); -} - -.table-striped-columns > :not(caption) > tr > :nth-child(even) { - --bs-table-color-type: var(--bs-table-striped-color); - --bs-table-bg-type: var(--bs-table-striped-bg); -} - -.table-active { - --bs-table-color-state: var(--bs-table-active-color); - --bs-table-bg-state: var(--bs-table-active-bg); -} - -.table-hover > tbody > tr:hover > * { - --bs-table-color-state: var(--bs-table-hover-color); - --bs-table-bg-state: var(--bs-table-hover-bg); -} - -.table-primary { - --bs-table-color: #000; - --bs-table-bg: rgb(206.6, 226, 254.6); - --bs-table-border-color: rgb(165.28, 180.8, 203.68); - --bs-table-striped-bg: rgb(196.27, 214.7, 241.87); - --bs-table-striped-color: #000; - --bs-table-active-bg: rgb(185.94, 203.4, 229.14); - --bs-table-active-color: #000; - --bs-table-hover-bg: rgb(191.105, 209.05, 235.505); - --bs-table-hover-color: #000; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); -} - -.table-secondary { - --bs-table-color: #000; - --bs-table-bg: rgb(225.6, 227.4, 229); - --bs-table-border-color: rgb(180.48, 181.92, 183.2); - --bs-table-striped-bg: rgb(214.32, 216.03, 217.55); - --bs-table-striped-color: #000; - --bs-table-active-bg: rgb(203.04, 204.66, 206.1); - --bs-table-active-color: #000; - --bs-table-hover-bg: rgb(208.68, 210.345, 211.825); - --bs-table-hover-color: #000; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); -} - -.table-success { - --bs-table-color: #000; - --bs-table-bg: rgb(209, 231, 220.8); - --bs-table-border-color: rgb(167.2, 184.8, 176.64); - --bs-table-striped-bg: rgb(198.55, 219.45, 209.76); - --bs-table-striped-color: #000; - --bs-table-active-bg: rgb(188.1, 207.9, 198.72); - --bs-table-active-color: #000; - --bs-table-hover-bg: rgb(193.325, 213.675, 204.24); - --bs-table-hover-color: #000; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); -} - -.table-info { - --bs-table-color: #000; - --bs-table-bg: rgb(206.6, 244.4, 252); - --bs-table-border-color: rgb(165.28, 195.52, 201.6); - --bs-table-striped-bg: rgb(196.27, 232.18, 239.4); - --bs-table-striped-color: #000; - --bs-table-active-bg: rgb(185.94, 219.96, 226.8); - --bs-table-active-color: #000; - --bs-table-hover-bg: rgb(191.105, 226.07, 233.1); - --bs-table-hover-color: #000; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); -} - -.table-warning { - --bs-table-color: #000; - --bs-table-bg: rgb(255, 242.6, 205.4); - --bs-table-border-color: rgb(204, 194.08, 164.32); - --bs-table-striped-bg: rgb(242.25, 230.47, 195.13); - --bs-table-striped-color: #000; - --bs-table-active-bg: rgb(229.5, 218.34, 184.86); - --bs-table-active-color: #000; - --bs-table-hover-bg: rgb(235.875, 224.405, 189.995); - --bs-table-hover-color: #000; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); -} - -.table-danger { - --bs-table-color: #000; - --bs-table-bg: rgb(248, 214.6, 217.8); - --bs-table-border-color: rgb(198.4, 171.68, 174.24); - --bs-table-striped-bg: rgb(235.6, 203.87, 206.91); - --bs-table-striped-color: #000; - --bs-table-active-bg: rgb(223.2, 193.14, 196.02); - --bs-table-active-color: #000; - --bs-table-hover-bg: rgb(229.4, 198.505, 201.465); - --bs-table-hover-color: #000; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); -} - -.table-light { - --bs-table-color: #000; - --bs-table-bg: #f8f9fa; - --bs-table-border-color: rgb(198.4, 199.2, 200); - --bs-table-striped-bg: rgb(235.6, 236.55, 237.5); - --bs-table-striped-color: #000; - --bs-table-active-bg: rgb(223.2, 224.1, 225); - --bs-table-active-color: #000; - --bs-table-hover-bg: rgb(229.4, 230.325, 231.25); - --bs-table-hover-color: #000; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); -} - -.table-dark { - --bs-table-color: #fff; - --bs-table-bg: #212529; - --bs-table-border-color: rgb(77.4, 80.6, 83.8); - --bs-table-striped-bg: rgb(44.1, 47.9, 51.7); - --bs-table-striped-color: #fff; - --bs-table-active-bg: rgb(55.2, 58.8, 62.4); - --bs-table-active-color: #fff; - --bs-table-hover-bg: rgb(49.65, 53.35, 57.05); - --bs-table-hover-color: #fff; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); -} - -.table-responsive { - overflow-x: auto; - -webkit-overflow-scrolling: touch; -} - -@media (max-width: 575.98px) { - .table-responsive-sm { - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } -} -@media (max-width: 767.98px) { - .table-responsive-md { - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } -} -@media (max-width: 991.98px) { - .table-responsive-lg { - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } -} -@media (max-width: 1199.98px) { - .table-responsive-xl { - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } -} -@media (max-width: 1399.98px) { - .table-responsive-xxl { - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } -} -.form-label { - margin-bottom: 0.5rem; -} - -.col-form-label { - padding-top: calc(0.375rem + var(--bs-border-width)); - padding-bottom: calc(0.375rem + var(--bs-border-width)); - margin-bottom: 0; - font-size: inherit; - line-height: 1.5; -} - -.col-form-label-lg { - padding-top: calc(0.5rem + var(--bs-border-width)); - padding-bottom: calc(0.5rem + var(--bs-border-width)); - font-size: 1.25rem; -} - -.col-form-label-sm { - padding-top: calc(0.25rem + var(--bs-border-width)); - padding-bottom: calc(0.25rem + var(--bs-border-width)); - font-size: 0.875rem; -} - -.form-text { - margin-top: 0.25rem; - font-size: 0.875em; - color: var(--bs-secondary-color); -} - -.form-control { - display: block; - width: 100%; - padding: 0.375rem 0.75rem; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: var(--bs-body-color); - appearance: none; - background-color: var(--bs-body-bg); - background-clip: padding-box; - border: var(--bs-border-width) solid var(--bs-border-color); - border-radius: var(--bs-border-radius); - transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .form-control { - transition: none; - } -} -.form-control[type=file] { - overflow: hidden; -} -.form-control[type=file]:not(:disabled):not([readonly]) { - cursor: pointer; -} -.form-control:focus { - color: var(--bs-body-color); - background-color: var(--bs-body-bg); - border-color: rgb(134, 182.5, 254); - outline: 0; - box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); -} -.form-control::-webkit-date-and-time-value { - min-width: 85px; - height: 1.5em; - margin: 0; -} -.form-control::-webkit-datetime-edit { - display: block; - padding: 0; -} -.form-control::placeholder { - color: var(--bs-secondary-color); - opacity: 1; -} -.form-control:disabled { - background-color: var(--bs-secondary-bg); - opacity: 1; -} -.form-control::file-selector-button { - padding: 0.375rem 0.75rem; - margin: -0.375rem -0.75rem; - margin-inline-end: 0.75rem; - color: var(--bs-body-color); - background-color: var(--bs-tertiary-bg); - pointer-events: none; - border-color: inherit; - border-style: solid; - border-width: 0; - border-inline-end-width: var(--bs-border-width); - border-radius: 0; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .form-control::file-selector-button { - transition: none; - } -} -.form-control:hover:not(:disabled):not([readonly])::file-selector-button { - background-color: var(--bs-secondary-bg); -} - -.form-control-plaintext { - display: block; - width: 100%; - padding: 0.375rem 0; - margin-bottom: 0; - line-height: 1.5; - color: var(--bs-body-color); - background-color: transparent; - border: solid transparent; - border-width: var(--bs-border-width) 0; -} -.form-control-plaintext:focus { - outline: 0; -} -.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { - padding-right: 0; - padding-left: 0; -} - -.form-control-sm { - min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - border-radius: var(--bs-border-radius-sm); -} -.form-control-sm::file-selector-button { - padding: 0.25rem 0.5rem; - margin: -0.25rem -0.5rem; - margin-inline-end: 0.5rem; -} - -.form-control-lg { - min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); - padding: 0.5rem 1rem; - font-size: 1.25rem; - border-radius: var(--bs-border-radius-lg); -} -.form-control-lg::file-selector-button { - padding: 0.5rem 1rem; - margin: -0.5rem -1rem; - margin-inline-end: 1rem; -} - -textarea.form-control { - min-height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2)); -} -textarea.form-control-sm { - min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); -} -textarea.form-control-lg { - min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); -} - -.form-control-color { - width: 3rem; - height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2)); - padding: 0.375rem; -} -.form-control-color:not(:disabled):not([readonly]) { - cursor: pointer; -} -.form-control-color::-moz-color-swatch { - border: 0 !important; - border-radius: var(--bs-border-radius); -} -.form-control-color::-webkit-color-swatch { - border: 0 !important; - border-radius: var(--bs-border-radius); -} -.form-control-color.form-control-sm { - height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); -} -.form-control-color.form-control-lg { - height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); -} - -.form-select { - --bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); - display: block; - width: 100%; - padding: 0.375rem 2.25rem 0.375rem 0.75rem; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: var(--bs-body-color); - appearance: none; - background-color: var(--bs-body-bg); - background-image: var(--bs-form-select-bg-img), var(--bs-form-select-bg-icon, none); - background-repeat: no-repeat; - background-position: right 0.75rem center; - background-size: 16px 12px; - border: var(--bs-border-width) solid var(--bs-border-color); - border-radius: var(--bs-border-radius); - transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .form-select { - transition: none; - } -} -.form-select:focus { - border-color: rgb(134, 182.5, 254); - outline: 0; - box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); -} -.form-select[multiple], .form-select[size]:not([size="1"]) { - padding-right: 0.75rem; - background-image: none; -} -.form-select:disabled { - background-color: var(--bs-secondary-bg); -} -.form-select:-moz-focusring { - color: transparent; - text-shadow: 0 0 0 var(--bs-body-color); -} - -.form-select-sm { - padding-top: 0.25rem; - padding-bottom: 0.25rem; - padding-left: 0.5rem; - font-size: 0.875rem; - border-radius: var(--bs-border-radius-sm); -} - -.form-select-lg { - padding-top: 0.5rem; - padding-bottom: 0.5rem; - padding-left: 1rem; - font-size: 1.25rem; - border-radius: var(--bs-border-radius-lg); -} - -[data-bs-theme=dark] .form-select { - --bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); -} - -.form-check { - display: block; - min-height: 1.5rem; - padding-left: 1.5em; - margin-bottom: 0.125rem; -} -.form-check .form-check-input { - float: left; - margin-left: -1.5em; -} - -.form-check-reverse { - padding-right: 1.5em; - padding-left: 0; - text-align: right; -} -.form-check-reverse .form-check-input { - float: right; - margin-right: -1.5em; - margin-left: 0; -} - -.form-check-input { - --bs-form-check-bg: var(--bs-body-bg); - flex-shrink: 0; - width: 1em; - height: 1em; - margin-top: 0.25em; - vertical-align: top; - appearance: none; - background-color: var(--bs-form-check-bg); - background-image: var(--bs-form-check-bg-image); - background-repeat: no-repeat; - background-position: center; - background-size: contain; - border: var(--bs-border-width) solid var(--bs-border-color); - print-color-adjust: exact; -} -.form-check-input[type=checkbox] { - border-radius: 0.25em; -} -.form-check-input[type=radio] { - border-radius: 50%; -} -.form-check-input:active { - filter: brightness(90%); -} -.form-check-input:focus { - border-color: rgb(134, 182.5, 254); - outline: 0; - box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); -} -.form-check-input:checked { - background-color: #0d6efd; - border-color: #0d6efd; -} -.form-check-input:checked[type=checkbox] { - --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e"); -} -.form-check-input:checked[type=radio] { - --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e"); -} -.form-check-input[type=checkbox]:indeterminate { - background-color: #0d6efd; - border-color: #0d6efd; - --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e"); -} -.form-check-input:disabled { - pointer-events: none; - filter: none; - opacity: 0.5; -} -.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label { - cursor: default; - opacity: 0.5; -} - -.form-switch { - padding-left: 2.5em; -} -.form-switch .form-check-input { - --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e"); - width: 2em; - margin-left: -2.5em; - background-image: var(--bs-form-switch-bg); - background-position: left center; - border-radius: 2em; - transition: background-position 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .form-switch .form-check-input { - transition: none; - } -} -.form-switch .form-check-input:focus { - --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgb%28134, 182.5, 254%29'/%3e%3c/svg%3e"); -} -.form-switch .form-check-input:checked { - background-position: right center; - --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); -} -.form-switch.form-check-reverse { - padding-right: 2.5em; - padding-left: 0; -} -.form-switch.form-check-reverse .form-check-input { - margin-right: -2.5em; - margin-left: 0; -} - -.form-check-inline { - display: inline-block; - margin-right: 1rem; -} - -.btn-check { - position: absolute; - clip: rect(0, 0, 0, 0); - pointer-events: none; -} -.btn-check[disabled] + .btn, .btn-check:disabled + .btn { - pointer-events: none; - filter: none; - opacity: 0.65; -} - -[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus) { - --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e"); -} - -.form-range { - width: 100%; - height: 1.5rem; - padding: 0; - appearance: none; - background-color: transparent; -} -.form-range:focus { - outline: 0; -} -.form-range:focus::-webkit-slider-thumb { - box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); -} -.form-range:focus::-moz-range-thumb { - box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); -} -.form-range::-moz-focus-outer { - border: 0; -} -.form-range::-webkit-slider-thumb { - width: 1rem; - height: 1rem; - margin-top: -0.25rem; - appearance: none; - background-color: #0d6efd; - border: 0; - border-radius: 1rem; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .form-range::-webkit-slider-thumb { - transition: none; - } -} -.form-range::-webkit-slider-thumb:active { - background-color: rgb(182.4, 211.5, 254.4); -} -.form-range::-webkit-slider-runnable-track { - width: 100%; - height: 0.5rem; - color: transparent; - cursor: pointer; - background-color: var(--bs-secondary-bg); - border-color: transparent; - border-radius: 1rem; -} -.form-range::-moz-range-thumb { - width: 1rem; - height: 1rem; - appearance: none; - background-color: #0d6efd; - border: 0; - border-radius: 1rem; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .form-range::-moz-range-thumb { - transition: none; - } -} -.form-range::-moz-range-thumb:active { - background-color: rgb(182.4, 211.5, 254.4); -} -.form-range::-moz-range-track { - width: 100%; - height: 0.5rem; - color: transparent; - cursor: pointer; - background-color: var(--bs-secondary-bg); - border-color: transparent; - border-radius: 1rem; -} -.form-range:disabled { - pointer-events: none; -} -.form-range:disabled::-webkit-slider-thumb { - background-color: var(--bs-secondary-color); -} -.form-range:disabled::-moz-range-thumb { - background-color: var(--bs-secondary-color); -} - -.form-floating { - position: relative; -} -.form-floating > .form-control, -.form-floating > .form-control-plaintext, -.form-floating > .form-select { - height: calc(3.5rem + calc(var(--bs-border-width) * 2)); - min-height: calc(3.5rem + calc(var(--bs-border-width) * 2)); - line-height: 1.25; -} -.form-floating > label { - position: absolute; - top: 0; - left: 0; - z-index: 2; - max-width: 100%; - height: 100%; - padding: 1rem 0.75rem; - overflow: hidden; - color: rgba(var(--bs-body-color-rgb), 0.65); - text-align: start; - text-overflow: ellipsis; - white-space: nowrap; - pointer-events: none; - border: var(--bs-border-width) solid transparent; - transform-origin: 0 0; - transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .form-floating > label { - transition: none; - } -} -.form-floating > .form-control, -.form-floating > .form-control-plaintext { - padding: 1rem 0.75rem; -} -.form-floating > .form-control::placeholder, -.form-floating > .form-control-plaintext::placeholder { - color: transparent; -} -.form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown), -.form-floating > .form-control-plaintext:focus, -.form-floating > .form-control-plaintext:not(:placeholder-shown) { - padding-top: 1.625rem; - padding-bottom: 0.625rem; -} -.form-floating > .form-control:-webkit-autofill, -.form-floating > .form-control-plaintext:-webkit-autofill { - padding-top: 1.625rem; - padding-bottom: 0.625rem; -} -.form-floating > .form-select { - padding-top: 1.625rem; - padding-bottom: 0.625rem; - padding-left: 0.75rem; -} -.form-floating > .form-control:focus ~ label, -.form-floating > .form-control:not(:placeholder-shown) ~ label, -.form-floating > .form-control-plaintext ~ label, -.form-floating > .form-select ~ label { - transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); -} -.form-floating > .form-control:-webkit-autofill ~ label { - transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); -} -.form-floating > textarea:focus ~ label::after, -.form-floating > textarea:not(:placeholder-shown) ~ label::after { - position: absolute; - inset: 1rem 0.375rem; - z-index: -1; - height: 1.5em; - content: ""; - background-color: var(--bs-body-bg); - border-radius: var(--bs-border-radius); -} -.form-floating > textarea:disabled ~ label::after { - background-color: var(--bs-secondary-bg); -} -.form-floating > .form-control-plaintext ~ label { - border-width: var(--bs-border-width) 0; -} -.form-floating > :disabled ~ label, -.form-floating > .form-control:disabled ~ label { - color: #6c757d; -} - -.input-group { - position: relative; - display: flex; - flex-wrap: wrap; - align-items: stretch; - width: 100%; -} -.input-group > .form-control, -.input-group > .form-select, -.input-group > .form-floating { - position: relative; - flex: 1 1 auto; - width: 1%; - min-width: 0; -} -.input-group > .form-control:focus, -.input-group > .form-select:focus, -.input-group > .form-floating:focus-within { - z-index: 5; -} -.input-group .btn { - position: relative; - z-index: 2; -} -.input-group .btn:focus { - z-index: 5; -} - -.input-group-text { - display: flex; - align-items: center; - padding: 0.375rem 0.75rem; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: var(--bs-body-color); - text-align: center; - white-space: nowrap; - background-color: var(--bs-tertiary-bg); - border: var(--bs-border-width) solid var(--bs-border-color); - border-radius: var(--bs-border-radius); -} - -.input-group-lg > .form-control, -.input-group-lg > .form-select, -.input-group-lg > .input-group-text, -.input-group-lg > .btn { - padding: 0.5rem 1rem; - font-size: 1.25rem; - border-radius: var(--bs-border-radius-lg); -} - -.input-group-sm > .form-control, -.input-group-sm > .form-select, -.input-group-sm > .input-group-text, -.input-group-sm > .btn { - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - border-radius: var(--bs-border-radius-sm); -} - -.input-group-lg > .form-select, -.input-group-sm > .form-select { - padding-right: 3rem; -} - -.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating), -.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3), -.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-control, -.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-select { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating), -.input-group.has-validation > .dropdown-toggle:nth-last-child(n+4), -.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-control, -.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-select { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) { - margin-left: calc(-1 * var(--bs-border-width)); - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.input-group > .form-floating:not(:first-child) > .form-control, -.input-group > .form-floating:not(:first-child) > .form-select { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} - -.valid-feedback { - display: none; - width: 100%; - margin-top: 0.25rem; - font-size: 0.875em; - color: var(--bs-form-valid-color); -} - -.valid-tooltip { - position: absolute; - top: 100%; - z-index: 5; - display: none; - max-width: 100%; - padding: 0.25rem 0.5rem; - margin-top: 0.1rem; - font-size: 0.875rem; - color: #fff; - background-color: var(--bs-success); - border-radius: var(--bs-border-radius); -} - -.was-validated :valid ~ .valid-feedback, -.was-validated :valid ~ .valid-tooltip, -.is-valid ~ .valid-feedback, -.is-valid ~ .valid-tooltip { - display: block; -} - -.was-validated .form-control:valid, .form-control.is-valid { - border-color: var(--bs-form-valid-border-color); - padding-right: calc(1.5em + 0.75rem); - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1'/%3e%3c/svg%3e"); - background-repeat: no-repeat; - background-position: right calc(0.375em + 0.1875rem) center; - background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); -} -.was-validated .form-control:valid:focus, .form-control.is-valid:focus { - border-color: var(--bs-form-valid-border-color); - box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); -} - -.was-validated textarea.form-control:valid, textarea.form-control.is-valid { - padding-right: calc(1.5em + 0.75rem); - background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); -} - -.was-validated .form-select:valid, .form-select.is-valid { - border-color: var(--bs-form-valid-border-color); -} -.was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size="1"], .form-select.is-valid:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size="1"] { - --bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1'/%3e%3c/svg%3e"); - padding-right: 4.125rem; - background-position: right 0.75rem center, center right 2.25rem; - background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); -} -.was-validated .form-select:valid:focus, .form-select.is-valid:focus { - border-color: var(--bs-form-valid-border-color); - box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); -} - -.was-validated .form-control-color:valid, .form-control-color.is-valid { - width: calc(3rem + calc(1.5em + 0.75rem)); -} - -.was-validated .form-check-input:valid, .form-check-input.is-valid { - border-color: var(--bs-form-valid-border-color); -} -.was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked { - background-color: var(--bs-form-valid-color); -} -.was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus { - box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); -} -.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { - color: var(--bs-form-valid-color); -} - -.form-check-inline .form-check-input ~ .valid-feedback { - margin-left: 0.5em; -} - -.was-validated .input-group > .form-control:not(:focus):valid, .input-group > .form-control:not(:focus).is-valid, -.was-validated .input-group > .form-select:not(:focus):valid, -.input-group > .form-select:not(:focus).is-valid, -.was-validated .input-group > .form-floating:not(:focus-within):valid, -.input-group > .form-floating:not(:focus-within).is-valid { - z-index: 3; -} - -.invalid-feedback { - display: none; - width: 100%; - margin-top: 0.25rem; - font-size: 0.875em; - color: var(--bs-form-invalid-color); -} - -.invalid-tooltip { - position: absolute; - top: 100%; - z-index: 5; - display: none; - max-width: 100%; - padding: 0.25rem 0.5rem; - margin-top: 0.1rem; - font-size: 0.875rem; - color: #fff; - background-color: var(--bs-danger); - border-radius: var(--bs-border-radius); -} - -.was-validated :invalid ~ .invalid-feedback, -.was-validated :invalid ~ .invalid-tooltip, -.is-invalid ~ .invalid-feedback, -.is-invalid ~ .invalid-tooltip { - display: block; -} - -.was-validated .form-control:invalid, .form-control.is-invalid { - border-color: var(--bs-form-invalid-border-color); - padding-right: calc(1.5em + 0.75rem); - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); - background-repeat: no-repeat; - background-position: right calc(0.375em + 0.1875rem) center; - background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); -} -.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { - border-color: var(--bs-form-invalid-border-color); - box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); -} - -.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { - padding-right: calc(1.5em + 0.75rem); - background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); -} - -.was-validated .form-select:invalid, .form-select.is-invalid { - border-color: var(--bs-form-invalid-border-color); -} -.was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size="1"], .form-select.is-invalid:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size="1"] { - --bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); - padding-right: 4.125rem; - background-position: right 0.75rem center, center right 2.25rem; - background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); -} -.was-validated .form-select:invalid:focus, .form-select.is-invalid:focus { - border-color: var(--bs-form-invalid-border-color); - box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); -} - -.was-validated .form-control-color:invalid, .form-control-color.is-invalid { - width: calc(3rem + calc(1.5em + 0.75rem)); -} - -.was-validated .form-check-input:invalid, .form-check-input.is-invalid { - border-color: var(--bs-form-invalid-border-color); -} -.was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked { - background-color: var(--bs-form-invalid-color); -} -.was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus { - box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); -} -.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { - color: var(--bs-form-invalid-color); -} - -.form-check-inline .form-check-input ~ .invalid-feedback { - margin-left: 0.5em; -} - -.was-validated .input-group > .form-control:not(:focus):invalid, .input-group > .form-control:not(:focus).is-invalid, -.was-validated .input-group > .form-select:not(:focus):invalid, -.input-group > .form-select:not(:focus).is-invalid, -.was-validated .input-group > .form-floating:not(:focus-within):invalid, -.input-group > .form-floating:not(:focus-within).is-invalid { - z-index: 4; -} - -.btn { - --bs-btn-padding-x: 0.75rem; - --bs-btn-padding-y: 0.375rem; - --bs-btn-font-family: ; - --bs-btn-font-size: 1rem; - --bs-btn-font-weight: 400; - --bs-btn-line-height: 1.5; - --bs-btn-color: var(--bs-body-color); - --bs-btn-bg: transparent; - --bs-btn-border-width: var(--bs-border-width); - --bs-btn-border-color: transparent; - --bs-btn-border-radius: var(--bs-border-radius); - --bs-btn-hover-border-color: transparent; - --bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); - --bs-btn-disabled-opacity: 0.65; - --bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5); - display: inline-block; - padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x); - font-family: var(--bs-btn-font-family); - font-size: var(--bs-btn-font-size); - font-weight: var(--bs-btn-font-weight); - line-height: var(--bs-btn-line-height); - color: var(--bs-btn-color); - text-align: center; - text-decoration: none; - vertical-align: middle; - cursor: pointer; - user-select: none; - border: var(--bs-btn-border-width) solid var(--bs-btn-border-color); - border-radius: var(--bs-btn-border-radius); - background-color: var(--bs-btn-bg); - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .btn { - transition: none; - } -} -.btn:hover { - color: var(--bs-btn-hover-color); - background-color: var(--bs-btn-hover-bg); - border-color: var(--bs-btn-hover-border-color); -} -.btn-check + .btn:hover { - color: var(--bs-btn-color); - background-color: var(--bs-btn-bg); - border-color: var(--bs-btn-border-color); -} -.btn:focus-visible { - color: var(--bs-btn-hover-color); - background-color: var(--bs-btn-hover-bg); - border-color: var(--bs-btn-hover-border-color); - outline: 0; - box-shadow: var(--bs-btn-focus-box-shadow); -} -.btn-check:focus-visible + .btn { - border-color: var(--bs-btn-hover-border-color); - outline: 0; - box-shadow: var(--bs-btn-focus-box-shadow); -} -.btn-check:checked + .btn, :not(.btn-check) + .btn:active, .btn:first-child:active, .btn.active, .btn.show { - color: var(--bs-btn-active-color); - background-color: var(--bs-btn-active-bg); - border-color: var(--bs-btn-active-border-color); -} -.btn-check:checked + .btn:focus-visible, :not(.btn-check) + .btn:active:focus-visible, .btn:first-child:active:focus-visible, .btn.active:focus-visible, .btn.show:focus-visible { - box-shadow: var(--bs-btn-focus-box-shadow); -} -.btn-check:checked:focus-visible + .btn { - box-shadow: var(--bs-btn-focus-box-shadow); -} -.btn:disabled, .btn.disabled, fieldset:disabled .btn { - color: var(--bs-btn-disabled-color); - pointer-events: none; - background-color: var(--bs-btn-disabled-bg); - border-color: var(--bs-btn-disabled-border-color); - opacity: var(--bs-btn-disabled-opacity); -} - -.btn-primary { - --bs-btn-color: #fff; - --bs-btn-bg: #0d6efd; - --bs-btn-border-color: #0d6efd; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: rgb(11.05, 93.5, 215.05); - --bs-btn-hover-border-color: rgb(10.4, 88, 202.4); - --bs-btn-focus-shadow-rgb: 49, 132, 253; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: rgb(10.4, 88, 202.4); - --bs-btn-active-border-color: rgb(9.75, 82.5, 189.75); - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #fff; - --bs-btn-disabled-bg: #0d6efd; - --bs-btn-disabled-border-color: #0d6efd; -} - -.btn-secondary { - --bs-btn-color: #fff; - --bs-btn-bg: #6c757d; - --bs-btn-border-color: #6c757d; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: rgb(91.8, 99.45, 106.25); - --bs-btn-hover-border-color: rgb(86.4, 93.6, 100); - --bs-btn-focus-shadow-rgb: 130, 138, 145; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: rgb(86.4, 93.6, 100); - --bs-btn-active-border-color: rgb(81, 87.75, 93.75); - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #fff; - --bs-btn-disabled-bg: #6c757d; - --bs-btn-disabled-border-color: #6c757d; -} - -.btn-success { - --bs-btn-color: #fff; - --bs-btn-bg: #198754; - --bs-btn-border-color: #198754; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: rgb(21.25, 114.75, 71.4); - --bs-btn-hover-border-color: rgb(20, 108, 67.2); - --bs-btn-focus-shadow-rgb: 60, 153, 110; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: rgb(20, 108, 67.2); - --bs-btn-active-border-color: rgb(18.75, 101.25, 63); - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #fff; - --bs-btn-disabled-bg: #198754; - --bs-btn-disabled-border-color: #198754; -} - -.btn-info { - --bs-btn-color: #000; - --bs-btn-bg: #0dcaf0; - --bs-btn-border-color: #0dcaf0; - --bs-btn-hover-color: #000; - --bs-btn-hover-bg: rgb(49.3, 209.95, 242.25); - --bs-btn-hover-border-color: rgb(37.2, 207.3, 241.5); - --bs-btn-focus-shadow-rgb: 11, 172, 204; - --bs-btn-active-color: #000; - --bs-btn-active-bg: rgb(61.4, 212.6, 243); - --bs-btn-active-border-color: rgb(37.2, 207.3, 241.5); - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #000; - --bs-btn-disabled-bg: #0dcaf0; - --bs-btn-disabled-border-color: #0dcaf0; -} - -.btn-warning { - --bs-btn-color: #000; - --bs-btn-bg: #ffc107; - --bs-btn-border-color: #ffc107; - --bs-btn-hover-color: #000; - --bs-btn-hover-bg: rgb(255, 202.3, 44.2); - --bs-btn-hover-border-color: rgb(255, 199.2, 31.8); - --bs-btn-focus-shadow-rgb: 217, 164, 6; - --bs-btn-active-color: #000; - --bs-btn-active-bg: rgb(255, 205.4, 56.6); - --bs-btn-active-border-color: rgb(255, 199.2, 31.8); - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #000; - --bs-btn-disabled-bg: #ffc107; - --bs-btn-disabled-border-color: #ffc107; -} - -.btn-danger { - --bs-btn-color: #fff; - --bs-btn-bg: #dc3545; - --bs-btn-border-color: #dc3545; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: rgb(187, 45.05, 58.65); - --bs-btn-hover-border-color: rgb(176, 42.4, 55.2); - --bs-btn-focus-shadow-rgb: 225, 83, 97; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: rgb(176, 42.4, 55.2); - --bs-btn-active-border-color: rgb(165, 39.75, 51.75); - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #fff; - --bs-btn-disabled-bg: #dc3545; - --bs-btn-disabled-border-color: #dc3545; -} - -.btn-light { - --bs-btn-color: #000; - --bs-btn-bg: #f8f9fa; - --bs-btn-border-color: #f8f9fa; - --bs-btn-hover-color: #000; - --bs-btn-hover-bg: rgb(210.8, 211.65, 212.5); - --bs-btn-hover-border-color: rgb(198.4, 199.2, 200); - --bs-btn-focus-shadow-rgb: 211, 212, 213; - --bs-btn-active-color: #000; - --bs-btn-active-bg: rgb(198.4, 199.2, 200); - --bs-btn-active-border-color: rgb(186, 186.75, 187.5); - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #000; - --bs-btn-disabled-bg: #f8f9fa; - --bs-btn-disabled-border-color: #f8f9fa; -} - -.btn-dark { - --bs-btn-color: #fff; - --bs-btn-bg: #212529; - --bs-btn-border-color: #212529; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: rgb(66.3, 69.7, 73.1); - --bs-btn-hover-border-color: rgb(55.2, 58.8, 62.4); - --bs-btn-focus-shadow-rgb: 66, 70, 73; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: rgb(77.4, 80.6, 83.8); - --bs-btn-active-border-color: rgb(55.2, 58.8, 62.4); - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #fff; - --bs-btn-disabled-bg: #212529; - --bs-btn-disabled-border-color: #212529; -} - -.btn-outline-primary { - --bs-btn-color: #0d6efd; - --bs-btn-border-color: #0d6efd; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #0d6efd; - --bs-btn-hover-border-color: #0d6efd; - --bs-btn-focus-shadow-rgb: 13, 110, 253; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #0d6efd; - --bs-btn-active-border-color: #0d6efd; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #0d6efd; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #0d6efd; - --bs-gradient: none; -} - -.btn-outline-secondary { - --bs-btn-color: #6c757d; - --bs-btn-border-color: #6c757d; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #6c757d; - --bs-btn-hover-border-color: #6c757d; - --bs-btn-focus-shadow-rgb: 108, 117, 125; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #6c757d; - --bs-btn-active-border-color: #6c757d; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #6c757d; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #6c757d; - --bs-gradient: none; -} - -.btn-outline-success { - --bs-btn-color: #198754; - --bs-btn-border-color: #198754; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #198754; - --bs-btn-hover-border-color: #198754; - --bs-btn-focus-shadow-rgb: 25, 135, 84; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #198754; - --bs-btn-active-border-color: #198754; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #198754; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #198754; - --bs-gradient: none; -} - -.btn-outline-info { - --bs-btn-color: #0dcaf0; - --bs-btn-border-color: #0dcaf0; - --bs-btn-hover-color: #000; - --bs-btn-hover-bg: #0dcaf0; - --bs-btn-hover-border-color: #0dcaf0; - --bs-btn-focus-shadow-rgb: 13, 202, 240; - --bs-btn-active-color: #000; - --bs-btn-active-bg: #0dcaf0; - --bs-btn-active-border-color: #0dcaf0; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #0dcaf0; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #0dcaf0; - --bs-gradient: none; -} - -.btn-outline-warning { - --bs-btn-color: #ffc107; - --bs-btn-border-color: #ffc107; - --bs-btn-hover-color: #000; - --bs-btn-hover-bg: #ffc107; - --bs-btn-hover-border-color: #ffc107; - --bs-btn-focus-shadow-rgb: 255, 193, 7; - --bs-btn-active-color: #000; - --bs-btn-active-bg: #ffc107; - --bs-btn-active-border-color: #ffc107; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #ffc107; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #ffc107; - --bs-gradient: none; -} - -.btn-outline-danger { - --bs-btn-color: #dc3545; - --bs-btn-border-color: #dc3545; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #dc3545; - --bs-btn-hover-border-color: #dc3545; - --bs-btn-focus-shadow-rgb: 220, 53, 69; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #dc3545; - --bs-btn-active-border-color: #dc3545; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #dc3545; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #dc3545; - --bs-gradient: none; -} - -.btn-outline-light { - --bs-btn-color: #f8f9fa; - --bs-btn-border-color: #f8f9fa; - --bs-btn-hover-color: #000; - --bs-btn-hover-bg: #f8f9fa; - --bs-btn-hover-border-color: #f8f9fa; - --bs-btn-focus-shadow-rgb: 248, 249, 250; - --bs-btn-active-color: #000; - --bs-btn-active-bg: #f8f9fa; - --bs-btn-active-border-color: #f8f9fa; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #f8f9fa; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #f8f9fa; - --bs-gradient: none; -} - -.btn-outline-dark { - --bs-btn-color: #212529; - --bs-btn-border-color: #212529; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #212529; - --bs-btn-hover-border-color: #212529; - --bs-btn-focus-shadow-rgb: 33, 37, 41; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #212529; - --bs-btn-active-border-color: #212529; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #212529; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #212529; - --bs-gradient: none; -} - -.btn-link { - --bs-btn-font-weight: 400; - --bs-btn-color: var(--bs-link-color); - --bs-btn-bg: transparent; - --bs-btn-border-color: transparent; - --bs-btn-hover-color: var(--bs-link-hover-color); - --bs-btn-hover-border-color: transparent; - --bs-btn-active-color: var(--bs-link-hover-color); - --bs-btn-active-border-color: transparent; - --bs-btn-disabled-color: #6c757d; - --bs-btn-disabled-border-color: transparent; - --bs-btn-box-shadow: 0 0 0 #000; - --bs-btn-focus-shadow-rgb: 49, 132, 253; - text-decoration: underline; -} -.btn-link:focus-visible { - color: var(--bs-btn-color); -} -.btn-link:hover { - color: var(--bs-btn-hover-color); -} - -.btn-lg, .btn-group-lg > .btn { - --bs-btn-padding-y: 0.5rem; - --bs-btn-padding-x: 1rem; - --bs-btn-font-size: 1.25rem; - --bs-btn-border-radius: var(--bs-border-radius-lg); -} - -.btn-sm, .btn-group-sm > .btn { - --bs-btn-padding-y: 0.25rem; - --bs-btn-padding-x: 0.5rem; - --bs-btn-font-size: 0.875rem; - --bs-btn-border-radius: var(--bs-border-radius-sm); -} - -.fade { - transition: opacity 0.15s linear; -} -@media (prefers-reduced-motion: reduce) { - .fade { - transition: none; - } -} -.fade:not(.show) { - opacity: 0; -} - -.collapse:not(.show) { - display: none; -} - -.collapsing { - height: 0; - overflow: hidden; - transition: height 0.35s ease; -} -@media (prefers-reduced-motion: reduce) { - .collapsing { - transition: none; - } -} -.collapsing.collapse-horizontal { - width: 0; - height: auto; - transition: width 0.35s ease; -} -@media (prefers-reduced-motion: reduce) { - .collapsing.collapse-horizontal { - transition: none; - } -} - -.dropup, -.dropend, -.dropdown, -.dropstart, -.dropup-center, -.dropdown-center { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; -} -.dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid; - border-right: 0.3em solid transparent; - border-bottom: 0; - border-left: 0.3em solid transparent; -} -.dropdown-toggle:empty::after { - margin-left: 0; -} - -.dropdown-menu { - --bs-dropdown-zindex: 1000; - --bs-dropdown-min-width: 10rem; - --bs-dropdown-padding-x: 0; - --bs-dropdown-padding-y: 0.5rem; - --bs-dropdown-spacer: 0.125rem; - --bs-dropdown-font-size: 1rem; - --bs-dropdown-color: var(--bs-body-color); - --bs-dropdown-bg: var(--bs-body-bg); - --bs-dropdown-border-color: var(--bs-border-color-translucent); - --bs-dropdown-border-radius: var(--bs-border-radius); - --bs-dropdown-border-width: var(--bs-border-width); - --bs-dropdown-inner-border-radius: calc(var(--bs-border-radius) - var(--bs-border-width)); - --bs-dropdown-divider-bg: var(--bs-border-color-translucent); - --bs-dropdown-divider-margin-y: 0.5rem; - --bs-dropdown-box-shadow: var(--bs-box-shadow); - --bs-dropdown-link-color: var(--bs-body-color); - --bs-dropdown-link-hover-color: var(--bs-body-color); - --bs-dropdown-link-hover-bg: var(--bs-tertiary-bg); - --bs-dropdown-link-active-color: #fff; - --bs-dropdown-link-active-bg: #0d6efd; - --bs-dropdown-link-disabled-color: var(--bs-tertiary-color); - --bs-dropdown-item-padding-x: 1rem; - --bs-dropdown-item-padding-y: 0.25rem; - --bs-dropdown-header-color: #6c757d; - --bs-dropdown-header-padding-x: 1rem; - --bs-dropdown-header-padding-y: 0.5rem; - position: absolute; - z-index: var(--bs-dropdown-zindex); - display: none; - min-width: var(--bs-dropdown-min-width); - padding: var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x); - margin: 0; - font-size: var(--bs-dropdown-font-size); - color: var(--bs-dropdown-color); - text-align: left; - list-style: none; - background-color: var(--bs-dropdown-bg); - background-clip: padding-box; - border: var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color); - border-radius: var(--bs-dropdown-border-radius); -} -.dropdown-menu[data-bs-popper] { - top: 100%; - left: 0; - margin-top: var(--bs-dropdown-spacer); -} - -.dropdown-menu-start { - --bs-position: start; -} -.dropdown-menu-start[data-bs-popper] { - right: auto; - left: 0; -} - -.dropdown-menu-end { - --bs-position: end; -} -.dropdown-menu-end[data-bs-popper] { - right: 0; - left: auto; -} - -@media (min-width: 576px) { - .dropdown-menu-sm-start { - --bs-position: start; - } - .dropdown-menu-sm-start[data-bs-popper] { - right: auto; - left: 0; - } - .dropdown-menu-sm-end { - --bs-position: end; - } - .dropdown-menu-sm-end[data-bs-popper] { - right: 0; - left: auto; - } -} -@media (min-width: 768px) { - .dropdown-menu-md-start { - --bs-position: start; - } - .dropdown-menu-md-start[data-bs-popper] { - right: auto; - left: 0; - } - .dropdown-menu-md-end { - --bs-position: end; - } - .dropdown-menu-md-end[data-bs-popper] { - right: 0; - left: auto; - } -} -@media (min-width: 992px) { - .dropdown-menu-lg-start { - --bs-position: start; - } - .dropdown-menu-lg-start[data-bs-popper] { - right: auto; - left: 0; - } - .dropdown-menu-lg-end { - --bs-position: end; - } - .dropdown-menu-lg-end[data-bs-popper] { - right: 0; - left: auto; - } -} -@media (min-width: 1200px) { - .dropdown-menu-xl-start { - --bs-position: start; - } - .dropdown-menu-xl-start[data-bs-popper] { - right: auto; - left: 0; - } - .dropdown-menu-xl-end { - --bs-position: end; - } - .dropdown-menu-xl-end[data-bs-popper] { - right: 0; - left: auto; - } -} -@media (min-width: 1400px) { - .dropdown-menu-xxl-start { - --bs-position: start; - } - .dropdown-menu-xxl-start[data-bs-popper] { - right: auto; - left: 0; - } - .dropdown-menu-xxl-end { - --bs-position: end; - } - .dropdown-menu-xxl-end[data-bs-popper] { - right: 0; - left: auto; - } -} -.dropup .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: var(--bs-dropdown-spacer); -} -.dropup .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0; - border-right: 0.3em solid transparent; - border-bottom: 0.3em solid; - border-left: 0.3em solid transparent; -} -.dropup .dropdown-toggle:empty::after { - margin-left: 0; -} - -.dropend .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: var(--bs-dropdown-spacer); -} -.dropend .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid transparent; - border-right: 0; - border-bottom: 0.3em solid transparent; - border-left: 0.3em solid; -} -.dropend .dropdown-toggle:empty::after { - margin-left: 0; -} -.dropend .dropdown-toggle::after { - vertical-align: 0; -} - -.dropstart .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: var(--bs-dropdown-spacer); -} -.dropstart .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; -} -.dropstart .dropdown-toggle::after { - display: none; -} -.dropstart .dropdown-toggle::before { - display: inline-block; - margin-right: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid transparent; - border-right: 0.3em solid; - border-bottom: 0.3em solid transparent; -} -.dropstart .dropdown-toggle:empty::after { - margin-left: 0; -} -.dropstart .dropdown-toggle::before { - vertical-align: 0; -} - -.dropdown-divider { - height: 0; - margin: var(--bs-dropdown-divider-margin-y) 0; - overflow: hidden; - border-top: 1px solid var(--bs-dropdown-divider-bg); - opacity: 1; -} - -.dropdown-item { - display: block; - width: 100%; - padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); - clear: both; - font-weight: 400; - color: var(--bs-dropdown-link-color); - text-align: inherit; - text-decoration: none; - white-space: nowrap; - background-color: transparent; - border: 0; - border-radius: var(--bs-dropdown-item-border-radius, 0); -} -.dropdown-item:hover, .dropdown-item:focus { - color: var(--bs-dropdown-link-hover-color); - background-color: var(--bs-dropdown-link-hover-bg); -} -.dropdown-item.active, .dropdown-item:active { - color: var(--bs-dropdown-link-active-color); - text-decoration: none; - background-color: var(--bs-dropdown-link-active-bg); -} -.dropdown-item.disabled, .dropdown-item:disabled { - color: var(--bs-dropdown-link-disabled-color); - pointer-events: none; - background-color: transparent; -} - -.dropdown-menu.show { - display: block; -} - -.dropdown-header { - display: block; - padding: var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x); - margin-bottom: 0; - font-size: 0.875rem; - color: var(--bs-dropdown-header-color); - white-space: nowrap; -} - -.dropdown-item-text { - display: block; - padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); - color: var(--bs-dropdown-link-color); -} - -.dropdown-menu-dark { - --bs-dropdown-color: #dee2e6; - --bs-dropdown-bg: #343a40; - --bs-dropdown-border-color: var(--bs-border-color-translucent); - --bs-dropdown-box-shadow: ; - --bs-dropdown-link-color: #dee2e6; - --bs-dropdown-link-hover-color: #fff; - --bs-dropdown-divider-bg: var(--bs-border-color-translucent); - --bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15); - --bs-dropdown-link-active-color: #fff; - --bs-dropdown-link-active-bg: #0d6efd; - --bs-dropdown-link-disabled-color: #adb5bd; - --bs-dropdown-header-color: #adb5bd; -} - -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; -} -.btn-group > .btn, -.btn-group-vertical > .btn { - position: relative; - flex: 1 1 auto; -} -.btn-group > .btn-check:checked + .btn, -.btn-group > .btn-check:focus + .btn, -.btn-group > .btn:hover, -.btn-group > .btn:focus, -.btn-group > .btn:active, -.btn-group > .btn.active, -.btn-group-vertical > .btn-check:checked + .btn, -.btn-group-vertical > .btn-check:focus + .btn, -.btn-group-vertical > .btn:hover, -.btn-group-vertical > .btn:focus, -.btn-group-vertical > .btn:active, -.btn-group-vertical > .btn.active { - z-index: 1; -} - -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; -} -.btn-toolbar .input-group { - width: auto; -} - -.btn-group { - border-radius: var(--bs-border-radius); -} -.btn-group > :not(.btn-check:first-child) + .btn, -.btn-group > .btn-group:not(:first-child) { - margin-left: calc(-1 * var(--bs-border-width)); -} -.btn-group > .btn:not(:last-child):not(.dropdown-toggle), -.btn-group > .btn.dropdown-toggle-split:first-child, -.btn-group > .btn-group:not(:last-child) > .btn { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.btn-group > .btn:nth-child(n+3), -.btn-group > :not(.btn-check) + .btn, -.btn-group > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} - -.dropdown-toggle-split { - padding-right: 0.5625rem; - padding-left: 0.5625rem; -} -.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after { - margin-left: 0; -} -.dropstart .dropdown-toggle-split::before { - margin-right: 0; -} - -.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { - padding-right: 0.375rem; - padding-left: 0.375rem; -} - -.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { - padding-right: 0.75rem; - padding-left: 0.75rem; -} - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; -} -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group { - width: 100%; -} -.btn-group-vertical > .btn:not(:first-child), -.btn-group-vertical > .btn-group:not(:first-child) { - margin-top: calc(-1 * var(--bs-border-width)); -} -.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), -.btn-group-vertical > .btn-group:not(:last-child) > .btn { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn:nth-child(n+3), -.btn-group-vertical > :not(.btn-check) + .btn, -.btn-group-vertical > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.nav { - --bs-nav-link-padding-x: 1rem; - --bs-nav-link-padding-y: 0.5rem; - --bs-nav-link-font-weight: ; - --bs-nav-link-color: var(--bs-link-color); - --bs-nav-link-hover-color: var(--bs-link-hover-color); - --bs-nav-link-disabled-color: var(--bs-secondary-color); - display: flex; - flex-wrap: wrap; - padding-left: 0; - margin-bottom: 0; - list-style: none; -} - -.nav-link { - display: block; - padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x); - font-size: var(--bs-nav-link-font-size); - font-weight: var(--bs-nav-link-font-weight); - color: var(--bs-nav-link-color); - text-decoration: none; - background: none; - border: 0; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .nav-link { - transition: none; - } -} -.nav-link:hover, .nav-link:focus { - color: var(--bs-nav-link-hover-color); -} -.nav-link:focus-visible { - outline: 0; - box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); -} -.nav-link.disabled, .nav-link:disabled { - color: var(--bs-nav-link-disabled-color); - pointer-events: none; - cursor: default; -} - -.nav-tabs { - --bs-nav-tabs-border-width: var(--bs-border-width); - --bs-nav-tabs-border-color: var(--bs-border-color); - --bs-nav-tabs-border-radius: var(--bs-border-radius); - --bs-nav-tabs-link-hover-border-color: var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color); - --bs-nav-tabs-link-active-color: var(--bs-emphasis-color); - --bs-nav-tabs-link-active-bg: var(--bs-body-bg); - --bs-nav-tabs-link-active-border-color: var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg); - border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color); -} -.nav-tabs .nav-link { - margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width)); - border: var(--bs-nav-tabs-border-width) solid transparent; - border-top-left-radius: var(--bs-nav-tabs-border-radius); - border-top-right-radius: var(--bs-nav-tabs-border-radius); -} -.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { - isolation: isolate; - border-color: var(--bs-nav-tabs-link-hover-border-color); -} -.nav-tabs .nav-link.active, -.nav-tabs .nav-item.show .nav-link { - color: var(--bs-nav-tabs-link-active-color); - background-color: var(--bs-nav-tabs-link-active-bg); - border-color: var(--bs-nav-tabs-link-active-border-color); -} -.nav-tabs .dropdown-menu { - margin-top: calc(-1 * var(--bs-nav-tabs-border-width)); - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.nav-pills { - --bs-nav-pills-border-radius: var(--bs-border-radius); - --bs-nav-pills-link-active-color: #fff; - --bs-nav-pills-link-active-bg: #0d6efd; -} -.nav-pills .nav-link { - border-radius: var(--bs-nav-pills-border-radius); -} -.nav-pills .nav-link.active, -.nav-pills .show > .nav-link { - color: var(--bs-nav-pills-link-active-color); - background-color: var(--bs-nav-pills-link-active-bg); -} - -.nav-underline { - --bs-nav-underline-gap: 1rem; - --bs-nav-underline-border-width: 0.125rem; - --bs-nav-underline-link-active-color: var(--bs-emphasis-color); - gap: var(--bs-nav-underline-gap); -} -.nav-underline .nav-link { - padding-right: 0; - padding-left: 0; - border-bottom: var(--bs-nav-underline-border-width) solid transparent; -} -.nav-underline .nav-link:hover, .nav-underline .nav-link:focus { - border-bottom-color: currentcolor; -} -.nav-underline .nav-link.active, -.nav-underline .show > .nav-link { - font-weight: 700; - color: var(--bs-nav-underline-link-active-color); - border-bottom-color: currentcolor; -} - -.nav-fill > .nav-link, -.nav-fill .nav-item { - flex: 1 1 auto; - text-align: center; -} - -.nav-justified > .nav-link, -.nav-justified .nav-item { - flex-grow: 1; - flex-basis: 0; - text-align: center; -} - -.nav-fill .nav-item .nav-link, -.nav-justified .nav-item .nav-link { - width: 100%; -} - -.tab-content > .tab-pane { - display: none; -} -.tab-content > .active { - display: block; -} - -.navbar { - --bs-navbar-padding-x: 0; - --bs-navbar-padding-y: 0.5rem; - --bs-navbar-color: rgba(var(--bs-emphasis-color-rgb), 0.65); - --bs-navbar-hover-color: rgba(var(--bs-emphasis-color-rgb), 0.8); - --bs-navbar-disabled-color: rgba(var(--bs-emphasis-color-rgb), 0.3); - --bs-navbar-active-color: rgba(var(--bs-emphasis-color-rgb), 1); - --bs-navbar-brand-padding-y: 0.3125rem; - --bs-navbar-brand-margin-end: 1rem; - --bs-navbar-brand-font-size: 1.25rem; - --bs-navbar-brand-color: rgba(var(--bs-emphasis-color-rgb), 1); - --bs-navbar-brand-hover-color: rgba(var(--bs-emphasis-color-rgb), 1); - --bs-navbar-nav-link-padding-x: 0.5rem; - --bs-navbar-toggler-padding-y: 0.25rem; - --bs-navbar-toggler-padding-x: 0.75rem; - --bs-navbar-toggler-font-size: 1.25rem; - --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); - --bs-navbar-toggler-border-color: rgba(var(--bs-emphasis-color-rgb), 0.15); - --bs-navbar-toggler-border-radius: var(--bs-border-radius); - --bs-navbar-toggler-focus-width: 0.25rem; - --bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out; - position: relative; - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: space-between; - padding: var(--bs-navbar-padding-y) var(--bs-navbar-padding-x); -} -.navbar > .container, -.navbar > .container-fluid, -.navbar > .container-sm, -.navbar > .container-md, -.navbar > .container-lg, -.navbar > .container-xl, -.navbar > .container-xxl { - display: flex; - flex-wrap: inherit; - align-items: center; - justify-content: space-between; -} -.navbar-brand { - padding-top: var(--bs-navbar-brand-padding-y); - padding-bottom: var(--bs-navbar-brand-padding-y); - margin-right: var(--bs-navbar-brand-margin-end); - font-size: var(--bs-navbar-brand-font-size); - color: var(--bs-navbar-brand-color); - text-decoration: none; - white-space: nowrap; -} -.navbar-brand:hover, .navbar-brand:focus { - color: var(--bs-navbar-brand-hover-color); -} - -.navbar-nav { - --bs-nav-link-padding-x: 0; - --bs-nav-link-padding-y: 0.5rem; - --bs-nav-link-font-weight: ; - --bs-nav-link-color: var(--bs-navbar-color); - --bs-nav-link-hover-color: var(--bs-navbar-hover-color); - --bs-nav-link-disabled-color: var(--bs-navbar-disabled-color); - display: flex; - flex-direction: column; - padding-left: 0; - margin-bottom: 0; - list-style: none; -} -.navbar-nav .nav-link.active, .navbar-nav .nav-link.show { - color: var(--bs-navbar-active-color); -} -.navbar-nav .dropdown-menu { - position: static; -} - -.navbar-text { - padding-top: 0.5rem; - padding-bottom: 0.5rem; - color: var(--bs-navbar-color); -} -.navbar-text a, -.navbar-text a:hover, -.navbar-text a:focus { - color: var(--bs-navbar-active-color); -} - -.navbar-collapse { - flex-grow: 1; - flex-basis: 100%; - align-items: center; -} - -.navbar-toggler { - padding: var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x); - font-size: var(--bs-navbar-toggler-font-size); - line-height: 1; - color: var(--bs-navbar-color); - background-color: transparent; - border: var(--bs-border-width) solid var(--bs-navbar-toggler-border-color); - border-radius: var(--bs-navbar-toggler-border-radius); - transition: var(--bs-navbar-toggler-transition); -} -@media (prefers-reduced-motion: reduce) { - .navbar-toggler { - transition: none; - } -} -.navbar-toggler:hover { - text-decoration: none; -} -.navbar-toggler:focus { - text-decoration: none; - outline: 0; - box-shadow: 0 0 0 var(--bs-navbar-toggler-focus-width); -} - -.navbar-toggler-icon { - display: inline-block; - width: 1.5em; - height: 1.5em; - vertical-align: middle; - background-image: var(--bs-navbar-toggler-icon-bg); - background-repeat: no-repeat; - background-position: center; - background-size: 100%; -} - -.navbar-nav-scroll { - max-height: var(--bs-scroll-height, 75vh); - overflow-y: auto; -} - -@media (min-width: 576px) { - .navbar-expand-sm { - flex-wrap: nowrap; - justify-content: flex-start; - } - .navbar-expand-sm .navbar-nav { - flex-direction: row; - } - .navbar-expand-sm .navbar-nav .dropdown-menu { - position: absolute; - } - .navbar-expand-sm .navbar-nav .nav-link { - padding-right: var(--bs-navbar-nav-link-padding-x); - padding-left: var(--bs-navbar-nav-link-padding-x); - } - .navbar-expand-sm .navbar-nav-scroll { - overflow: visible; - } - .navbar-expand-sm .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .navbar-expand-sm .navbar-toggler { - display: none; - } - .navbar-expand-sm .offcanvas { - position: static; - z-index: auto; - flex-grow: 1; - width: auto !important; - height: auto !important; - visibility: visible !important; - background-color: transparent !important; - border: 0 !important; - transform: none !important; - transition: none; - } - .navbar-expand-sm .offcanvas .offcanvas-header { - display: none; - } - .navbar-expand-sm .offcanvas .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; - } -} -@media (min-width: 768px) { - .navbar-expand-md { - flex-wrap: nowrap; - justify-content: flex-start; - } - .navbar-expand-md .navbar-nav { - flex-direction: row; - } - .navbar-expand-md .navbar-nav .dropdown-menu { - position: absolute; - } - .navbar-expand-md .navbar-nav .nav-link { - padding-right: var(--bs-navbar-nav-link-padding-x); - padding-left: var(--bs-navbar-nav-link-padding-x); - } - .navbar-expand-md .navbar-nav-scroll { - overflow: visible; - } - .navbar-expand-md .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .navbar-expand-md .navbar-toggler { - display: none; - } - .navbar-expand-md .offcanvas { - position: static; - z-index: auto; - flex-grow: 1; - width: auto !important; - height: auto !important; - visibility: visible !important; - background-color: transparent !important; - border: 0 !important; - transform: none !important; - transition: none; - } - .navbar-expand-md .offcanvas .offcanvas-header { - display: none; - } - .navbar-expand-md .offcanvas .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; - } -} -@media (min-width: 992px) { - .navbar-expand-lg { - flex-wrap: nowrap; - justify-content: flex-start; - } - .navbar-expand-lg .navbar-nav { - flex-direction: row; - } - .navbar-expand-lg .navbar-nav .dropdown-menu { - position: absolute; - } - .navbar-expand-lg .navbar-nav .nav-link { - padding-right: var(--bs-navbar-nav-link-padding-x); - padding-left: var(--bs-navbar-nav-link-padding-x); - } - .navbar-expand-lg .navbar-nav-scroll { - overflow: visible; - } - .navbar-expand-lg .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .navbar-expand-lg .navbar-toggler { - display: none; - } - .navbar-expand-lg .offcanvas { - position: static; - z-index: auto; - flex-grow: 1; - width: auto !important; - height: auto !important; - visibility: visible !important; - background-color: transparent !important; - border: 0 !important; - transform: none !important; - transition: none; - } - .navbar-expand-lg .offcanvas .offcanvas-header { - display: none; - } - .navbar-expand-lg .offcanvas .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; - } -} -@media (min-width: 1200px) { - .navbar-expand-xl { - flex-wrap: nowrap; - justify-content: flex-start; - } - .navbar-expand-xl .navbar-nav { - flex-direction: row; - } - .navbar-expand-xl .navbar-nav .dropdown-menu { - position: absolute; - } - .navbar-expand-xl .navbar-nav .nav-link { - padding-right: var(--bs-navbar-nav-link-padding-x); - padding-left: var(--bs-navbar-nav-link-padding-x); - } - .navbar-expand-xl .navbar-nav-scroll { - overflow: visible; - } - .navbar-expand-xl .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .navbar-expand-xl .navbar-toggler { - display: none; - } - .navbar-expand-xl .offcanvas { - position: static; - z-index: auto; - flex-grow: 1; - width: auto !important; - height: auto !important; - visibility: visible !important; - background-color: transparent !important; - border: 0 !important; - transform: none !important; - transition: none; - } - .navbar-expand-xl .offcanvas .offcanvas-header { - display: none; - } - .navbar-expand-xl .offcanvas .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; - } -} -@media (min-width: 1400px) { - .navbar-expand-xxl { - flex-wrap: nowrap; - justify-content: flex-start; - } - .navbar-expand-xxl .navbar-nav { - flex-direction: row; - } - .navbar-expand-xxl .navbar-nav .dropdown-menu { - position: absolute; - } - .navbar-expand-xxl .navbar-nav .nav-link { - padding-right: var(--bs-navbar-nav-link-padding-x); - padding-left: var(--bs-navbar-nav-link-padding-x); - } - .navbar-expand-xxl .navbar-nav-scroll { - overflow: visible; - } - .navbar-expand-xxl .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .navbar-expand-xxl .navbar-toggler { - display: none; - } - .navbar-expand-xxl .offcanvas { - position: static; - z-index: auto; - flex-grow: 1; - width: auto !important; - height: auto !important; - visibility: visible !important; - background-color: transparent !important; - border: 0 !important; - transform: none !important; - transition: none; - } - .navbar-expand-xxl .offcanvas .offcanvas-header { - display: none; - } - .navbar-expand-xxl .offcanvas .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; - } -} -.navbar-expand { - flex-wrap: nowrap; - justify-content: flex-start; -} -.navbar-expand .navbar-nav { - flex-direction: row; -} -.navbar-expand .navbar-nav .dropdown-menu { - position: absolute; -} -.navbar-expand .navbar-nav .nav-link { - padding-right: var(--bs-navbar-nav-link-padding-x); - padding-left: var(--bs-navbar-nav-link-padding-x); -} -.navbar-expand .navbar-nav-scroll { - overflow: visible; -} -.navbar-expand .navbar-collapse { - display: flex !important; - flex-basis: auto; -} -.navbar-expand .navbar-toggler { - display: none; -} -.navbar-expand .offcanvas { - position: static; - z-index: auto; - flex-grow: 1; - width: auto !important; - height: auto !important; - visibility: visible !important; - background-color: transparent !important; - border: 0 !important; - transform: none !important; - transition: none; -} -.navbar-expand .offcanvas .offcanvas-header { - display: none; -} -.navbar-expand .offcanvas .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; -} - -.navbar-dark, -.navbar[data-bs-theme=dark] { - --bs-navbar-color: rgba(255, 255, 255, 0.55); - --bs-navbar-hover-color: rgba(255, 255, 255, 0.75); - --bs-navbar-disabled-color: rgba(255, 255, 255, 0.25); - --bs-navbar-active-color: #fff; - --bs-navbar-brand-color: #fff; - --bs-navbar-brand-hover-color: #fff; - --bs-navbar-toggler-border-color: rgba(255, 255, 255, 0.1); - --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); -} - -[data-bs-theme=dark] .navbar-toggler-icon { - --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); -} - -.card { - --bs-card-spacer-y: 1rem; - --bs-card-spacer-x: 1rem; - --bs-card-title-spacer-y: 0.5rem; - --bs-card-title-color: ; - --bs-card-subtitle-color: ; - --bs-card-border-width: var(--bs-border-width); - --bs-card-border-color: var(--bs-border-color-translucent); - --bs-card-border-radius: var(--bs-border-radius); - --bs-card-box-shadow: ; - --bs-card-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width))); - --bs-card-cap-padding-y: 0.5rem; - --bs-card-cap-padding-x: 1rem; - --bs-card-cap-bg: rgba(var(--bs-body-color-rgb), 0.03); - --bs-card-cap-color: ; - --bs-card-height: ; - --bs-card-color: ; - --bs-card-bg: var(--bs-body-bg); - --bs-card-img-overlay-padding: 1rem; - --bs-card-group-margin: 0.75rem; - position: relative; - display: flex; - flex-direction: column; - min-width: 0; - height: var(--bs-card-height); - color: var(--bs-body-color); - word-wrap: break-word; - background-color: var(--bs-card-bg); - background-clip: border-box; - border: var(--bs-card-border-width) solid var(--bs-card-border-color); - border-radius: var(--bs-card-border-radius); -} -.card > hr { - margin-right: 0; - margin-left: 0; -} -.card > .list-group { - border-top: inherit; - border-bottom: inherit; -} -.card > .list-group:first-child { - border-top-width: 0; - border-top-left-radius: var(--bs-card-inner-border-radius); - border-top-right-radius: var(--bs-card-inner-border-radius); -} -.card > .list-group:last-child { - border-bottom-width: 0; - border-bottom-right-radius: var(--bs-card-inner-border-radius); - border-bottom-left-radius: var(--bs-card-inner-border-radius); -} -.card > .card-header + .list-group, -.card > .list-group + .card-footer { - border-top: 0; -} - -.card-body { - flex: 1 1 auto; - padding: var(--bs-card-spacer-y) var(--bs-card-spacer-x); - color: var(--bs-card-color); -} - -.card-title { - margin-bottom: var(--bs-card-title-spacer-y); - color: var(--bs-card-title-color); -} - -.card-subtitle { - margin-top: calc(-0.5 * var(--bs-card-title-spacer-y)); - margin-bottom: 0; - color: var(--bs-card-subtitle-color); -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link + .card-link { - margin-left: var(--bs-card-spacer-x); -} - -.card-header { - padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x); - margin-bottom: 0; - color: var(--bs-card-cap-color); - background-color: var(--bs-card-cap-bg); - border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color); -} -.card-header:first-child { - border-radius: var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0; -} - -.card-footer { - padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x); - color: var(--bs-card-cap-color); - background-color: var(--bs-card-cap-bg); - border-top: var(--bs-card-border-width) solid var(--bs-card-border-color); -} -.card-footer:last-child { - border-radius: 0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius); -} - -.card-header-tabs { - margin-right: calc(-0.5 * var(--bs-card-cap-padding-x)); - margin-bottom: calc(-1 * var(--bs-card-cap-padding-y)); - margin-left: calc(-0.5 * var(--bs-card-cap-padding-x)); - border-bottom: 0; -} -.card-header-tabs .nav-link.active { - background-color: var(--bs-card-bg); - border-bottom-color: var(--bs-card-bg); -} - -.card-header-pills { - margin-right: calc(-0.5 * var(--bs-card-cap-padding-x)); - margin-left: calc(-0.5 * var(--bs-card-cap-padding-x)); -} - -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: var(--bs-card-img-overlay-padding); - border-radius: var(--bs-card-inner-border-radius); -} - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; -} - -.card-img, -.card-img-top { - border-top-left-radius: var(--bs-card-inner-border-radius); - border-top-right-radius: var(--bs-card-inner-border-radius); -} - -.card-img, -.card-img-bottom { - border-bottom-right-radius: var(--bs-card-inner-border-radius); - border-bottom-left-radius: var(--bs-card-inner-border-radius); -} - -.card-group > .card { - margin-bottom: var(--bs-card-group-margin); -} -@media (min-width: 576px) { - .card-group { - display: flex; - flex-flow: row wrap; - } - .card-group > .card { - flex: 1 0 0; - margin-bottom: 0; - } - .card-group > .card + .card { - margin-left: 0; - border-left: 0; - } - .card-group > .card:not(:last-child) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; - } - .card-group > .card:not(:last-child) > .card-img-top, - .card-group > .card:not(:last-child) > .card-header { - border-top-right-radius: 0; - } - .card-group > .card:not(:last-child) > .card-img-bottom, - .card-group > .card:not(:last-child) > .card-footer { - border-bottom-right-radius: 0; - } - .card-group > .card:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; - } - .card-group > .card:not(:first-child) > .card-img-top, - .card-group > .card:not(:first-child) > .card-header { - border-top-left-radius: 0; - } - .card-group > .card:not(:first-child) > .card-img-bottom, - .card-group > .card:not(:first-child) > .card-footer { - border-bottom-left-radius: 0; - } -} - -.accordion { - --bs-accordion-color: var(--bs-body-color); - --bs-accordion-bg: var(--bs-body-bg); - --bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease; - --bs-accordion-border-color: var(--bs-border-color); - --bs-accordion-border-width: var(--bs-border-width); - --bs-accordion-border-radius: var(--bs-border-radius); - --bs-accordion-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width))); - --bs-accordion-btn-padding-x: 1.25rem; - --bs-accordion-btn-padding-y: 1rem; - --bs-accordion-btn-color: var(--bs-body-color); - --bs-accordion-btn-bg: var(--bs-accordion-bg); - --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23212529' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); - --bs-accordion-btn-icon-width: 1.25rem; - --bs-accordion-btn-icon-transform: rotate(-180deg); - --bs-accordion-btn-icon-transition: transform 0.2s ease-in-out; - --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='rgb%285.2, 44, 101.2%29' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); - --bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); - --bs-accordion-body-padding-x: 1.25rem; - --bs-accordion-body-padding-y: 1rem; - --bs-accordion-active-color: var(--bs-primary-text-emphasis); - --bs-accordion-active-bg: var(--bs-primary-bg-subtle); -} - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x); - font-size: 1rem; - color: var(--bs-accordion-btn-color); - text-align: left; - background-color: var(--bs-accordion-btn-bg); - border: 0; - border-radius: 0; - overflow-anchor: none; - transition: var(--bs-accordion-transition); -} -@media (prefers-reduced-motion: reduce) { - .accordion-button { - transition: none; - } -} -.accordion-button:not(.collapsed) { - color: var(--bs-accordion-active-color); - background-color: var(--bs-accordion-active-bg); - box-shadow: inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color); -} -.accordion-button:not(.collapsed)::after { - background-image: var(--bs-accordion-btn-active-icon); - transform: var(--bs-accordion-btn-icon-transform); -} -.accordion-button::after { - flex-shrink: 0; - width: var(--bs-accordion-btn-icon-width); - height: var(--bs-accordion-btn-icon-width); - margin-left: auto; - content: ""; - background-image: var(--bs-accordion-btn-icon); - background-repeat: no-repeat; - background-size: var(--bs-accordion-btn-icon-width); - transition: var(--bs-accordion-btn-icon-transition); -} -@media (prefers-reduced-motion: reduce) { - .accordion-button::after { - transition: none; - } -} -.accordion-button:hover { - z-index: 2; -} -.accordion-button:focus { - z-index: 3; - outline: 0; - box-shadow: var(--bs-accordion-btn-focus-box-shadow); -} - -.accordion-header { - margin-bottom: 0; -} - -.accordion-item { - color: var(--bs-accordion-color); - background-color: var(--bs-accordion-bg); - border: var(--bs-accordion-border-width) solid var(--bs-accordion-border-color); -} -.accordion-item:first-of-type { - border-top-left-radius: var(--bs-accordion-border-radius); - border-top-right-radius: var(--bs-accordion-border-radius); -} -.accordion-item:first-of-type > .accordion-header .accordion-button { - border-top-left-radius: var(--bs-accordion-inner-border-radius); - border-top-right-radius: var(--bs-accordion-inner-border-radius); -} -.accordion-item:not(:first-of-type) { - border-top: 0; -} -.accordion-item:last-of-type { - border-bottom-right-radius: var(--bs-accordion-border-radius); - border-bottom-left-radius: var(--bs-accordion-border-radius); -} -.accordion-item:last-of-type > .accordion-header .accordion-button.collapsed { - border-bottom-right-radius: var(--bs-accordion-inner-border-radius); - border-bottom-left-radius: var(--bs-accordion-inner-border-radius); -} -.accordion-item:last-of-type > .accordion-collapse { - border-bottom-right-radius: var(--bs-accordion-border-radius); - border-bottom-left-radius: var(--bs-accordion-border-radius); -} - -.accordion-body { - padding: var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x); -} - -.accordion-flush > .accordion-item { - border-right: 0; - border-left: 0; - border-radius: 0; -} -.accordion-flush > .accordion-item:first-child { - border-top: 0; -} -.accordion-flush > .accordion-item:last-child { - border-bottom: 0; -} -.accordion-flush > .accordion-item > .accordion-collapse, -.accordion-flush > .accordion-item > .accordion-header .accordion-button, -.accordion-flush > .accordion-item > .accordion-header .accordion-button.collapsed { - border-radius: 0; -} - -[data-bs-theme=dark] .accordion-button::after { - --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='rgb%28109.8, 168, 253.8%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e"); - --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='rgb%28109.8, 168, 253.8%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e"); -} - -.breadcrumb { - --bs-breadcrumb-padding-x: 0; - --bs-breadcrumb-padding-y: 0; - --bs-breadcrumb-margin-bottom: 1rem; - --bs-breadcrumb-bg: ; - --bs-breadcrumb-border-radius: ; - --bs-breadcrumb-divider-color: var(--bs-secondary-color); - --bs-breadcrumb-item-padding-x: 0.5rem; - --bs-breadcrumb-item-active-color: var(--bs-secondary-color); - display: flex; - flex-wrap: wrap; - padding: var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x); - margin-bottom: var(--bs-breadcrumb-margin-bottom); - font-size: var(--bs-breadcrumb-font-size); - list-style: none; - background-color: var(--bs-breadcrumb-bg); - border-radius: var(--bs-breadcrumb-border-radius); -} - -.breadcrumb-item + .breadcrumb-item { - padding-left: var(--bs-breadcrumb-item-padding-x); -} -.breadcrumb-item + .breadcrumb-item::before { - float: left; - padding-right: var(--bs-breadcrumb-item-padding-x); - color: var(--bs-breadcrumb-divider-color); - content: var(--bs-breadcrumb-divider, "/") /* rtl: var(--bs-breadcrumb-divider, "/") */; -} -.breadcrumb-item.active { - color: var(--bs-breadcrumb-item-active-color); -} - -.pagination { - --bs-pagination-padding-x: 0.75rem; - --bs-pagination-padding-y: 0.375rem; - --bs-pagination-font-size: 1rem; - --bs-pagination-color: var(--bs-link-color); - --bs-pagination-bg: var(--bs-body-bg); - --bs-pagination-border-width: var(--bs-border-width); - --bs-pagination-border-color: var(--bs-border-color); - --bs-pagination-border-radius: var(--bs-border-radius); - --bs-pagination-hover-color: var(--bs-link-hover-color); - --bs-pagination-hover-bg: var(--bs-tertiary-bg); - --bs-pagination-hover-border-color: var(--bs-border-color); - --bs-pagination-focus-color: var(--bs-link-hover-color); - --bs-pagination-focus-bg: var(--bs-secondary-bg); - --bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); - --bs-pagination-active-color: #fff; - --bs-pagination-active-bg: #0d6efd; - --bs-pagination-active-border-color: #0d6efd; - --bs-pagination-disabled-color: var(--bs-secondary-color); - --bs-pagination-disabled-bg: var(--bs-secondary-bg); - --bs-pagination-disabled-border-color: var(--bs-border-color); - display: flex; - padding-left: 0; - list-style: none; -} - -.page-link { - position: relative; - display: block; - padding: var(--bs-pagination-padding-y) var(--bs-pagination-padding-x); - font-size: var(--bs-pagination-font-size); - color: var(--bs-pagination-color); - text-decoration: none; - background-color: var(--bs-pagination-bg); - border: var(--bs-pagination-border-width) solid var(--bs-pagination-border-color); - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .page-link { - transition: none; - } -} -.page-link:hover { - z-index: 2; - color: var(--bs-pagination-hover-color); - background-color: var(--bs-pagination-hover-bg); - border-color: var(--bs-pagination-hover-border-color); -} -.page-link:focus { - z-index: 3; - color: var(--bs-pagination-focus-color); - background-color: var(--bs-pagination-focus-bg); - outline: 0; - box-shadow: var(--bs-pagination-focus-box-shadow); -} -.page-link.active, .active > .page-link { - z-index: 3; - color: var(--bs-pagination-active-color); - background-color: var(--bs-pagination-active-bg); - border-color: var(--bs-pagination-active-border-color); -} -.page-link.disabled, .disabled > .page-link { - color: var(--bs-pagination-disabled-color); - pointer-events: none; - background-color: var(--bs-pagination-disabled-bg); - border-color: var(--bs-pagination-disabled-border-color); -} - -.page-item:not(:first-child) .page-link { - margin-left: calc(-1 * var(--bs-border-width)); -} -.page-item:first-child .page-link { - border-top-left-radius: var(--bs-pagination-border-radius); - border-bottom-left-radius: var(--bs-pagination-border-radius); -} -.page-item:last-child .page-link { - border-top-right-radius: var(--bs-pagination-border-radius); - border-bottom-right-radius: var(--bs-pagination-border-radius); -} - -.pagination-lg { - --bs-pagination-padding-x: 1.5rem; - --bs-pagination-padding-y: 0.75rem; - --bs-pagination-font-size: 1.25rem; - --bs-pagination-border-radius: var(--bs-border-radius-lg); -} - -.pagination-sm { - --bs-pagination-padding-x: 0.5rem; - --bs-pagination-padding-y: 0.25rem; - --bs-pagination-font-size: 0.875rem; - --bs-pagination-border-radius: var(--bs-border-radius-sm); -} - -.badge { - --bs-badge-padding-x: 0.65em; - --bs-badge-padding-y: 0.35em; - --bs-badge-font-size: 0.75em; - --bs-badge-font-weight: 700; - --bs-badge-color: #fff; - --bs-badge-border-radius: var(--bs-border-radius); - display: inline-block; - padding: var(--bs-badge-padding-y) var(--bs-badge-padding-x); - font-size: var(--bs-badge-font-size); - font-weight: var(--bs-badge-font-weight); - line-height: 1; - color: var(--bs-badge-color); - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: var(--bs-badge-border-radius); -} -.badge:empty { - display: none; -} - -.btn .badge { - position: relative; - top: -1px; -} - -.alert { - --bs-alert-bg: transparent; - --bs-alert-padding-x: 1rem; - --bs-alert-padding-y: 1rem; - --bs-alert-margin-bottom: 1rem; - --bs-alert-color: inherit; - --bs-alert-border-color: transparent; - --bs-alert-border: var(--bs-border-width) solid var(--bs-alert-border-color); - --bs-alert-border-radius: var(--bs-border-radius); - --bs-alert-link-color: inherit; - position: relative; - padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x); - margin-bottom: var(--bs-alert-margin-bottom); - color: var(--bs-alert-color); - background-color: var(--bs-alert-bg); - border: var(--bs-alert-border); - border-radius: var(--bs-alert-border-radius); -} - -.alert-heading { - color: inherit; -} - -.alert-link { - font-weight: 700; - color: var(--bs-alert-link-color); -} - -.alert-dismissible { - padding-right: 3rem; -} -.alert-dismissible .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: 2; - padding: 1.25rem 1rem; -} - -.alert-primary { - --bs-alert-color: var(--bs-primary-text-emphasis); - --bs-alert-bg: var(--bs-primary-bg-subtle); - --bs-alert-border-color: var(--bs-primary-border-subtle); - --bs-alert-link-color: var(--bs-primary-text-emphasis); -} - -.alert-secondary { - --bs-alert-color: var(--bs-secondary-text-emphasis); - --bs-alert-bg: var(--bs-secondary-bg-subtle); - --bs-alert-border-color: var(--bs-secondary-border-subtle); - --bs-alert-link-color: var(--bs-secondary-text-emphasis); -} - -.alert-success { - --bs-alert-color: var(--bs-success-text-emphasis); - --bs-alert-bg: var(--bs-success-bg-subtle); - --bs-alert-border-color: var(--bs-success-border-subtle); - --bs-alert-link-color: var(--bs-success-text-emphasis); -} - -.alert-info { - --bs-alert-color: var(--bs-info-text-emphasis); - --bs-alert-bg: var(--bs-info-bg-subtle); - --bs-alert-border-color: var(--bs-info-border-subtle); - --bs-alert-link-color: var(--bs-info-text-emphasis); -} - -.alert-warning { - --bs-alert-color: var(--bs-warning-text-emphasis); - --bs-alert-bg: var(--bs-warning-bg-subtle); - --bs-alert-border-color: var(--bs-warning-border-subtle); - --bs-alert-link-color: var(--bs-warning-text-emphasis); -} - -.alert-danger { - --bs-alert-color: var(--bs-danger-text-emphasis); - --bs-alert-bg: var(--bs-danger-bg-subtle); - --bs-alert-border-color: var(--bs-danger-border-subtle); - --bs-alert-link-color: var(--bs-danger-text-emphasis); -} - -.alert-light { - --bs-alert-color: var(--bs-light-text-emphasis); - --bs-alert-bg: var(--bs-light-bg-subtle); - --bs-alert-border-color: var(--bs-light-border-subtle); - --bs-alert-link-color: var(--bs-light-text-emphasis); -} - -.alert-dark { - --bs-alert-color: var(--bs-dark-text-emphasis); - --bs-alert-bg: var(--bs-dark-bg-subtle); - --bs-alert-border-color: var(--bs-dark-border-subtle); - --bs-alert-link-color: var(--bs-dark-text-emphasis); -} - -@keyframes progress-bar-stripes { - 0% { - background-position-x: var(--bs-progress-height); - } -} -.progress, -.progress-stacked { - --bs-progress-height: 1rem; - --bs-progress-font-size: 0.75rem; - --bs-progress-bg: var(--bs-secondary-bg); - --bs-progress-border-radius: var(--bs-border-radius); - --bs-progress-box-shadow: var(--bs-box-shadow-inset); - --bs-progress-bar-color: #fff; - --bs-progress-bar-bg: #0d6efd; - --bs-progress-bar-transition: width 0.6s ease; - display: flex; - height: var(--bs-progress-height); - overflow: hidden; - font-size: var(--bs-progress-font-size); - background-color: var(--bs-progress-bg); - border-radius: var(--bs-progress-border-radius); -} - -.progress-bar { - display: flex; - flex-direction: column; - justify-content: center; - overflow: hidden; - color: var(--bs-progress-bar-color); - text-align: center; - white-space: nowrap; - background-color: var(--bs-progress-bar-bg); - transition: var(--bs-progress-bar-transition); -} -@media (prefers-reduced-motion: reduce) { - .progress-bar { - transition: none; - } -} - -.progress-bar-striped { - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-size: var(--bs-progress-height) var(--bs-progress-height); -} - -.progress-stacked > .progress { - overflow: visible; -} - -.progress-stacked > .progress > .progress-bar { - width: 100%; -} - -.progress-bar-animated { - animation: 1s linear infinite progress-bar-stripes; -} -@media (prefers-reduced-motion: reduce) { - .progress-bar-animated { - animation: none; - } -} - -.list-group { - --bs-list-group-color: var(--bs-body-color); - --bs-list-group-bg: var(--bs-body-bg); - --bs-list-group-border-color: var(--bs-border-color); - --bs-list-group-border-width: var(--bs-border-width); - --bs-list-group-border-radius: var(--bs-border-radius); - --bs-list-group-item-padding-x: 1rem; - --bs-list-group-item-padding-y: 0.5rem; - --bs-list-group-action-color: var(--bs-secondary-color); - --bs-list-group-action-hover-color: var(--bs-emphasis-color); - --bs-list-group-action-hover-bg: var(--bs-tertiary-bg); - --bs-list-group-action-active-color: var(--bs-body-color); - --bs-list-group-action-active-bg: var(--bs-secondary-bg); - --bs-list-group-disabled-color: var(--bs-secondary-color); - --bs-list-group-disabled-bg: var(--bs-body-bg); - --bs-list-group-active-color: #fff; - --bs-list-group-active-bg: #0d6efd; - --bs-list-group-active-border-color: #0d6efd; - display: flex; - flex-direction: column; - padding-left: 0; - margin-bottom: 0; - border-radius: var(--bs-list-group-border-radius); -} - -.list-group-numbered { - list-style-type: none; - counter-reset: section; -} -.list-group-numbered > .list-group-item::before { - content: counters(section, ".") ". "; - counter-increment: section; -} - -.list-group-item { - position: relative; - display: block; - padding: var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x); - color: var(--bs-list-group-color); - text-decoration: none; - background-color: var(--bs-list-group-bg); - border: var(--bs-list-group-border-width) solid var(--bs-list-group-border-color); -} -.list-group-item:first-child { - border-top-left-radius: inherit; - border-top-right-radius: inherit; -} -.list-group-item:last-child { - border-bottom-right-radius: inherit; - border-bottom-left-radius: inherit; -} -.list-group-item.disabled, .list-group-item:disabled { - color: var(--bs-list-group-disabled-color); - pointer-events: none; - background-color: var(--bs-list-group-disabled-bg); -} -.list-group-item.active { - z-index: 2; - color: var(--bs-list-group-active-color); - background-color: var(--bs-list-group-active-bg); - border-color: var(--bs-list-group-active-border-color); -} -.list-group-item + .list-group-item { - border-top-width: 0; -} -.list-group-item + .list-group-item.active { - margin-top: calc(-1 * var(--bs-list-group-border-width)); - border-top-width: var(--bs-list-group-border-width); -} - -.list-group-item-action { - width: 100%; - color: var(--bs-list-group-action-color); - text-align: inherit; -} -.list-group-item-action:not(.active):hover, .list-group-item-action:not(.active):focus { - z-index: 1; - color: var(--bs-list-group-action-hover-color); - text-decoration: none; - background-color: var(--bs-list-group-action-hover-bg); -} -.list-group-item-action:not(.active):active { - color: var(--bs-list-group-action-active-color); - background-color: var(--bs-list-group-action-active-bg); -} - -.list-group-horizontal { - flex-direction: row; -} -.list-group-horizontal > .list-group-item:first-child:not(:last-child) { - border-bottom-left-radius: var(--bs-list-group-border-radius); - border-top-right-radius: 0; -} -.list-group-horizontal > .list-group-item:last-child:not(:first-child) { - border-top-right-radius: var(--bs-list-group-border-radius); - border-bottom-left-radius: 0; -} -.list-group-horizontal > .list-group-item.active { - margin-top: 0; -} -.list-group-horizontal > .list-group-item + .list-group-item { - border-top-width: var(--bs-list-group-border-width); - border-left-width: 0; -} -.list-group-horizontal > .list-group-item + .list-group-item.active { - margin-left: calc(-1 * var(--bs-list-group-border-width)); - border-left-width: var(--bs-list-group-border-width); -} - -@media (min-width: 576px) { - .list-group-horizontal-sm { - flex-direction: row; - } - .list-group-horizontal-sm > .list-group-item:first-child:not(:last-child) { - border-bottom-left-radius: var(--bs-list-group-border-radius); - border-top-right-radius: 0; - } - .list-group-horizontal-sm > .list-group-item:last-child:not(:first-child) { - border-top-right-radius: var(--bs-list-group-border-radius); - border-bottom-left-radius: 0; - } - .list-group-horizontal-sm > .list-group-item.active { - margin-top: 0; - } - .list-group-horizontal-sm > .list-group-item + .list-group-item { - border-top-width: var(--bs-list-group-border-width); - border-left-width: 0; - } - .list-group-horizontal-sm > .list-group-item + .list-group-item.active { - margin-left: calc(-1 * var(--bs-list-group-border-width)); - border-left-width: var(--bs-list-group-border-width); - } -} -@media (min-width: 768px) { - .list-group-horizontal-md { - flex-direction: row; - } - .list-group-horizontal-md > .list-group-item:first-child:not(:last-child) { - border-bottom-left-radius: var(--bs-list-group-border-radius); - border-top-right-radius: 0; - } - .list-group-horizontal-md > .list-group-item:last-child:not(:first-child) { - border-top-right-radius: var(--bs-list-group-border-radius); - border-bottom-left-radius: 0; - } - .list-group-horizontal-md > .list-group-item.active { - margin-top: 0; - } - .list-group-horizontal-md > .list-group-item + .list-group-item { - border-top-width: var(--bs-list-group-border-width); - border-left-width: 0; - } - .list-group-horizontal-md > .list-group-item + .list-group-item.active { - margin-left: calc(-1 * var(--bs-list-group-border-width)); - border-left-width: var(--bs-list-group-border-width); - } -} -@media (min-width: 992px) { - .list-group-horizontal-lg { - flex-direction: row; - } - .list-group-horizontal-lg > .list-group-item:first-child:not(:last-child) { - border-bottom-left-radius: var(--bs-list-group-border-radius); - border-top-right-radius: 0; - } - .list-group-horizontal-lg > .list-group-item:last-child:not(:first-child) { - border-top-right-radius: var(--bs-list-group-border-radius); - border-bottom-left-radius: 0; - } - .list-group-horizontal-lg > .list-group-item.active { - margin-top: 0; - } - .list-group-horizontal-lg > .list-group-item + .list-group-item { - border-top-width: var(--bs-list-group-border-width); - border-left-width: 0; - } - .list-group-horizontal-lg > .list-group-item + .list-group-item.active { - margin-left: calc(-1 * var(--bs-list-group-border-width)); - border-left-width: var(--bs-list-group-border-width); - } -} -@media (min-width: 1200px) { - .list-group-horizontal-xl { - flex-direction: row; - } - .list-group-horizontal-xl > .list-group-item:first-child:not(:last-child) { - border-bottom-left-radius: var(--bs-list-group-border-radius); - border-top-right-radius: 0; - } - .list-group-horizontal-xl > .list-group-item:last-child:not(:first-child) { - border-top-right-radius: var(--bs-list-group-border-radius); - border-bottom-left-radius: 0; - } - .list-group-horizontal-xl > .list-group-item.active { - margin-top: 0; - } - .list-group-horizontal-xl > .list-group-item + .list-group-item { - border-top-width: var(--bs-list-group-border-width); - border-left-width: 0; - } - .list-group-horizontal-xl > .list-group-item + .list-group-item.active { - margin-left: calc(-1 * var(--bs-list-group-border-width)); - border-left-width: var(--bs-list-group-border-width); - } -} -@media (min-width: 1400px) { - .list-group-horizontal-xxl { - flex-direction: row; - } - .list-group-horizontal-xxl > .list-group-item:first-child:not(:last-child) { - border-bottom-left-radius: var(--bs-list-group-border-radius); - border-top-right-radius: 0; - } - .list-group-horizontal-xxl > .list-group-item:last-child:not(:first-child) { - border-top-right-radius: var(--bs-list-group-border-radius); - border-bottom-left-radius: 0; - } - .list-group-horizontal-xxl > .list-group-item.active { - margin-top: 0; - } - .list-group-horizontal-xxl > .list-group-item + .list-group-item { - border-top-width: var(--bs-list-group-border-width); - border-left-width: 0; - } - .list-group-horizontal-xxl > .list-group-item + .list-group-item.active { - margin-left: calc(-1 * var(--bs-list-group-border-width)); - border-left-width: var(--bs-list-group-border-width); - } -} -.list-group-flush { - border-radius: 0; -} -.list-group-flush > .list-group-item { - border-width: 0 0 var(--bs-list-group-border-width); -} -.list-group-flush > .list-group-item:last-child { - border-bottom-width: 0; -} - -.list-group-item-primary { - --bs-list-group-color: var(--bs-primary-text-emphasis); - --bs-list-group-bg: var(--bs-primary-bg-subtle); - --bs-list-group-border-color: var(--bs-primary-border-subtle); - --bs-list-group-action-hover-color: var(--bs-emphasis-color); - --bs-list-group-action-hover-bg: var(--bs-primary-border-subtle); - --bs-list-group-action-active-color: var(--bs-emphasis-color); - --bs-list-group-action-active-bg: var(--bs-primary-border-subtle); - --bs-list-group-active-color: var(--bs-primary-bg-subtle); - --bs-list-group-active-bg: var(--bs-primary-text-emphasis); - --bs-list-group-active-border-color: var(--bs-primary-text-emphasis); -} - -.list-group-item-secondary { - --bs-list-group-color: var(--bs-secondary-text-emphasis); - --bs-list-group-bg: var(--bs-secondary-bg-subtle); - --bs-list-group-border-color: var(--bs-secondary-border-subtle); - --bs-list-group-action-hover-color: var(--bs-emphasis-color); - --bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle); - --bs-list-group-action-active-color: var(--bs-emphasis-color); - --bs-list-group-action-active-bg: var(--bs-secondary-border-subtle); - --bs-list-group-active-color: var(--bs-secondary-bg-subtle); - --bs-list-group-active-bg: var(--bs-secondary-text-emphasis); - --bs-list-group-active-border-color: var(--bs-secondary-text-emphasis); -} - -.list-group-item-success { - --bs-list-group-color: var(--bs-success-text-emphasis); - --bs-list-group-bg: var(--bs-success-bg-subtle); - --bs-list-group-border-color: var(--bs-success-border-subtle); - --bs-list-group-action-hover-color: var(--bs-emphasis-color); - --bs-list-group-action-hover-bg: var(--bs-success-border-subtle); - --bs-list-group-action-active-color: var(--bs-emphasis-color); - --bs-list-group-action-active-bg: var(--bs-success-border-subtle); - --bs-list-group-active-color: var(--bs-success-bg-subtle); - --bs-list-group-active-bg: var(--bs-success-text-emphasis); - --bs-list-group-active-border-color: var(--bs-success-text-emphasis); -} - -.list-group-item-info { - --bs-list-group-color: var(--bs-info-text-emphasis); - --bs-list-group-bg: var(--bs-info-bg-subtle); - --bs-list-group-border-color: var(--bs-info-border-subtle); - --bs-list-group-action-hover-color: var(--bs-emphasis-color); - --bs-list-group-action-hover-bg: var(--bs-info-border-subtle); - --bs-list-group-action-active-color: var(--bs-emphasis-color); - --bs-list-group-action-active-bg: var(--bs-info-border-subtle); - --bs-list-group-active-color: var(--bs-info-bg-subtle); - --bs-list-group-active-bg: var(--bs-info-text-emphasis); - --bs-list-group-active-border-color: var(--bs-info-text-emphasis); -} - -.list-group-item-warning { - --bs-list-group-color: var(--bs-warning-text-emphasis); - --bs-list-group-bg: var(--bs-warning-bg-subtle); - --bs-list-group-border-color: var(--bs-warning-border-subtle); - --bs-list-group-action-hover-color: var(--bs-emphasis-color); - --bs-list-group-action-hover-bg: var(--bs-warning-border-subtle); - --bs-list-group-action-active-color: var(--bs-emphasis-color); - --bs-list-group-action-active-bg: var(--bs-warning-border-subtle); - --bs-list-group-active-color: var(--bs-warning-bg-subtle); - --bs-list-group-active-bg: var(--bs-warning-text-emphasis); - --bs-list-group-active-border-color: var(--bs-warning-text-emphasis); -} - -.list-group-item-danger { - --bs-list-group-color: var(--bs-danger-text-emphasis); - --bs-list-group-bg: var(--bs-danger-bg-subtle); - --bs-list-group-border-color: var(--bs-danger-border-subtle); - --bs-list-group-action-hover-color: var(--bs-emphasis-color); - --bs-list-group-action-hover-bg: var(--bs-danger-border-subtle); - --bs-list-group-action-active-color: var(--bs-emphasis-color); - --bs-list-group-action-active-bg: var(--bs-danger-border-subtle); - --bs-list-group-active-color: var(--bs-danger-bg-subtle); - --bs-list-group-active-bg: var(--bs-danger-text-emphasis); - --bs-list-group-active-border-color: var(--bs-danger-text-emphasis); -} - -.list-group-item-light { - --bs-list-group-color: var(--bs-light-text-emphasis); - --bs-list-group-bg: var(--bs-light-bg-subtle); - --bs-list-group-border-color: var(--bs-light-border-subtle); - --bs-list-group-action-hover-color: var(--bs-emphasis-color); - --bs-list-group-action-hover-bg: var(--bs-light-border-subtle); - --bs-list-group-action-active-color: var(--bs-emphasis-color); - --bs-list-group-action-active-bg: var(--bs-light-border-subtle); - --bs-list-group-active-color: var(--bs-light-bg-subtle); - --bs-list-group-active-bg: var(--bs-light-text-emphasis); - --bs-list-group-active-border-color: var(--bs-light-text-emphasis); -} - -.list-group-item-dark { - --bs-list-group-color: var(--bs-dark-text-emphasis); - --bs-list-group-bg: var(--bs-dark-bg-subtle); - --bs-list-group-border-color: var(--bs-dark-border-subtle); - --bs-list-group-action-hover-color: var(--bs-emphasis-color); - --bs-list-group-action-hover-bg: var(--bs-dark-border-subtle); - --bs-list-group-action-active-color: var(--bs-emphasis-color); - --bs-list-group-action-active-bg: var(--bs-dark-border-subtle); - --bs-list-group-active-color: var(--bs-dark-bg-subtle); - --bs-list-group-active-bg: var(--bs-dark-text-emphasis); - --bs-list-group-active-border-color: var(--bs-dark-text-emphasis); -} - -.btn-close { - --bs-btn-close-color: #000; - --bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414'/%3e%3c/svg%3e"); - --bs-btn-close-opacity: 0.5; - --bs-btn-close-hover-opacity: 0.75; - --bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); - --bs-btn-close-focus-opacity: 1; - --bs-btn-close-disabled-opacity: 0.25; - box-sizing: content-box; - width: 1em; - height: 1em; - padding: 0.25em 0.25em; - color: var(--bs-btn-close-color); - background: transparent var(--bs-btn-close-bg) center/1em auto no-repeat; - filter: var(--bs-btn-close-filter); - border: 0; - border-radius: 0.375rem; - opacity: var(--bs-btn-close-opacity); -} -.btn-close:hover { - color: var(--bs-btn-close-color); - text-decoration: none; - opacity: var(--bs-btn-close-hover-opacity); -} -.btn-close:focus { - outline: 0; - box-shadow: var(--bs-btn-close-focus-shadow); - opacity: var(--bs-btn-close-focus-opacity); -} -.btn-close:disabled, .btn-close.disabled { - pointer-events: none; - user-select: none; - opacity: var(--bs-btn-close-disabled-opacity); -} - -.btn-close-white { - --bs-btn-close-filter: invert(1) grayscale(100%) brightness(200%); -} - -:root, -[data-bs-theme=light] { - --bs-btn-close-filter: ; -} - -[data-bs-theme=dark] { - --bs-btn-close-filter: invert(1) grayscale(100%) brightness(200%); -} - -.toast { - --bs-toast-zindex: 1090; - --bs-toast-padding-x: 0.75rem; - --bs-toast-padding-y: 0.5rem; - --bs-toast-spacing: 1.5rem; - --bs-toast-max-width: 350px; - --bs-toast-font-size: 0.875rem; - --bs-toast-color: ; - --bs-toast-bg: rgba(var(--bs-body-bg-rgb), 0.85); - --bs-toast-border-width: var(--bs-border-width); - --bs-toast-border-color: var(--bs-border-color-translucent); - --bs-toast-border-radius: var(--bs-border-radius); - --bs-toast-box-shadow: var(--bs-box-shadow); - --bs-toast-header-color: var(--bs-secondary-color); - --bs-toast-header-bg: rgba(var(--bs-body-bg-rgb), 0.85); - --bs-toast-header-border-color: var(--bs-border-color-translucent); - width: var(--bs-toast-max-width); - max-width: 100%; - font-size: var(--bs-toast-font-size); - color: var(--bs-toast-color); - pointer-events: auto; - background-color: var(--bs-toast-bg); - background-clip: padding-box; - border: var(--bs-toast-border-width) solid var(--bs-toast-border-color); - box-shadow: var(--bs-toast-box-shadow); - border-radius: var(--bs-toast-border-radius); -} -.toast.showing { - opacity: 0; -} -.toast:not(.show) { - display: none; -} - -.toast-container { - --bs-toast-zindex: 1090; - position: absolute; - z-index: var(--bs-toast-zindex); - width: max-content; - max-width: 100%; - pointer-events: none; -} -.toast-container > :not(:last-child) { - margin-bottom: var(--bs-toast-spacing); -} - -.toast-header { - display: flex; - align-items: center; - padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x); - color: var(--bs-toast-header-color); - background-color: var(--bs-toast-header-bg); - background-clip: padding-box; - border-bottom: var(--bs-toast-border-width) solid var(--bs-toast-header-border-color); - border-top-left-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width)); - border-top-right-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width)); -} -.toast-header .btn-close { - margin-right: calc(-0.5 * var(--bs-toast-padding-x)); - margin-left: var(--bs-toast-padding-x); -} - -.toast-body { - padding: var(--bs-toast-padding-x); - word-wrap: break-word; -} - -.modal { - --bs-modal-zindex: 1055; - --bs-modal-width: 500px; - --bs-modal-padding: 1rem; - --bs-modal-margin: 0.5rem; - --bs-modal-color: var(--bs-body-color); - --bs-modal-bg: var(--bs-body-bg); - --bs-modal-border-color: var(--bs-border-color-translucent); - --bs-modal-border-width: var(--bs-border-width); - --bs-modal-border-radius: var(--bs-border-radius-lg); - --bs-modal-box-shadow: var(--bs-box-shadow-sm); - --bs-modal-inner-border-radius: calc(var(--bs-border-radius-lg) - (var(--bs-border-width))); - --bs-modal-header-padding-x: 1rem; - --bs-modal-header-padding-y: 1rem; - --bs-modal-header-padding: 1rem 1rem; - --bs-modal-header-border-color: var(--bs-border-color); - --bs-modal-header-border-width: var(--bs-border-width); - --bs-modal-title-line-height: 1.5; - --bs-modal-footer-gap: 0.5rem; - --bs-modal-footer-bg: ; - --bs-modal-footer-border-color: var(--bs-border-color); - --bs-modal-footer-border-width: var(--bs-border-width); - position: fixed; - top: 0; - left: 0; - z-index: var(--bs-modal-zindex); - display: none; - width: 100%; - height: 100%; - overflow-x: hidden; - overflow-y: auto; - outline: 0; -} - -.modal-dialog { - position: relative; - width: auto; - margin: var(--bs-modal-margin); - pointer-events: none; -} -.modal.fade .modal-dialog { - transform: translate(0, -50px); - transition: transform 0.3s ease-out; -} -@media (prefers-reduced-motion: reduce) { - .modal.fade .modal-dialog { - transition: none; - } -} -.modal.show .modal-dialog { - transform: none; -} -.modal.modal-static .modal-dialog { - transform: scale(1.02); -} - -.modal-dialog-scrollable { - height: calc(100% - var(--bs-modal-margin) * 2); -} -.modal-dialog-scrollable .modal-content { - max-height: 100%; - overflow: hidden; -} -.modal-dialog-scrollable .modal-body { - overflow-y: auto; -} - -.modal-dialog-centered { - display: flex; - align-items: center; - min-height: calc(100% - var(--bs-modal-margin) * 2); -} - -.modal-content { - position: relative; - display: flex; - flex-direction: column; - width: 100%; - color: var(--bs-modal-color); - pointer-events: auto; - background-color: var(--bs-modal-bg); - background-clip: padding-box; - border: var(--bs-modal-border-width) solid var(--bs-modal-border-color); - border-radius: var(--bs-modal-border-radius); - outline: 0; -} - -.modal-backdrop { - --bs-backdrop-zindex: 1050; - --bs-backdrop-bg: #000; - --bs-backdrop-opacity: 0.5; - position: fixed; - top: 0; - left: 0; - z-index: var(--bs-backdrop-zindex); - width: 100vw; - height: 100vh; - background-color: var(--bs-backdrop-bg); -} -.modal-backdrop.fade { - opacity: 0; -} -.modal-backdrop.show { - opacity: var(--bs-backdrop-opacity); -} - -.modal-header { - display: flex; - flex-shrink: 0; - align-items: center; - padding: var(--bs-modal-header-padding); - border-bottom: var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color); - border-top-left-radius: var(--bs-modal-inner-border-radius); - border-top-right-radius: var(--bs-modal-inner-border-radius); -} -.modal-header .btn-close { - padding: calc(var(--bs-modal-header-padding-y) * 0.5) calc(var(--bs-modal-header-padding-x) * 0.5); - margin-top: calc(-0.5 * var(--bs-modal-header-padding-y)); - margin-right: calc(-0.5 * var(--bs-modal-header-padding-x)); - margin-bottom: calc(-0.5 * var(--bs-modal-header-padding-y)); - margin-left: auto; -} - -.modal-title { - margin-bottom: 0; - line-height: var(--bs-modal-title-line-height); -} - -.modal-body { - position: relative; - flex: 1 1 auto; - padding: var(--bs-modal-padding); -} - -.modal-footer { - display: flex; - flex-shrink: 0; - flex-wrap: wrap; - align-items: center; - justify-content: flex-end; - padding: calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * 0.5); - background-color: var(--bs-modal-footer-bg); - border-top: var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color); - border-bottom-right-radius: var(--bs-modal-inner-border-radius); - border-bottom-left-radius: var(--bs-modal-inner-border-radius); -} -.modal-footer > * { - margin: calc(var(--bs-modal-footer-gap) * 0.5); -} - -@media (min-width: 576px) { - .modal { - --bs-modal-margin: 1.75rem; - --bs-modal-box-shadow: var(--bs-box-shadow); - } - .modal-dialog { - max-width: var(--bs-modal-width); - margin-right: auto; - margin-left: auto; - } - .modal-sm { - --bs-modal-width: 300px; - } -} -@media (min-width: 992px) { - .modal-lg, - .modal-xl { - --bs-modal-width: 800px; - } -} -@media (min-width: 1200px) { - .modal-xl { - --bs-modal-width: 1140px; - } -} -.modal-fullscreen { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; -} -.modal-fullscreen .modal-content { - height: 100%; - border: 0; - border-radius: 0; -} -.modal-fullscreen .modal-header, -.modal-fullscreen .modal-footer { - border-radius: 0; -} -.modal-fullscreen .modal-body { - overflow-y: auto; -} - -@media (max-width: 575.98px) { - .modal-fullscreen-sm-down { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; - } - .modal-fullscreen-sm-down .modal-content { - height: 100%; - border: 0; - border-radius: 0; - } - .modal-fullscreen-sm-down .modal-header, - .modal-fullscreen-sm-down .modal-footer { - border-radius: 0; - } - .modal-fullscreen-sm-down .modal-body { - overflow-y: auto; - } -} -@media (max-width: 767.98px) { - .modal-fullscreen-md-down { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; - } - .modal-fullscreen-md-down .modal-content { - height: 100%; - border: 0; - border-radius: 0; - } - .modal-fullscreen-md-down .modal-header, - .modal-fullscreen-md-down .modal-footer { - border-radius: 0; - } - .modal-fullscreen-md-down .modal-body { - overflow-y: auto; - } -} -@media (max-width: 991.98px) { - .modal-fullscreen-lg-down { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; - } - .modal-fullscreen-lg-down .modal-content { - height: 100%; - border: 0; - border-radius: 0; - } - .modal-fullscreen-lg-down .modal-header, - .modal-fullscreen-lg-down .modal-footer { - border-radius: 0; - } - .modal-fullscreen-lg-down .modal-body { - overflow-y: auto; - } -} -@media (max-width: 1199.98px) { - .modal-fullscreen-xl-down { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; - } - .modal-fullscreen-xl-down .modal-content { - height: 100%; - border: 0; - border-radius: 0; - } - .modal-fullscreen-xl-down .modal-header, - .modal-fullscreen-xl-down .modal-footer { - border-radius: 0; - } - .modal-fullscreen-xl-down .modal-body { - overflow-y: auto; - } -} -@media (max-width: 1399.98px) { - .modal-fullscreen-xxl-down { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; - } - .modal-fullscreen-xxl-down .modal-content { - height: 100%; - border: 0; - border-radius: 0; - } - .modal-fullscreen-xxl-down .modal-header, - .modal-fullscreen-xxl-down .modal-footer { - border-radius: 0; - } - .modal-fullscreen-xxl-down .modal-body { - overflow-y: auto; - } -} -.tooltip { - --bs-tooltip-zindex: 1080; - --bs-tooltip-max-width: 200px; - --bs-tooltip-padding-x: 0.5rem; - --bs-tooltip-padding-y: 0.25rem; - --bs-tooltip-margin: ; - --bs-tooltip-font-size: 0.875rem; - --bs-tooltip-color: var(--bs-body-bg); - --bs-tooltip-bg: var(--bs-emphasis-color); - --bs-tooltip-border-radius: var(--bs-border-radius); - --bs-tooltip-opacity: 0.9; - --bs-tooltip-arrow-width: 0.8rem; - --bs-tooltip-arrow-height: 0.4rem; - z-index: var(--bs-tooltip-zindex); - display: block; - margin: var(--bs-tooltip-margin); - font-family: var(--bs-font-sans-serif); - font-style: normal; - font-weight: 400; - line-height: 1.5; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - white-space: normal; - word-spacing: normal; - line-break: auto; - font-size: var(--bs-tooltip-font-size); - word-wrap: break-word; - opacity: 0; -} -.tooltip.show { - opacity: var(--bs-tooltip-opacity); -} -.tooltip .tooltip-arrow { - display: block; - width: var(--bs-tooltip-arrow-width); - height: var(--bs-tooltip-arrow-height); -} -.tooltip .tooltip-arrow::before { - position: absolute; - content: ""; - border-color: transparent; - border-style: solid; -} - -.bs-tooltip-top .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow { - bottom: calc(-1 * var(--bs-tooltip-arrow-height)); -} -.bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before { - top: -1px; - border-width: var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0; - border-top-color: var(--bs-tooltip-bg); -} - -/* rtl:begin:ignore */ -.bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow { - left: calc(-1 * var(--bs-tooltip-arrow-height)); - width: var(--bs-tooltip-arrow-height); - height: var(--bs-tooltip-arrow-width); -} -.bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before { - right: -1px; - border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0; - border-right-color: var(--bs-tooltip-bg); -} - -/* rtl:end:ignore */ -.bs-tooltip-bottom .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow { - top: calc(-1 * var(--bs-tooltip-arrow-height)); -} -.bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before { - bottom: -1px; - border-width: 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height); - border-bottom-color: var(--bs-tooltip-bg); -} - -/* rtl:begin:ignore */ -.bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow { - right: calc(-1 * var(--bs-tooltip-arrow-height)); - width: var(--bs-tooltip-arrow-height); - height: var(--bs-tooltip-arrow-width); -} -.bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before { - left: -1px; - border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height); - border-left-color: var(--bs-tooltip-bg); -} - -/* rtl:end:ignore */ -.tooltip-inner { - max-width: var(--bs-tooltip-max-width); - padding: var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x); - color: var(--bs-tooltip-color); - text-align: center; - background-color: var(--bs-tooltip-bg); - border-radius: var(--bs-tooltip-border-radius); -} - -.popover { - --bs-popover-zindex: 1070; - --bs-popover-max-width: 276px; - --bs-popover-font-size: 0.875rem; - --bs-popover-bg: var(--bs-body-bg); - --bs-popover-border-width: var(--bs-border-width); - --bs-popover-border-color: var(--bs-border-color-translucent); - --bs-popover-border-radius: var(--bs-border-radius-lg); - --bs-popover-inner-border-radius: calc(var(--bs-border-radius-lg) - var(--bs-border-width)); - --bs-popover-box-shadow: var(--bs-box-shadow); - --bs-popover-header-padding-x: 1rem; - --bs-popover-header-padding-y: 0.5rem; - --bs-popover-header-font-size: 1rem; - --bs-popover-header-color: inherit; - --bs-popover-header-bg: var(--bs-secondary-bg); - --bs-popover-body-padding-x: 1rem; - --bs-popover-body-padding-y: 1rem; - --bs-popover-body-color: var(--bs-body-color); - --bs-popover-arrow-width: 1rem; - --bs-popover-arrow-height: 0.5rem; - --bs-popover-arrow-border: var(--bs-popover-border-color); - z-index: var(--bs-popover-zindex); - display: block; - max-width: var(--bs-popover-max-width); - font-family: var(--bs-font-sans-serif); - font-style: normal; - font-weight: 400; - line-height: 1.5; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - white-space: normal; - word-spacing: normal; - line-break: auto; - font-size: var(--bs-popover-font-size); - word-wrap: break-word; - background-color: var(--bs-popover-bg); - background-clip: padding-box; - border: var(--bs-popover-border-width) solid var(--bs-popover-border-color); - border-radius: var(--bs-popover-border-radius); -} -.popover .popover-arrow { - display: block; - width: var(--bs-popover-arrow-width); - height: var(--bs-popover-arrow-height); -} -.popover .popover-arrow::before, .popover .popover-arrow::after { - position: absolute; - display: block; - content: ""; - border-color: transparent; - border-style: solid; - border-width: 0; -} - -.bs-popover-top > .popover-arrow, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow { - bottom: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); -} -.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before, .bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after { - border-width: var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0; -} -.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before { - bottom: 0; - border-top-color: var(--bs-popover-arrow-border); -} -.bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after { - bottom: var(--bs-popover-border-width); - border-top-color: var(--bs-popover-bg); -} - -/* rtl:begin:ignore */ -.bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow { - left: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); - width: var(--bs-popover-arrow-height); - height: var(--bs-popover-arrow-width); -} -.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before, .bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after { - border-width: calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0; -} -.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before { - left: 0; - border-right-color: var(--bs-popover-arrow-border); -} -.bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after { - left: var(--bs-popover-border-width); - border-right-color: var(--bs-popover-bg); -} - -/* rtl:end:ignore */ -.bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow { - top: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); -} -.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before, .bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after { - border-width: 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height); -} -.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before { - top: 0; - border-bottom-color: var(--bs-popover-arrow-border); -} -.bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after { - top: var(--bs-popover-border-width); - border-bottom-color: var(--bs-popover-bg); -} -.bs-popover-bottom .popover-header::before, .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before { - position: absolute; - top: 0; - left: 50%; - display: block; - width: var(--bs-popover-arrow-width); - margin-left: calc(-0.5 * var(--bs-popover-arrow-width)); - content: ""; - border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-header-bg); -} - -/* rtl:begin:ignore */ -.bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow { - right: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); - width: var(--bs-popover-arrow-height); - height: var(--bs-popover-arrow-width); -} -.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before, .bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after { - border-width: calc(var(--bs-popover-arrow-width) * 0.5) 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height); -} -.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before { - right: 0; - border-left-color: var(--bs-popover-arrow-border); -} -.bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after { - right: var(--bs-popover-border-width); - border-left-color: var(--bs-popover-bg); -} - -/* rtl:end:ignore */ -.popover-header { - padding: var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x); - margin-bottom: 0; - font-size: var(--bs-popover-header-font-size); - color: var(--bs-popover-header-color); - background-color: var(--bs-popover-header-bg); - border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-border-color); - border-top-left-radius: var(--bs-popover-inner-border-radius); - border-top-right-radius: var(--bs-popover-inner-border-radius); -} -.popover-header:empty { - display: none; -} - -.popover-body { - padding: var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x); - color: var(--bs-popover-body-color); -} - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} -.carousel-inner::after { - display: block; - clear: both; - content: ""; -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - transition: transform 0.6s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .carousel-item { - transition: none; - } -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); -} - -.carousel-fade .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; -} -.carousel-fade .carousel-item.active, -.carousel-fade .carousel-item-next.carousel-item-start, -.carousel-fade .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; -} -.carousel-fade .active.carousel-item-start, -.carousel-fade .active.carousel-item-end { - z-index: 0; - opacity: 0; - transition: opacity 0s 0.6s; -} -@media (prefers-reduced-motion: reduce) { - .carousel-fade .active.carousel-item-start, - .carousel-fade .active.carousel-item-end { - transition: none; - } -} - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - display: flex; - align-items: center; - justify-content: center; - width: 15%; - padding: 0; - color: #fff; - text-align: center; - background: none; - filter: var(--bs-carousel-control-icon-filter); - border: 0; - opacity: 0.5; - transition: opacity 0.15s ease; -} -@media (prefers-reduced-motion: reduce) { - .carousel-control-prev, - .carousel-control-next { - transition: none; - } -} -.carousel-control-prev:hover, .carousel-control-prev:focus, -.carousel-control-next:hover, -.carousel-control-next:focus { - color: #fff; - text-decoration: none; - outline: 0; - opacity: 0.9; -} - -.carousel-control-prev { - left: 0; -} - -.carousel-control-next { - right: 0; -} - -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: 2rem; - height: 2rem; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; -} - -.carousel-control-prev-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0'/%3e%3c/svg%3e") /*rtl:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e")*/; -} - -.carousel-control-next-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e") /*rtl:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0'/%3e%3c/svg%3e")*/; -} - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - margin-right: 15%; - margin-bottom: 1rem; - margin-left: 15%; -} -.carousel-indicators [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: 30px; - height: 3px; - padding: 0; - margin-right: 3px; - margin-left: 3px; - text-indent: -999px; - cursor: pointer; - background-color: var(--bs-carousel-indicator-active-bg); - background-clip: padding-box; - border: 0; - border-top: 10px solid transparent; - border-bottom: 10px solid transparent; - opacity: 0.5; - transition: opacity 0.6s ease; -} -@media (prefers-reduced-motion: reduce) { - .carousel-indicators [data-bs-target] { - transition: none; - } -} -.carousel-indicators .active { - opacity: 1; -} - -.carousel-caption { - position: absolute; - right: 15%; - bottom: 1.25rem; - left: 15%; - padding-top: 1.25rem; - padding-bottom: 1.25rem; - color: var(--bs-carousel-caption-color); - text-align: center; -} - -.carousel-dark { - --bs-carousel-indicator-active-bg: #000; - --bs-carousel-caption-color: #000; - --bs-carousel-control-icon-filter: invert(1) grayscale(100); -} - -:root, -[data-bs-theme=light] { - --bs-carousel-indicator-active-bg: #fff; - --bs-carousel-caption-color: #fff; - --bs-carousel-control-icon-filter: ; -} - -[data-bs-theme=dark] { - --bs-carousel-indicator-active-bg: #000; - --bs-carousel-caption-color: #000; - --bs-carousel-control-icon-filter: invert(1) grayscale(100); -} - -.spinner-grow, -.spinner-border { - display: inline-block; - flex-shrink: 0; - width: var(--bs-spinner-width); - height: var(--bs-spinner-height); - vertical-align: var(--bs-spinner-vertical-align); - border-radius: 50%; - animation: var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name); -} - -@keyframes spinner-border { - to { - transform: rotate(360deg) /* rtl:ignore */; - } -} -.spinner-border { - --bs-spinner-width: 2rem; - --bs-spinner-height: 2rem; - --bs-spinner-vertical-align: -0.125em; - --bs-spinner-border-width: 0.25em; - --bs-spinner-animation-speed: 0.75s; - --bs-spinner-animation-name: spinner-border; - border: var(--bs-spinner-border-width) solid currentcolor; - border-right-color: transparent; -} - -.spinner-border-sm { - --bs-spinner-width: 1rem; - --bs-spinner-height: 1rem; - --bs-spinner-border-width: 0.2em; -} - -@keyframes spinner-grow { - 0% { - transform: scale(0); - } - 50% { - opacity: 1; - transform: none; - } -} -.spinner-grow { - --bs-spinner-width: 2rem; - --bs-spinner-height: 2rem; - --bs-spinner-vertical-align: -0.125em; - --bs-spinner-animation-speed: 0.75s; - --bs-spinner-animation-name: spinner-grow; - background-color: currentcolor; - opacity: 0; -} - -.spinner-grow-sm { - --bs-spinner-width: 1rem; - --bs-spinner-height: 1rem; -} - -@media (prefers-reduced-motion: reduce) { - .spinner-border, - .spinner-grow { - --bs-spinner-animation-speed: 1.5s; - } -} -.offcanvas, .offcanvas-xxl, .offcanvas-xl, .offcanvas-lg, .offcanvas-md, .offcanvas-sm { - --bs-offcanvas-zindex: 1045; - --bs-offcanvas-width: 400px; - --bs-offcanvas-height: 30vh; - --bs-offcanvas-padding-x: 1rem; - --bs-offcanvas-padding-y: 1rem; - --bs-offcanvas-color: var(--bs-body-color); - --bs-offcanvas-bg: var(--bs-body-bg); - --bs-offcanvas-border-width: var(--bs-border-width); - --bs-offcanvas-border-color: var(--bs-border-color-translucent); - --bs-offcanvas-box-shadow: var(--bs-box-shadow-sm); - --bs-offcanvas-transition: transform 0.3s ease-in-out; - --bs-offcanvas-title-line-height: 1.5; -} - -@media (max-width: 575.98px) { - .offcanvas-sm { - position: fixed; - bottom: 0; - z-index: var(--bs-offcanvas-zindex); - display: flex; - flex-direction: column; - max-width: 100%; - color: var(--bs-offcanvas-color); - visibility: hidden; - background-color: var(--bs-offcanvas-bg); - background-clip: padding-box; - outline: 0; - transition: var(--bs-offcanvas-transition); - } -} -@media (max-width: 575.98px) and (prefers-reduced-motion: reduce) { - .offcanvas-sm { - transition: none; - } -} -@media (max-width: 575.98px) { - .offcanvas-sm.offcanvas-start { - top: 0; - left: 0; - width: var(--bs-offcanvas-width); - border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(-100%); - } - .offcanvas-sm.offcanvas-end { - top: 0; - right: 0; - width: var(--bs-offcanvas-width); - border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(100%); - } - .offcanvas-sm.offcanvas-top { - top: 0; - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(-100%); - } - .offcanvas-sm.offcanvas-bottom { - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(100%); - } - .offcanvas-sm.showing, .offcanvas-sm.show:not(.hiding) { - transform: none; - } - .offcanvas-sm.showing, .offcanvas-sm.hiding, .offcanvas-sm.show { - visibility: visible; - } -} -@media (min-width: 576px) { - .offcanvas-sm { - --bs-offcanvas-height: auto; - --bs-offcanvas-border-width: 0; - background-color: transparent !important; - } - .offcanvas-sm .offcanvas-header { - display: none; - } - .offcanvas-sm .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; - background-color: transparent !important; - } -} - -@media (max-width: 767.98px) { - .offcanvas-md { - position: fixed; - bottom: 0; - z-index: var(--bs-offcanvas-zindex); - display: flex; - flex-direction: column; - max-width: 100%; - color: var(--bs-offcanvas-color); - visibility: hidden; - background-color: var(--bs-offcanvas-bg); - background-clip: padding-box; - outline: 0; - transition: var(--bs-offcanvas-transition); - } -} -@media (max-width: 767.98px) and (prefers-reduced-motion: reduce) { - .offcanvas-md { - transition: none; - } -} -@media (max-width: 767.98px) { - .offcanvas-md.offcanvas-start { - top: 0; - left: 0; - width: var(--bs-offcanvas-width); - border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(-100%); - } - .offcanvas-md.offcanvas-end { - top: 0; - right: 0; - width: var(--bs-offcanvas-width); - border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(100%); - } - .offcanvas-md.offcanvas-top { - top: 0; - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(-100%); - } - .offcanvas-md.offcanvas-bottom { - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(100%); - } - .offcanvas-md.showing, .offcanvas-md.show:not(.hiding) { - transform: none; - } - .offcanvas-md.showing, .offcanvas-md.hiding, .offcanvas-md.show { - visibility: visible; - } -} -@media (min-width: 768px) { - .offcanvas-md { - --bs-offcanvas-height: auto; - --bs-offcanvas-border-width: 0; - background-color: transparent !important; - } - .offcanvas-md .offcanvas-header { - display: none; - } - .offcanvas-md .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; - background-color: transparent !important; - } -} - -@media (max-width: 991.98px) { - .offcanvas-lg { - position: fixed; - bottom: 0; - z-index: var(--bs-offcanvas-zindex); - display: flex; - flex-direction: column; - max-width: 100%; - color: var(--bs-offcanvas-color); - visibility: hidden; - background-color: var(--bs-offcanvas-bg); - background-clip: padding-box; - outline: 0; - transition: var(--bs-offcanvas-transition); - } -} -@media (max-width: 991.98px) and (prefers-reduced-motion: reduce) { - .offcanvas-lg { - transition: none; - } -} -@media (max-width: 991.98px) { - .offcanvas-lg.offcanvas-start { - top: 0; - left: 0; - width: var(--bs-offcanvas-width); - border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(-100%); - } - .offcanvas-lg.offcanvas-end { - top: 0; - right: 0; - width: var(--bs-offcanvas-width); - border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(100%); - } - .offcanvas-lg.offcanvas-top { - top: 0; - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(-100%); - } - .offcanvas-lg.offcanvas-bottom { - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(100%); - } - .offcanvas-lg.showing, .offcanvas-lg.show:not(.hiding) { - transform: none; - } - .offcanvas-lg.showing, .offcanvas-lg.hiding, .offcanvas-lg.show { - visibility: visible; - } -} -@media (min-width: 992px) { - .offcanvas-lg { - --bs-offcanvas-height: auto; - --bs-offcanvas-border-width: 0; - background-color: transparent !important; - } - .offcanvas-lg .offcanvas-header { - display: none; - } - .offcanvas-lg .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; - background-color: transparent !important; - } -} - -@media (max-width: 1199.98px) { - .offcanvas-xl { - position: fixed; - bottom: 0; - z-index: var(--bs-offcanvas-zindex); - display: flex; - flex-direction: column; - max-width: 100%; - color: var(--bs-offcanvas-color); - visibility: hidden; - background-color: var(--bs-offcanvas-bg); - background-clip: padding-box; - outline: 0; - transition: var(--bs-offcanvas-transition); - } -} -@media (max-width: 1199.98px) and (prefers-reduced-motion: reduce) { - .offcanvas-xl { - transition: none; - } -} -@media (max-width: 1199.98px) { - .offcanvas-xl.offcanvas-start { - top: 0; - left: 0; - width: var(--bs-offcanvas-width); - border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(-100%); - } - .offcanvas-xl.offcanvas-end { - top: 0; - right: 0; - width: var(--bs-offcanvas-width); - border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(100%); - } - .offcanvas-xl.offcanvas-top { - top: 0; - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(-100%); - } - .offcanvas-xl.offcanvas-bottom { - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(100%); - } - .offcanvas-xl.showing, .offcanvas-xl.show:not(.hiding) { - transform: none; - } - .offcanvas-xl.showing, .offcanvas-xl.hiding, .offcanvas-xl.show { - visibility: visible; - } -} -@media (min-width: 1200px) { - .offcanvas-xl { - --bs-offcanvas-height: auto; - --bs-offcanvas-border-width: 0; - background-color: transparent !important; - } - .offcanvas-xl .offcanvas-header { - display: none; - } - .offcanvas-xl .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; - background-color: transparent !important; - } -} - -@media (max-width: 1399.98px) { - .offcanvas-xxl { - position: fixed; - bottom: 0; - z-index: var(--bs-offcanvas-zindex); - display: flex; - flex-direction: column; - max-width: 100%; - color: var(--bs-offcanvas-color); - visibility: hidden; - background-color: var(--bs-offcanvas-bg); - background-clip: padding-box; - outline: 0; - transition: var(--bs-offcanvas-transition); - } -} -@media (max-width: 1399.98px) and (prefers-reduced-motion: reduce) { - .offcanvas-xxl { - transition: none; - } -} -@media (max-width: 1399.98px) { - .offcanvas-xxl.offcanvas-start { - top: 0; - left: 0; - width: var(--bs-offcanvas-width); - border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(-100%); - } - .offcanvas-xxl.offcanvas-end { - top: 0; - right: 0; - width: var(--bs-offcanvas-width); - border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(100%); - } - .offcanvas-xxl.offcanvas-top { - top: 0; - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(-100%); - } - .offcanvas-xxl.offcanvas-bottom { - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(100%); - } - .offcanvas-xxl.showing, .offcanvas-xxl.show:not(.hiding) { - transform: none; - } - .offcanvas-xxl.showing, .offcanvas-xxl.hiding, .offcanvas-xxl.show { - visibility: visible; - } -} -@media (min-width: 1400px) { - .offcanvas-xxl { - --bs-offcanvas-height: auto; - --bs-offcanvas-border-width: 0; - background-color: transparent !important; - } - .offcanvas-xxl .offcanvas-header { - display: none; - } - .offcanvas-xxl .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; - background-color: transparent !important; - } -} - -.offcanvas { - position: fixed; - bottom: 0; - z-index: var(--bs-offcanvas-zindex); - display: flex; - flex-direction: column; - max-width: 100%; - color: var(--bs-offcanvas-color); - visibility: hidden; - background-color: var(--bs-offcanvas-bg); - background-clip: padding-box; - outline: 0; - transition: var(--bs-offcanvas-transition); -} -@media (prefers-reduced-motion: reduce) { - .offcanvas { - transition: none; - } -} -.offcanvas.offcanvas-start { - top: 0; - left: 0; - width: var(--bs-offcanvas-width); - border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(-100%); -} -.offcanvas.offcanvas-end { - top: 0; - right: 0; - width: var(--bs-offcanvas-width); - border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(100%); -} -.offcanvas.offcanvas-top { - top: 0; - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(-100%); -} -.offcanvas.offcanvas-bottom { - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(100%); -} -.offcanvas.showing, .offcanvas.show:not(.hiding) { - transform: none; -} -.offcanvas.showing, .offcanvas.hiding, .offcanvas.show { - visibility: visible; -} - -.offcanvas-backdrop { - position: fixed; - top: 0; - left: 0; - z-index: 1040; - width: 100vw; - height: 100vh; - background-color: #000; -} -.offcanvas-backdrop.fade { - opacity: 0; -} -.offcanvas-backdrop.show { - opacity: 0.5; -} - -.offcanvas-header { - display: flex; - align-items: center; - padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x); -} -.offcanvas-header .btn-close { - padding: calc(var(--bs-offcanvas-padding-y) * 0.5) calc(var(--bs-offcanvas-padding-x) * 0.5); - margin-top: calc(-0.5 * var(--bs-offcanvas-padding-y)); - margin-right: calc(-0.5 * var(--bs-offcanvas-padding-x)); - margin-bottom: calc(-0.5 * var(--bs-offcanvas-padding-y)); - margin-left: auto; -} - -.offcanvas-title { - margin-bottom: 0; - line-height: var(--bs-offcanvas-title-line-height); -} - -.offcanvas-body { - flex-grow: 1; - padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x); - overflow-y: auto; -} - -.placeholder { - display: inline-block; - min-height: 1em; - vertical-align: middle; - cursor: wait; - background-color: currentcolor; - opacity: 0.5; -} -.placeholder.btn::before { - display: inline-block; - content: ""; -} - -.placeholder-xs { - min-height: 0.6em; -} - -.placeholder-sm { - min-height: 0.8em; -} - -.placeholder-lg { - min-height: 1.2em; -} - -.placeholder-glow .placeholder { - animation: placeholder-glow 2s ease-in-out infinite; -} - -@keyframes placeholder-glow { - 50% { - opacity: 0.2; - } -} -.placeholder-wave { - mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%); - mask-size: 200% 100%; - animation: placeholder-wave 2s linear infinite; -} - -@keyframes placeholder-wave { - 100% { - mask-position: -200% 0%; - } -} -.clearfix::after { - display: block; - clear: both; - content: ""; -} - -.text-bg-primary { - color: #fff !important; - background-color: RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important; -} - -.text-bg-secondary { - color: #fff !important; - background-color: RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important; -} - -.text-bg-success { - color: #fff !important; - background-color: RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important; -} - -.text-bg-info { - color: #000 !important; - background-color: RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important; -} - -.text-bg-warning { - color: #000 !important; - background-color: RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important; -} - -.text-bg-danger { - color: #fff !important; - background-color: RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important; -} - -.text-bg-light { - color: #000 !important; - background-color: RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important; -} - -.text-bg-dark { - color: #fff !important; - background-color: RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important; -} - -.link-primary { - color: RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important; -} -.link-primary:hover, .link-primary:focus { - color: RGBA(10, 88, 202, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important; -} - -.link-secondary { - color: RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important; -} -.link-secondary:hover, .link-secondary:focus { - color: RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important; -} - -.link-success { - color: RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important; -} -.link-success:hover, .link-success:focus { - color: RGBA(20, 108, 67, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important; -} - -.link-info { - color: RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important; -} -.link-info:hover, .link-info:focus { - color: RGBA(61, 213, 243, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important; -} - -.link-warning { - color: RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important; -} -.link-warning:hover, .link-warning:focus { - color: RGBA(255, 205, 57, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important; -} - -.link-danger { - color: RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important; -} -.link-danger:hover, .link-danger:focus { - color: RGBA(176, 42, 55, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important; -} - -.link-light { - color: RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important; -} -.link-light:hover, .link-light:focus { - color: RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important; -} - -.link-dark { - color: RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important; -} -.link-dark:hover, .link-dark:focus { - color: RGBA(26, 30, 33, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important; -} - -.link-body-emphasis { - color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important; -} -.link-body-emphasis:hover, .link-body-emphasis:focus { - color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important; - text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important; -} - -.focus-ring:focus { - outline: 0; - box-shadow: var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color); -} - -.icon-link { - display: inline-flex; - gap: 0.375rem; - align-items: center; - text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5)); - text-underline-offset: 0.25em; - backface-visibility: hidden; -} -.icon-link > .bi { - flex-shrink: 0; - width: 1em; - height: 1em; - fill: currentcolor; - transition: 0.2s ease-in-out transform; -} -@media (prefers-reduced-motion: reduce) { - .icon-link > .bi { - transition: none; - } -} - -.icon-link-hover:hover > .bi, .icon-link-hover:focus-visible > .bi { - transform: var(--bs-icon-link-transform, translate3d(0.25em, 0, 0)); -} - -.ratio { - position: relative; - width: 100%; -} -.ratio::before { - display: block; - padding-top: var(--bs-aspect-ratio); - content: ""; -} -.ratio > * { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; -} - -.ratio-1x1 { - --bs-aspect-ratio: 100%; -} - -.ratio-4x3 { - --bs-aspect-ratio: 75%; -} - -.ratio-16x9 { - --bs-aspect-ratio: 56.25%; -} - -.ratio-21x9 { - --bs-aspect-ratio: 42.8571428571%; -} - -.fixed-top { - position: fixed; - top: 0; - right: 0; - left: 0; - z-index: 1030; -} - -.fixed-bottom { - position: fixed; - right: 0; - bottom: 0; - left: 0; - z-index: 1030; -} - -.sticky-top { - position: sticky; - top: 0; - z-index: 1020; -} - -.sticky-bottom { - position: sticky; - bottom: 0; - z-index: 1020; -} - -@media (min-width: 576px) { - .sticky-sm-top { - position: sticky; - top: 0; - z-index: 1020; - } - .sticky-sm-bottom { - position: sticky; - bottom: 0; - z-index: 1020; - } -} -@media (min-width: 768px) { - .sticky-md-top { - position: sticky; - top: 0; - z-index: 1020; - } - .sticky-md-bottom { - position: sticky; - bottom: 0; - z-index: 1020; - } -} -@media (min-width: 992px) { - .sticky-lg-top { - position: sticky; - top: 0; - z-index: 1020; - } - .sticky-lg-bottom { - position: sticky; - bottom: 0; - z-index: 1020; - } -} -@media (min-width: 1200px) { - .sticky-xl-top { - position: sticky; - top: 0; - z-index: 1020; - } - .sticky-xl-bottom { - position: sticky; - bottom: 0; - z-index: 1020; - } -} -@media (min-width: 1400px) { - .sticky-xxl-top { - position: sticky; - top: 0; - z-index: 1020; - } - .sticky-xxl-bottom { - position: sticky; - bottom: 0; - z-index: 1020; - } -} -.hstack { - display: flex; - flex-direction: row; - align-items: center; - align-self: stretch; -} - -.vstack { - display: flex; - flex: 1 1 auto; - flex-direction: column; - align-self: stretch; -} - -.visually-hidden, -.visually-hidden-focusable:not(:focus):not(:focus-within) { - width: 1px !important; - height: 1px !important; - padding: 0 !important; - margin: -1px !important; - overflow: hidden !important; - clip: rect(0, 0, 0, 0) !important; - white-space: nowrap !important; - border: 0 !important; -} -.visually-hidden:not(caption), -.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption) { - position: absolute !important; -} -.visually-hidden *, -.visually-hidden-focusable:not(:focus):not(:focus-within) * { - overflow: hidden !important; -} - -.stretched-link::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1; - content: ""; -} - -.text-truncate { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.vr { - display: inline-block; - align-self: stretch; - width: var(--bs-border-width); - min-height: 1em; - background-color: currentcolor; - opacity: 0.25; -} - -.align-baseline { - vertical-align: baseline !important; -} - -.align-top { - vertical-align: top !important; -} - -.align-middle { - vertical-align: middle !important; -} - -.align-bottom { - vertical-align: bottom !important; -} - -.align-text-bottom { - vertical-align: text-bottom !important; -} - -.align-text-top { - vertical-align: text-top !important; -} - -.float-start { - float: left !important; -} - -.float-end { - float: right !important; -} - -.float-none { - float: none !important; -} - -.object-fit-contain { - object-fit: contain !important; -} - -.object-fit-cover { - object-fit: cover !important; -} - -.object-fit-fill { - object-fit: fill !important; -} - -.object-fit-scale { - object-fit: scale-down !important; -} - -.object-fit-none { - object-fit: none !important; -} - -.opacity-0 { - opacity: 0 !important; -} - -.opacity-25 { - opacity: 0.25 !important; -} - -.opacity-50 { - opacity: 0.5 !important; -} - -.opacity-75 { - opacity: 0.75 !important; -} - -.opacity-100 { - opacity: 1 !important; -} - -.overflow-auto { - overflow: auto !important; -} - -.overflow-hidden { - overflow: hidden !important; -} - -.overflow-visible { - overflow: visible !important; -} - -.overflow-scroll { - overflow: scroll !important; -} - -.overflow-x-auto { - overflow-x: auto !important; -} - -.overflow-x-hidden { - overflow-x: hidden !important; -} - -.overflow-x-visible { - overflow-x: visible !important; -} - -.overflow-x-scroll { - overflow-x: scroll !important; -} - -.overflow-y-auto { - overflow-y: auto !important; -} - -.overflow-y-hidden { - overflow-y: hidden !important; -} - -.overflow-y-visible { - overflow-y: visible !important; -} - -.overflow-y-scroll { - overflow-y: scroll !important; -} - -.d-inline { - display: inline !important; -} - -.d-inline-block { - display: inline-block !important; -} - -.d-block { - display: block !important; -} - -.d-grid { - display: grid !important; -} - -.d-inline-grid { - display: inline-grid !important; -} - -.d-table { - display: table !important; -} - -.d-table-row { - display: table-row !important; -} - -.d-table-cell { - display: table-cell !important; -} - -.d-flex { - display: flex !important; -} - -.d-inline-flex { - display: inline-flex !important; -} - -.d-none { - display: none !important; -} - -.shadow { - box-shadow: var(--bs-box-shadow) !important; -} - -.shadow-sm { - box-shadow: var(--bs-box-shadow-sm) !important; -} - -.shadow-lg { - box-shadow: var(--bs-box-shadow-lg) !important; -} - -.shadow-none { - box-shadow: none !important; -} - -.focus-ring-primary { - --bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity)); -} - -.focus-ring-secondary { - --bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity)); -} - -.focus-ring-success { - --bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity)); -} - -.focus-ring-info { - --bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity)); -} - -.focus-ring-warning { - --bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity)); -} - -.focus-ring-danger { - --bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity)); -} - -.focus-ring-light { - --bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity)); -} - -.focus-ring-dark { - --bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity)); -} - -.position-static { - position: static !important; -} - -.position-relative { - position: relative !important; -} - -.position-absolute { - position: absolute !important; -} - -.position-fixed { - position: fixed !important; -} - -.position-sticky { - position: sticky !important; -} - -.top-0 { - top: 0 !important; -} - -.top-50 { - top: 50% !important; -} - -.top-100 { - top: 100% !important; -} - -.bottom-0 { - bottom: 0 !important; -} - -.bottom-50 { - bottom: 50% !important; -} - -.bottom-100 { - bottom: 100% !important; -} - -.start-0 { - left: 0 !important; -} - -.start-50 { - left: 50% !important; -} - -.start-100 { - left: 100% !important; -} - -.end-0 { - right: 0 !important; -} - -.end-50 { - right: 50% !important; -} - -.end-100 { - right: 100% !important; -} - -.translate-middle { - transform: translate(-50%, -50%) !important; -} - -.translate-middle-x { - transform: translateX(-50%) !important; -} - -.translate-middle-y { - transform: translateY(-50%) !important; -} - -.border { - border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; -} - -.border-0 { - border: 0 !important; -} - -.border-top { - border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; -} - -.border-top-0 { - border-top: 0 !important; -} - -.border-end { - border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; -} - -.border-end-0 { - border-right: 0 !important; -} - -.border-bottom { - border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; -} - -.border-bottom-0 { - border-bottom: 0 !important; -} - -.border-start { - border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; -} - -.border-start-0 { - border-left: 0 !important; -} - -.border-primary { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important; -} - -.border-secondary { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important; -} - -.border-success { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important; -} - -.border-info { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important; -} - -.border-warning { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important; -} - -.border-danger { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important; -} - -.border-light { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important; -} - -.border-dark { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important; -} - -.border-black { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important; -} - -.border-white { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important; -} - -.border-primary-subtle { - border-color: var(--bs-primary-border-subtle) !important; -} - -.border-secondary-subtle { - border-color: var(--bs-secondary-border-subtle) !important; -} - -.border-success-subtle { - border-color: var(--bs-success-border-subtle) !important; -} - -.border-info-subtle { - border-color: var(--bs-info-border-subtle) !important; -} - -.border-warning-subtle { - border-color: var(--bs-warning-border-subtle) !important; -} - -.border-danger-subtle { - border-color: var(--bs-danger-border-subtle) !important; -} - -.border-light-subtle { - border-color: var(--bs-light-border-subtle) !important; -} - -.border-dark-subtle { - border-color: var(--bs-dark-border-subtle) !important; -} - -.border-1 { - border-width: 1px !important; -} - -.border-2 { - border-width: 2px !important; -} - -.border-3 { - border-width: 3px !important; -} - -.border-4 { - border-width: 4px !important; -} - -.border-5 { - border-width: 5px !important; -} - -.border-opacity-10 { - --bs-border-opacity: 0.1; -} - -.border-opacity-25 { - --bs-border-opacity: 0.25; -} - -.border-opacity-50 { - --bs-border-opacity: 0.5; -} - -.border-opacity-75 { - --bs-border-opacity: 0.75; -} - -.border-opacity-100 { - --bs-border-opacity: 1; -} - -.w-25 { - width: 25% !important; -} - -.w-50 { - width: 50% !important; -} - -.w-75 { - width: 75% !important; -} - -.w-100 { - width: 100% !important; -} - -.w-auto { - width: auto !important; -} - -.mw-100 { - max-width: 100% !important; -} - -.vw-100 { - width: 100vw !important; -} - -.min-vw-100 { - min-width: 100vw !important; -} - -.h-25 { - height: 25% !important; -} - -.h-50 { - height: 50% !important; -} - -.h-75 { - height: 75% !important; -} - -.h-100 { - height: 100% !important; -} - -.h-auto { - height: auto !important; -} - -.mh-100 { - max-height: 100% !important; -} - -.vh-100 { - height: 100vh !important; -} - -.min-vh-100 { - min-height: 100vh !important; -} - -.flex-fill { - flex: 1 1 auto !important; -} - -.flex-row { - flex-direction: row !important; -} - -.flex-column { - flex-direction: column !important; -} - -.flex-row-reverse { - flex-direction: row-reverse !important; -} - -.flex-column-reverse { - flex-direction: column-reverse !important; -} - -.flex-grow-0 { - flex-grow: 0 !important; -} - -.flex-grow-1 { - flex-grow: 1 !important; -} - -.flex-shrink-0 { - flex-shrink: 0 !important; -} - -.flex-shrink-1 { - flex-shrink: 1 !important; -} - -.flex-wrap { - flex-wrap: wrap !important; -} - -.flex-nowrap { - flex-wrap: nowrap !important; -} - -.flex-wrap-reverse { - flex-wrap: wrap-reverse !important; -} - -.justify-content-start { - justify-content: flex-start !important; -} - -.justify-content-end { - justify-content: flex-end !important; -} - -.justify-content-center { - justify-content: center !important; -} - -.justify-content-between { - justify-content: space-between !important; -} - -.justify-content-around { - justify-content: space-around !important; -} - -.justify-content-evenly { - justify-content: space-evenly !important; -} - -.align-items-start { - align-items: flex-start !important; -} - -.align-items-end { - align-items: flex-end !important; -} - -.align-items-center { - align-items: center !important; -} - -.align-items-baseline { - align-items: baseline !important; -} - -.align-items-stretch { - align-items: stretch !important; -} - -.align-content-start { - align-content: flex-start !important; -} - -.align-content-end { - align-content: flex-end !important; -} - -.align-content-center { - align-content: center !important; -} - -.align-content-between { - align-content: space-between !important; -} - -.align-content-around { - align-content: space-around !important; -} - -.align-content-stretch { - align-content: stretch !important; -} - -.align-self-auto { - align-self: auto !important; -} - -.align-self-start { - align-self: flex-start !important; -} - -.align-self-end { - align-self: flex-end !important; -} - -.align-self-center { - align-self: center !important; -} - -.align-self-baseline { - align-self: baseline !important; -} - -.align-self-stretch { - align-self: stretch !important; -} - -.order-first { - order: -1 !important; -} - -.order-0 { - order: 0 !important; -} - -.order-1 { - order: 1 !important; -} - -.order-2 { - order: 2 !important; -} - -.order-3 { - order: 3 !important; -} - -.order-4 { - order: 4 !important; -} - -.order-5 { - order: 5 !important; -} - -.order-last { - order: 6 !important; -} - -.m-0 { - margin: 0 !important; -} - -.m-1 { - margin: 0.25rem !important; -} - -.m-2 { - margin: 0.5rem !important; -} - -.m-3 { - margin: 1rem !important; -} - -.m-4 { - margin: 1.5rem !important; -} - -.m-5 { - margin: 3rem !important; -} - -.m-auto { - margin: auto !important; -} - -.mx-0 { - margin-right: 0 !important; - margin-left: 0 !important; -} - -.mx-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; -} - -.mx-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; -} - -.mx-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; -} - -.mx-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; -} - -.mx-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; -} - -.mx-auto { - margin-right: auto !important; - margin-left: auto !important; -} - -.my-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; -} - -.my-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; -} - -.my-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; -} - -.my-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; -} - -.my-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; -} - -.my-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; -} - -.my-auto { - margin-top: auto !important; - margin-bottom: auto !important; -} - -.mt-0 { - margin-top: 0 !important; -} - -.mt-1 { - margin-top: 0.25rem !important; -} - -.mt-2 { - margin-top: 0.5rem !important; -} - -.mt-3 { - margin-top: 1rem !important; -} - -.mt-4 { - margin-top: 1.5rem !important; -} - -.mt-5 { - margin-top: 3rem !important; -} - -.mt-auto { - margin-top: auto !important; -} - -.me-0 { - margin-right: 0 !important; -} - -.me-1 { - margin-right: 0.25rem !important; -} - -.me-2 { - margin-right: 0.5rem !important; -} - -.me-3 { - margin-right: 1rem !important; -} - -.me-4 { - margin-right: 1.5rem !important; -} - -.me-5 { - margin-right: 3rem !important; -} - -.me-auto { - margin-right: auto !important; -} - -.mb-0 { - margin-bottom: 0 !important; -} - -.mb-1 { - margin-bottom: 0.25rem !important; -} - -.mb-2 { - margin-bottom: 0.5rem !important; -} - -.mb-3 { - margin-bottom: 1rem !important; -} - -.mb-4 { - margin-bottom: 1.5rem !important; -} - -.mb-5 { - margin-bottom: 3rem !important; -} - -.mb-auto { - margin-bottom: auto !important; -} - -.ms-0 { - margin-left: 0 !important; -} - -.ms-1 { - margin-left: 0.25rem !important; -} - -.ms-2 { - margin-left: 0.5rem !important; -} - -.ms-3 { - margin-left: 1rem !important; -} - -.ms-4 { - margin-left: 1.5rem !important; -} - -.ms-5 { - margin-left: 3rem !important; -} - -.ms-auto { - margin-left: auto !important; -} - -.p-0 { - padding: 0 !important; -} - -.p-1 { - padding: 0.25rem !important; -} - -.p-2 { - padding: 0.5rem !important; -} - -.p-3 { - padding: 1rem !important; -} - -.p-4 { - padding: 1.5rem !important; -} - -.p-5 { - padding: 3rem !important; -} - -.px-0 { - padding-right: 0 !important; - padding-left: 0 !important; -} - -.px-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; -} - -.px-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; -} - -.px-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; -} - -.px-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; -} - -.px-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; -} - -.py-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; -} - -.py-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; -} - -.py-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; -} - -.py-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; -} - -.py-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; -} - -.py-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; -} - -.pt-0 { - padding-top: 0 !important; -} - -.pt-1 { - padding-top: 0.25rem !important; -} - -.pt-2 { - padding-top: 0.5rem !important; -} - -.pt-3 { - padding-top: 1rem !important; -} - -.pt-4 { - padding-top: 1.5rem !important; -} - -.pt-5 { - padding-top: 3rem !important; -} - -.pe-0 { - padding-right: 0 !important; -} - -.pe-1 { - padding-right: 0.25rem !important; -} - -.pe-2 { - padding-right: 0.5rem !important; -} - -.pe-3 { - padding-right: 1rem !important; -} - -.pe-4 { - padding-right: 1.5rem !important; -} - -.pe-5 { - padding-right: 3rem !important; -} - -.pb-0 { - padding-bottom: 0 !important; -} - -.pb-1 { - padding-bottom: 0.25rem !important; -} - -.pb-2 { - padding-bottom: 0.5rem !important; -} - -.pb-3 { - padding-bottom: 1rem !important; -} - -.pb-4 { - padding-bottom: 1.5rem !important; -} - -.pb-5 { - padding-bottom: 3rem !important; -} - -.ps-0 { - padding-left: 0 !important; -} - -.ps-1 { - padding-left: 0.25rem !important; -} - -.ps-2 { - padding-left: 0.5rem !important; -} - -.ps-3 { - padding-left: 1rem !important; -} - -.ps-4 { - padding-left: 1.5rem !important; -} - -.ps-5 { - padding-left: 3rem !important; -} - -.gap-0 { - gap: 0 !important; -} - -.gap-1 { - gap: 0.25rem !important; -} - -.gap-2 { - gap: 0.5rem !important; -} - -.gap-3 { - gap: 1rem !important; -} - -.gap-4 { - gap: 1.5rem !important; -} - -.gap-5 { - gap: 3rem !important; -} - -.row-gap-0 { - row-gap: 0 !important; -} - -.row-gap-1 { - row-gap: 0.25rem !important; -} - -.row-gap-2 { - row-gap: 0.5rem !important; -} - -.row-gap-3 { - row-gap: 1rem !important; -} - -.row-gap-4 { - row-gap: 1.5rem !important; -} - -.row-gap-5 { - row-gap: 3rem !important; -} - -.column-gap-0 { - column-gap: 0 !important; -} - -.column-gap-1 { - column-gap: 0.25rem !important; -} - -.column-gap-2 { - column-gap: 0.5rem !important; -} - -.column-gap-3 { - column-gap: 1rem !important; -} - -.column-gap-4 { - column-gap: 1.5rem !important; -} - -.column-gap-5 { - column-gap: 3rem !important; -} - -.font-monospace { - font-family: var(--bs-font-monospace) !important; -} - -.fs-1 { - font-size: calc(1.375rem + 1.5vw) !important; -} - -.fs-2 { - font-size: calc(1.325rem + 0.9vw) !important; -} - -.fs-3 { - font-size: calc(1.3rem + 0.6vw) !important; -} - -.fs-4 { - font-size: calc(1.275rem + 0.3vw) !important; -} - -.fs-5 { - font-size: 1.25rem !important; -} - -.fs-6 { - font-size: 1rem !important; -} - -.fst-italic { - font-style: italic !important; -} - -.fst-normal { - font-style: normal !important; -} - -.fw-lighter { - font-weight: lighter !important; -} - -.fw-light { - font-weight: 300 !important; -} - -.fw-normal { - font-weight: 400 !important; -} - -.fw-medium { - font-weight: 500 !important; -} - -.fw-semibold { - font-weight: 600 !important; -} - -.fw-bold { - font-weight: 700 !important; -} - -.fw-bolder { - font-weight: bolder !important; -} - -.lh-1 { - line-height: 1 !important; -} - -.lh-sm { - line-height: 1.25 !important; -} - -.lh-base { - line-height: 1.5 !important; -} - -.lh-lg { - line-height: 2 !important; -} - -.text-start { - text-align: left !important; -} - -.text-end { - text-align: right !important; -} - -.text-center { - text-align: center !important; -} - -.text-decoration-none { - text-decoration: none !important; -} - -.text-decoration-underline { - text-decoration: underline !important; -} - -.text-decoration-line-through { - text-decoration: line-through !important; -} - -.text-lowercase { - text-transform: lowercase !important; -} - -.text-uppercase { - text-transform: uppercase !important; -} - -.text-capitalize { - text-transform: capitalize !important; -} - -.text-wrap { - white-space: normal !important; -} - -.text-nowrap { - white-space: nowrap !important; -} - -/* rtl:begin:remove */ -.text-break { - word-wrap: break-word !important; - word-break: break-word !important; -} - -/* rtl:end:remove */ -.text-primary { - --bs-text-opacity: 1; - color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important; -} - -.text-secondary { - --bs-text-opacity: 1; - color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important; -} - -.text-success { - --bs-text-opacity: 1; - color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important; -} - -.text-info { - --bs-text-opacity: 1; - color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important; -} - -.text-warning { - --bs-text-opacity: 1; - color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important; -} - -.text-danger { - --bs-text-opacity: 1; - color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important; -} - -.text-light { - --bs-text-opacity: 1; - color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important; -} - -.text-dark { - --bs-text-opacity: 1; - color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important; -} - -.text-black { - --bs-text-opacity: 1; - color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important; -} - -.text-white { - --bs-text-opacity: 1; - color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important; -} - -.text-body { - --bs-text-opacity: 1; - color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important; -} - -.text-muted { - --bs-text-opacity: 1; - color: var(--bs-secondary-color) !important; -} - -.text-black-50 { - --bs-text-opacity: 1; - color: rgba(0, 0, 0, 0.5) !important; -} - -.text-white-50 { - --bs-text-opacity: 1; - color: rgba(255, 255, 255, 0.5) !important; -} - -.text-body-secondary { - --bs-text-opacity: 1; - color: var(--bs-secondary-color) !important; -} - -.text-body-tertiary { - --bs-text-opacity: 1; - color: var(--bs-tertiary-color) !important; -} - -.text-body-emphasis { - --bs-text-opacity: 1; - color: var(--bs-emphasis-color) !important; -} - -.text-reset { - --bs-text-opacity: 1; - color: inherit !important; -} - -.text-opacity-25 { - --bs-text-opacity: 0.25; -} - -.text-opacity-50 { - --bs-text-opacity: 0.5; -} - -.text-opacity-75 { - --bs-text-opacity: 0.75; -} - -.text-opacity-100 { - --bs-text-opacity: 1; -} - -.text-primary-emphasis { - color: var(--bs-primary-text-emphasis) !important; -} - -.text-secondary-emphasis { - color: var(--bs-secondary-text-emphasis) !important; -} - -.text-success-emphasis { - color: var(--bs-success-text-emphasis) !important; -} - -.text-info-emphasis { - color: var(--bs-info-text-emphasis) !important; -} - -.text-warning-emphasis { - color: var(--bs-warning-text-emphasis) !important; -} - -.text-danger-emphasis { - color: var(--bs-danger-text-emphasis) !important; -} - -.text-light-emphasis { - color: var(--bs-light-text-emphasis) !important; -} - -.text-dark-emphasis { - color: var(--bs-dark-text-emphasis) !important; -} - -.link-opacity-10 { - --bs-link-opacity: 0.1; -} - -.link-opacity-10-hover:hover { - --bs-link-opacity: 0.1; -} - -.link-opacity-25 { - --bs-link-opacity: 0.25; -} - -.link-opacity-25-hover:hover { - --bs-link-opacity: 0.25; -} - -.link-opacity-50 { - --bs-link-opacity: 0.5; -} - -.link-opacity-50-hover:hover { - --bs-link-opacity: 0.5; -} - -.link-opacity-75 { - --bs-link-opacity: 0.75; -} - -.link-opacity-75-hover:hover { - --bs-link-opacity: 0.75; -} - -.link-opacity-100 { - --bs-link-opacity: 1; -} - -.link-opacity-100-hover:hover { - --bs-link-opacity: 1; -} - -.link-offset-1 { - text-underline-offset: 0.125em !important; -} - -.link-offset-1-hover:hover { - text-underline-offset: 0.125em !important; -} - -.link-offset-2 { - text-underline-offset: 0.25em !important; -} - -.link-offset-2-hover:hover { - text-underline-offset: 0.25em !important; -} - -.link-offset-3 { - text-underline-offset: 0.375em !important; -} - -.link-offset-3-hover:hover { - text-underline-offset: 0.375em !important; -} - -.link-underline-primary { - --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important; -} - -.link-underline-secondary { - --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important; -} - -.link-underline-success { - --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important; -} - -.link-underline-info { - --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important; -} - -.link-underline-warning { - --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important; -} - -.link-underline-danger { - --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important; -} - -.link-underline-light { - --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important; -} - -.link-underline-dark { - --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important; -} - -.link-underline { - --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important; -} - -.link-underline-opacity-0 { - --bs-link-underline-opacity: 0; -} - -.link-underline-opacity-0-hover:hover { - --bs-link-underline-opacity: 0; -} - -.link-underline-opacity-10 { - --bs-link-underline-opacity: 0.1; -} - -.link-underline-opacity-10-hover:hover { - --bs-link-underline-opacity: 0.1; -} - -.link-underline-opacity-25 { - --bs-link-underline-opacity: 0.25; -} - -.link-underline-opacity-25-hover:hover { - --bs-link-underline-opacity: 0.25; -} - -.link-underline-opacity-50 { - --bs-link-underline-opacity: 0.5; -} - -.link-underline-opacity-50-hover:hover { - --bs-link-underline-opacity: 0.5; -} - -.link-underline-opacity-75 { - --bs-link-underline-opacity: 0.75; -} - -.link-underline-opacity-75-hover:hover { - --bs-link-underline-opacity: 0.75; -} - -.link-underline-opacity-100 { - --bs-link-underline-opacity: 1; -} - -.link-underline-opacity-100-hover:hover { - --bs-link-underline-opacity: 1; -} - -.bg-primary { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important; -} - -.bg-secondary { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important; -} - -.bg-success { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important; -} - -.bg-info { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important; -} - -.bg-warning { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important; -} - -.bg-danger { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important; -} - -.bg-light { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important; -} - -.bg-dark { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important; -} - -.bg-black { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important; -} - -.bg-white { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important; -} - -.bg-body { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important; -} - -.bg-transparent { - --bs-bg-opacity: 1; - background-color: transparent !important; -} - -.bg-body-secondary { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important; -} - -.bg-body-tertiary { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important; -} - -.bg-opacity-10 { - --bs-bg-opacity: 0.1; -} - -.bg-opacity-25 { - --bs-bg-opacity: 0.25; -} - -.bg-opacity-50 { - --bs-bg-opacity: 0.5; -} - -.bg-opacity-75 { - --bs-bg-opacity: 0.75; -} - -.bg-opacity-100 { - --bs-bg-opacity: 1; -} - -.bg-primary-subtle { - background-color: var(--bs-primary-bg-subtle) !important; -} - -.bg-secondary-subtle { - background-color: var(--bs-secondary-bg-subtle) !important; -} - -.bg-success-subtle { - background-color: var(--bs-success-bg-subtle) !important; -} - -.bg-info-subtle { - background-color: var(--bs-info-bg-subtle) !important; -} - -.bg-warning-subtle { - background-color: var(--bs-warning-bg-subtle) !important; -} - -.bg-danger-subtle { - background-color: var(--bs-danger-bg-subtle) !important; -} - -.bg-light-subtle { - background-color: var(--bs-light-bg-subtle) !important; -} - -.bg-dark-subtle { - background-color: var(--bs-dark-bg-subtle) !important; -} - -.bg-gradient { - background-image: var(--bs-gradient) !important; -} - -.user-select-all { - user-select: all !important; -} - -.user-select-auto { - user-select: auto !important; -} - -.user-select-none { - user-select: none !important; -} - -.pe-none { - pointer-events: none !important; -} - -.pe-auto { - pointer-events: auto !important; -} - -.rounded { - border-radius: var(--bs-border-radius) !important; -} - -.rounded-0 { - border-radius: 0 !important; -} - -.rounded-1 { - border-radius: var(--bs-border-radius-sm) !important; -} - -.rounded-2 { - border-radius: var(--bs-border-radius) !important; -} - -.rounded-3 { - border-radius: var(--bs-border-radius-lg) !important; -} - -.rounded-4 { - border-radius: var(--bs-border-radius-xl) !important; -} - -.rounded-5 { - border-radius: var(--bs-border-radius-xxl) !important; -} - -.rounded-circle { - border-radius: 50% !important; -} - -.rounded-pill { - border-radius: var(--bs-border-radius-pill) !important; -} - -.rounded-top { - border-top-left-radius: var(--bs-border-radius) !important; - border-top-right-radius: var(--bs-border-radius) !important; -} - -.rounded-top-0 { - border-top-left-radius: 0 !important; - border-top-right-radius: 0 !important; -} - -.rounded-top-1 { - border-top-left-radius: var(--bs-border-radius-sm) !important; - border-top-right-radius: var(--bs-border-radius-sm) !important; -} - -.rounded-top-2 { - border-top-left-radius: var(--bs-border-radius) !important; - border-top-right-radius: var(--bs-border-radius) !important; -} - -.rounded-top-3 { - border-top-left-radius: var(--bs-border-radius-lg) !important; - border-top-right-radius: var(--bs-border-radius-lg) !important; -} - -.rounded-top-4 { - border-top-left-radius: var(--bs-border-radius-xl) !important; - border-top-right-radius: var(--bs-border-radius-xl) !important; -} - -.rounded-top-5 { - border-top-left-radius: var(--bs-border-radius-xxl) !important; - border-top-right-radius: var(--bs-border-radius-xxl) !important; -} - -.rounded-top-circle { - border-top-left-radius: 50% !important; - border-top-right-radius: 50% !important; -} - -.rounded-top-pill { - border-top-left-radius: var(--bs-border-radius-pill) !important; - border-top-right-radius: var(--bs-border-radius-pill) !important; -} - -.rounded-end { - border-top-right-radius: var(--bs-border-radius) !important; - border-bottom-right-radius: var(--bs-border-radius) !important; -} - -.rounded-end-0 { - border-top-right-radius: 0 !important; - border-bottom-right-radius: 0 !important; -} - -.rounded-end-1 { - border-top-right-radius: var(--bs-border-radius-sm) !important; - border-bottom-right-radius: var(--bs-border-radius-sm) !important; -} - -.rounded-end-2 { - border-top-right-radius: var(--bs-border-radius) !important; - border-bottom-right-radius: var(--bs-border-radius) !important; -} - -.rounded-end-3 { - border-top-right-radius: var(--bs-border-radius-lg) !important; - border-bottom-right-radius: var(--bs-border-radius-lg) !important; -} - -.rounded-end-4 { - border-top-right-radius: var(--bs-border-radius-xl) !important; - border-bottom-right-radius: var(--bs-border-radius-xl) !important; -} - -.rounded-end-5 { - border-top-right-radius: var(--bs-border-radius-xxl) !important; - border-bottom-right-radius: var(--bs-border-radius-xxl) !important; -} - -.rounded-end-circle { - border-top-right-radius: 50% !important; - border-bottom-right-radius: 50% !important; -} - -.rounded-end-pill { - border-top-right-radius: var(--bs-border-radius-pill) !important; - border-bottom-right-radius: var(--bs-border-radius-pill) !important; -} - -.rounded-bottom { - border-bottom-right-radius: var(--bs-border-radius) !important; - border-bottom-left-radius: var(--bs-border-radius) !important; -} - -.rounded-bottom-0 { - border-bottom-right-radius: 0 !important; - border-bottom-left-radius: 0 !important; -} - -.rounded-bottom-1 { - border-bottom-right-radius: var(--bs-border-radius-sm) !important; - border-bottom-left-radius: var(--bs-border-radius-sm) !important; -} - -.rounded-bottom-2 { - border-bottom-right-radius: var(--bs-border-radius) !important; - border-bottom-left-radius: var(--bs-border-radius) !important; -} - -.rounded-bottom-3 { - border-bottom-right-radius: var(--bs-border-radius-lg) !important; - border-bottom-left-radius: var(--bs-border-radius-lg) !important; -} - -.rounded-bottom-4 { - border-bottom-right-radius: var(--bs-border-radius-xl) !important; - border-bottom-left-radius: var(--bs-border-radius-xl) !important; -} - -.rounded-bottom-5 { - border-bottom-right-radius: var(--bs-border-radius-xxl) !important; - border-bottom-left-radius: var(--bs-border-radius-xxl) !important; -} - -.rounded-bottom-circle { - border-bottom-right-radius: 50% !important; - border-bottom-left-radius: 50% !important; -} - -.rounded-bottom-pill { - border-bottom-right-radius: var(--bs-border-radius-pill) !important; - border-bottom-left-radius: var(--bs-border-radius-pill) !important; -} - -.rounded-start { - border-bottom-left-radius: var(--bs-border-radius) !important; - border-top-left-radius: var(--bs-border-radius) !important; -} - -.rounded-start-0 { - border-bottom-left-radius: 0 !important; - border-top-left-radius: 0 !important; -} - -.rounded-start-1 { - border-bottom-left-radius: var(--bs-border-radius-sm) !important; - border-top-left-radius: var(--bs-border-radius-sm) !important; -} - -.rounded-start-2 { - border-bottom-left-radius: var(--bs-border-radius) !important; - border-top-left-radius: var(--bs-border-radius) !important; -} - -.rounded-start-3 { - border-bottom-left-radius: var(--bs-border-radius-lg) !important; - border-top-left-radius: var(--bs-border-radius-lg) !important; -} - -.rounded-start-4 { - border-bottom-left-radius: var(--bs-border-radius-xl) !important; - border-top-left-radius: var(--bs-border-radius-xl) !important; -} - -.rounded-start-5 { - border-bottom-left-radius: var(--bs-border-radius-xxl) !important; - border-top-left-radius: var(--bs-border-radius-xxl) !important; -} - -.rounded-start-circle { - border-bottom-left-radius: 50% !important; - border-top-left-radius: 50% !important; -} - -.rounded-start-pill { - border-bottom-left-radius: var(--bs-border-radius-pill) !important; - border-top-left-radius: var(--bs-border-radius-pill) !important; -} - -.visible { - visibility: visible !important; -} - -.invisible { - visibility: hidden !important; -} - -.z-n1 { - z-index: -1 !important; -} - -.z-0 { - z-index: 0 !important; -} - -.z-1 { - z-index: 1 !important; -} - -.z-2 { - z-index: 2 !important; -} - -.z-3 { - z-index: 3 !important; -} - -@media (min-width: 576px) { - .float-sm-start { - float: left !important; - } - .float-sm-end { - float: right !important; - } - .float-sm-none { - float: none !important; - } - .object-fit-sm-contain { - object-fit: contain !important; - } - .object-fit-sm-cover { - object-fit: cover !important; - } - .object-fit-sm-fill { - object-fit: fill !important; - } - .object-fit-sm-scale { - object-fit: scale-down !important; - } - .object-fit-sm-none { - object-fit: none !important; - } - .d-sm-inline { - display: inline !important; - } - .d-sm-inline-block { - display: inline-block !important; - } - .d-sm-block { - display: block !important; - } - .d-sm-grid { - display: grid !important; - } - .d-sm-inline-grid { - display: inline-grid !important; - } - .d-sm-table { - display: table !important; - } - .d-sm-table-row { - display: table-row !important; - } - .d-sm-table-cell { - display: table-cell !important; - } - .d-sm-flex { - display: flex !important; - } - .d-sm-inline-flex { - display: inline-flex !important; - } - .d-sm-none { - display: none !important; - } - .flex-sm-fill { - flex: 1 1 auto !important; - } - .flex-sm-row { - flex-direction: row !important; - } - .flex-sm-column { - flex-direction: column !important; - } - .flex-sm-row-reverse { - flex-direction: row-reverse !important; - } - .flex-sm-column-reverse { - flex-direction: column-reverse !important; - } - .flex-sm-grow-0 { - flex-grow: 0 !important; - } - .flex-sm-grow-1 { - flex-grow: 1 !important; - } - .flex-sm-shrink-0 { - flex-shrink: 0 !important; - } - .flex-sm-shrink-1 { - flex-shrink: 1 !important; - } - .flex-sm-wrap { - flex-wrap: wrap !important; - } - .flex-sm-nowrap { - flex-wrap: nowrap !important; - } - .flex-sm-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .justify-content-sm-start { - justify-content: flex-start !important; - } - .justify-content-sm-end { - justify-content: flex-end !important; - } - .justify-content-sm-center { - justify-content: center !important; - } - .justify-content-sm-between { - justify-content: space-between !important; - } - .justify-content-sm-around { - justify-content: space-around !important; - } - .justify-content-sm-evenly { - justify-content: space-evenly !important; - } - .align-items-sm-start { - align-items: flex-start !important; - } - .align-items-sm-end { - align-items: flex-end !important; - } - .align-items-sm-center { - align-items: center !important; - } - .align-items-sm-baseline { - align-items: baseline !important; - } - .align-items-sm-stretch { - align-items: stretch !important; - } - .align-content-sm-start { - align-content: flex-start !important; - } - .align-content-sm-end { - align-content: flex-end !important; - } - .align-content-sm-center { - align-content: center !important; - } - .align-content-sm-between { - align-content: space-between !important; - } - .align-content-sm-around { - align-content: space-around !important; - } - .align-content-sm-stretch { - align-content: stretch !important; - } - .align-self-sm-auto { - align-self: auto !important; - } - .align-self-sm-start { - align-self: flex-start !important; - } - .align-self-sm-end { - align-self: flex-end !important; - } - .align-self-sm-center { - align-self: center !important; - } - .align-self-sm-baseline { - align-self: baseline !important; - } - .align-self-sm-stretch { - align-self: stretch !important; - } - .order-sm-first { - order: -1 !important; - } - .order-sm-0 { - order: 0 !important; - } - .order-sm-1 { - order: 1 !important; - } - .order-sm-2 { - order: 2 !important; - } - .order-sm-3 { - order: 3 !important; - } - .order-sm-4 { - order: 4 !important; - } - .order-sm-5 { - order: 5 !important; - } - .order-sm-last { - order: 6 !important; - } - .m-sm-0 { - margin: 0 !important; - } - .m-sm-1 { - margin: 0.25rem !important; - } - .m-sm-2 { - margin: 0.5rem !important; - } - .m-sm-3 { - margin: 1rem !important; - } - .m-sm-4 { - margin: 1.5rem !important; - } - .m-sm-5 { - margin: 3rem !important; - } - .m-sm-auto { - margin: auto !important; - } - .mx-sm-0 { - margin-right: 0 !important; - margin-left: 0 !important; - } - .mx-sm-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; - } - .mx-sm-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; - } - .mx-sm-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; - } - .mx-sm-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; - } - .mx-sm-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; - } - .mx-sm-auto { - margin-right: auto !important; - margin-left: auto !important; - } - .my-sm-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .my-sm-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .my-sm-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .my-sm-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .my-sm-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .my-sm-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .my-sm-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - .mt-sm-0 { - margin-top: 0 !important; - } - .mt-sm-1 { - margin-top: 0.25rem !important; - } - .mt-sm-2 { - margin-top: 0.5rem !important; - } - .mt-sm-3 { - margin-top: 1rem !important; - } - .mt-sm-4 { - margin-top: 1.5rem !important; - } - .mt-sm-5 { - margin-top: 3rem !important; - } - .mt-sm-auto { - margin-top: auto !important; - } - .me-sm-0 { - margin-right: 0 !important; - } - .me-sm-1 { - margin-right: 0.25rem !important; - } - .me-sm-2 { - margin-right: 0.5rem !important; - } - .me-sm-3 { - margin-right: 1rem !important; - } - .me-sm-4 { - margin-right: 1.5rem !important; - } - .me-sm-5 { - margin-right: 3rem !important; - } - .me-sm-auto { - margin-right: auto !important; - } - .mb-sm-0 { - margin-bottom: 0 !important; - } - .mb-sm-1 { - margin-bottom: 0.25rem !important; - } - .mb-sm-2 { - margin-bottom: 0.5rem !important; - } - .mb-sm-3 { - margin-bottom: 1rem !important; - } - .mb-sm-4 { - margin-bottom: 1.5rem !important; - } - .mb-sm-5 { - margin-bottom: 3rem !important; - } - .mb-sm-auto { - margin-bottom: auto !important; - } - .ms-sm-0 { - margin-left: 0 !important; - } - .ms-sm-1 { - margin-left: 0.25rem !important; - } - .ms-sm-2 { - margin-left: 0.5rem !important; - } - .ms-sm-3 { - margin-left: 1rem !important; - } - .ms-sm-4 { - margin-left: 1.5rem !important; - } - .ms-sm-5 { - margin-left: 3rem !important; - } - .ms-sm-auto { - margin-left: auto !important; - } - .p-sm-0 { - padding: 0 !important; - } - .p-sm-1 { - padding: 0.25rem !important; - } - .p-sm-2 { - padding: 0.5rem !important; - } - .p-sm-3 { - padding: 1rem !important; - } - .p-sm-4 { - padding: 1.5rem !important; - } - .p-sm-5 { - padding: 3rem !important; - } - .px-sm-0 { - padding-right: 0 !important; - padding-left: 0 !important; - } - .px-sm-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; - } - .px-sm-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; - } - .px-sm-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; - } - .px-sm-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; - } - .px-sm-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; - } - .py-sm-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .py-sm-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .py-sm-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .py-sm-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .py-sm-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .py-sm-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .pt-sm-0 { - padding-top: 0 !important; - } - .pt-sm-1 { - padding-top: 0.25rem !important; - } - .pt-sm-2 { - padding-top: 0.5rem !important; - } - .pt-sm-3 { - padding-top: 1rem !important; - } - .pt-sm-4 { - padding-top: 1.5rem !important; - } - .pt-sm-5 { - padding-top: 3rem !important; - } - .pe-sm-0 { - padding-right: 0 !important; - } - .pe-sm-1 { - padding-right: 0.25rem !important; - } - .pe-sm-2 { - padding-right: 0.5rem !important; - } - .pe-sm-3 { - padding-right: 1rem !important; - } - .pe-sm-4 { - padding-right: 1.5rem !important; - } - .pe-sm-5 { - padding-right: 3rem !important; - } - .pb-sm-0 { - padding-bottom: 0 !important; - } - .pb-sm-1 { - padding-bottom: 0.25rem !important; - } - .pb-sm-2 { - padding-bottom: 0.5rem !important; - } - .pb-sm-3 { - padding-bottom: 1rem !important; - } - .pb-sm-4 { - padding-bottom: 1.5rem !important; - } - .pb-sm-5 { - padding-bottom: 3rem !important; - } - .ps-sm-0 { - padding-left: 0 !important; - } - .ps-sm-1 { - padding-left: 0.25rem !important; - } - .ps-sm-2 { - padding-left: 0.5rem !important; - } - .ps-sm-3 { - padding-left: 1rem !important; - } - .ps-sm-4 { - padding-left: 1.5rem !important; - } - .ps-sm-5 { - padding-left: 3rem !important; - } - .gap-sm-0 { - gap: 0 !important; - } - .gap-sm-1 { - gap: 0.25rem !important; - } - .gap-sm-2 { - gap: 0.5rem !important; - } - .gap-sm-3 { - gap: 1rem !important; - } - .gap-sm-4 { - gap: 1.5rem !important; - } - .gap-sm-5 { - gap: 3rem !important; - } - .row-gap-sm-0 { - row-gap: 0 !important; - } - .row-gap-sm-1 { - row-gap: 0.25rem !important; - } - .row-gap-sm-2 { - row-gap: 0.5rem !important; - } - .row-gap-sm-3 { - row-gap: 1rem !important; - } - .row-gap-sm-4 { - row-gap: 1.5rem !important; - } - .row-gap-sm-5 { - row-gap: 3rem !important; - } - .column-gap-sm-0 { - column-gap: 0 !important; - } - .column-gap-sm-1 { - column-gap: 0.25rem !important; - } - .column-gap-sm-2 { - column-gap: 0.5rem !important; - } - .column-gap-sm-3 { - column-gap: 1rem !important; - } - .column-gap-sm-4 { - column-gap: 1.5rem !important; - } - .column-gap-sm-5 { - column-gap: 3rem !important; - } - .text-sm-start { - text-align: left !important; - } - .text-sm-end { - text-align: right !important; - } - .text-sm-center { - text-align: center !important; - } -} -@media (min-width: 768px) { - .float-md-start { - float: left !important; - } - .float-md-end { - float: right !important; - } - .float-md-none { - float: none !important; - } - .object-fit-md-contain { - object-fit: contain !important; - } - .object-fit-md-cover { - object-fit: cover !important; - } - .object-fit-md-fill { - object-fit: fill !important; - } - .object-fit-md-scale { - object-fit: scale-down !important; - } - .object-fit-md-none { - object-fit: none !important; - } - .d-md-inline { - display: inline !important; - } - .d-md-inline-block { - display: inline-block !important; - } - .d-md-block { - display: block !important; - } - .d-md-grid { - display: grid !important; - } - .d-md-inline-grid { - display: inline-grid !important; - } - .d-md-table { - display: table !important; - } - .d-md-table-row { - display: table-row !important; - } - .d-md-table-cell { - display: table-cell !important; - } - .d-md-flex { - display: flex !important; - } - .d-md-inline-flex { - display: inline-flex !important; - } - .d-md-none { - display: none !important; - } - .flex-md-fill { - flex: 1 1 auto !important; - } - .flex-md-row { - flex-direction: row !important; - } - .flex-md-column { - flex-direction: column !important; - } - .flex-md-row-reverse { - flex-direction: row-reverse !important; - } - .flex-md-column-reverse { - flex-direction: column-reverse !important; - } - .flex-md-grow-0 { - flex-grow: 0 !important; - } - .flex-md-grow-1 { - flex-grow: 1 !important; - } - .flex-md-shrink-0 { - flex-shrink: 0 !important; - } - .flex-md-shrink-1 { - flex-shrink: 1 !important; - } - .flex-md-wrap { - flex-wrap: wrap !important; - } - .flex-md-nowrap { - flex-wrap: nowrap !important; - } - .flex-md-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .justify-content-md-start { - justify-content: flex-start !important; - } - .justify-content-md-end { - justify-content: flex-end !important; - } - .justify-content-md-center { - justify-content: center !important; - } - .justify-content-md-between { - justify-content: space-between !important; - } - .justify-content-md-around { - justify-content: space-around !important; - } - .justify-content-md-evenly { - justify-content: space-evenly !important; - } - .align-items-md-start { - align-items: flex-start !important; - } - .align-items-md-end { - align-items: flex-end !important; - } - .align-items-md-center { - align-items: center !important; - } - .align-items-md-baseline { - align-items: baseline !important; - } - .align-items-md-stretch { - align-items: stretch !important; - } - .align-content-md-start { - align-content: flex-start !important; - } - .align-content-md-end { - align-content: flex-end !important; - } - .align-content-md-center { - align-content: center !important; - } - .align-content-md-between { - align-content: space-between !important; - } - .align-content-md-around { - align-content: space-around !important; - } - .align-content-md-stretch { - align-content: stretch !important; - } - .align-self-md-auto { - align-self: auto !important; - } - .align-self-md-start { - align-self: flex-start !important; - } - .align-self-md-end { - align-self: flex-end !important; - } - .align-self-md-center { - align-self: center !important; - } - .align-self-md-baseline { - align-self: baseline !important; - } - .align-self-md-stretch { - align-self: stretch !important; - } - .order-md-first { - order: -1 !important; - } - .order-md-0 { - order: 0 !important; - } - .order-md-1 { - order: 1 !important; - } - .order-md-2 { - order: 2 !important; - } - .order-md-3 { - order: 3 !important; - } - .order-md-4 { - order: 4 !important; - } - .order-md-5 { - order: 5 !important; - } - .order-md-last { - order: 6 !important; - } - .m-md-0 { - margin: 0 !important; - } - .m-md-1 { - margin: 0.25rem !important; - } - .m-md-2 { - margin: 0.5rem !important; - } - .m-md-3 { - margin: 1rem !important; - } - .m-md-4 { - margin: 1.5rem !important; - } - .m-md-5 { - margin: 3rem !important; - } - .m-md-auto { - margin: auto !important; - } - .mx-md-0 { - margin-right: 0 !important; - margin-left: 0 !important; - } - .mx-md-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; - } - .mx-md-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; - } - .mx-md-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; - } - .mx-md-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; - } - .mx-md-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; - } - .mx-md-auto { - margin-right: auto !important; - margin-left: auto !important; - } - .my-md-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .my-md-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .my-md-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .my-md-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .my-md-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .my-md-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .my-md-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - .mt-md-0 { - margin-top: 0 !important; - } - .mt-md-1 { - margin-top: 0.25rem !important; - } - .mt-md-2 { - margin-top: 0.5rem !important; - } - .mt-md-3 { - margin-top: 1rem !important; - } - .mt-md-4 { - margin-top: 1.5rem !important; - } - .mt-md-5 { - margin-top: 3rem !important; - } - .mt-md-auto { - margin-top: auto !important; - } - .me-md-0 { - margin-right: 0 !important; - } - .me-md-1 { - margin-right: 0.25rem !important; - } - .me-md-2 { - margin-right: 0.5rem !important; - } - .me-md-3 { - margin-right: 1rem !important; - } - .me-md-4 { - margin-right: 1.5rem !important; - } - .me-md-5 { - margin-right: 3rem !important; - } - .me-md-auto { - margin-right: auto !important; - } - .mb-md-0 { - margin-bottom: 0 !important; - } - .mb-md-1 { - margin-bottom: 0.25rem !important; - } - .mb-md-2 { - margin-bottom: 0.5rem !important; - } - .mb-md-3 { - margin-bottom: 1rem !important; - } - .mb-md-4 { - margin-bottom: 1.5rem !important; - } - .mb-md-5 { - margin-bottom: 3rem !important; - } - .mb-md-auto { - margin-bottom: auto !important; - } - .ms-md-0 { - margin-left: 0 !important; - } - .ms-md-1 { - margin-left: 0.25rem !important; - } - .ms-md-2 { - margin-left: 0.5rem !important; - } - .ms-md-3 { - margin-left: 1rem !important; - } - .ms-md-4 { - margin-left: 1.5rem !important; - } - .ms-md-5 { - margin-left: 3rem !important; - } - .ms-md-auto { - margin-left: auto !important; - } - .p-md-0 { - padding: 0 !important; - } - .p-md-1 { - padding: 0.25rem !important; - } - .p-md-2 { - padding: 0.5rem !important; - } - .p-md-3 { - padding: 1rem !important; - } - .p-md-4 { - padding: 1.5rem !important; - } - .p-md-5 { - padding: 3rem !important; - } - .px-md-0 { - padding-right: 0 !important; - padding-left: 0 !important; - } - .px-md-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; - } - .px-md-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; - } - .px-md-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; - } - .px-md-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; - } - .px-md-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; - } - .py-md-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .py-md-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .py-md-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .py-md-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .py-md-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .py-md-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .pt-md-0 { - padding-top: 0 !important; - } - .pt-md-1 { - padding-top: 0.25rem !important; - } - .pt-md-2 { - padding-top: 0.5rem !important; - } - .pt-md-3 { - padding-top: 1rem !important; - } - .pt-md-4 { - padding-top: 1.5rem !important; - } - .pt-md-5 { - padding-top: 3rem !important; - } - .pe-md-0 { - padding-right: 0 !important; - } - .pe-md-1 { - padding-right: 0.25rem !important; - } - .pe-md-2 { - padding-right: 0.5rem !important; - } - .pe-md-3 { - padding-right: 1rem !important; - } - .pe-md-4 { - padding-right: 1.5rem !important; - } - .pe-md-5 { - padding-right: 3rem !important; - } - .pb-md-0 { - padding-bottom: 0 !important; - } - .pb-md-1 { - padding-bottom: 0.25rem !important; - } - .pb-md-2 { - padding-bottom: 0.5rem !important; - } - .pb-md-3 { - padding-bottom: 1rem !important; - } - .pb-md-4 { - padding-bottom: 1.5rem !important; - } - .pb-md-5 { - padding-bottom: 3rem !important; - } - .ps-md-0 { - padding-left: 0 !important; - } - .ps-md-1 { - padding-left: 0.25rem !important; - } - .ps-md-2 { - padding-left: 0.5rem !important; - } - .ps-md-3 { - padding-left: 1rem !important; - } - .ps-md-4 { - padding-left: 1.5rem !important; - } - .ps-md-5 { - padding-left: 3rem !important; - } - .gap-md-0 { - gap: 0 !important; - } - .gap-md-1 { - gap: 0.25rem !important; - } - .gap-md-2 { - gap: 0.5rem !important; - } - .gap-md-3 { - gap: 1rem !important; - } - .gap-md-4 { - gap: 1.5rem !important; - } - .gap-md-5 { - gap: 3rem !important; - } - .row-gap-md-0 { - row-gap: 0 !important; - } - .row-gap-md-1 { - row-gap: 0.25rem !important; - } - .row-gap-md-2 { - row-gap: 0.5rem !important; - } - .row-gap-md-3 { - row-gap: 1rem !important; - } - .row-gap-md-4 { - row-gap: 1.5rem !important; - } - .row-gap-md-5 { - row-gap: 3rem !important; - } - .column-gap-md-0 { - column-gap: 0 !important; - } - .column-gap-md-1 { - column-gap: 0.25rem !important; - } - .column-gap-md-2 { - column-gap: 0.5rem !important; - } - .column-gap-md-3 { - column-gap: 1rem !important; - } - .column-gap-md-4 { - column-gap: 1.5rem !important; - } - .column-gap-md-5 { - column-gap: 3rem !important; - } - .text-md-start { - text-align: left !important; - } - .text-md-end { - text-align: right !important; - } - .text-md-center { - text-align: center !important; - } -} -@media (min-width: 992px) { - .float-lg-start { - float: left !important; - } - .float-lg-end { - float: right !important; - } - .float-lg-none { - float: none !important; - } - .object-fit-lg-contain { - object-fit: contain !important; - } - .object-fit-lg-cover { - object-fit: cover !important; - } - .object-fit-lg-fill { - object-fit: fill !important; - } - .object-fit-lg-scale { - object-fit: scale-down !important; - } - .object-fit-lg-none { - object-fit: none !important; - } - .d-lg-inline { - display: inline !important; - } - .d-lg-inline-block { - display: inline-block !important; - } - .d-lg-block { - display: block !important; - } - .d-lg-grid { - display: grid !important; - } - .d-lg-inline-grid { - display: inline-grid !important; - } - .d-lg-table { - display: table !important; - } - .d-lg-table-row { - display: table-row !important; - } - .d-lg-table-cell { - display: table-cell !important; - } - .d-lg-flex { - display: flex !important; - } - .d-lg-inline-flex { - display: inline-flex !important; - } - .d-lg-none { - display: none !important; - } - .flex-lg-fill { - flex: 1 1 auto !important; - } - .flex-lg-row { - flex-direction: row !important; - } - .flex-lg-column { - flex-direction: column !important; - } - .flex-lg-row-reverse { - flex-direction: row-reverse !important; - } - .flex-lg-column-reverse { - flex-direction: column-reverse !important; - } - .flex-lg-grow-0 { - flex-grow: 0 !important; - } - .flex-lg-grow-1 { - flex-grow: 1 !important; - } - .flex-lg-shrink-0 { - flex-shrink: 0 !important; - } - .flex-lg-shrink-1 { - flex-shrink: 1 !important; - } - .flex-lg-wrap { - flex-wrap: wrap !important; - } - .flex-lg-nowrap { - flex-wrap: nowrap !important; - } - .flex-lg-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .justify-content-lg-start { - justify-content: flex-start !important; - } - .justify-content-lg-end { - justify-content: flex-end !important; - } - .justify-content-lg-center { - justify-content: center !important; - } - .justify-content-lg-between { - justify-content: space-between !important; - } - .justify-content-lg-around { - justify-content: space-around !important; - } - .justify-content-lg-evenly { - justify-content: space-evenly !important; - } - .align-items-lg-start { - align-items: flex-start !important; - } - .align-items-lg-end { - align-items: flex-end !important; - } - .align-items-lg-center { - align-items: center !important; - } - .align-items-lg-baseline { - align-items: baseline !important; - } - .align-items-lg-stretch { - align-items: stretch !important; - } - .align-content-lg-start { - align-content: flex-start !important; - } - .align-content-lg-end { - align-content: flex-end !important; - } - .align-content-lg-center { - align-content: center !important; - } - .align-content-lg-between { - align-content: space-between !important; - } - .align-content-lg-around { - align-content: space-around !important; - } - .align-content-lg-stretch { - align-content: stretch !important; - } - .align-self-lg-auto { - align-self: auto !important; - } - .align-self-lg-start { - align-self: flex-start !important; - } - .align-self-lg-end { - align-self: flex-end !important; - } - .align-self-lg-center { - align-self: center !important; - } - .align-self-lg-baseline { - align-self: baseline !important; - } - .align-self-lg-stretch { - align-self: stretch !important; - } - .order-lg-first { - order: -1 !important; - } - .order-lg-0 { - order: 0 !important; - } - .order-lg-1 { - order: 1 !important; - } - .order-lg-2 { - order: 2 !important; - } - .order-lg-3 { - order: 3 !important; - } - .order-lg-4 { - order: 4 !important; - } - .order-lg-5 { - order: 5 !important; - } - .order-lg-last { - order: 6 !important; - } - .m-lg-0 { - margin: 0 !important; - } - .m-lg-1 { - margin: 0.25rem !important; - } - .m-lg-2 { - margin: 0.5rem !important; - } - .m-lg-3 { - margin: 1rem !important; - } - .m-lg-4 { - margin: 1.5rem !important; - } - .m-lg-5 { - margin: 3rem !important; - } - .m-lg-auto { - margin: auto !important; - } - .mx-lg-0 { - margin-right: 0 !important; - margin-left: 0 !important; - } - .mx-lg-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; - } - .mx-lg-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; - } - .mx-lg-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; - } - .mx-lg-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; - } - .mx-lg-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; - } - .mx-lg-auto { - margin-right: auto !important; - margin-left: auto !important; - } - .my-lg-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .my-lg-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .my-lg-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .my-lg-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .my-lg-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .my-lg-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .my-lg-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - .mt-lg-0 { - margin-top: 0 !important; - } - .mt-lg-1 { - margin-top: 0.25rem !important; - } - .mt-lg-2 { - margin-top: 0.5rem !important; - } - .mt-lg-3 { - margin-top: 1rem !important; - } - .mt-lg-4 { - margin-top: 1.5rem !important; - } - .mt-lg-5 { - margin-top: 3rem !important; - } - .mt-lg-auto { - margin-top: auto !important; - } - .me-lg-0 { - margin-right: 0 !important; - } - .me-lg-1 { - margin-right: 0.25rem !important; - } - .me-lg-2 { - margin-right: 0.5rem !important; - } - .me-lg-3 { - margin-right: 1rem !important; - } - .me-lg-4 { - margin-right: 1.5rem !important; - } - .me-lg-5 { - margin-right: 3rem !important; - } - .me-lg-auto { - margin-right: auto !important; - } - .mb-lg-0 { - margin-bottom: 0 !important; - } - .mb-lg-1 { - margin-bottom: 0.25rem !important; - } - .mb-lg-2 { - margin-bottom: 0.5rem !important; - } - .mb-lg-3 { - margin-bottom: 1rem !important; - } - .mb-lg-4 { - margin-bottom: 1.5rem !important; - } - .mb-lg-5 { - margin-bottom: 3rem !important; - } - .mb-lg-auto { - margin-bottom: auto !important; - } - .ms-lg-0 { - margin-left: 0 !important; - } - .ms-lg-1 { - margin-left: 0.25rem !important; - } - .ms-lg-2 { - margin-left: 0.5rem !important; - } - .ms-lg-3 { - margin-left: 1rem !important; - } - .ms-lg-4 { - margin-left: 1.5rem !important; - } - .ms-lg-5 { - margin-left: 3rem !important; - } - .ms-lg-auto { - margin-left: auto !important; - } - .p-lg-0 { - padding: 0 !important; - } - .p-lg-1 { - padding: 0.25rem !important; - } - .p-lg-2 { - padding: 0.5rem !important; - } - .p-lg-3 { - padding: 1rem !important; - } - .p-lg-4 { - padding: 1.5rem !important; - } - .p-lg-5 { - padding: 3rem !important; - } - .px-lg-0 { - padding-right: 0 !important; - padding-left: 0 !important; - } - .px-lg-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; - } - .px-lg-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; - } - .px-lg-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; - } - .px-lg-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; - } - .px-lg-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; - } - .py-lg-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .py-lg-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .py-lg-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .py-lg-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .py-lg-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .py-lg-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .pt-lg-0 { - padding-top: 0 !important; - } - .pt-lg-1 { - padding-top: 0.25rem !important; - } - .pt-lg-2 { - padding-top: 0.5rem !important; - } - .pt-lg-3 { - padding-top: 1rem !important; - } - .pt-lg-4 { - padding-top: 1.5rem !important; - } - .pt-lg-5 { - padding-top: 3rem !important; - } - .pe-lg-0 { - padding-right: 0 !important; - } - .pe-lg-1 { - padding-right: 0.25rem !important; - } - .pe-lg-2 { - padding-right: 0.5rem !important; - } - .pe-lg-3 { - padding-right: 1rem !important; - } - .pe-lg-4 { - padding-right: 1.5rem !important; - } - .pe-lg-5 { - padding-right: 3rem !important; - } - .pb-lg-0 { - padding-bottom: 0 !important; - } - .pb-lg-1 { - padding-bottom: 0.25rem !important; - } - .pb-lg-2 { - padding-bottom: 0.5rem !important; - } - .pb-lg-3 { - padding-bottom: 1rem !important; - } - .pb-lg-4 { - padding-bottom: 1.5rem !important; - } - .pb-lg-5 { - padding-bottom: 3rem !important; - } - .ps-lg-0 { - padding-left: 0 !important; - } - .ps-lg-1 { - padding-left: 0.25rem !important; - } - .ps-lg-2 { - padding-left: 0.5rem !important; - } - .ps-lg-3 { - padding-left: 1rem !important; - } - .ps-lg-4 { - padding-left: 1.5rem !important; - } - .ps-lg-5 { - padding-left: 3rem !important; - } - .gap-lg-0 { - gap: 0 !important; - } - .gap-lg-1 { - gap: 0.25rem !important; - } - .gap-lg-2 { - gap: 0.5rem !important; - } - .gap-lg-3 { - gap: 1rem !important; - } - .gap-lg-4 { - gap: 1.5rem !important; - } - .gap-lg-5 { - gap: 3rem !important; - } - .row-gap-lg-0 { - row-gap: 0 !important; - } - .row-gap-lg-1 { - row-gap: 0.25rem !important; - } - .row-gap-lg-2 { - row-gap: 0.5rem !important; - } - .row-gap-lg-3 { - row-gap: 1rem !important; - } - .row-gap-lg-4 { - row-gap: 1.5rem !important; - } - .row-gap-lg-5 { - row-gap: 3rem !important; - } - .column-gap-lg-0 { - column-gap: 0 !important; - } - .column-gap-lg-1 { - column-gap: 0.25rem !important; - } - .column-gap-lg-2 { - column-gap: 0.5rem !important; - } - .column-gap-lg-3 { - column-gap: 1rem !important; - } - .column-gap-lg-4 { - column-gap: 1.5rem !important; - } - .column-gap-lg-5 { - column-gap: 3rem !important; - } - .text-lg-start { - text-align: left !important; - } - .text-lg-end { - text-align: right !important; - } - .text-lg-center { - text-align: center !important; - } -} -@media (min-width: 1200px) { - .float-xl-start { - float: left !important; - } - .float-xl-end { - float: right !important; - } - .float-xl-none { - float: none !important; - } - .object-fit-xl-contain { - object-fit: contain !important; - } - .object-fit-xl-cover { - object-fit: cover !important; - } - .object-fit-xl-fill { - object-fit: fill !important; - } - .object-fit-xl-scale { - object-fit: scale-down !important; - } - .object-fit-xl-none { - object-fit: none !important; - } - .d-xl-inline { - display: inline !important; - } - .d-xl-inline-block { - display: inline-block !important; - } - .d-xl-block { - display: block !important; - } - .d-xl-grid { - display: grid !important; - } - .d-xl-inline-grid { - display: inline-grid !important; - } - .d-xl-table { - display: table !important; - } - .d-xl-table-row { - display: table-row !important; - } - .d-xl-table-cell { - display: table-cell !important; - } - .d-xl-flex { - display: flex !important; - } - .d-xl-inline-flex { - display: inline-flex !important; - } - .d-xl-none { - display: none !important; - } - .flex-xl-fill { - flex: 1 1 auto !important; - } - .flex-xl-row { - flex-direction: row !important; - } - .flex-xl-column { - flex-direction: column !important; - } - .flex-xl-row-reverse { - flex-direction: row-reverse !important; - } - .flex-xl-column-reverse { - flex-direction: column-reverse !important; - } - .flex-xl-grow-0 { - flex-grow: 0 !important; - } - .flex-xl-grow-1 { - flex-grow: 1 !important; - } - .flex-xl-shrink-0 { - flex-shrink: 0 !important; - } - .flex-xl-shrink-1 { - flex-shrink: 1 !important; - } - .flex-xl-wrap { - flex-wrap: wrap !important; - } - .flex-xl-nowrap { - flex-wrap: nowrap !important; - } - .flex-xl-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .justify-content-xl-start { - justify-content: flex-start !important; - } - .justify-content-xl-end { - justify-content: flex-end !important; - } - .justify-content-xl-center { - justify-content: center !important; - } - .justify-content-xl-between { - justify-content: space-between !important; - } - .justify-content-xl-around { - justify-content: space-around !important; - } - .justify-content-xl-evenly { - justify-content: space-evenly !important; - } - .align-items-xl-start { - align-items: flex-start !important; - } - .align-items-xl-end { - align-items: flex-end !important; - } - .align-items-xl-center { - align-items: center !important; - } - .align-items-xl-baseline { - align-items: baseline !important; - } - .align-items-xl-stretch { - align-items: stretch !important; - } - .align-content-xl-start { - align-content: flex-start !important; - } - .align-content-xl-end { - align-content: flex-end !important; - } - .align-content-xl-center { - align-content: center !important; - } - .align-content-xl-between { - align-content: space-between !important; - } - .align-content-xl-around { - align-content: space-around !important; - } - .align-content-xl-stretch { - align-content: stretch !important; - } - .align-self-xl-auto { - align-self: auto !important; - } - .align-self-xl-start { - align-self: flex-start !important; - } - .align-self-xl-end { - align-self: flex-end !important; - } - .align-self-xl-center { - align-self: center !important; - } - .align-self-xl-baseline { - align-self: baseline !important; - } - .align-self-xl-stretch { - align-self: stretch !important; - } - .order-xl-first { - order: -1 !important; - } - .order-xl-0 { - order: 0 !important; - } - .order-xl-1 { - order: 1 !important; - } - .order-xl-2 { - order: 2 !important; - } - .order-xl-3 { - order: 3 !important; - } - .order-xl-4 { - order: 4 !important; - } - .order-xl-5 { - order: 5 !important; - } - .order-xl-last { - order: 6 !important; - } - .m-xl-0 { - margin: 0 !important; - } - .m-xl-1 { - margin: 0.25rem !important; - } - .m-xl-2 { - margin: 0.5rem !important; - } - .m-xl-3 { - margin: 1rem !important; - } - .m-xl-4 { - margin: 1.5rem !important; - } - .m-xl-5 { - margin: 3rem !important; - } - .m-xl-auto { - margin: auto !important; - } - .mx-xl-0 { - margin-right: 0 !important; - margin-left: 0 !important; - } - .mx-xl-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; - } - .mx-xl-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; - } - .mx-xl-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; - } - .mx-xl-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; - } - .mx-xl-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; - } - .mx-xl-auto { - margin-right: auto !important; - margin-left: auto !important; - } - .my-xl-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .my-xl-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .my-xl-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .my-xl-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .my-xl-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .my-xl-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .my-xl-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - .mt-xl-0 { - margin-top: 0 !important; - } - .mt-xl-1 { - margin-top: 0.25rem !important; - } - .mt-xl-2 { - margin-top: 0.5rem !important; - } - .mt-xl-3 { - margin-top: 1rem !important; - } - .mt-xl-4 { - margin-top: 1.5rem !important; - } - .mt-xl-5 { - margin-top: 3rem !important; - } - .mt-xl-auto { - margin-top: auto !important; - } - .me-xl-0 { - margin-right: 0 !important; - } - .me-xl-1 { - margin-right: 0.25rem !important; - } - .me-xl-2 { - margin-right: 0.5rem !important; - } - .me-xl-3 { - margin-right: 1rem !important; - } - .me-xl-4 { - margin-right: 1.5rem !important; - } - .me-xl-5 { - margin-right: 3rem !important; - } - .me-xl-auto { - margin-right: auto !important; - } - .mb-xl-0 { - margin-bottom: 0 !important; - } - .mb-xl-1 { - margin-bottom: 0.25rem !important; - } - .mb-xl-2 { - margin-bottom: 0.5rem !important; - } - .mb-xl-3 { - margin-bottom: 1rem !important; - } - .mb-xl-4 { - margin-bottom: 1.5rem !important; - } - .mb-xl-5 { - margin-bottom: 3rem !important; - } - .mb-xl-auto { - margin-bottom: auto !important; - } - .ms-xl-0 { - margin-left: 0 !important; - } - .ms-xl-1 { - margin-left: 0.25rem !important; - } - .ms-xl-2 { - margin-left: 0.5rem !important; - } - .ms-xl-3 { - margin-left: 1rem !important; - } - .ms-xl-4 { - margin-left: 1.5rem !important; - } - .ms-xl-5 { - margin-left: 3rem !important; - } - .ms-xl-auto { - margin-left: auto !important; - } - .p-xl-0 { - padding: 0 !important; - } - .p-xl-1 { - padding: 0.25rem !important; - } - .p-xl-2 { - padding: 0.5rem !important; - } - .p-xl-3 { - padding: 1rem !important; - } - .p-xl-4 { - padding: 1.5rem !important; - } - .p-xl-5 { - padding: 3rem !important; - } - .px-xl-0 { - padding-right: 0 !important; - padding-left: 0 !important; - } - .px-xl-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; - } - .px-xl-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; - } - .px-xl-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; - } - .px-xl-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; - } - .px-xl-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; - } - .py-xl-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .py-xl-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .py-xl-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .py-xl-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .py-xl-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .py-xl-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .pt-xl-0 { - padding-top: 0 !important; - } - .pt-xl-1 { - padding-top: 0.25rem !important; - } - .pt-xl-2 { - padding-top: 0.5rem !important; - } - .pt-xl-3 { - padding-top: 1rem !important; - } - .pt-xl-4 { - padding-top: 1.5rem !important; - } - .pt-xl-5 { - padding-top: 3rem !important; - } - .pe-xl-0 { - padding-right: 0 !important; - } - .pe-xl-1 { - padding-right: 0.25rem !important; - } - .pe-xl-2 { - padding-right: 0.5rem !important; - } - .pe-xl-3 { - padding-right: 1rem !important; - } - .pe-xl-4 { - padding-right: 1.5rem !important; - } - .pe-xl-5 { - padding-right: 3rem !important; - } - .pb-xl-0 { - padding-bottom: 0 !important; - } - .pb-xl-1 { - padding-bottom: 0.25rem !important; - } - .pb-xl-2 { - padding-bottom: 0.5rem !important; - } - .pb-xl-3 { - padding-bottom: 1rem !important; - } - .pb-xl-4 { - padding-bottom: 1.5rem !important; - } - .pb-xl-5 { - padding-bottom: 3rem !important; - } - .ps-xl-0 { - padding-left: 0 !important; - } - .ps-xl-1 { - padding-left: 0.25rem !important; - } - .ps-xl-2 { - padding-left: 0.5rem !important; - } - .ps-xl-3 { - padding-left: 1rem !important; - } - .ps-xl-4 { - padding-left: 1.5rem !important; - } - .ps-xl-5 { - padding-left: 3rem !important; - } - .gap-xl-0 { - gap: 0 !important; - } - .gap-xl-1 { - gap: 0.25rem !important; - } - .gap-xl-2 { - gap: 0.5rem !important; - } - .gap-xl-3 { - gap: 1rem !important; - } - .gap-xl-4 { - gap: 1.5rem !important; - } - .gap-xl-5 { - gap: 3rem !important; - } - .row-gap-xl-0 { - row-gap: 0 !important; - } - .row-gap-xl-1 { - row-gap: 0.25rem !important; - } - .row-gap-xl-2 { - row-gap: 0.5rem !important; - } - .row-gap-xl-3 { - row-gap: 1rem !important; - } - .row-gap-xl-4 { - row-gap: 1.5rem !important; - } - .row-gap-xl-5 { - row-gap: 3rem !important; - } - .column-gap-xl-0 { - column-gap: 0 !important; - } - .column-gap-xl-1 { - column-gap: 0.25rem !important; - } - .column-gap-xl-2 { - column-gap: 0.5rem !important; - } - .column-gap-xl-3 { - column-gap: 1rem !important; - } - .column-gap-xl-4 { - column-gap: 1.5rem !important; - } - .column-gap-xl-5 { - column-gap: 3rem !important; - } - .text-xl-start { - text-align: left !important; - } - .text-xl-end { - text-align: right !important; - } - .text-xl-center { - text-align: center !important; - } -} -@media (min-width: 1400px) { - .float-xxl-start { - float: left !important; - } - .float-xxl-end { - float: right !important; - } - .float-xxl-none { - float: none !important; - } - .object-fit-xxl-contain { - object-fit: contain !important; - } - .object-fit-xxl-cover { - object-fit: cover !important; - } - .object-fit-xxl-fill { - object-fit: fill !important; - } - .object-fit-xxl-scale { - object-fit: scale-down !important; - } - .object-fit-xxl-none { - object-fit: none !important; - } - .d-xxl-inline { - display: inline !important; - } - .d-xxl-inline-block { - display: inline-block !important; - } - .d-xxl-block { - display: block !important; - } - .d-xxl-grid { - display: grid !important; - } - .d-xxl-inline-grid { - display: inline-grid !important; - } - .d-xxl-table { - display: table !important; - } - .d-xxl-table-row { - display: table-row !important; - } - .d-xxl-table-cell { - display: table-cell !important; - } - .d-xxl-flex { - display: flex !important; - } - .d-xxl-inline-flex { - display: inline-flex !important; - } - .d-xxl-none { - display: none !important; - } - .flex-xxl-fill { - flex: 1 1 auto !important; - } - .flex-xxl-row { - flex-direction: row !important; - } - .flex-xxl-column { - flex-direction: column !important; - } - .flex-xxl-row-reverse { - flex-direction: row-reverse !important; - } - .flex-xxl-column-reverse { - flex-direction: column-reverse !important; - } - .flex-xxl-grow-0 { - flex-grow: 0 !important; - } - .flex-xxl-grow-1 { - flex-grow: 1 !important; - } - .flex-xxl-shrink-0 { - flex-shrink: 0 !important; - } - .flex-xxl-shrink-1 { - flex-shrink: 1 !important; - } - .flex-xxl-wrap { - flex-wrap: wrap !important; - } - .flex-xxl-nowrap { - flex-wrap: nowrap !important; - } - .flex-xxl-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .justify-content-xxl-start { - justify-content: flex-start !important; - } - .justify-content-xxl-end { - justify-content: flex-end !important; - } - .justify-content-xxl-center { - justify-content: center !important; - } - .justify-content-xxl-between { - justify-content: space-between !important; - } - .justify-content-xxl-around { - justify-content: space-around !important; - } - .justify-content-xxl-evenly { - justify-content: space-evenly !important; - } - .align-items-xxl-start { - align-items: flex-start !important; - } - .align-items-xxl-end { - align-items: flex-end !important; - } - .align-items-xxl-center { - align-items: center !important; - } - .align-items-xxl-baseline { - align-items: baseline !important; - } - .align-items-xxl-stretch { - align-items: stretch !important; - } - .align-content-xxl-start { - align-content: flex-start !important; - } - .align-content-xxl-end { - align-content: flex-end !important; - } - .align-content-xxl-center { - align-content: center !important; - } - .align-content-xxl-between { - align-content: space-between !important; - } - .align-content-xxl-around { - align-content: space-around !important; - } - .align-content-xxl-stretch { - align-content: stretch !important; - } - .align-self-xxl-auto { - align-self: auto !important; - } - .align-self-xxl-start { - align-self: flex-start !important; - } - .align-self-xxl-end { - align-self: flex-end !important; - } - .align-self-xxl-center { - align-self: center !important; - } - .align-self-xxl-baseline { - align-self: baseline !important; - } - .align-self-xxl-stretch { - align-self: stretch !important; - } - .order-xxl-first { - order: -1 !important; - } - .order-xxl-0 { - order: 0 !important; - } - .order-xxl-1 { - order: 1 !important; - } - .order-xxl-2 { - order: 2 !important; - } - .order-xxl-3 { - order: 3 !important; - } - .order-xxl-4 { - order: 4 !important; - } - .order-xxl-5 { - order: 5 !important; - } - .order-xxl-last { - order: 6 !important; - } - .m-xxl-0 { - margin: 0 !important; - } - .m-xxl-1 { - margin: 0.25rem !important; - } - .m-xxl-2 { - margin: 0.5rem !important; - } - .m-xxl-3 { - margin: 1rem !important; - } - .m-xxl-4 { - margin: 1.5rem !important; - } - .m-xxl-5 { - margin: 3rem !important; - } - .m-xxl-auto { - margin: auto !important; - } - .mx-xxl-0 { - margin-right: 0 !important; - margin-left: 0 !important; - } - .mx-xxl-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; - } - .mx-xxl-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; - } - .mx-xxl-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; - } - .mx-xxl-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; - } - .mx-xxl-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; - } - .mx-xxl-auto { - margin-right: auto !important; - margin-left: auto !important; - } - .my-xxl-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .my-xxl-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .my-xxl-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .my-xxl-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .my-xxl-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .my-xxl-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .my-xxl-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - .mt-xxl-0 { - margin-top: 0 !important; - } - .mt-xxl-1 { - margin-top: 0.25rem !important; - } - .mt-xxl-2 { - margin-top: 0.5rem !important; - } - .mt-xxl-3 { - margin-top: 1rem !important; - } - .mt-xxl-4 { - margin-top: 1.5rem !important; - } - .mt-xxl-5 { - margin-top: 3rem !important; - } - .mt-xxl-auto { - margin-top: auto !important; - } - .me-xxl-0 { - margin-right: 0 !important; - } - .me-xxl-1 { - margin-right: 0.25rem !important; - } - .me-xxl-2 { - margin-right: 0.5rem !important; - } - .me-xxl-3 { - margin-right: 1rem !important; - } - .me-xxl-4 { - margin-right: 1.5rem !important; - } - .me-xxl-5 { - margin-right: 3rem !important; - } - .me-xxl-auto { - margin-right: auto !important; - } - .mb-xxl-0 { - margin-bottom: 0 !important; - } - .mb-xxl-1 { - margin-bottom: 0.25rem !important; - } - .mb-xxl-2 { - margin-bottom: 0.5rem !important; - } - .mb-xxl-3 { - margin-bottom: 1rem !important; - } - .mb-xxl-4 { - margin-bottom: 1.5rem !important; - } - .mb-xxl-5 { - margin-bottom: 3rem !important; - } - .mb-xxl-auto { - margin-bottom: auto !important; - } - .ms-xxl-0 { - margin-left: 0 !important; - } - .ms-xxl-1 { - margin-left: 0.25rem !important; - } - .ms-xxl-2 { - margin-left: 0.5rem !important; - } - .ms-xxl-3 { - margin-left: 1rem !important; - } - .ms-xxl-4 { - margin-left: 1.5rem !important; - } - .ms-xxl-5 { - margin-left: 3rem !important; - } - .ms-xxl-auto { - margin-left: auto !important; - } - .p-xxl-0 { - padding: 0 !important; - } - .p-xxl-1 { - padding: 0.25rem !important; - } - .p-xxl-2 { - padding: 0.5rem !important; - } - .p-xxl-3 { - padding: 1rem !important; - } - .p-xxl-4 { - padding: 1.5rem !important; - } - .p-xxl-5 { - padding: 3rem !important; - } - .px-xxl-0 { - padding-right: 0 !important; - padding-left: 0 !important; - } - .px-xxl-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; - } - .px-xxl-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; - } - .px-xxl-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; - } - .px-xxl-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; - } - .px-xxl-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; - } - .py-xxl-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .py-xxl-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .py-xxl-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .py-xxl-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .py-xxl-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .py-xxl-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .pt-xxl-0 { - padding-top: 0 !important; - } - .pt-xxl-1 { - padding-top: 0.25rem !important; - } - .pt-xxl-2 { - padding-top: 0.5rem !important; - } - .pt-xxl-3 { - padding-top: 1rem !important; - } - .pt-xxl-4 { - padding-top: 1.5rem !important; - } - .pt-xxl-5 { - padding-top: 3rem !important; - } - .pe-xxl-0 { - padding-right: 0 !important; - } - .pe-xxl-1 { - padding-right: 0.25rem !important; - } - .pe-xxl-2 { - padding-right: 0.5rem !important; - } - .pe-xxl-3 { - padding-right: 1rem !important; - } - .pe-xxl-4 { - padding-right: 1.5rem !important; - } - .pe-xxl-5 { - padding-right: 3rem !important; - } - .pb-xxl-0 { - padding-bottom: 0 !important; - } - .pb-xxl-1 { - padding-bottom: 0.25rem !important; - } - .pb-xxl-2 { - padding-bottom: 0.5rem !important; - } - .pb-xxl-3 { - padding-bottom: 1rem !important; - } - .pb-xxl-4 { - padding-bottom: 1.5rem !important; - } - .pb-xxl-5 { - padding-bottom: 3rem !important; - } - .ps-xxl-0 { - padding-left: 0 !important; - } - .ps-xxl-1 { - padding-left: 0.25rem !important; - } - .ps-xxl-2 { - padding-left: 0.5rem !important; - } - .ps-xxl-3 { - padding-left: 1rem !important; - } - .ps-xxl-4 { - padding-left: 1.5rem !important; - } - .ps-xxl-5 { - padding-left: 3rem !important; - } - .gap-xxl-0 { - gap: 0 !important; - } - .gap-xxl-1 { - gap: 0.25rem !important; - } - .gap-xxl-2 { - gap: 0.5rem !important; - } - .gap-xxl-3 { - gap: 1rem !important; - } - .gap-xxl-4 { - gap: 1.5rem !important; - } - .gap-xxl-5 { - gap: 3rem !important; - } - .row-gap-xxl-0 { - row-gap: 0 !important; - } - .row-gap-xxl-1 { - row-gap: 0.25rem !important; - } - .row-gap-xxl-2 { - row-gap: 0.5rem !important; - } - .row-gap-xxl-3 { - row-gap: 1rem !important; - } - .row-gap-xxl-4 { - row-gap: 1.5rem !important; - } - .row-gap-xxl-5 { - row-gap: 3rem !important; - } - .column-gap-xxl-0 { - column-gap: 0 !important; - } - .column-gap-xxl-1 { - column-gap: 0.25rem !important; - } - .column-gap-xxl-2 { - column-gap: 0.5rem !important; - } - .column-gap-xxl-3 { - column-gap: 1rem !important; - } - .column-gap-xxl-4 { - column-gap: 1.5rem !important; - } - .column-gap-xxl-5 { - column-gap: 3rem !important; - } - .text-xxl-start { - text-align: left !important; - } - .text-xxl-end { - text-align: right !important; - } - .text-xxl-center { - text-align: center !important; - } -} -@media (min-width: 1200px) { - .fs-1 { - font-size: 2.5rem !important; - } - .fs-2 { - font-size: 2rem !important; - } - .fs-3 { - font-size: 1.75rem !important; - } - .fs-4 { - font-size: 1.5rem !important; - } -} -@media print { - .d-print-inline { - display: inline !important; - } - .d-print-inline-block { - display: inline-block !important; - } - .d-print-block { - display: block !important; - } - .d-print-grid { - display: grid !important; - } - .d-print-inline-grid { - display: inline-grid !important; - } - .d-print-table { - display: table !important; - } - .d-print-table-row { - display: table-row !important; - } - .d-print-table-cell { - display: table-cell !important; - } - .d-print-flex { - display: flex !important; - } - .d-print-inline-flex { - display: inline-flex !important; - } - .d-print-none { - display: none !important; - } -} -@font-face { - font-display: swap; - font-family: "Playfair Display"; - font-style: normal; - font-weight: 400; - src: url("../fonts/playfair-display-v40-latin/playfair-display-v40-latin-regular.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Playfair Display"; - font-style: italic; - font-weight: 400; - src: url("../fonts/playfair-display-v40-latin/playfair-display-v40-latin-italic.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Playfair Display"; - font-style: normal; - font-weight: 500; - src: url("../fonts/playfair-display-v40-latin/playfair-display-v40-latin-500.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Playfair Display"; - font-style: italic; - font-weight: 500; - src: url("../fonts/playfair-display-v40-latin/playfair-display-v40-latin-500italic.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Playfair Display"; - font-style: normal; - font-weight: 600; - src: url("../fonts/playfair-display-v40-latin/playfair-display-v40-latin-600.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Playfair Display"; - font-style: italic; - font-weight: 600; - src: url("../fonts/playfair-display-v40-latin/playfair-display-v40-latin-600italic.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Playfair Display"; - font-style: normal; - font-weight: 700; - src: url("../fonts/playfair-display-v40-latin/playfair-display-v40-latin-700.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Playfair Display"; - font-style: italic; - font-weight: 700; - src: url("../fonts/playfair-display-v40-latin/playfair-display-v40-latin-700italic.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Playfair Display"; - font-style: normal; - font-weight: 800; - src: url("../fonts/playfair-display-v40-latin/playfair-display-v40-latin-800.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Playfair Display"; - font-style: italic; - font-weight: 800; - src: url("../fonts/playfair-display-v40-latin/playfair-display-v40-latin-800italic.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Playfair Display"; - font-style: normal; - font-weight: 900; - src: url("../fonts/playfair-display-v40-latin/playfair-display-v40-latin-900.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Playfair Display"; - font-style: italic; - font-weight: 900; - src: url("../fonts/playfair-display-v40-latin/playfair-display-v40-latin-900italic.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: normal; - font-weight: 200; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-200.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: italic; - font-weight: 200; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-200italic.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: normal; - font-weight: 300; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-300.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: italic; - font-weight: 300; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-300italic.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: normal; - font-weight: 400; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-regular.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: italic; - font-weight: 400; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-italic.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: normal; - font-weight: 500; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-500.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: italic; - font-weight: 500; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-500italic.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: normal; - font-weight: 600; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-600.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: italic; - font-weight: 600; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-600italic.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: normal; - font-weight: 700; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-700.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: italic; - font-weight: 700; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-700italic.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: normal; - font-weight: 800; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-800.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: italic; - font-weight: 800; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-800italic.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: normal; - font-weight: 900; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-900.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: italic; - font-weight: 900; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-900italic.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Special Elite"; - font-style: normal; - font-weight: 400; - src: url("../fonts/special-elite-v20-latin/special-elite-v20-latin-regular.woff2") format("woff2"); -} -/* Color Theme Swatches in Hex */ -*, -html { - box-sizing: border-box; -} - -html, -body { - height: 100%; - padding: 0; - margin: 0; -} - -body { - font-family: "Source Sans 3", "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; -} - -h1, .h1, -h2, -.h2, -h3, -.h3, -h4, -.h4, -h5, -.h5, -h6, -.h6 { - font-family: "Playfair Display", Cambria, Cochin, Georgia, Times, "Times New Roman", serif; - font-weight: 700; -} - -.chuck-norris-joke { - width: 100%; - height: 100%; - height: 100vh; - background: #222 url("../img/bg-concrete.jpg") center no-repeat fixed; - background-size: cover; - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; -} -.chuck-norris-joke::after { - content: ""; - position: absolute; - z-index: 1; - top: 0; - left: 0; - display: block; - width: 100%; - height: 100%; - background-color: rgba(0, 0, 0, 0.4); -} -.chuck-norris-joke > * { - position: relative; - z-index: 2; -} -.chuck-norris-joke .joke-text { - color: white; - text-align: center; - font-family: "Special Elite"; - text-shadow: 2px 2px 5px rgba(0, 0, 0, 0.5); - font-size: 3rem; - max-width: 80%; - min-height: 40vh; -} - -/*# sourceMappingURL=main.css.map */ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/css/main.css.map b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/css/main.css.map deleted file mode 100644 index ba3d919..0000000 --- a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/css/main.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sourceRoot":"","sources":["../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_banner.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_root.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/vendor/_rfs.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_color-mode.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_reboot.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_variables.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_border-radius.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_type.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_lists.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_images.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_image.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_containers.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_container.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_breakpoints.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_grid.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_grid.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_tables.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_table-variants.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/forms/_labels.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/forms/_form-text.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/forms/_form-control.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_transition.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_gradients.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/forms/_form-select.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/forms/_form-check.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/forms/_form-range.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/forms/_floating-labels.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/forms/_input-group.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_forms.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_buttons.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_buttons.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_transitions.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_dropdown.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_caret.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_button-group.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_nav.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_navbar.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_card.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_accordion.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_pagination.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_pagination.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_badge.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_alert.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_progress.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_list-group.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_close.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_toasts.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_modal.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_backdrop.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_tooltip.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_reset-text.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_popover.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_carousel.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_clearfix.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_spinners.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_offcanvas.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_placeholders.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/helpers/_color-bg.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/helpers/_colored-links.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/helpers/_focus-ring.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/helpers/_icon-link.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/helpers/_ratio.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/helpers/_position.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/helpers/_stacks.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/helpers/_visually-hidden.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_visually-hidden.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/helpers/_stretched-link.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/helpers/_text-truncation.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_text-truncate.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/helpers/_vr.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_utilities.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/utilities/_api.scss","../../dev/assets/scss/02_fonts/_playfair-display-v40-latin.scss","../../dev/assets/scss/02_fonts/_source-sans-3-v19-latin.scss","../../dev/assets/scss/02_fonts/_special-elite-v20-latin.scss","../../dev/assets/scss/03_base/_colors.scss","../../dev/assets/scss/03_base/_theme.scss","../../dev/assets/scss/03_base/_typography.scss","../../dev/assets/scss/05_modules/_chuck-norris-joke.scss"],"names":[],"mappings":"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EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAlBF;EAOE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAlBF;EAOE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAlBF;EAOE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAlBF;EAOE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAlBF;EAOE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAlBF;EAOE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAlBF;EAOE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;ADiJA;EACE;EACA;;;AH3FF;EGyFA;IACE;IACA;;;AH3FF;EGyFA;IACE;IACA;;;AH3FF;EGyFA;IACE;IACA;;;AH3FF;EGyFA;IACE;IACA;;;AH3FF;EGyFA;IACE;IACA;;;AEnKN;EACE,ebu2BsC;;;Aa91BxC;EACE;EACA;EACA;EhB8QI,WALI;EgBrQR,ab+lB4B;;;Aa3lB9B;EACE;EACA;EhBoQI,WALI;;;AgB3PV;EACE;EACA;EhB8PI,WALI;;;AiBtRV;EACE,Yd+1BsC;EHrkBlC,WALI;EiBjRR,Od+1BsC;;;Aep2BxC;EACE;EACA;EACA;ElBwRI,WALI;EkBhRR,afkmB4B;EejmB5B,afymB4B;EexmB5B,Of43BsC;Ee33BtC;EACA,kBfq3BsC;Eep3BtC;EACA;EdGE;EeHE,YDMJ;;ACFI;EDhBN;ICiBQ;;;ADGN;EACE;;AAEA;EACE;;AAKJ;EACE,Ofs2BoC;Eer2BpC,kBfg2BoC;Ee/1BpC,cf82BoC;Ee72BpC;EAKE,YfkhBkB;;Ae9gBtB;EAME;EAMA;EAKA;;AAKF;EACE;EACA;;AAIF;EACE,Of40BoC;Ee10BpC;;AAQF;EAEE,kBf8yBoC;Ee3yBpC;;AAIF;EACE;EACA;EACA,mBforB0B;EenrB1B,OfsyBoC;EiBp4BtC,kBjBqiCgC;Eer8B9B;EACA;EACA;EACA;EACA,yBfgsB0B;Ee/rB1B;ECzFE,YD0FF;;ACtFE;ED0EJ;ICzEM;;;ADwFN;EACE,kBf47B8B;;;Aen7BlC;EACE;EACA;EACA;EACA;EACA,afwf4B;Eevf5B,Of2xBsC;Ee1xBtC;EACA;EACA;;AAEA;EACE;;AAGF;EAEE;EACA;;;AAWJ;EACE,Yf4wBsC;Ee3wBtC;ElByII,WALI;EIvQN;;AcuIF;EACE;EACA;EACA,mBfooB0B;;;AehoB9B;EACE,YfgwBsC;Ee/vBtC;ElB4HI,WALI;EIvQN;;AcoJF;EACE;EACA;EACA,mBf2nB0B;;;AennB5B;EACE,Yf6uBoC;;Ae1uBtC;EACE,Yf0uBoC;;AevuBtC;EACE,YfuuBoC;;;AeluBxC;EACE,OfquBsC;EepuBtC,Qf8tBsC;Ee7tBtC,SfilB4B;;Ae/kB5B;EACE;;AAGF;EACE;EdvLA;;Ac2LF;EACE;Ed5LA;;AcgMF;EAAoB,Qf8sBkB;;Ae7sBtC;EAAoB,Qf8sBkB;;;AkB75BxC;EACE;EAEA;EACA;EACA;ErBqRI,WALI;EqB7QR,alB+lB4B;EkB9lB5B,alBsmB4B;EkBrmB5B,OlBy3BsC;EkBx3BtC;EACA,kBlBk3BsC;EkBj3BtC;EACA;EACA,qBlB+9BkC;EkB99BlC,iBlB+9BkC;EkB99BlC;EjBHE;EeHE,YESJ;;AFLI;EEfN;IFgBQ;;;AEMN;EACE,clBs3BoC;EkBr3BpC;EAKE,YlBi+B4B;;AkB79BhC;EAEE,elB6uB0B;EkB5uB1B;;AAGF;EAEE,kBlBu1BoC;;AkBl1BtC;EACE;EACA;;;AAIJ;EACE,alBsuB4B;EkBruB5B,gBlBquB4B;EkBpuB5B,clBquB4B;EHlgBxB,WALI;EIvQN;;;AiB8CJ;EACE,alBkuB4B;EkBjuB5B,gBlBiuB4B;EkBhuB5B,clBiuB4B;EHtgBxB,WALI;EIvQN;;;AiBwDA;EACE;;;ACxEN;EACE;EACA,YnBq6BwC;EmBp6BxC,cnBq6BwC;EmBp6BxC,enBq6BwC;;AmBn6BxC;EACE;EACA;;;AAIJ;EACE,enB25BwC;EmB15BxC;EACA;;AAEA;EACE;EACA;EACA;;;AAIJ;EACE;EAEA;EACA,OnB04BwC;EmBz4BxC,QnBy4BwC;EmBx4BxC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,QnB24BwC;EmB14BxC;;AAGA;ElB3BE;;AkB+BF;EAEE,enBm4BsC;;AmBh4BxC;EACE,QnB03BsC;;AmBv3BxC;EACE,cnBs1BoC;EmBr1BpC;EACA,YnB8foB;;AmB3ftB;EACE,kBnB5BM;EmB6BN,cnB7BM;;AmB+BN;EAII;;AAIJ;EAII;;AAKN;EACE,kBnBjDM;EmBkDN,cnBlDM;EmBuDJ;;AAIJ;EACE;EACA;EACA,SnBk2BuC;;AmB31BvC;EACE;EACA,SnBy1BqC;;;AmB30B3C;EACE,cnBo1BgC;;AmBl1BhC;EACE;EAEA,OnB80B8B;EmB70B9B;EACA;EACA;ElBjHA;EeHE,YGsHF;;AHlHE;EG0GJ;IHzGM;;;AGmHJ;EACE;;AAGF;EACE,qBnB60B4B;EmBx0B1B;;AAKN;EACE,enBwzB8B;EmBvzB9B;;AAEA;EACE;EACA;;;AAKN;EACE;EACA,cnBsyBgC;;;AmBnyBlC;EACE;EACA;EACA;;AAIE;EACE;EACA;EACA,SnBspBwB;;;AmB/oB1B;EACE;;;ACnLN;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAIA;EAA0B,YpB8gCa;;AoB7gCvC;EAA0B,YpB6gCa;;AoB1gCzC;EACE;;AAGF;EACE,OpB+/BuC;EoB9/BvC,QpB8/BuC;EoB7/BvC;EACA;EH1BF,kBjBkCQ;EoBNN,QpB6/BuC;EC1gCvC;EeHE,YImBF;;AJfE;EIMJ;IJLM;;;AIgBJ;EHjCF,kBjB8hCyC;;AoBx/BzC;EACE,OpBw+B8B;EoBv+B9B,QpBw+B8B;EoBv+B9B;EACA,QpBu+B8B;EoBt+B9B,kBpBu+B8B;EoBt+B9B;EnB7BA;;AmBkCF;EACE,OpBo+BuC;EoBn+BvC,QpBm+BuC;EoBl+BvC;EHpDF,kBjBkCQ;EoBoBN,QpBm+BuC;EC1gCvC;EeHE,YI6CF;;AJzCE;EIiCJ;IJhCM;;;AI0CJ;EH3DF,kBjB8hCyC;;AoB99BzC;EACE,OpB8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E;EACA;EACA;E3BuRI,oBALI;E2BhRR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;E3BsQI,WALI;E2B/PR;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EvBjBE;EgBfF,kBOkCqB;ERtBjB,YQwBJ;;ARpBI;EQhBN;IRiBQ;;;AQqBN;EACE;EAEA;EACA;;AAGF;EAEE;EACA;EACA;;AAGF;EACE;EPrDF,kBOsDuB;EACrB;EACA;EAKE;;AAIJ;EACE;EACA;EAKE;;AAIJ;EAKE;EACA;EAGA;;AAGA;EAKI;;AAKN;EAKI;;AAIJ;EAGE;EACA;EACA;EAEA;EACA;;;AAYF;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADkGA;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADkGA;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADkGA;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADkGA;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADkGA;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADkGA;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADkGA;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AD4HA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADmGA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADmGA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADmGA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADmGA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADmGA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADmGA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADmGA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AD+GF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA,iBxB8QwC;;AwBpQxC;EACE;;AAGF;EACE;;;AAWJ;ECjJE;EACA;E5B8NI,oBALI;E4BvNR;;;ADkJF;ECrJE;EACA;E5B8NI,oBALI;E4BvNR;;;ACnEF;EVgBM,YUfJ;;AVmBI;EUpBN;IVqBQ;;;AUlBN;EACE;;;AAMF;EACE;;;AAIJ;EACE;EACA;EVDI,YUEJ;;AVEI;EULN;IVMQ;;;AUDN;EACE;EACA;EVNE,YUOF;;AVHE;EUAJ;IVCM;;;;AWpBR;AAAA;AAAA;AAAA;AAAA;AAAA;EAME;;;AAGF;EACE;;ACwBE;EACE;EACA,a5B6hBwB;E4B5hBxB,gB5B2hBwB;E4B1hBxB;EArCJ;EACA;EACA;EACA;;AA0DE;EACE;;;AD9CN;EAEE;EACA;EACA;EACA;EACA;E9BuQI,yBALI;E8BhQR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;E9B0OI,WALI;E8BnOR;EACA;EACA;EACA;EACA;EACA;E1BzCE;;A0B6CF;EACE;EACA;EACA;;;AAwBA;EACE;;AAEA;EACE;E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EA;EAEE;;;AAUJ;EAEE;EACA;EAEA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;;AAGE;EAEE;;AAIJ;EACE;;;AASJ;EACE,a/B8gCkC;E+B7gClC,gB/B6gCkC;E+B5gClC;;AAEA;AAAA;AAAA;EAGE;;;AAaJ;EACE;EACA;EAGA;;;AAIF;EACE;ElCyII,WALI;EkClIR;EACA;EACA;EACA;E9BxIE;EeHE,Ye6IJ;;AfzII;EeiIN;IfhIQ;;;Ae0IN;EACE;;AAGF;EACE;EACA;EACA;;;AAMJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AvB1HE;EuBsIA;IAEI;IACA;;EAEA;IACE;;EAEA;IACE;;EAGF;IACE;IACA;;EAIJ;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;If9NJ,YegOI;;EAGA;IACE;;EAGF;IACE;IACA;IACA;IACA;;;AvB5LR;EuBsIA;IAEI;IACA;;EAEA;IACE;;EAEA;IACE;;EAGF;IACE;IACA;;EAIJ;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;If9NJ,YegOI;;EAGA;IACE;;EAGF;IACE;IACA;IACA;IACA;;;AvB5LR;EuBsIA;IAEI;IACA;;EAEA;IACE;;EAEA;IACE;;EAGF;IACE;IACA;;EAIJ;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;If9NJ,YegOI;;EAGA;IACE;;EAGF;IACE;IACA;IACA;IACA;;;AvB5LR;EuBsIA;IAEI;IACA;;EAEA;IACE;;EAEA;IACE;;EAGF;IACE;IACA;;EAIJ;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;If9NJ,YegOI;;EAGA;IACE;;EAGF;IACE;IACA;IACA;IACA;;;AvB5LR;EuBsIA;IAEI;IACA;;EAEA;IACE;;EAEA;IACE;;EAGF;IACE;IACA;;EAIJ;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;If9NJ,YegOI;;EAGA;IACE;;EAGF;IACE;IACA;IACA;IACA;;;AAtDR;EAEI;EACA;;AAEA;EACE;;AAEA;EACE;;AAGF;EACE;EACA;;AAIJ;EACE;;AAGF;EACE;EACA;;AAGF;EACE;;AAGF;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;Ef9NJ,YegOI;;AAGA;EACE;;AAGF;EACE;EACA;EACA;EACA;;;AAiBZ;AAAA;EAGE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAME;EACE;;;ACzRN;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;E/BjBE;;A+BqBF;EACE;EACA;;AAGF;EACE;EACA;;AAEA;EACE;E/BtBF;EACA;;A+ByBA;EACE;E/BbF;EACA;;A+BmBF;AAAA;EAEE;;;AAIJ;EAGE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAQA;EACE;;;AAQJ;EACE;EACA;EACA;EACA;EACA;;AAEA;E/B7FE;;;A+BkGJ;EACE;EACA;EACA;EACA;;AAEA;E/BxGE;;;A+BkHJ;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;;AAIJ;EACE;EACA;;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;E/B1IE;;;A+B8IJ;AAAA;AAAA;EAGE;;;AAGF;AAAA;E/B3II;EACA;;;A+B+IJ;AAAA;E/BlII;EACA;;;A+B8IF;EACE;;AxB3HA;EwBuHJ;IAQI;IACA;;EAGA;IACE;IACA;;EAEA;IACE;IACA;;EAKA;I/B1KJ;IACA;;E+B4KM;AAAA;IAGE;;EAEF;AAAA;IAGE;;EAIJ;I/B3KJ;IACA;;E+B6KM;AAAA;IAGE;;EAEF;AAAA;IAGE;;;;ACnOZ;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIF;EACE;EACA;EACA;EACA;EACA;EpC4PI,WALI;EoCrPR;EACA;EACA;EACA;EhCrBE;EgCuBF;EjB1BI,YiB2BJ;;AjBvBI;EiBUN;IjBTQ;;;AiBwBN;EACE;EACA;EACA;;AAEA;EACE;EACA;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EjBjDE,YiBkDF;;AjB9CE;EiBqCJ;IjBpCM;;;AiBgDN;EACE;;AAGF;EACE;EACA;EACA;;;AAIJ;EACE;;;AAGF;EACE;EACA;EACA;;AAEA;EhC7DE;EACA;;AgC+DA;EhChEA;EACA;;AgCoEF;EACE;;AAIF;EhC5DE;EACA;;AgC+DE;EhChEF;EACA;;AgCoEA;EhCrEA;EACA;;;AgC0EJ;EACE;;;AASA;EACE;EACA;EhC9GA;;AgCiHA;EAAgB;;AAChB;EAAe;;AAGf;AAAA;AAAA;EhCrHA;;;AgCgIA;EACE;EACA;;;ACrJN;EAEE;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;ErC+QI,WALI;EqCxQR;EACA;EjCAE;;;AiCMF;EACE;;AAEA;EACE;EACA;EACA;EACA;;AAIJ;EACE;;;ACrCJ;EAEE;EACA;EtC4RI,2BALI;EsCrRR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EhCpBA;EACA;;;AgCuBF;EACE;EACA;EACA;EtCgQI,WALI;EsCzPR;EACA;EACA;EACA;EnBpBI,YmBqBJ;;AnBjBI;EmBQN;InBPQ;;;AmBkBN;EACE;EACA;EAEA;EACA;;AAGF;EACE;EACA;EACA;EACA,SnC2uCgC;EmC1uChC;;AAGF;EAEE;EACA;ElBtDF,kBkBuDuB;EACrB;;AAGF;EAEE;EACA;EACA;EACA;;;AAKF;EACE,anC8sCgC;;AmCzsC9B;ElC9BF;EACA;;AkCmCE;ElClDF;EACA;;;AkCkEJ;EClGE;EACA;EvC0RI,2BALI;EuCnRR;;;ADmGF;ECtGE;EACA;EvC0RI,2BALI;EuCnRR;;;ACFF;EAEE;EACA;ExCuRI,sBALI;EwChRR;EACA;EACA;EAGA;EACA;ExC+QI,WALI;EwCxQR;EACA;EACA;EACA;EACA;EACA;EpCJE;;AoCSF;EACE;;;AAKJ;EACE;EACA;;;AChCF;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;ErCHE;;;AqCQJ;EAEE;;;AAIF;EACE,atC6kB4B;EsC5kB5B;;;AAQF;EACE,etCs+C8B;;AsCn+C9B;EACE;EACA;EACA;EACA;EACA;;;AAQF;EACE;EACA;EACA;EACA;;;AAJF;EACE;EACA;EACA;EACA;;;AAJF;EACE;EACA;EACA;EACA;;;AAJF;EACE;EACA;EACA;EACA;;;AAJF;EACE;EACA;EACA;EACA;;;AAJF;EACE;EACA;EACA;EACA;;;AAJF;EACE;EACA;EACA;EACA;;;AAJF;EACE;EACA;EACA;EACA;;;AC5DF;EACE;IAAK;;;AAKT;AAAA;EAGE;E1CkRI,yBALI;E0C3QR;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;E1CsQI,WALI;E0C/PR;EtCRE;;;AsCaJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EvBxBI,YuByBJ;;AvBrBI;EuBYN;IvBXQ;;;;AuBuBR;EtBAE;EsBEA;;;AAGF;EACE;;;AAGF;EACE;;;AAIA;EACE;;AAGE;EAJJ;IAKM;;;;AC3DR;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EAGA;EACA;EvCXE;;;AuCeJ;EACE;EACA;;AAEA;EAEE;EACA;;;AAQJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EvC9BE;EACA;;AuCiCF;EvCpBE;EACA;;AuCuBF;EAEE;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;;AAIF;EACE;;AAEA;EACE;EACA;;;AAUN;EACE;EACA;EACA;;AAIE;EAEE;EACA;EACA;EACA;;AAGF;EACE;EACA;;;AAaF;EACE;;AAGE;EvCzDJ;EAZA;;AuC0EI;EvC1EJ;EAYA;;AuCmEI;EACE;;AAGF;EACE;EACA;;AAEA;EACE;EACA;;;AhCxFR;EgCgEA;IACE;;EAGE;IvCzDJ;IAZA;;EuC0EI;IvC1EJ;IAYA;;EuCmEI;IACE;;EAGF;IACE;IACA;;EAEA;IACE;IACA;;;AhCxFR;EgCgEA;IACE;;EAGE;IvCzDJ;IAZA;;EuC0EI;IvC1EJ;IAYA;;EuCmEI;IACE;;EAGF;IACE;IACA;;EAEA;IACE;IACA;;;AhCxFR;EgCgEA;IACE;;EAGE;IvCzDJ;IAZA;;EuC0EI;IvC1EJ;IAYA;;EuCmEI;IACE;;EAGF;IACE;IACA;;EAEA;IACE;IACA;;;AhCxFR;EgCgEA;IACE;;EAGE;IvCzDJ;IAZA;;EuC0EI;IvC1EJ;IAYA;;EuCmEI;IACE;;EAGF;IACE;IACA;;EAEA;IACE;IACA;;;AhCxFR;EgCgEA;IACE;;EAGE;IvCzDJ;IAZA;;EuC0EI;IvC1EJ;IAYA;;EuCmEI;IACE;;EAGF;IACE;IACA;;EAEA;IACE;IACA;;;AAcZ;EvClJI;;AuCqJF;EACE;;AAEA;EACE;;;AAaJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAVF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAVF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAVF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAVF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAVF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAVF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAVF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AC9LJ;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA,OzCupD2B;EyCtpD3B,QzCspD2B;EyCrpD3B;EACA;EACA;EACA;EACA;ExCJE;EwCMF;;AAGA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EAEE;EACA;EACA;;;AAQJ;EAHE;;;AAOF;AAAA;EAEE;;;A3C3CE;E2CkCF;;;ACjDF;EAEE;EACA;EACA;EACA;EACA;E7CyRI,sBALI;E6ClRR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;E7C2QI,WALI;E6CpQR;EACA;EACA;EACA;EACA;EACA;EzCRE;;AyCWF;EACE;;AAGF;EACE;;;AAIJ;EACE;EAEA;EACA;EACA;EACA;EACA;;AAEA;EACE;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EzChCE;EACA;;AyCkCF;EACE;EACA;;;AAIJ;EACE;EACA;;;AC9DF;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;;;AAOF;EACE;EACA;EACA;EAEA;;AAGA;EACE,W3Cm8CgC;EgBh/C9B,Y2B8CF;;A3B1CE;E2BwCJ;I3BvCM;;;A2B2CN;EACE,W3Cg8CgC;;A2C57ClC;EACE,W3C67CgC;;;A2Cz7CpC;EACE;;AAEA;EACE;EACA;;AAGF;EACE;;;AAIJ;EACE;EACA;EACA;;;AAIF;EACE;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;E1CrFE;E0CyFF;;;AAIF;EAEE;EACA;EACA;EClHA;EACA;EACA;EACA,SDkH0B;ECjH1B;EACA;EACA,kBD+G4D;;AC5G5D;EAAS;;AACT;EAAS,SD2GiF;;;AAK5F;EACE;EACA;EACA;EACA;EACA;E1CrGE;EACA;;A0CuGF;EACE;EAEA;EACA;EACA;EACA;;;AAKJ;EACE;EACA;;;AAKF;EACE;EAGA;EACA;;;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IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;;EAGF;IAEE;;EAGF;IAGE;;;A3C5BJ;E2C/BF;IAiEM;IACA;IACA;;EAEA;IACE;;EAGF;IACE;IACA;IACA;IACA;IAEA;;;;A3CnCN;E2C5CF;IAEI;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;InC5BA,YmC8BA;;;AnC1BA;EmCYJ;InCXM;;;ARuDJ;E2C5BE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;;EAGF;IAEE;;EAGF;IAGE;;;A3C5BJ;E2C/BF;IAiEM;IACA;IACA;;EAEA;IACE;;EAGF;IACE;IACA;IACA;IACA;IAEA;;;;A3CnCN;E2C5CF;IAEI;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;InC5BA,YmC8BA;;;AnC1BA;EmCYJ;InCXM;;;ARuDJ;E2C5BE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;;EAGF;IAEE;;EAGF;IAGE;;;A3C5BJ;E2C/BF;IAiEM;IACA;IACA;;EAEA;IACE;;EAGF;IACE;IACA;IACA;IACA;IAEA;;;;A3CnCN;E2C5CF;IAEI;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;InC5BA,YmC8BA;;;AnC1BA;EmCYJ;InCXM;;;ARuDJ;E2C5BE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;;EAGF;IAEE;;EAGF;IAGE;;;A3C5BJ;E2C/BF;IAiEM;IACA;IACA;;EAEA;IACE;;EAGF;IACE;IACA;IACA;IACA;IAEA;;;;A3CnCN;E2C5CF;IAEI;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;InC5BA,YmC8BA;;;AnC1BA;EmCYJ;InCXM;;;ARuDJ;E2C5BE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;;EAGF;IAEE;;EAGF;IAGE;;;A3C5BJ;E2C/BF;IAiEM;IACA;IACA;;EAEA;IACE;;EAGF;IACE;IACA;IACA;IACA;IAEA;;;;AA/ER;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EnC5BA,YmC8BA;;AnC1BA;EmCYJ;InCXM;;;AmC2BF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EAEE;;AAGF;EAGE;;;AA2BR;EPpHE;EACA;EACA;EACA,S5C0mCkC;E4CzmClC;EACA;EACA,kB5CUS;;A4CPT;EAAS;;AACT;EAAS,S5Cm+CyB;;;AmDr3CpC;EACE;EACA;EACA;;AAEA;EACE;EAEA;EACA;EACA;EACA;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;ACjJF;EACE;EACA;EACA;EACA;EACA;EACA,SpDgzCkC;;AoD9yClC;EACE;EACA;;;AAKJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKA;EACE;;;AAIJ;EACE;IACE,SpDmxCgC;;;AoD/wCpC;EACE;EACA;EACA;;;AAGF;EACE;IACE;;;AH9CF;EACE;EACA;EACA;;;AIHF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;ACFF;EACE;EACA;;AAGE;EAGE;EACA;;;AATN;EACE;EACA;;AAGE;EAGE;EACA;;;AATN;EACE;EACA;;AAGE;EAGE;EACA;;;AATN;EACE;EACA;;AAGE;EAGE;EACA;;;AATN;EACE;EACA;;AAGE;EAGE;EACA;;;AATN;EACE;EACA;;AAGE;EAGE;EACA;;;AATN;EACE;EACA;;AAGE;EAGE;EACA;;;AATN;EACE;EACA;;AAGE;EAGE;EACA;;;AAOR;EACE;EACA;;AAGE;EAEE;EACA;;;AC1BN;EACE;EAEA;;;ACHF;EACE;EACA,KxD6c4B;EwD5c5B;EACA;EACA,uBxD2c4B;EwD1c5B;;AAEA;EACE;EACA,OxDuc0B;EwDtc1B,QxDsc0B;EwDrc1B;ExCIE,YwCHF;;AxCOE;EwCZJ;IxCaM;;;;AwCDJ;EACE;;;ACnBN;EACE;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAKF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;ACrBJ;EACE;EACA;EACA;EACA;EACA,S1DumCkC;;;A0DpmCpC;EACE;EACA;EACA;EACA;EACA,S1D+lCkC;;;A0DvlChC;EACE;EACA;EACA,S1DmlC8B;;;A0DhlChC;EACE;EACA;EACA,S1D6kC8B;;;AQ9iChC;EkDxCA;IACE;IACA;IACA,S1DmlC8B;;E0DhlChC;IACE;IACA;IACA,S1D6kC8B;;;AQ9iChC;EkDxCA;IACE;IACA;IACA,S1DmlC8B;;E0DhlChC;IACE;IACA;IACA,S1D6kC8B;;;AQ9iChC;EkDxCA;IACE;IACA;IACA,S1DmlC8B;;E0DhlChC;IACE;IACA;IACA,S1D6kC8B;;;AQ9iChC;EkDxCA;IACE;IACA;IACA,S1DmlC8B;;E0DhlChC;IACE;IACA;IACA,S1D6kC8B;;;AQ9iChC;EkDxCA;IACE;IACA;IACA,S1DmlC8B;;E0DhlChC;IACE;IACA;IACA,S1D6kC8B;;;A2D5mCpC;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;ACRF;AAAA;ECIE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGA;AAAA;EACE;;AAIF;AAAA;EACE;;;ACnBF;EACE;EACA;EACA;EACA;EACA;EACA,S9DgcsC;E8D/btC;;;ACRJ;ECAE;EACA;EACA;;;ACNF;EACE;EACA;EACA,OjEisB4B;EiEhsB5B;EACA;EACA,SjE2rB4B;;;AkE/nBtB;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAjBJ;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AASF;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAjBJ;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AASF;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAP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AOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;A1DVR;E0DGI;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;;A1DVR;E0DGI;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;;A1DVR;E0DGI;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;;A1DVR;E0DGI;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;;A1DVR;E0DGI;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;;ACtDZ;ED+CQ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;;ACnCZ;ED4BQ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;;AExEZ;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AC7FF;EACE;EACA;EACA;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;ACnIF;EACE;EACA;EACA;EACA;EACA;;ACNF;ACEA;AAAA;EAEE;;;AAGF;AAAA;EAEE;EACA;EACA;;;AAGF;EACE,aCRU;;;ADWZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAME,aCrBc;EDsBd;;;AExBF;EACE;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA","file":"main.css"} \ No newline at end of file diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-500.woff2 b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-500.woff2 deleted file mode 100644 index 64d6e11..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-500.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-500italic.woff2 b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-500italic.woff2 deleted file mode 100644 index 8e3e680..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-500italic.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-600.woff2 b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-600.woff2 deleted file mode 100644 index c19fbc1..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-600.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-600italic.woff2 b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-600italic.woff2 deleted file mode 100644 index 78abff9..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-600italic.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-700.woff2 b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-700.woff2 deleted file mode 100644 index 39eefe0..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-700.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-700italic.woff2 b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-700italic.woff2 deleted file mode 100644 index d7f6b28..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-700italic.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-800.woff2 b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-800.woff2 deleted file mode 100644 index 1128d50..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-800.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-800italic.woff2 b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-800italic.woff2 deleted file mode 100644 index dc86c01..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-800italic.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-900.woff2 b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-900.woff2 deleted file mode 100644 index 87eff24..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-900.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-900italic.woff2 b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-900italic.woff2 deleted file mode 100644 index 61fa874..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-900italic.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-italic.woff2 b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-italic.woff2 deleted file mode 100644 index 30828de..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-italic.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-regular.woff2 b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-regular.woff2 deleted file mode 100644 index 141ea84..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-regular.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-200.woff2 b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-200.woff2 deleted file mode 100644 index 1a88824..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-200.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-200italic.woff2 b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-200italic.woff2 deleted file mode 100644 index 24c53f0..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-200italic.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-300.woff2 b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-300.woff2 deleted file mode 100644 index b47991a..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-300.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-300italic.woff2 b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-300italic.woff2 deleted file mode 100644 index e24cd5a..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-300italic.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-500.woff2 b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-500.woff2 deleted file mode 100644 index 5918916..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-500.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-500italic.woff2 b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-500italic.woff2 deleted file mode 100644 index 0706a1f..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-500italic.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-600.woff2 b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-600.woff2 deleted file mode 100644 index 9351177..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-600.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-600italic.woff2 b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-600italic.woff2 deleted file mode 100644 index b216f26..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-600italic.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-700.woff2 b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-700.woff2 deleted file mode 100644 index 3cb944c..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-700.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-700italic.woff2 b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-700italic.woff2 deleted file mode 100644 index f9a6d5f..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-700italic.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-800.woff2 b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-800.woff2 deleted file mode 100644 index cd37781..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-800.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-800italic.woff2 b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-800italic.woff2 deleted file mode 100644 index 7f43c11..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-800italic.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-900.woff2 b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-900.woff2 deleted file mode 100644 index c3ac211..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-900.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-900italic.woff2 b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-900italic.woff2 deleted file mode 100644 index cc339ed..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-900italic.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-italic.woff2 b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-italic.woff2 deleted file mode 100644 index 515b6b3..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-italic.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-regular.woff2 b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-regular.woff2 deleted file mode 100644 index 0c4242e..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-regular.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/special-elite-v20-latin/special-elite-v20-latin-regular.woff2 b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/special-elite-v20-latin/special-elite-v20-latin-regular.woff2 deleted file mode 100644 index 569a27e..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/fonts/special-elite-v20-latin/special-elite-v20-latin-regular.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/img/bg-concrete.jpg b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/img/bg-concrete.jpg deleted file mode 100644 index 56b8bf1..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/img/bg-concrete.jpg and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/img/bg-donkey.png b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/img/bg-donkey.png deleted file mode 100644 index b97bf74..0000000 Binary files a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/img/bg-donkey.png and /dev/null differ diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/js/build.js b/02_advanced/unterricht/tag18/01_ajax-jokes/assets/js/build.js deleted file mode 100644 index 3c27e1c..0000000 --- a/02_advanced/unterricht/tag18/01_ajax-jokes/assets/js/build.js +++ /dev/null @@ -1,5926 +0,0 @@ -(() => { - // node_modules/jquery/dist-module/jquery.module.js - function jQueryFactory(window2, noGlobal) { - if (typeof window2 === "undefined" || !window2.document) { - throw new Error("jQuery requires a window with a document"); - } - var arr = []; - var getProto = Object.getPrototypeOf; - var slice = arr.slice; - var flat = arr.flat ? function(array) { - return arr.flat.call(array); - } : function(array) { - return arr.concat.apply([], array); - }; - var push = arr.push; - var indexOf = arr.indexOf; - var class2type = {}; - var toString = class2type.toString; - var hasOwn = class2type.hasOwnProperty; - var fnToString = hasOwn.toString; - var ObjectFunctionString = fnToString.call(Object); - var support = {}; - function toType(obj) { - if (obj == null) { - return obj + ""; - } - return typeof obj === "object" ? class2type[toString.call(obj)] || "object" : typeof obj; - } - function isWindow(obj) { - return obj != null && obj === obj.window; - } - function isArrayLike(obj) { - var length = !!obj && obj.length, type = toType(obj); - if (typeof obj === "function" || isWindow(obj)) { - return false; - } - return type === "array" || length === 0 || typeof length === "number" && length > 0 && length - 1 in obj; - } - var document$1 = window2.document; - var preservedScriptAttributes = { - type: true, - src: true, - nonce: true, - noModule: true - }; - function DOMEval(code, node, doc) { - doc = doc || document$1; - var i2, script = doc.createElement("script"); - script.text = code; - for (i2 in preservedScriptAttributes) { - if (node && node[i2]) { - script[i2] = node[i2]; - } - } - if (doc.head.appendChild(script).parentNode) { - script.parentNode.removeChild(script); - } - } - var version = "4.0.0", rhtmlSuffix = /HTML$/i, jQuery2 = function(selector, context) { - return new jQuery2.fn.init(selector, context); - }; - jQuery2.fn = jQuery2.prototype = { - // The current version of jQuery being used - jquery: version, - constructor: jQuery2, - // The default length of a jQuery object is 0 - length: 0, - toArray: function() { - return slice.call(this); - }, - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function(num) { - if (num == null) { - return slice.call(this); - } - return num < 0 ? this[num + this.length] : this[num]; - }, - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function(elems) { - var ret = jQuery2.merge(this.constructor(), elems); - ret.prevObject = this; - return ret; - }, - // Execute a callback for every element in the matched set. - each: function(callback) { - return jQuery2.each(this, callback); - }, - map: function(callback) { - return this.pushStack(jQuery2.map(this, function(elem, i2) { - return callback.call(elem, i2, elem); - })); - }, - slice: function() { - return this.pushStack(slice.apply(this, arguments)); - }, - first: function() { - return this.eq(0); - }, - last: function() { - return this.eq(-1); - }, - even: function() { - return this.pushStack(jQuery2.grep(this, function(_elem, i2) { - return (i2 + 1) % 2; - })); - }, - odd: function() { - return this.pushStack(jQuery2.grep(this, function(_elem, i2) { - return i2 % 2; - })); - }, - eq: function(i2) { - var len = this.length, j = +i2 + (i2 < 0 ? len : 0); - return this.pushStack(j >= 0 && j < len ? [this[j]] : []); - }, - end: function() { - return this.prevObject || this.constructor(); - } - }; - jQuery2.extend = jQuery2.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, target = arguments[0] || {}, i2 = 1, length = arguments.length, deep = false; - if (typeof target === "boolean") { - deep = target; - target = arguments[i2] || {}; - i2++; - } - if (typeof target !== "object" && typeof target !== "function") { - target = {}; - } - if (i2 === length) { - target = this; - i2--; - } - for (; i2 < length; i2++) { - if ((options = arguments[i2]) != null) { - for (name in options) { - copy = options[name]; - if (name === "__proto__" || target === copy) { - continue; - } - if (deep && copy && (jQuery2.isPlainObject(copy) || (copyIsArray = Array.isArray(copy)))) { - src = target[name]; - if (copyIsArray && !Array.isArray(src)) { - clone = []; - } else if (!copyIsArray && !jQuery2.isPlainObject(src)) { - clone = {}; - } else { - clone = src; - } - copyIsArray = false; - target[name] = jQuery2.extend(deep, clone, copy); - } else if (copy !== void 0) { - target[name] = copy; - } - } - } - } - return target; - }; - jQuery2.extend({ - // Unique for each copy of jQuery on the page - expando: "jQuery" + (version + Math.random()).replace(/\D/g, ""), - // Assume jQuery is ready without the ready module - isReady: true, - error: function(msg) { - throw new Error(msg); - }, - noop: function() { - }, - isPlainObject: function(obj) { - var proto, Ctor; - if (!obj || toString.call(obj) !== "[object Object]") { - return false; - } - proto = getProto(obj); - if (!proto) { - return true; - } - Ctor = hasOwn.call(proto, "constructor") && proto.constructor; - return typeof Ctor === "function" && fnToString.call(Ctor) === ObjectFunctionString; - }, - isEmptyObject: function(obj) { - var name; - for (name in obj) { - return false; - } - return true; - }, - // Evaluates a script in a provided context; falls back to the global one - // if not specified. - globalEval: function(code, options, doc) { - DOMEval(code, { nonce: options && options.nonce }, doc); - }, - each: function(obj, callback) { - var length, i2 = 0; - if (isArrayLike(obj)) { - length = obj.length; - for (; i2 < length; i2++) { - if (callback.call(obj[i2], i2, obj[i2]) === false) { - break; - } - } - } else { - for (i2 in obj) { - if (callback.call(obj[i2], i2, obj[i2]) === false) { - break; - } - } - } - return obj; - }, - // Retrieve the text value of an array of DOM nodes - text: function(elem) { - var node, ret = "", i2 = 0, nodeType = elem.nodeType; - if (!nodeType) { - while (node = elem[i2++]) { - ret += jQuery2.text(node); - } - } - if (nodeType === 1 || nodeType === 11) { - return elem.textContent; - } - if (nodeType === 9) { - return elem.documentElement.textContent; - } - if (nodeType === 3 || nodeType === 4) { - return elem.nodeValue; - } - return ret; - }, - // results is for internal usage only - makeArray: function(arr2, results) { - var ret = results || []; - if (arr2 != null) { - if (isArrayLike(Object(arr2))) { - jQuery2.merge( - ret, - typeof arr2 === "string" ? [arr2] : arr2 - ); - } else { - push.call(ret, arr2); - } - } - return ret; - }, - inArray: function(elem, arr2, i2) { - return arr2 == null ? -1 : indexOf.call(arr2, elem, i2); - }, - isXMLDoc: function(elem) { - var namespace = elem && elem.namespaceURI, docElem = elem && (elem.ownerDocument || elem).documentElement; - return !rhtmlSuffix.test(namespace || docElem && docElem.nodeName || "HTML"); - }, - // Note: an element does not contain itself - contains: function(a, b) { - var bup = b && b.parentNode; - return a === bup || !!(bup && bup.nodeType === 1 && // Support: IE 9 - 11+ - // IE doesn't have `contains` on SVG. - (a.contains ? a.contains(bup) : a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16)); - }, - merge: function(first, second) { - var len = +second.length, j = 0, i2 = first.length; - for (; j < len; j++) { - first[i2++] = second[j]; - } - first.length = i2; - return first; - }, - grep: function(elems, callback, invert) { - var callbackInverse, matches2 = [], i2 = 0, length = elems.length, callbackExpect = !invert; - for (; i2 < length; i2++) { - callbackInverse = !callback(elems[i2], i2); - if (callbackInverse !== callbackExpect) { - matches2.push(elems[i2]); - } - } - return matches2; - }, - // arg is for internal usage only - map: function(elems, callback, arg) { - var length, value, i2 = 0, ret = []; - if (isArrayLike(elems)) { - length = elems.length; - for (; i2 < length; i2++) { - value = callback(elems[i2], i2, arg); - if (value != null) { - ret.push(value); - } - } - } else { - for (i2 in elems) { - value = callback(elems[i2], i2, arg); - if (value != null) { - ret.push(value); - } - } - } - return flat(ret); - }, - // A global GUID counter for objects - guid: 1, - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support - }); - if (typeof Symbol === "function") { - jQuery2.fn[Symbol.iterator] = arr[Symbol.iterator]; - } - jQuery2.each( - "Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "), - function(_i, name) { - class2type["[object " + name + "]"] = name.toLowerCase(); - } - ); - function nodeName(elem, name) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - } - var pop = arr.pop; - var whitespace = "[\\x20\\t\\r\\n\\f]"; - var isIE = document$1.documentMode; - var rbuggyQSA = isIE && new RegExp( - // Support: IE 9 - 11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - ":enabled|:disabled|\\[" + whitespace + "*name" + whitespace + "*=" + whitespace + `*(?:''|"")` - ); - var rtrimCSS = new RegExp( - "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", - "g" - ); - var identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+"; - var rleadingCombinator = new RegExp("^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*"); - var rdescend = new RegExp(whitespace + "|>"); - var rsibling = /[+~]/; - var documentElement$1 = document$1.documentElement; - var matches = documentElement$1.matches || documentElement$1.msMatchesSelector; - function createCache() { - var keys = []; - function cache(key, value) { - if (keys.push(key + " ") > jQuery2.expr.cacheLength) { - delete cache[keys.shift()]; - } - return cache[key + " "] = value; - } - return cache; - } - function testContext(context) { - return context && typeof context.getElementsByTagName !== "undefined" && context; - } - var attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - `*(?:'((?:\\\\.|[^\\\\'])*)'|"((?:\\\\.|[^\\\\"])*)"|(` + identifier + "))|)" + whitespace + "*\\]"; - var pseudos = ":(" + identifier + `)(?:\\((('((?:\\\\.|[^\\\\'])*)'|"((?:\\\\.|[^\\\\"])*)")|((?:\\\\.|[^\\\\()[\\]]|` + attributes + ")*)|.*)\\)|)"; - var filterMatchExpr = { - ID: new RegExp("^#(" + identifier + ")"), - CLASS: new RegExp("^\\.(" + identifier + ")"), - TAG: new RegExp("^(" + identifier + "|[*])"), - ATTR: new RegExp("^" + attributes), - PSEUDO: new RegExp("^" + pseudos), - CHILD: new RegExp( - "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", - "i" - ) - }; - var rpseudo = new RegExp(pseudos); - var runescape = new RegExp("\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g"), funescape = function(escape, nonHex) { - var high = "0x" + escape.slice(1) - 65536; - if (nonHex) { - return nonHex; - } - return high < 0 ? String.fromCharCode(high + 65536) : String.fromCharCode(high >> 10 | 55296, high & 1023 | 56320); - }; - function unescapeSelector(sel) { - return sel.replace(runescape, funescape); - } - function selectorError(msg) { - jQuery2.error("Syntax error, unrecognized expression: " + msg); - } - var rcomma = new RegExp("^" + whitespace + "*," + whitespace + "*"); - var tokenCache = createCache(); - function tokenize(selector, parseOnly) { - var matched, match, tokens, type, soFar, groups, preFilters, cached = tokenCache[selector + " "]; - if (cached) { - return parseOnly ? 0 : cached.slice(0); - } - soFar = selector; - groups = []; - preFilters = jQuery2.expr.preFilter; - while (soFar) { - if (!matched || (match = rcomma.exec(soFar))) { - if (match) { - soFar = soFar.slice(match[0].length) || soFar; - } - groups.push(tokens = []); - } - matched = false; - if (match = rleadingCombinator.exec(soFar)) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace(rtrimCSS, " ") - }); - soFar = soFar.slice(matched.length); - } - for (type in filterMatchExpr) { - if ((match = jQuery2.expr.match[type].exec(soFar)) && (!preFilters[type] || (match = preFilters[type](match)))) { - matched = match.shift(); - tokens.push({ - value: matched, - type, - matches: match - }); - soFar = soFar.slice(matched.length); - } - } - if (!matched) { - break; - } - } - if (parseOnly) { - return soFar.length; - } - return soFar ? selectorError(selector) : ( - // Cache the tokens - tokenCache(selector, groups).slice(0) - ); - } - var preFilter = { - ATTR: function(match) { - match[1] = unescapeSelector(match[1]); - match[3] = unescapeSelector(match[3] || match[4] || match[5] || ""); - if (match[2] === "~=") { - match[3] = " " + match[3] + " "; - } - return match.slice(0, 4); - }, - CHILD: function(match) { - match[1] = match[1].toLowerCase(); - if (match[1].slice(0, 3) === "nth") { - if (!match[3]) { - selectorError(match[0]); - } - match[4] = +(match[4] ? match[5] + (match[6] || 1) : 2 * (match[3] === "even" || match[3] === "odd")); - match[5] = +(match[7] + match[8] || match[3] === "odd"); - } else if (match[3]) { - selectorError(match[0]); - } - return match; - }, - PSEUDO: function(match) { - var excess, unquoted = !match[6] && match[2]; - if (filterMatchExpr.CHILD.test(match[0])) { - return null; - } - if (match[3]) { - match[2] = match[4] || match[5] || ""; - } else if (unquoted && rpseudo.test(unquoted) && // Get excess from tokenize (recursively) - (excess = tokenize(unquoted, true)) && // advance to the next closing parenthesis - (excess = unquoted.indexOf(")", unquoted.length - excess) - unquoted.length)) { - match[0] = match[0].slice(0, excess); - match[2] = unquoted.slice(0, excess); - } - return match.slice(0, 3); - } - }; - function toSelector(tokens) { - var i2 = 0, len = tokens.length, selector = ""; - for (; i2 < len; i2++) { - selector += tokens[i2].value; - } - return selector; - } - function access(elems, fn, key, value, chainable, emptyGet, raw) { - var i2 = 0, len = elems.length, bulk = key == null; - if (toType(key) === "object") { - chainable = true; - for (i2 in key) { - access(elems, fn, i2, key[i2], true, emptyGet, raw); - } - } else if (value !== void 0) { - chainable = true; - if (typeof value !== "function") { - raw = true; - } - if (bulk) { - if (raw) { - fn.call(elems, value); - fn = null; - } else { - bulk = fn; - fn = function(elem, _key, value2) { - return bulk.call(jQuery2(elem), value2); - }; - } - } - if (fn) { - for (; i2 < len; i2++) { - fn( - elems[i2], - key, - raw ? value : value.call(elems[i2], i2, fn(elems[i2], key)) - ); - } - } - } - if (chainable) { - return elems; - } - if (bulk) { - return fn.call(elems); - } - return len ? fn(elems[0], key) : emptyGet; - } - var rnothtmlwhite = /[^\x20\t\r\n\f]+/g; - jQuery2.fn.extend({ - attr: function(name, value) { - return access(this, jQuery2.attr, name, value, arguments.length > 1); - }, - removeAttr: function(name) { - return this.each(function() { - jQuery2.removeAttr(this, name); - }); - } - }); - jQuery2.extend({ - attr: function(elem, name, value) { - var ret, hooks, nType = elem.nodeType; - if (nType === 3 || nType === 8 || nType === 2) { - return; - } - if (typeof elem.getAttribute === "undefined") { - return jQuery2.prop(elem, name, value); - } - if (nType !== 1 || !jQuery2.isXMLDoc(elem)) { - hooks = jQuery2.attrHooks[name.toLowerCase()]; - } - if (value !== void 0) { - if (value === null || // For compat with previous handling of boolean attributes, - // remove when `false` passed. For ARIA attributes - - // many of which recognize a `"false"` value - continue to - // set the `"false"` value as jQuery <4 did. - value === false && name.toLowerCase().indexOf("aria-") !== 0) { - jQuery2.removeAttr(elem, name); - return; - } - if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== void 0) { - return ret; - } - elem.setAttribute(name, value); - return value; - } - if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) { - return ret; - } - ret = elem.getAttribute(name); - return ret == null ? void 0 : ret; - }, - attrHooks: {}, - removeAttr: function(elem, value) { - var name, i2 = 0, attrNames = value && value.match(rnothtmlwhite); - if (attrNames && elem.nodeType === 1) { - while (name = attrNames[i2++]) { - elem.removeAttribute(name); - } - } - } - }); - if (isIE) { - jQuery2.attrHooks.type = { - set: function(elem, value) { - if (value === "radio" && nodeName(elem, "input")) { - var val = elem.value; - elem.setAttribute("type", value); - if (val) { - elem.value = val; - } - return value; - } - } - }; - } - var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; - function fcssescape(ch, asCodePoint) { - if (asCodePoint) { - if (ch === "\0") { - return "\uFFFD"; - } - return ch.slice(0, -1) + "\\" + ch.charCodeAt(ch.length - 1).toString(16) + " "; - } - return "\\" + ch; - } - jQuery2.escapeSelector = function(sel) { - return (sel + "").replace(rcssescape, fcssescape); - }; - var sort = arr.sort; - var splice = arr.splice; - var hasDuplicate; - function sortOrder(a, b) { - if (a === b) { - hasDuplicate = true; - return 0; - } - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if (compare) { - return compare; - } - compare = (a.ownerDocument || a) == (b.ownerDocument || b) ? a.compareDocumentPosition(b) : ( - // Otherwise we know they are disconnected - 1 - ); - if (compare & 1) { - if (a == document$1 || a.ownerDocument == document$1 && jQuery2.contains(document$1, a)) { - return -1; - } - if (b == document$1 || b.ownerDocument == document$1 && jQuery2.contains(document$1, b)) { - return 1; - } - return 0; - } - return compare & 4 ? -1 : 1; - } - jQuery2.uniqueSort = function(results) { - var elem, duplicates = [], j = 0, i2 = 0; - hasDuplicate = false; - sort.call(results, sortOrder); - if (hasDuplicate) { - while (elem = results[i2++]) { - if (elem === results[i2]) { - j = duplicates.push(i2); - } - } - while (j--) { - splice.call(results, duplicates[j], 1); - } - } - return results; - }; - jQuery2.fn.uniqueSort = function() { - return this.pushStack(jQuery2.uniqueSort(slice.apply(this))); - }; - var i, outermostContext, document2, documentElement, documentIsHTML, dirruns = 0, done = 0, classCache = createCache(), compilerCache = createCache(), nonnativeSelectorCache = createCache(), rwhitespace = new RegExp(whitespace + "+", "g"), ridentifier = new RegExp("^" + identifier + "$"), matchExpr = jQuery2.extend({ - // For use in libraries implementing .is() - // We use this for POS matching in `select` - needsContext: new RegExp("^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i") - }, filterMatchExpr), rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\d$/i, rquickExpr$1 = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, unloadHandler = function() { - setDocument(); - }, inDisabledFieldset = addCombinator( - function(elem) { - return elem.disabled === true && nodeName(elem, "fieldset"); - }, - { dir: "parentNode", next: "legend" } - ); - function find(selector, context, results, seed) { - var m, i2, elem, nid, match, groups, newSelector, newContext = context && context.ownerDocument, nodeType = context ? context.nodeType : 9; - results = results || []; - if (typeof selector !== "string" || !selector || nodeType !== 1 && nodeType !== 9 && nodeType !== 11) { - return results; - } - if (!seed) { - setDocument(context); - context = context || document2; - if (documentIsHTML) { - if (nodeType !== 11 && (match = rquickExpr$1.exec(selector))) { - if (m = match[1]) { - if (nodeType === 9) { - if (elem = context.getElementById(m)) { - push.call(results, elem); - } - return results; - } else { - if (newContext && (elem = newContext.getElementById(m)) && jQuery2.contains(context, elem)) { - push.call(results, elem); - return results; - } - } - } else if (match[2]) { - push.apply(results, context.getElementsByTagName(selector)); - return results; - } else if ((m = match[3]) && context.getElementsByClassName) { - push.apply(results, context.getElementsByClassName(m)); - return results; - } - } - if (!nonnativeSelectorCache[selector + " "] && (!rbuggyQSA || !rbuggyQSA.test(selector))) { - newSelector = selector; - newContext = context; - if (nodeType === 1 && (rdescend.test(selector) || rleadingCombinator.test(selector))) { - newContext = rsibling.test(selector) && testContext(context.parentNode) || context; - if (newContext != context || isIE) { - if (nid = context.getAttribute("id")) { - nid = jQuery2.escapeSelector(nid); - } else { - context.setAttribute("id", nid = jQuery2.expando); - } - } - groups = tokenize(selector); - i2 = groups.length; - while (i2--) { - groups[i2] = (nid ? "#" + nid : ":scope") + " " + toSelector(groups[i2]); - } - newSelector = groups.join(","); - } - try { - push.apply( - results, - newContext.querySelectorAll(newSelector) - ); - return results; - } catch (qsaError) { - nonnativeSelectorCache(selector, true); - } finally { - if (nid === jQuery2.expando) { - context.removeAttribute("id"); - } - } - } - } - } - return select(selector.replace(rtrimCSS, "$1"), context, results, seed); - } - function markFunction(fn) { - fn[jQuery2.expando] = true; - return fn; - } - function createInputPseudo(type) { - return function(elem) { - return nodeName(elem, "input") && elem.type === type; - }; - } - function createButtonPseudo(type) { - return function(elem) { - return (nodeName(elem, "input") || nodeName(elem, "button")) && elem.type === type; - }; - } - function createDisabledPseudo(disabled) { - return function(elem) { - if ("form" in elem) { - if (elem.parentNode && elem.disabled === false) { - if ("label" in elem) { - if ("label" in elem.parentNode) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - return elem.isDisabled === disabled || // Where there is no isDisabled, check manually - elem.isDisabled !== !disabled && inDisabledFieldset(elem) === disabled; - } - return elem.disabled === disabled; - } else if ("label" in elem) { - return elem.disabled === disabled; - } - return false; - }; - } - function createPositionalPseudo(fn) { - return markFunction(function(argument) { - argument = +argument; - return markFunction(function(seed, matches2) { - var j, matchIndexes = fn([], seed.length, argument), i2 = matchIndexes.length; - while (i2--) { - if (seed[j = matchIndexes[i2]]) { - seed[j] = !(matches2[j] = seed[j]); - } - } - }); - }); - } - function setDocument(node) { - var subWindow, doc = node ? node.ownerDocument || node : document$1; - if (doc == document2 || doc.nodeType !== 9) { - return; - } - document2 = doc; - documentElement = document2.documentElement; - documentIsHTML = !jQuery2.isXMLDoc(document2); - if (isIE && document$1 != document2 && (subWindow = document2.defaultView) && subWindow.top !== subWindow) { - subWindow.addEventListener("unload", unloadHandler); - } - } - find.matches = function(expr, elements) { - return find(expr, null, null, elements); - }; - find.matchesSelector = function(elem, expr) { - setDocument(elem); - if (documentIsHTML && !nonnativeSelectorCache[expr + " "] && (!rbuggyQSA || !rbuggyQSA.test(expr))) { - try { - return matches.call(elem, expr); - } catch (e) { - nonnativeSelectorCache(expr, true); - } - } - return find(expr, document2, null, [elem]).length > 0; - }; - jQuery2.expr = { - // Can be adjusted by the user - cacheLength: 50, - createPseudo: markFunction, - match: matchExpr, - find: { - ID: function(id, context) { - if (typeof context.getElementById !== "undefined" && documentIsHTML) { - var elem = context.getElementById(id); - return elem ? [elem] : []; - } - }, - TAG: function(tag, context) { - if (typeof context.getElementsByTagName !== "undefined") { - return context.getElementsByTagName(tag); - } else { - return context.querySelectorAll(tag); - } - }, - CLASS: function(className, context) { - if (typeof context.getElementsByClassName !== "undefined" && documentIsHTML) { - return context.getElementsByClassName(className); - } - } - }, - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - preFilter, - filter: { - ID: function(id) { - var attrId = unescapeSelector(id); - return function(elem) { - return elem.getAttribute("id") === attrId; - }; - }, - TAG: function(nodeNameSelector) { - var expectedNodeName = unescapeSelector(nodeNameSelector).toLowerCase(); - return nodeNameSelector === "*" ? function() { - return true; - } : function(elem) { - return nodeName(elem, expectedNodeName); - }; - }, - CLASS: function(className) { - var pattern = classCache[className + " "]; - return pattern || (pattern = new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)")) && classCache(className, function(elem) { - return pattern.test( - typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" - ); - }); - }, - ATTR: function(name, operator, check) { - return function(elem) { - var result = jQuery2.attr(elem, name); - if (result == null) { - return operator === "!="; - } - if (!operator) { - return true; - } - result += ""; - if (operator === "=") { - return result === check; - } - if (operator === "!=") { - return result !== check; - } - if (operator === "^=") { - return check && result.indexOf(check) === 0; - } - if (operator === "*=") { - return check && result.indexOf(check) > -1; - } - if (operator === "$=") { - return check && result.slice(-check.length) === check; - } - if (operator === "~=") { - return (" " + result.replace(rwhitespace, " ") + " ").indexOf(check) > -1; - } - if (operator === "|=") { - return result === check || result.slice(0, check.length + 1) === check + "-"; - } - return false; - }; - }, - CHILD: function(type, what, _argument, first, last) { - var simple = type.slice(0, 3) !== "nth", forward = type.slice(-4) !== "last", ofType = what === "of-type"; - return first === 1 && last === 0 ? ( - // Shortcut for :nth-*(n) - function(elem) { - return !!elem.parentNode; - } - ) : function(elem, _context, xml) { - var cache, outerCache, node, nodeIndex, start, dir2 = simple !== forward ? "nextSibling" : "previousSibling", parent = elem.parentNode, name = ofType && elem.nodeName.toLowerCase(), useCache = !xml && !ofType, diff = false; - if (parent) { - if (simple) { - while (dir2) { - node = elem; - while (node = node[dir2]) { - if (ofType ? nodeName(node, name) : node.nodeType === 1) { - return false; - } - } - start = dir2 = type === "only" && !start && "nextSibling"; - } - return true; - } - start = [forward ? parent.firstChild : parent.lastChild]; - if (forward && useCache) { - outerCache = parent[jQuery2.expando] || (parent[jQuery2.expando] = {}); - cache = outerCache[type] || []; - nodeIndex = cache[0] === dirruns && cache[1]; - diff = nodeIndex && cache[2]; - node = nodeIndex && parent.childNodes[nodeIndex]; - while (node = ++nodeIndex && node && node[dir2] || // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop()) { - if (node.nodeType === 1 && ++diff && node === elem) { - outerCache[type] = [dirruns, nodeIndex, diff]; - break; - } - } - } else { - if (useCache) { - outerCache = elem[jQuery2.expando] || (elem[jQuery2.expando] = {}); - cache = outerCache[type] || []; - nodeIndex = cache[0] === dirruns && cache[1]; - diff = nodeIndex; - } - if (diff === false) { - while (node = ++nodeIndex && node && node[dir2] || (diff = nodeIndex = 0) || start.pop()) { - if ((ofType ? nodeName(node, name) : node.nodeType === 1) && ++diff) { - if (useCache) { - outerCache = node[jQuery2.expando] || (node[jQuery2.expando] = {}); - outerCache[type] = [dirruns, diff]; - } - if (node === elem) { - break; - } - } - } - } - } - diff -= last; - return diff === first || diff % first === 0 && diff / first >= 0; - } - }; - }, - PSEUDO: function(pseudo, argument) { - var fn = jQuery2.expr.pseudos[pseudo] || jQuery2.expr.setFilters[pseudo.toLowerCase()] || selectorError("unsupported pseudo: " + pseudo); - if (fn[jQuery2.expando]) { - return fn(argument); - } - return fn; - } - }, - pseudos: { - // Potentially complex pseudos - not: markFunction(function(selector) { - var input = [], results = [], matcher = compile(selector.replace(rtrimCSS, "$1")); - return matcher[jQuery2.expando] ? markFunction(function(seed, matches2, _context, xml) { - var elem, unmatched = matcher(seed, null, xml, []), i2 = seed.length; - while (i2--) { - if (elem = unmatched[i2]) { - seed[i2] = !(matches2[i2] = elem); - } - } - }) : function(elem, _context, xml) { - input[0] = elem; - matcher(input, null, xml, results); - input[0] = null; - return !results.pop(); - }; - }), - has: markFunction(function(selector) { - return function(elem) { - return find(selector, elem).length > 0; - }; - }), - contains: markFunction(function(text) { - text = unescapeSelector(text); - return function(elem) { - return (elem.textContent || jQuery2.text(elem)).indexOf(text) > -1; - }; - }), - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // https://www.w3.org/TR/selectors/#lang-pseudo - lang: markFunction(function(lang) { - if (!ridentifier.test(lang || "")) { - selectorError("unsupported lang: " + lang); - } - lang = unescapeSelector(lang).toLowerCase(); - return function(elem) { - var elemLang; - do { - if (elemLang = documentIsHTML ? elem.lang : elem.getAttribute("xml:lang") || elem.getAttribute("lang")) { - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf(lang + "-") === 0; - } - } while ((elem = elem.parentNode) && elem.nodeType === 1); - return false; - }; - }), - // Miscellaneous - target: function(elem) { - var hash = window2.location && window2.location.hash; - return hash && hash.slice(1) === elem.id; - }, - root: function(elem) { - return elem === documentElement; - }, - focus: function(elem) { - return elem === document2.activeElement && document2.hasFocus() && !!(elem.type || elem.href || ~elem.tabIndex); - }, - // Boolean properties - enabled: createDisabledPseudo(false), - disabled: createDisabledPseudo(true), - checked: function(elem) { - return nodeName(elem, "input") && !!elem.checked || nodeName(elem, "option") && !!elem.selected; - }, - selected: function(elem) { - if (isIE && elem.parentNode) { - elem.parentNode.selectedIndex; - } - return elem.selected === true; - }, - // Contents - empty: function(elem) { - for (elem = elem.firstChild; elem; elem = elem.nextSibling) { - if (elem.nodeType < 6) { - return false; - } - } - return true; - }, - parent: function(elem) { - return !jQuery2.expr.pseudos.empty(elem); - }, - // Element/input types - header: function(elem) { - return rheader.test(elem.nodeName); - }, - input: function(elem) { - return rinputs.test(elem.nodeName); - }, - button: function(elem) { - return nodeName(elem, "input") && elem.type === "button" || nodeName(elem, "button"); - }, - text: function(elem) { - return nodeName(elem, "input") && elem.type === "text"; - }, - // Position-in-collection - first: createPositionalPseudo(function() { - return [0]; - }), - last: createPositionalPseudo(function(_matchIndexes, length) { - return [length - 1]; - }), - eq: createPositionalPseudo(function(_matchIndexes, length, argument) { - return [argument < 0 ? argument + length : argument]; - }), - even: createPositionalPseudo(function(matchIndexes, length) { - var i2 = 0; - for (; i2 < length; i2 += 2) { - matchIndexes.push(i2); - } - return matchIndexes; - }), - odd: createPositionalPseudo(function(matchIndexes, length) { - var i2 = 1; - for (; i2 < length; i2 += 2) { - matchIndexes.push(i2); - } - return matchIndexes; - }), - lt: createPositionalPseudo(function(matchIndexes, length, argument) { - var i2; - if (argument < 0) { - i2 = argument + length; - } else if (argument > length) { - i2 = length; - } else { - i2 = argument; - } - for (; --i2 >= 0; ) { - matchIndexes.push(i2); - } - return matchIndexes; - }), - gt: createPositionalPseudo(function(matchIndexes, length, argument) { - var i2 = argument < 0 ? argument + length : argument; - for (; ++i2 < length; ) { - matchIndexes.push(i2); - } - return matchIndexes; - }) - } - }; - jQuery2.expr.pseudos.nth = jQuery2.expr.pseudos.eq; - for (i in { radio: true, checkbox: true, file: true, password: true, image: true }) { - jQuery2.expr.pseudos[i] = createInputPseudo(i); - } - for (i in { submit: true, reset: true }) { - jQuery2.expr.pseudos[i] = createButtonPseudo(i); - } - function setFilters() { - } - setFilters.prototype = jQuery2.expr.pseudos; - jQuery2.expr.setFilters = new setFilters(); - function addCombinator(matcher, combinator, base) { - var dir2 = combinator.dir, skip = combinator.next, key = skip || dir2, checkNonElements = base && key === "parentNode", doneName = done++; - return combinator.first ? ( - // Check against closest ancestor/preceding element - function(elem, context, xml) { - while (elem = elem[dir2]) { - if (elem.nodeType === 1 || checkNonElements) { - return matcher(elem, context, xml); - } - } - return false; - } - ) : ( - // Check against all ancestor/preceding elements - function(elem, context, xml) { - var oldCache, outerCache, newCache = [dirruns, doneName]; - if (xml) { - while (elem = elem[dir2]) { - if (elem.nodeType === 1 || checkNonElements) { - if (matcher(elem, context, xml)) { - return true; - } - } - } - } else { - while (elem = elem[dir2]) { - if (elem.nodeType === 1 || checkNonElements) { - outerCache = elem[jQuery2.expando] || (elem[jQuery2.expando] = {}); - if (skip && nodeName(elem, skip)) { - elem = elem[dir2] || elem; - } else if ((oldCache = outerCache[key]) && oldCache[0] === dirruns && oldCache[1] === doneName) { - return newCache[2] = oldCache[2]; - } else { - outerCache[key] = newCache; - if (newCache[2] = matcher(elem, context, xml)) { - return true; - } - } - } - } - } - return false; - } - ); - } - function elementMatcher(matchers) { - return matchers.length > 1 ? function(elem, context, xml) { - var i2 = matchers.length; - while (i2--) { - if (!matchers[i2](elem, context, xml)) { - return false; - } - } - return true; - } : matchers[0]; - } - function multipleContexts(selector, contexts, results) { - var i2 = 0, len = contexts.length; - for (; i2 < len; i2++) { - find(selector, contexts[i2], results); - } - return results; - } - function condense(unmatched, map, filter, context, xml) { - var elem, newUnmatched = [], i2 = 0, len = unmatched.length, mapped = map != null; - for (; i2 < len; i2++) { - if (elem = unmatched[i2]) { - if (!filter || filter(elem, context, xml)) { - newUnmatched.push(elem); - if (mapped) { - map.push(i2); - } - } - } - } - return newUnmatched; - } - function setMatcher(preFilter2, selector, matcher, postFilter, postFinder, postSelector) { - if (postFilter && !postFilter[jQuery2.expando]) { - postFilter = setMatcher(postFilter); - } - if (postFinder && !postFinder[jQuery2.expando]) { - postFinder = setMatcher(postFinder, postSelector); - } - return markFunction(function(seed, results, context, xml) { - var temp, i2, elem, matcherOut, preMap = [], postMap = [], preexisting = results.length, elems = seed || multipleContexts( - selector || "*", - context.nodeType ? [context] : context, - [] - ), matcherIn = preFilter2 && (seed || !selector) ? condense(elems, preMap, preFilter2, context, xml) : elems; - if (matcher) { - matcherOut = postFinder || (seed ? preFilter2 : preexisting || postFilter) ? ( - // ...intermediate processing is necessary - [] - ) : ( - // ...otherwise use results directly - results - ); - matcher(matcherIn, matcherOut, context, xml); - } else { - matcherOut = matcherIn; - } - if (postFilter) { - temp = condense(matcherOut, postMap); - postFilter(temp, [], context, xml); - i2 = temp.length; - while (i2--) { - if (elem = temp[i2]) { - matcherOut[postMap[i2]] = !(matcherIn[postMap[i2]] = elem); - } - } - } - if (seed) { - if (postFinder || preFilter2) { - if (postFinder) { - temp = []; - i2 = matcherOut.length; - while (i2--) { - if (elem = matcherOut[i2]) { - temp.push(matcherIn[i2] = elem); - } - } - postFinder(null, matcherOut = [], temp, xml); - } - i2 = matcherOut.length; - while (i2--) { - if ((elem = matcherOut[i2]) && (temp = postFinder ? indexOf.call(seed, elem) : preMap[i2]) > -1) { - seed[temp] = !(results[temp] = elem); - } - } - } - } else { - matcherOut = condense( - matcherOut === results ? matcherOut.splice(preexisting, matcherOut.length) : matcherOut - ); - if (postFinder) { - postFinder(null, results, matcherOut, xml); - } else { - push.apply(results, matcherOut); - } - } - }); - } - function matcherFromTokens(tokens) { - var checkContext, matcher, j, len = tokens.length, leadingRelative = jQuery2.expr.relative[tokens[0].type], implicitRelative = leadingRelative || jQuery2.expr.relative[" "], i2 = leadingRelative ? 1 : 0, matchContext = addCombinator(function(elem) { - return elem === checkContext; - }, implicitRelative, true), matchAnyContext = addCombinator(function(elem) { - return indexOf.call(checkContext, elem) > -1; - }, implicitRelative, true), matchers = [function(elem, context, xml) { - var ret = !leadingRelative && (xml || context != outermostContext) || ((checkContext = context).nodeType ? matchContext(elem, context, xml) : matchAnyContext(elem, context, xml)); - checkContext = null; - return ret; - }]; - for (; i2 < len; i2++) { - if (matcher = jQuery2.expr.relative[tokens[i2].type]) { - matchers = [addCombinator(elementMatcher(matchers), matcher)]; - } else { - matcher = jQuery2.expr.filter[tokens[i2].type].apply(null, tokens[i2].matches); - if (matcher[jQuery2.expando]) { - j = ++i2; - for (; j < len; j++) { - if (jQuery2.expr.relative[tokens[j].type]) { - break; - } - } - return setMatcher( - i2 > 1 && elementMatcher(matchers), - i2 > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice(0, i2 - 1).concat({ value: tokens[i2 - 2].type === " " ? "*" : "" }) - ).replace(rtrimCSS, "$1"), - matcher, - i2 < j && matcherFromTokens(tokens.slice(i2, j)), - j < len && matcherFromTokens(tokens = tokens.slice(j)), - j < len && toSelector(tokens) - ); - } - matchers.push(matcher); - } - } - return elementMatcher(matchers); - } - function matcherFromGroupMatchers(elementMatchers, setMatchers) { - var bySet = setMatchers.length > 0, byElement = elementMatchers.length > 0, superMatcher = function(seed, context, xml, results, outermost) { - var elem, j, matcher, matchedCount = 0, i2 = "0", unmatched = seed && [], setMatched = [], contextBackup = outermostContext, elems = seed || byElement && jQuery2.expr.find.TAG("*", outermost), dirrunsUnique = dirruns += contextBackup == null ? 1 : Math.random() || 0.1; - if (outermost) { - outermostContext = context == document2 || context || outermost; - } - for (; (elem = elems[i2]) != null; i2++) { - if (byElement && elem) { - j = 0; - if (!context && elem.ownerDocument != document2) { - setDocument(elem); - xml = !documentIsHTML; - } - while (matcher = elementMatchers[j++]) { - if (matcher(elem, context || document2, xml)) { - push.call(results, elem); - break; - } - } - if (outermost) { - dirruns = dirrunsUnique; - } - } - if (bySet) { - if (elem = !matcher && elem) { - matchedCount--; - } - if (seed) { - unmatched.push(elem); - } - } - } - matchedCount += i2; - if (bySet && i2 !== matchedCount) { - j = 0; - while (matcher = setMatchers[j++]) { - matcher(unmatched, setMatched, context, xml); - } - if (seed) { - if (matchedCount > 0) { - while (i2--) { - if (!(unmatched[i2] || setMatched[i2])) { - setMatched[i2] = pop.call(results); - } - } - } - setMatched = condense(setMatched); - } - push.apply(results, setMatched); - if (outermost && !seed && setMatched.length > 0 && matchedCount + setMatchers.length > 1) { - jQuery2.uniqueSort(results); - } - } - if (outermost) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - return unmatched; - }; - return bySet ? markFunction(superMatcher) : superMatcher; - } - function compile(selector, match) { - var i2, setMatchers = [], elementMatchers = [], cached = compilerCache[selector + " "]; - if (!cached) { - if (!match) { - match = tokenize(selector); - } - i2 = match.length; - while (i2--) { - cached = matcherFromTokens(match[i2]); - if (cached[jQuery2.expando]) { - setMatchers.push(cached); - } else { - elementMatchers.push(cached); - } - } - cached = compilerCache( - selector, - matcherFromGroupMatchers(elementMatchers, setMatchers) - ); - cached.selector = selector; - } - return cached; - } - function select(selector, context, results, seed) { - var i2, tokens, token, type, find2, compiled = typeof selector === "function" && selector, match = !seed && tokenize(selector = compiled.selector || selector); - results = results || []; - if (match.length === 1) { - tokens = match[0] = match[0].slice(0); - if (tokens.length > 2 && (token = tokens[0]).type === "ID" && context.nodeType === 9 && documentIsHTML && jQuery2.expr.relative[tokens[1].type]) { - context = (jQuery2.expr.find.ID( - unescapeSelector(token.matches[0]), - context - ) || [])[0]; - if (!context) { - return results; - } else if (compiled) { - context = context.parentNode; - } - selector = selector.slice(tokens.shift().value.length); - } - i2 = matchExpr.needsContext.test(selector) ? 0 : tokens.length; - while (i2--) { - token = tokens[i2]; - if (jQuery2.expr.relative[type = token.type]) { - break; - } - if (find2 = jQuery2.expr.find[type]) { - if (seed = find2( - unescapeSelector(token.matches[0]), - rsibling.test(tokens[0].type) && testContext(context.parentNode) || context - )) { - tokens.splice(i2, 1); - selector = seed.length && toSelector(tokens); - if (!selector) { - push.apply(results, seed); - return results; - } - break; - } - } - } - } - (compiled || compile(selector, match))( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test(selector) && testContext(context.parentNode) || context - ); - return results; - } - setDocument(); - jQuery2.find = find; - find.compile = compile; - find.select = select; - find.setDocument = setDocument; - find.tokenize = tokenize; - function dir(elem, dir2, until) { - var matched = [], truncate = until !== void 0; - while ((elem = elem[dir2]) && elem.nodeType !== 9) { - if (elem.nodeType === 1) { - if (truncate && jQuery2(elem).is(until)) { - break; - } - matched.push(elem); - } - } - return matched; - } - function siblings(n, elem) { - var matched = []; - for (; n; n = n.nextSibling) { - if (n.nodeType === 1 && n !== elem) { - matched.push(n); - } - } - return matched; - } - var rneedsContext = jQuery2.expr.match.needsContext; - var rsingleTag = /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i; - function isObviousHtml(input) { - return input[0] === "<" && input[input.length - 1] === ">" && input.length >= 3; - } - function winnow(elements, qualifier, not) { - if (typeof qualifier === "function") { - return jQuery2.grep(elements, function(elem, i2) { - return !!qualifier.call(elem, i2, elem) !== not; - }); - } - if (qualifier.nodeType) { - return jQuery2.grep(elements, function(elem) { - return elem === qualifier !== not; - }); - } - if (typeof qualifier !== "string") { - return jQuery2.grep(elements, function(elem) { - return indexOf.call(qualifier, elem) > -1 !== not; - }); - } - return jQuery2.filter(qualifier, elements, not); - } - jQuery2.filter = function(expr, elems, not) { - var elem = elems[0]; - if (not) { - expr = ":not(" + expr + ")"; - } - if (elems.length === 1 && elem.nodeType === 1) { - return jQuery2.find.matchesSelector(elem, expr) ? [elem] : []; - } - return jQuery2.find.matches(expr, jQuery2.grep(elems, function(elem2) { - return elem2.nodeType === 1; - })); - }; - jQuery2.fn.extend({ - find: function(selector) { - var i2, ret, len = this.length, self = this; - if (typeof selector !== "string") { - return this.pushStack(jQuery2(selector).filter(function() { - for (i2 = 0; i2 < len; i2++) { - if (jQuery2.contains(self[i2], this)) { - return true; - } - } - })); - } - ret = this.pushStack([]); - for (i2 = 0; i2 < len; i2++) { - jQuery2.find(selector, self[i2], ret); - } - return len > 1 ? jQuery2.uniqueSort(ret) : ret; - }, - filter: function(selector) { - return this.pushStack(winnow(this, selector || [], false)); - }, - not: function(selector) { - return this.pushStack(winnow(this, selector || [], true)); - }, - is: function(selector) { - return !!winnow( - this, - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test(selector) ? jQuery2(selector) : selector || [], - false - ).length; - } - }); - var rootjQuery, rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, init = jQuery2.fn.init = function(selector, context) { - var match, elem; - if (!selector) { - return this; - } - if (selector.nodeType) { - this[0] = selector; - this.length = 1; - return this; - } else if (typeof selector === "function") { - return rootjQuery.ready !== void 0 ? rootjQuery.ready(selector) : ( - // Execute immediately if ready is not present - selector(jQuery2) - ); - } else { - match = selector + ""; - if (isObviousHtml(match)) { - match = [null, selector, null]; - } else if (typeof selector === "string") { - match = rquickExpr.exec(selector); - } else { - return jQuery2.makeArray(selector, this); - } - if (match && (match[1] || !context)) { - if (match[1]) { - context = context instanceof jQuery2 ? context[0] : context; - jQuery2.merge(this, jQuery2.parseHTML( - match[1], - context && context.nodeType ? context.ownerDocument || context : document$1, - true - )); - if (rsingleTag.test(match[1]) && jQuery2.isPlainObject(context)) { - for (match in context) { - if (typeof this[match] === "function") { - this[match](context[match]); - } else { - this.attr(match, context[match]); - } - } - } - return this; - } else { - elem = document$1.getElementById(match[2]); - if (elem) { - this[0] = elem; - this.length = 1; - } - return this; - } - } else if (!context || context.jquery) { - return (context || rootjQuery).find(selector); - } else { - return this.constructor(context).find(selector); - } - } - }; - init.prototype = jQuery2.fn; - rootjQuery = jQuery2(document$1); - var rparentsprev = /^(?:parents|prev(?:Until|All))/, guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - jQuery2.fn.extend({ - has: function(target) { - var targets = jQuery2(target, this), l = targets.length; - return this.filter(function() { - var i2 = 0; - for (; i2 < l; i2++) { - if (jQuery2.contains(this, targets[i2])) { - return true; - } - } - }); - }, - closest: function(selectors, context) { - var cur, i2 = 0, l = this.length, matched = [], targets = typeof selectors !== "string" && jQuery2(selectors); - if (!rneedsContext.test(selectors)) { - for (; i2 < l; i2++) { - for (cur = this[i2]; cur && cur !== context; cur = cur.parentNode) { - if (cur.nodeType < 11 && (targets ? targets.index(cur) > -1 : ( - // Don't pass non-elements to jQuery#find - cur.nodeType === 1 && jQuery2.find.matchesSelector(cur, selectors) - ))) { - matched.push(cur); - break; - } - } - } - } - return this.pushStack(matched.length > 1 ? jQuery2.uniqueSort(matched) : matched); - }, - // Determine the position of an element within the set - index: function(elem) { - if (!elem) { - return this[0] && this[0].parentNode ? this.first().prevAll().length : -1; - } - if (typeof elem === "string") { - return indexOf.call(jQuery2(elem), this[0]); - } - return indexOf.call( - this, - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[0] : elem - ); - }, - add: function(selector, context) { - return this.pushStack( - jQuery2.uniqueSort( - jQuery2.merge(this.get(), jQuery2(selector, context)) - ) - ); - }, - addBack: function(selector) { - return this.add( - selector == null ? this.prevObject : this.prevObject.filter(selector) - ); - } - }); - function sibling(cur, dir2) { - while ((cur = cur[dir2]) && cur.nodeType !== 1) { - } - return cur; - } - jQuery2.each({ - parent: function(elem) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function(elem) { - return dir(elem, "parentNode"); - }, - parentsUntil: function(elem, _i, until) { - return dir(elem, "parentNode", until); - }, - next: function(elem) { - return sibling(elem, "nextSibling"); - }, - prev: function(elem) { - return sibling(elem, "previousSibling"); - }, - nextAll: function(elem) { - return dir(elem, "nextSibling"); - }, - prevAll: function(elem) { - return dir(elem, "previousSibling"); - }, - nextUntil: function(elem, _i, until) { - return dir(elem, "nextSibling", until); - }, - prevUntil: function(elem, _i, until) { - return dir(elem, "previousSibling", until); - }, - siblings: function(elem) { - return siblings((elem.parentNode || {}).firstChild, elem); - }, - children: function(elem) { - return siblings(elem.firstChild); - }, - contents: function(elem) { - if (elem.contentDocument != null && // Support: IE 11+ - // elements with no `data` attribute has an object - // `contentDocument` with a `null` prototype. - getProto(elem.contentDocument)) { - return elem.contentDocument; - } - if (nodeName(elem, "template")) { - elem = elem.content || elem; - } - return jQuery2.merge([], elem.childNodes); - } - }, function(name, fn) { - jQuery2.fn[name] = function(until, selector) { - var matched = jQuery2.map(this, fn, until); - if (name.slice(-5) !== "Until") { - selector = until; - } - if (selector && typeof selector === "string") { - matched = jQuery2.filter(selector, matched); - } - if (this.length > 1) { - if (!guaranteedUnique[name]) { - jQuery2.uniqueSort(matched); - } - if (rparentsprev.test(name)) { - matched.reverse(); - } - } - return this.pushStack(matched); - }; - }); - function createOptions(options) { - var object = {}; - jQuery2.each(options.match(rnothtmlwhite) || [], function(_, flag) { - object[flag] = true; - }); - return object; - } - jQuery2.Callbacks = function(options) { - options = typeof options === "string" ? createOptions(options) : jQuery2.extend({}, options); - var firing, memory, fired, locked, list = [], queue = [], firingIndex = -1, fire = function() { - locked = locked || options.once; - fired = firing = true; - for (; queue.length; firingIndex = -1) { - memory = queue.shift(); - while (++firingIndex < list.length) { - if (list[firingIndex].apply(memory[0], memory[1]) === false && options.stopOnFalse) { - firingIndex = list.length; - memory = false; - } - } - } - if (!options.memory) { - memory = false; - } - firing = false; - if (locked) { - if (memory) { - list = []; - } else { - list = ""; - } - } - }, self = { - // Add a callback or a collection of callbacks to the list - add: function() { - if (list) { - if (memory && !firing) { - firingIndex = list.length - 1; - queue.push(memory); - } - (function add(args) { - jQuery2.each(args, function(_, arg) { - if (typeof arg === "function") { - if (!options.unique || !self.has(arg)) { - list.push(arg); - } - } else if (arg && arg.length && toType(arg) !== "string") { - add(arg); - } - }); - })(arguments); - if (memory && !firing) { - fire(); - } - } - return this; - }, - // Remove a callback from the list - remove: function() { - jQuery2.each(arguments, function(_, arg) { - var index; - while ((index = jQuery2.inArray(arg, list, index)) > -1) { - list.splice(index, 1); - if (index <= firingIndex) { - firingIndex--; - } - } - }); - return this; - }, - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function(fn) { - return fn ? jQuery2.inArray(fn, list) > -1 : list.length > 0; - }, - // Remove all callbacks from the list - empty: function() { - if (list) { - list = []; - } - return this; - }, - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if (!memory && !firing) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - // Call all callbacks with the given context and arguments - fireWith: function(context, args) { - if (!locked) { - args = args || []; - args = [context, args.slice ? args.slice() : args]; - queue.push(args); - if (!firing) { - fire(); - } - } - return this; - }, - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith(this, arguments); - return this; - }, - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - return self; - }; - function Identity(v) { - return v; - } - function Thrower(ex) { - throw ex; - } - function adoptValue(value, resolve, reject, noValue) { - var method; - try { - if (value && typeof (method = value.promise) === "function") { - method.call(value).done(resolve).fail(reject); - } else if (value && typeof (method = value.then) === "function") { - method.call(value, resolve, reject); - } else { - resolve.apply(void 0, [value].slice(noValue)); - } - } catch (value2) { - reject(value2); - } - } - jQuery2.extend({ - Deferred: function(func) { - var tuples = [ - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ - "notify", - "progress", - jQuery2.Callbacks("memory"), - jQuery2.Callbacks("memory"), - 2 - ], - [ - "resolve", - "done", - jQuery2.Callbacks("once memory"), - jQuery2.Callbacks("once memory"), - 0, - "resolved" - ], - [ - "reject", - "fail", - jQuery2.Callbacks("once memory"), - jQuery2.Callbacks("once memory"), - 1, - "rejected" - ] - ], state = "pending", promise = { - state: function() { - return state; - }, - always: function() { - deferred.done(arguments).fail(arguments); - return this; - }, - catch: function(fn) { - return promise.then(null, fn); - }, - // Keep pipe for back-compat - pipe: function() { - var fns = arguments; - return jQuery2.Deferred(function(newDefer) { - jQuery2.each(tuples, function(_i, tuple) { - var fn = typeof fns[tuple[4]] === "function" && fns[tuple[4]]; - deferred[tuple[1]](function() { - var returned = fn && fn.apply(this, arguments); - if (returned && typeof returned.promise === "function") { - returned.promise().progress(newDefer.notify).done(newDefer.resolve).fail(newDefer.reject); - } else { - newDefer[tuple[0] + "With"]( - this, - fn ? [returned] : arguments - ); - } - }); - }); - fns = null; - }).promise(); - }, - then: function(onFulfilled, onRejected, onProgress) { - var maxDepth = 0; - function resolve(depth, deferred2, handler, special) { - return function() { - var that = this, args = arguments, mightThrow = function() { - var returned, then; - if (depth < maxDepth) { - return; - } - returned = handler.apply(that, args); - if (returned === deferred2.promise()) { - throw new TypeError("Thenable self-resolution"); - } - then = returned && // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - (typeof returned === "object" || typeof returned === "function") && returned.then; - if (typeof then === "function") { - if (special) { - then.call( - returned, - resolve(maxDepth, deferred2, Identity, special), - resolve(maxDepth, deferred2, Thrower, special) - ); - } else { - maxDepth++; - then.call( - returned, - resolve(maxDepth, deferred2, Identity, special), - resolve(maxDepth, deferred2, Thrower, special), - resolve( - maxDepth, - deferred2, - Identity, - deferred2.notifyWith - ) - ); - } - } else { - if (handler !== Identity) { - that = void 0; - args = [returned]; - } - (special || deferred2.resolveWith)(that, args); - } - }, process = special ? mightThrow : function() { - try { - mightThrow(); - } catch (e) { - if (jQuery2.Deferred.exceptionHook) { - jQuery2.Deferred.exceptionHook( - e, - process.error - ); - } - if (depth + 1 >= maxDepth) { - if (handler !== Thrower) { - that = void 0; - args = [e]; - } - deferred2.rejectWith(that, args); - } - } - }; - if (depth) { - process(); - } else { - if (jQuery2.Deferred.getErrorHook) { - process.error = jQuery2.Deferred.getErrorHook(); - } - window2.setTimeout(process); - } - }; - } - return jQuery2.Deferred(function(newDefer) { - tuples[0][3].add( - resolve( - 0, - newDefer, - typeof onProgress === "function" ? onProgress : Identity, - newDefer.notifyWith - ) - ); - tuples[1][3].add( - resolve( - 0, - newDefer, - typeof onFulfilled === "function" ? onFulfilled : Identity - ) - ); - tuples[2][3].add( - resolve( - 0, - newDefer, - typeof onRejected === "function" ? onRejected : Thrower - ) - ); - }).promise(); - }, - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function(obj) { - return obj != null ? jQuery2.extend(obj, promise) : promise; - } - }, deferred = {}; - jQuery2.each(tuples, function(i2, tuple) { - var list = tuple[2], stateString = tuple[5]; - promise[tuple[1]] = list.add; - if (stateString) { - list.add( - function() { - state = stateString; - }, - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[3 - i2][2].disable, - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[3 - i2][3].disable, - // progress_callbacks.lock - tuples[0][2].lock, - // progress_handlers.lock - tuples[0][3].lock - ); - } - list.add(tuple[3].fire); - deferred[tuple[0]] = function() { - deferred[tuple[0] + "With"](this === deferred ? void 0 : this, arguments); - return this; - }; - deferred[tuple[0] + "With"] = list.fireWith; - }); - promise.promise(deferred); - if (func) { - func.call(deferred, deferred); - } - return deferred; - }, - // Deferred helper - when: function(singleValue) { - var remaining = arguments.length, i2 = remaining, resolveContexts = Array(i2), resolveValues = slice.call(arguments), primary = jQuery2.Deferred(), updateFunc = function(i3) { - return function(value) { - resolveContexts[i3] = this; - resolveValues[i3] = arguments.length > 1 ? slice.call(arguments) : value; - if (!--remaining) { - primary.resolveWith(resolveContexts, resolveValues); - } - }; - }; - if (remaining <= 1) { - adoptValue( - singleValue, - primary.done(updateFunc(i2)).resolve, - primary.reject, - !remaining - ); - if (primary.state() === "pending" || typeof (resolveValues[i2] && resolveValues[i2].then) === "function") { - return primary.then(); - } - } - while (i2--) { - adoptValue(resolveValues[i2], updateFunc(i2), primary.reject); - } - return primary.promise(); - } - }); - var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - jQuery2.Deferred.exceptionHook = function(error, asyncError) { - if (error && rerrorNames.test(error.name)) { - window2.console.warn( - "jQuery.Deferred exception", - error, - asyncError - ); - } - }; - jQuery2.readyException = function(error) { - window2.setTimeout(function() { - throw error; - }); - }; - var readyList = jQuery2.Deferred(); - jQuery2.fn.ready = function(fn) { - readyList.then(fn).catch(function(error) { - jQuery2.readyException(error); - }); - return this; - }; - jQuery2.extend({ - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - // A counter to track how many items to wait for before - // the ready event fires. See trac-6781 - readyWait: 1, - // Handle when the DOM is ready - ready: function(wait) { - if (wait === true ? --jQuery2.readyWait : jQuery2.isReady) { - return; - } - jQuery2.isReady = true; - if (wait !== true && --jQuery2.readyWait > 0) { - return; - } - readyList.resolveWith(document$1, [jQuery2]); - } - }); - jQuery2.ready.then = readyList.then; - function completed() { - document$1.removeEventListener("DOMContentLoaded", completed); - window2.removeEventListener("load", completed); - jQuery2.ready(); - } - if (document$1.readyState !== "loading") { - window2.setTimeout(jQuery2.ready); - } else { - document$1.addEventListener("DOMContentLoaded", completed); - window2.addEventListener("load", completed); - } - var rdashAlpha = /-([a-z])/g; - function fcamelCase(_all, letter) { - return letter.toUpperCase(); - } - function camelCase(string) { - return string.replace(rdashAlpha, fcamelCase); - } - function acceptData(owner) { - return owner.nodeType === 1 || owner.nodeType === 9 || !+owner.nodeType; - } - function Data() { - this.expando = jQuery2.expando + Data.uid++; - } - Data.uid = 1; - Data.prototype = { - cache: function(owner) { - var value = owner[this.expando]; - if (!value) { - value = /* @__PURE__ */ Object.create(null); - if (acceptData(owner)) { - if (owner.nodeType) { - owner[this.expando] = value; - } else { - Object.defineProperty(owner, this.expando, { - value, - configurable: true - }); - } - } - } - return value; - }, - set: function(owner, data, value) { - var prop, cache = this.cache(owner); - if (typeof data === "string") { - cache[camelCase(data)] = value; - } else { - for (prop in data) { - cache[camelCase(prop)] = data[prop]; - } - } - return value; - }, - get: function(owner, key) { - return key === void 0 ? this.cache(owner) : ( - // Always use camelCase key (gh-2257) - owner[this.expando] && owner[this.expando][camelCase(key)] - ); - }, - access: function(owner, key, value) { - if (key === void 0 || key && typeof key === "string" && value === void 0) { - return this.get(owner, key); - } - this.set(owner, key, value); - return value !== void 0 ? value : key; - }, - remove: function(owner, key) { - var i2, cache = owner[this.expando]; - if (cache === void 0) { - return; - } - if (key !== void 0) { - if (Array.isArray(key)) { - key = key.map(camelCase); - } else { - key = camelCase(key); - key = key in cache ? [key] : key.match(rnothtmlwhite) || []; - } - i2 = key.length; - while (i2--) { - delete cache[key[i2]]; - } - } - if (key === void 0 || jQuery2.isEmptyObject(cache)) { - if (owner.nodeType) { - owner[this.expando] = void 0; - } else { - delete owner[this.expando]; - } - } - }, - hasData: function(owner) { - var cache = owner[this.expando]; - return cache !== void 0 && !jQuery2.isEmptyObject(cache); - } - }; - var dataPriv = new Data(); - var dataUser = new Data(); - var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, rmultiDash = /[A-Z]/g; - function getData(data) { - if (data === "true") { - return true; - } - if (data === "false") { - return false; - } - if (data === "null") { - return null; - } - if (data === +data + "") { - return +data; - } - if (rbrace.test(data)) { - return JSON.parse(data); - } - return data; - } - function dataAttr(elem, key, data) { - var name; - if (data === void 0 && elem.nodeType === 1) { - name = "data-" + key.replace(rmultiDash, "-$&").toLowerCase(); - data = elem.getAttribute(name); - if (typeof data === "string") { - try { - data = getData(data); - } catch (e) { - } - dataUser.set(elem, key, data); - } else { - data = void 0; - } - } - return data; - } - jQuery2.extend({ - hasData: function(elem) { - return dataUser.hasData(elem) || dataPriv.hasData(elem); - }, - data: function(elem, name, data) { - return dataUser.access(elem, name, data); - }, - removeData: function(elem, name) { - dataUser.remove(elem, name); - }, - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function(elem, name, data) { - return dataPriv.access(elem, name, data); - }, - _removeData: function(elem, name) { - dataPriv.remove(elem, name); - } - }); - jQuery2.fn.extend({ - data: function(key, value) { - var i2, name, data, elem = this[0], attrs = elem && elem.attributes; - if (key === void 0) { - if (this.length) { - data = dataUser.get(elem); - if (elem.nodeType === 1 && !dataPriv.get(elem, "hasDataAttrs")) { - i2 = attrs.length; - while (i2--) { - if (attrs[i2]) { - name = attrs[i2].name; - if (name.indexOf("data-") === 0) { - name = camelCase(name.slice(5)); - dataAttr(elem, name, data[name]); - } - } - } - dataPriv.set(elem, "hasDataAttrs", true); - } - } - return data; - } - if (typeof key === "object") { - return this.each(function() { - dataUser.set(this, key); - }); - } - return access(this, function(value2) { - var data2; - if (elem && value2 === void 0) { - data2 = dataUser.get(elem, key); - if (data2 !== void 0) { - return data2; - } - data2 = dataAttr(elem, key); - if (data2 !== void 0) { - return data2; - } - return; - } - this.each(function() { - dataUser.set(this, key, value2); - }); - }, null, value, arguments.length > 1, null, true); - }, - removeData: function(key) { - return this.each(function() { - dataUser.remove(this, key); - }); - } - }); - jQuery2.extend({ - queue: function(elem, type, data) { - var queue; - if (elem) { - type = (type || "fx") + "queue"; - queue = dataPriv.get(elem, type); - if (data) { - if (!queue || Array.isArray(data)) { - queue = dataPriv.set(elem, type, jQuery2.makeArray(data)); - } else { - queue.push(data); - } - } - return queue || []; - } - }, - dequeue: function(elem, type) { - type = type || "fx"; - var queue = jQuery2.queue(elem, type), startLength = queue.length, fn = queue.shift(), hooks = jQuery2._queueHooks(elem, type), next = function() { - jQuery2.dequeue(elem, type); - }; - if (fn === "inprogress") { - fn = queue.shift(); - startLength--; - } - if (fn) { - if (type === "fx") { - queue.unshift("inprogress"); - } - delete hooks.stop; - fn.call(elem, next, hooks); - } - if (!startLength && hooks) { - hooks.empty.fire(); - } - }, - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function(elem, type) { - var key = type + "queueHooks"; - return dataPriv.get(elem, key) || dataPriv.set(elem, key, { - empty: jQuery2.Callbacks("once memory").add(function() { - dataPriv.remove(elem, [type + "queue", key]); - }) - }); - } - }); - jQuery2.fn.extend({ - queue: function(type, data) { - var setter = 2; - if (typeof type !== "string") { - data = type; - type = "fx"; - setter--; - } - if (arguments.length < setter) { - return jQuery2.queue(this[0], type); - } - return data === void 0 ? this : this.each(function() { - var queue = jQuery2.queue(this, type, data); - jQuery2._queueHooks(this, type); - if (type === "fx" && queue[0] !== "inprogress") { - jQuery2.dequeue(this, type); - } - }); - }, - dequeue: function(type) { - return this.each(function() { - jQuery2.dequeue(this, type); - }); - }, - clearQueue: function(type) { - return this.queue(type || "fx", []); - }, - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function(type, obj) { - var tmp, count = 1, defer = jQuery2.Deferred(), elements = this, i2 = this.length, resolve = function() { - if (!--count) { - defer.resolveWith(elements, [elements]); - } - }; - if (typeof type !== "string") { - obj = type; - type = void 0; - } - type = type || "fx"; - while (i2--) { - tmp = dataPriv.get(elements[i2], type + "queueHooks"); - if (tmp && tmp.empty) { - count++; - tmp.empty.add(resolve); - } - } - resolve(); - return defer.promise(obj); - } - }); - var pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source; - var rcssNum = new RegExp("^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i"); - var cssExpand = ["Top", "Right", "Bottom", "Left"]; - function isHiddenWithinTree(elem, el) { - elem = el || elem; - return elem.style.display === "none" || elem.style.display === "" && jQuery2.css(elem, "display") === "none"; - } - var ralphaStart = /^[a-z]/, rautoPx = /^(?:Border(?:Top|Right|Bottom|Left)?(?:Width|)|(?:Margin|Padding)?(?:Top|Right|Bottom|Left)?|(?:Min|Max)?(?:Width|Height))$/; - function isAutoPx(prop) { - return ralphaStart.test(prop) && rautoPx.test(prop[0].toUpperCase() + prop.slice(1)); - } - function adjustCSS(elem, prop, valueParts, tween) { - var adjusted, scale, maxIterations = 20, currentValue = tween ? function() { - return tween.cur(); - } : function() { - return jQuery2.css(elem, prop, ""); - }, initial = currentValue(), unit = valueParts && valueParts[3] || (isAutoPx(prop) ? "px" : ""), initialInUnit = elem.nodeType && (!isAutoPx(prop) || unit !== "px" && +initial) && rcssNum.exec(jQuery2.css(elem, prop)); - if (initialInUnit && initialInUnit[3] !== unit) { - initial = initial / 2; - unit = unit || initialInUnit[3]; - initialInUnit = +initial || 1; - while (maxIterations--) { - jQuery2.style(elem, prop, initialInUnit + unit); - if ((1 - scale) * (1 - (scale = currentValue() / initial || 0.5)) <= 0) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - } - initialInUnit = initialInUnit * 2; - jQuery2.style(elem, prop, initialInUnit + unit); - valueParts = valueParts || []; - } - if (valueParts) { - initialInUnit = +initialInUnit || +initial || 0; - adjusted = valueParts[1] ? initialInUnit + (valueParts[1] + 1) * valueParts[2] : +valueParts[2]; - if (tween) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; - } - var rmsPrefix = /^-ms-/; - function cssCamelCase(string) { - return camelCase(string.replace(rmsPrefix, "ms-")); - } - var defaultDisplayMap = {}; - function getDefaultDisplay(elem) { - var temp, doc = elem.ownerDocument, nodeName2 = elem.nodeName, display = defaultDisplayMap[nodeName2]; - if (display) { - return display; - } - temp = doc.body.appendChild(doc.createElement(nodeName2)); - display = jQuery2.css(temp, "display"); - temp.parentNode.removeChild(temp); - if (display === "none") { - display = "block"; - } - defaultDisplayMap[nodeName2] = display; - return display; - } - function showHide(elements, show) { - var display, elem, values = [], index = 0, length = elements.length; - for (; index < length; index++) { - elem = elements[index]; - if (!elem.style) { - continue; - } - display = elem.style.display; - if (show) { - if (display === "none") { - values[index] = dataPriv.get(elem, "display") || null; - if (!values[index]) { - elem.style.display = ""; - } - } - if (elem.style.display === "" && isHiddenWithinTree(elem)) { - values[index] = getDefaultDisplay(elem); - } - } else { - if (display !== "none") { - values[index] = "none"; - dataPriv.set(elem, "display", display); - } - } - } - for (index = 0; index < length; index++) { - if (values[index] != null) { - elements[index].style.display = values[index]; - } - } - return elements; - } - jQuery2.fn.extend({ - show: function() { - return showHide(this, true); - }, - hide: function() { - return showHide(this); - }, - toggle: function(state) { - if (typeof state === "boolean") { - return state ? this.show() : this.hide(); - } - return this.each(function() { - if (isHiddenWithinTree(this)) { - jQuery2(this).show(); - } else { - jQuery2(this).hide(); - } - }); - } - }); - var isAttached = function(elem) { - return jQuery2.contains(elem.ownerDocument, elem) || elem.getRootNode(composed) === elem.ownerDocument; - }, composed = { composed: true }; - if (!documentElement$1.getRootNode) { - isAttached = function(elem) { - return jQuery2.contains(elem.ownerDocument, elem); - }; - } - var rtagName = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i; - var wrapMap = { - // Table parts need to be wrapped with `` or they're - // stripped to their contents when put in a div. - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do, so we cannot shorten - // this by omitting or other required elements. - thead: ["table"], - col: ["colgroup", "table"], - tr: ["tbody", "table"], - td: ["tr", "tbody", "table"] - }; - wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; - wrapMap.th = wrapMap.td; - function getAll(context, tag) { - var ret; - if (typeof context.getElementsByTagName !== "undefined") { - ret = arr.slice.call(context.getElementsByTagName(tag || "*")); - } else if (typeof context.querySelectorAll !== "undefined") { - ret = context.querySelectorAll(tag || "*"); - } else { - ret = []; - } - if (tag === void 0 || tag && nodeName(context, tag)) { - return jQuery2.merge([context], ret); - } - return ret; - } - var rscriptType = /^$|^module$|\/(?:java|ecma)script/i; - function setGlobalEval(elems, refElements) { - var i2 = 0, l = elems.length; - for (; i2 < l; i2++) { - dataPriv.set( - elems[i2], - "globalEval", - !refElements || dataPriv.get(refElements[i2], "globalEval") - ); - } - } - var rhtml = /<|&#?\w+;/; - function buildFragment(elems, context, scripts, selection, ignored) { - var elem, tmp, tag, wrap, attached, j, fragment = context.createDocumentFragment(), nodes = [], i2 = 0, l = elems.length; - for (; i2 < l; i2++) { - elem = elems[i2]; - if (elem || elem === 0) { - if (toType(elem) === "object" && (elem.nodeType || isArrayLike(elem))) { - jQuery2.merge(nodes, elem.nodeType ? [elem] : elem); - } else if (!rhtml.test(elem)) { - nodes.push(context.createTextNode(elem)); - } else { - tmp = tmp || fragment.appendChild(context.createElement("div")); - tag = (rtagName.exec(elem) || ["", ""])[1].toLowerCase(); - wrap = wrapMap[tag] || arr; - j = wrap.length; - while (--j > -1) { - tmp = tmp.appendChild(context.createElement(wrap[j])); - } - tmp.innerHTML = jQuery2.htmlPrefilter(elem); - jQuery2.merge(nodes, tmp.childNodes); - tmp = fragment.firstChild; - tmp.textContent = ""; - } - } - } - fragment.textContent = ""; - i2 = 0; - while (elem = nodes[i2++]) { - if (selection && jQuery2.inArray(elem, selection) > -1) { - if (ignored) { - ignored.push(elem); - } - continue; - } - attached = isAttached(elem); - tmp = getAll(fragment.appendChild(elem), "script"); - if (attached) { - setGlobalEval(tmp); - } - if (scripts) { - j = 0; - while (elem = tmp[j++]) { - if (rscriptType.test(elem.type || "")) { - scripts.push(elem); - } - } - } - } - return fragment; - } - function disableScript(elem) { - elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type; - return elem; - } - function restoreScript(elem) { - if ((elem.type || "").slice(0, 5) === "true/") { - elem.type = elem.type.slice(5); - } else { - elem.removeAttribute("type"); - } - return elem; - } - function domManip(collection, args, callback, ignored) { - args = flat(args); - var fragment, first, scripts, hasScripts, node, doc, i2 = 0, l = collection.length, iNoClone = l - 1, value = args[0], valueIsFunction = typeof value === "function"; - if (valueIsFunction) { - return collection.each(function(index) { - var self = collection.eq(index); - args[0] = value.call(this, index, self.html()); - domManip(self, args, callback, ignored); - }); - } - if (l) { - fragment = buildFragment(args, collection[0].ownerDocument, false, collection, ignored); - first = fragment.firstChild; - if (fragment.childNodes.length === 1) { - fragment = first; - } - if (first || ignored) { - scripts = jQuery2.map(getAll(fragment, "script"), disableScript); - hasScripts = scripts.length; - for (; i2 < l; i2++) { - node = fragment; - if (i2 !== iNoClone) { - node = jQuery2.clone(node, true, true); - if (hasScripts) { - jQuery2.merge(scripts, getAll(node, "script")); - } - } - callback.call(collection[i2], node, i2); - } - if (hasScripts) { - doc = scripts[scripts.length - 1].ownerDocument; - jQuery2.map(scripts, restoreScript); - for (i2 = 0; i2 < hasScripts; i2++) { - node = scripts[i2]; - if (rscriptType.test(node.type || "") && !dataPriv.get(node, "globalEval") && jQuery2.contains(doc, node)) { - if (node.src && (node.type || "").toLowerCase() !== "module") { - if (jQuery2._evalUrl && !node.noModule) { - jQuery2._evalUrl(node.src, { - nonce: node.nonce, - crossOrigin: node.crossOrigin - }, doc); - } - } else { - DOMEval(node.textContent, node, doc); - } - } - } - } - } - } - return collection; - } - var rcheckableType = /^(?:checkbox|radio)$/i; - var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - function returnTrue() { - return true; - } - function returnFalse() { - return false; - } - function on(elem, types, selector, data, fn, one) { - var origFn, type; - if (typeof types === "object") { - if (typeof selector !== "string") { - data = data || selector; - selector = void 0; - } - for (type in types) { - on(elem, type, selector, data, types[type], one); - } - return elem; - } - if (data == null && fn == null) { - fn = selector; - data = selector = void 0; - } else if (fn == null) { - if (typeof selector === "string") { - fn = data; - data = void 0; - } else { - fn = data; - data = selector; - selector = void 0; - } - } - if (fn === false) { - fn = returnFalse; - } else if (!fn) { - return elem; - } - if (one === 1) { - origFn = fn; - fn = function(event) { - jQuery2().off(event); - return origFn.apply(this, arguments); - }; - fn.guid = origFn.guid || (origFn.guid = jQuery2.guid++); - } - return elem.each(function() { - jQuery2.event.add(this, types, fn, data, selector); - }); - } - jQuery2.event = { - add: function(elem, types, handler, data, selector) { - var handleObjIn, eventHandle, tmp, events, t, handleObj, special, handlers, type, namespaces, origType, elemData = dataPriv.get(elem); - if (!acceptData(elem)) { - return; - } - if (handler.handler) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - if (selector) { - jQuery2.find.matchesSelector(documentElement$1, selector); - } - if (!handler.guid) { - handler.guid = jQuery2.guid++; - } - if (!(events = elemData.events)) { - events = elemData.events = /* @__PURE__ */ Object.create(null); - } - if (!(eventHandle = elemData.handle)) { - eventHandle = elemData.handle = function(e) { - return typeof jQuery2 !== "undefined" && jQuery2.event.triggered !== e.type ? jQuery2.event.dispatch.apply(elem, arguments) : void 0; - }; - } - types = (types || "").match(rnothtmlwhite) || [""]; - t = types.length; - while (t--) { - tmp = rtypenamespace.exec(types[t]) || []; - type = origType = tmp[1]; - namespaces = (tmp[2] || "").split(".").sort(); - if (!type) { - continue; - } - special = jQuery2.event.special[type] || {}; - type = (selector ? special.delegateType : special.bindType) || type; - special = jQuery2.event.special[type] || {}; - handleObj = jQuery2.extend({ - type, - origType, - data, - handler, - guid: handler.guid, - selector, - needsContext: selector && jQuery2.expr.match.needsContext.test(selector), - namespace: namespaces.join(".") - }, handleObjIn); - if (!(handlers = events[type])) { - handlers = events[type] = []; - handlers.delegateCount = 0; - if (!special.setup || special.setup.call(elem, data, namespaces, eventHandle) === false) { - if (elem.addEventListener) { - elem.addEventListener(type, eventHandle); - } - } - } - if (special.add) { - special.add.call(elem, handleObj); - if (!handleObj.handler.guid) { - handleObj.handler.guid = handler.guid; - } - } - if (selector) { - handlers.splice(handlers.delegateCount++, 0, handleObj); - } else { - handlers.push(handleObj); - } - } - }, - // Detach an event or set of events from an element - remove: function(elem, types, handler, selector, mappedTypes) { - var j, origCount, tmp, events, t, handleObj, special, handlers, type, namespaces, origType, elemData = dataPriv.hasData(elem) && dataPriv.get(elem); - if (!elemData || !(events = elemData.events)) { - return; - } - types = (types || "").match(rnothtmlwhite) || [""]; - t = types.length; - while (t--) { - tmp = rtypenamespace.exec(types[t]) || []; - type = origType = tmp[1]; - namespaces = (tmp[2] || "").split(".").sort(); - if (!type) { - for (type in events) { - jQuery2.event.remove(elem, type + types[t], handler, selector, true); - } - continue; - } - special = jQuery2.event.special[type] || {}; - type = (selector ? special.delegateType : special.bindType) || type; - handlers = events[type] || []; - tmp = tmp[2] && new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)"); - origCount = j = handlers.length; - while (j--) { - handleObj = handlers[j]; - if ((mappedTypes || origType === handleObj.origType) && (!handler || handler.guid === handleObj.guid) && (!tmp || tmp.test(handleObj.namespace)) && (!selector || selector === handleObj.selector || selector === "**" && handleObj.selector)) { - handlers.splice(j, 1); - if (handleObj.selector) { - handlers.delegateCount--; - } - if (special.remove) { - special.remove.call(elem, handleObj); - } - } - } - if (origCount && !handlers.length) { - if (!special.teardown || special.teardown.call(elem, namespaces, elemData.handle) === false) { - jQuery2.removeEvent(elem, type, elemData.handle); - } - delete events[type]; - } - } - if (jQuery2.isEmptyObject(events)) { - dataPriv.remove(elem, "handle events"); - } - }, - dispatch: function(nativeEvent) { - var i2, j, ret, matched, handleObj, handlerQueue, args = new Array(arguments.length), event = jQuery2.event.fix(nativeEvent), handlers = (dataPriv.get(this, "events") || /* @__PURE__ */ Object.create(null))[event.type] || [], special = jQuery2.event.special[event.type] || {}; - args[0] = event; - for (i2 = 1; i2 < arguments.length; i2++) { - args[i2] = arguments[i2]; - } - event.delegateTarget = this; - if (special.preDispatch && special.preDispatch.call(this, event) === false) { - return; - } - handlerQueue = jQuery2.event.handlers.call(this, event, handlers); - i2 = 0; - while ((matched = handlerQueue[i2++]) && !event.isPropagationStopped()) { - event.currentTarget = matched.elem; - j = 0; - while ((handleObj = matched.handlers[j++]) && !event.isImmediatePropagationStopped()) { - if (!event.rnamespace || handleObj.namespace === false || event.rnamespace.test(handleObj.namespace)) { - event.handleObj = handleObj; - event.data = handleObj.data; - ret = ((jQuery2.event.special[handleObj.origType] || {}).handle || handleObj.handler).apply(matched.elem, args); - if (ret !== void 0) { - if ((event.result = ret) === false) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - if (special.postDispatch) { - special.postDispatch.call(this, event); - } - return event.result; - }, - handlers: function(event, handlers) { - var i2, handleObj, sel, matchedHandlers, matchedSelectors, handlerQueue = [], delegateCount = handlers.delegateCount, cur = event.target; - if (delegateCount && // Support: Firefox <=42 - 66+ - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11+ - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !(event.type === "click" && event.button >= 1)) { - for (; cur !== this; cur = cur.parentNode || this) { - if (cur.nodeType === 1 && !(event.type === "click" && cur.disabled === true)) { - matchedHandlers = []; - matchedSelectors = {}; - for (i2 = 0; i2 < delegateCount; i2++) { - handleObj = handlers[i2]; - sel = handleObj.selector + " "; - if (matchedSelectors[sel] === void 0) { - matchedSelectors[sel] = handleObj.needsContext ? jQuery2(sel, this).index(cur) > -1 : jQuery2.find(sel, this, null, [cur]).length; - } - if (matchedSelectors[sel]) { - matchedHandlers.push(handleObj); - } - } - if (matchedHandlers.length) { - handlerQueue.push({ elem: cur, handlers: matchedHandlers }); - } - } - } - } - cur = this; - if (delegateCount < handlers.length) { - handlerQueue.push({ elem: cur, handlers: handlers.slice(delegateCount) }); - } - return handlerQueue; - }, - addProp: function(name, hook) { - Object.defineProperty(jQuery2.Event.prototype, name, { - enumerable: true, - configurable: true, - get: typeof hook === "function" ? function() { - if (this.originalEvent) { - return hook(this.originalEvent); - } - } : function() { - if (this.originalEvent) { - return this.originalEvent[name]; - } - }, - set: function(value) { - Object.defineProperty(this, name, { - enumerable: true, - configurable: true, - writable: true, - value - }); - } - }); - }, - fix: function(originalEvent) { - return originalEvent[jQuery2.expando] ? originalEvent : new jQuery2.Event(originalEvent); - }, - special: jQuery2.extend(/* @__PURE__ */ Object.create(null), { - load: { - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - click: { - // Utilize native event to ensure correct state for checkable inputs - setup: function(data) { - var el = this || data; - if (rcheckableType.test(el.type) && el.click && nodeName(el, "input")) { - leverageNative(el, "click", true); - } - return false; - }, - trigger: function(data) { - var el = this || data; - if (rcheckableType.test(el.type) && el.click && nodeName(el, "input")) { - leverageNative(el, "click"); - } - return true; - }, - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function(event) { - var target = event.target; - return rcheckableType.test(target.type) && target.click && nodeName(target, "input") && dataPriv.get(target, "click") || nodeName(target, "a"); - } - }, - beforeunload: { - postDispatch: function(event) { - if (event.result !== void 0) { - event.preventDefault(); - } - } - } - }) - }; - function leverageNative(el, type, isSetup) { - if (!isSetup) { - if (dataPriv.get(el, type) === void 0) { - jQuery2.event.add(el, type, returnTrue); - } - return; - } - dataPriv.set(el, type, false); - jQuery2.event.add(el, type, { - namespace: false, - handler: function(event) { - var result, saved = dataPriv.get(this, type); - if (event.isTrigger & 1 && this[type]) { - if (!saved.length) { - saved = slice.call(arguments); - dataPriv.set(this, type, saved); - this[type](); - result = dataPriv.get(this, type); - dataPriv.set(this, type, false); - if (saved !== result) { - event.stopImmediatePropagation(); - event.preventDefault(); - return result && result.value; - } - } else if ((jQuery2.event.special[type] || {}).delegateType) { - event.stopPropagation(); - } - } else if (saved.length) { - dataPriv.set(this, type, { - value: jQuery2.event.trigger( - saved[0], - saved.slice(1), - this - ) - }); - event.stopPropagation(); - event.isImmediatePropagationStopped = returnTrue; - } - } - }); - } - jQuery2.removeEvent = function(elem, type, handle) { - if (elem.removeEventListener) { - elem.removeEventListener(type, handle); - } - }; - jQuery2.Event = function(src, props) { - if (!(this instanceof jQuery2.Event)) { - return new jQuery2.Event(src, props); - } - if (src && src.type) { - this.originalEvent = src; - this.type = src.type; - this.isDefaultPrevented = src.defaultPrevented ? returnTrue : returnFalse; - this.target = src.target; - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - } else { - this.type = src; - } - if (props) { - jQuery2.extend(this, props); - } - this.timeStamp = src && src.timeStamp || Date.now(); - this[jQuery2.expando] = true; - }; - jQuery2.Event.prototype = { - constructor: jQuery2.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - preventDefault: function() { - var e = this.originalEvent; - this.isDefaultPrevented = returnTrue; - if (e && !this.isSimulated) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - this.isPropagationStopped = returnTrue; - if (e && !this.isSimulated) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - this.isImmediatePropagationStopped = returnTrue; - if (e && !this.isSimulated) { - e.stopImmediatePropagation(); - } - this.stopPropagation(); - } - }; - jQuery2.each({ - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - code: true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - which: true - }, jQuery2.event.addProp); - jQuery2.each({ focus: "focusin", blur: "focusout" }, function(type, delegateType) { - function focusMappedHandler(nativeEvent) { - var event = jQuery2.event.fix(nativeEvent); - event.type = nativeEvent.type === "focusin" ? "focus" : "blur"; - event.isSimulated = true; - if (event.target === event.currentTarget) { - dataPriv.get(this, "handle")(event); - } - } - jQuery2.event.special[type] = { - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - leverageNative(this, type, true); - if (isIE) { - this.addEventListener(delegateType, focusMappedHandler); - } else { - return false; - } - }, - trigger: function() { - leverageNative(this, type); - return true; - }, - teardown: function() { - if (isIE) { - this.removeEventListener(delegateType, focusMappedHandler); - } else { - return false; - } - }, - // Suppress native focus or blur if we're currently inside - // a leveraged native-event stack - _default: function(event) { - return dataPriv.get(event.target, type); - }, - delegateType - }; - }); - jQuery2.each({ - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" - }, function(orig, fix) { - jQuery2.event.special[orig] = { - delegateType: fix, - bindType: fix, - handle: function(event) { - var ret, target = this, related = event.relatedTarget, handleObj = event.handleObj; - if (!related || related !== target && !jQuery2.contains(target, related)) { - event.type = handleObj.origType; - ret = handleObj.handler.apply(this, arguments); - event.type = fix; - } - return ret; - } - }; - }); - jQuery2.fn.extend({ - on: function(types, selector, data, fn) { - return on(this, types, selector, data, fn); - }, - one: function(types, selector, data, fn) { - return on(this, types, selector, data, fn, 1); - }, - off: function(types, selector, fn) { - var handleObj, type; - if (types && types.preventDefault && types.handleObj) { - handleObj = types.handleObj; - jQuery2(types.delegateTarget).off( - handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if (typeof types === "object") { - for (type in types) { - this.off(type, selector, types[type]); - } - return this; - } - if (selector === false || typeof selector === "function") { - fn = selector; - selector = void 0; - } - if (fn === false) { - fn = returnFalse; - } - return this.each(function() { - jQuery2.event.remove(this, types, fn, selector); - }); - } - }); - var rnoInnerhtml = / 0) { - setGlobalEval(destElements, !inPage && getAll(elem, "script")); - } - return clone; - }, - cleanData: function(elems) { - var data, elem, type, special = jQuery2.event.special, i2 = 0; - for (; (elem = elems[i2]) !== void 0; i2++) { - if (acceptData(elem)) { - if (data = elem[dataPriv.expando]) { - if (data.events) { - for (type in data.events) { - if (special[type]) { - jQuery2.event.remove(elem, type); - } else { - jQuery2.removeEvent(elem, type, data.handle); - } - } - } - elem[dataPriv.expando] = void 0; - } - if (elem[dataUser.expando]) { - elem[dataUser.expando] = void 0; - } - } - } - } - }); - jQuery2.fn.extend({ - detach: function(selector) { - return remove(this, selector, true); - }, - remove: function(selector) { - return remove(this, selector); - }, - text: function(value) { - return access(this, function(value2) { - return value2 === void 0 ? jQuery2.text(this) : this.empty().each(function() { - if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) { - this.textContent = value2; - } - }); - }, null, value, arguments.length); - }, - append: function() { - return domManip(this, arguments, function(elem) { - if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) { - var target = manipulationTarget(this, elem); - target.appendChild(elem); - } - }); - }, - prepend: function() { - return domManip(this, arguments, function(elem) { - if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) { - var target = manipulationTarget(this, elem); - target.insertBefore(elem, target.firstChild); - } - }); - }, - before: function() { - return domManip(this, arguments, function(elem) { - if (this.parentNode) { - this.parentNode.insertBefore(elem, this); - } - }); - }, - after: function() { - return domManip(this, arguments, function(elem) { - if (this.parentNode) { - this.parentNode.insertBefore(elem, this.nextSibling); - } - }); - }, - empty: function() { - var elem, i2 = 0; - for (; (elem = this[i2]) != null; i2++) { - if (elem.nodeType === 1) { - jQuery2.cleanData(getAll(elem, false)); - elem.textContent = ""; - } - } - return this; - }, - clone: function(dataAndEvents, deepDataAndEvents) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - return this.map(function() { - return jQuery2.clone(this, dataAndEvents, deepDataAndEvents); - }); - }, - html: function(value) { - return access(this, function(value2) { - var elem = this[0] || {}, i2 = 0, l = this.length; - if (value2 === void 0 && elem.nodeType === 1) { - return elem.innerHTML; - } - if (typeof value2 === "string" && !rnoInnerhtml.test(value2) && !wrapMap[(rtagName.exec(value2) || ["", ""])[1].toLowerCase()]) { - value2 = jQuery2.htmlPrefilter(value2); - try { - for (; i2 < l; i2++) { - elem = this[i2] || {}; - if (elem.nodeType === 1) { - jQuery2.cleanData(getAll(elem, false)); - elem.innerHTML = value2; - } - } - elem = 0; - } catch (e) { - } - } - if (elem) { - this.empty().append(value2); - } - }, null, value, arguments.length); - }, - replaceWith: function() { - var ignored = []; - return domManip(this, arguments, function(elem) { - var parent = this.parentNode; - if (jQuery2.inArray(this, ignored) < 0) { - jQuery2.cleanData(getAll(this)); - if (parent) { - parent.replaceChild(elem, this); - } - } - }, ignored); - } - }); - jQuery2.each({ - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" - }, function(name, original) { - jQuery2.fn[name] = function(selector) { - var elems, ret = [], insert = jQuery2(selector), last = insert.length - 1, i2 = 0; - for (; i2 <= last; i2++) { - elems = i2 === last ? this : this.clone(true); - jQuery2(insert[i2])[original](elems); - push.apply(ret, elems); - } - return this.pushStack(ret); - }; - }); - var rnumnonpx = new RegExp("^(" + pnum + ")(?!px)[a-z%]+$", "i"); - var rcustomProp = /^--/; - function getStyles(elem) { - var view = elem.ownerDocument.defaultView; - if (!view) { - view = window2; - } - return view.getComputedStyle(elem); - } - function swap(elem, options, callback) { - var ret, name, old = {}; - for (name in options) { - old[name] = elem.style[name]; - elem.style[name] = options[name]; - } - ret = callback.call(elem); - for (name in options) { - elem.style[name] = old[name]; - } - return ret; - } - function curCSS(elem, name, computed) { - var ret, isCustomProp = rcustomProp.test(name); - computed = computed || getStyles(elem); - if (computed) { - ret = computed.getPropertyValue(name) || computed[name]; - if (isCustomProp && ret) { - ret = ret.replace(rtrimCSS, "$1") || void 0; - } - if (ret === "" && !isAttached(elem)) { - ret = jQuery2.style(elem, name); - } - } - return ret !== void 0 ? ( - // Support: IE <=9 - 11+ - // IE returns zIndex value as an integer. - ret + "" - ) : ret; - } - var cssPrefixes = ["Webkit", "Moz", "ms"], emptyStyle = document$1.createElement("div").style; - function vendorPropName(name) { - var capName = name[0].toUpperCase() + name.slice(1), i2 = cssPrefixes.length; - while (i2--) { - name = cssPrefixes[i2] + capName; - if (name in emptyStyle) { - return name; - } - } - } - function finalPropName(name) { - if (name in emptyStyle) { - return name; - } - return vendorPropName(name) || name; - } - var reliableTrDimensionsVal, reliableColDimensionsVal, table = document$1.createElement("table"); - function computeTableStyleTests() { - if ( - // This is a singleton, we need to execute it only once - !table || // Finish early in limited (non-browser) environments - !table.style - ) { - return; - } - var trStyle, col = document$1.createElement("col"), tr = document$1.createElement("tr"), td = document$1.createElement("td"); - table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate;border-spacing:0"; - tr.style.cssText = "box-sizing:content-box;border:1px solid;height:1px"; - td.style.cssText = "height:9px;width:9px;padding:0"; - col.span = 2; - documentElement$1.appendChild(table).appendChild(col).parentNode.appendChild(tr).appendChild(td).parentNode.appendChild(td.cloneNode(true)); - if (table.offsetWidth === 0) { - documentElement$1.removeChild(table); - return; - } - trStyle = window2.getComputedStyle(tr); - reliableColDimensionsVal = isIE || Math.round( - parseFloat( - window2.getComputedStyle(col).width - ) - ) === 18; - reliableTrDimensionsVal = Math.round(parseFloat(trStyle.height) + parseFloat(trStyle.borderTopWidth) + parseFloat(trStyle.borderBottomWidth)) === tr.offsetHeight; - documentElement$1.removeChild(table); - table = null; - } - jQuery2.extend(support, { - reliableTrDimensions: function() { - computeTableStyleTests(); - return reliableTrDimensionsVal; - }, - reliableColDimensions: function() { - computeTableStyleTests(); - return reliableColDimensionsVal; - } - }); - var cssShow = { position: "absolute", visibility: "hidden", display: "block" }, cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }; - function setPositiveNumber(_elem, value, subtract) { - var matches2 = rcssNum.exec(value); - return matches2 ? ( - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max(0, matches2[2] - (subtract || 0)) + (matches2[3] || "px") - ) : value; - } - function boxModelAdjustment(elem, dimension, box, isBorderBox, styles, computedVal) { - var i2 = dimension === "width" ? 1 : 0, extra = 0, delta = 0, marginDelta = 0; - if (box === (isBorderBox ? "border" : "content")) { - return 0; - } - for (; i2 < 4; i2 += 2) { - if (box === "margin") { - marginDelta += jQuery2.css(elem, box + cssExpand[i2], true, styles); - } - if (!isBorderBox) { - delta += jQuery2.css(elem, "padding" + cssExpand[i2], true, styles); - if (box !== "padding") { - delta += jQuery2.css(elem, "border" + cssExpand[i2] + "Width", true, styles); - } else { - extra += jQuery2.css(elem, "border" + cssExpand[i2] + "Width", true, styles); - } - } else { - if (box === "content") { - delta -= jQuery2.css(elem, "padding" + cssExpand[i2], true, styles); - } - if (box !== "margin") { - delta -= jQuery2.css(elem, "border" + cssExpand[i2] + "Width", true, styles); - } - } - } - if (!isBorderBox && computedVal >= 0) { - delta += Math.max(0, Math.ceil( - elem["offset" + dimension[0].toUpperCase() + dimension.slice(1)] - computedVal - delta - extra - 0.5 - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - )) || 0; - } - return delta + marginDelta; - } - function getWidthOrHeight(elem, dimension, extra) { - var styles = getStyles(elem), boxSizingNeeded = isIE || extra, isBorderBox = boxSizingNeeded && jQuery2.css(elem, "boxSizing", false, styles) === "border-box", valueIsBorderBox = isBorderBox, val = curCSS(elem, dimension, styles), offsetProp = "offset" + dimension[0].toUpperCase() + dimension.slice(1); - if (rnumnonpx.test(val)) { - if (!extra) { - return val; - } - val = "auto"; - } - if ( - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - (val === "auto" || // Support: IE 9 - 11+ - // Use offsetWidth/offsetHeight for when box sizing is unreliable. - // In those cases, the computed value can be trusted to be border-box. - isIE && isBorderBox || !support.reliableColDimensions() && nodeName(elem, "col") || !support.reliableTrDimensions() && nodeName(elem, "tr")) && // Make sure the element is visible & connected - elem.getClientRects().length - ) { - isBorderBox = jQuery2.css(elem, "boxSizing", false, styles) === "border-box"; - valueIsBorderBox = offsetProp in elem; - if (valueIsBorderBox) { - val = elem[offsetProp]; - } - } - val = parseFloat(val) || 0; - return val + boxModelAdjustment( - elem, - dimension, - extra || (isBorderBox ? "border" : "content"), - valueIsBorderBox, - styles, - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) + "px"; - } - jQuery2.extend({ - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: {}, - // Get and set the style property on a DOM Node - style: function(elem, name, value, extra) { - if (!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style) { - return; - } - var ret, type, hooks, origName = cssCamelCase(name), isCustomProp = rcustomProp.test(name), style = elem.style; - if (!isCustomProp) { - name = finalPropName(origName); - } - hooks = jQuery2.cssHooks[name] || jQuery2.cssHooks[origName]; - if (value !== void 0) { - type = typeof value; - if (type === "string" && (ret = rcssNum.exec(value)) && ret[1]) { - value = adjustCSS(elem, name, ret); - type = "number"; - } - if (value == null || value !== value) { - return; - } - if (type === "number") { - value += ret && ret[3] || (isAutoPx(origName) ? "px" : ""); - } - if (isIE && value === "" && name.indexOf("background") === 0) { - style[name] = "inherit"; - } - if (!hooks || !("set" in hooks) || (value = hooks.set(elem, value, extra)) !== void 0) { - if (isCustomProp) { - style.setProperty(name, value); - } else { - style[name] = value; - } - } - } else { - if (hooks && "get" in hooks && (ret = hooks.get(elem, false, extra)) !== void 0) { - return ret; - } - return style[name]; - } - }, - css: function(elem, name, extra, styles) { - var val, num, hooks, origName = cssCamelCase(name), isCustomProp = rcustomProp.test(name); - if (!isCustomProp) { - name = finalPropName(origName); - } - hooks = jQuery2.cssHooks[name] || jQuery2.cssHooks[origName]; - if (hooks && "get" in hooks) { - val = hooks.get(elem, true, extra); - } - if (val === void 0) { - val = curCSS(elem, name, styles); - } - if (val === "normal" && name in cssNormalTransform) { - val = cssNormalTransform[name]; - } - if (extra === "" || extra) { - num = parseFloat(val); - return extra === true || isFinite(num) ? num || 0 : val; - } - return val; - } - }); - jQuery2.each(["height", "width"], function(_i, dimension) { - jQuery2.cssHooks[dimension] = { - get: function(elem, computed, extra) { - if (computed) { - return jQuery2.css(elem, "display") === "none" ? swap(elem, cssShow, function() { - return getWidthOrHeight(elem, dimension, extra); - }) : getWidthOrHeight(elem, dimension, extra); - } - }, - set: function(elem, value, extra) { - var matches2, styles = getStyles(elem), isBorderBox = extra && jQuery2.css(elem, "boxSizing", false, styles) === "border-box", subtract = extra ? boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : 0; - if (subtract && (matches2 = rcssNum.exec(value)) && (matches2[3] || "px") !== "px") { - elem.style[dimension] = value; - value = jQuery2.css(elem, dimension); - } - return setPositiveNumber(elem, value, subtract); - } - }; - }); - jQuery2.each({ - margin: "", - padding: "", - border: "Width" - }, function(prefix, suffix) { - jQuery2.cssHooks[prefix + suffix] = { - expand: function(value) { - var i2 = 0, expanded = {}, parts = typeof value === "string" ? value.split(" ") : [value]; - for (; i2 < 4; i2++) { - expanded[prefix + cssExpand[i2] + suffix] = parts[i2] || parts[i2 - 2] || parts[0]; - } - return expanded; - } - }; - if (prefix !== "margin") { - jQuery2.cssHooks[prefix + suffix].set = setPositiveNumber; - } - }); - jQuery2.fn.extend({ - css: function(name, value) { - return access(this, function(elem, name2, value2) { - var styles, len, map = {}, i2 = 0; - if (Array.isArray(name2)) { - styles = getStyles(elem); - len = name2.length; - for (; i2 < len; i2++) { - map[name2[i2]] = jQuery2.css(elem, name2[i2], false, styles); - } - return map; - } - return value2 !== void 0 ? jQuery2.style(elem, name2, value2) : jQuery2.css(elem, name2); - }, name, value, arguments.length > 1); - } - }); - function Tween(elem, options, prop, end, easing) { - return new Tween.prototype.init(elem, options, prop, end, easing); - } - jQuery2.Tween = Tween; - Tween.prototype = { - constructor: Tween, - init: function(elem, options, prop, end, easing, unit) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery2.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || (isAutoPx(prop) ? "px" : ""); - }, - cur: function() { - var hooks = Tween.propHooks[this.prop]; - return hooks && hooks.get ? hooks.get(this) : Tween.propHooks._default.get(this); - }, - run: function(percent) { - var eased, hooks = Tween.propHooks[this.prop]; - if (this.options.duration) { - this.pos = eased = jQuery2.easing[this.easing]( - percent, - this.options.duration * percent, - 0, - 1, - this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = (this.end - this.start) * eased + this.start; - if (this.options.step) { - this.options.step.call(this.elem, this.now, this); - } - if (hooks && hooks.set) { - hooks.set(this); - } else { - Tween.propHooks._default.set(this); - } - return this; - } - }; - Tween.prototype.init.prototype = Tween.prototype; - Tween.propHooks = { - _default: { - get: function(tween) { - var result; - if (tween.elem.nodeType !== 1 || tween.elem[tween.prop] != null && tween.elem.style[tween.prop] == null) { - return tween.elem[tween.prop]; - } - result = jQuery2.css(tween.elem, tween.prop, ""); - return !result || result === "auto" ? 0 : result; - }, - set: function(tween) { - if (jQuery2.fx.step[tween.prop]) { - jQuery2.fx.step[tween.prop](tween); - } else if (tween.elem.nodeType === 1 && (jQuery2.cssHooks[tween.prop] || tween.elem.style[finalPropName(tween.prop)] != null)) { - jQuery2.style(tween.elem, tween.prop, tween.now + tween.unit); - } else { - tween.elem[tween.prop] = tween.now; - } - } - } - }; - jQuery2.easing = { - linear: function(p) { - return p; - }, - swing: function(p) { - return 0.5 - Math.cos(p * Math.PI) / 2; - }, - _default: "swing" - }; - jQuery2.fx = Tween.prototype.init; - jQuery2.fx.step = {}; - var fxNow, inProgress, rfxtypes = /^(?:toggle|show|hide)$/, rrun = /queueHooks$/; - function schedule() { - if (inProgress) { - if (document$1.hidden === false && window2.requestAnimationFrame) { - window2.requestAnimationFrame(schedule); - } else { - window2.setTimeout(schedule, 13); - } - jQuery2.fx.tick(); - } - } - function createFxNow() { - window2.setTimeout(function() { - fxNow = void 0; - }); - return fxNow = Date.now(); - } - function genFx(type, includeWidth) { - var which, i2 = 0, attrs = { height: type }; - includeWidth = includeWidth ? 1 : 0; - for (; i2 < 4; i2 += 2 - includeWidth) { - which = cssExpand[i2]; - attrs["margin" + which] = attrs["padding" + which] = type; - } - if (includeWidth) { - attrs.opacity = attrs.width = type; - } - return attrs; - } - function createTween(value, prop, animation) { - var tween, collection = (Animation.tweeners[prop] || []).concat(Animation.tweeners["*"]), index = 0, length = collection.length; - for (; index < length; index++) { - if (tween = collection[index].call(animation, prop, value)) { - return tween; - } - } - } - function defaultPrefilter(elem, props, opts) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, isBox = "width" in props || "height" in props, anim = this, orig = {}, style = elem.style, hidden = elem.nodeType && isHiddenWithinTree(elem), dataShow = dataPriv.get(elem, "fxshow"); - if (!opts.queue) { - hooks = jQuery2._queueHooks(elem, "fx"); - if (hooks.unqueued == null) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if (!hooks.unqueued) { - oldfire(); - } - }; - } - hooks.unqueued++; - anim.always(function() { - anim.always(function() { - hooks.unqueued--; - if (!jQuery2.queue(elem, "fx").length) { - hooks.empty.fire(); - } - }); - }); - } - for (prop in props) { - value = props[prop]; - if (rfxtypes.test(value)) { - delete props[prop]; - toggle = toggle || value === "toggle"; - if (value === (hidden ? "hide" : "show")) { - if (value === "show" && dataShow && dataShow[prop] !== void 0) { - hidden = true; - } else { - continue; - } - } - orig[prop] = dataShow && dataShow[prop] || jQuery2.style(elem, prop); - } - } - propTween = !jQuery2.isEmptyObject(props); - if (!propTween && jQuery2.isEmptyObject(orig)) { - return; - } - if (isBox && elem.nodeType === 1) { - opts.overflow = [style.overflow, style.overflowX, style.overflowY]; - restoreDisplay = dataShow && dataShow.display; - if (restoreDisplay == null) { - restoreDisplay = dataPriv.get(elem, "display"); - } - display = jQuery2.css(elem, "display"); - if (display === "none") { - if (restoreDisplay) { - display = restoreDisplay; - } else { - showHide([elem], true); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery2.css(elem, "display"); - showHide([elem]); - } - } - if (display === "inline" || display === "inline-block" && restoreDisplay != null) { - if (jQuery2.css(elem, "float") === "none") { - if (!propTween) { - anim.done(function() { - style.display = restoreDisplay; - }); - if (restoreDisplay == null) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - if (opts.overflow) { - style.overflow = "hidden"; - anim.always(function() { - style.overflow = opts.overflow[0]; - style.overflowX = opts.overflow[1]; - style.overflowY = opts.overflow[2]; - }); - } - propTween = false; - for (prop in orig) { - if (!propTween) { - if (dataShow) { - if ("hidden" in dataShow) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.set(elem, "fxshow", { display: restoreDisplay }); - } - if (toggle) { - dataShow.hidden = !hidden; - } - if (hidden) { - showHide([elem], true); - } - anim.done(function() { - if (!hidden) { - showHide([elem]); - } - dataPriv.remove(elem, "fxshow"); - for (prop in orig) { - jQuery2.style(elem, prop, orig[prop]); - } - }); - } - propTween = createTween(hidden ? dataShow[prop] : 0, prop, anim); - if (!(prop in dataShow)) { - dataShow[prop] = propTween.start; - if (hidden) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } - } - function propFilter(props, specialEasing) { - var index, name, easing, value, hooks; - for (index in props) { - name = cssCamelCase(index); - easing = specialEasing[name]; - value = props[index]; - if (Array.isArray(value)) { - easing = value[1]; - value = props[index] = value[0]; - } - if (index !== name) { - props[name] = value; - delete props[index]; - } - hooks = jQuery2.cssHooks[name]; - if (hooks && "expand" in hooks) { - value = hooks.expand(value); - delete props[name]; - for (index in value) { - if (!(index in props)) { - props[index] = value[index]; - specialEasing[index] = easing; - } - } - } else { - specialEasing[name] = easing; - } - } - } - function Animation(elem, properties, options) { - var result, stopped, index = 0, length = Animation.prefilters.length, deferred = jQuery2.Deferred().always(function() { - delete tick.elem; - }), tick = function() { - if (stopped) { - return false; - } - var currentTime = fxNow || createFxNow(), remaining = Math.max(0, animation.startTime + animation.duration - currentTime), percent = 1 - (remaining / animation.duration || 0), index2 = 0, length2 = animation.tweens.length; - for (; index2 < length2; index2++) { - animation.tweens[index2].run(percent); - } - deferred.notifyWith(elem, [animation, percent, remaining]); - if (percent < 1 && length2) { - return remaining; - } - if (!length2) { - deferred.notifyWith(elem, [animation, 1, 0]); - } - deferred.resolveWith(elem, [animation]); - return false; - }, animation = deferred.promise({ - elem, - props: jQuery2.extend({}, properties), - opts: jQuery2.extend(true, { - specialEasing: {}, - easing: jQuery2.easing._default - }, options), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function(prop, end) { - var tween = jQuery2.Tween( - elem, - animation.opts, - prop, - end, - animation.opts.specialEasing[prop] || animation.opts.easing - ); - animation.tweens.push(tween); - return tween; - }, - stop: function(gotoEnd) { - var index2 = 0, length2 = gotoEnd ? animation.tweens.length : 0; - if (stopped) { - return this; - } - stopped = true; - for (; index2 < length2; index2++) { - animation.tweens[index2].run(1); - } - if (gotoEnd) { - deferred.notifyWith(elem, [animation, 1, 0]); - deferred.resolveWith(elem, [animation, gotoEnd]); - } else { - deferred.rejectWith(elem, [animation, gotoEnd]); - } - return this; - } - }), props = animation.props; - propFilter(props, animation.opts.specialEasing); - for (; index < length; index++) { - result = Animation.prefilters[index].call(animation, elem, props, animation.opts); - if (result) { - if (typeof result.stop === "function") { - jQuery2._queueHooks(animation.elem, animation.opts.queue).stop = result.stop.bind(result); - } - return result; - } - } - jQuery2.map(props, createTween, animation); - if (typeof animation.opts.start === "function") { - animation.opts.start.call(elem, animation); - } - animation.progress(animation.opts.progress).done(animation.opts.done, animation.opts.complete).fail(animation.opts.fail).always(animation.opts.always); - jQuery2.fx.timer( - jQuery2.extend(tick, { - elem, - anim: animation, - queue: animation.opts.queue - }) - ); - return animation; - } - jQuery2.Animation = jQuery2.extend(Animation, { - tweeners: { - "*": [function(prop, value) { - var tween = this.createTween(prop, value); - adjustCSS(tween.elem, prop, rcssNum.exec(value), tween); - return tween; - }] - }, - tweener: function(props, callback) { - if (typeof props === "function") { - callback = props; - props = ["*"]; - } else { - props = props.match(rnothtmlwhite); - } - var prop, index = 0, length = props.length; - for (; index < length; index++) { - prop = props[index]; - Animation.tweeners[prop] = Animation.tweeners[prop] || []; - Animation.tweeners[prop].unshift(callback); - } - }, - prefilters: [defaultPrefilter], - prefilter: function(callback, prepend) { - if (prepend) { - Animation.prefilters.unshift(callback); - } else { - Animation.prefilters.push(callback); - } - } - }); - jQuery2.speed = function(speed, easing, fn) { - var opt = speed && typeof speed === "object" ? jQuery2.extend({}, speed) : { - complete: fn || easing || typeof speed === "function" && speed, - duration: speed, - easing: fn && easing || easing && typeof easing !== "function" && easing - }; - if (jQuery2.fx.off) { - opt.duration = 0; - } else { - if (typeof opt.duration !== "number") { - if (opt.duration in jQuery2.fx.speeds) { - opt.duration = jQuery2.fx.speeds[opt.duration]; - } else { - opt.duration = jQuery2.fx.speeds._default; - } - } - } - if (opt.queue == null || opt.queue === true) { - opt.queue = "fx"; - } - opt.old = opt.complete; - opt.complete = function() { - if (typeof opt.old === "function") { - opt.old.call(this); - } - if (opt.queue) { - jQuery2.dequeue(this, opt.queue); - } - }; - return opt; - }; - jQuery2.fn.extend({ - fadeTo: function(speed, to, easing, callback) { - return this.filter(isHiddenWithinTree).css("opacity", 0).show().end().animate({ opacity: to }, speed, easing, callback); - }, - animate: function(prop, speed, easing, callback) { - var empty = jQuery2.isEmptyObject(prop), optall = jQuery2.speed(speed, easing, callback), doAnimation = function() { - var anim = Animation(this, jQuery2.extend({}, prop), optall); - if (empty || dataPriv.get(this, "finish")) { - anim.stop(true); - } - }; - doAnimation.finish = doAnimation; - return empty || optall.queue === false ? this.each(doAnimation) : this.queue(optall.queue, doAnimation); - }, - stop: function(type, clearQueue, gotoEnd) { - var stopQueue = function(hooks) { - var stop = hooks.stop; - delete hooks.stop; - stop(gotoEnd); - }; - if (typeof type !== "string") { - gotoEnd = clearQueue; - clearQueue = type; - type = void 0; - } - if (clearQueue) { - this.queue(type || "fx", []); - } - return this.each(function() { - var dequeue = true, index = type != null && type + "queueHooks", timers = jQuery2.timers, data = dataPriv.get(this); - if (index) { - if (data[index] && data[index].stop) { - stopQueue(data[index]); - } - } else { - for (index in data) { - if (data[index] && data[index].stop && rrun.test(index)) { - stopQueue(data[index]); - } - } - } - for (index = timers.length; index--; ) { - if (timers[index].elem === this && (type == null || timers[index].queue === type)) { - timers[index].anim.stop(gotoEnd); - dequeue = false; - timers.splice(index, 1); - } - } - if (dequeue || !gotoEnd) { - jQuery2.dequeue(this, type); - } - }); - }, - finish: function(type) { - if (type !== false) { - type = type || "fx"; - } - return this.each(function() { - var index, data = dataPriv.get(this), queue = data[type + "queue"], hooks = data[type + "queueHooks"], timers = jQuery2.timers, length = queue ? queue.length : 0; - data.finish = true; - jQuery2.queue(this, type, []); - if (hooks && hooks.stop) { - hooks.stop.call(this, true); - } - for (index = timers.length; index--; ) { - if (timers[index].elem === this && timers[index].queue === type) { - timers[index].anim.stop(true); - timers.splice(index, 1); - } - } - for (index = 0; index < length; index++) { - if (queue[index] && queue[index].finish) { - queue[index].finish.call(this); - } - } - delete data.finish; - }); - } - }); - jQuery2.each(["toggle", "show", "hide"], function(_i, name) { - var cssFn = jQuery2.fn[name]; - jQuery2.fn[name] = function(speed, easing, callback) { - return speed == null || typeof speed === "boolean" ? cssFn.apply(this, arguments) : this.animate(genFx(name, true), speed, easing, callback); - }; - }); - jQuery2.each({ - slideDown: genFx("show"), - slideUp: genFx("hide"), - slideToggle: genFx("toggle"), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } - }, function(name, props) { - jQuery2.fn[name] = function(speed, easing, callback) { - return this.animate(props, speed, easing, callback); - }; - }); - jQuery2.timers = []; - jQuery2.fx.tick = function() { - var timer, i2 = 0, timers = jQuery2.timers; - fxNow = Date.now(); - for (; i2 < timers.length; i2++) { - timer = timers[i2]; - if (!timer() && timers[i2] === timer) { - timers.splice(i2--, 1); - } - } - if (!timers.length) { - jQuery2.fx.stop(); - } - fxNow = void 0; - }; - jQuery2.fx.timer = function(timer) { - jQuery2.timers.push(timer); - jQuery2.fx.start(); - }; - jQuery2.fx.start = function() { - if (inProgress) { - return; - } - inProgress = true; - schedule(); - }; - jQuery2.fx.stop = function() { - inProgress = null; - }; - jQuery2.fx.speeds = { - slow: 600, - fast: 200, - // Default speed - _default: 400 - }; - jQuery2.fn.delay = function(time, type) { - time = jQuery2.fx ? jQuery2.fx.speeds[time] || time : time; - type = type || "fx"; - return this.queue(type, function(next, hooks) { - var timeout = window2.setTimeout(next, time); - hooks.stop = function() { - window2.clearTimeout(timeout); - }; - }); - }; - var rfocusable = /^(?:input|select|textarea|button)$/i, rclickable = /^(?:a|area)$/i; - jQuery2.fn.extend({ - prop: function(name, value) { - return access(this, jQuery2.prop, name, value, arguments.length > 1); - }, - removeProp: function(name) { - return this.each(function() { - delete this[jQuery2.propFix[name] || name]; - }); - } - }); - jQuery2.extend({ - prop: function(elem, name, value) { - var ret, hooks, nType = elem.nodeType; - if (nType === 3 || nType === 8 || nType === 2) { - return; - } - if (nType !== 1 || !jQuery2.isXMLDoc(elem)) { - name = jQuery2.propFix[name] || name; - hooks = jQuery2.propHooks[name]; - } - if (value !== void 0) { - if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== void 0) { - return ret; - } - return elem[name] = value; - } - if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) { - return ret; - } - return elem[name]; - }, - propHooks: { - tabIndex: { - get: function(elem) { - var tabindex = elem.getAttribute("tabindex"); - if (tabindex) { - return parseInt(tabindex, 10); - } - if (rfocusable.test(elem.nodeName) || // href-less anchor's `tabIndex` property value is `0` and - // the `tabindex` attribute value: `null`. We want `-1`. - rclickable.test(elem.nodeName) && elem.href) { - return 0; - } - return -1; - } - } - }, - propFix: { - "for": "htmlFor", - "class": "className" - } - }); - if (isIE) { - jQuery2.propHooks.selected = { - get: function(elem) { - var parent = elem.parentNode; - if (parent && parent.parentNode) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function(elem) { - var parent = elem.parentNode; - if (parent) { - parent.selectedIndex; - if (parent.parentNode) { - parent.parentNode.selectedIndex; - } - } - } - }; - } - jQuery2.each([ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" - ], function() { - jQuery2.propFix[this.toLowerCase()] = this; - }); - function stripAndCollapse(value) { - var tokens = value.match(rnothtmlwhite) || []; - return tokens.join(" "); - } - function getClass(elem) { - return elem.getAttribute && elem.getAttribute("class") || ""; - } - function classesToArray(value) { - if (Array.isArray(value)) { - return value; - } - if (typeof value === "string") { - return value.match(rnothtmlwhite) || []; - } - return []; - } - jQuery2.fn.extend({ - addClass: function(value) { - var classNames, cur, curValue, className, i2, finalValue; - if (typeof value === "function") { - return this.each(function(j) { - jQuery2(this).addClass(value.call(this, j, getClass(this))); - }); - } - classNames = classesToArray(value); - if (classNames.length) { - return this.each(function() { - curValue = getClass(this); - cur = this.nodeType === 1 && " " + stripAndCollapse(curValue) + " "; - if (cur) { - for (i2 = 0; i2 < classNames.length; i2++) { - className = classNames[i2]; - if (cur.indexOf(" " + className + " ") < 0) { - cur += className + " "; - } - } - finalValue = stripAndCollapse(cur); - if (curValue !== finalValue) { - this.setAttribute("class", finalValue); - } - } - }); - } - return this; - }, - removeClass: function(value) { - var classNames, cur, curValue, className, i2, finalValue; - if (typeof value === "function") { - return this.each(function(j) { - jQuery2(this).removeClass(value.call(this, j, getClass(this))); - }); - } - if (!arguments.length) { - return this.attr("class", ""); - } - classNames = classesToArray(value); - if (classNames.length) { - return this.each(function() { - curValue = getClass(this); - cur = this.nodeType === 1 && " " + stripAndCollapse(curValue) + " "; - if (cur) { - for (i2 = 0; i2 < classNames.length; i2++) { - className = classNames[i2]; - while (cur.indexOf(" " + className + " ") > -1) { - cur = cur.replace(" " + className + " ", " "); - } - } - finalValue = stripAndCollapse(cur); - if (curValue !== finalValue) { - this.setAttribute("class", finalValue); - } - } - }); - } - return this; - }, - toggleClass: function(value, stateVal) { - var classNames, className, i2, self; - if (typeof value === "function") { - return this.each(function(i3) { - jQuery2(this).toggleClass( - value.call(this, i3, getClass(this), stateVal), - stateVal - ); - }); - } - if (typeof stateVal === "boolean") { - return stateVal ? this.addClass(value) : this.removeClass(value); - } - classNames = classesToArray(value); - if (classNames.length) { - return this.each(function() { - self = jQuery2(this); - for (i2 = 0; i2 < classNames.length; i2++) { - className = classNames[i2]; - if (self.hasClass(className)) { - self.removeClass(className); - } else { - self.addClass(className); - } - } - }); - } - return this; - }, - hasClass: function(selector) { - var className, elem, i2 = 0; - className = " " + selector + " "; - while (elem = this[i2++]) { - if (elem.nodeType === 1 && (" " + stripAndCollapse(getClass(elem)) + " ").indexOf(className) > -1) { - return true; - } - } - return false; - } - }); - jQuery2.fn.extend({ - val: function(value) { - var hooks, ret, valueIsFunction, elem = this[0]; - if (!arguments.length) { - if (elem) { - hooks = jQuery2.valHooks[elem.type] || jQuery2.valHooks[elem.nodeName.toLowerCase()]; - if (hooks && "get" in hooks && (ret = hooks.get(elem, "value")) !== void 0) { - return ret; - } - ret = elem.value; - return ret == null ? "" : ret; - } - return; - } - valueIsFunction = typeof value === "function"; - return this.each(function(i2) { - var val; - if (this.nodeType !== 1) { - return; - } - if (valueIsFunction) { - val = value.call(this, i2, jQuery2(this).val()); - } else { - val = value; - } - if (val == null) { - val = ""; - } else if (typeof val === "number") { - val += ""; - } else if (Array.isArray(val)) { - val = jQuery2.map(val, function(value2) { - return value2 == null ? "" : value2 + ""; - }); - } - hooks = jQuery2.valHooks[this.type] || jQuery2.valHooks[this.nodeName.toLowerCase()]; - if (!hooks || !("set" in hooks) || hooks.set(this, val, "value") === void 0) { - this.value = val; - } - }); - } - }); - jQuery2.extend({ - valHooks: { - select: { - get: function(elem) { - var value, option, i2, options = elem.options, index = elem.selectedIndex, one = elem.type === "select-one", values = one ? null : [], max = one ? index + 1 : options.length; - if (index < 0) { - i2 = max; - } else { - i2 = one ? index : 0; - } - for (; i2 < max; i2++) { - option = options[i2]; - if (option.selected && // Don't return options that are disabled or in a disabled optgroup - !option.disabled && (!option.parentNode.disabled || !nodeName(option.parentNode, "optgroup"))) { - value = jQuery2(option).val(); - if (one) { - return value; - } - values.push(value); - } - } - return values; - }, - set: function(elem, value) { - var optionSet, option, options = elem.options, values = jQuery2.makeArray(value), i2 = options.length; - while (i2--) { - option = options[i2]; - if (option.selected = jQuery2.inArray(jQuery2(option).val(), values) > -1) { - optionSet = true; - } - } - if (!optionSet) { - elem.selectedIndex = -1; - } - return values; - } - } - } - }); - if (isIE) { - jQuery2.valHooks.option = { - get: function(elem) { - var val = elem.getAttribute("value"); - return val != null ? val : ( - // Support: IE <=10 - 11+ - // option.text throws exceptions (trac-14686, trac-14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse(jQuery2.text(elem)) - ); - } - }; - } - jQuery2.each(["radio", "checkbox"], function() { - jQuery2.valHooks[this] = { - set: function(elem, value) { - if (Array.isArray(value)) { - return elem.checked = jQuery2.inArray(jQuery2(elem).val(), value) > -1; - } - } - }; - }); - var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, stopPropagationCallback = function(e) { - e.stopPropagation(); - }; - jQuery2.extend(jQuery2.event, { - trigger: function(event, data, elem, onlyHandlers) { - var i2, cur, tmp, bubbleType, ontype, handle, special, lastElement, eventPath = [elem || document$1], type = hasOwn.call(event, "type") ? event.type : event, namespaces = hasOwn.call(event, "namespace") ? event.namespace.split(".") : []; - cur = lastElement = tmp = elem = elem || document$1; - if (elem.nodeType === 3 || elem.nodeType === 8) { - return; - } - if (rfocusMorph.test(type + jQuery2.event.triggered)) { - return; - } - if (type.indexOf(".") > -1) { - namespaces = type.split("."); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf(":") < 0 && "on" + type; - event = event[jQuery2.expando] ? event : new jQuery2.Event(type, typeof event === "object" && event); - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join("."); - event.rnamespace = event.namespace ? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null; - event.result = void 0; - if (!event.target) { - event.target = elem; - } - data = data == null ? [event] : jQuery2.makeArray(data, [event]); - special = jQuery2.event.special[type] || {}; - if (!onlyHandlers && special.trigger && special.trigger.apply(elem, data) === false) { - return; - } - if (!onlyHandlers && !special.noBubble && !isWindow(elem)) { - bubbleType = special.delegateType || type; - if (!rfocusMorph.test(bubbleType + type)) { - cur = cur.parentNode; - } - for (; cur; cur = cur.parentNode) { - eventPath.push(cur); - tmp = cur; - } - if (tmp === (elem.ownerDocument || document$1)) { - eventPath.push(tmp.defaultView || tmp.parentWindow || window2); - } - } - i2 = 0; - while ((cur = eventPath[i2++]) && !event.isPropagationStopped()) { - lastElement = cur; - event.type = i2 > 1 ? bubbleType : special.bindType || type; - handle = (dataPriv.get(cur, "events") || /* @__PURE__ */ Object.create(null))[event.type] && dataPriv.get(cur, "handle"); - if (handle) { - handle.apply(cur, data); - } - handle = ontype && cur[ontype]; - if (handle && handle.apply && acceptData(cur)) { - event.result = handle.apply(cur, data); - if (event.result === false) { - event.preventDefault(); - } - } - } - event.type = type; - if (!onlyHandlers && !event.isDefaultPrevented()) { - if ((!special._default || special._default.apply(eventPath.pop(), data) === false) && acceptData(elem)) { - if (ontype && typeof elem[type] === "function" && !isWindow(elem)) { - tmp = elem[ontype]; - if (tmp) { - elem[ontype] = null; - } - jQuery2.event.triggered = type; - if (event.isPropagationStopped()) { - lastElement.addEventListener(type, stopPropagationCallback); - } - elem[type](); - if (event.isPropagationStopped()) { - lastElement.removeEventListener(type, stopPropagationCallback); - } - jQuery2.event.triggered = void 0; - if (tmp) { - elem[ontype] = tmp; - } - } - } - } - return event.result; - }, - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function(type, elem, event) { - var e = jQuery2.extend( - new jQuery2.Event(), - event, - { - type, - isSimulated: true - } - ); - jQuery2.event.trigger(e, null, elem); - } - }); - jQuery2.fn.extend({ - trigger: function(type, data) { - return this.each(function() { - jQuery2.event.trigger(type, data, this); - }); - }, - triggerHandler: function(type, data) { - var elem = this[0]; - if (elem) { - return jQuery2.event.trigger(type, data, elem, true); - } - } - }); - var location = window2.location; - var nonce = { guid: Date.now() }; - var rquery = /\?/; - jQuery2.parseXML = function(data) { - var xml, parserErrorElem; - if (!data || typeof data !== "string") { - return null; - } - try { - xml = new window2.DOMParser().parseFromString(data, "text/xml"); - } catch (e) { - } - parserErrorElem = xml && xml.getElementsByTagName("parsererror")[0]; - if (!xml || parserErrorElem) { - jQuery2.error("Invalid XML: " + (parserErrorElem ? jQuery2.map(parserErrorElem.childNodes, function(el) { - return el.textContent; - }).join("\n") : data)); - } - return xml; - }; - var rbracket = /\[\]$/, rCRLF = /\r?\n/g, rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, rsubmittable = /^(?:input|select|textarea|keygen)/i; - function buildParams(prefix, obj, traditional, add) { - var name; - if (Array.isArray(obj)) { - jQuery2.each(obj, function(i2, v) { - if (traditional || rbracket.test(prefix)) { - add(prefix, v); - } else { - buildParams( - prefix + "[" + (typeof v === "object" && v != null ? i2 : "") + "]", - v, - traditional, - add - ); - } - }); - } else if (!traditional && toType(obj) === "object") { - for (name in obj) { - buildParams(prefix + "[" + name + "]", obj[name], traditional, add); - } - } else { - add(prefix, obj); - } - } - jQuery2.param = function(a, traditional) { - var prefix, s = [], add = function(key, valueOrFunction) { - var value = typeof valueOrFunction === "function" ? valueOrFunction() : valueOrFunction; - s[s.length] = encodeURIComponent(key) + "=" + encodeURIComponent(value == null ? "" : value); - }; - if (a == null) { - return ""; - } - if (Array.isArray(a) || a.jquery && !jQuery2.isPlainObject(a)) { - jQuery2.each(a, function() { - add(this.name, this.value); - }); - } else { - for (prefix in a) { - buildParams(prefix, a[prefix], traditional, add); - } - } - return s.join("&"); - }; - jQuery2.fn.extend({ - serialize: function() { - return jQuery2.param(this.serializeArray()); - }, - serializeArray: function() { - return this.map(function() { - var elements = jQuery2.prop(this, "elements"); - return elements ? jQuery2.makeArray(elements) : this; - }).filter(function() { - var type = this.type; - return this.name && !jQuery2(this).is(":disabled") && rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(type) && (this.checked || !rcheckableType.test(type)); - }).map(function(_i, elem) { - var val = jQuery2(this).val(); - if (val == null) { - return null; - } - if (Array.isArray(val)) { - return jQuery2.map(val, function(val2) { - return { name: elem.name, value: val2.replace(rCRLF, "\r\n") }; - }); - } - return { name: elem.name, value: val.replace(rCRLF, "\r\n") }; - }).get(); - } - }); - var r20 = /%20/g, rhash = /#.*$/, rantiCache = /([?&])_=[^&]*/, rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, rnoContent = /^(?:GET|HEAD)$/, rprotocol = /^\/\//, prefilters = {}, transports = {}, allTypes = "*/".concat("*"), originAnchor = document$1.createElement("a"); - originAnchor.href = location.href; - function addToPrefiltersOrTransports(structure) { - return function(dataTypeExpression, func) { - if (typeof dataTypeExpression !== "string") { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - var dataType, i2 = 0, dataTypes = dataTypeExpression.toLowerCase().match(rnothtmlwhite) || []; - if (typeof func === "function") { - while (dataType = dataTypes[i2++]) { - if (dataType[0] === "+") { - dataType = dataType.slice(1) || "*"; - (structure[dataType] = structure[dataType] || []).unshift(func); - } else { - (structure[dataType] = structure[dataType] || []).push(func); - } - } - } - }; - } - function inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR) { - var inspected = {}, seekingTransport = structure === transports; - function inspect(dataType) { - var selected; - inspected[dataType] = true; - jQuery2.each(structure[dataType] || [], function(_, prefilterOrFactory) { - var dataTypeOrTransport = prefilterOrFactory(options, originalOptions, jqXHR); - if (typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[dataTypeOrTransport]) { - options.dataTypes.unshift(dataTypeOrTransport); - inspect(dataTypeOrTransport); - return false; - } else if (seekingTransport) { - return !(selected = dataTypeOrTransport); - } - }); - return selected; - } - return inspect(options.dataTypes[0]) || !inspected["*"] && inspect("*"); - } - function ajaxExtend(target, src) { - var key, deep, flatOptions = jQuery2.ajaxSettings.flatOptions || {}; - for (key in src) { - if (src[key] !== void 0) { - (flatOptions[key] ? target : deep || (deep = {}))[key] = src[key]; - } - } - if (deep) { - jQuery2.extend(true, target, deep); - } - return target; - } - function ajaxHandleResponses(s, jqXHR, responses) { - var ct, type, finalDataType, firstDataType, contents = s.contents, dataTypes = s.dataTypes; - while (dataTypes[0] === "*") { - dataTypes.shift(); - if (ct === void 0) { - ct = s.mimeType || jqXHR.getResponseHeader("Content-Type"); - } - } - if (ct) { - for (type in contents) { - if (contents[type] && contents[type].test(ct)) { - dataTypes.unshift(type); - break; - } - } - } - if (dataTypes[0] in responses) { - finalDataType = dataTypes[0]; - } else { - for (type in responses) { - if (!dataTypes[0] || s.converters[type + " " + dataTypes[0]]) { - finalDataType = type; - break; - } - if (!firstDataType) { - firstDataType = type; - } - } - finalDataType = finalDataType || firstDataType; - } - if (finalDataType) { - if (finalDataType !== dataTypes[0]) { - dataTypes.unshift(finalDataType); - } - return responses[finalDataType]; - } - } - function ajaxConvert(s, response, jqXHR, isSuccess) { - var conv2, current, conv, tmp, prev, converters = {}, dataTypes = s.dataTypes.slice(); - if (dataTypes[1]) { - for (conv in s.converters) { - converters[conv.toLowerCase()] = s.converters[conv]; - } - } - current = dataTypes.shift(); - while (current) { - if (s.responseFields[current]) { - jqXHR[s.responseFields[current]] = response; - } - if (!prev && isSuccess && s.dataFilter) { - response = s.dataFilter(response, s.dataType); - } - prev = current; - current = dataTypes.shift(); - if (current) { - if (current === "*") { - current = prev; - } else if (prev !== "*" && prev !== current) { - conv = converters[prev + " " + current] || converters["* " + current]; - if (!conv) { - for (conv2 in converters) { - tmp = conv2.split(" "); - if (tmp[1] === current) { - conv = converters[prev + " " + tmp[0]] || converters["* " + tmp[0]]; - if (conv) { - if (conv === true) { - conv = converters[conv2]; - } else if (converters[conv2] !== true) { - current = tmp[0]; - dataTypes.unshift(tmp[1]); - } - break; - } - } - } - } - if (conv !== true) { - if (conv && s.throws) { - response = conv(response); - } else { - try { - response = conv(response); - } catch (e) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - return { state: "success", data: response }; - } - jQuery2.extend({ - // Counter for holding the number of active queries - active: 0, - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test(location.protocol), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - // Convert anything to text - "* text": String, - // Text to html (true = no transformation) - "text html": true, - // Evaluate text as a json expression - "text json": JSON.parse, - // Parse text as xml - "text xml": jQuery2.parseXML - }, - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function(target, settings) { - return settings ? ( - // Building a settings object - ajaxExtend(ajaxExtend(target, jQuery2.ajaxSettings), settings) - ) : ( - // Extending ajaxSettings - ajaxExtend(jQuery2.ajaxSettings, target) - ); - }, - ajaxPrefilter: addToPrefiltersOrTransports(prefilters), - ajaxTransport: addToPrefiltersOrTransports(transports), - // Main method - ajax: function(url, options) { - if (typeof url === "object") { - options = url; - url = void 0; - } - options = options || {}; - var transport, cacheURL, responseHeadersString, responseHeaders, timeoutTimer, urlAnchor, completed2, fireGlobals, i2, uncached, s = jQuery2.ajaxSetup({}, options), callbackContext = s.context || s, globalEventContext = s.context && (callbackContext.nodeType || callbackContext.jquery) ? jQuery2(callbackContext) : jQuery2.event, deferred = jQuery2.Deferred(), completeDeferred = jQuery2.Callbacks("once memory"), statusCode = s.statusCode || {}, requestHeaders = {}, requestHeadersNames = {}, strAbort = "canceled", jqXHR = { - readyState: 0, - // Builds headers hashtable if needed - getResponseHeader: function(key) { - var match; - if (completed2) { - if (!responseHeaders) { - responseHeaders = {}; - while (match = rheaders.exec(responseHeadersString)) { - responseHeaders[match[1].toLowerCase() + " "] = (responseHeaders[match[1].toLowerCase() + " "] || []).concat(match[2]); - } - } - match = responseHeaders[key.toLowerCase() + " "]; - } - return match == null ? null : match.join(", "); - }, - // Raw string - getAllResponseHeaders: function() { - return completed2 ? responseHeadersString : null; - }, - // Caches the header - setRequestHeader: function(name, value) { - if (completed2 == null) { - name = requestHeadersNames[name.toLowerCase()] = requestHeadersNames[name.toLowerCase()] || name; - requestHeaders[name] = value; - } - return this; - }, - // Overrides response content-type header - overrideMimeType: function(type) { - if (completed2 == null) { - s.mimeType = type; - } - return this; - }, - // Status-dependent callbacks - statusCode: function(map) { - var code; - if (map) { - if (completed2) { - jqXHR.always(map[jqXHR.status]); - } else { - for (code in map) { - statusCode[code] = [statusCode[code], map[code]]; - } - } - } - return this; - }, - // Cancel the request - abort: function(statusText) { - var finalText = statusText || strAbort; - if (transport) { - transport.abort(finalText); - } - done2(0, finalText); - return this; - } - }; - deferred.promise(jqXHR); - s.url = ((url || s.url || location.href) + "").replace(rprotocol, location.protocol + "//"); - s.type = options.method || options.type || s.method || s.type; - s.dataTypes = (s.dataType || "*").toLowerCase().match(rnothtmlwhite) || [""]; - if (s.crossDomain == null) { - urlAnchor = document$1.createElement("a"); - try { - urlAnchor.href = s.url; - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== urlAnchor.protocol + "//" + urlAnchor.host; - } catch (e) { - s.crossDomain = true; - } - } - inspectPrefiltersOrTransports(prefilters, s, options, jqXHR); - if (s.data && s.processData && typeof s.data !== "string") { - s.data = jQuery2.param(s.data, s.traditional); - } - if (completed2) { - return jqXHR; - } - fireGlobals = jQuery2.event && s.global; - if (fireGlobals && jQuery2.active++ === 0) { - jQuery2.event.trigger("ajaxStart"); - } - s.type = s.type.toUpperCase(); - s.hasContent = !rnoContent.test(s.type); - cacheURL = s.url.replace(rhash, ""); - if (!s.hasContent) { - uncached = s.url.slice(cacheURL.length); - if (s.data && (s.processData || typeof s.data === "string")) { - cacheURL += (rquery.test(cacheURL) ? "&" : "?") + s.data; - delete s.data; - } - if (s.cache === false) { - cacheURL = cacheURL.replace(rantiCache, "$1"); - uncached = (rquery.test(cacheURL) ? "&" : "?") + "_=" + nonce.guid++ + uncached; - } - s.url = cacheURL + uncached; - } else if (s.data && s.processData && (s.contentType || "").indexOf("application/x-www-form-urlencoded") === 0) { - s.data = s.data.replace(r20, "+"); - } - if (s.ifModified) { - if (jQuery2.lastModified[cacheURL]) { - jqXHR.setRequestHeader("If-Modified-Since", jQuery2.lastModified[cacheURL]); - } - if (jQuery2.etag[cacheURL]) { - jqXHR.setRequestHeader("If-None-Match", jQuery2.etag[cacheURL]); - } - } - if (s.data && s.hasContent && s.contentType !== false || options.contentType) { - jqXHR.setRequestHeader("Content-Type", s.contentType); - } - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[0] && s.accepts[s.dataTypes[0]] ? s.accepts[s.dataTypes[0]] + (s.dataTypes[0] !== "*" ? ", " + allTypes + "; q=0.01" : "") : s.accepts["*"] - ); - for (i2 in s.headers) { - jqXHR.setRequestHeader(i2, s.headers[i2]); - } - if (s.beforeSend && (s.beforeSend.call(callbackContext, jqXHR, s) === false || completed2)) { - return jqXHR.abort(); - } - strAbort = "abort"; - completeDeferred.add(s.complete); - jqXHR.done(s.success); - jqXHR.fail(s.error); - transport = inspectPrefiltersOrTransports(transports, s, options, jqXHR); - if (!transport) { - done2(-1, "No Transport"); - } else { - jqXHR.readyState = 1; - if (fireGlobals) { - globalEventContext.trigger("ajaxSend", [jqXHR, s]); - } - if (completed2) { - return jqXHR; - } - if (s.async && s.timeout > 0) { - timeoutTimer = window2.setTimeout(function() { - jqXHR.abort("timeout"); - }, s.timeout); - } - try { - completed2 = false; - transport.send(requestHeaders, done2); - } catch (e) { - if (completed2) { - throw e; - } - done2(-1, e); - } - } - function done2(status, nativeStatusText, responses, headers) { - var isSuccess, success, error, response, modified, statusText = nativeStatusText; - if (completed2) { - return; - } - completed2 = true; - if (timeoutTimer) { - window2.clearTimeout(timeoutTimer); - } - transport = void 0; - responseHeadersString = headers || ""; - jqXHR.readyState = status > 0 ? 4 : 0; - isSuccess = status >= 200 && status < 300 || status === 304; - if (responses) { - response = ajaxHandleResponses(s, jqXHR, responses); - } - if (!isSuccess && jQuery2.inArray("script", s.dataTypes) > -1 && jQuery2.inArray("json", s.dataTypes) < 0) { - s.converters["text script"] = function() { - }; - } - response = ajaxConvert(s, response, jqXHR, isSuccess); - if (isSuccess) { - if (s.ifModified) { - modified = jqXHR.getResponseHeader("Last-Modified"); - if (modified) { - jQuery2.lastModified[cacheURL] = modified; - } - modified = jqXHR.getResponseHeader("etag"); - if (modified) { - jQuery2.etag[cacheURL] = modified; - } - } - if (status === 204 || s.type === "HEAD") { - statusText = "nocontent"; - } else if (status === 304) { - statusText = "notmodified"; - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - error = statusText; - if (status || !statusText) { - statusText = "error"; - if (status < 0) { - status = 0; - } - } - } - jqXHR.status = status; - jqXHR.statusText = (nativeStatusText || statusText) + ""; - if (isSuccess) { - deferred.resolveWith(callbackContext, [success, statusText, jqXHR]); - } else { - deferred.rejectWith(callbackContext, [jqXHR, statusText, error]); - } - jqXHR.statusCode(statusCode); - statusCode = void 0; - if (fireGlobals) { - globalEventContext.trigger( - isSuccess ? "ajaxSuccess" : "ajaxError", - [jqXHR, s, isSuccess ? success : error] - ); - } - completeDeferred.fireWith(callbackContext, [jqXHR, statusText]); - if (fireGlobals) { - globalEventContext.trigger("ajaxComplete", [jqXHR, s]); - if (!--jQuery2.active) { - jQuery2.event.trigger("ajaxStop"); - } - } - } - return jqXHR; - }, - getJSON: function(url, data, callback) { - return jQuery2.get(url, data, callback, "json"); - }, - getScript: function(url, callback) { - return jQuery2.get(url, void 0, callback, "script"); - } - }); - jQuery2.each(["get", "post"], function(_i, method) { - jQuery2[method] = function(url, data, callback, type) { - if (typeof data === "function" || data === null) { - type = type || callback; - callback = data; - data = void 0; - } - return jQuery2.ajax(jQuery2.extend({ - url, - type: method, - dataType: type, - data, - success: callback - }, jQuery2.isPlainObject(url) && url)); - }; - }); - jQuery2.ajaxPrefilter(function(s) { - var i2; - for (i2 in s.headers) { - if (i2.toLowerCase() === "content-type") { - s.contentType = s.headers[i2] || ""; - } - } - }); - jQuery2._evalUrl = function(url, options, doc) { - return jQuery2.ajax({ - url, - // Make this explicit, since user can override this through ajaxSetup (trac-11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - scriptAttrs: options.crossOrigin ? { "crossOrigin": options.crossOrigin } : void 0, - // Only evaluate the response if it is successful (gh-4126) - // dataFilter is not invoked for failure responses, so using it instead - // of the default converter is kludgy but it works. - converters: { - "text script": function() { - } - }, - dataFilter: function(response) { - jQuery2.globalEval(response, options, doc); - } - }); - }; - jQuery2.fn.extend({ - wrapAll: function(html) { - var wrap; - if (this[0]) { - if (typeof html === "function") { - html = html.call(this[0]); - } - wrap = jQuery2(html, this[0].ownerDocument).eq(0).clone(true); - if (this[0].parentNode) { - wrap.insertBefore(this[0]); - } - wrap.map(function() { - var elem = this; - while (elem.firstElementChild) { - elem = elem.firstElementChild; - } - return elem; - }).append(this); - } - return this; - }, - wrapInner: function(html) { - if (typeof html === "function") { - return this.each(function(i2) { - jQuery2(this).wrapInner(html.call(this, i2)); - }); - } - return this.each(function() { - var self = jQuery2(this), contents = self.contents(); - if (contents.length) { - contents.wrapAll(html); - } else { - self.append(html); - } - }); - }, - wrap: function(html) { - var htmlIsFunction = typeof html === "function"; - return this.each(function(i2) { - jQuery2(this).wrapAll(htmlIsFunction ? html.call(this, i2) : html); - }); - }, - unwrap: function(selector) { - this.parent(selector).not("body").each(function() { - jQuery2(this).replaceWith(this.childNodes); - }); - return this; - } - }); - jQuery2.expr.pseudos.hidden = function(elem) { - return !jQuery2.expr.pseudos.visible(elem); - }; - jQuery2.expr.pseudos.visible = function(elem) { - return !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length); - }; - jQuery2.ajaxSettings.xhr = function() { - return new window2.XMLHttpRequest(); - }; - var xhrSuccessStatus = { - // File protocol always yields status code 0, assume 200 - 0: 200 - }; - jQuery2.ajaxTransport(function(options) { - var callback; - return { - send: function(headers, complete) { - var i2, xhr = options.xhr(); - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - if (options.xhrFields) { - for (i2 in options.xhrFields) { - xhr[i2] = options.xhrFields[i2]; - } - } - if (options.mimeType && xhr.overrideMimeType) { - xhr.overrideMimeType(options.mimeType); - } - if (!options.crossDomain && !headers["X-Requested-With"]) { - headers["X-Requested-With"] = "XMLHttpRequest"; - } - for (i2 in headers) { - xhr.setRequestHeader(i2, headers[i2]); - } - callback = function(type) { - return function() { - if (callback) { - callback = xhr.onload = xhr.onerror = xhr.onabort = xhr.ontimeout = null; - if (type === "abort") { - xhr.abort(); - } else if (type === "error") { - complete( - // File: protocol always yields status 0; see trac-8605, trac-14207 - xhr.status, - xhr.statusText - ); - } else { - complete( - xhrSuccessStatus[xhr.status] || xhr.status, - xhr.statusText, - // For XHR2 non-text, let the caller handle it (gh-2498) - (xhr.responseType || "text") === "text" ? { text: xhr.responseText } : { binary: xhr.response }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - xhr.onload = callback(); - xhr.onabort = xhr.onerror = xhr.ontimeout = callback("error"); - callback = callback("abort"); - try { - xhr.send(options.hasContent && options.data || null); - } catch (e) { - if (callback) { - throw e; - } - } - }, - abort: function() { - if (callback) { - callback(); - } - } - }; - }); - function canUseScriptTag(s) { - return s.scriptAttrs || !s.headers && (s.crossDomain || // When dealing with JSONP (`s.dataTypes` include "json" then) - // don't use a script tag so that error responses still may have - // `responseJSON` set. Continue using a script tag for JSONP requests that: - // * are cross-domain as AJAX requests won't work without a CORS setup - // * have `scriptAttrs` set as that's a script-only functionality - // Note that this means JSONP requests violate strict CSP script-src settings. - // A proper solution is to migrate from using JSONP to a CORS setup. - s.async && jQuery2.inArray("json", s.dataTypes) < 0); - } - jQuery2.ajaxSetup({ - accepts: { - script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" - }, - converters: { - "text script": function(text) { - jQuery2.globalEval(text); - return text; - } - } - }); - jQuery2.ajaxPrefilter("script", function(s) { - if (s.cache === void 0) { - s.cache = false; - } - if (canUseScriptTag(s)) { - s.type = "GET"; - } - }); - jQuery2.ajaxTransport("script", function(s) { - if (canUseScriptTag(s)) { - var script, callback; - return { - send: function(_, complete) { - script = jQuery2(" - - -
    -
    - -
    -
    - -
    -
    -
    - - diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/package-lock.json b/02_advanced/unterricht/tag18/01_ajax-jokes/package-lock.json deleted file mode 100644 index 53d63fb..0000000 --- a/02_advanced/unterricht/tag18/01_ajax-jokes/package-lock.json +++ /dev/null @@ -1,3412 +0,0 @@ -{ - "name": "01_ajax-jokes", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "01_ajax-jokes", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "jquery": "^4.0.0" - }, - "devDependencies": { - "esbuild": "^0.28.1", - "http-server": "^14.1.1", - "npm-run-all": "^4.1.5", - "sass": "^1.101.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", - "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", - "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", - "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", - "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", - "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", - "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", - "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", - "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", - "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", - "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", - "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", - "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", - "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", - "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", - "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", - "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", - "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", - "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", - "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", - "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", - "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", - "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", - "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", - "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", - "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", - "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", - "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.3", - "is-glob": "^4.0.3", - "node-addon-api": "^7.0.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.6", - "@parcel/watcher-darwin-arm64": "2.5.6", - "@parcel/watcher-darwin-x64": "2.5.6", - "@parcel/watcher-freebsd-x64": "2.5.6", - "@parcel/watcher-linux-arm-glibc": "2.5.6", - "@parcel/watcher-linux-arm-musl": "2.5.6", - "@parcel/watcher-linux-arm64-glibc": "2.5.6", - "@parcel/watcher-linux-arm64-musl": "2.5.6", - "@parcel/watcher-linux-x64-glibc": "2.5.6", - "@parcel/watcher-linux-x64-musl": "2.5.6", - "@parcel/watcher-win32-arm64": "2.5.6", - "@parcel/watcher-win32-ia32": "2.5.6", - "@parcel/watcher-win32-x64": "2.5.6" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", - "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", - "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", - "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", - "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", - "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", - "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", - "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", - "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", - "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", - "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", - "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", - "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", - "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true, - "license": "MIT" - }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", - "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/call-bind": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", - "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "get-intrinsic": "^1.3.0", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/corser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", - "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/cross-spawn": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", - "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", - "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-abstract-get": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-abstract-get/-/es-abstract-get-1.0.0.tgz", - "integrity": "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.2", - "is-callable": "^1.2.7", - "object-inspect": "^1.13.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", - "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz", - "integrity": "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-abstract-get": "^1.0.0", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "is-callable": "^1.2.7", - "is-date-object": "^1.1.0", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/esbuild": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", - "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.28.1", - "@esbuild/android-arm": "0.28.1", - "@esbuild/android-arm64": "0.28.1", - "@esbuild/android-x64": "0.28.1", - "@esbuild/darwin-arm64": "0.28.1", - "@esbuild/darwin-x64": "0.28.1", - "@esbuild/freebsd-arm64": "0.28.1", - "@esbuild/freebsd-x64": "0.28.1", - "@esbuild/linux-arm": "0.28.1", - "@esbuild/linux-arm64": "0.28.1", - "@esbuild/linux-ia32": "0.28.1", - "@esbuild/linux-loong64": "0.28.1", - "@esbuild/linux-mips64el": "0.28.1", - "@esbuild/linux-ppc64": "0.28.1", - "@esbuild/linux-riscv64": "0.28.1", - "@esbuild/linux-s390x": "0.28.1", - "@esbuild/linux-x64": "0.28.1", - "@esbuild/netbsd-arm64": "0.28.1", - "@esbuild/netbsd-x64": "0.28.1", - "@esbuild/openbsd-arm64": "0.28.1", - "@esbuild/openbsd-x64": "0.28.1", - "@esbuild/openharmony-arm64": "0.28.1", - "@esbuild/sunos-x64": "0.28.1", - "@esbuild/win32-arm64": "0.28.1", - "@esbuild/win32-ia32": "0.28.1", - "@esbuild/win32-x64": "0.28.1" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true, - "license": "MIT" - }, - "node_modules/follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz", - "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2", - "hasown": "^2.0.4", - "is-callable": "^1.2.7", - "is-document.all": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/generator-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", - "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true, - "license": "ISC" - }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-server": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", - "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "basic-auth": "^2.0.1", - "chalk": "^4.1.2", - "corser": "^2.0.1", - "he": "^1.2.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy": "^1.18.1", - "mime": "^1.6.0", - "minimist": "^1.2.6", - "opener": "^1.5.1", - "portfinder": "^1.0.28", - "secure-compare": "3.0.1", - "union": "~0.5.0", - "url-join": "^4.0.1" - }, - "bin": { - "http-server": "bin/http-server" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/immutable": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", - "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", - "dev": true, - "license": "MIT" - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", - "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-document.all": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz", - "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.4", - "generator-function": "^2.0.0", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/jquery": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-4.0.0.tgz", - "integrity": "sha512-TXCHVR3Lb6TZdtw1l3RTLf8RBWVGexdxL6AC8/e0xZKEpBflBsjh9/8LXw+dkNFuOyW9B7iB3O1sP7hS0Kiacg==", - "license": "MIT" - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true, - "license": "MIT" - }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "dev": true, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/npm-run-all": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", - "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "memorystream": "^0.3.1", - "minimatch": "^3.0.4", - "pidtree": "^0.3.0", - "read-pkg": "^3.0.0", - "shell-quote": "^1.6.1", - "string.prototype.padend": "^3.0.0" - }, - "bin": { - "npm-run-all": "bin/npm-run-all/index.js", - "run-p": "bin/run-p/index.js", - "run-s": "bin/run-s/index.js" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm-run-all/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-all/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-all/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/npm-run-all/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/npm-run-all/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-all/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true, - "license": "(WTFPL OR MIT)", - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "license": "MIT", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pidtree": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", - "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", - "dev": true, - "license": "MIT", - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/portfinder": { - "version": "1.0.38", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.38.tgz", - "integrity": "sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==", - "dev": true, - "license": "MIT", - "dependencies": { - "async": "^3.2.6", - "debug": "^4.3.6" - }, - "engines": { - "node": ">= 10.12" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/qs": { - "version": "6.15.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", - "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "es-define-property": "^1.0.1", - "side-channel": "^1.1.1" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/readdirp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", - "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.12", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", - "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", - "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "get-intrinsic": "^1.3.0", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/sass": { - "version": "1.101.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.101.0.tgz", - "integrity": "sha512-OL3GoQyoUdDt843DpVmDO6y2k1sc5IhUDSpu8XucEI+35neq5QivZ1iuegnpraEVTJXlQGK1gl27zKcTLEPbQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^5.0.0", - "immutable": "^5.1.5", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=20.19.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" - } - }, - "node_modules/secure-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", - "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", - "dev": true, - "license": "MIT" - }, - "node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shell-quote": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.9.0.tgz", - "integrity": "sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", - "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4", - "side-channel-list": "^1.0.1", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", - "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.23", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", - "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/string.prototype.padend": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz", - "integrity": "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", - "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.2", - "es-object-atoms": "^1.1.2", - "has-property-descriptors": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", - "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", - "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "for-each": "^0.3.5", - "gopd": "^1.2.0", - "is-typed-array": "^1.1.15", - "possible-typed-array-names": "^1.1.0", - "reflect.getprototypeof": "^1.0.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/union": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", - "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", - "dev": true, - "dependencies": { - "qs": "^6.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true, - "license": "MIT" - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.22", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", - "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - } - } -} diff --git a/02_advanced/unterricht/tag18/01_ajax-jokes/package.json b/02_advanced/unterricht/tag18/01_ajax-jokes/package.json deleted file mode 100644 index 6b58e20..0000000 --- a/02_advanced/unterricht/tag18/01_ajax-jokes/package.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "01_ajax-jokes", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "js": "npx esbuild dev/assets/js/main.js --watch --bundle --outfile=assets/js/build.js", - "css": "sass dev/assets/scss/main.scss:assets/css/main.css -w -q", - "server": "npx http-server -c-1 -p 3000", - "dev": "run-p js css server" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "module", - "devDependencies": { - "esbuild": "^0.28.1", - "http-server": "^14.1.1", - "npm-run-all": "^4.1.5", - "sass": "^1.101.0" - }, - "dependencies": { - "jquery": "^4.0.0" - } -} diff --git a/02_advanced/unterricht/tag19/01_weather-box.zip b/02_advanced/unterricht/tag19/01_weather-box.zip deleted file mode 100644 index 8b7bea6..0000000 Binary files a/02_advanced/unterricht/tag19/01_weather-box.zip and /dev/null differ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/css/main.css b/02_advanced/unterricht/tag19/01_weather-box/assets/css/main.css deleted file mode 100644 index 206f521..0000000 --- a/02_advanced/unterricht/tag19/01_weather-box/assets/css/main.css +++ /dev/null @@ -1,15911 +0,0 @@ -@charset "UTF-8"; -/*! - * Bootstrap v5.3.8 (https://getbootstrap.com/) - * Copyright 2011-2025 The Bootstrap Authors - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -:root, -[data-bs-theme=light] { - --bs-blue: #0d6efd; - --bs-indigo: #6610f2; - --bs-purple: #6f42c1; - --bs-pink: #d63384; - --bs-red: #dc3545; - --bs-orange: #fd7e14; - --bs-yellow: #ffc107; - --bs-green: #198754; - --bs-teal: #20c997; - --bs-cyan: #0dcaf0; - --bs-black: #000; - --bs-white: #fff; - --bs-gray: #6c757d; - --bs-gray-dark: #343a40; - --bs-gray-100: #f8f9fa; - --bs-gray-200: #e9ecef; - --bs-gray-300: #dee2e6; - --bs-gray-400: #ced4da; - --bs-gray-500: #adb5bd; - --bs-gray-600: #6c757d; - --bs-gray-700: #495057; - --bs-gray-800: #343a40; - --bs-gray-900: #212529; - --bs-primary: #0d6efd; - --bs-secondary: #6c757d; - --bs-success: #198754; - --bs-info: #0dcaf0; - --bs-warning: #ffc107; - --bs-danger: #dc3545; - --bs-light: #f8f9fa; - --bs-dark: #212529; - --bs-primary-rgb: 13, 110, 253; - --bs-secondary-rgb: 108, 117, 125; - --bs-success-rgb: 25, 135, 84; - --bs-info-rgb: 13, 202, 240; - --bs-warning-rgb: 255, 193, 7; - --bs-danger-rgb: 220, 53, 69; - --bs-light-rgb: 248, 249, 250; - --bs-dark-rgb: 33, 37, 41; - --bs-primary-text-emphasis: rgb(5.2, 44, 101.2); - --bs-secondary-text-emphasis: rgb(43.2, 46.8, 50); - --bs-success-text-emphasis: rgb(10, 54, 33.6); - --bs-info-text-emphasis: rgb(5.2, 80.8, 96); - --bs-warning-text-emphasis: rgb(102, 77.2, 2.8); - --bs-danger-text-emphasis: rgb(88, 21.2, 27.6); - --bs-light-text-emphasis: #495057; - --bs-dark-text-emphasis: #495057; - --bs-primary-bg-subtle: rgb(206.6, 226, 254.6); - --bs-secondary-bg-subtle: rgb(225.6, 227.4, 229); - --bs-success-bg-subtle: rgb(209, 231, 220.8); - --bs-info-bg-subtle: rgb(206.6, 244.4, 252); - --bs-warning-bg-subtle: rgb(255, 242.6, 205.4); - --bs-danger-bg-subtle: rgb(248, 214.6, 217.8); - --bs-light-bg-subtle: rgb(251.5, 252, 252.5); - --bs-dark-bg-subtle: #ced4da; - --bs-primary-border-subtle: rgb(158.2, 197, 254.2); - --bs-secondary-border-subtle: rgb(196.2, 199.8, 203); - --bs-success-border-subtle: rgb(163, 207, 186.6); - --bs-info-border-subtle: rgb(158.2, 233.8, 249); - --bs-warning-border-subtle: rgb(255, 230.2, 155.8); - --bs-danger-border-subtle: rgb(241, 174.2, 180.6); - --bs-light-border-subtle: #e9ecef; - --bs-dark-border-subtle: #adb5bd; - --bs-white-rgb: 255, 255, 255; - --bs-black-rgb: 0, 0, 0; - --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0)); - --bs-body-font-family: var(--bs-font-sans-serif); - --bs-body-font-size: 1rem; - --bs-body-font-weight: 400; - --bs-body-line-height: 1.5; - --bs-body-color: #212529; - --bs-body-color-rgb: 33, 37, 41; - --bs-body-bg: #fff; - --bs-body-bg-rgb: 255, 255, 255; - --bs-emphasis-color: #000; - --bs-emphasis-color-rgb: 0, 0, 0; - --bs-secondary-color: rgba(33, 37, 41, 0.75); - --bs-secondary-color-rgb: 33, 37, 41; - --bs-secondary-bg: #e9ecef; - --bs-secondary-bg-rgb: 233, 236, 239; - --bs-tertiary-color: rgba(33, 37, 41, 0.5); - --bs-tertiary-color-rgb: 33, 37, 41; - --bs-tertiary-bg: #f8f9fa; - --bs-tertiary-bg-rgb: 248, 249, 250; - --bs-heading-color: inherit; - --bs-link-color: #0d6efd; - --bs-link-color-rgb: 13, 110, 253; - --bs-link-decoration: underline; - --bs-link-hover-color: rgb(10.4, 88, 202.4); - --bs-link-hover-color-rgb: 10, 88, 202; - --bs-code-color: #d63384; - --bs-highlight-color: #212529; - --bs-highlight-bg: rgb(255, 242.6, 205.4); - --bs-border-width: 1px; - --bs-border-style: solid; - --bs-border-color: #dee2e6; - --bs-border-color-translucent: rgba(0, 0, 0, 0.175); - --bs-border-radius: 0.375rem; - --bs-border-radius-sm: 0.25rem; - --bs-border-radius-lg: 0.5rem; - --bs-border-radius-xl: 1rem; - --bs-border-radius-xxl: 2rem; - --bs-border-radius-2xl: var(--bs-border-radius-xxl); - --bs-border-radius-pill: 50rem; - --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); - --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); - --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175); - --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075); - --bs-focus-ring-width: 0.25rem; - --bs-focus-ring-opacity: 0.25; - --bs-focus-ring-color: rgba(13, 110, 253, 0.25); - --bs-form-valid-color: #198754; - --bs-form-valid-border-color: #198754; - --bs-form-invalid-color: #dc3545; - --bs-form-invalid-border-color: #dc3545; -} - -[data-bs-theme=dark] { - color-scheme: dark; - --bs-body-color: #dee2e6; - --bs-body-color-rgb: 222, 226, 230; - --bs-body-bg: #212529; - --bs-body-bg-rgb: 33, 37, 41; - --bs-emphasis-color: #fff; - --bs-emphasis-color-rgb: 255, 255, 255; - --bs-secondary-color: rgba(222, 226, 230, 0.75); - --bs-secondary-color-rgb: 222, 226, 230; - --bs-secondary-bg: #343a40; - --bs-secondary-bg-rgb: 52, 58, 64; - --bs-tertiary-color: rgba(222, 226, 230, 0.5); - --bs-tertiary-color-rgb: 222, 226, 230; - --bs-tertiary-bg: rgb(42.5, 47.5, 52.5); - --bs-tertiary-bg-rgb: 43, 48, 53; - --bs-primary-text-emphasis: rgb(109.8, 168, 253.8); - --bs-secondary-text-emphasis: rgb(166.8, 172.2, 177); - --bs-success-text-emphasis: rgb(117, 183, 152.4); - --bs-info-text-emphasis: rgb(109.8, 223.2, 246); - --bs-warning-text-emphasis: rgb(255, 217.8, 106.2); - --bs-danger-text-emphasis: rgb(234, 133.8, 143.4); - --bs-light-text-emphasis: #f8f9fa; - --bs-dark-text-emphasis: #dee2e6; - --bs-primary-bg-subtle: rgb(2.6, 22, 50.6); - --bs-secondary-bg-subtle: rgb(21.6, 23.4, 25); - --bs-success-bg-subtle: rgb(5, 27, 16.8); - --bs-info-bg-subtle: rgb(2.6, 40.4, 48); - --bs-warning-bg-subtle: rgb(51, 38.6, 1.4); - --bs-danger-bg-subtle: rgb(44, 10.6, 13.8); - --bs-light-bg-subtle: #343a40; - --bs-dark-bg-subtle: #1a1d20; - --bs-primary-border-subtle: rgb(7.8, 66, 151.8); - --bs-secondary-border-subtle: rgb(64.8, 70.2, 75); - --bs-success-border-subtle: rgb(15, 81, 50.4); - --bs-info-border-subtle: rgb(7.8, 121.2, 144); - --bs-warning-border-subtle: rgb(153, 115.8, 4.2); - --bs-danger-border-subtle: rgb(132, 31.8, 41.4); - --bs-light-border-subtle: #495057; - --bs-dark-border-subtle: #343a40; - --bs-heading-color: inherit; - --bs-link-color: rgb(109.8, 168, 253.8); - --bs-link-hover-color: rgb(138.84, 185.4, 254.04); - --bs-link-color-rgb: 110, 168, 254; - --bs-link-hover-color-rgb: 139, 185, 254; - --bs-code-color: rgb(230.4, 132.6, 181.2); - --bs-highlight-color: #dee2e6; - --bs-highlight-bg: rgb(102, 77.2, 2.8); - --bs-border-color: #495057; - --bs-border-color-translucent: rgba(255, 255, 255, 0.15); - --bs-form-valid-color: rgb(117, 183, 152.4); - --bs-form-valid-border-color: rgb(117, 183, 152.4); - --bs-form-invalid-color: rgb(234, 133.8, 143.4); - --bs-form-invalid-border-color: rgb(234, 133.8, 143.4); -} - -*, -*::before, -*::after { - box-sizing: border-box; -} - -@media (prefers-reduced-motion: no-preference) { - :root { - scroll-behavior: smooth; - } -} - -body { - margin: 0; - font-family: var(--bs-body-font-family); - font-size: var(--bs-body-font-size); - font-weight: var(--bs-body-font-weight); - line-height: var(--bs-body-line-height); - color: var(--bs-body-color); - text-align: var(--bs-body-text-align); - background-color: var(--bs-body-bg); - -webkit-text-size-adjust: 100%; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} - -hr { - margin: 1rem 0; - color: inherit; - border: 0; - border-top: var(--bs-border-width) solid; - opacity: 0.25; -} - -h6, .h6, h5, .h5, h4, .h4, h3, .h3, h2, .h2, h1, .h1 { - margin-top: 0; - margin-bottom: 0.5rem; - font-weight: 500; - line-height: 1.2; - color: var(--bs-heading-color); -} - -h1, .h1 { - font-size: calc(1.375rem + 1.5vw); -} -@media (min-width: 1200px) { - h1, .h1 { - font-size: 2.5rem; - } -} - -h2, .h2 { - font-size: calc(1.325rem + 0.9vw); -} -@media (min-width: 1200px) { - h2, .h2 { - font-size: 2rem; - } -} - -h3, .h3 { - font-size: calc(1.3rem + 0.6vw); -} -@media (min-width: 1200px) { - h3, .h3 { - font-size: 1.75rem; - } -} - -h4, .h4 { - font-size: calc(1.275rem + 0.3vw); -} -@media (min-width: 1200px) { - h4, .h4 { - font-size: 1.5rem; - } -} - -h5, .h5 { - font-size: 1.25rem; -} - -h6, .h6 { - font-size: 1rem; -} - -p { - margin-top: 0; - margin-bottom: 1rem; -} - -abbr[title] { - text-decoration: underline dotted; - cursor: help; - text-decoration-skip-ink: none; -} - -address { - margin-bottom: 1rem; - font-style: normal; - line-height: inherit; -} - -ol, -ul { - padding-left: 2rem; -} - -ol, -ul, -dl { - margin-top: 0; - margin-bottom: 1rem; -} - -ol ol, -ul ul, -ol ul, -ul ol { - margin-bottom: 0; -} - -dt { - font-weight: 700; -} - -dd { - margin-bottom: 0.5rem; - margin-left: 0; -} - -blockquote { - margin: 0 0 1rem; -} - -b, -strong { - font-weight: bolder; -} - -small, .small { - font-size: 0.875em; -} - -mark, .mark { - padding: 0.1875em; - color: var(--bs-highlight-color); - background-color: var(--bs-highlight-bg); -} - -sub, -sup { - position: relative; - font-size: 0.75em; - line-height: 0; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -a { - color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1)); - text-decoration: underline; -} -a:hover { - --bs-link-color-rgb: var(--bs-link-hover-color-rgb); -} - -a:not([href]):not([class]), a:not([href]):not([class]):hover { - color: inherit; - text-decoration: none; -} - -pre, -code, -kbd, -samp { - font-family: var(--bs-font-monospace); - font-size: 1em; -} - -pre { - display: block; - margin-top: 0; - margin-bottom: 1rem; - overflow: auto; - font-size: 0.875em; -} -pre code { - font-size: inherit; - color: inherit; - word-break: normal; -} - -code { - font-size: 0.875em; - color: var(--bs-code-color); - word-wrap: break-word; -} -a > code { - color: inherit; -} - -kbd { - padding: 0.1875rem 0.375rem; - font-size: 0.875em; - color: var(--bs-body-bg); - background-color: var(--bs-body-color); - border-radius: 0.25rem; -} -kbd kbd { - padding: 0; - font-size: 1em; -} - -figure { - margin: 0 0 1rem; -} - -img, -svg { - vertical-align: middle; -} - -table { - caption-side: bottom; - border-collapse: collapse; -} - -caption { - padding-top: 0.5rem; - padding-bottom: 0.5rem; - color: var(--bs-secondary-color); - text-align: left; -} - -th { - text-align: inherit; - text-align: -webkit-match-parent; -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - -label { - display: inline-block; -} - -button { - border-radius: 0; -} - -button:focus:not(:focus-visible) { - outline: 0; -} - -input, -button, -select, -optgroup, -textarea { - margin: 0; - font-family: inherit; - font-size: inherit; - line-height: inherit; -} - -button, -select { - text-transform: none; -} - -[role=button] { - cursor: pointer; -} - -select { - word-wrap: normal; -} -select:disabled { - opacity: 1; -} - -[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator { - display: none !important; -} - -button, -[type=button], -[type=reset], -[type=submit] { - -webkit-appearance: button; -} -button:not(:disabled), -[type=button]:not(:disabled), -[type=reset]:not(:disabled), -[type=submit]:not(:disabled) { - cursor: pointer; -} - -::-moz-focus-inner { - padding: 0; - border-style: none; -} - -textarea { - resize: vertical; -} - -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0; -} - -legend { - float: left; - width: 100%; - padding: 0; - margin-bottom: 0.5rem; - line-height: inherit; - font-size: calc(1.275rem + 0.3vw); -} -@media (min-width: 1200px) { - legend { - font-size: 1.5rem; - } -} -legend + * { - clear: left; -} - -::-webkit-datetime-edit-fields-wrapper, -::-webkit-datetime-edit-text, -::-webkit-datetime-edit-minute, -::-webkit-datetime-edit-hour-field, -::-webkit-datetime-edit-day-field, -::-webkit-datetime-edit-month-field, -::-webkit-datetime-edit-year-field { - padding: 0; -} - -::-webkit-inner-spin-button { - height: auto; -} - -[type=search] { - -webkit-appearance: textfield; - outline-offset: -2px; -} -[type=search]::-webkit-search-cancel-button { - cursor: pointer; - filter: grayscale(1); -} - -/* rtl:raw: -[type="tel"], -[type="url"], -[type="email"], -[type="number"] { - direction: ltr; -} -*/ -::-webkit-search-decoration { - -webkit-appearance: none; -} - -::-webkit-color-swatch-wrapper { - padding: 0; -} - -::file-selector-button { - font: inherit; - -webkit-appearance: button; -} - -output { - display: inline-block; -} - -iframe { - border: 0; -} - -summary { - display: list-item; - cursor: pointer; -} - -progress { - vertical-align: baseline; -} - -[hidden] { - display: none !important; -} - -.lead { - font-size: 1.25rem; - font-weight: 300; -} - -.display-1 { - font-weight: 300; - line-height: 1.2; - font-size: calc(1.625rem + 4.5vw); -} -@media (min-width: 1200px) { - .display-1 { - font-size: 5rem; - } -} - -.display-2 { - font-weight: 300; - line-height: 1.2; - font-size: calc(1.575rem + 3.9vw); -} -@media (min-width: 1200px) { - .display-2 { - font-size: 4.5rem; - } -} - -.display-3 { - font-weight: 300; - line-height: 1.2; - font-size: calc(1.525rem + 3.3vw); -} -@media (min-width: 1200px) { - .display-3 { - font-size: 4rem; - } -} - -.display-4 { - font-weight: 300; - line-height: 1.2; - font-size: calc(1.475rem + 2.7vw); -} -@media (min-width: 1200px) { - .display-4 { - font-size: 3.5rem; - } -} - -.display-5 { - font-weight: 300; - line-height: 1.2; - font-size: calc(1.425rem + 2.1vw); -} -@media (min-width: 1200px) { - .display-5 { - font-size: 3rem; - } -} - -.display-6 { - font-weight: 300; - line-height: 1.2; - font-size: calc(1.375rem + 1.5vw); -} -@media (min-width: 1200px) { - .display-6 { - font-size: 2.5rem; - } -} - -.list-unstyled { - padding-left: 0; - list-style: none; -} - -.list-inline { - padding-left: 0; - list-style: none; -} - -.list-inline-item { - display: inline-block; -} -.list-inline-item:not(:last-child) { - margin-right: 0.5rem; -} - -.initialism { - font-size: 0.875em; - text-transform: uppercase; -} - -.blockquote { - margin-bottom: 1rem; - font-size: 1.25rem; -} -.blockquote > :last-child { - margin-bottom: 0; -} - -.blockquote-footer { - margin-top: -1rem; - margin-bottom: 1rem; - font-size: 0.875em; - color: #6c757d; -} -.blockquote-footer::before { - content: "— "; -} - -.img-fluid { - max-width: 100%; - height: auto; -} - -.img-thumbnail { - padding: 0.25rem; - background-color: var(--bs-body-bg); - border: var(--bs-border-width) solid var(--bs-border-color); - border-radius: var(--bs-border-radius); - max-width: 100%; - height: auto; -} - -.figure { - display: inline-block; -} - -.figure-img { - margin-bottom: 0.5rem; - line-height: 1; -} - -.figure-caption { - font-size: 0.875em; - color: var(--bs-secondary-color); -} - -.container, -.container-fluid, -.container-xxl, -.container-xl, -.container-lg, -.container-md, -.container-sm { - --bs-gutter-x: 1.5rem; - --bs-gutter-y: 0; - width: 100%; - padding-right: calc(var(--bs-gutter-x) * 0.5); - padding-left: calc(var(--bs-gutter-x) * 0.5); - margin-right: auto; - margin-left: auto; -} - -@media (min-width: 576px) { - .container-sm, .container { - max-width: 540px; - } -} -@media (min-width: 768px) { - .container-md, .container-sm, .container { - max-width: 720px; - } -} -@media (min-width: 992px) { - .container-lg, .container-md, .container-sm, .container { - max-width: 960px; - } -} -@media (min-width: 1200px) { - .container-xl, .container-lg, .container-md, .container-sm, .container { - max-width: 1140px; - } -} -@media (min-width: 1400px) { - .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container { - max-width: 1320px; - } -} -:root { - --bs-breakpoint-xs: 0; - --bs-breakpoint-sm: 576px; - --bs-breakpoint-md: 768px; - --bs-breakpoint-lg: 992px; - --bs-breakpoint-xl: 1200px; - --bs-breakpoint-xxl: 1400px; -} - -.row { - --bs-gutter-x: 1.5rem; - --bs-gutter-y: 0; - display: flex; - flex-wrap: wrap; - margin-top: calc(-1 * var(--bs-gutter-y)); - margin-right: calc(-0.5 * var(--bs-gutter-x)); - margin-left: calc(-0.5 * var(--bs-gutter-x)); -} -.row > * { - flex-shrink: 0; - width: 100%; - max-width: 100%; - padding-right: calc(var(--bs-gutter-x) * 0.5); - padding-left: calc(var(--bs-gutter-x) * 0.5); - margin-top: var(--bs-gutter-y); -} - -.col { - flex: 1 0 0; -} - -.row-cols-auto > * { - flex: 0 0 auto; - width: auto; -} - -.row-cols-1 > * { - flex: 0 0 auto; - width: 100%; -} - -.row-cols-2 > * { - flex: 0 0 auto; - width: 50%; -} - -.row-cols-3 > * { - flex: 0 0 auto; - width: 33.33333333%; -} - -.row-cols-4 > * { - flex: 0 0 auto; - width: 25%; -} - -.row-cols-5 > * { - flex: 0 0 auto; - width: 20%; -} - -.row-cols-6 > * { - flex: 0 0 auto; - width: 16.66666667%; -} - -.col-auto { - flex: 0 0 auto; - width: auto; -} - -.col-1 { - flex: 0 0 auto; - width: 8.33333333%; -} - -.col-2 { - flex: 0 0 auto; - width: 16.66666667%; -} - -.col-3 { - flex: 0 0 auto; - width: 25%; -} - -.col-4 { - flex: 0 0 auto; - width: 33.33333333%; -} - -.col-5 { - flex: 0 0 auto; - width: 41.66666667%; -} - -.col-6 { - flex: 0 0 auto; - width: 50%; -} - -.col-7 { - flex: 0 0 auto; - width: 58.33333333%; -} - -.col-8 { - flex: 0 0 auto; - width: 66.66666667%; -} - -.col-9 { - flex: 0 0 auto; - width: 75%; -} - -.col-10 { - flex: 0 0 auto; - width: 83.33333333%; -} - -.col-11 { - flex: 0 0 auto; - width: 91.66666667%; -} - -.col-12 { - flex: 0 0 auto; - width: 100%; -} - -.offset-1 { - margin-left: 8.33333333%; -} - -.offset-2 { - margin-left: 16.66666667%; -} - -.offset-3 { - margin-left: 25%; -} - -.offset-4 { - margin-left: 33.33333333%; -} - -.offset-5 { - margin-left: 41.66666667%; -} - -.offset-6 { - margin-left: 50%; -} - -.offset-7 { - margin-left: 58.33333333%; -} - -.offset-8 { - margin-left: 66.66666667%; -} - -.offset-9 { - margin-left: 75%; -} - -.offset-10 { - margin-left: 83.33333333%; -} - -.offset-11 { - margin-left: 91.66666667%; -} - -.g-0, -.gx-0 { - --bs-gutter-x: 0; -} - -.g-0, -.gy-0 { - --bs-gutter-y: 0; -} - -.g-1, -.gx-1 { - --bs-gutter-x: 0.25rem; -} - -.g-1, -.gy-1 { - --bs-gutter-y: 0.25rem; -} - -.g-2, -.gx-2 { - --bs-gutter-x: 0.5rem; -} - -.g-2, -.gy-2 { - --bs-gutter-y: 0.5rem; -} - -.g-3, -.gx-3 { - --bs-gutter-x: 1rem; -} - -.g-3, -.gy-3 { - --bs-gutter-y: 1rem; -} - -.g-4, -.gx-4 { - --bs-gutter-x: 1.5rem; -} - -.g-4, -.gy-4 { - --bs-gutter-y: 1.5rem; -} - -.g-5, -.gx-5 { - --bs-gutter-x: 3rem; -} - -.g-5, -.gy-5 { - --bs-gutter-y: 3rem; -} - -@media (min-width: 576px) { - .col-sm { - flex: 1 0 0; - } - .row-cols-sm-auto > * { - flex: 0 0 auto; - width: auto; - } - .row-cols-sm-1 > * { - flex: 0 0 auto; - width: 100%; - } - .row-cols-sm-2 > * { - flex: 0 0 auto; - width: 50%; - } - .row-cols-sm-3 > * { - flex: 0 0 auto; - width: 33.33333333%; - } - .row-cols-sm-4 > * { - flex: 0 0 auto; - width: 25%; - } - .row-cols-sm-5 > * { - flex: 0 0 auto; - width: 20%; - } - .row-cols-sm-6 > * { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-sm-auto { - flex: 0 0 auto; - width: auto; - } - .col-sm-1 { - flex: 0 0 auto; - width: 8.33333333%; - } - .col-sm-2 { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-sm-3 { - flex: 0 0 auto; - width: 25%; - } - .col-sm-4 { - flex: 0 0 auto; - width: 33.33333333%; - } - .col-sm-5 { - flex: 0 0 auto; - width: 41.66666667%; - } - .col-sm-6 { - flex: 0 0 auto; - width: 50%; - } - .col-sm-7 { - flex: 0 0 auto; - width: 58.33333333%; - } - .col-sm-8 { - flex: 0 0 auto; - width: 66.66666667%; - } - .col-sm-9 { - flex: 0 0 auto; - width: 75%; - } - .col-sm-10 { - flex: 0 0 auto; - width: 83.33333333%; - } - .col-sm-11 { - flex: 0 0 auto; - width: 91.66666667%; - } - .col-sm-12 { - flex: 0 0 auto; - width: 100%; - } - .offset-sm-0 { - margin-left: 0; - } - .offset-sm-1 { - margin-left: 8.33333333%; - } - .offset-sm-2 { - margin-left: 16.66666667%; - } - .offset-sm-3 { - margin-left: 25%; - } - .offset-sm-4 { - margin-left: 33.33333333%; - } - .offset-sm-5 { - margin-left: 41.66666667%; - } - .offset-sm-6 { - margin-left: 50%; - } - .offset-sm-7 { - margin-left: 58.33333333%; - } - .offset-sm-8 { - margin-left: 66.66666667%; - } - .offset-sm-9 { - margin-left: 75%; - } - .offset-sm-10 { - margin-left: 83.33333333%; - } - .offset-sm-11 { - margin-left: 91.66666667%; - } - .g-sm-0, - .gx-sm-0 { - --bs-gutter-x: 0; - } - .g-sm-0, - .gy-sm-0 { - --bs-gutter-y: 0; - } - .g-sm-1, - .gx-sm-1 { - --bs-gutter-x: 0.25rem; - } - .g-sm-1, - .gy-sm-1 { - --bs-gutter-y: 0.25rem; - } - .g-sm-2, - .gx-sm-2 { - --bs-gutter-x: 0.5rem; - } - .g-sm-2, - .gy-sm-2 { - --bs-gutter-y: 0.5rem; - } - .g-sm-3, - .gx-sm-3 { - --bs-gutter-x: 1rem; - } - .g-sm-3, - .gy-sm-3 { - --bs-gutter-y: 1rem; - } - .g-sm-4, - .gx-sm-4 { - --bs-gutter-x: 1.5rem; - } - .g-sm-4, - .gy-sm-4 { - --bs-gutter-y: 1.5rem; - } - .g-sm-5, - .gx-sm-5 { - --bs-gutter-x: 3rem; - } - .g-sm-5, - .gy-sm-5 { - --bs-gutter-y: 3rem; - } -} -@media (min-width: 768px) { - .col-md { - flex: 1 0 0; - } - .row-cols-md-auto > * { - flex: 0 0 auto; - width: auto; - } - .row-cols-md-1 > * { - flex: 0 0 auto; - width: 100%; - } - .row-cols-md-2 > * { - flex: 0 0 auto; - width: 50%; - } - .row-cols-md-3 > * { - flex: 0 0 auto; - width: 33.33333333%; - } - .row-cols-md-4 > * { - flex: 0 0 auto; - width: 25%; - } - .row-cols-md-5 > * { - flex: 0 0 auto; - width: 20%; - } - .row-cols-md-6 > * { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-md-auto { - flex: 0 0 auto; - width: auto; - } - .col-md-1 { - flex: 0 0 auto; - width: 8.33333333%; - } - .col-md-2 { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-md-3 { - flex: 0 0 auto; - width: 25%; - } - .col-md-4 { - flex: 0 0 auto; - width: 33.33333333%; - } - .col-md-5 { - flex: 0 0 auto; - width: 41.66666667%; - } - .col-md-6 { - flex: 0 0 auto; - width: 50%; - } - .col-md-7 { - flex: 0 0 auto; - width: 58.33333333%; - } - .col-md-8 { - flex: 0 0 auto; - width: 66.66666667%; - } - .col-md-9 { - flex: 0 0 auto; - width: 75%; - } - .col-md-10 { - flex: 0 0 auto; - width: 83.33333333%; - } - .col-md-11 { - flex: 0 0 auto; - width: 91.66666667%; - } - .col-md-12 { - flex: 0 0 auto; - width: 100%; - } - .offset-md-0 { - margin-left: 0; - } - .offset-md-1 { - margin-left: 8.33333333%; - } - .offset-md-2 { - margin-left: 16.66666667%; - } - .offset-md-3 { - margin-left: 25%; - } - .offset-md-4 { - margin-left: 33.33333333%; - } - .offset-md-5 { - margin-left: 41.66666667%; - } - .offset-md-6 { - margin-left: 50%; - } - .offset-md-7 { - margin-left: 58.33333333%; - } - .offset-md-8 { - margin-left: 66.66666667%; - } - .offset-md-9 { - margin-left: 75%; - } - .offset-md-10 { - margin-left: 83.33333333%; - } - .offset-md-11 { - margin-left: 91.66666667%; - } - .g-md-0, - .gx-md-0 { - --bs-gutter-x: 0; - } - .g-md-0, - .gy-md-0 { - --bs-gutter-y: 0; - } - .g-md-1, - .gx-md-1 { - --bs-gutter-x: 0.25rem; - } - .g-md-1, - .gy-md-1 { - --bs-gutter-y: 0.25rem; - } - .g-md-2, - .gx-md-2 { - --bs-gutter-x: 0.5rem; - } - .g-md-2, - .gy-md-2 { - --bs-gutter-y: 0.5rem; - } - .g-md-3, - .gx-md-3 { - --bs-gutter-x: 1rem; - } - .g-md-3, - .gy-md-3 { - --bs-gutter-y: 1rem; - } - .g-md-4, - .gx-md-4 { - --bs-gutter-x: 1.5rem; - } - .g-md-4, - .gy-md-4 { - --bs-gutter-y: 1.5rem; - } - .g-md-5, - .gx-md-5 { - --bs-gutter-x: 3rem; - } - .g-md-5, - .gy-md-5 { - --bs-gutter-y: 3rem; - } -} -@media (min-width: 992px) { - .col-lg { - flex: 1 0 0; - } - .row-cols-lg-auto > * { - flex: 0 0 auto; - width: auto; - } - .row-cols-lg-1 > * { - flex: 0 0 auto; - width: 100%; - } - .row-cols-lg-2 > * { - flex: 0 0 auto; - width: 50%; - } - .row-cols-lg-3 > * { - flex: 0 0 auto; - width: 33.33333333%; - } - .row-cols-lg-4 > * { - flex: 0 0 auto; - width: 25%; - } - .row-cols-lg-5 > * { - flex: 0 0 auto; - width: 20%; - } - .row-cols-lg-6 > * { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-lg-auto { - flex: 0 0 auto; - width: auto; - } - .col-lg-1 { - flex: 0 0 auto; - width: 8.33333333%; - } - .col-lg-2 { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-lg-3 { - flex: 0 0 auto; - width: 25%; - } - .col-lg-4 { - flex: 0 0 auto; - width: 33.33333333%; - } - .col-lg-5 { - flex: 0 0 auto; - width: 41.66666667%; - } - .col-lg-6 { - flex: 0 0 auto; - width: 50%; - } - .col-lg-7 { - flex: 0 0 auto; - width: 58.33333333%; - } - .col-lg-8 { - flex: 0 0 auto; - width: 66.66666667%; - } - .col-lg-9 { - flex: 0 0 auto; - width: 75%; - } - .col-lg-10 { - flex: 0 0 auto; - width: 83.33333333%; - } - .col-lg-11 { - flex: 0 0 auto; - width: 91.66666667%; - } - .col-lg-12 { - flex: 0 0 auto; - width: 100%; - } - .offset-lg-0 { - margin-left: 0; - } - .offset-lg-1 { - margin-left: 8.33333333%; - } - .offset-lg-2 { - margin-left: 16.66666667%; - } - .offset-lg-3 { - margin-left: 25%; - } - .offset-lg-4 { - margin-left: 33.33333333%; - } - .offset-lg-5 { - margin-left: 41.66666667%; - } - .offset-lg-6 { - margin-left: 50%; - } - .offset-lg-7 { - margin-left: 58.33333333%; - } - .offset-lg-8 { - margin-left: 66.66666667%; - } - .offset-lg-9 { - margin-left: 75%; - } - .offset-lg-10 { - margin-left: 83.33333333%; - } - .offset-lg-11 { - margin-left: 91.66666667%; - } - .g-lg-0, - .gx-lg-0 { - --bs-gutter-x: 0; - } - .g-lg-0, - .gy-lg-0 { - --bs-gutter-y: 0; - } - .g-lg-1, - .gx-lg-1 { - --bs-gutter-x: 0.25rem; - } - .g-lg-1, - .gy-lg-1 { - --bs-gutter-y: 0.25rem; - } - .g-lg-2, - .gx-lg-2 { - --bs-gutter-x: 0.5rem; - } - .g-lg-2, - .gy-lg-2 { - --bs-gutter-y: 0.5rem; - } - .g-lg-3, - .gx-lg-3 { - --bs-gutter-x: 1rem; - } - .g-lg-3, - .gy-lg-3 { - --bs-gutter-y: 1rem; - } - .g-lg-4, - .gx-lg-4 { - --bs-gutter-x: 1.5rem; - } - .g-lg-4, - .gy-lg-4 { - --bs-gutter-y: 1.5rem; - } - .g-lg-5, - .gx-lg-5 { - --bs-gutter-x: 3rem; - } - .g-lg-5, - .gy-lg-5 { - --bs-gutter-y: 3rem; - } -} -@media (min-width: 1200px) { - .col-xl { - flex: 1 0 0; - } - .row-cols-xl-auto > * { - flex: 0 0 auto; - width: auto; - } - .row-cols-xl-1 > * { - flex: 0 0 auto; - width: 100%; - } - .row-cols-xl-2 > * { - flex: 0 0 auto; - width: 50%; - } - .row-cols-xl-3 > * { - flex: 0 0 auto; - width: 33.33333333%; - } - .row-cols-xl-4 > * { - flex: 0 0 auto; - width: 25%; - } - .row-cols-xl-5 > * { - flex: 0 0 auto; - width: 20%; - } - .row-cols-xl-6 > * { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-xl-auto { - flex: 0 0 auto; - width: auto; - } - .col-xl-1 { - flex: 0 0 auto; - width: 8.33333333%; - } - .col-xl-2 { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-xl-3 { - flex: 0 0 auto; - width: 25%; - } - .col-xl-4 { - flex: 0 0 auto; - width: 33.33333333%; - } - .col-xl-5 { - flex: 0 0 auto; - width: 41.66666667%; - } - .col-xl-6 { - flex: 0 0 auto; - width: 50%; - } - .col-xl-7 { - flex: 0 0 auto; - width: 58.33333333%; - } - .col-xl-8 { - flex: 0 0 auto; - width: 66.66666667%; - } - .col-xl-9 { - flex: 0 0 auto; - width: 75%; - } - .col-xl-10 { - flex: 0 0 auto; - width: 83.33333333%; - } - .col-xl-11 { - flex: 0 0 auto; - width: 91.66666667%; - } - .col-xl-12 { - flex: 0 0 auto; - width: 100%; - } - .offset-xl-0 { - margin-left: 0; - } - .offset-xl-1 { - margin-left: 8.33333333%; - } - .offset-xl-2 { - margin-left: 16.66666667%; - } - .offset-xl-3 { - margin-left: 25%; - } - .offset-xl-4 { - margin-left: 33.33333333%; - } - .offset-xl-5 { - margin-left: 41.66666667%; - } - .offset-xl-6 { - margin-left: 50%; - } - .offset-xl-7 { - margin-left: 58.33333333%; - } - .offset-xl-8 { - margin-left: 66.66666667%; - } - .offset-xl-9 { - margin-left: 75%; - } - .offset-xl-10 { - margin-left: 83.33333333%; - } - .offset-xl-11 { - margin-left: 91.66666667%; - } - .g-xl-0, - .gx-xl-0 { - --bs-gutter-x: 0; - } - .g-xl-0, - .gy-xl-0 { - --bs-gutter-y: 0; - } - .g-xl-1, - .gx-xl-1 { - --bs-gutter-x: 0.25rem; - } - .g-xl-1, - .gy-xl-1 { - --bs-gutter-y: 0.25rem; - } - .g-xl-2, - .gx-xl-2 { - --bs-gutter-x: 0.5rem; - } - .g-xl-2, - .gy-xl-2 { - --bs-gutter-y: 0.5rem; - } - .g-xl-3, - .gx-xl-3 { - --bs-gutter-x: 1rem; - } - .g-xl-3, - .gy-xl-3 { - --bs-gutter-y: 1rem; - } - .g-xl-4, - .gx-xl-4 { - --bs-gutter-x: 1.5rem; - } - .g-xl-4, - .gy-xl-4 { - --bs-gutter-y: 1.5rem; - } - .g-xl-5, - .gx-xl-5 { - --bs-gutter-x: 3rem; - } - .g-xl-5, - .gy-xl-5 { - --bs-gutter-y: 3rem; - } -} -@media (min-width: 1400px) { - .col-xxl { - flex: 1 0 0; - } - .row-cols-xxl-auto > * { - flex: 0 0 auto; - width: auto; - } - .row-cols-xxl-1 > * { - flex: 0 0 auto; - width: 100%; - } - .row-cols-xxl-2 > * { - flex: 0 0 auto; - width: 50%; - } - .row-cols-xxl-3 > * { - flex: 0 0 auto; - width: 33.33333333%; - } - .row-cols-xxl-4 > * { - flex: 0 0 auto; - width: 25%; - } - .row-cols-xxl-5 > * { - flex: 0 0 auto; - width: 20%; - } - .row-cols-xxl-6 > * { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-xxl-auto { - flex: 0 0 auto; - width: auto; - } - .col-xxl-1 { - flex: 0 0 auto; - width: 8.33333333%; - } - .col-xxl-2 { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-xxl-3 { - flex: 0 0 auto; - width: 25%; - } - .col-xxl-4 { - flex: 0 0 auto; - width: 33.33333333%; - } - .col-xxl-5 { - flex: 0 0 auto; - width: 41.66666667%; - } - .col-xxl-6 { - flex: 0 0 auto; - width: 50%; - } - .col-xxl-7 { - flex: 0 0 auto; - width: 58.33333333%; - } - .col-xxl-8 { - flex: 0 0 auto; - width: 66.66666667%; - } - .col-xxl-9 { - flex: 0 0 auto; - width: 75%; - } - .col-xxl-10 { - flex: 0 0 auto; - width: 83.33333333%; - } - .col-xxl-11 { - flex: 0 0 auto; - width: 91.66666667%; - } - .col-xxl-12 { - flex: 0 0 auto; - width: 100%; - } - .offset-xxl-0 { - margin-left: 0; - } - .offset-xxl-1 { - margin-left: 8.33333333%; - } - .offset-xxl-2 { - margin-left: 16.66666667%; - } - .offset-xxl-3 { - margin-left: 25%; - } - .offset-xxl-4 { - margin-left: 33.33333333%; - } - .offset-xxl-5 { - margin-left: 41.66666667%; - } - .offset-xxl-6 { - margin-left: 50%; - } - .offset-xxl-7 { - margin-left: 58.33333333%; - } - .offset-xxl-8 { - margin-left: 66.66666667%; - } - .offset-xxl-9 { - margin-left: 75%; - } - .offset-xxl-10 { - margin-left: 83.33333333%; - } - .offset-xxl-11 { - margin-left: 91.66666667%; - } - .g-xxl-0, - .gx-xxl-0 { - --bs-gutter-x: 0; - } - .g-xxl-0, - .gy-xxl-0 { - --bs-gutter-y: 0; - } - .g-xxl-1, - .gx-xxl-1 { - --bs-gutter-x: 0.25rem; - } - .g-xxl-1, - .gy-xxl-1 { - --bs-gutter-y: 0.25rem; - } - .g-xxl-2, - .gx-xxl-2 { - --bs-gutter-x: 0.5rem; - } - .g-xxl-2, - .gy-xxl-2 { - --bs-gutter-y: 0.5rem; - } - .g-xxl-3, - .gx-xxl-3 { - --bs-gutter-x: 1rem; - } - .g-xxl-3, - .gy-xxl-3 { - --bs-gutter-y: 1rem; - } - .g-xxl-4, - .gx-xxl-4 { - --bs-gutter-x: 1.5rem; - } - .g-xxl-4, - .gy-xxl-4 { - --bs-gutter-y: 1.5rem; - } - .g-xxl-5, - .gx-xxl-5 { - --bs-gutter-x: 3rem; - } - .g-xxl-5, - .gy-xxl-5 { - --bs-gutter-y: 3rem; - } -} -.table { - --bs-table-color-type: initial; - --bs-table-bg-type: initial; - --bs-table-color-state: initial; - --bs-table-bg-state: initial; - --bs-table-color: var(--bs-emphasis-color); - --bs-table-bg: var(--bs-body-bg); - --bs-table-border-color: var(--bs-border-color); - --bs-table-accent-bg: transparent; - --bs-table-striped-color: var(--bs-emphasis-color); - --bs-table-striped-bg: rgba(var(--bs-emphasis-color-rgb), 0.05); - --bs-table-active-color: var(--bs-emphasis-color); - --bs-table-active-bg: rgba(var(--bs-emphasis-color-rgb), 0.1); - --bs-table-hover-color: var(--bs-emphasis-color); - --bs-table-hover-bg: rgba(var(--bs-emphasis-color-rgb), 0.075); - width: 100%; - margin-bottom: 1rem; - vertical-align: top; - border-color: var(--bs-table-border-color); -} -.table > :not(caption) > * > * { - padding: 0.5rem 0.5rem; - color: var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color))); - background-color: var(--bs-table-bg); - border-bottom-width: var(--bs-border-width); - box-shadow: inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg))); -} -.table > tbody { - vertical-align: inherit; -} -.table > thead { - vertical-align: bottom; -} - -.table-group-divider { - border-top: calc(var(--bs-border-width) * 2) solid currentcolor; -} - -.caption-top { - caption-side: top; -} - -.table-sm > :not(caption) > * > * { - padding: 0.25rem 0.25rem; -} - -.table-bordered > :not(caption) > * { - border-width: var(--bs-border-width) 0; -} -.table-bordered > :not(caption) > * > * { - border-width: 0 var(--bs-border-width); -} - -.table-borderless > :not(caption) > * > * { - border-bottom-width: 0; -} -.table-borderless > :not(:first-child) { - border-top-width: 0; -} - -.table-striped > tbody > tr:nth-of-type(odd) > * { - --bs-table-color-type: var(--bs-table-striped-color); - --bs-table-bg-type: var(--bs-table-striped-bg); -} - -.table-striped-columns > :not(caption) > tr > :nth-child(even) { - --bs-table-color-type: var(--bs-table-striped-color); - --bs-table-bg-type: var(--bs-table-striped-bg); -} - -.table-active { - --bs-table-color-state: var(--bs-table-active-color); - --bs-table-bg-state: var(--bs-table-active-bg); -} - -.table-hover > tbody > tr:hover > * { - --bs-table-color-state: var(--bs-table-hover-color); - --bs-table-bg-state: var(--bs-table-hover-bg); -} - -.table-primary { - --bs-table-color: #000; - --bs-table-bg: rgb(206.6, 226, 254.6); - --bs-table-border-color: rgb(165.28, 180.8, 203.68); - --bs-table-striped-bg: rgb(196.27, 214.7, 241.87); - --bs-table-striped-color: #000; - --bs-table-active-bg: rgb(185.94, 203.4, 229.14); - --bs-table-active-color: #000; - --bs-table-hover-bg: rgb(191.105, 209.05, 235.505); - --bs-table-hover-color: #000; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); -} - -.table-secondary { - --bs-table-color: #000; - --bs-table-bg: rgb(225.6, 227.4, 229); - --bs-table-border-color: rgb(180.48, 181.92, 183.2); - --bs-table-striped-bg: rgb(214.32, 216.03, 217.55); - --bs-table-striped-color: #000; - --bs-table-active-bg: rgb(203.04, 204.66, 206.1); - --bs-table-active-color: #000; - --bs-table-hover-bg: rgb(208.68, 210.345, 211.825); - --bs-table-hover-color: #000; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); -} - -.table-success { - --bs-table-color: #000; - --bs-table-bg: rgb(209, 231, 220.8); - --bs-table-border-color: rgb(167.2, 184.8, 176.64); - --bs-table-striped-bg: rgb(198.55, 219.45, 209.76); - --bs-table-striped-color: #000; - --bs-table-active-bg: rgb(188.1, 207.9, 198.72); - --bs-table-active-color: #000; - --bs-table-hover-bg: rgb(193.325, 213.675, 204.24); - --bs-table-hover-color: #000; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); -} - -.table-info { - --bs-table-color: #000; - --bs-table-bg: rgb(206.6, 244.4, 252); - --bs-table-border-color: rgb(165.28, 195.52, 201.6); - --bs-table-striped-bg: rgb(196.27, 232.18, 239.4); - --bs-table-striped-color: #000; - --bs-table-active-bg: rgb(185.94, 219.96, 226.8); - --bs-table-active-color: #000; - --bs-table-hover-bg: rgb(191.105, 226.07, 233.1); - --bs-table-hover-color: #000; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); -} - -.table-warning { - --bs-table-color: #000; - --bs-table-bg: rgb(255, 242.6, 205.4); - --bs-table-border-color: rgb(204, 194.08, 164.32); - --bs-table-striped-bg: rgb(242.25, 230.47, 195.13); - --bs-table-striped-color: #000; - --bs-table-active-bg: rgb(229.5, 218.34, 184.86); - --bs-table-active-color: #000; - --bs-table-hover-bg: rgb(235.875, 224.405, 189.995); - --bs-table-hover-color: #000; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); -} - -.table-danger { - --bs-table-color: #000; - --bs-table-bg: rgb(248, 214.6, 217.8); - --bs-table-border-color: rgb(198.4, 171.68, 174.24); - --bs-table-striped-bg: rgb(235.6, 203.87, 206.91); - --bs-table-striped-color: #000; - --bs-table-active-bg: rgb(223.2, 193.14, 196.02); - --bs-table-active-color: #000; - --bs-table-hover-bg: rgb(229.4, 198.505, 201.465); - --bs-table-hover-color: #000; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); -} - -.table-light { - --bs-table-color: #000; - --bs-table-bg: #f8f9fa; - --bs-table-border-color: rgb(198.4, 199.2, 200); - --bs-table-striped-bg: rgb(235.6, 236.55, 237.5); - --bs-table-striped-color: #000; - --bs-table-active-bg: rgb(223.2, 224.1, 225); - --bs-table-active-color: #000; - --bs-table-hover-bg: rgb(229.4, 230.325, 231.25); - --bs-table-hover-color: #000; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); -} - -.table-dark { - --bs-table-color: #fff; - --bs-table-bg: #212529; - --bs-table-border-color: rgb(77.4, 80.6, 83.8); - --bs-table-striped-bg: rgb(44.1, 47.9, 51.7); - --bs-table-striped-color: #fff; - --bs-table-active-bg: rgb(55.2, 58.8, 62.4); - --bs-table-active-color: #fff; - --bs-table-hover-bg: rgb(49.65, 53.35, 57.05); - --bs-table-hover-color: #fff; - color: var(--bs-table-color); - border-color: var(--bs-table-border-color); -} - -.table-responsive { - overflow-x: auto; - -webkit-overflow-scrolling: touch; -} - -@media (max-width: 575.98px) { - .table-responsive-sm { - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } -} -@media (max-width: 767.98px) { - .table-responsive-md { - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } -} -@media (max-width: 991.98px) { - .table-responsive-lg { - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } -} -@media (max-width: 1199.98px) { - .table-responsive-xl { - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } -} -@media (max-width: 1399.98px) { - .table-responsive-xxl { - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } -} -.form-label { - margin-bottom: 0.5rem; -} - -.col-form-label { - padding-top: calc(0.375rem + var(--bs-border-width)); - padding-bottom: calc(0.375rem + var(--bs-border-width)); - margin-bottom: 0; - font-size: inherit; - line-height: 1.5; -} - -.col-form-label-lg { - padding-top: calc(0.5rem + var(--bs-border-width)); - padding-bottom: calc(0.5rem + var(--bs-border-width)); - font-size: 1.25rem; -} - -.col-form-label-sm { - padding-top: calc(0.25rem + var(--bs-border-width)); - padding-bottom: calc(0.25rem + var(--bs-border-width)); - font-size: 0.875rem; -} - -.form-text { - margin-top: 0.25rem; - font-size: 0.875em; - color: var(--bs-secondary-color); -} - -.form-control { - display: block; - width: 100%; - padding: 0.375rem 0.75rem; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: var(--bs-body-color); - appearance: none; - background-color: var(--bs-body-bg); - background-clip: padding-box; - border: var(--bs-border-width) solid var(--bs-border-color); - border-radius: var(--bs-border-radius); - transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .form-control { - transition: none; - } -} -.form-control[type=file] { - overflow: hidden; -} -.form-control[type=file]:not(:disabled):not([readonly]) { - cursor: pointer; -} -.form-control:focus { - color: var(--bs-body-color); - background-color: var(--bs-body-bg); - border-color: rgb(134, 182.5, 254); - outline: 0; - box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); -} -.form-control::-webkit-date-and-time-value { - min-width: 85px; - height: 1.5em; - margin: 0; -} -.form-control::-webkit-datetime-edit { - display: block; - padding: 0; -} -.form-control::placeholder { - color: var(--bs-secondary-color); - opacity: 1; -} -.form-control:disabled { - background-color: var(--bs-secondary-bg); - opacity: 1; -} -.form-control::file-selector-button { - padding: 0.375rem 0.75rem; - margin: -0.375rem -0.75rem; - margin-inline-end: 0.75rem; - color: var(--bs-body-color); - background-color: var(--bs-tertiary-bg); - pointer-events: none; - border-color: inherit; - border-style: solid; - border-width: 0; - border-inline-end-width: var(--bs-border-width); - border-radius: 0; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .form-control::file-selector-button { - transition: none; - } -} -.form-control:hover:not(:disabled):not([readonly])::file-selector-button { - background-color: var(--bs-secondary-bg); -} - -.form-control-plaintext { - display: block; - width: 100%; - padding: 0.375rem 0; - margin-bottom: 0; - line-height: 1.5; - color: var(--bs-body-color); - background-color: transparent; - border: solid transparent; - border-width: var(--bs-border-width) 0; -} -.form-control-plaintext:focus { - outline: 0; -} -.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { - padding-right: 0; - padding-left: 0; -} - -.form-control-sm { - min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - border-radius: var(--bs-border-radius-sm); -} -.form-control-sm::file-selector-button { - padding: 0.25rem 0.5rem; - margin: -0.25rem -0.5rem; - margin-inline-end: 0.5rem; -} - -.form-control-lg { - min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); - padding: 0.5rem 1rem; - font-size: 1.25rem; - border-radius: var(--bs-border-radius-lg); -} -.form-control-lg::file-selector-button { - padding: 0.5rem 1rem; - margin: -0.5rem -1rem; - margin-inline-end: 1rem; -} - -textarea.form-control { - min-height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2)); -} -textarea.form-control-sm { - min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); -} -textarea.form-control-lg { - min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); -} - -.form-control-color { - width: 3rem; - height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2)); - padding: 0.375rem; -} -.form-control-color:not(:disabled):not([readonly]) { - cursor: pointer; -} -.form-control-color::-moz-color-swatch { - border: 0 !important; - border-radius: var(--bs-border-radius); -} -.form-control-color::-webkit-color-swatch { - border: 0 !important; - border-radius: var(--bs-border-radius); -} -.form-control-color.form-control-sm { - height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); -} -.form-control-color.form-control-lg { - height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); -} - -.form-select { - --bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); - display: block; - width: 100%; - padding: 0.375rem 2.25rem 0.375rem 0.75rem; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: var(--bs-body-color); - appearance: none; - background-color: var(--bs-body-bg); - background-image: var(--bs-form-select-bg-img), var(--bs-form-select-bg-icon, none); - background-repeat: no-repeat; - background-position: right 0.75rem center; - background-size: 16px 12px; - border: var(--bs-border-width) solid var(--bs-border-color); - border-radius: var(--bs-border-radius); - transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .form-select { - transition: none; - } -} -.form-select:focus { - border-color: rgb(134, 182.5, 254); - outline: 0; - box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); -} -.form-select[multiple], .form-select[size]:not([size="1"]) { - padding-right: 0.75rem; - background-image: none; -} -.form-select:disabled { - background-color: var(--bs-secondary-bg); -} -.form-select:-moz-focusring { - color: transparent; - text-shadow: 0 0 0 var(--bs-body-color); -} - -.form-select-sm { - padding-top: 0.25rem; - padding-bottom: 0.25rem; - padding-left: 0.5rem; - font-size: 0.875rem; - border-radius: var(--bs-border-radius-sm); -} - -.form-select-lg { - padding-top: 0.5rem; - padding-bottom: 0.5rem; - padding-left: 1rem; - font-size: 1.25rem; - border-radius: var(--bs-border-radius-lg); -} - -[data-bs-theme=dark] .form-select { - --bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); -} - -.form-check { - display: block; - min-height: 1.5rem; - padding-left: 1.5em; - margin-bottom: 0.125rem; -} -.form-check .form-check-input { - float: left; - margin-left: -1.5em; -} - -.form-check-reverse { - padding-right: 1.5em; - padding-left: 0; - text-align: right; -} -.form-check-reverse .form-check-input { - float: right; - margin-right: -1.5em; - margin-left: 0; -} - -.form-check-input { - --bs-form-check-bg: var(--bs-body-bg); - flex-shrink: 0; - width: 1em; - height: 1em; - margin-top: 0.25em; - vertical-align: top; - appearance: none; - background-color: var(--bs-form-check-bg); - background-image: var(--bs-form-check-bg-image); - background-repeat: no-repeat; - background-position: center; - background-size: contain; - border: var(--bs-border-width) solid var(--bs-border-color); - print-color-adjust: exact; -} -.form-check-input[type=checkbox] { - border-radius: 0.25em; -} -.form-check-input[type=radio] { - border-radius: 50%; -} -.form-check-input:active { - filter: brightness(90%); -} -.form-check-input:focus { - border-color: rgb(134, 182.5, 254); - outline: 0; - box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); -} -.form-check-input:checked { - background-color: #0d6efd; - border-color: #0d6efd; -} -.form-check-input:checked[type=checkbox] { - --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e"); -} -.form-check-input:checked[type=radio] { - --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e"); -} -.form-check-input[type=checkbox]:indeterminate { - background-color: #0d6efd; - border-color: #0d6efd; - --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e"); -} -.form-check-input:disabled { - pointer-events: none; - filter: none; - opacity: 0.5; -} -.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label { - cursor: default; - opacity: 0.5; -} - -.form-switch { - padding-left: 2.5em; -} -.form-switch .form-check-input { - --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e"); - width: 2em; - margin-left: -2.5em; - background-image: var(--bs-form-switch-bg); - background-position: left center; - border-radius: 2em; - transition: background-position 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .form-switch .form-check-input { - transition: none; - } -} -.form-switch .form-check-input:focus { - --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgb%28134, 182.5, 254%29'/%3e%3c/svg%3e"); -} -.form-switch .form-check-input:checked { - background-position: right center; - --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); -} -.form-switch.form-check-reverse { - padding-right: 2.5em; - padding-left: 0; -} -.form-switch.form-check-reverse .form-check-input { - margin-right: -2.5em; - margin-left: 0; -} - -.form-check-inline { - display: inline-block; - margin-right: 1rem; -} - -.btn-check { - position: absolute; - clip: rect(0, 0, 0, 0); - pointer-events: none; -} -.btn-check[disabled] + .btn, .btn-check:disabled + .btn { - pointer-events: none; - filter: none; - opacity: 0.65; -} - -[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus) { - --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e"); -} - -.form-range { - width: 100%; - height: 1.5rem; - padding: 0; - appearance: none; - background-color: transparent; -} -.form-range:focus { - outline: 0; -} -.form-range:focus::-webkit-slider-thumb { - box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); -} -.form-range:focus::-moz-range-thumb { - box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); -} -.form-range::-moz-focus-outer { - border: 0; -} -.form-range::-webkit-slider-thumb { - width: 1rem; - height: 1rem; - margin-top: -0.25rem; - appearance: none; - background-color: #0d6efd; - border: 0; - border-radius: 1rem; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .form-range::-webkit-slider-thumb { - transition: none; - } -} -.form-range::-webkit-slider-thumb:active { - background-color: rgb(182.4, 211.5, 254.4); -} -.form-range::-webkit-slider-runnable-track { - width: 100%; - height: 0.5rem; - color: transparent; - cursor: pointer; - background-color: var(--bs-secondary-bg); - border-color: transparent; - border-radius: 1rem; -} -.form-range::-moz-range-thumb { - width: 1rem; - height: 1rem; - appearance: none; - background-color: #0d6efd; - border: 0; - border-radius: 1rem; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .form-range::-moz-range-thumb { - transition: none; - } -} -.form-range::-moz-range-thumb:active { - background-color: rgb(182.4, 211.5, 254.4); -} -.form-range::-moz-range-track { - width: 100%; - height: 0.5rem; - color: transparent; - cursor: pointer; - background-color: var(--bs-secondary-bg); - border-color: transparent; - border-radius: 1rem; -} -.form-range:disabled { - pointer-events: none; -} -.form-range:disabled::-webkit-slider-thumb { - background-color: var(--bs-secondary-color); -} -.form-range:disabled::-moz-range-thumb { - background-color: var(--bs-secondary-color); -} - -.form-floating { - position: relative; -} -.form-floating > .form-control, -.form-floating > .form-control-plaintext, -.form-floating > .form-select { - height: calc(3.5rem + calc(var(--bs-border-width) * 2)); - min-height: calc(3.5rem + calc(var(--bs-border-width) * 2)); - line-height: 1.25; -} -.form-floating > label { - position: absolute; - top: 0; - left: 0; - z-index: 2; - max-width: 100%; - height: 100%; - padding: 1rem 0.75rem; - overflow: hidden; - color: rgba(var(--bs-body-color-rgb), 0.65); - text-align: start; - text-overflow: ellipsis; - white-space: nowrap; - pointer-events: none; - border: var(--bs-border-width) solid transparent; - transform-origin: 0 0; - transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .form-floating > label { - transition: none; - } -} -.form-floating > .form-control, -.form-floating > .form-control-plaintext { - padding: 1rem 0.75rem; -} -.form-floating > .form-control::placeholder, -.form-floating > .form-control-plaintext::placeholder { - color: transparent; -} -.form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown), -.form-floating > .form-control-plaintext:focus, -.form-floating > .form-control-plaintext:not(:placeholder-shown) { - padding-top: 1.625rem; - padding-bottom: 0.625rem; -} -.form-floating > .form-control:-webkit-autofill, -.form-floating > .form-control-plaintext:-webkit-autofill { - padding-top: 1.625rem; - padding-bottom: 0.625rem; -} -.form-floating > .form-select { - padding-top: 1.625rem; - padding-bottom: 0.625rem; - padding-left: 0.75rem; -} -.form-floating > .form-control:focus ~ label, -.form-floating > .form-control:not(:placeholder-shown) ~ label, -.form-floating > .form-control-plaintext ~ label, -.form-floating > .form-select ~ label { - transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); -} -.form-floating > .form-control:-webkit-autofill ~ label { - transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); -} -.form-floating > textarea:focus ~ label::after, -.form-floating > textarea:not(:placeholder-shown) ~ label::after { - position: absolute; - inset: 1rem 0.375rem; - z-index: -1; - height: 1.5em; - content: ""; - background-color: var(--bs-body-bg); - border-radius: var(--bs-border-radius); -} -.form-floating > textarea:disabled ~ label::after { - background-color: var(--bs-secondary-bg); -} -.form-floating > .form-control-plaintext ~ label { - border-width: var(--bs-border-width) 0; -} -.form-floating > :disabled ~ label, -.form-floating > .form-control:disabled ~ label { - color: #6c757d; -} - -.input-group { - position: relative; - display: flex; - flex-wrap: wrap; - align-items: stretch; - width: 100%; -} -.input-group > .form-control, -.input-group > .form-select, -.input-group > .form-floating { - position: relative; - flex: 1 1 auto; - width: 1%; - min-width: 0; -} -.input-group > .form-control:focus, -.input-group > .form-select:focus, -.input-group > .form-floating:focus-within { - z-index: 5; -} -.input-group .btn { - position: relative; - z-index: 2; -} -.input-group .btn:focus { - z-index: 5; -} - -.input-group-text { - display: flex; - align-items: center; - padding: 0.375rem 0.75rem; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: var(--bs-body-color); - text-align: center; - white-space: nowrap; - background-color: var(--bs-tertiary-bg); - border: var(--bs-border-width) solid var(--bs-border-color); - border-radius: var(--bs-border-radius); -} - -.input-group-lg > .form-control, -.input-group-lg > .form-select, -.input-group-lg > .input-group-text, -.input-group-lg > .btn { - padding: 0.5rem 1rem; - font-size: 1.25rem; - border-radius: var(--bs-border-radius-lg); -} - -.input-group-sm > .form-control, -.input-group-sm > .form-select, -.input-group-sm > .input-group-text, -.input-group-sm > .btn { - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - border-radius: var(--bs-border-radius-sm); -} - -.input-group-lg > .form-select, -.input-group-sm > .form-select { - padding-right: 3rem; -} - -.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating), -.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3), -.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-control, -.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-select { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating), -.input-group.has-validation > .dropdown-toggle:nth-last-child(n+4), -.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-control, -.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-select { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) { - margin-left: calc(-1 * var(--bs-border-width)); - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.input-group > .form-floating:not(:first-child) > .form-control, -.input-group > .form-floating:not(:first-child) > .form-select { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} - -.valid-feedback { - display: none; - width: 100%; - margin-top: 0.25rem; - font-size: 0.875em; - color: var(--bs-form-valid-color); -} - -.valid-tooltip { - position: absolute; - top: 100%; - z-index: 5; - display: none; - max-width: 100%; - padding: 0.25rem 0.5rem; - margin-top: 0.1rem; - font-size: 0.875rem; - color: #fff; - background-color: var(--bs-success); - border-radius: var(--bs-border-radius); -} - -.was-validated :valid ~ .valid-feedback, -.was-validated :valid ~ .valid-tooltip, -.is-valid ~ .valid-feedback, -.is-valid ~ .valid-tooltip { - display: block; -} - -.was-validated .form-control:valid, .form-control.is-valid { - border-color: var(--bs-form-valid-border-color); - padding-right: calc(1.5em + 0.75rem); - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1'/%3e%3c/svg%3e"); - background-repeat: no-repeat; - background-position: right calc(0.375em + 0.1875rem) center; - background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); -} -.was-validated .form-control:valid:focus, .form-control.is-valid:focus { - border-color: var(--bs-form-valid-border-color); - box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); -} - -.was-validated textarea.form-control:valid, textarea.form-control.is-valid { - padding-right: calc(1.5em + 0.75rem); - background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); -} - -.was-validated .form-select:valid, .form-select.is-valid { - border-color: var(--bs-form-valid-border-color); -} -.was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size="1"], .form-select.is-valid:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size="1"] { - --bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1'/%3e%3c/svg%3e"); - padding-right: 4.125rem; - background-position: right 0.75rem center, center right 2.25rem; - background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); -} -.was-validated .form-select:valid:focus, .form-select.is-valid:focus { - border-color: var(--bs-form-valid-border-color); - box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); -} - -.was-validated .form-control-color:valid, .form-control-color.is-valid { - width: calc(3rem + calc(1.5em + 0.75rem)); -} - -.was-validated .form-check-input:valid, .form-check-input.is-valid { - border-color: var(--bs-form-valid-border-color); -} -.was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked { - background-color: var(--bs-form-valid-color); -} -.was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus { - box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); -} -.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { - color: var(--bs-form-valid-color); -} - -.form-check-inline .form-check-input ~ .valid-feedback { - margin-left: 0.5em; -} - -.was-validated .input-group > .form-control:not(:focus):valid, .input-group > .form-control:not(:focus).is-valid, -.was-validated .input-group > .form-select:not(:focus):valid, -.input-group > .form-select:not(:focus).is-valid, -.was-validated .input-group > .form-floating:not(:focus-within):valid, -.input-group > .form-floating:not(:focus-within).is-valid { - z-index: 3; -} - -.invalid-feedback { - display: none; - width: 100%; - margin-top: 0.25rem; - font-size: 0.875em; - color: var(--bs-form-invalid-color); -} - -.invalid-tooltip { - position: absolute; - top: 100%; - z-index: 5; - display: none; - max-width: 100%; - padding: 0.25rem 0.5rem; - margin-top: 0.1rem; - font-size: 0.875rem; - color: #fff; - background-color: var(--bs-danger); - border-radius: var(--bs-border-radius); -} - -.was-validated :invalid ~ .invalid-feedback, -.was-validated :invalid ~ .invalid-tooltip, -.is-invalid ~ .invalid-feedback, -.is-invalid ~ .invalid-tooltip { - display: block; -} - -.was-validated .form-control:invalid, .form-control.is-invalid { - border-color: var(--bs-form-invalid-border-color); - padding-right: calc(1.5em + 0.75rem); - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); - background-repeat: no-repeat; - background-position: right calc(0.375em + 0.1875rem) center; - background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); -} -.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { - border-color: var(--bs-form-invalid-border-color); - box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); -} - -.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { - padding-right: calc(1.5em + 0.75rem); - background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); -} - -.was-validated .form-select:invalid, .form-select.is-invalid { - border-color: var(--bs-form-invalid-border-color); -} -.was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size="1"], .form-select.is-invalid:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size="1"] { - --bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); - padding-right: 4.125rem; - background-position: right 0.75rem center, center right 2.25rem; - background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); -} -.was-validated .form-select:invalid:focus, .form-select.is-invalid:focus { - border-color: var(--bs-form-invalid-border-color); - box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); -} - -.was-validated .form-control-color:invalid, .form-control-color.is-invalid { - width: calc(3rem + calc(1.5em + 0.75rem)); -} - -.was-validated .form-check-input:invalid, .form-check-input.is-invalid { - border-color: var(--bs-form-invalid-border-color); -} -.was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked { - background-color: var(--bs-form-invalid-color); -} -.was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus { - box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); -} -.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { - color: var(--bs-form-invalid-color); -} - -.form-check-inline .form-check-input ~ .invalid-feedback { - margin-left: 0.5em; -} - -.was-validated .input-group > .form-control:not(:focus):invalid, .input-group > .form-control:not(:focus).is-invalid, -.was-validated .input-group > .form-select:not(:focus):invalid, -.input-group > .form-select:not(:focus).is-invalid, -.was-validated .input-group > .form-floating:not(:focus-within):invalid, -.input-group > .form-floating:not(:focus-within).is-invalid { - z-index: 4; -} - -.btn { - --bs-btn-padding-x: 0.75rem; - --bs-btn-padding-y: 0.375rem; - --bs-btn-font-family: ; - --bs-btn-font-size: 1rem; - --bs-btn-font-weight: 400; - --bs-btn-line-height: 1.5; - --bs-btn-color: var(--bs-body-color); - --bs-btn-bg: transparent; - --bs-btn-border-width: var(--bs-border-width); - --bs-btn-border-color: transparent; - --bs-btn-border-radius: var(--bs-border-radius); - --bs-btn-hover-border-color: transparent; - --bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); - --bs-btn-disabled-opacity: 0.65; - --bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5); - display: inline-block; - padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x); - font-family: var(--bs-btn-font-family); - font-size: var(--bs-btn-font-size); - font-weight: var(--bs-btn-font-weight); - line-height: var(--bs-btn-line-height); - color: var(--bs-btn-color); - text-align: center; - text-decoration: none; - vertical-align: middle; - cursor: pointer; - user-select: none; - border: var(--bs-btn-border-width) solid var(--bs-btn-border-color); - border-radius: var(--bs-btn-border-radius); - background-color: var(--bs-btn-bg); - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .btn { - transition: none; - } -} -.btn:hover { - color: var(--bs-btn-hover-color); - background-color: var(--bs-btn-hover-bg); - border-color: var(--bs-btn-hover-border-color); -} -.btn-check + .btn:hover { - color: var(--bs-btn-color); - background-color: var(--bs-btn-bg); - border-color: var(--bs-btn-border-color); -} -.btn:focus-visible { - color: var(--bs-btn-hover-color); - background-color: var(--bs-btn-hover-bg); - border-color: var(--bs-btn-hover-border-color); - outline: 0; - box-shadow: var(--bs-btn-focus-box-shadow); -} -.btn-check:focus-visible + .btn { - border-color: var(--bs-btn-hover-border-color); - outline: 0; - box-shadow: var(--bs-btn-focus-box-shadow); -} -.btn-check:checked + .btn, :not(.btn-check) + .btn:active, .btn:first-child:active, .btn.active, .btn.show { - color: var(--bs-btn-active-color); - background-color: var(--bs-btn-active-bg); - border-color: var(--bs-btn-active-border-color); -} -.btn-check:checked + .btn:focus-visible, :not(.btn-check) + .btn:active:focus-visible, .btn:first-child:active:focus-visible, .btn.active:focus-visible, .btn.show:focus-visible { - box-shadow: var(--bs-btn-focus-box-shadow); -} -.btn-check:checked:focus-visible + .btn { - box-shadow: var(--bs-btn-focus-box-shadow); -} -.btn:disabled, .btn.disabled, fieldset:disabled .btn { - color: var(--bs-btn-disabled-color); - pointer-events: none; - background-color: var(--bs-btn-disabled-bg); - border-color: var(--bs-btn-disabled-border-color); - opacity: var(--bs-btn-disabled-opacity); -} - -.btn-primary { - --bs-btn-color: #fff; - --bs-btn-bg: #0d6efd; - --bs-btn-border-color: #0d6efd; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: rgb(11.05, 93.5, 215.05); - --bs-btn-hover-border-color: rgb(10.4, 88, 202.4); - --bs-btn-focus-shadow-rgb: 49, 132, 253; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: rgb(10.4, 88, 202.4); - --bs-btn-active-border-color: rgb(9.75, 82.5, 189.75); - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #fff; - --bs-btn-disabled-bg: #0d6efd; - --bs-btn-disabled-border-color: #0d6efd; -} - -.btn-secondary { - --bs-btn-color: #fff; - --bs-btn-bg: #6c757d; - --bs-btn-border-color: #6c757d; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: rgb(91.8, 99.45, 106.25); - --bs-btn-hover-border-color: rgb(86.4, 93.6, 100); - --bs-btn-focus-shadow-rgb: 130, 138, 145; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: rgb(86.4, 93.6, 100); - --bs-btn-active-border-color: rgb(81, 87.75, 93.75); - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #fff; - --bs-btn-disabled-bg: #6c757d; - --bs-btn-disabled-border-color: #6c757d; -} - -.btn-success { - --bs-btn-color: #fff; - --bs-btn-bg: #198754; - --bs-btn-border-color: #198754; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: rgb(21.25, 114.75, 71.4); - --bs-btn-hover-border-color: rgb(20, 108, 67.2); - --bs-btn-focus-shadow-rgb: 60, 153, 110; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: rgb(20, 108, 67.2); - --bs-btn-active-border-color: rgb(18.75, 101.25, 63); - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #fff; - --bs-btn-disabled-bg: #198754; - --bs-btn-disabled-border-color: #198754; -} - -.btn-info { - --bs-btn-color: #000; - --bs-btn-bg: #0dcaf0; - --bs-btn-border-color: #0dcaf0; - --bs-btn-hover-color: #000; - --bs-btn-hover-bg: rgb(49.3, 209.95, 242.25); - --bs-btn-hover-border-color: rgb(37.2, 207.3, 241.5); - --bs-btn-focus-shadow-rgb: 11, 172, 204; - --bs-btn-active-color: #000; - --bs-btn-active-bg: rgb(61.4, 212.6, 243); - --bs-btn-active-border-color: rgb(37.2, 207.3, 241.5); - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #000; - --bs-btn-disabled-bg: #0dcaf0; - --bs-btn-disabled-border-color: #0dcaf0; -} - -.btn-warning { - --bs-btn-color: #000; - --bs-btn-bg: #ffc107; - --bs-btn-border-color: #ffc107; - --bs-btn-hover-color: #000; - --bs-btn-hover-bg: rgb(255, 202.3, 44.2); - --bs-btn-hover-border-color: rgb(255, 199.2, 31.8); - --bs-btn-focus-shadow-rgb: 217, 164, 6; - --bs-btn-active-color: #000; - --bs-btn-active-bg: rgb(255, 205.4, 56.6); - --bs-btn-active-border-color: rgb(255, 199.2, 31.8); - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #000; - --bs-btn-disabled-bg: #ffc107; - --bs-btn-disabled-border-color: #ffc107; -} - -.btn-danger { - --bs-btn-color: #fff; - --bs-btn-bg: #dc3545; - --bs-btn-border-color: #dc3545; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: rgb(187, 45.05, 58.65); - --bs-btn-hover-border-color: rgb(176, 42.4, 55.2); - --bs-btn-focus-shadow-rgb: 225, 83, 97; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: rgb(176, 42.4, 55.2); - --bs-btn-active-border-color: rgb(165, 39.75, 51.75); - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #fff; - --bs-btn-disabled-bg: #dc3545; - --bs-btn-disabled-border-color: #dc3545; -} - -.btn-light { - --bs-btn-color: #000; - --bs-btn-bg: #f8f9fa; - --bs-btn-border-color: #f8f9fa; - --bs-btn-hover-color: #000; - --bs-btn-hover-bg: rgb(210.8, 211.65, 212.5); - --bs-btn-hover-border-color: rgb(198.4, 199.2, 200); - --bs-btn-focus-shadow-rgb: 211, 212, 213; - --bs-btn-active-color: #000; - --bs-btn-active-bg: rgb(198.4, 199.2, 200); - --bs-btn-active-border-color: rgb(186, 186.75, 187.5); - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #000; - --bs-btn-disabled-bg: #f8f9fa; - --bs-btn-disabled-border-color: #f8f9fa; -} - -.btn-dark { - --bs-btn-color: #fff; - --bs-btn-bg: #212529; - --bs-btn-border-color: #212529; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: rgb(66.3, 69.7, 73.1); - --bs-btn-hover-border-color: rgb(55.2, 58.8, 62.4); - --bs-btn-focus-shadow-rgb: 66, 70, 73; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: rgb(77.4, 80.6, 83.8); - --bs-btn-active-border-color: rgb(55.2, 58.8, 62.4); - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #fff; - --bs-btn-disabled-bg: #212529; - --bs-btn-disabled-border-color: #212529; -} - -.btn-outline-primary { - --bs-btn-color: #0d6efd; - --bs-btn-border-color: #0d6efd; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #0d6efd; - --bs-btn-hover-border-color: #0d6efd; - --bs-btn-focus-shadow-rgb: 13, 110, 253; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #0d6efd; - --bs-btn-active-border-color: #0d6efd; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #0d6efd; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #0d6efd; - --bs-gradient: none; -} - -.btn-outline-secondary { - --bs-btn-color: #6c757d; - --bs-btn-border-color: #6c757d; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #6c757d; - --bs-btn-hover-border-color: #6c757d; - --bs-btn-focus-shadow-rgb: 108, 117, 125; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #6c757d; - --bs-btn-active-border-color: #6c757d; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #6c757d; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #6c757d; - --bs-gradient: none; -} - -.btn-outline-success { - --bs-btn-color: #198754; - --bs-btn-border-color: #198754; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #198754; - --bs-btn-hover-border-color: #198754; - --bs-btn-focus-shadow-rgb: 25, 135, 84; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #198754; - --bs-btn-active-border-color: #198754; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #198754; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #198754; - --bs-gradient: none; -} - -.btn-outline-info { - --bs-btn-color: #0dcaf0; - --bs-btn-border-color: #0dcaf0; - --bs-btn-hover-color: #000; - --bs-btn-hover-bg: #0dcaf0; - --bs-btn-hover-border-color: #0dcaf0; - --bs-btn-focus-shadow-rgb: 13, 202, 240; - --bs-btn-active-color: #000; - --bs-btn-active-bg: #0dcaf0; - --bs-btn-active-border-color: #0dcaf0; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #0dcaf0; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #0dcaf0; - --bs-gradient: none; -} - -.btn-outline-warning { - --bs-btn-color: #ffc107; - --bs-btn-border-color: #ffc107; - --bs-btn-hover-color: #000; - --bs-btn-hover-bg: #ffc107; - --bs-btn-hover-border-color: #ffc107; - --bs-btn-focus-shadow-rgb: 255, 193, 7; - --bs-btn-active-color: #000; - --bs-btn-active-bg: #ffc107; - --bs-btn-active-border-color: #ffc107; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #ffc107; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #ffc107; - --bs-gradient: none; -} - -.btn-outline-danger { - --bs-btn-color: #dc3545; - --bs-btn-border-color: #dc3545; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #dc3545; - --bs-btn-hover-border-color: #dc3545; - --bs-btn-focus-shadow-rgb: 220, 53, 69; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #dc3545; - --bs-btn-active-border-color: #dc3545; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #dc3545; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #dc3545; - --bs-gradient: none; -} - -.btn-outline-light { - --bs-btn-color: #f8f9fa; - --bs-btn-border-color: #f8f9fa; - --bs-btn-hover-color: #000; - --bs-btn-hover-bg: #f8f9fa; - --bs-btn-hover-border-color: #f8f9fa; - --bs-btn-focus-shadow-rgb: 248, 249, 250; - --bs-btn-active-color: #000; - --bs-btn-active-bg: #f8f9fa; - --bs-btn-active-border-color: #f8f9fa; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #f8f9fa; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #f8f9fa; - --bs-gradient: none; -} - -.btn-outline-dark { - --bs-btn-color: #212529; - --bs-btn-border-color: #212529; - --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #212529; - --bs-btn-hover-border-color: #212529; - --bs-btn-focus-shadow-rgb: 33, 37, 41; - --bs-btn-active-color: #fff; - --bs-btn-active-bg: #212529; - --bs-btn-active-border-color: #212529; - --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #212529; - --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #212529; - --bs-gradient: none; -} - -.btn-link { - --bs-btn-font-weight: 400; - --bs-btn-color: var(--bs-link-color); - --bs-btn-bg: transparent; - --bs-btn-border-color: transparent; - --bs-btn-hover-color: var(--bs-link-hover-color); - --bs-btn-hover-border-color: transparent; - --bs-btn-active-color: var(--bs-link-hover-color); - --bs-btn-active-border-color: transparent; - --bs-btn-disabled-color: #6c757d; - --bs-btn-disabled-border-color: transparent; - --bs-btn-box-shadow: 0 0 0 #000; - --bs-btn-focus-shadow-rgb: 49, 132, 253; - text-decoration: underline; -} -.btn-link:focus-visible { - color: var(--bs-btn-color); -} -.btn-link:hover { - color: var(--bs-btn-hover-color); -} - -.btn-lg, .btn-group-lg > .btn { - --bs-btn-padding-y: 0.5rem; - --bs-btn-padding-x: 1rem; - --bs-btn-font-size: 1.25rem; - --bs-btn-border-radius: var(--bs-border-radius-lg); -} - -.btn-sm, .btn-group-sm > .btn { - --bs-btn-padding-y: 0.25rem; - --bs-btn-padding-x: 0.5rem; - --bs-btn-font-size: 0.875rem; - --bs-btn-border-radius: var(--bs-border-radius-sm); -} - -.fade { - transition: opacity 0.15s linear; -} -@media (prefers-reduced-motion: reduce) { - .fade { - transition: none; - } -} -.fade:not(.show) { - opacity: 0; -} - -.collapse:not(.show) { - display: none; -} - -.collapsing { - height: 0; - overflow: hidden; - transition: height 0.35s ease; -} -@media (prefers-reduced-motion: reduce) { - .collapsing { - transition: none; - } -} -.collapsing.collapse-horizontal { - width: 0; - height: auto; - transition: width 0.35s ease; -} -@media (prefers-reduced-motion: reduce) { - .collapsing.collapse-horizontal { - transition: none; - } -} - -.dropup, -.dropend, -.dropdown, -.dropstart, -.dropup-center, -.dropdown-center { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; -} -.dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid; - border-right: 0.3em solid transparent; - border-bottom: 0; - border-left: 0.3em solid transparent; -} -.dropdown-toggle:empty::after { - margin-left: 0; -} - -.dropdown-menu { - --bs-dropdown-zindex: 1000; - --bs-dropdown-min-width: 10rem; - --bs-dropdown-padding-x: 0; - --bs-dropdown-padding-y: 0.5rem; - --bs-dropdown-spacer: 0.125rem; - --bs-dropdown-font-size: 1rem; - --bs-dropdown-color: var(--bs-body-color); - --bs-dropdown-bg: var(--bs-body-bg); - --bs-dropdown-border-color: var(--bs-border-color-translucent); - --bs-dropdown-border-radius: var(--bs-border-radius); - --bs-dropdown-border-width: var(--bs-border-width); - --bs-dropdown-inner-border-radius: calc(var(--bs-border-radius) - var(--bs-border-width)); - --bs-dropdown-divider-bg: var(--bs-border-color-translucent); - --bs-dropdown-divider-margin-y: 0.5rem; - --bs-dropdown-box-shadow: var(--bs-box-shadow); - --bs-dropdown-link-color: var(--bs-body-color); - --bs-dropdown-link-hover-color: var(--bs-body-color); - --bs-dropdown-link-hover-bg: var(--bs-tertiary-bg); - --bs-dropdown-link-active-color: #fff; - --bs-dropdown-link-active-bg: #0d6efd; - --bs-dropdown-link-disabled-color: var(--bs-tertiary-color); - --bs-dropdown-item-padding-x: 1rem; - --bs-dropdown-item-padding-y: 0.25rem; - --bs-dropdown-header-color: #6c757d; - --bs-dropdown-header-padding-x: 1rem; - --bs-dropdown-header-padding-y: 0.5rem; - position: absolute; - z-index: var(--bs-dropdown-zindex); - display: none; - min-width: var(--bs-dropdown-min-width); - padding: var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x); - margin: 0; - font-size: var(--bs-dropdown-font-size); - color: var(--bs-dropdown-color); - text-align: left; - list-style: none; - background-color: var(--bs-dropdown-bg); - background-clip: padding-box; - border: var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color); - border-radius: var(--bs-dropdown-border-radius); -} -.dropdown-menu[data-bs-popper] { - top: 100%; - left: 0; - margin-top: var(--bs-dropdown-spacer); -} - -.dropdown-menu-start { - --bs-position: start; -} -.dropdown-menu-start[data-bs-popper] { - right: auto; - left: 0; -} - -.dropdown-menu-end { - --bs-position: end; -} -.dropdown-menu-end[data-bs-popper] { - right: 0; - left: auto; -} - -@media (min-width: 576px) { - .dropdown-menu-sm-start { - --bs-position: start; - } - .dropdown-menu-sm-start[data-bs-popper] { - right: auto; - left: 0; - } - .dropdown-menu-sm-end { - --bs-position: end; - } - .dropdown-menu-sm-end[data-bs-popper] { - right: 0; - left: auto; - } -} -@media (min-width: 768px) { - .dropdown-menu-md-start { - --bs-position: start; - } - .dropdown-menu-md-start[data-bs-popper] { - right: auto; - left: 0; - } - .dropdown-menu-md-end { - --bs-position: end; - } - .dropdown-menu-md-end[data-bs-popper] { - right: 0; - left: auto; - } -} -@media (min-width: 992px) { - .dropdown-menu-lg-start { - --bs-position: start; - } - .dropdown-menu-lg-start[data-bs-popper] { - right: auto; - left: 0; - } - .dropdown-menu-lg-end { - --bs-position: end; - } - .dropdown-menu-lg-end[data-bs-popper] { - right: 0; - left: auto; - } -} -@media (min-width: 1200px) { - .dropdown-menu-xl-start { - --bs-position: start; - } - .dropdown-menu-xl-start[data-bs-popper] { - right: auto; - left: 0; - } - .dropdown-menu-xl-end { - --bs-position: end; - } - .dropdown-menu-xl-end[data-bs-popper] { - right: 0; - left: auto; - } -} -@media (min-width: 1400px) { - .dropdown-menu-xxl-start { - --bs-position: start; - } - .dropdown-menu-xxl-start[data-bs-popper] { - right: auto; - left: 0; - } - .dropdown-menu-xxl-end { - --bs-position: end; - } - .dropdown-menu-xxl-end[data-bs-popper] { - right: 0; - left: auto; - } -} -.dropup .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: var(--bs-dropdown-spacer); -} -.dropup .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0; - border-right: 0.3em solid transparent; - border-bottom: 0.3em solid; - border-left: 0.3em solid transparent; -} -.dropup .dropdown-toggle:empty::after { - margin-left: 0; -} - -.dropend .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: var(--bs-dropdown-spacer); -} -.dropend .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid transparent; - border-right: 0; - border-bottom: 0.3em solid transparent; - border-left: 0.3em solid; -} -.dropend .dropdown-toggle:empty::after { - margin-left: 0; -} -.dropend .dropdown-toggle::after { - vertical-align: 0; -} - -.dropstart .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: var(--bs-dropdown-spacer); -} -.dropstart .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; -} -.dropstart .dropdown-toggle::after { - display: none; -} -.dropstart .dropdown-toggle::before { - display: inline-block; - margin-right: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid transparent; - border-right: 0.3em solid; - border-bottom: 0.3em solid transparent; -} -.dropstart .dropdown-toggle:empty::after { - margin-left: 0; -} -.dropstart .dropdown-toggle::before { - vertical-align: 0; -} - -.dropdown-divider { - height: 0; - margin: var(--bs-dropdown-divider-margin-y) 0; - overflow: hidden; - border-top: 1px solid var(--bs-dropdown-divider-bg); - opacity: 1; -} - -.dropdown-item { - display: block; - width: 100%; - padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); - clear: both; - font-weight: 400; - color: var(--bs-dropdown-link-color); - text-align: inherit; - text-decoration: none; - white-space: nowrap; - background-color: transparent; - border: 0; - border-radius: var(--bs-dropdown-item-border-radius, 0); -} -.dropdown-item:hover, .dropdown-item:focus { - color: var(--bs-dropdown-link-hover-color); - background-color: var(--bs-dropdown-link-hover-bg); -} -.dropdown-item.active, .dropdown-item:active { - color: var(--bs-dropdown-link-active-color); - text-decoration: none; - background-color: var(--bs-dropdown-link-active-bg); -} -.dropdown-item.disabled, .dropdown-item:disabled { - color: var(--bs-dropdown-link-disabled-color); - pointer-events: none; - background-color: transparent; -} - -.dropdown-menu.show { - display: block; -} - -.dropdown-header { - display: block; - padding: var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x); - margin-bottom: 0; - font-size: 0.875rem; - color: var(--bs-dropdown-header-color); - white-space: nowrap; -} - -.dropdown-item-text { - display: block; - padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); - color: var(--bs-dropdown-link-color); -} - -.dropdown-menu-dark { - --bs-dropdown-color: #dee2e6; - --bs-dropdown-bg: #343a40; - --bs-dropdown-border-color: var(--bs-border-color-translucent); - --bs-dropdown-box-shadow: ; - --bs-dropdown-link-color: #dee2e6; - --bs-dropdown-link-hover-color: #fff; - --bs-dropdown-divider-bg: var(--bs-border-color-translucent); - --bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15); - --bs-dropdown-link-active-color: #fff; - --bs-dropdown-link-active-bg: #0d6efd; - --bs-dropdown-link-disabled-color: #adb5bd; - --bs-dropdown-header-color: #adb5bd; -} - -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; -} -.btn-group > .btn, -.btn-group-vertical > .btn { - position: relative; - flex: 1 1 auto; -} -.btn-group > .btn-check:checked + .btn, -.btn-group > .btn-check:focus + .btn, -.btn-group > .btn:hover, -.btn-group > .btn:focus, -.btn-group > .btn:active, -.btn-group > .btn.active, -.btn-group-vertical > .btn-check:checked + .btn, -.btn-group-vertical > .btn-check:focus + .btn, -.btn-group-vertical > .btn:hover, -.btn-group-vertical > .btn:focus, -.btn-group-vertical > .btn:active, -.btn-group-vertical > .btn.active { - z-index: 1; -} - -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; -} -.btn-toolbar .input-group { - width: auto; -} - -.btn-group { - border-radius: var(--bs-border-radius); -} -.btn-group > :not(.btn-check:first-child) + .btn, -.btn-group > .btn-group:not(:first-child) { - margin-left: calc(-1 * var(--bs-border-width)); -} -.btn-group > .btn:not(:last-child):not(.dropdown-toggle), -.btn-group > .btn.dropdown-toggle-split:first-child, -.btn-group > .btn-group:not(:last-child) > .btn { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.btn-group > .btn:nth-child(n+3), -.btn-group > :not(.btn-check) + .btn, -.btn-group > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} - -.dropdown-toggle-split { - padding-right: 0.5625rem; - padding-left: 0.5625rem; -} -.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after { - margin-left: 0; -} -.dropstart .dropdown-toggle-split::before { - margin-right: 0; -} - -.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { - padding-right: 0.375rem; - padding-left: 0.375rem; -} - -.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { - padding-right: 0.75rem; - padding-left: 0.75rem; -} - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; -} -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group { - width: 100%; -} -.btn-group-vertical > .btn:not(:first-child), -.btn-group-vertical > .btn-group:not(:first-child) { - margin-top: calc(-1 * var(--bs-border-width)); -} -.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), -.btn-group-vertical > .btn-group:not(:last-child) > .btn { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn:nth-child(n+3), -.btn-group-vertical > :not(.btn-check) + .btn, -.btn-group-vertical > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.nav { - --bs-nav-link-padding-x: 1rem; - --bs-nav-link-padding-y: 0.5rem; - --bs-nav-link-font-weight: ; - --bs-nav-link-color: var(--bs-link-color); - --bs-nav-link-hover-color: var(--bs-link-hover-color); - --bs-nav-link-disabled-color: var(--bs-secondary-color); - display: flex; - flex-wrap: wrap; - padding-left: 0; - margin-bottom: 0; - list-style: none; -} - -.nav-link { - display: block; - padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x); - font-size: var(--bs-nav-link-font-size); - font-weight: var(--bs-nav-link-font-weight); - color: var(--bs-nav-link-color); - text-decoration: none; - background: none; - border: 0; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .nav-link { - transition: none; - } -} -.nav-link:hover, .nav-link:focus { - color: var(--bs-nav-link-hover-color); -} -.nav-link:focus-visible { - outline: 0; - box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); -} -.nav-link.disabled, .nav-link:disabled { - color: var(--bs-nav-link-disabled-color); - pointer-events: none; - cursor: default; -} - -.nav-tabs { - --bs-nav-tabs-border-width: var(--bs-border-width); - --bs-nav-tabs-border-color: var(--bs-border-color); - --bs-nav-tabs-border-radius: var(--bs-border-radius); - --bs-nav-tabs-link-hover-border-color: var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color); - --bs-nav-tabs-link-active-color: var(--bs-emphasis-color); - --bs-nav-tabs-link-active-bg: var(--bs-body-bg); - --bs-nav-tabs-link-active-border-color: var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg); - border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color); -} -.nav-tabs .nav-link { - margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width)); - border: var(--bs-nav-tabs-border-width) solid transparent; - border-top-left-radius: var(--bs-nav-tabs-border-radius); - border-top-right-radius: var(--bs-nav-tabs-border-radius); -} -.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { - isolation: isolate; - border-color: var(--bs-nav-tabs-link-hover-border-color); -} -.nav-tabs .nav-link.active, -.nav-tabs .nav-item.show .nav-link { - color: var(--bs-nav-tabs-link-active-color); - background-color: var(--bs-nav-tabs-link-active-bg); - border-color: var(--bs-nav-tabs-link-active-border-color); -} -.nav-tabs .dropdown-menu { - margin-top: calc(-1 * var(--bs-nav-tabs-border-width)); - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.nav-pills { - --bs-nav-pills-border-radius: var(--bs-border-radius); - --bs-nav-pills-link-active-color: #fff; - --bs-nav-pills-link-active-bg: #0d6efd; -} -.nav-pills .nav-link { - border-radius: var(--bs-nav-pills-border-radius); -} -.nav-pills .nav-link.active, -.nav-pills .show > .nav-link { - color: var(--bs-nav-pills-link-active-color); - background-color: var(--bs-nav-pills-link-active-bg); -} - -.nav-underline { - --bs-nav-underline-gap: 1rem; - --bs-nav-underline-border-width: 0.125rem; - --bs-nav-underline-link-active-color: var(--bs-emphasis-color); - gap: var(--bs-nav-underline-gap); -} -.nav-underline .nav-link { - padding-right: 0; - padding-left: 0; - border-bottom: var(--bs-nav-underline-border-width) solid transparent; -} -.nav-underline .nav-link:hover, .nav-underline .nav-link:focus { - border-bottom-color: currentcolor; -} -.nav-underline .nav-link.active, -.nav-underline .show > .nav-link { - font-weight: 700; - color: var(--bs-nav-underline-link-active-color); - border-bottom-color: currentcolor; -} - -.nav-fill > .nav-link, -.nav-fill .nav-item { - flex: 1 1 auto; - text-align: center; -} - -.nav-justified > .nav-link, -.nav-justified .nav-item { - flex-grow: 1; - flex-basis: 0; - text-align: center; -} - -.nav-fill .nav-item .nav-link, -.nav-justified .nav-item .nav-link { - width: 100%; -} - -.tab-content > .tab-pane { - display: none; -} -.tab-content > .active { - display: block; -} - -.navbar { - --bs-navbar-padding-x: 0; - --bs-navbar-padding-y: 0.5rem; - --bs-navbar-color: rgba(var(--bs-emphasis-color-rgb), 0.65); - --bs-navbar-hover-color: rgba(var(--bs-emphasis-color-rgb), 0.8); - --bs-navbar-disabled-color: rgba(var(--bs-emphasis-color-rgb), 0.3); - --bs-navbar-active-color: rgba(var(--bs-emphasis-color-rgb), 1); - --bs-navbar-brand-padding-y: 0.3125rem; - --bs-navbar-brand-margin-end: 1rem; - --bs-navbar-brand-font-size: 1.25rem; - --bs-navbar-brand-color: rgba(var(--bs-emphasis-color-rgb), 1); - --bs-navbar-brand-hover-color: rgba(var(--bs-emphasis-color-rgb), 1); - --bs-navbar-nav-link-padding-x: 0.5rem; - --bs-navbar-toggler-padding-y: 0.25rem; - --bs-navbar-toggler-padding-x: 0.75rem; - --bs-navbar-toggler-font-size: 1.25rem; - --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); - --bs-navbar-toggler-border-color: rgba(var(--bs-emphasis-color-rgb), 0.15); - --bs-navbar-toggler-border-radius: var(--bs-border-radius); - --bs-navbar-toggler-focus-width: 0.25rem; - --bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out; - position: relative; - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: space-between; - padding: var(--bs-navbar-padding-y) var(--bs-navbar-padding-x); -} -.navbar > .container, -.navbar > .container-fluid, -.navbar > .container-sm, -.navbar > .container-md, -.navbar > .container-lg, -.navbar > .container-xl, -.navbar > .container-xxl { - display: flex; - flex-wrap: inherit; - align-items: center; - justify-content: space-between; -} -.navbar-brand { - padding-top: var(--bs-navbar-brand-padding-y); - padding-bottom: var(--bs-navbar-brand-padding-y); - margin-right: var(--bs-navbar-brand-margin-end); - font-size: var(--bs-navbar-brand-font-size); - color: var(--bs-navbar-brand-color); - text-decoration: none; - white-space: nowrap; -} -.navbar-brand:hover, .navbar-brand:focus { - color: var(--bs-navbar-brand-hover-color); -} - -.navbar-nav { - --bs-nav-link-padding-x: 0; - --bs-nav-link-padding-y: 0.5rem; - --bs-nav-link-font-weight: ; - --bs-nav-link-color: var(--bs-navbar-color); - --bs-nav-link-hover-color: var(--bs-navbar-hover-color); - --bs-nav-link-disabled-color: var(--bs-navbar-disabled-color); - display: flex; - flex-direction: column; - padding-left: 0; - margin-bottom: 0; - list-style: none; -} -.navbar-nav .nav-link.active, .navbar-nav .nav-link.show { - color: var(--bs-navbar-active-color); -} -.navbar-nav .dropdown-menu { - position: static; -} - -.navbar-text { - padding-top: 0.5rem; - padding-bottom: 0.5rem; - color: var(--bs-navbar-color); -} -.navbar-text a, -.navbar-text a:hover, -.navbar-text a:focus { - color: var(--bs-navbar-active-color); -} - -.navbar-collapse { - flex-grow: 1; - flex-basis: 100%; - align-items: center; -} - -.navbar-toggler { - padding: var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x); - font-size: var(--bs-navbar-toggler-font-size); - line-height: 1; - color: var(--bs-navbar-color); - background-color: transparent; - border: var(--bs-border-width) solid var(--bs-navbar-toggler-border-color); - border-radius: var(--bs-navbar-toggler-border-radius); - transition: var(--bs-navbar-toggler-transition); -} -@media (prefers-reduced-motion: reduce) { - .navbar-toggler { - transition: none; - } -} -.navbar-toggler:hover { - text-decoration: none; -} -.navbar-toggler:focus { - text-decoration: none; - outline: 0; - box-shadow: 0 0 0 var(--bs-navbar-toggler-focus-width); -} - -.navbar-toggler-icon { - display: inline-block; - width: 1.5em; - height: 1.5em; - vertical-align: middle; - background-image: var(--bs-navbar-toggler-icon-bg); - background-repeat: no-repeat; - background-position: center; - background-size: 100%; -} - -.navbar-nav-scroll { - max-height: var(--bs-scroll-height, 75vh); - overflow-y: auto; -} - -@media (min-width: 576px) { - .navbar-expand-sm { - flex-wrap: nowrap; - justify-content: flex-start; - } - .navbar-expand-sm .navbar-nav { - flex-direction: row; - } - .navbar-expand-sm .navbar-nav .dropdown-menu { - position: absolute; - } - .navbar-expand-sm .navbar-nav .nav-link { - padding-right: var(--bs-navbar-nav-link-padding-x); - padding-left: var(--bs-navbar-nav-link-padding-x); - } - .navbar-expand-sm .navbar-nav-scroll { - overflow: visible; - } - .navbar-expand-sm .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .navbar-expand-sm .navbar-toggler { - display: none; - } - .navbar-expand-sm .offcanvas { - position: static; - z-index: auto; - flex-grow: 1; - width: auto !important; - height: auto !important; - visibility: visible !important; - background-color: transparent !important; - border: 0 !important; - transform: none !important; - transition: none; - } - .navbar-expand-sm .offcanvas .offcanvas-header { - display: none; - } - .navbar-expand-sm .offcanvas .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; - } -} -@media (min-width: 768px) { - .navbar-expand-md { - flex-wrap: nowrap; - justify-content: flex-start; - } - .navbar-expand-md .navbar-nav { - flex-direction: row; - } - .navbar-expand-md .navbar-nav .dropdown-menu { - position: absolute; - } - .navbar-expand-md .navbar-nav .nav-link { - padding-right: var(--bs-navbar-nav-link-padding-x); - padding-left: var(--bs-navbar-nav-link-padding-x); - } - .navbar-expand-md .navbar-nav-scroll { - overflow: visible; - } - .navbar-expand-md .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .navbar-expand-md .navbar-toggler { - display: none; - } - .navbar-expand-md .offcanvas { - position: static; - z-index: auto; - flex-grow: 1; - width: auto !important; - height: auto !important; - visibility: visible !important; - background-color: transparent !important; - border: 0 !important; - transform: none !important; - transition: none; - } - .navbar-expand-md .offcanvas .offcanvas-header { - display: none; - } - .navbar-expand-md .offcanvas .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; - } -} -@media (min-width: 992px) { - .navbar-expand-lg { - flex-wrap: nowrap; - justify-content: flex-start; - } - .navbar-expand-lg .navbar-nav { - flex-direction: row; - } - .navbar-expand-lg .navbar-nav .dropdown-menu { - position: absolute; - } - .navbar-expand-lg .navbar-nav .nav-link { - padding-right: var(--bs-navbar-nav-link-padding-x); - padding-left: var(--bs-navbar-nav-link-padding-x); - } - .navbar-expand-lg .navbar-nav-scroll { - overflow: visible; - } - .navbar-expand-lg .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .navbar-expand-lg .navbar-toggler { - display: none; - } - .navbar-expand-lg .offcanvas { - position: static; - z-index: auto; - flex-grow: 1; - width: auto !important; - height: auto !important; - visibility: visible !important; - background-color: transparent !important; - border: 0 !important; - transform: none !important; - transition: none; - } - .navbar-expand-lg .offcanvas .offcanvas-header { - display: none; - } - .navbar-expand-lg .offcanvas .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; - } -} -@media (min-width: 1200px) { - .navbar-expand-xl { - flex-wrap: nowrap; - justify-content: flex-start; - } - .navbar-expand-xl .navbar-nav { - flex-direction: row; - } - .navbar-expand-xl .navbar-nav .dropdown-menu { - position: absolute; - } - .navbar-expand-xl .navbar-nav .nav-link { - padding-right: var(--bs-navbar-nav-link-padding-x); - padding-left: var(--bs-navbar-nav-link-padding-x); - } - .navbar-expand-xl .navbar-nav-scroll { - overflow: visible; - } - .navbar-expand-xl .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .navbar-expand-xl .navbar-toggler { - display: none; - } - .navbar-expand-xl .offcanvas { - position: static; - z-index: auto; - flex-grow: 1; - width: auto !important; - height: auto !important; - visibility: visible !important; - background-color: transparent !important; - border: 0 !important; - transform: none !important; - transition: none; - } - .navbar-expand-xl .offcanvas .offcanvas-header { - display: none; - } - .navbar-expand-xl .offcanvas .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; - } -} -@media (min-width: 1400px) { - .navbar-expand-xxl { - flex-wrap: nowrap; - justify-content: flex-start; - } - .navbar-expand-xxl .navbar-nav { - flex-direction: row; - } - .navbar-expand-xxl .navbar-nav .dropdown-menu { - position: absolute; - } - .navbar-expand-xxl .navbar-nav .nav-link { - padding-right: var(--bs-navbar-nav-link-padding-x); - padding-left: var(--bs-navbar-nav-link-padding-x); - } - .navbar-expand-xxl .navbar-nav-scroll { - overflow: visible; - } - .navbar-expand-xxl .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .navbar-expand-xxl .navbar-toggler { - display: none; - } - .navbar-expand-xxl .offcanvas { - position: static; - z-index: auto; - flex-grow: 1; - width: auto !important; - height: auto !important; - visibility: visible !important; - background-color: transparent !important; - border: 0 !important; - transform: none !important; - transition: none; - } - .navbar-expand-xxl .offcanvas .offcanvas-header { - display: none; - } - .navbar-expand-xxl .offcanvas .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; - } -} -.navbar-expand { - flex-wrap: nowrap; - justify-content: flex-start; -} -.navbar-expand .navbar-nav { - flex-direction: row; -} -.navbar-expand .navbar-nav .dropdown-menu { - position: absolute; -} -.navbar-expand .navbar-nav .nav-link { - padding-right: var(--bs-navbar-nav-link-padding-x); - padding-left: var(--bs-navbar-nav-link-padding-x); -} -.navbar-expand .navbar-nav-scroll { - overflow: visible; -} -.navbar-expand .navbar-collapse { - display: flex !important; - flex-basis: auto; -} -.navbar-expand .navbar-toggler { - display: none; -} -.navbar-expand .offcanvas { - position: static; - z-index: auto; - flex-grow: 1; - width: auto !important; - height: auto !important; - visibility: visible !important; - background-color: transparent !important; - border: 0 !important; - transform: none !important; - transition: none; -} -.navbar-expand .offcanvas .offcanvas-header { - display: none; -} -.navbar-expand .offcanvas .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; -} - -.navbar-dark, -.navbar[data-bs-theme=dark] { - --bs-navbar-color: rgba(255, 255, 255, 0.55); - --bs-navbar-hover-color: rgba(255, 255, 255, 0.75); - --bs-navbar-disabled-color: rgba(255, 255, 255, 0.25); - --bs-navbar-active-color: #fff; - --bs-navbar-brand-color: #fff; - --bs-navbar-brand-hover-color: #fff; - --bs-navbar-toggler-border-color: rgba(255, 255, 255, 0.1); - --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); -} - -[data-bs-theme=dark] .navbar-toggler-icon { - --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); -} - -.card { - --bs-card-spacer-y: 1rem; - --bs-card-spacer-x: 1rem; - --bs-card-title-spacer-y: 0.5rem; - --bs-card-title-color: ; - --bs-card-subtitle-color: ; - --bs-card-border-width: var(--bs-border-width); - --bs-card-border-color: var(--bs-border-color-translucent); - --bs-card-border-radius: var(--bs-border-radius); - --bs-card-box-shadow: ; - --bs-card-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width))); - --bs-card-cap-padding-y: 0.5rem; - --bs-card-cap-padding-x: 1rem; - --bs-card-cap-bg: rgba(var(--bs-body-color-rgb), 0.03); - --bs-card-cap-color: ; - --bs-card-height: ; - --bs-card-color: ; - --bs-card-bg: var(--bs-body-bg); - --bs-card-img-overlay-padding: 1rem; - --bs-card-group-margin: 0.75rem; - position: relative; - display: flex; - flex-direction: column; - min-width: 0; - height: var(--bs-card-height); - color: var(--bs-body-color); - word-wrap: break-word; - background-color: var(--bs-card-bg); - background-clip: border-box; - border: var(--bs-card-border-width) solid var(--bs-card-border-color); - border-radius: var(--bs-card-border-radius); -} -.card > hr { - margin-right: 0; - margin-left: 0; -} -.card > .list-group { - border-top: inherit; - border-bottom: inherit; -} -.card > .list-group:first-child { - border-top-width: 0; - border-top-left-radius: var(--bs-card-inner-border-radius); - border-top-right-radius: var(--bs-card-inner-border-radius); -} -.card > .list-group:last-child { - border-bottom-width: 0; - border-bottom-right-radius: var(--bs-card-inner-border-radius); - border-bottom-left-radius: var(--bs-card-inner-border-radius); -} -.card > .card-header + .list-group, -.card > .list-group + .card-footer { - border-top: 0; -} - -.card-body { - flex: 1 1 auto; - padding: var(--bs-card-spacer-y) var(--bs-card-spacer-x); - color: var(--bs-card-color); -} - -.card-title { - margin-bottom: var(--bs-card-title-spacer-y); - color: var(--bs-card-title-color); -} - -.card-subtitle { - margin-top: calc(-0.5 * var(--bs-card-title-spacer-y)); - margin-bottom: 0; - color: var(--bs-card-subtitle-color); -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link + .card-link { - margin-left: var(--bs-card-spacer-x); -} - -.card-header { - padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x); - margin-bottom: 0; - color: var(--bs-card-cap-color); - background-color: var(--bs-card-cap-bg); - border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color); -} -.card-header:first-child { - border-radius: var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0; -} - -.card-footer { - padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x); - color: var(--bs-card-cap-color); - background-color: var(--bs-card-cap-bg); - border-top: var(--bs-card-border-width) solid var(--bs-card-border-color); -} -.card-footer:last-child { - border-radius: 0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius); -} - -.card-header-tabs { - margin-right: calc(-0.5 * var(--bs-card-cap-padding-x)); - margin-bottom: calc(-1 * var(--bs-card-cap-padding-y)); - margin-left: calc(-0.5 * var(--bs-card-cap-padding-x)); - border-bottom: 0; -} -.card-header-tabs .nav-link.active { - background-color: var(--bs-card-bg); - border-bottom-color: var(--bs-card-bg); -} - -.card-header-pills { - margin-right: calc(-0.5 * var(--bs-card-cap-padding-x)); - margin-left: calc(-0.5 * var(--bs-card-cap-padding-x)); -} - -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: var(--bs-card-img-overlay-padding); - border-radius: var(--bs-card-inner-border-radius); -} - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; -} - -.card-img, -.card-img-top { - border-top-left-radius: var(--bs-card-inner-border-radius); - border-top-right-radius: var(--bs-card-inner-border-radius); -} - -.card-img, -.card-img-bottom { - border-bottom-right-radius: var(--bs-card-inner-border-radius); - border-bottom-left-radius: var(--bs-card-inner-border-radius); -} - -.card-group > .card { - margin-bottom: var(--bs-card-group-margin); -} -@media (min-width: 576px) { - .card-group { - display: flex; - flex-flow: row wrap; - } - .card-group > .card { - flex: 1 0 0; - margin-bottom: 0; - } - .card-group > .card + .card { - margin-left: 0; - border-left: 0; - } - .card-group > .card:not(:last-child) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; - } - .card-group > .card:not(:last-child) > .card-img-top, - .card-group > .card:not(:last-child) > .card-header { - border-top-right-radius: 0; - } - .card-group > .card:not(:last-child) > .card-img-bottom, - .card-group > .card:not(:last-child) > .card-footer { - border-bottom-right-radius: 0; - } - .card-group > .card:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; - } - .card-group > .card:not(:first-child) > .card-img-top, - .card-group > .card:not(:first-child) > .card-header { - border-top-left-radius: 0; - } - .card-group > .card:not(:first-child) > .card-img-bottom, - .card-group > .card:not(:first-child) > .card-footer { - border-bottom-left-radius: 0; - } -} - -.accordion { - --bs-accordion-color: var(--bs-body-color); - --bs-accordion-bg: var(--bs-body-bg); - --bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease; - --bs-accordion-border-color: var(--bs-border-color); - --bs-accordion-border-width: var(--bs-border-width); - --bs-accordion-border-radius: var(--bs-border-radius); - --bs-accordion-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width))); - --bs-accordion-btn-padding-x: 1.25rem; - --bs-accordion-btn-padding-y: 1rem; - --bs-accordion-btn-color: var(--bs-body-color); - --bs-accordion-btn-bg: var(--bs-accordion-bg); - --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23212529' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); - --bs-accordion-btn-icon-width: 1.25rem; - --bs-accordion-btn-icon-transform: rotate(-180deg); - --bs-accordion-btn-icon-transition: transform 0.2s ease-in-out; - --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='rgb%285.2, 44, 101.2%29' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); - --bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); - --bs-accordion-body-padding-x: 1.25rem; - --bs-accordion-body-padding-y: 1rem; - --bs-accordion-active-color: var(--bs-primary-text-emphasis); - --bs-accordion-active-bg: var(--bs-primary-bg-subtle); -} - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x); - font-size: 1rem; - color: var(--bs-accordion-btn-color); - text-align: left; - background-color: var(--bs-accordion-btn-bg); - border: 0; - border-radius: 0; - overflow-anchor: none; - transition: var(--bs-accordion-transition); -} -@media (prefers-reduced-motion: reduce) { - .accordion-button { - transition: none; - } -} -.accordion-button:not(.collapsed) { - color: var(--bs-accordion-active-color); - background-color: var(--bs-accordion-active-bg); - box-shadow: inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color); -} -.accordion-button:not(.collapsed)::after { - background-image: var(--bs-accordion-btn-active-icon); - transform: var(--bs-accordion-btn-icon-transform); -} -.accordion-button::after { - flex-shrink: 0; - width: var(--bs-accordion-btn-icon-width); - height: var(--bs-accordion-btn-icon-width); - margin-left: auto; - content: ""; - background-image: var(--bs-accordion-btn-icon); - background-repeat: no-repeat; - background-size: var(--bs-accordion-btn-icon-width); - transition: var(--bs-accordion-btn-icon-transition); -} -@media (prefers-reduced-motion: reduce) { - .accordion-button::after { - transition: none; - } -} -.accordion-button:hover { - z-index: 2; -} -.accordion-button:focus { - z-index: 3; - outline: 0; - box-shadow: var(--bs-accordion-btn-focus-box-shadow); -} - -.accordion-header { - margin-bottom: 0; -} - -.accordion-item { - color: var(--bs-accordion-color); - background-color: var(--bs-accordion-bg); - border: var(--bs-accordion-border-width) solid var(--bs-accordion-border-color); -} -.accordion-item:first-of-type { - border-top-left-radius: var(--bs-accordion-border-radius); - border-top-right-radius: var(--bs-accordion-border-radius); -} -.accordion-item:first-of-type > .accordion-header .accordion-button { - border-top-left-radius: var(--bs-accordion-inner-border-radius); - border-top-right-radius: var(--bs-accordion-inner-border-radius); -} -.accordion-item:not(:first-of-type) { - border-top: 0; -} -.accordion-item:last-of-type { - border-bottom-right-radius: var(--bs-accordion-border-radius); - border-bottom-left-radius: var(--bs-accordion-border-radius); -} -.accordion-item:last-of-type > .accordion-header .accordion-button.collapsed { - border-bottom-right-radius: var(--bs-accordion-inner-border-radius); - border-bottom-left-radius: var(--bs-accordion-inner-border-radius); -} -.accordion-item:last-of-type > .accordion-collapse { - border-bottom-right-radius: var(--bs-accordion-border-radius); - border-bottom-left-radius: var(--bs-accordion-border-radius); -} - -.accordion-body { - padding: var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x); -} - -.accordion-flush > .accordion-item { - border-right: 0; - border-left: 0; - border-radius: 0; -} -.accordion-flush > .accordion-item:first-child { - border-top: 0; -} -.accordion-flush > .accordion-item:last-child { - border-bottom: 0; -} -.accordion-flush > .accordion-item > .accordion-collapse, -.accordion-flush > .accordion-item > .accordion-header .accordion-button, -.accordion-flush > .accordion-item > .accordion-header .accordion-button.collapsed { - border-radius: 0; -} - -[data-bs-theme=dark] .accordion-button::after { - --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='rgb%28109.8, 168, 253.8%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e"); - --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='rgb%28109.8, 168, 253.8%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e"); -} - -.breadcrumb { - --bs-breadcrumb-padding-x: 0; - --bs-breadcrumb-padding-y: 0; - --bs-breadcrumb-margin-bottom: 1rem; - --bs-breadcrumb-bg: ; - --bs-breadcrumb-border-radius: ; - --bs-breadcrumb-divider-color: var(--bs-secondary-color); - --bs-breadcrumb-item-padding-x: 0.5rem; - --bs-breadcrumb-item-active-color: var(--bs-secondary-color); - display: flex; - flex-wrap: wrap; - padding: var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x); - margin-bottom: var(--bs-breadcrumb-margin-bottom); - font-size: var(--bs-breadcrumb-font-size); - list-style: none; - background-color: var(--bs-breadcrumb-bg); - border-radius: var(--bs-breadcrumb-border-radius); -} - -.breadcrumb-item + .breadcrumb-item { - padding-left: var(--bs-breadcrumb-item-padding-x); -} -.breadcrumb-item + .breadcrumb-item::before { - float: left; - padding-right: var(--bs-breadcrumb-item-padding-x); - color: var(--bs-breadcrumb-divider-color); - content: var(--bs-breadcrumb-divider, "/") /* rtl: var(--bs-breadcrumb-divider, "/") */; -} -.breadcrumb-item.active { - color: var(--bs-breadcrumb-item-active-color); -} - -.pagination { - --bs-pagination-padding-x: 0.75rem; - --bs-pagination-padding-y: 0.375rem; - --bs-pagination-font-size: 1rem; - --bs-pagination-color: var(--bs-link-color); - --bs-pagination-bg: var(--bs-body-bg); - --bs-pagination-border-width: var(--bs-border-width); - --bs-pagination-border-color: var(--bs-border-color); - --bs-pagination-border-radius: var(--bs-border-radius); - --bs-pagination-hover-color: var(--bs-link-hover-color); - --bs-pagination-hover-bg: var(--bs-tertiary-bg); - --bs-pagination-hover-border-color: var(--bs-border-color); - --bs-pagination-focus-color: var(--bs-link-hover-color); - --bs-pagination-focus-bg: var(--bs-secondary-bg); - --bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); - --bs-pagination-active-color: #fff; - --bs-pagination-active-bg: #0d6efd; - --bs-pagination-active-border-color: #0d6efd; - --bs-pagination-disabled-color: var(--bs-secondary-color); - --bs-pagination-disabled-bg: var(--bs-secondary-bg); - --bs-pagination-disabled-border-color: var(--bs-border-color); - display: flex; - padding-left: 0; - list-style: none; -} - -.page-link { - position: relative; - display: block; - padding: var(--bs-pagination-padding-y) var(--bs-pagination-padding-x); - font-size: var(--bs-pagination-font-size); - color: var(--bs-pagination-color); - text-decoration: none; - background-color: var(--bs-pagination-bg); - border: var(--bs-pagination-border-width) solid var(--bs-pagination-border-color); - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .page-link { - transition: none; - } -} -.page-link:hover { - z-index: 2; - color: var(--bs-pagination-hover-color); - background-color: var(--bs-pagination-hover-bg); - border-color: var(--bs-pagination-hover-border-color); -} -.page-link:focus { - z-index: 3; - color: var(--bs-pagination-focus-color); - background-color: var(--bs-pagination-focus-bg); - outline: 0; - box-shadow: var(--bs-pagination-focus-box-shadow); -} -.page-link.active, .active > .page-link { - z-index: 3; - color: var(--bs-pagination-active-color); - background-color: var(--bs-pagination-active-bg); - border-color: var(--bs-pagination-active-border-color); -} -.page-link.disabled, .disabled > .page-link { - color: var(--bs-pagination-disabled-color); - pointer-events: none; - background-color: var(--bs-pagination-disabled-bg); - border-color: var(--bs-pagination-disabled-border-color); -} - -.page-item:not(:first-child) .page-link { - margin-left: calc(-1 * var(--bs-border-width)); -} -.page-item:first-child .page-link { - border-top-left-radius: var(--bs-pagination-border-radius); - border-bottom-left-radius: var(--bs-pagination-border-radius); -} -.page-item:last-child .page-link { - border-top-right-radius: var(--bs-pagination-border-radius); - border-bottom-right-radius: var(--bs-pagination-border-radius); -} - -.pagination-lg { - --bs-pagination-padding-x: 1.5rem; - --bs-pagination-padding-y: 0.75rem; - --bs-pagination-font-size: 1.25rem; - --bs-pagination-border-radius: var(--bs-border-radius-lg); -} - -.pagination-sm { - --bs-pagination-padding-x: 0.5rem; - --bs-pagination-padding-y: 0.25rem; - --bs-pagination-font-size: 0.875rem; - --bs-pagination-border-radius: var(--bs-border-radius-sm); -} - -.badge { - --bs-badge-padding-x: 0.65em; - --bs-badge-padding-y: 0.35em; - --bs-badge-font-size: 0.75em; - --bs-badge-font-weight: 700; - --bs-badge-color: #fff; - --bs-badge-border-radius: var(--bs-border-radius); - display: inline-block; - padding: var(--bs-badge-padding-y) var(--bs-badge-padding-x); - font-size: var(--bs-badge-font-size); - font-weight: var(--bs-badge-font-weight); - line-height: 1; - color: var(--bs-badge-color); - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: var(--bs-badge-border-radius); -} -.badge:empty { - display: none; -} - -.btn .badge { - position: relative; - top: -1px; -} - -.alert { - --bs-alert-bg: transparent; - --bs-alert-padding-x: 1rem; - --bs-alert-padding-y: 1rem; - --bs-alert-margin-bottom: 1rem; - --bs-alert-color: inherit; - --bs-alert-border-color: transparent; - --bs-alert-border: var(--bs-border-width) solid var(--bs-alert-border-color); - --bs-alert-border-radius: var(--bs-border-radius); - --bs-alert-link-color: inherit; - position: relative; - padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x); - margin-bottom: var(--bs-alert-margin-bottom); - color: var(--bs-alert-color); - background-color: var(--bs-alert-bg); - border: var(--bs-alert-border); - border-radius: var(--bs-alert-border-radius); -} - -.alert-heading { - color: inherit; -} - -.alert-link { - font-weight: 700; - color: var(--bs-alert-link-color); -} - -.alert-dismissible { - padding-right: 3rem; -} -.alert-dismissible .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: 2; - padding: 1.25rem 1rem; -} - -.alert-primary { - --bs-alert-color: var(--bs-primary-text-emphasis); - --bs-alert-bg: var(--bs-primary-bg-subtle); - --bs-alert-border-color: var(--bs-primary-border-subtle); - --bs-alert-link-color: var(--bs-primary-text-emphasis); -} - -.alert-secondary { - --bs-alert-color: var(--bs-secondary-text-emphasis); - --bs-alert-bg: var(--bs-secondary-bg-subtle); - --bs-alert-border-color: var(--bs-secondary-border-subtle); - --bs-alert-link-color: var(--bs-secondary-text-emphasis); -} - -.alert-success { - --bs-alert-color: var(--bs-success-text-emphasis); - --bs-alert-bg: var(--bs-success-bg-subtle); - --bs-alert-border-color: var(--bs-success-border-subtle); - --bs-alert-link-color: var(--bs-success-text-emphasis); -} - -.alert-info { - --bs-alert-color: var(--bs-info-text-emphasis); - --bs-alert-bg: var(--bs-info-bg-subtle); - --bs-alert-border-color: var(--bs-info-border-subtle); - --bs-alert-link-color: var(--bs-info-text-emphasis); -} - -.alert-warning { - --bs-alert-color: var(--bs-warning-text-emphasis); - --bs-alert-bg: var(--bs-warning-bg-subtle); - --bs-alert-border-color: var(--bs-warning-border-subtle); - --bs-alert-link-color: var(--bs-warning-text-emphasis); -} - -.alert-danger { - --bs-alert-color: var(--bs-danger-text-emphasis); - --bs-alert-bg: var(--bs-danger-bg-subtle); - --bs-alert-border-color: var(--bs-danger-border-subtle); - --bs-alert-link-color: var(--bs-danger-text-emphasis); -} - -.alert-light { - --bs-alert-color: var(--bs-light-text-emphasis); - --bs-alert-bg: var(--bs-light-bg-subtle); - --bs-alert-border-color: var(--bs-light-border-subtle); - --bs-alert-link-color: var(--bs-light-text-emphasis); -} - -.alert-dark { - --bs-alert-color: var(--bs-dark-text-emphasis); - --bs-alert-bg: var(--bs-dark-bg-subtle); - --bs-alert-border-color: var(--bs-dark-border-subtle); - --bs-alert-link-color: var(--bs-dark-text-emphasis); -} - -@keyframes progress-bar-stripes { - 0% { - background-position-x: var(--bs-progress-height); - } -} -.progress, -.progress-stacked { - --bs-progress-height: 1rem; - --bs-progress-font-size: 0.75rem; - --bs-progress-bg: var(--bs-secondary-bg); - --bs-progress-border-radius: var(--bs-border-radius); - --bs-progress-box-shadow: var(--bs-box-shadow-inset); - --bs-progress-bar-color: #fff; - --bs-progress-bar-bg: #0d6efd; - --bs-progress-bar-transition: width 0.6s ease; - display: flex; - height: var(--bs-progress-height); - overflow: hidden; - font-size: var(--bs-progress-font-size); - background-color: var(--bs-progress-bg); - border-radius: var(--bs-progress-border-radius); -} - -.progress-bar { - display: flex; - flex-direction: column; - justify-content: center; - overflow: hidden; - color: var(--bs-progress-bar-color); - text-align: center; - white-space: nowrap; - background-color: var(--bs-progress-bar-bg); - transition: var(--bs-progress-bar-transition); -} -@media (prefers-reduced-motion: reduce) { - .progress-bar { - transition: none; - } -} - -.progress-bar-striped { - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-size: var(--bs-progress-height) var(--bs-progress-height); -} - -.progress-stacked > .progress { - overflow: visible; -} - -.progress-stacked > .progress > .progress-bar { - width: 100%; -} - -.progress-bar-animated { - animation: 1s linear infinite progress-bar-stripes; -} -@media (prefers-reduced-motion: reduce) { - .progress-bar-animated { - animation: none; - } -} - -.list-group { - --bs-list-group-color: var(--bs-body-color); - --bs-list-group-bg: var(--bs-body-bg); - --bs-list-group-border-color: var(--bs-border-color); - --bs-list-group-border-width: var(--bs-border-width); - --bs-list-group-border-radius: var(--bs-border-radius); - --bs-list-group-item-padding-x: 1rem; - --bs-list-group-item-padding-y: 0.5rem; - --bs-list-group-action-color: var(--bs-secondary-color); - --bs-list-group-action-hover-color: var(--bs-emphasis-color); - --bs-list-group-action-hover-bg: var(--bs-tertiary-bg); - --bs-list-group-action-active-color: var(--bs-body-color); - --bs-list-group-action-active-bg: var(--bs-secondary-bg); - --bs-list-group-disabled-color: var(--bs-secondary-color); - --bs-list-group-disabled-bg: var(--bs-body-bg); - --bs-list-group-active-color: #fff; - --bs-list-group-active-bg: #0d6efd; - --bs-list-group-active-border-color: #0d6efd; - display: flex; - flex-direction: column; - padding-left: 0; - margin-bottom: 0; - border-radius: var(--bs-list-group-border-radius); -} - -.list-group-numbered { - list-style-type: none; - counter-reset: section; -} -.list-group-numbered > .list-group-item::before { - content: counters(section, ".") ". "; - counter-increment: section; -} - -.list-group-item { - position: relative; - display: block; - padding: var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x); - color: var(--bs-list-group-color); - text-decoration: none; - background-color: var(--bs-list-group-bg); - border: var(--bs-list-group-border-width) solid var(--bs-list-group-border-color); -} -.list-group-item:first-child { - border-top-left-radius: inherit; - border-top-right-radius: inherit; -} -.list-group-item:last-child { - border-bottom-right-radius: inherit; - border-bottom-left-radius: inherit; -} -.list-group-item.disabled, .list-group-item:disabled { - color: var(--bs-list-group-disabled-color); - pointer-events: none; - background-color: var(--bs-list-group-disabled-bg); -} -.list-group-item.active { - z-index: 2; - color: var(--bs-list-group-active-color); - background-color: var(--bs-list-group-active-bg); - border-color: var(--bs-list-group-active-border-color); -} -.list-group-item + .list-group-item { - border-top-width: 0; -} -.list-group-item + .list-group-item.active { - margin-top: calc(-1 * var(--bs-list-group-border-width)); - border-top-width: var(--bs-list-group-border-width); -} - -.list-group-item-action { - width: 100%; - color: var(--bs-list-group-action-color); - text-align: inherit; -} -.list-group-item-action:not(.active):hover, .list-group-item-action:not(.active):focus { - z-index: 1; - color: var(--bs-list-group-action-hover-color); - text-decoration: none; - background-color: var(--bs-list-group-action-hover-bg); -} -.list-group-item-action:not(.active):active { - color: var(--bs-list-group-action-active-color); - background-color: var(--bs-list-group-action-active-bg); -} - -.list-group-horizontal { - flex-direction: row; -} -.list-group-horizontal > .list-group-item:first-child:not(:last-child) { - border-bottom-left-radius: var(--bs-list-group-border-radius); - border-top-right-radius: 0; -} -.list-group-horizontal > .list-group-item:last-child:not(:first-child) { - border-top-right-radius: var(--bs-list-group-border-radius); - border-bottom-left-radius: 0; -} -.list-group-horizontal > .list-group-item.active { - margin-top: 0; -} -.list-group-horizontal > .list-group-item + .list-group-item { - border-top-width: var(--bs-list-group-border-width); - border-left-width: 0; -} -.list-group-horizontal > .list-group-item + .list-group-item.active { - margin-left: calc(-1 * var(--bs-list-group-border-width)); - border-left-width: var(--bs-list-group-border-width); -} - -@media (min-width: 576px) { - .list-group-horizontal-sm { - flex-direction: row; - } - .list-group-horizontal-sm > .list-group-item:first-child:not(:last-child) { - border-bottom-left-radius: var(--bs-list-group-border-radius); - border-top-right-radius: 0; - } - .list-group-horizontal-sm > .list-group-item:last-child:not(:first-child) { - border-top-right-radius: var(--bs-list-group-border-radius); - border-bottom-left-radius: 0; - } - .list-group-horizontal-sm > .list-group-item.active { - margin-top: 0; - } - .list-group-horizontal-sm > .list-group-item + .list-group-item { - border-top-width: var(--bs-list-group-border-width); - border-left-width: 0; - } - .list-group-horizontal-sm > .list-group-item + .list-group-item.active { - margin-left: calc(-1 * var(--bs-list-group-border-width)); - border-left-width: var(--bs-list-group-border-width); - } -} -@media (min-width: 768px) { - .list-group-horizontal-md { - flex-direction: row; - } - .list-group-horizontal-md > .list-group-item:first-child:not(:last-child) { - border-bottom-left-radius: var(--bs-list-group-border-radius); - border-top-right-radius: 0; - } - .list-group-horizontal-md > .list-group-item:last-child:not(:first-child) { - border-top-right-radius: var(--bs-list-group-border-radius); - border-bottom-left-radius: 0; - } - .list-group-horizontal-md > .list-group-item.active { - margin-top: 0; - } - .list-group-horizontal-md > .list-group-item + .list-group-item { - border-top-width: var(--bs-list-group-border-width); - border-left-width: 0; - } - .list-group-horizontal-md > .list-group-item + .list-group-item.active { - margin-left: calc(-1 * var(--bs-list-group-border-width)); - border-left-width: var(--bs-list-group-border-width); - } -} -@media (min-width: 992px) { - .list-group-horizontal-lg { - flex-direction: row; - } - .list-group-horizontal-lg > .list-group-item:first-child:not(:last-child) { - border-bottom-left-radius: var(--bs-list-group-border-radius); - border-top-right-radius: 0; - } - .list-group-horizontal-lg > .list-group-item:last-child:not(:first-child) { - border-top-right-radius: var(--bs-list-group-border-radius); - border-bottom-left-radius: 0; - } - .list-group-horizontal-lg > .list-group-item.active { - margin-top: 0; - } - .list-group-horizontal-lg > .list-group-item + .list-group-item { - border-top-width: var(--bs-list-group-border-width); - border-left-width: 0; - } - .list-group-horizontal-lg > .list-group-item + .list-group-item.active { - margin-left: calc(-1 * var(--bs-list-group-border-width)); - border-left-width: var(--bs-list-group-border-width); - } -} -@media (min-width: 1200px) { - .list-group-horizontal-xl { - flex-direction: row; - } - .list-group-horizontal-xl > .list-group-item:first-child:not(:last-child) { - border-bottom-left-radius: var(--bs-list-group-border-radius); - border-top-right-radius: 0; - } - .list-group-horizontal-xl > .list-group-item:last-child:not(:first-child) { - border-top-right-radius: var(--bs-list-group-border-radius); - border-bottom-left-radius: 0; - } - .list-group-horizontal-xl > .list-group-item.active { - margin-top: 0; - } - .list-group-horizontal-xl > .list-group-item + .list-group-item { - border-top-width: var(--bs-list-group-border-width); - border-left-width: 0; - } - .list-group-horizontal-xl > .list-group-item + .list-group-item.active { - margin-left: calc(-1 * var(--bs-list-group-border-width)); - border-left-width: var(--bs-list-group-border-width); - } -} -@media (min-width: 1400px) { - .list-group-horizontal-xxl { - flex-direction: row; - } - .list-group-horizontal-xxl > .list-group-item:first-child:not(:last-child) { - border-bottom-left-radius: var(--bs-list-group-border-radius); - border-top-right-radius: 0; - } - .list-group-horizontal-xxl > .list-group-item:last-child:not(:first-child) { - border-top-right-radius: var(--bs-list-group-border-radius); - border-bottom-left-radius: 0; - } - .list-group-horizontal-xxl > .list-group-item.active { - margin-top: 0; - } - .list-group-horizontal-xxl > .list-group-item + .list-group-item { - border-top-width: var(--bs-list-group-border-width); - border-left-width: 0; - } - .list-group-horizontal-xxl > .list-group-item + .list-group-item.active { - margin-left: calc(-1 * var(--bs-list-group-border-width)); - border-left-width: var(--bs-list-group-border-width); - } -} -.list-group-flush { - border-radius: 0; -} -.list-group-flush > .list-group-item { - border-width: 0 0 var(--bs-list-group-border-width); -} -.list-group-flush > .list-group-item:last-child { - border-bottom-width: 0; -} - -.list-group-item-primary { - --bs-list-group-color: var(--bs-primary-text-emphasis); - --bs-list-group-bg: var(--bs-primary-bg-subtle); - --bs-list-group-border-color: var(--bs-primary-border-subtle); - --bs-list-group-action-hover-color: var(--bs-emphasis-color); - --bs-list-group-action-hover-bg: var(--bs-primary-border-subtle); - --bs-list-group-action-active-color: var(--bs-emphasis-color); - --bs-list-group-action-active-bg: var(--bs-primary-border-subtle); - --bs-list-group-active-color: var(--bs-primary-bg-subtle); - --bs-list-group-active-bg: var(--bs-primary-text-emphasis); - --bs-list-group-active-border-color: var(--bs-primary-text-emphasis); -} - -.list-group-item-secondary { - --bs-list-group-color: var(--bs-secondary-text-emphasis); - --bs-list-group-bg: var(--bs-secondary-bg-subtle); - --bs-list-group-border-color: var(--bs-secondary-border-subtle); - --bs-list-group-action-hover-color: var(--bs-emphasis-color); - --bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle); - --bs-list-group-action-active-color: var(--bs-emphasis-color); - --bs-list-group-action-active-bg: var(--bs-secondary-border-subtle); - --bs-list-group-active-color: var(--bs-secondary-bg-subtle); - --bs-list-group-active-bg: var(--bs-secondary-text-emphasis); - --bs-list-group-active-border-color: var(--bs-secondary-text-emphasis); -} - -.list-group-item-success { - --bs-list-group-color: var(--bs-success-text-emphasis); - --bs-list-group-bg: var(--bs-success-bg-subtle); - --bs-list-group-border-color: var(--bs-success-border-subtle); - --bs-list-group-action-hover-color: var(--bs-emphasis-color); - --bs-list-group-action-hover-bg: var(--bs-success-border-subtle); - --bs-list-group-action-active-color: var(--bs-emphasis-color); - --bs-list-group-action-active-bg: var(--bs-success-border-subtle); - --bs-list-group-active-color: var(--bs-success-bg-subtle); - --bs-list-group-active-bg: var(--bs-success-text-emphasis); - --bs-list-group-active-border-color: var(--bs-success-text-emphasis); -} - -.list-group-item-info { - --bs-list-group-color: var(--bs-info-text-emphasis); - --bs-list-group-bg: var(--bs-info-bg-subtle); - --bs-list-group-border-color: var(--bs-info-border-subtle); - --bs-list-group-action-hover-color: var(--bs-emphasis-color); - --bs-list-group-action-hover-bg: var(--bs-info-border-subtle); - --bs-list-group-action-active-color: var(--bs-emphasis-color); - --bs-list-group-action-active-bg: var(--bs-info-border-subtle); - --bs-list-group-active-color: var(--bs-info-bg-subtle); - --bs-list-group-active-bg: var(--bs-info-text-emphasis); - --bs-list-group-active-border-color: var(--bs-info-text-emphasis); -} - -.list-group-item-warning { - --bs-list-group-color: var(--bs-warning-text-emphasis); - --bs-list-group-bg: var(--bs-warning-bg-subtle); - --bs-list-group-border-color: var(--bs-warning-border-subtle); - --bs-list-group-action-hover-color: var(--bs-emphasis-color); - --bs-list-group-action-hover-bg: var(--bs-warning-border-subtle); - --bs-list-group-action-active-color: var(--bs-emphasis-color); - --bs-list-group-action-active-bg: var(--bs-warning-border-subtle); - --bs-list-group-active-color: var(--bs-warning-bg-subtle); - --bs-list-group-active-bg: var(--bs-warning-text-emphasis); - --bs-list-group-active-border-color: var(--bs-warning-text-emphasis); -} - -.list-group-item-danger { - --bs-list-group-color: var(--bs-danger-text-emphasis); - --bs-list-group-bg: var(--bs-danger-bg-subtle); - --bs-list-group-border-color: var(--bs-danger-border-subtle); - --bs-list-group-action-hover-color: var(--bs-emphasis-color); - --bs-list-group-action-hover-bg: var(--bs-danger-border-subtle); - --bs-list-group-action-active-color: var(--bs-emphasis-color); - --bs-list-group-action-active-bg: var(--bs-danger-border-subtle); - --bs-list-group-active-color: var(--bs-danger-bg-subtle); - --bs-list-group-active-bg: var(--bs-danger-text-emphasis); - --bs-list-group-active-border-color: var(--bs-danger-text-emphasis); -} - -.list-group-item-light { - --bs-list-group-color: var(--bs-light-text-emphasis); - --bs-list-group-bg: var(--bs-light-bg-subtle); - --bs-list-group-border-color: var(--bs-light-border-subtle); - --bs-list-group-action-hover-color: var(--bs-emphasis-color); - --bs-list-group-action-hover-bg: var(--bs-light-border-subtle); - --bs-list-group-action-active-color: var(--bs-emphasis-color); - --bs-list-group-action-active-bg: var(--bs-light-border-subtle); - --bs-list-group-active-color: var(--bs-light-bg-subtle); - --bs-list-group-active-bg: var(--bs-light-text-emphasis); - --bs-list-group-active-border-color: var(--bs-light-text-emphasis); -} - -.list-group-item-dark { - --bs-list-group-color: var(--bs-dark-text-emphasis); - --bs-list-group-bg: var(--bs-dark-bg-subtle); - --bs-list-group-border-color: var(--bs-dark-border-subtle); - --bs-list-group-action-hover-color: var(--bs-emphasis-color); - --bs-list-group-action-hover-bg: var(--bs-dark-border-subtle); - --bs-list-group-action-active-color: var(--bs-emphasis-color); - --bs-list-group-action-active-bg: var(--bs-dark-border-subtle); - --bs-list-group-active-color: var(--bs-dark-bg-subtle); - --bs-list-group-active-bg: var(--bs-dark-text-emphasis); - --bs-list-group-active-border-color: var(--bs-dark-text-emphasis); -} - -.btn-close { - --bs-btn-close-color: #000; - --bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414'/%3e%3c/svg%3e"); - --bs-btn-close-opacity: 0.5; - --bs-btn-close-hover-opacity: 0.75; - --bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); - --bs-btn-close-focus-opacity: 1; - --bs-btn-close-disabled-opacity: 0.25; - box-sizing: content-box; - width: 1em; - height: 1em; - padding: 0.25em 0.25em; - color: var(--bs-btn-close-color); - background: transparent var(--bs-btn-close-bg) center/1em auto no-repeat; - filter: var(--bs-btn-close-filter); - border: 0; - border-radius: 0.375rem; - opacity: var(--bs-btn-close-opacity); -} -.btn-close:hover { - color: var(--bs-btn-close-color); - text-decoration: none; - opacity: var(--bs-btn-close-hover-opacity); -} -.btn-close:focus { - outline: 0; - box-shadow: var(--bs-btn-close-focus-shadow); - opacity: var(--bs-btn-close-focus-opacity); -} -.btn-close:disabled, .btn-close.disabled { - pointer-events: none; - user-select: none; - opacity: var(--bs-btn-close-disabled-opacity); -} - -.btn-close-white { - --bs-btn-close-filter: invert(1) grayscale(100%) brightness(200%); -} - -:root, -[data-bs-theme=light] { - --bs-btn-close-filter: ; -} - -[data-bs-theme=dark] { - --bs-btn-close-filter: invert(1) grayscale(100%) brightness(200%); -} - -.toast { - --bs-toast-zindex: 1090; - --bs-toast-padding-x: 0.75rem; - --bs-toast-padding-y: 0.5rem; - --bs-toast-spacing: 1.5rem; - --bs-toast-max-width: 350px; - --bs-toast-font-size: 0.875rem; - --bs-toast-color: ; - --bs-toast-bg: rgba(var(--bs-body-bg-rgb), 0.85); - --bs-toast-border-width: var(--bs-border-width); - --bs-toast-border-color: var(--bs-border-color-translucent); - --bs-toast-border-radius: var(--bs-border-radius); - --bs-toast-box-shadow: var(--bs-box-shadow); - --bs-toast-header-color: var(--bs-secondary-color); - --bs-toast-header-bg: rgba(var(--bs-body-bg-rgb), 0.85); - --bs-toast-header-border-color: var(--bs-border-color-translucent); - width: var(--bs-toast-max-width); - max-width: 100%; - font-size: var(--bs-toast-font-size); - color: var(--bs-toast-color); - pointer-events: auto; - background-color: var(--bs-toast-bg); - background-clip: padding-box; - border: var(--bs-toast-border-width) solid var(--bs-toast-border-color); - box-shadow: var(--bs-toast-box-shadow); - border-radius: var(--bs-toast-border-radius); -} -.toast.showing { - opacity: 0; -} -.toast:not(.show) { - display: none; -} - -.toast-container { - --bs-toast-zindex: 1090; - position: absolute; - z-index: var(--bs-toast-zindex); - width: max-content; - max-width: 100%; - pointer-events: none; -} -.toast-container > :not(:last-child) { - margin-bottom: var(--bs-toast-spacing); -} - -.toast-header { - display: flex; - align-items: center; - padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x); - color: var(--bs-toast-header-color); - background-color: var(--bs-toast-header-bg); - background-clip: padding-box; - border-bottom: var(--bs-toast-border-width) solid var(--bs-toast-header-border-color); - border-top-left-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width)); - border-top-right-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width)); -} -.toast-header .btn-close { - margin-right: calc(-0.5 * var(--bs-toast-padding-x)); - margin-left: var(--bs-toast-padding-x); -} - -.toast-body { - padding: var(--bs-toast-padding-x); - word-wrap: break-word; -} - -.modal { - --bs-modal-zindex: 1055; - --bs-modal-width: 500px; - --bs-modal-padding: 1rem; - --bs-modal-margin: 0.5rem; - --bs-modal-color: var(--bs-body-color); - --bs-modal-bg: var(--bs-body-bg); - --bs-modal-border-color: var(--bs-border-color-translucent); - --bs-modal-border-width: var(--bs-border-width); - --bs-modal-border-radius: var(--bs-border-radius-lg); - --bs-modal-box-shadow: var(--bs-box-shadow-sm); - --bs-modal-inner-border-radius: calc(var(--bs-border-radius-lg) - (var(--bs-border-width))); - --bs-modal-header-padding-x: 1rem; - --bs-modal-header-padding-y: 1rem; - --bs-modal-header-padding: 1rem 1rem; - --bs-modal-header-border-color: var(--bs-border-color); - --bs-modal-header-border-width: var(--bs-border-width); - --bs-modal-title-line-height: 1.5; - --bs-modal-footer-gap: 0.5rem; - --bs-modal-footer-bg: ; - --bs-modal-footer-border-color: var(--bs-border-color); - --bs-modal-footer-border-width: var(--bs-border-width); - position: fixed; - top: 0; - left: 0; - z-index: var(--bs-modal-zindex); - display: none; - width: 100%; - height: 100%; - overflow-x: hidden; - overflow-y: auto; - outline: 0; -} - -.modal-dialog { - position: relative; - width: auto; - margin: var(--bs-modal-margin); - pointer-events: none; -} -.modal.fade .modal-dialog { - transform: translate(0, -50px); - transition: transform 0.3s ease-out; -} -@media (prefers-reduced-motion: reduce) { - .modal.fade .modal-dialog { - transition: none; - } -} -.modal.show .modal-dialog { - transform: none; -} -.modal.modal-static .modal-dialog { - transform: scale(1.02); -} - -.modal-dialog-scrollable { - height: calc(100% - var(--bs-modal-margin) * 2); -} -.modal-dialog-scrollable .modal-content { - max-height: 100%; - overflow: hidden; -} -.modal-dialog-scrollable .modal-body { - overflow-y: auto; -} - -.modal-dialog-centered { - display: flex; - align-items: center; - min-height: calc(100% - var(--bs-modal-margin) * 2); -} - -.modal-content { - position: relative; - display: flex; - flex-direction: column; - width: 100%; - color: var(--bs-modal-color); - pointer-events: auto; - background-color: var(--bs-modal-bg); - background-clip: padding-box; - border: var(--bs-modal-border-width) solid var(--bs-modal-border-color); - border-radius: var(--bs-modal-border-radius); - outline: 0; -} - -.modal-backdrop { - --bs-backdrop-zindex: 1050; - --bs-backdrop-bg: #000; - --bs-backdrop-opacity: 0.5; - position: fixed; - top: 0; - left: 0; - z-index: var(--bs-backdrop-zindex); - width: 100vw; - height: 100vh; - background-color: var(--bs-backdrop-bg); -} -.modal-backdrop.fade { - opacity: 0; -} -.modal-backdrop.show { - opacity: var(--bs-backdrop-opacity); -} - -.modal-header { - display: flex; - flex-shrink: 0; - align-items: center; - padding: var(--bs-modal-header-padding); - border-bottom: var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color); - border-top-left-radius: var(--bs-modal-inner-border-radius); - border-top-right-radius: var(--bs-modal-inner-border-radius); -} -.modal-header .btn-close { - padding: calc(var(--bs-modal-header-padding-y) * 0.5) calc(var(--bs-modal-header-padding-x) * 0.5); - margin-top: calc(-0.5 * var(--bs-modal-header-padding-y)); - margin-right: calc(-0.5 * var(--bs-modal-header-padding-x)); - margin-bottom: calc(-0.5 * var(--bs-modal-header-padding-y)); - margin-left: auto; -} - -.modal-title { - margin-bottom: 0; - line-height: var(--bs-modal-title-line-height); -} - -.modal-body { - position: relative; - flex: 1 1 auto; - padding: var(--bs-modal-padding); -} - -.modal-footer { - display: flex; - flex-shrink: 0; - flex-wrap: wrap; - align-items: center; - justify-content: flex-end; - padding: calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * 0.5); - background-color: var(--bs-modal-footer-bg); - border-top: var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color); - border-bottom-right-radius: var(--bs-modal-inner-border-radius); - border-bottom-left-radius: var(--bs-modal-inner-border-radius); -} -.modal-footer > * { - margin: calc(var(--bs-modal-footer-gap) * 0.5); -} - -@media (min-width: 576px) { - .modal { - --bs-modal-margin: 1.75rem; - --bs-modal-box-shadow: var(--bs-box-shadow); - } - .modal-dialog { - max-width: var(--bs-modal-width); - margin-right: auto; - margin-left: auto; - } - .modal-sm { - --bs-modal-width: 300px; - } -} -@media (min-width: 992px) { - .modal-lg, - .modal-xl { - --bs-modal-width: 800px; - } -} -@media (min-width: 1200px) { - .modal-xl { - --bs-modal-width: 1140px; - } -} -.modal-fullscreen { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; -} -.modal-fullscreen .modal-content { - height: 100%; - border: 0; - border-radius: 0; -} -.modal-fullscreen .modal-header, -.modal-fullscreen .modal-footer { - border-radius: 0; -} -.modal-fullscreen .modal-body { - overflow-y: auto; -} - -@media (max-width: 575.98px) { - .modal-fullscreen-sm-down { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; - } - .modal-fullscreen-sm-down .modal-content { - height: 100%; - border: 0; - border-radius: 0; - } - .modal-fullscreen-sm-down .modal-header, - .modal-fullscreen-sm-down .modal-footer { - border-radius: 0; - } - .modal-fullscreen-sm-down .modal-body { - overflow-y: auto; - } -} -@media (max-width: 767.98px) { - .modal-fullscreen-md-down { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; - } - .modal-fullscreen-md-down .modal-content { - height: 100%; - border: 0; - border-radius: 0; - } - .modal-fullscreen-md-down .modal-header, - .modal-fullscreen-md-down .modal-footer { - border-radius: 0; - } - .modal-fullscreen-md-down .modal-body { - overflow-y: auto; - } -} -@media (max-width: 991.98px) { - .modal-fullscreen-lg-down { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; - } - .modal-fullscreen-lg-down .modal-content { - height: 100%; - border: 0; - border-radius: 0; - } - .modal-fullscreen-lg-down .modal-header, - .modal-fullscreen-lg-down .modal-footer { - border-radius: 0; - } - .modal-fullscreen-lg-down .modal-body { - overflow-y: auto; - } -} -@media (max-width: 1199.98px) { - .modal-fullscreen-xl-down { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; - } - .modal-fullscreen-xl-down .modal-content { - height: 100%; - border: 0; - border-radius: 0; - } - .modal-fullscreen-xl-down .modal-header, - .modal-fullscreen-xl-down .modal-footer { - border-radius: 0; - } - .modal-fullscreen-xl-down .modal-body { - overflow-y: auto; - } -} -@media (max-width: 1399.98px) { - .modal-fullscreen-xxl-down { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; - } - .modal-fullscreen-xxl-down .modal-content { - height: 100%; - border: 0; - border-radius: 0; - } - .modal-fullscreen-xxl-down .modal-header, - .modal-fullscreen-xxl-down .modal-footer { - border-radius: 0; - } - .modal-fullscreen-xxl-down .modal-body { - overflow-y: auto; - } -} -.tooltip { - --bs-tooltip-zindex: 1080; - --bs-tooltip-max-width: 200px; - --bs-tooltip-padding-x: 0.5rem; - --bs-tooltip-padding-y: 0.25rem; - --bs-tooltip-margin: ; - --bs-tooltip-font-size: 0.875rem; - --bs-tooltip-color: var(--bs-body-bg); - --bs-tooltip-bg: var(--bs-emphasis-color); - --bs-tooltip-border-radius: var(--bs-border-radius); - --bs-tooltip-opacity: 0.9; - --bs-tooltip-arrow-width: 0.8rem; - --bs-tooltip-arrow-height: 0.4rem; - z-index: var(--bs-tooltip-zindex); - display: block; - margin: var(--bs-tooltip-margin); - font-family: var(--bs-font-sans-serif); - font-style: normal; - font-weight: 400; - line-height: 1.5; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - white-space: normal; - word-spacing: normal; - line-break: auto; - font-size: var(--bs-tooltip-font-size); - word-wrap: break-word; - opacity: 0; -} -.tooltip.show { - opacity: var(--bs-tooltip-opacity); -} -.tooltip .tooltip-arrow { - display: block; - width: var(--bs-tooltip-arrow-width); - height: var(--bs-tooltip-arrow-height); -} -.tooltip .tooltip-arrow::before { - position: absolute; - content: ""; - border-color: transparent; - border-style: solid; -} - -.bs-tooltip-top .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow { - bottom: calc(-1 * var(--bs-tooltip-arrow-height)); -} -.bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before { - top: -1px; - border-width: var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0; - border-top-color: var(--bs-tooltip-bg); -} - -/* rtl:begin:ignore */ -.bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow { - left: calc(-1 * var(--bs-tooltip-arrow-height)); - width: var(--bs-tooltip-arrow-height); - height: var(--bs-tooltip-arrow-width); -} -.bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before { - right: -1px; - border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0; - border-right-color: var(--bs-tooltip-bg); -} - -/* rtl:end:ignore */ -.bs-tooltip-bottom .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow { - top: calc(-1 * var(--bs-tooltip-arrow-height)); -} -.bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before { - bottom: -1px; - border-width: 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height); - border-bottom-color: var(--bs-tooltip-bg); -} - -/* rtl:begin:ignore */ -.bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow { - right: calc(-1 * var(--bs-tooltip-arrow-height)); - width: var(--bs-tooltip-arrow-height); - height: var(--bs-tooltip-arrow-width); -} -.bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before { - left: -1px; - border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height); - border-left-color: var(--bs-tooltip-bg); -} - -/* rtl:end:ignore */ -.tooltip-inner { - max-width: var(--bs-tooltip-max-width); - padding: var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x); - color: var(--bs-tooltip-color); - text-align: center; - background-color: var(--bs-tooltip-bg); - border-radius: var(--bs-tooltip-border-radius); -} - -.popover { - --bs-popover-zindex: 1070; - --bs-popover-max-width: 276px; - --bs-popover-font-size: 0.875rem; - --bs-popover-bg: var(--bs-body-bg); - --bs-popover-border-width: var(--bs-border-width); - --bs-popover-border-color: var(--bs-border-color-translucent); - --bs-popover-border-radius: var(--bs-border-radius-lg); - --bs-popover-inner-border-radius: calc(var(--bs-border-radius-lg) - var(--bs-border-width)); - --bs-popover-box-shadow: var(--bs-box-shadow); - --bs-popover-header-padding-x: 1rem; - --bs-popover-header-padding-y: 0.5rem; - --bs-popover-header-font-size: 1rem; - --bs-popover-header-color: inherit; - --bs-popover-header-bg: var(--bs-secondary-bg); - --bs-popover-body-padding-x: 1rem; - --bs-popover-body-padding-y: 1rem; - --bs-popover-body-color: var(--bs-body-color); - --bs-popover-arrow-width: 1rem; - --bs-popover-arrow-height: 0.5rem; - --bs-popover-arrow-border: var(--bs-popover-border-color); - z-index: var(--bs-popover-zindex); - display: block; - max-width: var(--bs-popover-max-width); - font-family: var(--bs-font-sans-serif); - font-style: normal; - font-weight: 400; - line-height: 1.5; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - white-space: normal; - word-spacing: normal; - line-break: auto; - font-size: var(--bs-popover-font-size); - word-wrap: break-word; - background-color: var(--bs-popover-bg); - background-clip: padding-box; - border: var(--bs-popover-border-width) solid var(--bs-popover-border-color); - border-radius: var(--bs-popover-border-radius); -} -.popover .popover-arrow { - display: block; - width: var(--bs-popover-arrow-width); - height: var(--bs-popover-arrow-height); -} -.popover .popover-arrow::before, .popover .popover-arrow::after { - position: absolute; - display: block; - content: ""; - border-color: transparent; - border-style: solid; - border-width: 0; -} - -.bs-popover-top > .popover-arrow, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow { - bottom: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); -} -.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before, .bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after { - border-width: var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0; -} -.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before { - bottom: 0; - border-top-color: var(--bs-popover-arrow-border); -} -.bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after { - bottom: var(--bs-popover-border-width); - border-top-color: var(--bs-popover-bg); -} - -/* rtl:begin:ignore */ -.bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow { - left: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); - width: var(--bs-popover-arrow-height); - height: var(--bs-popover-arrow-width); -} -.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before, .bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after { - border-width: calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0; -} -.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before { - left: 0; - border-right-color: var(--bs-popover-arrow-border); -} -.bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after { - left: var(--bs-popover-border-width); - border-right-color: var(--bs-popover-bg); -} - -/* rtl:end:ignore */ -.bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow { - top: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); -} -.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before, .bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after { - border-width: 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height); -} -.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before { - top: 0; - border-bottom-color: var(--bs-popover-arrow-border); -} -.bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after { - top: var(--bs-popover-border-width); - border-bottom-color: var(--bs-popover-bg); -} -.bs-popover-bottom .popover-header::before, .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before { - position: absolute; - top: 0; - left: 50%; - display: block; - width: var(--bs-popover-arrow-width); - margin-left: calc(-0.5 * var(--bs-popover-arrow-width)); - content: ""; - border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-header-bg); -} - -/* rtl:begin:ignore */ -.bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow { - right: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); - width: var(--bs-popover-arrow-height); - height: var(--bs-popover-arrow-width); -} -.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before, .bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after { - border-width: calc(var(--bs-popover-arrow-width) * 0.5) 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height); -} -.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before { - right: 0; - border-left-color: var(--bs-popover-arrow-border); -} -.bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after { - right: var(--bs-popover-border-width); - border-left-color: var(--bs-popover-bg); -} - -/* rtl:end:ignore */ -.popover-header { - padding: var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x); - margin-bottom: 0; - font-size: var(--bs-popover-header-font-size); - color: var(--bs-popover-header-color); - background-color: var(--bs-popover-header-bg); - border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-border-color); - border-top-left-radius: var(--bs-popover-inner-border-radius); - border-top-right-radius: var(--bs-popover-inner-border-radius); -} -.popover-header:empty { - display: none; -} - -.popover-body { - padding: var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x); - color: var(--bs-popover-body-color); -} - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} -.carousel-inner::after { - display: block; - clear: both; - content: ""; -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - transition: transform 0.6s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .carousel-item { - transition: none; - } -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); -} - -.carousel-fade .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; -} -.carousel-fade .carousel-item.active, -.carousel-fade .carousel-item-next.carousel-item-start, -.carousel-fade .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; -} -.carousel-fade .active.carousel-item-start, -.carousel-fade .active.carousel-item-end { - z-index: 0; - opacity: 0; - transition: opacity 0s 0.6s; -} -@media (prefers-reduced-motion: reduce) { - .carousel-fade .active.carousel-item-start, - .carousel-fade .active.carousel-item-end { - transition: none; - } -} - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - display: flex; - align-items: center; - justify-content: center; - width: 15%; - padding: 0; - color: #fff; - text-align: center; - background: none; - filter: var(--bs-carousel-control-icon-filter); - border: 0; - opacity: 0.5; - transition: opacity 0.15s ease; -} -@media (prefers-reduced-motion: reduce) { - .carousel-control-prev, - .carousel-control-next { - transition: none; - } -} -.carousel-control-prev:hover, .carousel-control-prev:focus, -.carousel-control-next:hover, -.carousel-control-next:focus { - color: #fff; - text-decoration: none; - outline: 0; - opacity: 0.9; -} - -.carousel-control-prev { - left: 0; -} - -.carousel-control-next { - right: 0; -} - -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: 2rem; - height: 2rem; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; -} - -.carousel-control-prev-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0'/%3e%3c/svg%3e") /*rtl:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e")*/; -} - -.carousel-control-next-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e") /*rtl:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0'/%3e%3c/svg%3e")*/; -} - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - margin-right: 15%; - margin-bottom: 1rem; - margin-left: 15%; -} -.carousel-indicators [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: 30px; - height: 3px; - padding: 0; - margin-right: 3px; - margin-left: 3px; - text-indent: -999px; - cursor: pointer; - background-color: var(--bs-carousel-indicator-active-bg); - background-clip: padding-box; - border: 0; - border-top: 10px solid transparent; - border-bottom: 10px solid transparent; - opacity: 0.5; - transition: opacity 0.6s ease; -} -@media (prefers-reduced-motion: reduce) { - .carousel-indicators [data-bs-target] { - transition: none; - } -} -.carousel-indicators .active { - opacity: 1; -} - -.carousel-caption { - position: absolute; - right: 15%; - bottom: 1.25rem; - left: 15%; - padding-top: 1.25rem; - padding-bottom: 1.25rem; - color: var(--bs-carousel-caption-color); - text-align: center; -} - -.carousel-dark { - --bs-carousel-indicator-active-bg: #000; - --bs-carousel-caption-color: #000; - --bs-carousel-control-icon-filter: invert(1) grayscale(100); -} - -:root, -[data-bs-theme=light] { - --bs-carousel-indicator-active-bg: #fff; - --bs-carousel-caption-color: #fff; - --bs-carousel-control-icon-filter: ; -} - -[data-bs-theme=dark] { - --bs-carousel-indicator-active-bg: #000; - --bs-carousel-caption-color: #000; - --bs-carousel-control-icon-filter: invert(1) grayscale(100); -} - -.spinner-grow, -.spinner-border { - display: inline-block; - flex-shrink: 0; - width: var(--bs-spinner-width); - height: var(--bs-spinner-height); - vertical-align: var(--bs-spinner-vertical-align); - border-radius: 50%; - animation: var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name); -} - -@keyframes spinner-border { - to { - transform: rotate(360deg) /* rtl:ignore */; - } -} -.spinner-border { - --bs-spinner-width: 2rem; - --bs-spinner-height: 2rem; - --bs-spinner-vertical-align: -0.125em; - --bs-spinner-border-width: 0.25em; - --bs-spinner-animation-speed: 0.75s; - --bs-spinner-animation-name: spinner-border; - border: var(--bs-spinner-border-width) solid currentcolor; - border-right-color: transparent; -} - -.spinner-border-sm { - --bs-spinner-width: 1rem; - --bs-spinner-height: 1rem; - --bs-spinner-border-width: 0.2em; -} - -@keyframes spinner-grow { - 0% { - transform: scale(0); - } - 50% { - opacity: 1; - transform: none; - } -} -.spinner-grow { - --bs-spinner-width: 2rem; - --bs-spinner-height: 2rem; - --bs-spinner-vertical-align: -0.125em; - --bs-spinner-animation-speed: 0.75s; - --bs-spinner-animation-name: spinner-grow; - background-color: currentcolor; - opacity: 0; -} - -.spinner-grow-sm { - --bs-spinner-width: 1rem; - --bs-spinner-height: 1rem; -} - -@media (prefers-reduced-motion: reduce) { - .spinner-border, - .spinner-grow { - --bs-spinner-animation-speed: 1.5s; - } -} -.offcanvas, .offcanvas-xxl, .offcanvas-xl, .offcanvas-lg, .offcanvas-md, .offcanvas-sm { - --bs-offcanvas-zindex: 1045; - --bs-offcanvas-width: 400px; - --bs-offcanvas-height: 30vh; - --bs-offcanvas-padding-x: 1rem; - --bs-offcanvas-padding-y: 1rem; - --bs-offcanvas-color: var(--bs-body-color); - --bs-offcanvas-bg: var(--bs-body-bg); - --bs-offcanvas-border-width: var(--bs-border-width); - --bs-offcanvas-border-color: var(--bs-border-color-translucent); - --bs-offcanvas-box-shadow: var(--bs-box-shadow-sm); - --bs-offcanvas-transition: transform 0.3s ease-in-out; - --bs-offcanvas-title-line-height: 1.5; -} - -@media (max-width: 575.98px) { - .offcanvas-sm { - position: fixed; - bottom: 0; - z-index: var(--bs-offcanvas-zindex); - display: flex; - flex-direction: column; - max-width: 100%; - color: var(--bs-offcanvas-color); - visibility: hidden; - background-color: var(--bs-offcanvas-bg); - background-clip: padding-box; - outline: 0; - transition: var(--bs-offcanvas-transition); - } -} -@media (max-width: 575.98px) and (prefers-reduced-motion: reduce) { - .offcanvas-sm { - transition: none; - } -} -@media (max-width: 575.98px) { - .offcanvas-sm.offcanvas-start { - top: 0; - left: 0; - width: var(--bs-offcanvas-width); - border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(-100%); - } - .offcanvas-sm.offcanvas-end { - top: 0; - right: 0; - width: var(--bs-offcanvas-width); - border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(100%); - } - .offcanvas-sm.offcanvas-top { - top: 0; - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(-100%); - } - .offcanvas-sm.offcanvas-bottom { - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(100%); - } - .offcanvas-sm.showing, .offcanvas-sm.show:not(.hiding) { - transform: none; - } - .offcanvas-sm.showing, .offcanvas-sm.hiding, .offcanvas-sm.show { - visibility: visible; - } -} -@media (min-width: 576px) { - .offcanvas-sm { - --bs-offcanvas-height: auto; - --bs-offcanvas-border-width: 0; - background-color: transparent !important; - } - .offcanvas-sm .offcanvas-header { - display: none; - } - .offcanvas-sm .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; - background-color: transparent !important; - } -} - -@media (max-width: 767.98px) { - .offcanvas-md { - position: fixed; - bottom: 0; - z-index: var(--bs-offcanvas-zindex); - display: flex; - flex-direction: column; - max-width: 100%; - color: var(--bs-offcanvas-color); - visibility: hidden; - background-color: var(--bs-offcanvas-bg); - background-clip: padding-box; - outline: 0; - transition: var(--bs-offcanvas-transition); - } -} -@media (max-width: 767.98px) and (prefers-reduced-motion: reduce) { - .offcanvas-md { - transition: none; - } -} -@media (max-width: 767.98px) { - .offcanvas-md.offcanvas-start { - top: 0; - left: 0; - width: var(--bs-offcanvas-width); - border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(-100%); - } - .offcanvas-md.offcanvas-end { - top: 0; - right: 0; - width: var(--bs-offcanvas-width); - border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(100%); - } - .offcanvas-md.offcanvas-top { - top: 0; - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(-100%); - } - .offcanvas-md.offcanvas-bottom { - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(100%); - } - .offcanvas-md.showing, .offcanvas-md.show:not(.hiding) { - transform: none; - } - .offcanvas-md.showing, .offcanvas-md.hiding, .offcanvas-md.show { - visibility: visible; - } -} -@media (min-width: 768px) { - .offcanvas-md { - --bs-offcanvas-height: auto; - --bs-offcanvas-border-width: 0; - background-color: transparent !important; - } - .offcanvas-md .offcanvas-header { - display: none; - } - .offcanvas-md .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; - background-color: transparent !important; - } -} - -@media (max-width: 991.98px) { - .offcanvas-lg { - position: fixed; - bottom: 0; - z-index: var(--bs-offcanvas-zindex); - display: flex; - flex-direction: column; - max-width: 100%; - color: var(--bs-offcanvas-color); - visibility: hidden; - background-color: var(--bs-offcanvas-bg); - background-clip: padding-box; - outline: 0; - transition: var(--bs-offcanvas-transition); - } -} -@media (max-width: 991.98px) and (prefers-reduced-motion: reduce) { - .offcanvas-lg { - transition: none; - } -} -@media (max-width: 991.98px) { - .offcanvas-lg.offcanvas-start { - top: 0; - left: 0; - width: var(--bs-offcanvas-width); - border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(-100%); - } - .offcanvas-lg.offcanvas-end { - top: 0; - right: 0; - width: var(--bs-offcanvas-width); - border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(100%); - } - .offcanvas-lg.offcanvas-top { - top: 0; - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(-100%); - } - .offcanvas-lg.offcanvas-bottom { - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(100%); - } - .offcanvas-lg.showing, .offcanvas-lg.show:not(.hiding) { - transform: none; - } - .offcanvas-lg.showing, .offcanvas-lg.hiding, .offcanvas-lg.show { - visibility: visible; - } -} -@media (min-width: 992px) { - .offcanvas-lg { - --bs-offcanvas-height: auto; - --bs-offcanvas-border-width: 0; - background-color: transparent !important; - } - .offcanvas-lg .offcanvas-header { - display: none; - } - .offcanvas-lg .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; - background-color: transparent !important; - } -} - -@media (max-width: 1199.98px) { - .offcanvas-xl { - position: fixed; - bottom: 0; - z-index: var(--bs-offcanvas-zindex); - display: flex; - flex-direction: column; - max-width: 100%; - color: var(--bs-offcanvas-color); - visibility: hidden; - background-color: var(--bs-offcanvas-bg); - background-clip: padding-box; - outline: 0; - transition: var(--bs-offcanvas-transition); - } -} -@media (max-width: 1199.98px) and (prefers-reduced-motion: reduce) { - .offcanvas-xl { - transition: none; - } -} -@media (max-width: 1199.98px) { - .offcanvas-xl.offcanvas-start { - top: 0; - left: 0; - width: var(--bs-offcanvas-width); - border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(-100%); - } - .offcanvas-xl.offcanvas-end { - top: 0; - right: 0; - width: var(--bs-offcanvas-width); - border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(100%); - } - .offcanvas-xl.offcanvas-top { - top: 0; - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(-100%); - } - .offcanvas-xl.offcanvas-bottom { - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(100%); - } - .offcanvas-xl.showing, .offcanvas-xl.show:not(.hiding) { - transform: none; - } - .offcanvas-xl.showing, .offcanvas-xl.hiding, .offcanvas-xl.show { - visibility: visible; - } -} -@media (min-width: 1200px) { - .offcanvas-xl { - --bs-offcanvas-height: auto; - --bs-offcanvas-border-width: 0; - background-color: transparent !important; - } - .offcanvas-xl .offcanvas-header { - display: none; - } - .offcanvas-xl .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; - background-color: transparent !important; - } -} - -@media (max-width: 1399.98px) { - .offcanvas-xxl { - position: fixed; - bottom: 0; - z-index: var(--bs-offcanvas-zindex); - display: flex; - flex-direction: column; - max-width: 100%; - color: var(--bs-offcanvas-color); - visibility: hidden; - background-color: var(--bs-offcanvas-bg); - background-clip: padding-box; - outline: 0; - transition: var(--bs-offcanvas-transition); - } -} -@media (max-width: 1399.98px) and (prefers-reduced-motion: reduce) { - .offcanvas-xxl { - transition: none; - } -} -@media (max-width: 1399.98px) { - .offcanvas-xxl.offcanvas-start { - top: 0; - left: 0; - width: var(--bs-offcanvas-width); - border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(-100%); - } - .offcanvas-xxl.offcanvas-end { - top: 0; - right: 0; - width: var(--bs-offcanvas-width); - border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(100%); - } - .offcanvas-xxl.offcanvas-top { - top: 0; - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(-100%); - } - .offcanvas-xxl.offcanvas-bottom { - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(100%); - } - .offcanvas-xxl.showing, .offcanvas-xxl.show:not(.hiding) { - transform: none; - } - .offcanvas-xxl.showing, .offcanvas-xxl.hiding, .offcanvas-xxl.show { - visibility: visible; - } -} -@media (min-width: 1400px) { - .offcanvas-xxl { - --bs-offcanvas-height: auto; - --bs-offcanvas-border-width: 0; - background-color: transparent !important; - } - .offcanvas-xxl .offcanvas-header { - display: none; - } - .offcanvas-xxl .offcanvas-body { - display: flex; - flex-grow: 0; - padding: 0; - overflow-y: visible; - background-color: transparent !important; - } -} - -.offcanvas { - position: fixed; - bottom: 0; - z-index: var(--bs-offcanvas-zindex); - display: flex; - flex-direction: column; - max-width: 100%; - color: var(--bs-offcanvas-color); - visibility: hidden; - background-color: var(--bs-offcanvas-bg); - background-clip: padding-box; - outline: 0; - transition: var(--bs-offcanvas-transition); -} -@media (prefers-reduced-motion: reduce) { - .offcanvas { - transition: none; - } -} -.offcanvas.offcanvas-start { - top: 0; - left: 0; - width: var(--bs-offcanvas-width); - border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(-100%); -} -.offcanvas.offcanvas-end { - top: 0; - right: 0; - width: var(--bs-offcanvas-width); - border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateX(100%); -} -.offcanvas.offcanvas-top { - top: 0; - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(-100%); -} -.offcanvas.offcanvas-bottom { - right: 0; - left: 0; - height: var(--bs-offcanvas-height); - max-height: 100%; - border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); - transform: translateY(100%); -} -.offcanvas.showing, .offcanvas.show:not(.hiding) { - transform: none; -} -.offcanvas.showing, .offcanvas.hiding, .offcanvas.show { - visibility: visible; -} - -.offcanvas-backdrop { - position: fixed; - top: 0; - left: 0; - z-index: 1040; - width: 100vw; - height: 100vh; - background-color: #000; -} -.offcanvas-backdrop.fade { - opacity: 0; -} -.offcanvas-backdrop.show { - opacity: 0.5; -} - -.offcanvas-header { - display: flex; - align-items: center; - padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x); -} -.offcanvas-header .btn-close { - padding: calc(var(--bs-offcanvas-padding-y) * 0.5) calc(var(--bs-offcanvas-padding-x) * 0.5); - margin-top: calc(-0.5 * var(--bs-offcanvas-padding-y)); - margin-right: calc(-0.5 * var(--bs-offcanvas-padding-x)); - margin-bottom: calc(-0.5 * var(--bs-offcanvas-padding-y)); - margin-left: auto; -} - -.offcanvas-title { - margin-bottom: 0; - line-height: var(--bs-offcanvas-title-line-height); -} - -.offcanvas-body { - flex-grow: 1; - padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x); - overflow-y: auto; -} - -.placeholder { - display: inline-block; - min-height: 1em; - vertical-align: middle; - cursor: wait; - background-color: currentcolor; - opacity: 0.5; -} -.placeholder.btn::before { - display: inline-block; - content: ""; -} - -.placeholder-xs { - min-height: 0.6em; -} - -.placeholder-sm { - min-height: 0.8em; -} - -.placeholder-lg { - min-height: 1.2em; -} - -.placeholder-glow .placeholder { - animation: placeholder-glow 2s ease-in-out infinite; -} - -@keyframes placeholder-glow { - 50% { - opacity: 0.2; - } -} -.placeholder-wave { - mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%); - mask-size: 200% 100%; - animation: placeholder-wave 2s linear infinite; -} - -@keyframes placeholder-wave { - 100% { - mask-position: -200% 0%; - } -} -.clearfix::after { - display: block; - clear: both; - content: ""; -} - -.text-bg-primary { - color: #fff !important; - background-color: RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important; -} - -.text-bg-secondary { - color: #fff !important; - background-color: RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important; -} - -.text-bg-success { - color: #fff !important; - background-color: RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important; -} - -.text-bg-info { - color: #000 !important; - background-color: RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important; -} - -.text-bg-warning { - color: #000 !important; - background-color: RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important; -} - -.text-bg-danger { - color: #fff !important; - background-color: RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important; -} - -.text-bg-light { - color: #000 !important; - background-color: RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important; -} - -.text-bg-dark { - color: #fff !important; - background-color: RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important; -} - -.link-primary { - color: RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important; -} -.link-primary:hover, .link-primary:focus { - color: RGBA(10, 88, 202, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important; -} - -.link-secondary { - color: RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important; -} -.link-secondary:hover, .link-secondary:focus { - color: RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important; -} - -.link-success { - color: RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important; -} -.link-success:hover, .link-success:focus { - color: RGBA(20, 108, 67, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important; -} - -.link-info { - color: RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important; -} -.link-info:hover, .link-info:focus { - color: RGBA(61, 213, 243, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important; -} - -.link-warning { - color: RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important; -} -.link-warning:hover, .link-warning:focus { - color: RGBA(255, 205, 57, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important; -} - -.link-danger { - color: RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important; -} -.link-danger:hover, .link-danger:focus { - color: RGBA(176, 42, 55, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important; -} - -.link-light { - color: RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important; -} -.link-light:hover, .link-light:focus { - color: RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important; -} - -.link-dark { - color: RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important; -} -.link-dark:hover, .link-dark:focus { - color: RGBA(26, 30, 33, var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important; -} - -.link-body-emphasis { - color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important; - text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important; -} -.link-body-emphasis:hover, .link-body-emphasis:focus { - color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important; - text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important; -} - -.focus-ring:focus { - outline: 0; - box-shadow: var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color); -} - -.icon-link { - display: inline-flex; - gap: 0.375rem; - align-items: center; - text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5)); - text-underline-offset: 0.25em; - backface-visibility: hidden; -} -.icon-link > .bi { - flex-shrink: 0; - width: 1em; - height: 1em; - fill: currentcolor; - transition: 0.2s ease-in-out transform; -} -@media (prefers-reduced-motion: reduce) { - .icon-link > .bi { - transition: none; - } -} - -.icon-link-hover:hover > .bi, .icon-link-hover:focus-visible > .bi { - transform: var(--bs-icon-link-transform, translate3d(0.25em, 0, 0)); -} - -.ratio { - position: relative; - width: 100%; -} -.ratio::before { - display: block; - padding-top: var(--bs-aspect-ratio); - content: ""; -} -.ratio > * { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; -} - -.ratio-1x1 { - --bs-aspect-ratio: 100%; -} - -.ratio-4x3 { - --bs-aspect-ratio: 75%; -} - -.ratio-16x9 { - --bs-aspect-ratio: 56.25%; -} - -.ratio-21x9 { - --bs-aspect-ratio: 42.8571428571%; -} - -.fixed-top { - position: fixed; - top: 0; - right: 0; - left: 0; - z-index: 1030; -} - -.fixed-bottom { - position: fixed; - right: 0; - bottom: 0; - left: 0; - z-index: 1030; -} - -.sticky-top { - position: sticky; - top: 0; - z-index: 1020; -} - -.sticky-bottom { - position: sticky; - bottom: 0; - z-index: 1020; -} - -@media (min-width: 576px) { - .sticky-sm-top { - position: sticky; - top: 0; - z-index: 1020; - } - .sticky-sm-bottom { - position: sticky; - bottom: 0; - z-index: 1020; - } -} -@media (min-width: 768px) { - .sticky-md-top { - position: sticky; - top: 0; - z-index: 1020; - } - .sticky-md-bottom { - position: sticky; - bottom: 0; - z-index: 1020; - } -} -@media (min-width: 992px) { - .sticky-lg-top { - position: sticky; - top: 0; - z-index: 1020; - } - .sticky-lg-bottom { - position: sticky; - bottom: 0; - z-index: 1020; - } -} -@media (min-width: 1200px) { - .sticky-xl-top { - position: sticky; - top: 0; - z-index: 1020; - } - .sticky-xl-bottom { - position: sticky; - bottom: 0; - z-index: 1020; - } -} -@media (min-width: 1400px) { - .sticky-xxl-top { - position: sticky; - top: 0; - z-index: 1020; - } - .sticky-xxl-bottom { - position: sticky; - bottom: 0; - z-index: 1020; - } -} -.hstack { - display: flex; - flex-direction: row; - align-items: center; - align-self: stretch; -} - -.vstack { - display: flex; - flex: 1 1 auto; - flex-direction: column; - align-self: stretch; -} - -.visually-hidden, -.visually-hidden-focusable:not(:focus):not(:focus-within) { - width: 1px !important; - height: 1px !important; - padding: 0 !important; - margin: -1px !important; - overflow: hidden !important; - clip: rect(0, 0, 0, 0) !important; - white-space: nowrap !important; - border: 0 !important; -} -.visually-hidden:not(caption), -.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption) { - position: absolute !important; -} -.visually-hidden *, -.visually-hidden-focusable:not(:focus):not(:focus-within) * { - overflow: hidden !important; -} - -.stretched-link::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1; - content: ""; -} - -.text-truncate { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.vr { - display: inline-block; - align-self: stretch; - width: var(--bs-border-width); - min-height: 1em; - background-color: currentcolor; - opacity: 0.25; -} - -.align-baseline { - vertical-align: baseline !important; -} - -.align-top { - vertical-align: top !important; -} - -.align-middle { - vertical-align: middle !important; -} - -.align-bottom { - vertical-align: bottom !important; -} - -.align-text-bottom { - vertical-align: text-bottom !important; -} - -.align-text-top { - vertical-align: text-top !important; -} - -.float-start { - float: left !important; -} - -.float-end { - float: right !important; -} - -.float-none { - float: none !important; -} - -.object-fit-contain { - object-fit: contain !important; -} - -.object-fit-cover { - object-fit: cover !important; -} - -.object-fit-fill { - object-fit: fill !important; -} - -.object-fit-scale { - object-fit: scale-down !important; -} - -.object-fit-none { - object-fit: none !important; -} - -.opacity-0 { - opacity: 0 !important; -} - -.opacity-25 { - opacity: 0.25 !important; -} - -.opacity-50 { - opacity: 0.5 !important; -} - -.opacity-75 { - opacity: 0.75 !important; -} - -.opacity-100 { - opacity: 1 !important; -} - -.overflow-auto { - overflow: auto !important; -} - -.overflow-hidden { - overflow: hidden !important; -} - -.overflow-visible { - overflow: visible !important; -} - -.overflow-scroll { - overflow: scroll !important; -} - -.overflow-x-auto { - overflow-x: auto !important; -} - -.overflow-x-hidden { - overflow-x: hidden !important; -} - -.overflow-x-visible { - overflow-x: visible !important; -} - -.overflow-x-scroll { - overflow-x: scroll !important; -} - -.overflow-y-auto { - overflow-y: auto !important; -} - -.overflow-y-hidden { - overflow-y: hidden !important; -} - -.overflow-y-visible { - overflow-y: visible !important; -} - -.overflow-y-scroll { - overflow-y: scroll !important; -} - -.d-inline { - display: inline !important; -} - -.d-inline-block { - display: inline-block !important; -} - -.d-block { - display: block !important; -} - -.d-grid { - display: grid !important; -} - -.d-inline-grid { - display: inline-grid !important; -} - -.d-table { - display: table !important; -} - -.d-table-row { - display: table-row !important; -} - -.d-table-cell { - display: table-cell !important; -} - -.d-flex { - display: flex !important; -} - -.d-inline-flex { - display: inline-flex !important; -} - -.d-none { - display: none !important; -} - -.shadow { - box-shadow: var(--bs-box-shadow) !important; -} - -.shadow-sm { - box-shadow: var(--bs-box-shadow-sm) !important; -} - -.shadow-lg { - box-shadow: var(--bs-box-shadow-lg) !important; -} - -.shadow-none { - box-shadow: none !important; -} - -.focus-ring-primary { - --bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity)); -} - -.focus-ring-secondary { - --bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity)); -} - -.focus-ring-success { - --bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity)); -} - -.focus-ring-info { - --bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity)); -} - -.focus-ring-warning { - --bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity)); -} - -.focus-ring-danger { - --bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity)); -} - -.focus-ring-light { - --bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity)); -} - -.focus-ring-dark { - --bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity)); -} - -.position-static { - position: static !important; -} - -.position-relative { - position: relative !important; -} - -.position-absolute { - position: absolute !important; -} - -.position-fixed { - position: fixed !important; -} - -.position-sticky { - position: sticky !important; -} - -.top-0 { - top: 0 !important; -} - -.top-50 { - top: 50% !important; -} - -.top-100 { - top: 100% !important; -} - -.bottom-0 { - bottom: 0 !important; -} - -.bottom-50 { - bottom: 50% !important; -} - -.bottom-100 { - bottom: 100% !important; -} - -.start-0 { - left: 0 !important; -} - -.start-50 { - left: 50% !important; -} - -.start-100 { - left: 100% !important; -} - -.end-0 { - right: 0 !important; -} - -.end-50 { - right: 50% !important; -} - -.end-100 { - right: 100% !important; -} - -.translate-middle { - transform: translate(-50%, -50%) !important; -} - -.translate-middle-x { - transform: translateX(-50%) !important; -} - -.translate-middle-y { - transform: translateY(-50%) !important; -} - -.border { - border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; -} - -.border-0 { - border: 0 !important; -} - -.border-top { - border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; -} - -.border-top-0 { - border-top: 0 !important; -} - -.border-end { - border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; -} - -.border-end-0 { - border-right: 0 !important; -} - -.border-bottom { - border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; -} - -.border-bottom-0 { - border-bottom: 0 !important; -} - -.border-start { - border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; -} - -.border-start-0 { - border-left: 0 !important; -} - -.border-primary { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important; -} - -.border-secondary { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important; -} - -.border-success { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important; -} - -.border-info { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important; -} - -.border-warning { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important; -} - -.border-danger { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important; -} - -.border-light { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important; -} - -.border-dark { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important; -} - -.border-black { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important; -} - -.border-white { - --bs-border-opacity: 1; - border-color: rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important; -} - -.border-primary-subtle { - border-color: var(--bs-primary-border-subtle) !important; -} - -.border-secondary-subtle { - border-color: var(--bs-secondary-border-subtle) !important; -} - -.border-success-subtle { - border-color: var(--bs-success-border-subtle) !important; -} - -.border-info-subtle { - border-color: var(--bs-info-border-subtle) !important; -} - -.border-warning-subtle { - border-color: var(--bs-warning-border-subtle) !important; -} - -.border-danger-subtle { - border-color: var(--bs-danger-border-subtle) !important; -} - -.border-light-subtle { - border-color: var(--bs-light-border-subtle) !important; -} - -.border-dark-subtle { - border-color: var(--bs-dark-border-subtle) !important; -} - -.border-1 { - border-width: 1px !important; -} - -.border-2 { - border-width: 2px !important; -} - -.border-3 { - border-width: 3px !important; -} - -.border-4 { - border-width: 4px !important; -} - -.border-5 { - border-width: 5px !important; -} - -.border-opacity-10 { - --bs-border-opacity: 0.1; -} - -.border-opacity-25 { - --bs-border-opacity: 0.25; -} - -.border-opacity-50 { - --bs-border-opacity: 0.5; -} - -.border-opacity-75 { - --bs-border-opacity: 0.75; -} - -.border-opacity-100 { - --bs-border-opacity: 1; -} - -.w-25 { - width: 25% !important; -} - -.w-50 { - width: 50% !important; -} - -.w-75 { - width: 75% !important; -} - -.w-100 { - width: 100% !important; -} - -.w-auto { - width: auto !important; -} - -.mw-100 { - max-width: 100% !important; -} - -.vw-100 { - width: 100vw !important; -} - -.min-vw-100 { - min-width: 100vw !important; -} - -.h-25 { - height: 25% !important; -} - -.h-50 { - height: 50% !important; -} - -.h-75 { - height: 75% !important; -} - -.h-100 { - height: 100% !important; -} - -.h-auto { - height: auto !important; -} - -.mh-100 { - max-height: 100% !important; -} - -.vh-100 { - height: 100vh !important; -} - -.min-vh-100 { - min-height: 100vh !important; -} - -.flex-fill { - flex: 1 1 auto !important; -} - -.flex-row { - flex-direction: row !important; -} - -.flex-column { - flex-direction: column !important; -} - -.flex-row-reverse { - flex-direction: row-reverse !important; -} - -.flex-column-reverse { - flex-direction: column-reverse !important; -} - -.flex-grow-0 { - flex-grow: 0 !important; -} - -.flex-grow-1 { - flex-grow: 1 !important; -} - -.flex-shrink-0 { - flex-shrink: 0 !important; -} - -.flex-shrink-1 { - flex-shrink: 1 !important; -} - -.flex-wrap { - flex-wrap: wrap !important; -} - -.flex-nowrap { - flex-wrap: nowrap !important; -} - -.flex-wrap-reverse { - flex-wrap: wrap-reverse !important; -} - -.justify-content-start { - justify-content: flex-start !important; -} - -.justify-content-end { - justify-content: flex-end !important; -} - -.justify-content-center { - justify-content: center !important; -} - -.justify-content-between { - justify-content: space-between !important; -} - -.justify-content-around { - justify-content: space-around !important; -} - -.justify-content-evenly { - justify-content: space-evenly !important; -} - -.align-items-start { - align-items: flex-start !important; -} - -.align-items-end { - align-items: flex-end !important; -} - -.align-items-center { - align-items: center !important; -} - -.align-items-baseline { - align-items: baseline !important; -} - -.align-items-stretch { - align-items: stretch !important; -} - -.align-content-start { - align-content: flex-start !important; -} - -.align-content-end { - align-content: flex-end !important; -} - -.align-content-center { - align-content: center !important; -} - -.align-content-between { - align-content: space-between !important; -} - -.align-content-around { - align-content: space-around !important; -} - -.align-content-stretch { - align-content: stretch !important; -} - -.align-self-auto { - align-self: auto !important; -} - -.align-self-start { - align-self: flex-start !important; -} - -.align-self-end { - align-self: flex-end !important; -} - -.align-self-center { - align-self: center !important; -} - -.align-self-baseline { - align-self: baseline !important; -} - -.align-self-stretch { - align-self: stretch !important; -} - -.order-first { - order: -1 !important; -} - -.order-0 { - order: 0 !important; -} - -.order-1 { - order: 1 !important; -} - -.order-2 { - order: 2 !important; -} - -.order-3 { - order: 3 !important; -} - -.order-4 { - order: 4 !important; -} - -.order-5 { - order: 5 !important; -} - -.order-last { - order: 6 !important; -} - -.m-0 { - margin: 0 !important; -} - -.m-1 { - margin: 0.25rem !important; -} - -.m-2 { - margin: 0.5rem !important; -} - -.m-3 { - margin: 1rem !important; -} - -.m-4 { - margin: 1.5rem !important; -} - -.m-5 { - margin: 3rem !important; -} - -.m-auto { - margin: auto !important; -} - -.mx-0 { - margin-right: 0 !important; - margin-left: 0 !important; -} - -.mx-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; -} - -.mx-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; -} - -.mx-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; -} - -.mx-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; -} - -.mx-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; -} - -.mx-auto { - margin-right: auto !important; - margin-left: auto !important; -} - -.my-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; -} - -.my-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; -} - -.my-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; -} - -.my-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; -} - -.my-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; -} - -.my-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; -} - -.my-auto { - margin-top: auto !important; - margin-bottom: auto !important; -} - -.mt-0 { - margin-top: 0 !important; -} - -.mt-1 { - margin-top: 0.25rem !important; -} - -.mt-2 { - margin-top: 0.5rem !important; -} - -.mt-3 { - margin-top: 1rem !important; -} - -.mt-4 { - margin-top: 1.5rem !important; -} - -.mt-5 { - margin-top: 3rem !important; -} - -.mt-auto { - margin-top: auto !important; -} - -.me-0 { - margin-right: 0 !important; -} - -.me-1 { - margin-right: 0.25rem !important; -} - -.me-2 { - margin-right: 0.5rem !important; -} - -.me-3 { - margin-right: 1rem !important; -} - -.me-4 { - margin-right: 1.5rem !important; -} - -.me-5 { - margin-right: 3rem !important; -} - -.me-auto { - margin-right: auto !important; -} - -.mb-0 { - margin-bottom: 0 !important; -} - -.mb-1 { - margin-bottom: 0.25rem !important; -} - -.mb-2 { - margin-bottom: 0.5rem !important; -} - -.mb-3 { - margin-bottom: 1rem !important; -} - -.mb-4 { - margin-bottom: 1.5rem !important; -} - -.mb-5 { - margin-bottom: 3rem !important; -} - -.mb-auto { - margin-bottom: auto !important; -} - -.ms-0 { - margin-left: 0 !important; -} - -.ms-1 { - margin-left: 0.25rem !important; -} - -.ms-2 { - margin-left: 0.5rem !important; -} - -.ms-3 { - margin-left: 1rem !important; -} - -.ms-4 { - margin-left: 1.5rem !important; -} - -.ms-5 { - margin-left: 3rem !important; -} - -.ms-auto { - margin-left: auto !important; -} - -.p-0 { - padding: 0 !important; -} - -.p-1 { - padding: 0.25rem !important; -} - -.p-2 { - padding: 0.5rem !important; -} - -.p-3 { - padding: 1rem !important; -} - -.p-4 { - padding: 1.5rem !important; -} - -.p-5 { - padding: 3rem !important; -} - -.px-0 { - padding-right: 0 !important; - padding-left: 0 !important; -} - -.px-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; -} - -.px-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; -} - -.px-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; -} - -.px-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; -} - -.px-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; -} - -.py-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; -} - -.py-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; -} - -.py-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; -} - -.py-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; -} - -.py-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; -} - -.py-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; -} - -.pt-0 { - padding-top: 0 !important; -} - -.pt-1 { - padding-top: 0.25rem !important; -} - -.pt-2 { - padding-top: 0.5rem !important; -} - -.pt-3 { - padding-top: 1rem !important; -} - -.pt-4 { - padding-top: 1.5rem !important; -} - -.pt-5 { - padding-top: 3rem !important; -} - -.pe-0 { - padding-right: 0 !important; -} - -.pe-1 { - padding-right: 0.25rem !important; -} - -.pe-2 { - padding-right: 0.5rem !important; -} - -.pe-3 { - padding-right: 1rem !important; -} - -.pe-4 { - padding-right: 1.5rem !important; -} - -.pe-5 { - padding-right: 3rem !important; -} - -.pb-0 { - padding-bottom: 0 !important; -} - -.pb-1 { - padding-bottom: 0.25rem !important; -} - -.pb-2 { - padding-bottom: 0.5rem !important; -} - -.pb-3 { - padding-bottom: 1rem !important; -} - -.pb-4 { - padding-bottom: 1.5rem !important; -} - -.pb-5 { - padding-bottom: 3rem !important; -} - -.ps-0 { - padding-left: 0 !important; -} - -.ps-1 { - padding-left: 0.25rem !important; -} - -.ps-2 { - padding-left: 0.5rem !important; -} - -.ps-3 { - padding-left: 1rem !important; -} - -.ps-4 { - padding-left: 1.5rem !important; -} - -.ps-5 { - padding-left: 3rem !important; -} - -.gap-0 { - gap: 0 !important; -} - -.gap-1 { - gap: 0.25rem !important; -} - -.gap-2 { - gap: 0.5rem !important; -} - -.gap-3 { - gap: 1rem !important; -} - -.gap-4 { - gap: 1.5rem !important; -} - -.gap-5 { - gap: 3rem !important; -} - -.row-gap-0 { - row-gap: 0 !important; -} - -.row-gap-1 { - row-gap: 0.25rem !important; -} - -.row-gap-2 { - row-gap: 0.5rem !important; -} - -.row-gap-3 { - row-gap: 1rem !important; -} - -.row-gap-4 { - row-gap: 1.5rem !important; -} - -.row-gap-5 { - row-gap: 3rem !important; -} - -.column-gap-0 { - column-gap: 0 !important; -} - -.column-gap-1 { - column-gap: 0.25rem !important; -} - -.column-gap-2 { - column-gap: 0.5rem !important; -} - -.column-gap-3 { - column-gap: 1rem !important; -} - -.column-gap-4 { - column-gap: 1.5rem !important; -} - -.column-gap-5 { - column-gap: 3rem !important; -} - -.font-monospace { - font-family: var(--bs-font-monospace) !important; -} - -.fs-1 { - font-size: calc(1.375rem + 1.5vw) !important; -} - -.fs-2 { - font-size: calc(1.325rem + 0.9vw) !important; -} - -.fs-3 { - font-size: calc(1.3rem + 0.6vw) !important; -} - -.fs-4 { - font-size: calc(1.275rem + 0.3vw) !important; -} - -.fs-5 { - font-size: 1.25rem !important; -} - -.fs-6 { - font-size: 1rem !important; -} - -.fst-italic { - font-style: italic !important; -} - -.fst-normal { - font-style: normal !important; -} - -.fw-lighter { - font-weight: lighter !important; -} - -.fw-light { - font-weight: 300 !important; -} - -.fw-normal { - font-weight: 400 !important; -} - -.fw-medium { - font-weight: 500 !important; -} - -.fw-semibold { - font-weight: 600 !important; -} - -.fw-bold { - font-weight: 700 !important; -} - -.fw-bolder { - font-weight: bolder !important; -} - -.lh-1 { - line-height: 1 !important; -} - -.lh-sm { - line-height: 1.25 !important; -} - -.lh-base { - line-height: 1.5 !important; -} - -.lh-lg { - line-height: 2 !important; -} - -.text-start { - text-align: left !important; -} - -.text-end { - text-align: right !important; -} - -.text-center { - text-align: center !important; -} - -.text-decoration-none { - text-decoration: none !important; -} - -.text-decoration-underline { - text-decoration: underline !important; -} - -.text-decoration-line-through { - text-decoration: line-through !important; -} - -.text-lowercase { - text-transform: lowercase !important; -} - -.text-uppercase { - text-transform: uppercase !important; -} - -.text-capitalize { - text-transform: capitalize !important; -} - -.text-wrap { - white-space: normal !important; -} - -.text-nowrap { - white-space: nowrap !important; -} - -/* rtl:begin:remove */ -.text-break { - word-wrap: break-word !important; - word-break: break-word !important; -} - -/* rtl:end:remove */ -.text-primary { - --bs-text-opacity: 1; - color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important; -} - -.text-secondary { - --bs-text-opacity: 1; - color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important; -} - -.text-success { - --bs-text-opacity: 1; - color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important; -} - -.text-info { - --bs-text-opacity: 1; - color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important; -} - -.text-warning { - --bs-text-opacity: 1; - color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important; -} - -.text-danger { - --bs-text-opacity: 1; - color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important; -} - -.text-light { - --bs-text-opacity: 1; - color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important; -} - -.text-dark { - --bs-text-opacity: 1; - color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important; -} - -.text-black { - --bs-text-opacity: 1; - color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important; -} - -.text-white { - --bs-text-opacity: 1; - color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important; -} - -.text-body { - --bs-text-opacity: 1; - color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important; -} - -.text-muted { - --bs-text-opacity: 1; - color: var(--bs-secondary-color) !important; -} - -.text-black-50 { - --bs-text-opacity: 1; - color: rgba(0, 0, 0, 0.5) !important; -} - -.text-white-50 { - --bs-text-opacity: 1; - color: rgba(255, 255, 255, 0.5) !important; -} - -.text-body-secondary { - --bs-text-opacity: 1; - color: var(--bs-secondary-color) !important; -} - -.text-body-tertiary { - --bs-text-opacity: 1; - color: var(--bs-tertiary-color) !important; -} - -.text-body-emphasis { - --bs-text-opacity: 1; - color: var(--bs-emphasis-color) !important; -} - -.text-reset { - --bs-text-opacity: 1; - color: inherit !important; -} - -.text-opacity-25 { - --bs-text-opacity: 0.25; -} - -.text-opacity-50 { - --bs-text-opacity: 0.5; -} - -.text-opacity-75 { - --bs-text-opacity: 0.75; -} - -.text-opacity-100 { - --bs-text-opacity: 1; -} - -.text-primary-emphasis { - color: var(--bs-primary-text-emphasis) !important; -} - -.text-secondary-emphasis { - color: var(--bs-secondary-text-emphasis) !important; -} - -.text-success-emphasis { - color: var(--bs-success-text-emphasis) !important; -} - -.text-info-emphasis { - color: var(--bs-info-text-emphasis) !important; -} - -.text-warning-emphasis { - color: var(--bs-warning-text-emphasis) !important; -} - -.text-danger-emphasis { - color: var(--bs-danger-text-emphasis) !important; -} - -.text-light-emphasis { - color: var(--bs-light-text-emphasis) !important; -} - -.text-dark-emphasis { - color: var(--bs-dark-text-emphasis) !important; -} - -.link-opacity-10 { - --bs-link-opacity: 0.1; -} - -.link-opacity-10-hover:hover { - --bs-link-opacity: 0.1; -} - -.link-opacity-25 { - --bs-link-opacity: 0.25; -} - -.link-opacity-25-hover:hover { - --bs-link-opacity: 0.25; -} - -.link-opacity-50 { - --bs-link-opacity: 0.5; -} - -.link-opacity-50-hover:hover { - --bs-link-opacity: 0.5; -} - -.link-opacity-75 { - --bs-link-opacity: 0.75; -} - -.link-opacity-75-hover:hover { - --bs-link-opacity: 0.75; -} - -.link-opacity-100 { - --bs-link-opacity: 1; -} - -.link-opacity-100-hover:hover { - --bs-link-opacity: 1; -} - -.link-offset-1 { - text-underline-offset: 0.125em !important; -} - -.link-offset-1-hover:hover { - text-underline-offset: 0.125em !important; -} - -.link-offset-2 { - text-underline-offset: 0.25em !important; -} - -.link-offset-2-hover:hover { - text-underline-offset: 0.25em !important; -} - -.link-offset-3 { - text-underline-offset: 0.375em !important; -} - -.link-offset-3-hover:hover { - text-underline-offset: 0.375em !important; -} - -.link-underline-primary { - --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important; -} - -.link-underline-secondary { - --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important; -} - -.link-underline-success { - --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important; -} - -.link-underline-info { - --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important; -} - -.link-underline-warning { - --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important; -} - -.link-underline-danger { - --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important; -} - -.link-underline-light { - --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important; -} - -.link-underline-dark { - --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important; -} - -.link-underline { - --bs-link-underline-opacity: 1; - text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important; -} - -.link-underline-opacity-0 { - --bs-link-underline-opacity: 0; -} - -.link-underline-opacity-0-hover:hover { - --bs-link-underline-opacity: 0; -} - -.link-underline-opacity-10 { - --bs-link-underline-opacity: 0.1; -} - -.link-underline-opacity-10-hover:hover { - --bs-link-underline-opacity: 0.1; -} - -.link-underline-opacity-25 { - --bs-link-underline-opacity: 0.25; -} - -.link-underline-opacity-25-hover:hover { - --bs-link-underline-opacity: 0.25; -} - -.link-underline-opacity-50 { - --bs-link-underline-opacity: 0.5; -} - -.link-underline-opacity-50-hover:hover { - --bs-link-underline-opacity: 0.5; -} - -.link-underline-opacity-75 { - --bs-link-underline-opacity: 0.75; -} - -.link-underline-opacity-75-hover:hover { - --bs-link-underline-opacity: 0.75; -} - -.link-underline-opacity-100 { - --bs-link-underline-opacity: 1; -} - -.link-underline-opacity-100-hover:hover { - --bs-link-underline-opacity: 1; -} - -.bg-primary { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important; -} - -.bg-secondary { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important; -} - -.bg-success { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important; -} - -.bg-info { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important; -} - -.bg-warning { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important; -} - -.bg-danger { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important; -} - -.bg-light { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important; -} - -.bg-dark { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important; -} - -.bg-black { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important; -} - -.bg-white { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important; -} - -.bg-body { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important; -} - -.bg-transparent { - --bs-bg-opacity: 1; - background-color: transparent !important; -} - -.bg-body-secondary { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important; -} - -.bg-body-tertiary { - --bs-bg-opacity: 1; - background-color: rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important; -} - -.bg-opacity-10 { - --bs-bg-opacity: 0.1; -} - -.bg-opacity-25 { - --bs-bg-opacity: 0.25; -} - -.bg-opacity-50 { - --bs-bg-opacity: 0.5; -} - -.bg-opacity-75 { - --bs-bg-opacity: 0.75; -} - -.bg-opacity-100 { - --bs-bg-opacity: 1; -} - -.bg-primary-subtle { - background-color: var(--bs-primary-bg-subtle) !important; -} - -.bg-secondary-subtle { - background-color: var(--bs-secondary-bg-subtle) !important; -} - -.bg-success-subtle { - background-color: var(--bs-success-bg-subtle) !important; -} - -.bg-info-subtle { - background-color: var(--bs-info-bg-subtle) !important; -} - -.bg-warning-subtle { - background-color: var(--bs-warning-bg-subtle) !important; -} - -.bg-danger-subtle { - background-color: var(--bs-danger-bg-subtle) !important; -} - -.bg-light-subtle { - background-color: var(--bs-light-bg-subtle) !important; -} - -.bg-dark-subtle { - background-color: var(--bs-dark-bg-subtle) !important; -} - -.bg-gradient { - background-image: var(--bs-gradient) !important; -} - -.user-select-all { - user-select: all !important; -} - -.user-select-auto { - user-select: auto !important; -} - -.user-select-none { - user-select: none !important; -} - -.pe-none { - pointer-events: none !important; -} - -.pe-auto { - pointer-events: auto !important; -} - -.rounded { - border-radius: var(--bs-border-radius) !important; -} - -.rounded-0 { - border-radius: 0 !important; -} - -.rounded-1 { - border-radius: var(--bs-border-radius-sm) !important; -} - -.rounded-2 { - border-radius: var(--bs-border-radius) !important; -} - -.rounded-3 { - border-radius: var(--bs-border-radius-lg) !important; -} - -.rounded-4 { - border-radius: var(--bs-border-radius-xl) !important; -} - -.rounded-5 { - border-radius: var(--bs-border-radius-xxl) !important; -} - -.rounded-circle { - border-radius: 50% !important; -} - -.rounded-pill { - border-radius: var(--bs-border-radius-pill) !important; -} - -.rounded-top { - border-top-left-radius: var(--bs-border-radius) !important; - border-top-right-radius: var(--bs-border-radius) !important; -} - -.rounded-top-0 { - border-top-left-radius: 0 !important; - border-top-right-radius: 0 !important; -} - -.rounded-top-1 { - border-top-left-radius: var(--bs-border-radius-sm) !important; - border-top-right-radius: var(--bs-border-radius-sm) !important; -} - -.rounded-top-2 { - border-top-left-radius: var(--bs-border-radius) !important; - border-top-right-radius: var(--bs-border-radius) !important; -} - -.rounded-top-3 { - border-top-left-radius: var(--bs-border-radius-lg) !important; - border-top-right-radius: var(--bs-border-radius-lg) !important; -} - -.rounded-top-4 { - border-top-left-radius: var(--bs-border-radius-xl) !important; - border-top-right-radius: var(--bs-border-radius-xl) !important; -} - -.rounded-top-5 { - border-top-left-radius: var(--bs-border-radius-xxl) !important; - border-top-right-radius: var(--bs-border-radius-xxl) !important; -} - -.rounded-top-circle { - border-top-left-radius: 50% !important; - border-top-right-radius: 50% !important; -} - -.rounded-top-pill { - border-top-left-radius: var(--bs-border-radius-pill) !important; - border-top-right-radius: var(--bs-border-radius-pill) !important; -} - -.rounded-end { - border-top-right-radius: var(--bs-border-radius) !important; - border-bottom-right-radius: var(--bs-border-radius) !important; -} - -.rounded-end-0 { - border-top-right-radius: 0 !important; - border-bottom-right-radius: 0 !important; -} - -.rounded-end-1 { - border-top-right-radius: var(--bs-border-radius-sm) !important; - border-bottom-right-radius: var(--bs-border-radius-sm) !important; -} - -.rounded-end-2 { - border-top-right-radius: var(--bs-border-radius) !important; - border-bottom-right-radius: var(--bs-border-radius) !important; -} - -.rounded-end-3 { - border-top-right-radius: var(--bs-border-radius-lg) !important; - border-bottom-right-radius: var(--bs-border-radius-lg) !important; -} - -.rounded-end-4 { - border-top-right-radius: var(--bs-border-radius-xl) !important; - border-bottom-right-radius: var(--bs-border-radius-xl) !important; -} - -.rounded-end-5 { - border-top-right-radius: var(--bs-border-radius-xxl) !important; - border-bottom-right-radius: var(--bs-border-radius-xxl) !important; -} - -.rounded-end-circle { - border-top-right-radius: 50% !important; - border-bottom-right-radius: 50% !important; -} - -.rounded-end-pill { - border-top-right-radius: var(--bs-border-radius-pill) !important; - border-bottom-right-radius: var(--bs-border-radius-pill) !important; -} - -.rounded-bottom { - border-bottom-right-radius: var(--bs-border-radius) !important; - border-bottom-left-radius: var(--bs-border-radius) !important; -} - -.rounded-bottom-0 { - border-bottom-right-radius: 0 !important; - border-bottom-left-radius: 0 !important; -} - -.rounded-bottom-1 { - border-bottom-right-radius: var(--bs-border-radius-sm) !important; - border-bottom-left-radius: var(--bs-border-radius-sm) !important; -} - -.rounded-bottom-2 { - border-bottom-right-radius: var(--bs-border-radius) !important; - border-bottom-left-radius: var(--bs-border-radius) !important; -} - -.rounded-bottom-3 { - border-bottom-right-radius: var(--bs-border-radius-lg) !important; - border-bottom-left-radius: var(--bs-border-radius-lg) !important; -} - -.rounded-bottom-4 { - border-bottom-right-radius: var(--bs-border-radius-xl) !important; - border-bottom-left-radius: var(--bs-border-radius-xl) !important; -} - -.rounded-bottom-5 { - border-bottom-right-radius: var(--bs-border-radius-xxl) !important; - border-bottom-left-radius: var(--bs-border-radius-xxl) !important; -} - -.rounded-bottom-circle { - border-bottom-right-radius: 50% !important; - border-bottom-left-radius: 50% !important; -} - -.rounded-bottom-pill { - border-bottom-right-radius: var(--bs-border-radius-pill) !important; - border-bottom-left-radius: var(--bs-border-radius-pill) !important; -} - -.rounded-start { - border-bottom-left-radius: var(--bs-border-radius) !important; - border-top-left-radius: var(--bs-border-radius) !important; -} - -.rounded-start-0 { - border-bottom-left-radius: 0 !important; - border-top-left-radius: 0 !important; -} - -.rounded-start-1 { - border-bottom-left-radius: var(--bs-border-radius-sm) !important; - border-top-left-radius: var(--bs-border-radius-sm) !important; -} - -.rounded-start-2 { - border-bottom-left-radius: var(--bs-border-radius) !important; - border-top-left-radius: var(--bs-border-radius) !important; -} - -.rounded-start-3 { - border-bottom-left-radius: var(--bs-border-radius-lg) !important; - border-top-left-radius: var(--bs-border-radius-lg) !important; -} - -.rounded-start-4 { - border-bottom-left-radius: var(--bs-border-radius-xl) !important; - border-top-left-radius: var(--bs-border-radius-xl) !important; -} - -.rounded-start-5 { - border-bottom-left-radius: var(--bs-border-radius-xxl) !important; - border-top-left-radius: var(--bs-border-radius-xxl) !important; -} - -.rounded-start-circle { - border-bottom-left-radius: 50% !important; - border-top-left-radius: 50% !important; -} - -.rounded-start-pill { - border-bottom-left-radius: var(--bs-border-radius-pill) !important; - border-top-left-radius: var(--bs-border-radius-pill) !important; -} - -.visible { - visibility: visible !important; -} - -.invisible { - visibility: hidden !important; -} - -.z-n1 { - z-index: -1 !important; -} - -.z-0 { - z-index: 0 !important; -} - -.z-1 { - z-index: 1 !important; -} - -.z-2 { - z-index: 2 !important; -} - -.z-3 { - z-index: 3 !important; -} - -@media (min-width: 576px) { - .float-sm-start { - float: left !important; - } - .float-sm-end { - float: right !important; - } - .float-sm-none { - float: none !important; - } - .object-fit-sm-contain { - object-fit: contain !important; - } - .object-fit-sm-cover { - object-fit: cover !important; - } - .object-fit-sm-fill { - object-fit: fill !important; - } - .object-fit-sm-scale { - object-fit: scale-down !important; - } - .object-fit-sm-none { - object-fit: none !important; - } - .d-sm-inline { - display: inline !important; - } - .d-sm-inline-block { - display: inline-block !important; - } - .d-sm-block { - display: block !important; - } - .d-sm-grid { - display: grid !important; - } - .d-sm-inline-grid { - display: inline-grid !important; - } - .d-sm-table { - display: table !important; - } - .d-sm-table-row { - display: table-row !important; - } - .d-sm-table-cell { - display: table-cell !important; - } - .d-sm-flex { - display: flex !important; - } - .d-sm-inline-flex { - display: inline-flex !important; - } - .d-sm-none { - display: none !important; - } - .flex-sm-fill { - flex: 1 1 auto !important; - } - .flex-sm-row { - flex-direction: row !important; - } - .flex-sm-column { - flex-direction: column !important; - } - .flex-sm-row-reverse { - flex-direction: row-reverse !important; - } - .flex-sm-column-reverse { - flex-direction: column-reverse !important; - } - .flex-sm-grow-0 { - flex-grow: 0 !important; - } - .flex-sm-grow-1 { - flex-grow: 1 !important; - } - .flex-sm-shrink-0 { - flex-shrink: 0 !important; - } - .flex-sm-shrink-1 { - flex-shrink: 1 !important; - } - .flex-sm-wrap { - flex-wrap: wrap !important; - } - .flex-sm-nowrap { - flex-wrap: nowrap !important; - } - .flex-sm-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .justify-content-sm-start { - justify-content: flex-start !important; - } - .justify-content-sm-end { - justify-content: flex-end !important; - } - .justify-content-sm-center { - justify-content: center !important; - } - .justify-content-sm-between { - justify-content: space-between !important; - } - .justify-content-sm-around { - justify-content: space-around !important; - } - .justify-content-sm-evenly { - justify-content: space-evenly !important; - } - .align-items-sm-start { - align-items: flex-start !important; - } - .align-items-sm-end { - align-items: flex-end !important; - } - .align-items-sm-center { - align-items: center !important; - } - .align-items-sm-baseline { - align-items: baseline !important; - } - .align-items-sm-stretch { - align-items: stretch !important; - } - .align-content-sm-start { - align-content: flex-start !important; - } - .align-content-sm-end { - align-content: flex-end !important; - } - .align-content-sm-center { - align-content: center !important; - } - .align-content-sm-between { - align-content: space-between !important; - } - .align-content-sm-around { - align-content: space-around !important; - } - .align-content-sm-stretch { - align-content: stretch !important; - } - .align-self-sm-auto { - align-self: auto !important; - } - .align-self-sm-start { - align-self: flex-start !important; - } - .align-self-sm-end { - align-self: flex-end !important; - } - .align-self-sm-center { - align-self: center !important; - } - .align-self-sm-baseline { - align-self: baseline !important; - } - .align-self-sm-stretch { - align-self: stretch !important; - } - .order-sm-first { - order: -1 !important; - } - .order-sm-0 { - order: 0 !important; - } - .order-sm-1 { - order: 1 !important; - } - .order-sm-2 { - order: 2 !important; - } - .order-sm-3 { - order: 3 !important; - } - .order-sm-4 { - order: 4 !important; - } - .order-sm-5 { - order: 5 !important; - } - .order-sm-last { - order: 6 !important; - } - .m-sm-0 { - margin: 0 !important; - } - .m-sm-1 { - margin: 0.25rem !important; - } - .m-sm-2 { - margin: 0.5rem !important; - } - .m-sm-3 { - margin: 1rem !important; - } - .m-sm-4 { - margin: 1.5rem !important; - } - .m-sm-5 { - margin: 3rem !important; - } - .m-sm-auto { - margin: auto !important; - } - .mx-sm-0 { - margin-right: 0 !important; - margin-left: 0 !important; - } - .mx-sm-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; - } - .mx-sm-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; - } - .mx-sm-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; - } - .mx-sm-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; - } - .mx-sm-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; - } - .mx-sm-auto { - margin-right: auto !important; - margin-left: auto !important; - } - .my-sm-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .my-sm-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .my-sm-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .my-sm-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .my-sm-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .my-sm-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .my-sm-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - .mt-sm-0 { - margin-top: 0 !important; - } - .mt-sm-1 { - margin-top: 0.25rem !important; - } - .mt-sm-2 { - margin-top: 0.5rem !important; - } - .mt-sm-3 { - margin-top: 1rem !important; - } - .mt-sm-4 { - margin-top: 1.5rem !important; - } - .mt-sm-5 { - margin-top: 3rem !important; - } - .mt-sm-auto { - margin-top: auto !important; - } - .me-sm-0 { - margin-right: 0 !important; - } - .me-sm-1 { - margin-right: 0.25rem !important; - } - .me-sm-2 { - margin-right: 0.5rem !important; - } - .me-sm-3 { - margin-right: 1rem !important; - } - .me-sm-4 { - margin-right: 1.5rem !important; - } - .me-sm-5 { - margin-right: 3rem !important; - } - .me-sm-auto { - margin-right: auto !important; - } - .mb-sm-0 { - margin-bottom: 0 !important; - } - .mb-sm-1 { - margin-bottom: 0.25rem !important; - } - .mb-sm-2 { - margin-bottom: 0.5rem !important; - } - .mb-sm-3 { - margin-bottom: 1rem !important; - } - .mb-sm-4 { - margin-bottom: 1.5rem !important; - } - .mb-sm-5 { - margin-bottom: 3rem !important; - } - .mb-sm-auto { - margin-bottom: auto !important; - } - .ms-sm-0 { - margin-left: 0 !important; - } - .ms-sm-1 { - margin-left: 0.25rem !important; - } - .ms-sm-2 { - margin-left: 0.5rem !important; - } - .ms-sm-3 { - margin-left: 1rem !important; - } - .ms-sm-4 { - margin-left: 1.5rem !important; - } - .ms-sm-5 { - margin-left: 3rem !important; - } - .ms-sm-auto { - margin-left: auto !important; - } - .p-sm-0 { - padding: 0 !important; - } - .p-sm-1 { - padding: 0.25rem !important; - } - .p-sm-2 { - padding: 0.5rem !important; - } - .p-sm-3 { - padding: 1rem !important; - } - .p-sm-4 { - padding: 1.5rem !important; - } - .p-sm-5 { - padding: 3rem !important; - } - .px-sm-0 { - padding-right: 0 !important; - padding-left: 0 !important; - } - .px-sm-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; - } - .px-sm-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; - } - .px-sm-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; - } - .px-sm-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; - } - .px-sm-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; - } - .py-sm-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .py-sm-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .py-sm-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .py-sm-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .py-sm-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .py-sm-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .pt-sm-0 { - padding-top: 0 !important; - } - .pt-sm-1 { - padding-top: 0.25rem !important; - } - .pt-sm-2 { - padding-top: 0.5rem !important; - } - .pt-sm-3 { - padding-top: 1rem !important; - } - .pt-sm-4 { - padding-top: 1.5rem !important; - } - .pt-sm-5 { - padding-top: 3rem !important; - } - .pe-sm-0 { - padding-right: 0 !important; - } - .pe-sm-1 { - padding-right: 0.25rem !important; - } - .pe-sm-2 { - padding-right: 0.5rem !important; - } - .pe-sm-3 { - padding-right: 1rem !important; - } - .pe-sm-4 { - padding-right: 1.5rem !important; - } - .pe-sm-5 { - padding-right: 3rem !important; - } - .pb-sm-0 { - padding-bottom: 0 !important; - } - .pb-sm-1 { - padding-bottom: 0.25rem !important; - } - .pb-sm-2 { - padding-bottom: 0.5rem !important; - } - .pb-sm-3 { - padding-bottom: 1rem !important; - } - .pb-sm-4 { - padding-bottom: 1.5rem !important; - } - .pb-sm-5 { - padding-bottom: 3rem !important; - } - .ps-sm-0 { - padding-left: 0 !important; - } - .ps-sm-1 { - padding-left: 0.25rem !important; - } - .ps-sm-2 { - padding-left: 0.5rem !important; - } - .ps-sm-3 { - padding-left: 1rem !important; - } - .ps-sm-4 { - padding-left: 1.5rem !important; - } - .ps-sm-5 { - padding-left: 3rem !important; - } - .gap-sm-0 { - gap: 0 !important; - } - .gap-sm-1 { - gap: 0.25rem !important; - } - .gap-sm-2 { - gap: 0.5rem !important; - } - .gap-sm-3 { - gap: 1rem !important; - } - .gap-sm-4 { - gap: 1.5rem !important; - } - .gap-sm-5 { - gap: 3rem !important; - } - .row-gap-sm-0 { - row-gap: 0 !important; - } - .row-gap-sm-1 { - row-gap: 0.25rem !important; - } - .row-gap-sm-2 { - row-gap: 0.5rem !important; - } - .row-gap-sm-3 { - row-gap: 1rem !important; - } - .row-gap-sm-4 { - row-gap: 1.5rem !important; - } - .row-gap-sm-5 { - row-gap: 3rem !important; - } - .column-gap-sm-0 { - column-gap: 0 !important; - } - .column-gap-sm-1 { - column-gap: 0.25rem !important; - } - .column-gap-sm-2 { - column-gap: 0.5rem !important; - } - .column-gap-sm-3 { - column-gap: 1rem !important; - } - .column-gap-sm-4 { - column-gap: 1.5rem !important; - } - .column-gap-sm-5 { - column-gap: 3rem !important; - } - .text-sm-start { - text-align: left !important; - } - .text-sm-end { - text-align: right !important; - } - .text-sm-center { - text-align: center !important; - } -} -@media (min-width: 768px) { - .float-md-start { - float: left !important; - } - .float-md-end { - float: right !important; - } - .float-md-none { - float: none !important; - } - .object-fit-md-contain { - object-fit: contain !important; - } - .object-fit-md-cover { - object-fit: cover !important; - } - .object-fit-md-fill { - object-fit: fill !important; - } - .object-fit-md-scale { - object-fit: scale-down !important; - } - .object-fit-md-none { - object-fit: none !important; - } - .d-md-inline { - display: inline !important; - } - .d-md-inline-block { - display: inline-block !important; - } - .d-md-block { - display: block !important; - } - .d-md-grid { - display: grid !important; - } - .d-md-inline-grid { - display: inline-grid !important; - } - .d-md-table { - display: table !important; - } - .d-md-table-row { - display: table-row !important; - } - .d-md-table-cell { - display: table-cell !important; - } - .d-md-flex { - display: flex !important; - } - .d-md-inline-flex { - display: inline-flex !important; - } - .d-md-none { - display: none !important; - } - .flex-md-fill { - flex: 1 1 auto !important; - } - .flex-md-row { - flex-direction: row !important; - } - .flex-md-column { - flex-direction: column !important; - } - .flex-md-row-reverse { - flex-direction: row-reverse !important; - } - .flex-md-column-reverse { - flex-direction: column-reverse !important; - } - .flex-md-grow-0 { - flex-grow: 0 !important; - } - .flex-md-grow-1 { - flex-grow: 1 !important; - } - .flex-md-shrink-0 { - flex-shrink: 0 !important; - } - .flex-md-shrink-1 { - flex-shrink: 1 !important; - } - .flex-md-wrap { - flex-wrap: wrap !important; - } - .flex-md-nowrap { - flex-wrap: nowrap !important; - } - .flex-md-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .justify-content-md-start { - justify-content: flex-start !important; - } - .justify-content-md-end { - justify-content: flex-end !important; - } - .justify-content-md-center { - justify-content: center !important; - } - .justify-content-md-between { - justify-content: space-between !important; - } - .justify-content-md-around { - justify-content: space-around !important; - } - .justify-content-md-evenly { - justify-content: space-evenly !important; - } - .align-items-md-start { - align-items: flex-start !important; - } - .align-items-md-end { - align-items: flex-end !important; - } - .align-items-md-center { - align-items: center !important; - } - .align-items-md-baseline { - align-items: baseline !important; - } - .align-items-md-stretch { - align-items: stretch !important; - } - .align-content-md-start { - align-content: flex-start !important; - } - .align-content-md-end { - align-content: flex-end !important; - } - .align-content-md-center { - align-content: center !important; - } - .align-content-md-between { - align-content: space-between !important; - } - .align-content-md-around { - align-content: space-around !important; - } - .align-content-md-stretch { - align-content: stretch !important; - } - .align-self-md-auto { - align-self: auto !important; - } - .align-self-md-start { - align-self: flex-start !important; - } - .align-self-md-end { - align-self: flex-end !important; - } - .align-self-md-center { - align-self: center !important; - } - .align-self-md-baseline { - align-self: baseline !important; - } - .align-self-md-stretch { - align-self: stretch !important; - } - .order-md-first { - order: -1 !important; - } - .order-md-0 { - order: 0 !important; - } - .order-md-1 { - order: 1 !important; - } - .order-md-2 { - order: 2 !important; - } - .order-md-3 { - order: 3 !important; - } - .order-md-4 { - order: 4 !important; - } - .order-md-5 { - order: 5 !important; - } - .order-md-last { - order: 6 !important; - } - .m-md-0 { - margin: 0 !important; - } - .m-md-1 { - margin: 0.25rem !important; - } - .m-md-2 { - margin: 0.5rem !important; - } - .m-md-3 { - margin: 1rem !important; - } - .m-md-4 { - margin: 1.5rem !important; - } - .m-md-5 { - margin: 3rem !important; - } - .m-md-auto { - margin: auto !important; - } - .mx-md-0 { - margin-right: 0 !important; - margin-left: 0 !important; - } - .mx-md-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; - } - .mx-md-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; - } - .mx-md-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; - } - .mx-md-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; - } - .mx-md-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; - } - .mx-md-auto { - margin-right: auto !important; - margin-left: auto !important; - } - .my-md-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .my-md-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .my-md-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .my-md-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .my-md-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .my-md-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .my-md-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - .mt-md-0 { - margin-top: 0 !important; - } - .mt-md-1 { - margin-top: 0.25rem !important; - } - .mt-md-2 { - margin-top: 0.5rem !important; - } - .mt-md-3 { - margin-top: 1rem !important; - } - .mt-md-4 { - margin-top: 1.5rem !important; - } - .mt-md-5 { - margin-top: 3rem !important; - } - .mt-md-auto { - margin-top: auto !important; - } - .me-md-0 { - margin-right: 0 !important; - } - .me-md-1 { - margin-right: 0.25rem !important; - } - .me-md-2 { - margin-right: 0.5rem !important; - } - .me-md-3 { - margin-right: 1rem !important; - } - .me-md-4 { - margin-right: 1.5rem !important; - } - .me-md-5 { - margin-right: 3rem !important; - } - .me-md-auto { - margin-right: auto !important; - } - .mb-md-0 { - margin-bottom: 0 !important; - } - .mb-md-1 { - margin-bottom: 0.25rem !important; - } - .mb-md-2 { - margin-bottom: 0.5rem !important; - } - .mb-md-3 { - margin-bottom: 1rem !important; - } - .mb-md-4 { - margin-bottom: 1.5rem !important; - } - .mb-md-5 { - margin-bottom: 3rem !important; - } - .mb-md-auto { - margin-bottom: auto !important; - } - .ms-md-0 { - margin-left: 0 !important; - } - .ms-md-1 { - margin-left: 0.25rem !important; - } - .ms-md-2 { - margin-left: 0.5rem !important; - } - .ms-md-3 { - margin-left: 1rem !important; - } - .ms-md-4 { - margin-left: 1.5rem !important; - } - .ms-md-5 { - margin-left: 3rem !important; - } - .ms-md-auto { - margin-left: auto !important; - } - .p-md-0 { - padding: 0 !important; - } - .p-md-1 { - padding: 0.25rem !important; - } - .p-md-2 { - padding: 0.5rem !important; - } - .p-md-3 { - padding: 1rem !important; - } - .p-md-4 { - padding: 1.5rem !important; - } - .p-md-5 { - padding: 3rem !important; - } - .px-md-0 { - padding-right: 0 !important; - padding-left: 0 !important; - } - .px-md-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; - } - .px-md-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; - } - .px-md-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; - } - .px-md-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; - } - .px-md-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; - } - .py-md-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .py-md-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .py-md-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .py-md-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .py-md-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .py-md-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .pt-md-0 { - padding-top: 0 !important; - } - .pt-md-1 { - padding-top: 0.25rem !important; - } - .pt-md-2 { - padding-top: 0.5rem !important; - } - .pt-md-3 { - padding-top: 1rem !important; - } - .pt-md-4 { - padding-top: 1.5rem !important; - } - .pt-md-5 { - padding-top: 3rem !important; - } - .pe-md-0 { - padding-right: 0 !important; - } - .pe-md-1 { - padding-right: 0.25rem !important; - } - .pe-md-2 { - padding-right: 0.5rem !important; - } - .pe-md-3 { - padding-right: 1rem !important; - } - .pe-md-4 { - padding-right: 1.5rem !important; - } - .pe-md-5 { - padding-right: 3rem !important; - } - .pb-md-0 { - padding-bottom: 0 !important; - } - .pb-md-1 { - padding-bottom: 0.25rem !important; - } - .pb-md-2 { - padding-bottom: 0.5rem !important; - } - .pb-md-3 { - padding-bottom: 1rem !important; - } - .pb-md-4 { - padding-bottom: 1.5rem !important; - } - .pb-md-5 { - padding-bottom: 3rem !important; - } - .ps-md-0 { - padding-left: 0 !important; - } - .ps-md-1 { - padding-left: 0.25rem !important; - } - .ps-md-2 { - padding-left: 0.5rem !important; - } - .ps-md-3 { - padding-left: 1rem !important; - } - .ps-md-4 { - padding-left: 1.5rem !important; - } - .ps-md-5 { - padding-left: 3rem !important; - } - .gap-md-0 { - gap: 0 !important; - } - .gap-md-1 { - gap: 0.25rem !important; - } - .gap-md-2 { - gap: 0.5rem !important; - } - .gap-md-3 { - gap: 1rem !important; - } - .gap-md-4 { - gap: 1.5rem !important; - } - .gap-md-5 { - gap: 3rem !important; - } - .row-gap-md-0 { - row-gap: 0 !important; - } - .row-gap-md-1 { - row-gap: 0.25rem !important; - } - .row-gap-md-2 { - row-gap: 0.5rem !important; - } - .row-gap-md-3 { - row-gap: 1rem !important; - } - .row-gap-md-4 { - row-gap: 1.5rem !important; - } - .row-gap-md-5 { - row-gap: 3rem !important; - } - .column-gap-md-0 { - column-gap: 0 !important; - } - .column-gap-md-1 { - column-gap: 0.25rem !important; - } - .column-gap-md-2 { - column-gap: 0.5rem !important; - } - .column-gap-md-3 { - column-gap: 1rem !important; - } - .column-gap-md-4 { - column-gap: 1.5rem !important; - } - .column-gap-md-5 { - column-gap: 3rem !important; - } - .text-md-start { - text-align: left !important; - } - .text-md-end { - text-align: right !important; - } - .text-md-center { - text-align: center !important; - } -} -@media (min-width: 992px) { - .float-lg-start { - float: left !important; - } - .float-lg-end { - float: right !important; - } - .float-lg-none { - float: none !important; - } - .object-fit-lg-contain { - object-fit: contain !important; - } - .object-fit-lg-cover { - object-fit: cover !important; - } - .object-fit-lg-fill { - object-fit: fill !important; - } - .object-fit-lg-scale { - object-fit: scale-down !important; - } - .object-fit-lg-none { - object-fit: none !important; - } - .d-lg-inline { - display: inline !important; - } - .d-lg-inline-block { - display: inline-block !important; - } - .d-lg-block { - display: block !important; - } - .d-lg-grid { - display: grid !important; - } - .d-lg-inline-grid { - display: inline-grid !important; - } - .d-lg-table { - display: table !important; - } - .d-lg-table-row { - display: table-row !important; - } - .d-lg-table-cell { - display: table-cell !important; - } - .d-lg-flex { - display: flex !important; - } - .d-lg-inline-flex { - display: inline-flex !important; - } - .d-lg-none { - display: none !important; - } - .flex-lg-fill { - flex: 1 1 auto !important; - } - .flex-lg-row { - flex-direction: row !important; - } - .flex-lg-column { - flex-direction: column !important; - } - .flex-lg-row-reverse { - flex-direction: row-reverse !important; - } - .flex-lg-column-reverse { - flex-direction: column-reverse !important; - } - .flex-lg-grow-0 { - flex-grow: 0 !important; - } - .flex-lg-grow-1 { - flex-grow: 1 !important; - } - .flex-lg-shrink-0 { - flex-shrink: 0 !important; - } - .flex-lg-shrink-1 { - flex-shrink: 1 !important; - } - .flex-lg-wrap { - flex-wrap: wrap !important; - } - .flex-lg-nowrap { - flex-wrap: nowrap !important; - } - .flex-lg-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .justify-content-lg-start { - justify-content: flex-start !important; - } - .justify-content-lg-end { - justify-content: flex-end !important; - } - .justify-content-lg-center { - justify-content: center !important; - } - .justify-content-lg-between { - justify-content: space-between !important; - } - .justify-content-lg-around { - justify-content: space-around !important; - } - .justify-content-lg-evenly { - justify-content: space-evenly !important; - } - .align-items-lg-start { - align-items: flex-start !important; - } - .align-items-lg-end { - align-items: flex-end !important; - } - .align-items-lg-center { - align-items: center !important; - } - .align-items-lg-baseline { - align-items: baseline !important; - } - .align-items-lg-stretch { - align-items: stretch !important; - } - .align-content-lg-start { - align-content: flex-start !important; - } - .align-content-lg-end { - align-content: flex-end !important; - } - .align-content-lg-center { - align-content: center !important; - } - .align-content-lg-between { - align-content: space-between !important; - } - .align-content-lg-around { - align-content: space-around !important; - } - .align-content-lg-stretch { - align-content: stretch !important; - } - .align-self-lg-auto { - align-self: auto !important; - } - .align-self-lg-start { - align-self: flex-start !important; - } - .align-self-lg-end { - align-self: flex-end !important; - } - .align-self-lg-center { - align-self: center !important; - } - .align-self-lg-baseline { - align-self: baseline !important; - } - .align-self-lg-stretch { - align-self: stretch !important; - } - .order-lg-first { - order: -1 !important; - } - .order-lg-0 { - order: 0 !important; - } - .order-lg-1 { - order: 1 !important; - } - .order-lg-2 { - order: 2 !important; - } - .order-lg-3 { - order: 3 !important; - } - .order-lg-4 { - order: 4 !important; - } - .order-lg-5 { - order: 5 !important; - } - .order-lg-last { - order: 6 !important; - } - .m-lg-0 { - margin: 0 !important; - } - .m-lg-1 { - margin: 0.25rem !important; - } - .m-lg-2 { - margin: 0.5rem !important; - } - .m-lg-3 { - margin: 1rem !important; - } - .m-lg-4 { - margin: 1.5rem !important; - } - .m-lg-5 { - margin: 3rem !important; - } - .m-lg-auto { - margin: auto !important; - } - .mx-lg-0 { - margin-right: 0 !important; - margin-left: 0 !important; - } - .mx-lg-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; - } - .mx-lg-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; - } - .mx-lg-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; - } - .mx-lg-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; - } - .mx-lg-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; - } - .mx-lg-auto { - margin-right: auto !important; - margin-left: auto !important; - } - .my-lg-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .my-lg-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .my-lg-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .my-lg-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .my-lg-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .my-lg-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .my-lg-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - .mt-lg-0 { - margin-top: 0 !important; - } - .mt-lg-1 { - margin-top: 0.25rem !important; - } - .mt-lg-2 { - margin-top: 0.5rem !important; - } - .mt-lg-3 { - margin-top: 1rem !important; - } - .mt-lg-4 { - margin-top: 1.5rem !important; - } - .mt-lg-5 { - margin-top: 3rem !important; - } - .mt-lg-auto { - margin-top: auto !important; - } - .me-lg-0 { - margin-right: 0 !important; - } - .me-lg-1 { - margin-right: 0.25rem !important; - } - .me-lg-2 { - margin-right: 0.5rem !important; - } - .me-lg-3 { - margin-right: 1rem !important; - } - .me-lg-4 { - margin-right: 1.5rem !important; - } - .me-lg-5 { - margin-right: 3rem !important; - } - .me-lg-auto { - margin-right: auto !important; - } - .mb-lg-0 { - margin-bottom: 0 !important; - } - .mb-lg-1 { - margin-bottom: 0.25rem !important; - } - .mb-lg-2 { - margin-bottom: 0.5rem !important; - } - .mb-lg-3 { - margin-bottom: 1rem !important; - } - .mb-lg-4 { - margin-bottom: 1.5rem !important; - } - .mb-lg-5 { - margin-bottom: 3rem !important; - } - .mb-lg-auto { - margin-bottom: auto !important; - } - .ms-lg-0 { - margin-left: 0 !important; - } - .ms-lg-1 { - margin-left: 0.25rem !important; - } - .ms-lg-2 { - margin-left: 0.5rem !important; - } - .ms-lg-3 { - margin-left: 1rem !important; - } - .ms-lg-4 { - margin-left: 1.5rem !important; - } - .ms-lg-5 { - margin-left: 3rem !important; - } - .ms-lg-auto { - margin-left: auto !important; - } - .p-lg-0 { - padding: 0 !important; - } - .p-lg-1 { - padding: 0.25rem !important; - } - .p-lg-2 { - padding: 0.5rem !important; - } - .p-lg-3 { - padding: 1rem !important; - } - .p-lg-4 { - padding: 1.5rem !important; - } - .p-lg-5 { - padding: 3rem !important; - } - .px-lg-0 { - padding-right: 0 !important; - padding-left: 0 !important; - } - .px-lg-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; - } - .px-lg-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; - } - .px-lg-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; - } - .px-lg-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; - } - .px-lg-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; - } - .py-lg-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .py-lg-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .py-lg-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .py-lg-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .py-lg-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .py-lg-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .pt-lg-0 { - padding-top: 0 !important; - } - .pt-lg-1 { - padding-top: 0.25rem !important; - } - .pt-lg-2 { - padding-top: 0.5rem !important; - } - .pt-lg-3 { - padding-top: 1rem !important; - } - .pt-lg-4 { - padding-top: 1.5rem !important; - } - .pt-lg-5 { - padding-top: 3rem !important; - } - .pe-lg-0 { - padding-right: 0 !important; - } - .pe-lg-1 { - padding-right: 0.25rem !important; - } - .pe-lg-2 { - padding-right: 0.5rem !important; - } - .pe-lg-3 { - padding-right: 1rem !important; - } - .pe-lg-4 { - padding-right: 1.5rem !important; - } - .pe-lg-5 { - padding-right: 3rem !important; - } - .pb-lg-0 { - padding-bottom: 0 !important; - } - .pb-lg-1 { - padding-bottom: 0.25rem !important; - } - .pb-lg-2 { - padding-bottom: 0.5rem !important; - } - .pb-lg-3 { - padding-bottom: 1rem !important; - } - .pb-lg-4 { - padding-bottom: 1.5rem !important; - } - .pb-lg-5 { - padding-bottom: 3rem !important; - } - .ps-lg-0 { - padding-left: 0 !important; - } - .ps-lg-1 { - padding-left: 0.25rem !important; - } - .ps-lg-2 { - padding-left: 0.5rem !important; - } - .ps-lg-3 { - padding-left: 1rem !important; - } - .ps-lg-4 { - padding-left: 1.5rem !important; - } - .ps-lg-5 { - padding-left: 3rem !important; - } - .gap-lg-0 { - gap: 0 !important; - } - .gap-lg-1 { - gap: 0.25rem !important; - } - .gap-lg-2 { - gap: 0.5rem !important; - } - .gap-lg-3 { - gap: 1rem !important; - } - .gap-lg-4 { - gap: 1.5rem !important; - } - .gap-lg-5 { - gap: 3rem !important; - } - .row-gap-lg-0 { - row-gap: 0 !important; - } - .row-gap-lg-1 { - row-gap: 0.25rem !important; - } - .row-gap-lg-2 { - row-gap: 0.5rem !important; - } - .row-gap-lg-3 { - row-gap: 1rem !important; - } - .row-gap-lg-4 { - row-gap: 1.5rem !important; - } - .row-gap-lg-5 { - row-gap: 3rem !important; - } - .column-gap-lg-0 { - column-gap: 0 !important; - } - .column-gap-lg-1 { - column-gap: 0.25rem !important; - } - .column-gap-lg-2 { - column-gap: 0.5rem !important; - } - .column-gap-lg-3 { - column-gap: 1rem !important; - } - .column-gap-lg-4 { - column-gap: 1.5rem !important; - } - .column-gap-lg-5 { - column-gap: 3rem !important; - } - .text-lg-start { - text-align: left !important; - } - .text-lg-end { - text-align: right !important; - } - .text-lg-center { - text-align: center !important; - } -} -@media (min-width: 1200px) { - .float-xl-start { - float: left !important; - } - .float-xl-end { - float: right !important; - } - .float-xl-none { - float: none !important; - } - .object-fit-xl-contain { - object-fit: contain !important; - } - .object-fit-xl-cover { - object-fit: cover !important; - } - .object-fit-xl-fill { - object-fit: fill !important; - } - .object-fit-xl-scale { - object-fit: scale-down !important; - } - .object-fit-xl-none { - object-fit: none !important; - } - .d-xl-inline { - display: inline !important; - } - .d-xl-inline-block { - display: inline-block !important; - } - .d-xl-block { - display: block !important; - } - .d-xl-grid { - display: grid !important; - } - .d-xl-inline-grid { - display: inline-grid !important; - } - .d-xl-table { - display: table !important; - } - .d-xl-table-row { - display: table-row !important; - } - .d-xl-table-cell { - display: table-cell !important; - } - .d-xl-flex { - display: flex !important; - } - .d-xl-inline-flex { - display: inline-flex !important; - } - .d-xl-none { - display: none !important; - } - .flex-xl-fill { - flex: 1 1 auto !important; - } - .flex-xl-row { - flex-direction: row !important; - } - .flex-xl-column { - flex-direction: column !important; - } - .flex-xl-row-reverse { - flex-direction: row-reverse !important; - } - .flex-xl-column-reverse { - flex-direction: column-reverse !important; - } - .flex-xl-grow-0 { - flex-grow: 0 !important; - } - .flex-xl-grow-1 { - flex-grow: 1 !important; - } - .flex-xl-shrink-0 { - flex-shrink: 0 !important; - } - .flex-xl-shrink-1 { - flex-shrink: 1 !important; - } - .flex-xl-wrap { - flex-wrap: wrap !important; - } - .flex-xl-nowrap { - flex-wrap: nowrap !important; - } - .flex-xl-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .justify-content-xl-start { - justify-content: flex-start !important; - } - .justify-content-xl-end { - justify-content: flex-end !important; - } - .justify-content-xl-center { - justify-content: center !important; - } - .justify-content-xl-between { - justify-content: space-between !important; - } - .justify-content-xl-around { - justify-content: space-around !important; - } - .justify-content-xl-evenly { - justify-content: space-evenly !important; - } - .align-items-xl-start { - align-items: flex-start !important; - } - .align-items-xl-end { - align-items: flex-end !important; - } - .align-items-xl-center { - align-items: center !important; - } - .align-items-xl-baseline { - align-items: baseline !important; - } - .align-items-xl-stretch { - align-items: stretch !important; - } - .align-content-xl-start { - align-content: flex-start !important; - } - .align-content-xl-end { - align-content: flex-end !important; - } - .align-content-xl-center { - align-content: center !important; - } - .align-content-xl-between { - align-content: space-between !important; - } - .align-content-xl-around { - align-content: space-around !important; - } - .align-content-xl-stretch { - align-content: stretch !important; - } - .align-self-xl-auto { - align-self: auto !important; - } - .align-self-xl-start { - align-self: flex-start !important; - } - .align-self-xl-end { - align-self: flex-end !important; - } - .align-self-xl-center { - align-self: center !important; - } - .align-self-xl-baseline { - align-self: baseline !important; - } - .align-self-xl-stretch { - align-self: stretch !important; - } - .order-xl-first { - order: -1 !important; - } - .order-xl-0 { - order: 0 !important; - } - .order-xl-1 { - order: 1 !important; - } - .order-xl-2 { - order: 2 !important; - } - .order-xl-3 { - order: 3 !important; - } - .order-xl-4 { - order: 4 !important; - } - .order-xl-5 { - order: 5 !important; - } - .order-xl-last { - order: 6 !important; - } - .m-xl-0 { - margin: 0 !important; - } - .m-xl-1 { - margin: 0.25rem !important; - } - .m-xl-2 { - margin: 0.5rem !important; - } - .m-xl-3 { - margin: 1rem !important; - } - .m-xl-4 { - margin: 1.5rem !important; - } - .m-xl-5 { - margin: 3rem !important; - } - .m-xl-auto { - margin: auto !important; - } - .mx-xl-0 { - margin-right: 0 !important; - margin-left: 0 !important; - } - .mx-xl-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; - } - .mx-xl-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; - } - .mx-xl-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; - } - .mx-xl-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; - } - .mx-xl-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; - } - .mx-xl-auto { - margin-right: auto !important; - margin-left: auto !important; - } - .my-xl-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .my-xl-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .my-xl-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .my-xl-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .my-xl-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .my-xl-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .my-xl-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - .mt-xl-0 { - margin-top: 0 !important; - } - .mt-xl-1 { - margin-top: 0.25rem !important; - } - .mt-xl-2 { - margin-top: 0.5rem !important; - } - .mt-xl-3 { - margin-top: 1rem !important; - } - .mt-xl-4 { - margin-top: 1.5rem !important; - } - .mt-xl-5 { - margin-top: 3rem !important; - } - .mt-xl-auto { - margin-top: auto !important; - } - .me-xl-0 { - margin-right: 0 !important; - } - .me-xl-1 { - margin-right: 0.25rem !important; - } - .me-xl-2 { - margin-right: 0.5rem !important; - } - .me-xl-3 { - margin-right: 1rem !important; - } - .me-xl-4 { - margin-right: 1.5rem !important; - } - .me-xl-5 { - margin-right: 3rem !important; - } - .me-xl-auto { - margin-right: auto !important; - } - .mb-xl-0 { - margin-bottom: 0 !important; - } - .mb-xl-1 { - margin-bottom: 0.25rem !important; - } - .mb-xl-2 { - margin-bottom: 0.5rem !important; - } - .mb-xl-3 { - margin-bottom: 1rem !important; - } - .mb-xl-4 { - margin-bottom: 1.5rem !important; - } - .mb-xl-5 { - margin-bottom: 3rem !important; - } - .mb-xl-auto { - margin-bottom: auto !important; - } - .ms-xl-0 { - margin-left: 0 !important; - } - .ms-xl-1 { - margin-left: 0.25rem !important; - } - .ms-xl-2 { - margin-left: 0.5rem !important; - } - .ms-xl-3 { - margin-left: 1rem !important; - } - .ms-xl-4 { - margin-left: 1.5rem !important; - } - .ms-xl-5 { - margin-left: 3rem !important; - } - .ms-xl-auto { - margin-left: auto !important; - } - .p-xl-0 { - padding: 0 !important; - } - .p-xl-1 { - padding: 0.25rem !important; - } - .p-xl-2 { - padding: 0.5rem !important; - } - .p-xl-3 { - padding: 1rem !important; - } - .p-xl-4 { - padding: 1.5rem !important; - } - .p-xl-5 { - padding: 3rem !important; - } - .px-xl-0 { - padding-right: 0 !important; - padding-left: 0 !important; - } - .px-xl-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; - } - .px-xl-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; - } - .px-xl-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; - } - .px-xl-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; - } - .px-xl-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; - } - .py-xl-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .py-xl-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .py-xl-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .py-xl-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .py-xl-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .py-xl-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .pt-xl-0 { - padding-top: 0 !important; - } - .pt-xl-1 { - padding-top: 0.25rem !important; - } - .pt-xl-2 { - padding-top: 0.5rem !important; - } - .pt-xl-3 { - padding-top: 1rem !important; - } - .pt-xl-4 { - padding-top: 1.5rem !important; - } - .pt-xl-5 { - padding-top: 3rem !important; - } - .pe-xl-0 { - padding-right: 0 !important; - } - .pe-xl-1 { - padding-right: 0.25rem !important; - } - .pe-xl-2 { - padding-right: 0.5rem !important; - } - .pe-xl-3 { - padding-right: 1rem !important; - } - .pe-xl-4 { - padding-right: 1.5rem !important; - } - .pe-xl-5 { - padding-right: 3rem !important; - } - .pb-xl-0 { - padding-bottom: 0 !important; - } - .pb-xl-1 { - padding-bottom: 0.25rem !important; - } - .pb-xl-2 { - padding-bottom: 0.5rem !important; - } - .pb-xl-3 { - padding-bottom: 1rem !important; - } - .pb-xl-4 { - padding-bottom: 1.5rem !important; - } - .pb-xl-5 { - padding-bottom: 3rem !important; - } - .ps-xl-0 { - padding-left: 0 !important; - } - .ps-xl-1 { - padding-left: 0.25rem !important; - } - .ps-xl-2 { - padding-left: 0.5rem !important; - } - .ps-xl-3 { - padding-left: 1rem !important; - } - .ps-xl-4 { - padding-left: 1.5rem !important; - } - .ps-xl-5 { - padding-left: 3rem !important; - } - .gap-xl-0 { - gap: 0 !important; - } - .gap-xl-1 { - gap: 0.25rem !important; - } - .gap-xl-2 { - gap: 0.5rem !important; - } - .gap-xl-3 { - gap: 1rem !important; - } - .gap-xl-4 { - gap: 1.5rem !important; - } - .gap-xl-5 { - gap: 3rem !important; - } - .row-gap-xl-0 { - row-gap: 0 !important; - } - .row-gap-xl-1 { - row-gap: 0.25rem !important; - } - .row-gap-xl-2 { - row-gap: 0.5rem !important; - } - .row-gap-xl-3 { - row-gap: 1rem !important; - } - .row-gap-xl-4 { - row-gap: 1.5rem !important; - } - .row-gap-xl-5 { - row-gap: 3rem !important; - } - .column-gap-xl-0 { - column-gap: 0 !important; - } - .column-gap-xl-1 { - column-gap: 0.25rem !important; - } - .column-gap-xl-2 { - column-gap: 0.5rem !important; - } - .column-gap-xl-3 { - column-gap: 1rem !important; - } - .column-gap-xl-4 { - column-gap: 1.5rem !important; - } - .column-gap-xl-5 { - column-gap: 3rem !important; - } - .text-xl-start { - text-align: left !important; - } - .text-xl-end { - text-align: right !important; - } - .text-xl-center { - text-align: center !important; - } -} -@media (min-width: 1400px) { - .float-xxl-start { - float: left !important; - } - .float-xxl-end { - float: right !important; - } - .float-xxl-none { - float: none !important; - } - .object-fit-xxl-contain { - object-fit: contain !important; - } - .object-fit-xxl-cover { - object-fit: cover !important; - } - .object-fit-xxl-fill { - object-fit: fill !important; - } - .object-fit-xxl-scale { - object-fit: scale-down !important; - } - .object-fit-xxl-none { - object-fit: none !important; - } - .d-xxl-inline { - display: inline !important; - } - .d-xxl-inline-block { - display: inline-block !important; - } - .d-xxl-block { - display: block !important; - } - .d-xxl-grid { - display: grid !important; - } - .d-xxl-inline-grid { - display: inline-grid !important; - } - .d-xxl-table { - display: table !important; - } - .d-xxl-table-row { - display: table-row !important; - } - .d-xxl-table-cell { - display: table-cell !important; - } - .d-xxl-flex { - display: flex !important; - } - .d-xxl-inline-flex { - display: inline-flex !important; - } - .d-xxl-none { - display: none !important; - } - .flex-xxl-fill { - flex: 1 1 auto !important; - } - .flex-xxl-row { - flex-direction: row !important; - } - .flex-xxl-column { - flex-direction: column !important; - } - .flex-xxl-row-reverse { - flex-direction: row-reverse !important; - } - .flex-xxl-column-reverse { - flex-direction: column-reverse !important; - } - .flex-xxl-grow-0 { - flex-grow: 0 !important; - } - .flex-xxl-grow-1 { - flex-grow: 1 !important; - } - .flex-xxl-shrink-0 { - flex-shrink: 0 !important; - } - .flex-xxl-shrink-1 { - flex-shrink: 1 !important; - } - .flex-xxl-wrap { - flex-wrap: wrap !important; - } - .flex-xxl-nowrap { - flex-wrap: nowrap !important; - } - .flex-xxl-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .justify-content-xxl-start { - justify-content: flex-start !important; - } - .justify-content-xxl-end { - justify-content: flex-end !important; - } - .justify-content-xxl-center { - justify-content: center !important; - } - .justify-content-xxl-between { - justify-content: space-between !important; - } - .justify-content-xxl-around { - justify-content: space-around !important; - } - .justify-content-xxl-evenly { - justify-content: space-evenly !important; - } - .align-items-xxl-start { - align-items: flex-start !important; - } - .align-items-xxl-end { - align-items: flex-end !important; - } - .align-items-xxl-center { - align-items: center !important; - } - .align-items-xxl-baseline { - align-items: baseline !important; - } - .align-items-xxl-stretch { - align-items: stretch !important; - } - .align-content-xxl-start { - align-content: flex-start !important; - } - .align-content-xxl-end { - align-content: flex-end !important; - } - .align-content-xxl-center { - align-content: center !important; - } - .align-content-xxl-between { - align-content: space-between !important; - } - .align-content-xxl-around { - align-content: space-around !important; - } - .align-content-xxl-stretch { - align-content: stretch !important; - } - .align-self-xxl-auto { - align-self: auto !important; - } - .align-self-xxl-start { - align-self: flex-start !important; - } - .align-self-xxl-end { - align-self: flex-end !important; - } - .align-self-xxl-center { - align-self: center !important; - } - .align-self-xxl-baseline { - align-self: baseline !important; - } - .align-self-xxl-stretch { - align-self: stretch !important; - } - .order-xxl-first { - order: -1 !important; - } - .order-xxl-0 { - order: 0 !important; - } - .order-xxl-1 { - order: 1 !important; - } - .order-xxl-2 { - order: 2 !important; - } - .order-xxl-3 { - order: 3 !important; - } - .order-xxl-4 { - order: 4 !important; - } - .order-xxl-5 { - order: 5 !important; - } - .order-xxl-last { - order: 6 !important; - } - .m-xxl-0 { - margin: 0 !important; - } - .m-xxl-1 { - margin: 0.25rem !important; - } - .m-xxl-2 { - margin: 0.5rem !important; - } - .m-xxl-3 { - margin: 1rem !important; - } - .m-xxl-4 { - margin: 1.5rem !important; - } - .m-xxl-5 { - margin: 3rem !important; - } - .m-xxl-auto { - margin: auto !important; - } - .mx-xxl-0 { - margin-right: 0 !important; - margin-left: 0 !important; - } - .mx-xxl-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; - } - .mx-xxl-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; - } - .mx-xxl-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; - } - .mx-xxl-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; - } - .mx-xxl-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; - } - .mx-xxl-auto { - margin-right: auto !important; - margin-left: auto !important; - } - .my-xxl-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .my-xxl-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .my-xxl-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .my-xxl-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .my-xxl-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .my-xxl-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .my-xxl-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - .mt-xxl-0 { - margin-top: 0 !important; - } - .mt-xxl-1 { - margin-top: 0.25rem !important; - } - .mt-xxl-2 { - margin-top: 0.5rem !important; - } - .mt-xxl-3 { - margin-top: 1rem !important; - } - .mt-xxl-4 { - margin-top: 1.5rem !important; - } - .mt-xxl-5 { - margin-top: 3rem !important; - } - .mt-xxl-auto { - margin-top: auto !important; - } - .me-xxl-0 { - margin-right: 0 !important; - } - .me-xxl-1 { - margin-right: 0.25rem !important; - } - .me-xxl-2 { - margin-right: 0.5rem !important; - } - .me-xxl-3 { - margin-right: 1rem !important; - } - .me-xxl-4 { - margin-right: 1.5rem !important; - } - .me-xxl-5 { - margin-right: 3rem !important; - } - .me-xxl-auto { - margin-right: auto !important; - } - .mb-xxl-0 { - margin-bottom: 0 !important; - } - .mb-xxl-1 { - margin-bottom: 0.25rem !important; - } - .mb-xxl-2 { - margin-bottom: 0.5rem !important; - } - .mb-xxl-3 { - margin-bottom: 1rem !important; - } - .mb-xxl-4 { - margin-bottom: 1.5rem !important; - } - .mb-xxl-5 { - margin-bottom: 3rem !important; - } - .mb-xxl-auto { - margin-bottom: auto !important; - } - .ms-xxl-0 { - margin-left: 0 !important; - } - .ms-xxl-1 { - margin-left: 0.25rem !important; - } - .ms-xxl-2 { - margin-left: 0.5rem !important; - } - .ms-xxl-3 { - margin-left: 1rem !important; - } - .ms-xxl-4 { - margin-left: 1.5rem !important; - } - .ms-xxl-5 { - margin-left: 3rem !important; - } - .ms-xxl-auto { - margin-left: auto !important; - } - .p-xxl-0 { - padding: 0 !important; - } - .p-xxl-1 { - padding: 0.25rem !important; - } - .p-xxl-2 { - padding: 0.5rem !important; - } - .p-xxl-3 { - padding: 1rem !important; - } - .p-xxl-4 { - padding: 1.5rem !important; - } - .p-xxl-5 { - padding: 3rem !important; - } - .px-xxl-0 { - padding-right: 0 !important; - padding-left: 0 !important; - } - .px-xxl-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; - } - .px-xxl-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; - } - .px-xxl-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; - } - .px-xxl-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; - } - .px-xxl-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; - } - .py-xxl-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .py-xxl-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .py-xxl-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .py-xxl-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .py-xxl-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .py-xxl-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .pt-xxl-0 { - padding-top: 0 !important; - } - .pt-xxl-1 { - padding-top: 0.25rem !important; - } - .pt-xxl-2 { - padding-top: 0.5rem !important; - } - .pt-xxl-3 { - padding-top: 1rem !important; - } - .pt-xxl-4 { - padding-top: 1.5rem !important; - } - .pt-xxl-5 { - padding-top: 3rem !important; - } - .pe-xxl-0 { - padding-right: 0 !important; - } - .pe-xxl-1 { - padding-right: 0.25rem !important; - } - .pe-xxl-2 { - padding-right: 0.5rem !important; - } - .pe-xxl-3 { - padding-right: 1rem !important; - } - .pe-xxl-4 { - padding-right: 1.5rem !important; - } - .pe-xxl-5 { - padding-right: 3rem !important; - } - .pb-xxl-0 { - padding-bottom: 0 !important; - } - .pb-xxl-1 { - padding-bottom: 0.25rem !important; - } - .pb-xxl-2 { - padding-bottom: 0.5rem !important; - } - .pb-xxl-3 { - padding-bottom: 1rem !important; - } - .pb-xxl-4 { - padding-bottom: 1.5rem !important; - } - .pb-xxl-5 { - padding-bottom: 3rem !important; - } - .ps-xxl-0 { - padding-left: 0 !important; - } - .ps-xxl-1 { - padding-left: 0.25rem !important; - } - .ps-xxl-2 { - padding-left: 0.5rem !important; - } - .ps-xxl-3 { - padding-left: 1rem !important; - } - .ps-xxl-4 { - padding-left: 1.5rem !important; - } - .ps-xxl-5 { - padding-left: 3rem !important; - } - .gap-xxl-0 { - gap: 0 !important; - } - .gap-xxl-1 { - gap: 0.25rem !important; - } - .gap-xxl-2 { - gap: 0.5rem !important; - } - .gap-xxl-3 { - gap: 1rem !important; - } - .gap-xxl-4 { - gap: 1.5rem !important; - } - .gap-xxl-5 { - gap: 3rem !important; - } - .row-gap-xxl-0 { - row-gap: 0 !important; - } - .row-gap-xxl-1 { - row-gap: 0.25rem !important; - } - .row-gap-xxl-2 { - row-gap: 0.5rem !important; - } - .row-gap-xxl-3 { - row-gap: 1rem !important; - } - .row-gap-xxl-4 { - row-gap: 1.5rem !important; - } - .row-gap-xxl-5 { - row-gap: 3rem !important; - } - .column-gap-xxl-0 { - column-gap: 0 !important; - } - .column-gap-xxl-1 { - column-gap: 0.25rem !important; - } - .column-gap-xxl-2 { - column-gap: 0.5rem !important; - } - .column-gap-xxl-3 { - column-gap: 1rem !important; - } - .column-gap-xxl-4 { - column-gap: 1.5rem !important; - } - .column-gap-xxl-5 { - column-gap: 3rem !important; - } - .text-xxl-start { - text-align: left !important; - } - .text-xxl-end { - text-align: right !important; - } - .text-xxl-center { - text-align: center !important; - } -} -@media (min-width: 1200px) { - .fs-1 { - font-size: 2.5rem !important; - } - .fs-2 { - font-size: 2rem !important; - } - .fs-3 { - font-size: 1.75rem !important; - } - .fs-4 { - font-size: 1.5rem !important; - } -} -@media print { - .d-print-inline { - display: inline !important; - } - .d-print-inline-block { - display: inline-block !important; - } - .d-print-block { - display: block !important; - } - .d-print-grid { - display: grid !important; - } - .d-print-inline-grid { - display: inline-grid !important; - } - .d-print-table { - display: table !important; - } - .d-print-table-row { - display: table-row !important; - } - .d-print-table-cell { - display: table-cell !important; - } - .d-print-flex { - display: flex !important; - } - .d-print-inline-flex { - display: inline-flex !important; - } - .d-print-none { - display: none !important; - } -} -@font-face { - font-display: swap; - font-family: "Playfair Display"; - font-style: normal; - font-weight: 400; - src: url("../fonts/playfair-display-v40-latin/playfair-display-v40-latin-regular.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Playfair Display"; - font-style: italic; - font-weight: 400; - src: url("../fonts/playfair-display-v40-latin/playfair-display-v40-latin-italic.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Playfair Display"; - font-style: normal; - font-weight: 500; - src: url("../fonts/playfair-display-v40-latin/playfair-display-v40-latin-500.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Playfair Display"; - font-style: italic; - font-weight: 500; - src: url("../fonts/playfair-display-v40-latin/playfair-display-v40-latin-500italic.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Playfair Display"; - font-style: normal; - font-weight: 600; - src: url("../fonts/playfair-display-v40-latin/playfair-display-v40-latin-600.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Playfair Display"; - font-style: italic; - font-weight: 600; - src: url("../fonts/playfair-display-v40-latin/playfair-display-v40-latin-600italic.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Playfair Display"; - font-style: normal; - font-weight: 700; - src: url("../fonts/playfair-display-v40-latin/playfair-display-v40-latin-700.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Playfair Display"; - font-style: italic; - font-weight: 700; - src: url("../fonts/playfair-display-v40-latin/playfair-display-v40-latin-700italic.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Playfair Display"; - font-style: normal; - font-weight: 800; - src: url("../fonts/playfair-display-v40-latin/playfair-display-v40-latin-800.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Playfair Display"; - font-style: italic; - font-weight: 800; - src: url("../fonts/playfair-display-v40-latin/playfair-display-v40-latin-800italic.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Playfair Display"; - font-style: normal; - font-weight: 900; - src: url("../fonts/playfair-display-v40-latin/playfair-display-v40-latin-900.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Playfair Display"; - font-style: italic; - font-weight: 900; - src: url("../fonts/playfair-display-v40-latin/playfair-display-v40-latin-900italic.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: normal; - font-weight: 200; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-200.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: italic; - font-weight: 200; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-200italic.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: normal; - font-weight: 300; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-300.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: italic; - font-weight: 300; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-300italic.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: normal; - font-weight: 400; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-regular.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: italic; - font-weight: 400; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-italic.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: normal; - font-weight: 500; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-500.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: italic; - font-weight: 500; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-500italic.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: normal; - font-weight: 600; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-600.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: italic; - font-weight: 600; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-600italic.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: normal; - font-weight: 700; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-700.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: italic; - font-weight: 700; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-700italic.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: normal; - font-weight: 800; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-800.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: italic; - font-weight: 800; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-800italic.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: normal; - font-weight: 900; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-900.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Source Sans 3"; - font-style: italic; - font-weight: 900; - src: url("../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-900italic.woff2") format("woff2"); -} -@font-face { - font-display: swap; - font-family: "Special Elite"; - font-style: normal; - font-weight: 400; - src: url("../fonts/special-elite-v20-latin/special-elite-v20-latin-regular.woff2") format("woff2"); -} -.drop-shadow-curved { - position: relative; - float: left; - width: 40%; - padding: 1em; - margin: 2em 10px 4em; - background: #fff; - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3), 0 0 40px rgba(0, 0, 0, 0.1) inset; -} -.drop-shadow-curved:before, .drop-shadow-curved:after { - content: ""; - width: 3px; - position: absolute; - z-index: -1; - top: 10px; - bottom: 10px; - box-shadow: 0 0 15px rgba(0, 0, 0, 0.6); - border-radius: 10px/100px; -} -.drop-shadow-curved:before { - left: 0; -} -.drop-shadow-curved:after { - right: 0; -} - -/* Color Theme Swatches in Hex */ -*, -html { - box-sizing: border-box; -} - -html, -body { - height: 100%; - padding: 0; - margin: 0; -} - -body { - font-family: "Source Sans 3", "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; -} - -h1, .h1, -h2, -.h2, -h3, -.h3, -h4, -.h4, -h5, -.h5, -h6, -.h6 { - font-family: "Playfair Display", Cambria, Cochin, Georgia, Times, "Times New Roman", serif; - font-weight: 700; -} - -/*! -* animate.css - https://animate.style/ -* Version - 4.1.1 -* Licensed under the MIT license - http://opensource.org/licenses/MIT -* -* Copyright (c) 2020 Animate.css -*/ -:root { - --animate-duration: 1s; - --animate-delay: 1s; - --animate-repeat: 1; -} - -.animate__animated { - -webkit-animation-duration: 1s; - animation-duration: 1s; - -webkit-animation-duration: var(--animate-duration); - animation-duration: var(--animate-duration); - -webkit-animation-fill-mode: both; - animation-fill-mode: both; -} - -.animate__animated.animate__infinite { - -webkit-animation-iteration-count: infinite; - animation-iteration-count: infinite; -} - -.animate__animated.animate__repeat-1 { - -webkit-animation-iteration-count: 1; - animation-iteration-count: 1; - -webkit-animation-iteration-count: var(--animate-repeat); - animation-iteration-count: var(--animate-repeat); -} - -.animate__animated.animate__repeat-2 { - -webkit-animation-iteration-count: 2; - animation-iteration-count: 2; - -webkit-animation-iteration-count: calc(var(--animate-repeat) * 2); - animation-iteration-count: calc(var(--animate-repeat) * 2); -} - -.animate__animated.animate__repeat-3 { - -webkit-animation-iteration-count: 3; - animation-iteration-count: 3; - -webkit-animation-iteration-count: calc(var(--animate-repeat) * 3); - animation-iteration-count: calc(var(--animate-repeat) * 3); -} - -.animate__animated.animate__delay-1s { - -webkit-animation-delay: 1s; - animation-delay: 1s; - -webkit-animation-delay: var(--animate-delay); - animation-delay: var(--animate-delay); -} - -.animate__animated.animate__delay-2s { - -webkit-animation-delay: 2s; - animation-delay: 2s; - -webkit-animation-delay: calc(var(--animate-delay) * 2); - animation-delay: calc(var(--animate-delay) * 2); -} - -.animate__animated.animate__delay-3s { - -webkit-animation-delay: 3s; - animation-delay: 3s; - -webkit-animation-delay: calc(var(--animate-delay) * 3); - animation-delay: calc(var(--animate-delay) * 3); -} - -.animate__animated.animate__delay-4s { - -webkit-animation-delay: 4s; - animation-delay: 4s; - -webkit-animation-delay: calc(var(--animate-delay) * 4); - animation-delay: calc(var(--animate-delay) * 4); -} - -.animate__animated.animate__delay-5s { - -webkit-animation-delay: 5s; - animation-delay: 5s; - -webkit-animation-delay: calc(var(--animate-delay) * 5); - animation-delay: calc(var(--animate-delay) * 5); -} - -.animate__animated.animate__faster { - -webkit-animation-duration: 0.5s; - animation-duration: 0.5s; - -webkit-animation-duration: calc(var(--animate-duration) / 2); - animation-duration: calc(var(--animate-duration) / 2); -} - -.animate__animated.animate__fast { - -webkit-animation-duration: 0.8s; - animation-duration: 0.8s; - -webkit-animation-duration: calc(var(--animate-duration) * 0.8); - animation-duration: calc(var(--animate-duration) * 0.8); -} - -.animate__animated.animate__slow { - -webkit-animation-duration: 2s; - animation-duration: 2s; - -webkit-animation-duration: calc(var(--animate-duration) * 2); - animation-duration: calc(var(--animate-duration) * 2); -} - -.animate__animated.animate__slower { - -webkit-animation-duration: 3s; - animation-duration: 3s; - -webkit-animation-duration: calc(var(--animate-duration) * 3); - animation-duration: calc(var(--animate-duration) * 3); -} - -@media print, (prefers-reduced-motion: reduce) { - .animate__animated { - -webkit-animation-duration: 1ms !important; - animation-duration: 1ms !important; - -webkit-transition-duration: 1ms !important; - transition-duration: 1ms !important; - -webkit-animation-iteration-count: 1 !important; - animation-iteration-count: 1 !important; - } - .animate__animated[class*=Out] { - opacity: 0; - } -} -/* Attention seekers */ -@-webkit-keyframes bounce { - from, 20%, 53%, to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - 40%, 43% { - -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - -webkit-transform: translate3d(0, -30px, 0) scaleY(1.1); - transform: translate3d(0, -30px, 0) scaleY(1.1); - } - 70% { - -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - -webkit-transform: translate3d(0, -15px, 0) scaleY(1.05); - transform: translate3d(0, -15px, 0) scaleY(1.05); - } - 80% { - -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - -webkit-transform: translate3d(0, 0, 0) scaleY(0.95); - transform: translate3d(0, 0, 0) scaleY(0.95); - } - 90% { - -webkit-transform: translate3d(0, -4px, 0) scaleY(1.02); - transform: translate3d(0, -4px, 0) scaleY(1.02); - } -} -@keyframes bounce { - from, 20%, 53%, to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - 40%, 43% { - -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - -webkit-transform: translate3d(0, -30px, 0) scaleY(1.1); - transform: translate3d(0, -30px, 0) scaleY(1.1); - } - 70% { - -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - -webkit-transform: translate3d(0, -15px, 0) scaleY(1.05); - transform: translate3d(0, -15px, 0) scaleY(1.05); - } - 80% { - -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - -webkit-transform: translate3d(0, 0, 0) scaleY(0.95); - transform: translate3d(0, 0, 0) scaleY(0.95); - } - 90% { - -webkit-transform: translate3d(0, -4px, 0) scaleY(1.02); - transform: translate3d(0, -4px, 0) scaleY(1.02); - } -} -.animate__bounce { - -webkit-animation-name: bounce; - animation-name: bounce; - -webkit-transform-origin: center bottom; - transform-origin: center bottom; -} - -@-webkit-keyframes flash { - from, 50%, to { - opacity: 1; - } - 25%, 75% { - opacity: 0; - } -} -@keyframes flash { - from, 50%, to { - opacity: 1; - } - 25%, 75% { - opacity: 0; - } -} -.animate__flash { - -webkit-animation-name: flash; - animation-name: flash; -} - -/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ -@-webkit-keyframes pulse { - from { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } - 50% { - -webkit-transform: scale3d(1.05, 1.05, 1.05); - transform: scale3d(1.05, 1.05, 1.05); - } - to { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } -} -@keyframes pulse { - from { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } - 50% { - -webkit-transform: scale3d(1.05, 1.05, 1.05); - transform: scale3d(1.05, 1.05, 1.05); - } - to { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } -} -.animate__pulse { - -webkit-animation-name: pulse; - animation-name: pulse; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; -} - -@-webkit-keyframes rubberBand { - from { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } - 30% { - -webkit-transform: scale3d(1.25, 0.75, 1); - transform: scale3d(1.25, 0.75, 1); - } - 40% { - -webkit-transform: scale3d(0.75, 1.25, 1); - transform: scale3d(0.75, 1.25, 1); - } - 50% { - -webkit-transform: scale3d(1.15, 0.85, 1); - transform: scale3d(1.15, 0.85, 1); - } - 65% { - -webkit-transform: scale3d(0.95, 1.05, 1); - transform: scale3d(0.95, 1.05, 1); - } - 75% { - -webkit-transform: scale3d(1.05, 0.95, 1); - transform: scale3d(1.05, 0.95, 1); - } - to { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } -} -@keyframes rubberBand { - from { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } - 30% { - -webkit-transform: scale3d(1.25, 0.75, 1); - transform: scale3d(1.25, 0.75, 1); - } - 40% { - -webkit-transform: scale3d(0.75, 1.25, 1); - transform: scale3d(0.75, 1.25, 1); - } - 50% { - -webkit-transform: scale3d(1.15, 0.85, 1); - transform: scale3d(1.15, 0.85, 1); - } - 65% { - -webkit-transform: scale3d(0.95, 1.05, 1); - transform: scale3d(0.95, 1.05, 1); - } - 75% { - -webkit-transform: scale3d(1.05, 0.95, 1); - transform: scale3d(1.05, 0.95, 1); - } - to { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } -} -.animate__rubberBand { - -webkit-animation-name: rubberBand; - animation-name: rubberBand; -} - -@-webkit-keyframes shakeX { - from, to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - 10%, 30%, 50%, 70%, 90% { - -webkit-transform: translate3d(-10px, 0, 0); - transform: translate3d(-10px, 0, 0); - } - 20%, 40%, 60%, 80% { - -webkit-transform: translate3d(10px, 0, 0); - transform: translate3d(10px, 0, 0); - } -} -@keyframes shakeX { - from, to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - 10%, 30%, 50%, 70%, 90% { - -webkit-transform: translate3d(-10px, 0, 0); - transform: translate3d(-10px, 0, 0); - } - 20%, 40%, 60%, 80% { - -webkit-transform: translate3d(10px, 0, 0); - transform: translate3d(10px, 0, 0); - } -} -.animate__shakeX { - -webkit-animation-name: shakeX; - animation-name: shakeX; -} - -@-webkit-keyframes shakeY { - from, to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - 10%, 30%, 50%, 70%, 90% { - -webkit-transform: translate3d(0, -10px, 0); - transform: translate3d(0, -10px, 0); - } - 20%, 40%, 60%, 80% { - -webkit-transform: translate3d(0, 10px, 0); - transform: translate3d(0, 10px, 0); - } -} -@keyframes shakeY { - from, to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - 10%, 30%, 50%, 70%, 90% { - -webkit-transform: translate3d(0, -10px, 0); - transform: translate3d(0, -10px, 0); - } - 20%, 40%, 60%, 80% { - -webkit-transform: translate3d(0, 10px, 0); - transform: translate3d(0, 10px, 0); - } -} -.animate__shakeY { - -webkit-animation-name: shakeY; - animation-name: shakeY; -} - -@-webkit-keyframes headShake { - 0% { - -webkit-transform: translateX(0); - transform: translateX(0); - } - 6.5% { - -webkit-transform: translateX(-6px) rotateY(-9deg); - transform: translateX(-6px) rotateY(-9deg); - } - 18.5% { - -webkit-transform: translateX(5px) rotateY(7deg); - transform: translateX(5px) rotateY(7deg); - } - 31.5% { - -webkit-transform: translateX(-3px) rotateY(-5deg); - transform: translateX(-3px) rotateY(-5deg); - } - 43.5% { - -webkit-transform: translateX(2px) rotateY(3deg); - transform: translateX(2px) rotateY(3deg); - } - 50% { - -webkit-transform: translateX(0); - transform: translateX(0); - } -} -@keyframes headShake { - 0% { - -webkit-transform: translateX(0); - transform: translateX(0); - } - 6.5% { - -webkit-transform: translateX(-6px) rotateY(-9deg); - transform: translateX(-6px) rotateY(-9deg); - } - 18.5% { - -webkit-transform: translateX(5px) rotateY(7deg); - transform: translateX(5px) rotateY(7deg); - } - 31.5% { - -webkit-transform: translateX(-3px) rotateY(-5deg); - transform: translateX(-3px) rotateY(-5deg); - } - 43.5% { - -webkit-transform: translateX(2px) rotateY(3deg); - transform: translateX(2px) rotateY(3deg); - } - 50% { - -webkit-transform: translateX(0); - transform: translateX(0); - } -} -.animate__headShake { - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - -webkit-animation-name: headShake; - animation-name: headShake; -} - -@-webkit-keyframes swing { - 20% { - -webkit-transform: rotate3d(0, 0, 1, 15deg); - transform: rotate3d(0, 0, 1, 15deg); - } - 40% { - -webkit-transform: rotate3d(0, 0, 1, -10deg); - transform: rotate3d(0, 0, 1, -10deg); - } - 60% { - -webkit-transform: rotate3d(0, 0, 1, 5deg); - transform: rotate3d(0, 0, 1, 5deg); - } - 80% { - -webkit-transform: rotate3d(0, 0, 1, -5deg); - transform: rotate3d(0, 0, 1, -5deg); - } - to { - -webkit-transform: rotate3d(0, 0, 1, 0deg); - transform: rotate3d(0, 0, 1, 0deg); - } -} -@keyframes swing { - 20% { - -webkit-transform: rotate3d(0, 0, 1, 15deg); - transform: rotate3d(0, 0, 1, 15deg); - } - 40% { - -webkit-transform: rotate3d(0, 0, 1, -10deg); - transform: rotate3d(0, 0, 1, -10deg); - } - 60% { - -webkit-transform: rotate3d(0, 0, 1, 5deg); - transform: rotate3d(0, 0, 1, 5deg); - } - 80% { - -webkit-transform: rotate3d(0, 0, 1, -5deg); - transform: rotate3d(0, 0, 1, -5deg); - } - to { - -webkit-transform: rotate3d(0, 0, 1, 0deg); - transform: rotate3d(0, 0, 1, 0deg); - } -} -.animate__swing { - -webkit-transform-origin: top center; - transform-origin: top center; - -webkit-animation-name: swing; - animation-name: swing; -} - -@-webkit-keyframes tada { - from { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } - 10%, 20% { - -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); - transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); - } - 30%, 50%, 70%, 90% { - -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); - transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); - } - 40%, 60%, 80% { - -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); - transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); - } - to { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } -} -@keyframes tada { - from { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } - 10%, 20% { - -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); - transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); - } - 30%, 50%, 70%, 90% { - -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); - transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); - } - 40%, 60%, 80% { - -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); - transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); - } - to { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } -} -.animate__tada { - -webkit-animation-name: tada; - animation-name: tada; -} - -/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ -@-webkit-keyframes wobble { - from { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - 15% { - -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); - transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); - } - 30% { - -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); - transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); - } - 45% { - -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); - transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); - } - 60% { - -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); - transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); - } - 75% { - -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); - transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -@keyframes wobble { - from { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - 15% { - -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); - transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); - } - 30% { - -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); - transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); - } - 45% { - -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); - transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); - } - 60% { - -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); - transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); - } - 75% { - -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); - transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -.animate__wobble { - -webkit-animation-name: wobble; - animation-name: wobble; -} - -@-webkit-keyframes jello { - from, 11.1%, to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - 22.2% { - -webkit-transform: skewX(-12.5deg) skewY(-12.5deg); - transform: skewX(-12.5deg) skewY(-12.5deg); - } - 33.3% { - -webkit-transform: skewX(6.25deg) skewY(6.25deg); - transform: skewX(6.25deg) skewY(6.25deg); - } - 44.4% { - -webkit-transform: skewX(-3.125deg) skewY(-3.125deg); - transform: skewX(-3.125deg) skewY(-3.125deg); - } - 55.5% { - -webkit-transform: skewX(1.5625deg) skewY(1.5625deg); - transform: skewX(1.5625deg) skewY(1.5625deg); - } - 66.6% { - -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg); - transform: skewX(-0.78125deg) skewY(-0.78125deg); - } - 77.7% { - -webkit-transform: skewX(0.390625deg) skewY(0.390625deg); - transform: skewX(0.390625deg) skewY(0.390625deg); - } - 88.8% { - -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg); - transform: skewX(-0.1953125deg) skewY(-0.1953125deg); - } -} -@keyframes jello { - from, 11.1%, to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - 22.2% { - -webkit-transform: skewX(-12.5deg) skewY(-12.5deg); - transform: skewX(-12.5deg) skewY(-12.5deg); - } - 33.3% { - -webkit-transform: skewX(6.25deg) skewY(6.25deg); - transform: skewX(6.25deg) skewY(6.25deg); - } - 44.4% { - -webkit-transform: skewX(-3.125deg) skewY(-3.125deg); - transform: skewX(-3.125deg) skewY(-3.125deg); - } - 55.5% { - -webkit-transform: skewX(1.5625deg) skewY(1.5625deg); - transform: skewX(1.5625deg) skewY(1.5625deg); - } - 66.6% { - -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg); - transform: skewX(-0.78125deg) skewY(-0.78125deg); - } - 77.7% { - -webkit-transform: skewX(0.390625deg) skewY(0.390625deg); - transform: skewX(0.390625deg) skewY(0.390625deg); - } - 88.8% { - -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg); - transform: skewX(-0.1953125deg) skewY(-0.1953125deg); - } -} -.animate__jello { - -webkit-animation-name: jello; - animation-name: jello; - -webkit-transform-origin: center; - transform-origin: center; -} - -@-webkit-keyframes heartBeat { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - } - 14% { - -webkit-transform: scale(1.3); - transform: scale(1.3); - } - 28% { - -webkit-transform: scale(1); - transform: scale(1); - } - 42% { - -webkit-transform: scale(1.3); - transform: scale(1.3); - } - 70% { - -webkit-transform: scale(1); - transform: scale(1); - } -} -@keyframes heartBeat { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - } - 14% { - -webkit-transform: scale(1.3); - transform: scale(1.3); - } - 28% { - -webkit-transform: scale(1); - transform: scale(1); - } - 42% { - -webkit-transform: scale(1.3); - transform: scale(1.3); - } - 70% { - -webkit-transform: scale(1); - transform: scale(1); - } -} -.animate__heartBeat { - -webkit-animation-name: heartBeat; - animation-name: heartBeat; - -webkit-animation-duration: 1.3s; - animation-duration: 1.3s; - -webkit-animation-duration: calc(var(--animate-duration) * 1.3); - animation-duration: calc(var(--animate-duration) * 1.3); - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; -} - -/* Back entrances */ -@-webkit-keyframes backInDown { - 0% { - -webkit-transform: translateY(-1200px) scale(0.7); - transform: translateY(-1200px) scale(0.7); - opacity: 0.7; - } - 80% { - -webkit-transform: translateY(0px) scale(0.7); - transform: translateY(0px) scale(0.7); - opacity: 0.7; - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 1; - } -} -@keyframes backInDown { - 0% { - -webkit-transform: translateY(-1200px) scale(0.7); - transform: translateY(-1200px) scale(0.7); - opacity: 0.7; - } - 80% { - -webkit-transform: translateY(0px) scale(0.7); - transform: translateY(0px) scale(0.7); - opacity: 0.7; - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 1; - } -} -.animate__backInDown { - -webkit-animation-name: backInDown; - animation-name: backInDown; -} - -@-webkit-keyframes backInLeft { - 0% { - -webkit-transform: translateX(-2000px) scale(0.7); - transform: translateX(-2000px) scale(0.7); - opacity: 0.7; - } - 80% { - -webkit-transform: translateX(0px) scale(0.7); - transform: translateX(0px) scale(0.7); - opacity: 0.7; - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 1; - } -} -@keyframes backInLeft { - 0% { - -webkit-transform: translateX(-2000px) scale(0.7); - transform: translateX(-2000px) scale(0.7); - opacity: 0.7; - } - 80% { - -webkit-transform: translateX(0px) scale(0.7); - transform: translateX(0px) scale(0.7); - opacity: 0.7; - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 1; - } -} -.animate__backInLeft { - -webkit-animation-name: backInLeft; - animation-name: backInLeft; -} - -@-webkit-keyframes backInRight { - 0% { - -webkit-transform: translateX(2000px) scale(0.7); - transform: translateX(2000px) scale(0.7); - opacity: 0.7; - } - 80% { - -webkit-transform: translateX(0px) scale(0.7); - transform: translateX(0px) scale(0.7); - opacity: 0.7; - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 1; - } -} -@keyframes backInRight { - 0% { - -webkit-transform: translateX(2000px) scale(0.7); - transform: translateX(2000px) scale(0.7); - opacity: 0.7; - } - 80% { - -webkit-transform: translateX(0px) scale(0.7); - transform: translateX(0px) scale(0.7); - opacity: 0.7; - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 1; - } -} -.animate__backInRight { - -webkit-animation-name: backInRight; - animation-name: backInRight; -} - -@-webkit-keyframes backInUp { - 0% { - -webkit-transform: translateY(1200px) scale(0.7); - transform: translateY(1200px) scale(0.7); - opacity: 0.7; - } - 80% { - -webkit-transform: translateY(0px) scale(0.7); - transform: translateY(0px) scale(0.7); - opacity: 0.7; - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 1; - } -} -@keyframes backInUp { - 0% { - -webkit-transform: translateY(1200px) scale(0.7); - transform: translateY(1200px) scale(0.7); - opacity: 0.7; - } - 80% { - -webkit-transform: translateY(0px) scale(0.7); - transform: translateY(0px) scale(0.7); - opacity: 0.7; - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 1; - } -} -.animate__backInUp { - -webkit-animation-name: backInUp; - animation-name: backInUp; -} - -/* Back exits */ -@-webkit-keyframes backOutDown { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 1; - } - 20% { - -webkit-transform: translateY(0px) scale(0.7); - transform: translateY(0px) scale(0.7); - opacity: 0.7; - } - 100% { - -webkit-transform: translateY(700px) scale(0.7); - transform: translateY(700px) scale(0.7); - opacity: 0.7; - } -} -@keyframes backOutDown { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 1; - } - 20% { - -webkit-transform: translateY(0px) scale(0.7); - transform: translateY(0px) scale(0.7); - opacity: 0.7; - } - 100% { - -webkit-transform: translateY(700px) scale(0.7); - transform: translateY(700px) scale(0.7); - opacity: 0.7; - } -} -.animate__backOutDown { - -webkit-animation-name: backOutDown; - animation-name: backOutDown; -} - -@-webkit-keyframes backOutLeft { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 1; - } - 20% { - -webkit-transform: translateX(0px) scale(0.7); - transform: translateX(0px) scale(0.7); - opacity: 0.7; - } - 100% { - -webkit-transform: translateX(-2000px) scale(0.7); - transform: translateX(-2000px) scale(0.7); - opacity: 0.7; - } -} -@keyframes backOutLeft { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 1; - } - 20% { - -webkit-transform: translateX(0px) scale(0.7); - transform: translateX(0px) scale(0.7); - opacity: 0.7; - } - 100% { - -webkit-transform: translateX(-2000px) scale(0.7); - transform: translateX(-2000px) scale(0.7); - opacity: 0.7; - } -} -.animate__backOutLeft { - -webkit-animation-name: backOutLeft; - animation-name: backOutLeft; -} - -@-webkit-keyframes backOutRight { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 1; - } - 20% { - -webkit-transform: translateX(0px) scale(0.7); - transform: translateX(0px) scale(0.7); - opacity: 0.7; - } - 100% { - -webkit-transform: translateX(2000px) scale(0.7); - transform: translateX(2000px) scale(0.7); - opacity: 0.7; - } -} -@keyframes backOutRight { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 1; - } - 20% { - -webkit-transform: translateX(0px) scale(0.7); - transform: translateX(0px) scale(0.7); - opacity: 0.7; - } - 100% { - -webkit-transform: translateX(2000px) scale(0.7); - transform: translateX(2000px) scale(0.7); - opacity: 0.7; - } -} -.animate__backOutRight { - -webkit-animation-name: backOutRight; - animation-name: backOutRight; -} - -@-webkit-keyframes backOutUp { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 1; - } - 20% { - -webkit-transform: translateY(0px) scale(0.7); - transform: translateY(0px) scale(0.7); - opacity: 0.7; - } - 100% { - -webkit-transform: translateY(-700px) scale(0.7); - transform: translateY(-700px) scale(0.7); - opacity: 0.7; - } -} -@keyframes backOutUp { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 1; - } - 20% { - -webkit-transform: translateY(0px) scale(0.7); - transform: translateY(0px) scale(0.7); - opacity: 0.7; - } - 100% { - -webkit-transform: translateY(-700px) scale(0.7); - transform: translateY(-700px) scale(0.7); - opacity: 0.7; - } -} -.animate__backOutUp { - -webkit-animation-name: backOutUp; - animation-name: backOutUp; -} - -/* Bouncing entrances */ -@-webkit-keyframes bounceIn { - from, 20%, 40%, 60%, 80%, to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - 0% { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } - 20% { - -webkit-transform: scale3d(1.1, 1.1, 1.1); - transform: scale3d(1.1, 1.1, 1.1); - } - 40% { - -webkit-transform: scale3d(0.9, 0.9, 0.9); - transform: scale3d(0.9, 0.9, 0.9); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(1.03, 1.03, 1.03); - transform: scale3d(1.03, 1.03, 1.03); - } - 80% { - -webkit-transform: scale3d(0.97, 0.97, 0.97); - transform: scale3d(0.97, 0.97, 0.97); - } - to { - opacity: 1; - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } -} -@keyframes bounceIn { - from, 20%, 40%, 60%, 80%, to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - 0% { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } - 20% { - -webkit-transform: scale3d(1.1, 1.1, 1.1); - transform: scale3d(1.1, 1.1, 1.1); - } - 40% { - -webkit-transform: scale3d(0.9, 0.9, 0.9); - transform: scale3d(0.9, 0.9, 0.9); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(1.03, 1.03, 1.03); - transform: scale3d(1.03, 1.03, 1.03); - } - 80% { - -webkit-transform: scale3d(0.97, 0.97, 0.97); - transform: scale3d(0.97, 0.97, 0.97); - } - to { - opacity: 1; - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } -} -.animate__bounceIn { - -webkit-animation-duration: 0.75s; - animation-duration: 0.75s; - -webkit-animation-duration: calc(var(--animate-duration) * 0.75); - animation-duration: calc(var(--animate-duration) * 0.75); - -webkit-animation-name: bounceIn; - animation-name: bounceIn; -} - -@-webkit-keyframes bounceInDown { - from, 60%, 75%, 90%, to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - 0% { - opacity: 0; - -webkit-transform: translate3d(0, -3000px, 0) scaleY(3); - transform: translate3d(0, -3000px, 0) scaleY(3); - } - 60% { - opacity: 1; - -webkit-transform: translate3d(0, 25px, 0) scaleY(0.9); - transform: translate3d(0, 25px, 0) scaleY(0.9); - } - 75% { - -webkit-transform: translate3d(0, -10px, 0) scaleY(0.95); - transform: translate3d(0, -10px, 0) scaleY(0.95); - } - 90% { - -webkit-transform: translate3d(0, 5px, 0) scaleY(0.985); - transform: translate3d(0, 5px, 0) scaleY(0.985); - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -@keyframes bounceInDown { - from, 60%, 75%, 90%, to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - 0% { - opacity: 0; - -webkit-transform: translate3d(0, -3000px, 0) scaleY(3); - transform: translate3d(0, -3000px, 0) scaleY(3); - } - 60% { - opacity: 1; - -webkit-transform: translate3d(0, 25px, 0) scaleY(0.9); - transform: translate3d(0, 25px, 0) scaleY(0.9); - } - 75% { - -webkit-transform: translate3d(0, -10px, 0) scaleY(0.95); - transform: translate3d(0, -10px, 0) scaleY(0.95); - } - 90% { - -webkit-transform: translate3d(0, 5px, 0) scaleY(0.985); - transform: translate3d(0, 5px, 0) scaleY(0.985); - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -.animate__bounceInDown { - -webkit-animation-name: bounceInDown; - animation-name: bounceInDown; -} - -@-webkit-keyframes bounceInLeft { - from, 60%, 75%, 90%, to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - 0% { - opacity: 0; - -webkit-transform: translate3d(-3000px, 0, 0) scaleX(3); - transform: translate3d(-3000px, 0, 0) scaleX(3); - } - 60% { - opacity: 1; - -webkit-transform: translate3d(25px, 0, 0) scaleX(1); - transform: translate3d(25px, 0, 0) scaleX(1); - } - 75% { - -webkit-transform: translate3d(-10px, 0, 0) scaleX(0.98); - transform: translate3d(-10px, 0, 0) scaleX(0.98); - } - 90% { - -webkit-transform: translate3d(5px, 0, 0) scaleX(0.995); - transform: translate3d(5px, 0, 0) scaleX(0.995); - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -@keyframes bounceInLeft { - from, 60%, 75%, 90%, to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - 0% { - opacity: 0; - -webkit-transform: translate3d(-3000px, 0, 0) scaleX(3); - transform: translate3d(-3000px, 0, 0) scaleX(3); - } - 60% { - opacity: 1; - -webkit-transform: translate3d(25px, 0, 0) scaleX(1); - transform: translate3d(25px, 0, 0) scaleX(1); - } - 75% { - -webkit-transform: translate3d(-10px, 0, 0) scaleX(0.98); - transform: translate3d(-10px, 0, 0) scaleX(0.98); - } - 90% { - -webkit-transform: translate3d(5px, 0, 0) scaleX(0.995); - transform: translate3d(5px, 0, 0) scaleX(0.995); - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -.animate__bounceInLeft { - -webkit-animation-name: bounceInLeft; - animation-name: bounceInLeft; -} - -@-webkit-keyframes bounceInRight { - from, 60%, 75%, 90%, to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - from { - opacity: 0; - -webkit-transform: translate3d(3000px, 0, 0) scaleX(3); - transform: translate3d(3000px, 0, 0) scaleX(3); - } - 60% { - opacity: 1; - -webkit-transform: translate3d(-25px, 0, 0) scaleX(1); - transform: translate3d(-25px, 0, 0) scaleX(1); - } - 75% { - -webkit-transform: translate3d(10px, 0, 0) scaleX(0.98); - transform: translate3d(10px, 0, 0) scaleX(0.98); - } - 90% { - -webkit-transform: translate3d(-5px, 0, 0) scaleX(0.995); - transform: translate3d(-5px, 0, 0) scaleX(0.995); - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -@keyframes bounceInRight { - from, 60%, 75%, 90%, to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - from { - opacity: 0; - -webkit-transform: translate3d(3000px, 0, 0) scaleX(3); - transform: translate3d(3000px, 0, 0) scaleX(3); - } - 60% { - opacity: 1; - -webkit-transform: translate3d(-25px, 0, 0) scaleX(1); - transform: translate3d(-25px, 0, 0) scaleX(1); - } - 75% { - -webkit-transform: translate3d(10px, 0, 0) scaleX(0.98); - transform: translate3d(10px, 0, 0) scaleX(0.98); - } - 90% { - -webkit-transform: translate3d(-5px, 0, 0) scaleX(0.995); - transform: translate3d(-5px, 0, 0) scaleX(0.995); - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -.animate__bounceInRight { - -webkit-animation-name: bounceInRight; - animation-name: bounceInRight; -} - -@-webkit-keyframes bounceInUp { - from, 60%, 75%, 90%, to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - from { - opacity: 0; - -webkit-transform: translate3d(0, 3000px, 0) scaleY(5); - transform: translate3d(0, 3000px, 0) scaleY(5); - } - 60% { - opacity: 1; - -webkit-transform: translate3d(0, -20px, 0) scaleY(0.9); - transform: translate3d(0, -20px, 0) scaleY(0.9); - } - 75% { - -webkit-transform: translate3d(0, 10px, 0) scaleY(0.95); - transform: translate3d(0, 10px, 0) scaleY(0.95); - } - 90% { - -webkit-transform: translate3d(0, -5px, 0) scaleY(0.985); - transform: translate3d(0, -5px, 0) scaleY(0.985); - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -@keyframes bounceInUp { - from, 60%, 75%, 90%, to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - from { - opacity: 0; - -webkit-transform: translate3d(0, 3000px, 0) scaleY(5); - transform: translate3d(0, 3000px, 0) scaleY(5); - } - 60% { - opacity: 1; - -webkit-transform: translate3d(0, -20px, 0) scaleY(0.9); - transform: translate3d(0, -20px, 0) scaleY(0.9); - } - 75% { - -webkit-transform: translate3d(0, 10px, 0) scaleY(0.95); - transform: translate3d(0, 10px, 0) scaleY(0.95); - } - 90% { - -webkit-transform: translate3d(0, -5px, 0) scaleY(0.985); - transform: translate3d(0, -5px, 0) scaleY(0.985); - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -.animate__bounceInUp { - -webkit-animation-name: bounceInUp; - animation-name: bounceInUp; -} - -/* Bouncing exits */ -@-webkit-keyframes bounceOut { - 20% { - -webkit-transform: scale3d(0.9, 0.9, 0.9); - transform: scale3d(0.9, 0.9, 0.9); - } - 50%, 55% { - opacity: 1; - -webkit-transform: scale3d(1.1, 1.1, 1.1); - transform: scale3d(1.1, 1.1, 1.1); - } - to { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } -} -@keyframes bounceOut { - 20% { - -webkit-transform: scale3d(0.9, 0.9, 0.9); - transform: scale3d(0.9, 0.9, 0.9); - } - 50%, 55% { - opacity: 1; - -webkit-transform: scale3d(1.1, 1.1, 1.1); - transform: scale3d(1.1, 1.1, 1.1); - } - to { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } -} -.animate__bounceOut { - -webkit-animation-duration: 0.75s; - animation-duration: 0.75s; - -webkit-animation-duration: calc(var(--animate-duration) * 0.75); - animation-duration: calc(var(--animate-duration) * 0.75); - -webkit-animation-name: bounceOut; - animation-name: bounceOut; -} - -@-webkit-keyframes bounceOutDown { - 20% { - -webkit-transform: translate3d(0, 10px, 0) scaleY(0.985); - transform: translate3d(0, 10px, 0) scaleY(0.985); - } - 40%, 45% { - opacity: 1; - -webkit-transform: translate3d(0, -20px, 0) scaleY(0.9); - transform: translate3d(0, -20px, 0) scaleY(0.9); - } - to { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0) scaleY(3); - transform: translate3d(0, 2000px, 0) scaleY(3); - } -} -@keyframes bounceOutDown { - 20% { - -webkit-transform: translate3d(0, 10px, 0) scaleY(0.985); - transform: translate3d(0, 10px, 0) scaleY(0.985); - } - 40%, 45% { - opacity: 1; - -webkit-transform: translate3d(0, -20px, 0) scaleY(0.9); - transform: translate3d(0, -20px, 0) scaleY(0.9); - } - to { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0) scaleY(3); - transform: translate3d(0, 2000px, 0) scaleY(3); - } -} -.animate__bounceOutDown { - -webkit-animation-name: bounceOutDown; - animation-name: bounceOutDown; -} - -@-webkit-keyframes bounceOutLeft { - 20% { - opacity: 1; - -webkit-transform: translate3d(20px, 0, 0) scaleX(0.9); - transform: translate3d(20px, 0, 0) scaleX(0.9); - } - to { - opacity: 0; - -webkit-transform: translate3d(-2000px, 0, 0) scaleX(2); - transform: translate3d(-2000px, 0, 0) scaleX(2); - } -} -@keyframes bounceOutLeft { - 20% { - opacity: 1; - -webkit-transform: translate3d(20px, 0, 0) scaleX(0.9); - transform: translate3d(20px, 0, 0) scaleX(0.9); - } - to { - opacity: 0; - -webkit-transform: translate3d(-2000px, 0, 0) scaleX(2); - transform: translate3d(-2000px, 0, 0) scaleX(2); - } -} -.animate__bounceOutLeft { - -webkit-animation-name: bounceOutLeft; - animation-name: bounceOutLeft; -} - -@-webkit-keyframes bounceOutRight { - 20% { - opacity: 1; - -webkit-transform: translate3d(-20px, 0, 0) scaleX(0.9); - transform: translate3d(-20px, 0, 0) scaleX(0.9); - } - to { - opacity: 0; - -webkit-transform: translate3d(2000px, 0, 0) scaleX(2); - transform: translate3d(2000px, 0, 0) scaleX(2); - } -} -@keyframes bounceOutRight { - 20% { - opacity: 1; - -webkit-transform: translate3d(-20px, 0, 0) scaleX(0.9); - transform: translate3d(-20px, 0, 0) scaleX(0.9); - } - to { - opacity: 0; - -webkit-transform: translate3d(2000px, 0, 0) scaleX(2); - transform: translate3d(2000px, 0, 0) scaleX(2); - } -} -.animate__bounceOutRight { - -webkit-animation-name: bounceOutRight; - animation-name: bounceOutRight; -} - -@-webkit-keyframes bounceOutUp { - 20% { - -webkit-transform: translate3d(0, -10px, 0) scaleY(0.985); - transform: translate3d(0, -10px, 0) scaleY(0.985); - } - 40%, 45% { - opacity: 1; - -webkit-transform: translate3d(0, 20px, 0) scaleY(0.9); - transform: translate3d(0, 20px, 0) scaleY(0.9); - } - to { - opacity: 0; - -webkit-transform: translate3d(0, -2000px, 0) scaleY(3); - transform: translate3d(0, -2000px, 0) scaleY(3); - } -} -@keyframes bounceOutUp { - 20% { - -webkit-transform: translate3d(0, -10px, 0) scaleY(0.985); - transform: translate3d(0, -10px, 0) scaleY(0.985); - } - 40%, 45% { - opacity: 1; - -webkit-transform: translate3d(0, 20px, 0) scaleY(0.9); - transform: translate3d(0, 20px, 0) scaleY(0.9); - } - to { - opacity: 0; - -webkit-transform: translate3d(0, -2000px, 0) scaleY(3); - transform: translate3d(0, -2000px, 0) scaleY(3); - } -} -.animate__bounceOutUp { - -webkit-animation-name: bounceOutUp; - animation-name: bounceOutUp; -} - -/* Fading entrances */ -@-webkit-keyframes fadeIn { - from { - opacity: 0; - } - to { - opacity: 1; - } -} -@keyframes fadeIn { - from { - opacity: 0; - } - to { - opacity: 1; - } -} -.animate__fadeIn { - -webkit-animation-name: fadeIn; - animation-name: fadeIn; -} - -@-webkit-keyframes fadeInDown { - from { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -@keyframes fadeInDown { - from { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -.animate__fadeInDown { - -webkit-animation-name: fadeInDown; - animation-name: fadeInDown; -} - -@-webkit-keyframes fadeInDownBig { - from { - opacity: 0; - -webkit-transform: translate3d(0, -2000px, 0); - transform: translate3d(0, -2000px, 0); - } - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -@keyframes fadeInDownBig { - from { - opacity: 0; - -webkit-transform: translate3d(0, -2000px, 0); - transform: translate3d(0, -2000px, 0); - } - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -.animate__fadeInDownBig { - -webkit-animation-name: fadeInDownBig; - animation-name: fadeInDownBig; -} - -@-webkit-keyframes fadeInLeft { - from { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -@keyframes fadeInLeft { - from { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -.animate__fadeInLeft { - -webkit-animation-name: fadeInLeft; - animation-name: fadeInLeft; -} - -@-webkit-keyframes fadeInLeftBig { - from { - opacity: 0; - -webkit-transform: translate3d(-2000px, 0, 0); - transform: translate3d(-2000px, 0, 0); - } - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -@keyframes fadeInLeftBig { - from { - opacity: 0; - -webkit-transform: translate3d(-2000px, 0, 0); - transform: translate3d(-2000px, 0, 0); - } - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -.animate__fadeInLeftBig { - -webkit-animation-name: fadeInLeftBig; - animation-name: fadeInLeftBig; -} - -@-webkit-keyframes fadeInRight { - from { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -@keyframes fadeInRight { - from { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -.animate__fadeInRight { - -webkit-animation-name: fadeInRight; - animation-name: fadeInRight; -} - -@-webkit-keyframes fadeInRightBig { - from { - opacity: 0; - -webkit-transform: translate3d(2000px, 0, 0); - transform: translate3d(2000px, 0, 0); - } - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -@keyframes fadeInRightBig { - from { - opacity: 0; - -webkit-transform: translate3d(2000px, 0, 0); - transform: translate3d(2000px, 0, 0); - } - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -.animate__fadeInRightBig { - -webkit-animation-name: fadeInRightBig; - animation-name: fadeInRightBig; -} - -@-webkit-keyframes fadeInUp { - from { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -@keyframes fadeInUp { - from { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -.animate__fadeInUp { - -webkit-animation-name: fadeInUp; - animation-name: fadeInUp; -} - -@-webkit-keyframes fadeInUpBig { - from { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0); - transform: translate3d(0, 2000px, 0); - } - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -@keyframes fadeInUpBig { - from { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0); - transform: translate3d(0, 2000px, 0); - } - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -.animate__fadeInUpBig { - -webkit-animation-name: fadeInUpBig; - animation-name: fadeInUpBig; -} - -@-webkit-keyframes fadeInTopLeft { - from { - opacity: 0; - -webkit-transform: translate3d(-100%, -100%, 0); - transform: translate3d(-100%, -100%, 0); - } - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -@keyframes fadeInTopLeft { - from { - opacity: 0; - -webkit-transform: translate3d(-100%, -100%, 0); - transform: translate3d(-100%, -100%, 0); - } - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -.animate__fadeInTopLeft { - -webkit-animation-name: fadeInTopLeft; - animation-name: fadeInTopLeft; -} - -@-webkit-keyframes fadeInTopRight { - from { - opacity: 0; - -webkit-transform: translate3d(100%, -100%, 0); - transform: translate3d(100%, -100%, 0); - } - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -@keyframes fadeInTopRight { - from { - opacity: 0; - -webkit-transform: translate3d(100%, -100%, 0); - transform: translate3d(100%, -100%, 0); - } - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -.animate__fadeInTopRight { - -webkit-animation-name: fadeInTopRight; - animation-name: fadeInTopRight; -} - -@-webkit-keyframes fadeInBottomLeft { - from { - opacity: 0; - -webkit-transform: translate3d(-100%, 100%, 0); - transform: translate3d(-100%, 100%, 0); - } - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -@keyframes fadeInBottomLeft { - from { - opacity: 0; - -webkit-transform: translate3d(-100%, 100%, 0); - transform: translate3d(-100%, 100%, 0); - } - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -.animate__fadeInBottomLeft { - -webkit-animation-name: fadeInBottomLeft; - animation-name: fadeInBottomLeft; -} - -@-webkit-keyframes fadeInBottomRight { - from { - opacity: 0; - -webkit-transform: translate3d(100%, 100%, 0); - transform: translate3d(100%, 100%, 0); - } - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -@keyframes fadeInBottomRight { - from { - opacity: 0; - -webkit-transform: translate3d(100%, 100%, 0); - transform: translate3d(100%, 100%, 0); - } - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -.animate__fadeInBottomRight { - -webkit-animation-name: fadeInBottomRight; - animation-name: fadeInBottomRight; -} - -/* Fading exits */ -@-webkit-keyframes fadeOut { - from { - opacity: 1; - } - to { - opacity: 0; - } -} -@keyframes fadeOut { - from { - opacity: 1; - } - to { - opacity: 0; - } -} -.animate__fadeOut { - -webkit-animation-name: fadeOut; - animation-name: fadeOut; -} - -@-webkit-keyframes fadeOutDown { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } -} -@keyframes fadeOutDown { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } -} -.animate__fadeOutDown { - -webkit-animation-name: fadeOutDown; - animation-name: fadeOutDown; -} - -@-webkit-keyframes fadeOutDownBig { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0); - transform: translate3d(0, 2000px, 0); - } -} -@keyframes fadeOutDownBig { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0); - transform: translate3d(0, 2000px, 0); - } -} -.animate__fadeOutDownBig { - -webkit-animation-name: fadeOutDownBig; - animation-name: fadeOutDownBig; -} - -@-webkit-keyframes fadeOutLeft { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } -} -@keyframes fadeOutLeft { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } -} -.animate__fadeOutLeft { - -webkit-animation-name: fadeOutLeft; - animation-name: fadeOutLeft; -} - -@-webkit-keyframes fadeOutLeftBig { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(-2000px, 0, 0); - transform: translate3d(-2000px, 0, 0); - } -} -@keyframes fadeOutLeftBig { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(-2000px, 0, 0); - transform: translate3d(-2000px, 0, 0); - } -} -.animate__fadeOutLeftBig { - -webkit-animation-name: fadeOutLeftBig; - animation-name: fadeOutLeftBig; -} - -@-webkit-keyframes fadeOutRight { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } -} -@keyframes fadeOutRight { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } -} -.animate__fadeOutRight { - -webkit-animation-name: fadeOutRight; - animation-name: fadeOutRight; -} - -@-webkit-keyframes fadeOutRightBig { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(2000px, 0, 0); - transform: translate3d(2000px, 0, 0); - } -} -@keyframes fadeOutRightBig { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(2000px, 0, 0); - transform: translate3d(2000px, 0, 0); - } -} -.animate__fadeOutRightBig { - -webkit-animation-name: fadeOutRightBig; - animation-name: fadeOutRightBig; -} - -@-webkit-keyframes fadeOutUp { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } -} -@keyframes fadeOutUp { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } -} -.animate__fadeOutUp { - -webkit-animation-name: fadeOutUp; - animation-name: fadeOutUp; -} - -@-webkit-keyframes fadeOutUpBig { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(0, -2000px, 0); - transform: translate3d(0, -2000px, 0); - } -} -@keyframes fadeOutUpBig { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(0, -2000px, 0); - transform: translate3d(0, -2000px, 0); - } -} -.animate__fadeOutUpBig { - -webkit-animation-name: fadeOutUpBig; - animation-name: fadeOutUpBig; -} - -@-webkit-keyframes fadeOutTopLeft { - from { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - to { - opacity: 0; - -webkit-transform: translate3d(-100%, -100%, 0); - transform: translate3d(-100%, -100%, 0); - } -} -@keyframes fadeOutTopLeft { - from { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - to { - opacity: 0; - -webkit-transform: translate3d(-100%, -100%, 0); - transform: translate3d(-100%, -100%, 0); - } -} -.animate__fadeOutTopLeft { - -webkit-animation-name: fadeOutTopLeft; - animation-name: fadeOutTopLeft; -} - -@-webkit-keyframes fadeOutTopRight { - from { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - to { - opacity: 0; - -webkit-transform: translate3d(100%, -100%, 0); - transform: translate3d(100%, -100%, 0); - } -} -@keyframes fadeOutTopRight { - from { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - to { - opacity: 0; - -webkit-transform: translate3d(100%, -100%, 0); - transform: translate3d(100%, -100%, 0); - } -} -.animate__fadeOutTopRight { - -webkit-animation-name: fadeOutTopRight; - animation-name: fadeOutTopRight; -} - -@-webkit-keyframes fadeOutBottomRight { - from { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - to { - opacity: 0; - -webkit-transform: translate3d(100%, 100%, 0); - transform: translate3d(100%, 100%, 0); - } -} -@keyframes fadeOutBottomRight { - from { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - to { - opacity: 0; - -webkit-transform: translate3d(100%, 100%, 0); - transform: translate3d(100%, 100%, 0); - } -} -.animate__fadeOutBottomRight { - -webkit-animation-name: fadeOutBottomRight; - animation-name: fadeOutBottomRight; -} - -@-webkit-keyframes fadeOutBottomLeft { - from { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - to { - opacity: 0; - -webkit-transform: translate3d(-100%, 100%, 0); - transform: translate3d(-100%, 100%, 0); - } -} -@keyframes fadeOutBottomLeft { - from { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - to { - opacity: 0; - -webkit-transform: translate3d(-100%, 100%, 0); - transform: translate3d(-100%, 100%, 0); - } -} -.animate__fadeOutBottomLeft { - -webkit-animation-name: fadeOutBottomLeft; - animation-name: fadeOutBottomLeft; -} - -/* Flippers */ -@-webkit-keyframes flip { - from { - -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -360deg); - transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -360deg); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - 40% { - -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); - transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - 50% { - -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); - transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 80% { - -webkit-transform: perspective(400px) scale3d(0.95, 0.95, 0.95) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); - transform: perspective(400px) scale3d(0.95, 0.95, 0.95) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - to { - -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); - transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } -} -@keyframes flip { - from { - -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -360deg); - transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -360deg); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - 40% { - -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); - transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - 50% { - -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); - transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 80% { - -webkit-transform: perspective(400px) scale3d(0.95, 0.95, 0.95) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); - transform: perspective(400px) scale3d(0.95, 0.95, 0.95) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - to { - -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); - transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } -} -.animate__animated.animate__flip { - -webkit-backface-visibility: visible; - backface-visibility: visible; - -webkit-animation-name: flip; - animation-name: flip; -} - -@-webkit-keyframes flipInX { - from { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); - transform: perspective(400px) rotate3d(1, 0, 0, 90deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - opacity: 0; - } - 40% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); - transform: perspective(400px) rotate3d(1, 0, 0, -20deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 60% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); - transform: perspective(400px) rotate3d(1, 0, 0, 10deg); - opacity: 1; - } - 80% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); - transform: perspective(400px) rotate3d(1, 0, 0, -5deg); - } - to { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } -} -@keyframes flipInX { - from { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); - transform: perspective(400px) rotate3d(1, 0, 0, 90deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - opacity: 0; - } - 40% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); - transform: perspective(400px) rotate3d(1, 0, 0, -20deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 60% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); - transform: perspective(400px) rotate3d(1, 0, 0, 10deg); - opacity: 1; - } - 80% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); - transform: perspective(400px) rotate3d(1, 0, 0, -5deg); - } - to { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } -} -.animate__flipInX { - -webkit-backface-visibility: visible !important; - backface-visibility: visible !important; - -webkit-animation-name: flipInX; - animation-name: flipInX; -} - -@-webkit-keyframes flipInY { - from { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); - transform: perspective(400px) rotate3d(0, 1, 0, 90deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - opacity: 0; - } - 40% { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); - transform: perspective(400px) rotate3d(0, 1, 0, -20deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 60% { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); - transform: perspective(400px) rotate3d(0, 1, 0, 10deg); - opacity: 1; - } - 80% { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); - transform: perspective(400px) rotate3d(0, 1, 0, -5deg); - } - to { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } -} -@keyframes flipInY { - from { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); - transform: perspective(400px) rotate3d(0, 1, 0, 90deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - opacity: 0; - } - 40% { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); - transform: perspective(400px) rotate3d(0, 1, 0, -20deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 60% { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); - transform: perspective(400px) rotate3d(0, 1, 0, 10deg); - opacity: 1; - } - 80% { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); - transform: perspective(400px) rotate3d(0, 1, 0, -5deg); - } - to { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } -} -.animate__flipInY { - -webkit-backface-visibility: visible !important; - backface-visibility: visible !important; - -webkit-animation-name: flipInY; - animation-name: flipInY; -} - -@-webkit-keyframes flipOutX { - from { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } - 30% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); - transform: perspective(400px) rotate3d(1, 0, 0, -20deg); - opacity: 1; - } - to { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); - transform: perspective(400px) rotate3d(1, 0, 0, 90deg); - opacity: 0; - } -} -@keyframes flipOutX { - from { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } - 30% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); - transform: perspective(400px) rotate3d(1, 0, 0, -20deg); - opacity: 1; - } - to { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); - transform: perspective(400px) rotate3d(1, 0, 0, 90deg); - opacity: 0; - } -} -.animate__flipOutX { - -webkit-animation-duration: 0.75s; - animation-duration: 0.75s; - -webkit-animation-duration: calc(var(--animate-duration) * 0.75); - animation-duration: calc(var(--animate-duration) * 0.75); - -webkit-animation-name: flipOutX; - animation-name: flipOutX; - -webkit-backface-visibility: visible !important; - backface-visibility: visible !important; -} - -@-webkit-keyframes flipOutY { - from { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } - 30% { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); - transform: perspective(400px) rotate3d(0, 1, 0, -15deg); - opacity: 1; - } - to { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); - transform: perspective(400px) rotate3d(0, 1, 0, 90deg); - opacity: 0; - } -} -@keyframes flipOutY { - from { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } - 30% { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); - transform: perspective(400px) rotate3d(0, 1, 0, -15deg); - opacity: 1; - } - to { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); - transform: perspective(400px) rotate3d(0, 1, 0, 90deg); - opacity: 0; - } -} -.animate__flipOutY { - -webkit-animation-duration: 0.75s; - animation-duration: 0.75s; - -webkit-animation-duration: calc(var(--animate-duration) * 0.75); - animation-duration: calc(var(--animate-duration) * 0.75); - -webkit-backface-visibility: visible !important; - backface-visibility: visible !important; - -webkit-animation-name: flipOutY; - animation-name: flipOutY; -} - -/* Lightspeed */ -@-webkit-keyframes lightSpeedInRight { - from { - -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); - transform: translate3d(100%, 0, 0) skewX(-30deg); - opacity: 0; - } - 60% { - -webkit-transform: skewX(20deg); - transform: skewX(20deg); - opacity: 1; - } - 80% { - -webkit-transform: skewX(-5deg); - transform: skewX(-5deg); - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -@keyframes lightSpeedInRight { - from { - -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); - transform: translate3d(100%, 0, 0) skewX(-30deg); - opacity: 0; - } - 60% { - -webkit-transform: skewX(20deg); - transform: skewX(20deg); - opacity: 1; - } - 80% { - -webkit-transform: skewX(-5deg); - transform: skewX(-5deg); - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -.animate__lightSpeedInRight { - -webkit-animation-name: lightSpeedInRight; - animation-name: lightSpeedInRight; - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; -} - -@-webkit-keyframes lightSpeedInLeft { - from { - -webkit-transform: translate3d(-100%, 0, 0) skewX(30deg); - transform: translate3d(-100%, 0, 0) skewX(30deg); - opacity: 0; - } - 60% { - -webkit-transform: skewX(-20deg); - transform: skewX(-20deg); - opacity: 1; - } - 80% { - -webkit-transform: skewX(5deg); - transform: skewX(5deg); - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -@keyframes lightSpeedInLeft { - from { - -webkit-transform: translate3d(-100%, 0, 0) skewX(30deg); - transform: translate3d(-100%, 0, 0) skewX(30deg); - opacity: 0; - } - 60% { - -webkit-transform: skewX(-20deg); - transform: skewX(-20deg); - opacity: 1; - } - 80% { - -webkit-transform: skewX(5deg); - transform: skewX(5deg); - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -.animate__lightSpeedInLeft { - -webkit-animation-name: lightSpeedInLeft; - animation-name: lightSpeedInLeft; - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; -} - -@-webkit-keyframes lightSpeedOutRight { - from { - opacity: 1; - } - to { - -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); - transform: translate3d(100%, 0, 0) skewX(30deg); - opacity: 0; - } -} -@keyframes lightSpeedOutRight { - from { - opacity: 1; - } - to { - -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); - transform: translate3d(100%, 0, 0) skewX(30deg); - opacity: 0; - } -} -.animate__lightSpeedOutRight { - -webkit-animation-name: lightSpeedOutRight; - animation-name: lightSpeedOutRight; - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; -} - -@-webkit-keyframes lightSpeedOutLeft { - from { - opacity: 1; - } - to { - -webkit-transform: translate3d(-100%, 0, 0) skewX(-30deg); - transform: translate3d(-100%, 0, 0) skewX(-30deg); - opacity: 0; - } -} -@keyframes lightSpeedOutLeft { - from { - opacity: 1; - } - to { - -webkit-transform: translate3d(-100%, 0, 0) skewX(-30deg); - transform: translate3d(-100%, 0, 0) skewX(-30deg); - opacity: 0; - } -} -.animate__lightSpeedOutLeft { - -webkit-animation-name: lightSpeedOutLeft; - animation-name: lightSpeedOutLeft; - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; -} - -/* Rotating entrances */ -@-webkit-keyframes rotateIn { - from { - -webkit-transform: rotate3d(0, 0, 1, -200deg); - transform: rotate3d(0, 0, 1, -200deg); - opacity: 0; - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - opacity: 1; - } -} -@keyframes rotateIn { - from { - -webkit-transform: rotate3d(0, 0, 1, -200deg); - transform: rotate3d(0, 0, 1, -200deg); - opacity: 0; - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - opacity: 1; - } -} -.animate__rotateIn { - -webkit-animation-name: rotateIn; - animation-name: rotateIn; - -webkit-transform-origin: center; - transform-origin: center; -} - -@-webkit-keyframes rotateInDownLeft { - from { - -webkit-transform: rotate3d(0, 0, 1, -45deg); - transform: rotate3d(0, 0, 1, -45deg); - opacity: 0; - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - opacity: 1; - } -} -@keyframes rotateInDownLeft { - from { - -webkit-transform: rotate3d(0, 0, 1, -45deg); - transform: rotate3d(0, 0, 1, -45deg); - opacity: 0; - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - opacity: 1; - } -} -.animate__rotateInDownLeft { - -webkit-animation-name: rotateInDownLeft; - animation-name: rotateInDownLeft; - -webkit-transform-origin: left bottom; - transform-origin: left bottom; -} - -@-webkit-keyframes rotateInDownRight { - from { - -webkit-transform: rotate3d(0, 0, 1, 45deg); - transform: rotate3d(0, 0, 1, 45deg); - opacity: 0; - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - opacity: 1; - } -} -@keyframes rotateInDownRight { - from { - -webkit-transform: rotate3d(0, 0, 1, 45deg); - transform: rotate3d(0, 0, 1, 45deg); - opacity: 0; - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - opacity: 1; - } -} -.animate__rotateInDownRight { - -webkit-animation-name: rotateInDownRight; - animation-name: rotateInDownRight; - -webkit-transform-origin: right bottom; - transform-origin: right bottom; -} - -@-webkit-keyframes rotateInUpLeft { - from { - -webkit-transform: rotate3d(0, 0, 1, 45deg); - transform: rotate3d(0, 0, 1, 45deg); - opacity: 0; - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - opacity: 1; - } -} -@keyframes rotateInUpLeft { - from { - -webkit-transform: rotate3d(0, 0, 1, 45deg); - transform: rotate3d(0, 0, 1, 45deg); - opacity: 0; - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - opacity: 1; - } -} -.animate__rotateInUpLeft { - -webkit-animation-name: rotateInUpLeft; - animation-name: rotateInUpLeft; - -webkit-transform-origin: left bottom; - transform-origin: left bottom; -} - -@-webkit-keyframes rotateInUpRight { - from { - -webkit-transform: rotate3d(0, 0, 1, -90deg); - transform: rotate3d(0, 0, 1, -90deg); - opacity: 0; - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - opacity: 1; - } -} -@keyframes rotateInUpRight { - from { - -webkit-transform: rotate3d(0, 0, 1, -90deg); - transform: rotate3d(0, 0, 1, -90deg); - opacity: 0; - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - opacity: 1; - } -} -.animate__rotateInUpRight { - -webkit-animation-name: rotateInUpRight; - animation-name: rotateInUpRight; - -webkit-transform-origin: right bottom; - transform-origin: right bottom; -} - -/* Rotating exits */ -@-webkit-keyframes rotateOut { - from { - opacity: 1; - } - to { - -webkit-transform: rotate3d(0, 0, 1, 200deg); - transform: rotate3d(0, 0, 1, 200deg); - opacity: 0; - } -} -@keyframes rotateOut { - from { - opacity: 1; - } - to { - -webkit-transform: rotate3d(0, 0, 1, 200deg); - transform: rotate3d(0, 0, 1, 200deg); - opacity: 0; - } -} -.animate__rotateOut { - -webkit-animation-name: rotateOut; - animation-name: rotateOut; - -webkit-transform-origin: center; - transform-origin: center; -} - -@-webkit-keyframes rotateOutDownLeft { - from { - opacity: 1; - } - to { - -webkit-transform: rotate3d(0, 0, 1, 45deg); - transform: rotate3d(0, 0, 1, 45deg); - opacity: 0; - } -} -@keyframes rotateOutDownLeft { - from { - opacity: 1; - } - to { - -webkit-transform: rotate3d(0, 0, 1, 45deg); - transform: rotate3d(0, 0, 1, 45deg); - opacity: 0; - } -} -.animate__rotateOutDownLeft { - -webkit-animation-name: rotateOutDownLeft; - animation-name: rotateOutDownLeft; - -webkit-transform-origin: left bottom; - transform-origin: left bottom; -} - -@-webkit-keyframes rotateOutDownRight { - from { - opacity: 1; - } - to { - -webkit-transform: rotate3d(0, 0, 1, -45deg); - transform: rotate3d(0, 0, 1, -45deg); - opacity: 0; - } -} -@keyframes rotateOutDownRight { - from { - opacity: 1; - } - to { - -webkit-transform: rotate3d(0, 0, 1, -45deg); - transform: rotate3d(0, 0, 1, -45deg); - opacity: 0; - } -} -.animate__rotateOutDownRight { - -webkit-animation-name: rotateOutDownRight; - animation-name: rotateOutDownRight; - -webkit-transform-origin: right bottom; - transform-origin: right bottom; -} - -@-webkit-keyframes rotateOutUpLeft { - from { - opacity: 1; - } - to { - -webkit-transform: rotate3d(0, 0, 1, -45deg); - transform: rotate3d(0, 0, 1, -45deg); - opacity: 0; - } -} -@keyframes rotateOutUpLeft { - from { - opacity: 1; - } - to { - -webkit-transform: rotate3d(0, 0, 1, -45deg); - transform: rotate3d(0, 0, 1, -45deg); - opacity: 0; - } -} -.animate__rotateOutUpLeft { - -webkit-animation-name: rotateOutUpLeft; - animation-name: rotateOutUpLeft; - -webkit-transform-origin: left bottom; - transform-origin: left bottom; -} - -@-webkit-keyframes rotateOutUpRight { - from { - opacity: 1; - } - to { - -webkit-transform: rotate3d(0, 0, 1, 90deg); - transform: rotate3d(0, 0, 1, 90deg); - opacity: 0; - } -} -@keyframes rotateOutUpRight { - from { - opacity: 1; - } - to { - -webkit-transform: rotate3d(0, 0, 1, 90deg); - transform: rotate3d(0, 0, 1, 90deg); - opacity: 0; - } -} -.animate__rotateOutUpRight { - -webkit-animation-name: rotateOutUpRight; - animation-name: rotateOutUpRight; - -webkit-transform-origin: right bottom; - transform-origin: right bottom; -} - -/* Specials */ -@-webkit-keyframes hinge { - 0% { - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - 20%, 60% { - -webkit-transform: rotate3d(0, 0, 1, 80deg); - transform: rotate3d(0, 0, 1, 80deg); - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - 40%, 80% { - -webkit-transform: rotate3d(0, 0, 1, 60deg); - transform: rotate3d(0, 0, 1, 60deg); - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - opacity: 1; - } - to { - -webkit-transform: translate3d(0, 700px, 0); - transform: translate3d(0, 700px, 0); - opacity: 0; - } -} -@keyframes hinge { - 0% { - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - 20%, 60% { - -webkit-transform: rotate3d(0, 0, 1, 80deg); - transform: rotate3d(0, 0, 1, 80deg); - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - 40%, 80% { - -webkit-transform: rotate3d(0, 0, 1, 60deg); - transform: rotate3d(0, 0, 1, 60deg); - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - opacity: 1; - } - to { - -webkit-transform: translate3d(0, 700px, 0); - transform: translate3d(0, 700px, 0); - opacity: 0; - } -} -.animate__hinge { - -webkit-animation-duration: 2s; - animation-duration: 2s; - -webkit-animation-duration: calc(var(--animate-duration) * 2); - animation-duration: calc(var(--animate-duration) * 2); - -webkit-animation-name: hinge; - animation-name: hinge; - -webkit-transform-origin: top left; - transform-origin: top left; -} - -@-webkit-keyframes jackInTheBox { - from { - opacity: 0; - -webkit-transform: scale(0.1) rotate(30deg); - transform: scale(0.1) rotate(30deg); - -webkit-transform-origin: center bottom; - transform-origin: center bottom; - } - 50% { - -webkit-transform: rotate(-10deg); - transform: rotate(-10deg); - } - 70% { - -webkit-transform: rotate(3deg); - transform: rotate(3deg); - } - to { - opacity: 1; - -webkit-transform: scale(1); - transform: scale(1); - } -} -@keyframes jackInTheBox { - from { - opacity: 0; - -webkit-transform: scale(0.1) rotate(30deg); - transform: scale(0.1) rotate(30deg); - -webkit-transform-origin: center bottom; - transform-origin: center bottom; - } - 50% { - -webkit-transform: rotate(-10deg); - transform: rotate(-10deg); - } - 70% { - -webkit-transform: rotate(3deg); - transform: rotate(3deg); - } - to { - opacity: 1; - -webkit-transform: scale(1); - transform: scale(1); - } -} -.animate__jackInTheBox { - -webkit-animation-name: jackInTheBox; - animation-name: jackInTheBox; -} - -/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ -@-webkit-keyframes rollIn { - from { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); - transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); - } - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -@keyframes rollIn { - from { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); - transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); - } - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -.animate__rollIn { - -webkit-animation-name: rollIn; - animation-name: rollIn; -} - -/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ -@-webkit-keyframes rollOut { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); - transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); - } -} -@keyframes rollOut { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); - transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); - } -} -.animate__rollOut { - -webkit-animation-name: rollOut; - animation-name: rollOut; -} - -/* Zooming entrances */ -@-webkit-keyframes zoomIn { - from { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } - 50% { - opacity: 1; - } -} -@keyframes zoomIn { - from { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } - 50% { - opacity: 1; - } -} -.animate__zoomIn { - -webkit-animation-name: zoomIn; - animation-name: zoomIn; -} - -@-webkit-keyframes zoomInDown { - from { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -@keyframes zoomInDown { - from { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -.animate__zoomInDown { - -webkit-animation-name: zoomInDown; - animation-name: zoomInDown; -} - -@-webkit-keyframes zoomInLeft { - from { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -@keyframes zoomInLeft { - from { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -.animate__zoomInLeft { - -webkit-animation-name: zoomInLeft; - animation-name: zoomInLeft; -} - -@-webkit-keyframes zoomInRight { - from { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -@keyframes zoomInRight { - from { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -.animate__zoomInRight { - -webkit-animation-name: zoomInRight; - animation-name: zoomInRight; -} - -@-webkit-keyframes zoomInUp { - from { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -@keyframes zoomInUp { - from { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -.animate__zoomInUp { - -webkit-animation-name: zoomInUp; - animation-name: zoomInUp; -} - -/* Zooming exits */ -@-webkit-keyframes zoomOut { - from { - opacity: 1; - } - 50% { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } - to { - opacity: 0; - } -} -@keyframes zoomOut { - from { - opacity: 1; - } - 50% { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } - to { - opacity: 0; - } -} -.animate__zoomOut { - -webkit-animation-name: zoomOut; - animation-name: zoomOut; -} - -@-webkit-keyframes zoomOutDown { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - to { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -@keyframes zoomOutDown { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - to { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -.animate__zoomOutDown { - -webkit-animation-name: zoomOutDown; - animation-name: zoomOutDown; - -webkit-transform-origin: center bottom; - transform-origin: center bottom; -} - -@-webkit-keyframes zoomOutLeft { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); - } - to { - opacity: 0; - -webkit-transform: scale(0.1) translate3d(-2000px, 0, 0); - transform: scale(0.1) translate3d(-2000px, 0, 0); - } -} -@keyframes zoomOutLeft { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); - } - to { - opacity: 0; - -webkit-transform: scale(0.1) translate3d(-2000px, 0, 0); - transform: scale(0.1) translate3d(-2000px, 0, 0); - } -} -.animate__zoomOutLeft { - -webkit-animation-name: zoomOutLeft; - animation-name: zoomOutLeft; - -webkit-transform-origin: left center; - transform-origin: left center; -} - -@-webkit-keyframes zoomOutRight { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); - } - to { - opacity: 0; - -webkit-transform: scale(0.1) translate3d(2000px, 0, 0); - transform: scale(0.1) translate3d(2000px, 0, 0); - } -} -@keyframes zoomOutRight { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); - } - to { - opacity: 0; - -webkit-transform: scale(0.1) translate3d(2000px, 0, 0); - transform: scale(0.1) translate3d(2000px, 0, 0); - } -} -.animate__zoomOutRight { - -webkit-animation-name: zoomOutRight; - animation-name: zoomOutRight; - -webkit-transform-origin: right center; - transform-origin: right center; -} - -@-webkit-keyframes zoomOutUp { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - to { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -@keyframes zoomOutUp { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - to { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -.animate__zoomOutUp { - -webkit-animation-name: zoomOutUp; - animation-name: zoomOutUp; - -webkit-transform-origin: center bottom; - transform-origin: center bottom; -} - -/* Sliding entrances */ -@-webkit-keyframes slideInDown { - from { - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - visibility: visible; - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -@keyframes slideInDown { - from { - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - visibility: visible; - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -.animate__slideInDown { - -webkit-animation-name: slideInDown; - animation-name: slideInDown; -} - -@-webkit-keyframes slideInLeft { - from { - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - visibility: visible; - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -@keyframes slideInLeft { - from { - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - visibility: visible; - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -.animate__slideInLeft { - -webkit-animation-name: slideInLeft; - animation-name: slideInLeft; -} - -@-webkit-keyframes slideInRight { - from { - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - visibility: visible; - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -@keyframes slideInRight { - from { - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - visibility: visible; - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -.animate__slideInRight { - -webkit-animation-name: slideInRight; - animation-name: slideInRight; -} - -@-webkit-keyframes slideInUp { - from { - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - visibility: visible; - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -@keyframes slideInUp { - from { - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - visibility: visible; - } - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -.animate__slideInUp { - -webkit-animation-name: slideInUp; - animation-name: slideInUp; -} - -/* Sliding exits */ -@-webkit-keyframes slideOutDown { - from { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - to { - visibility: hidden; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } -} -@keyframes slideOutDown { - from { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - to { - visibility: hidden; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } -} -.animate__slideOutDown { - -webkit-animation-name: slideOutDown; - animation-name: slideOutDown; -} - -@-webkit-keyframes slideOutLeft { - from { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - to { - visibility: hidden; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } -} -@keyframes slideOutLeft { - from { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - to { - visibility: hidden; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } -} -.animate__slideOutLeft { - -webkit-animation-name: slideOutLeft; - animation-name: slideOutLeft; -} - -@-webkit-keyframes slideOutRight { - from { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - to { - visibility: hidden; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } -} -@keyframes slideOutRight { - from { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - to { - visibility: hidden; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } -} -.animate__slideOutRight { - -webkit-animation-name: slideOutRight; - animation-name: slideOutRight; -} - -@-webkit-keyframes slideOutUp { - from { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - to { - visibility: hidden; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } -} -@keyframes slideOutUp { - from { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - to { - visibility: hidden; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } -} -.animate__slideOutUp { - -webkit-animation-name: slideOutUp; - animation-name: slideOutUp; -} - -.weather-box { - opacity: 0; - visibility: hidden; -} -.weather-box.show { - opacity: 1; - visibility: visible; -} -.weather-box { - background-color: #f8f8f8; - padding: 1rem; - border-radius: 1rem; - font-family: "Source Sans 3", "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; - max-width: 400px; - display: flex; -} -.weather-box .weather-pic { - width: 45%; -} -.weather-box .weather-pic figure { - overflow: hidden; - display: flex; - flex-direction: column; - align-items: center; -} -.weather-box .weather-pic figure img, -.weather-box .weather-pic figure svg { - width: 100%; -} -.weather-box .weather-pic figure img { - border-radius: 1rem; -} -.weather-box .weather-pic figure figcaption { - text-align: center; -} -.weather-box .weather-pic figure .description { - text-align: center; - color: #ccc; - line-height: 1.5; -} -.weather-box .weather-information { - padding: 2.5rem 0 0; - width: 55%; -} -.weather-box .weather-information .text-temp { - text-align: center; - font-size: 3rem; - margin: 0; - color: #555; -} -.weather-box .weather-information .text-temp .danger { - color: tomato; -} -.weather-box .weather-information .text-temp .frozen { - color: steelblue; -} -.weather-box .weather-information .temp-unit { - font-size: 2.5rem; - color: #777777; -} -.weather-box .weather-information .text-temp-min-max { - text-align: center; - color: #ccc; - line-height: 1; - margin: 0 0 2rem; -} -.weather-box .weather-information .wind-information { - display: flex; - text-align: center; -} -.weather-box .weather-information .wind-information .fa-compass { - transition: all 0.8s ease-out; - transition-delay: 500ms; - font-size: 48px; - width: 48px; - height: 48px; - color: #555; - margin: 0 1rem 0 2rem; -} -.weather-box .weather-information .wind-information .speed { - display: inline; -} - -/*# sourceMappingURL=main.css.map */ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/css/main.css.map b/02_advanced/unterricht/tag19/01_weather-box/assets/css/main.css.map deleted file mode 100644 index 8ce70c3..0000000 --- a/02_advanced/unterricht/tag19/01_weather-box/assets/css/main.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sourceRoot":"","sources":["../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_banner.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_root.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/vendor/_rfs.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_color-mode.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_reboot.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_variables.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_border-radius.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_type.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_lists.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_images.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_image.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_containers.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_container.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_breakpoints.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_grid.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_grid.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_tables.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_table-variants.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/forms/_labels.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/forms/_form-text.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/forms/_form-control.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_transition.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_gradients.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/forms/_form-select.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/forms/_form-check.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/forms/_form-range.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/forms/_floating-labels.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/forms/_input-group.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_forms.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_buttons.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_buttons.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_transitions.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_dropdown.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_caret.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_button-group.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_nav.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_navbar.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_card.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_accordion.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_pagination.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_pagination.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_badge.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_alert.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_progress.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_list-group.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_close.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_toasts.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_modal.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_backdrop.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_tooltip.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_reset-text.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_popover.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_carousel.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_clearfix.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_spinners.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_offcanvas.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/_placeholders.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/helpers/_color-bg.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/helpers/_colored-links.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/helpers/_focus-ring.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/helpers/_icon-link.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/helpers/_ratio.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/helpers/_position.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/helpers/_stacks.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/helpers/_visually-hidden.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_visually-hidden.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/helpers/_stretched-link.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/helpers/_text-truncation.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_text-truncate.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/helpers/_vr.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/mixins/_utilities.scss","../../dev/assets/scss/01_frameworks/bootstrap-5.3.8/utilities/_api.scss","../../dev/assets/scss/02_fonts/_playfair-display-v40-latin.scss","../../dev/assets/scss/02_fonts/_source-sans-3-v19-latin.scss","../../dev/assets/scss/02_fonts/_special-elite-v20-latin.scss","../../dev/assets/scss/03_base/_utils.scss","../../dev/assets/scss/03_base/_colors.scss","../../dev/assets/scss/03_base/_theme.scss","../../dev/assets/scss/03_base/_typography.scss","../../dev/assets/scss/04_plugins/animate-4.1.1/animate.scss","../../dev/assets/scss/05_modules/_weather-box.scss"],"names":[],"mappings":"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EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAlBF;EAOE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAlBF;EAOE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAlBF;EAOE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAlBF;EAOE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAlBF;EAOE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAlBF;EAOE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAlBF;EAOE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;ADiJA;EACE;EACA;;;AH3FF;EGyFA;IACE;IACA;;;AH3FF;EGyFA;IACE;IACA;;;AH3FF;EGyFA;IACE;IACA;;;AH3FF;EGyFA;IACE;IACA;;;AH3FF;EGyFA;IACE;IACA;;;AEnKN;EACE,ebu2BsC;;;Aa91BxC;EACE;EACA;EACA;EhB8QI,WALI;EgBrQR,ab+lB4B;;;Aa3lB9B;EACE;EACA;EhBoQI,WALI;;;AgB3PV;EACE;EACA;EhB8PI,WALI;;;AiBtRV;EACE,Yd+1BsC;EHrkBlC,WALI;EiBjRR,Od+1BsC;;;Aep2BxC;EACE;EACA;EACA;ElBwRI,WALI;EkBhRR,afkmB4B;EejmB5B,afymB4B;EexmB5B,Of43BsC;Ee33BtC;EACA,kBfq3BsC;Eep3BtC;EACA;EdGE;EeHE,YDMJ;;ACFI;EDhBN;ICiBQ;;;ADGN;EACE;;AAEA;EACE;;AAKJ;EACE,Ofs2BoC;Eer2BpC,kBfg2BoC;Ee/1BpC,cf82BoC;Ee72BpC;EAKE,YfkhBkB;;Ae9gBtB;EAME;EAMA;EAKA;;AAKF;EACE;EACA;;AAIF;EACE,Of40BoC;Ee10BpC;;AAQF;EAEE,kBf8yBoC;Ee3yBpC;;AAIF;EACE;EACA;EACA,mBforB0B;EenrB1B,OfsyBoC;EiBp4BtC,kBjBqiCgC;Eer8B9B;EACA;EACA;EACA;EACA,yBfgsB0B;Ee/rB1B;ECzFE,YD0FF;;ACtFE;ED0EJ;ICzEM;;;ADwFN;EACE,kBf47B8B;;;Aen7BlC;EACE;EACA;EACA;EACA;EACA,afwf4B;Eevf5B,Of2xBsC;Ee1xBtC;EACA;EACA;;AAEA;EACE;;AAGF;EAEE;EACA;;;AAWJ;EACE,Yf4wBsC;Ee3wBtC;ElByII,WALI;EIvQN;;AcuIF;EACE;EACA;EACA,mBfooB0B;;;AehoB9B;EACE,YfgwBsC;Ee/vBtC;ElB4HI,WALI;EIvQN;;AcoJF;EACE;EACA;EACA,mBf2nB0B;;;AennB5B;EACE,Yf6uBoC;;Ae1uBtC;EACE,Yf0uBoC;;AevuBtC;EACE,YfuuBoC;;;AeluBxC;EACE,OfquBsC;EepuBtC,Qf8tBsC;Ee7tBtC,SfilB4B;;Ae/kB5B;EACE;;AAGF;EACE;EdvLA;;Ac2LF;EACE;Ed5LA;;AcgMF;EAAoB,Qf8sBkB;;Ae7sBtC;EAAoB,Qf8sBkB;;;AkB75BxC;EACE;EAEA;EACA;EACA;ErBqRI,WALI;EqB7QR,alB+lB4B;EkB9lB5B,alBsmB4B;EkBrmB5B,OlBy3BsC;EkBx3BtC;EACA,kBlBk3BsC;EkBj3BtC;EACA;EACA,qBlB+9BkC;EkB99BlC,iBlB+9BkC;EkB99BlC;EjBHE;EeHE,YESJ;;AFLI;EEfN;IFgBQ;;;AEMN;EACE,clBs3BoC;EkBr3BpC;EAKE,YlBi+B4B;;AkB79BhC;EAEE,elB6uB0B;EkB5uB1B;;AAGF;EAEE,kBlBu1BoC;;AkBl1BtC;EACE;EACA;;;AAIJ;EACE,alBsuB4B;EkBruB5B,gBlBquB4B;EkBpuB5B,clBquB4B;EHlgBxB,WALI;EIvQN;;;AiB8CJ;EACE,alBkuB4B;EkBjuB5B,gBlBiuB4B;EkBhuB5B,clBiuB4B;EHtgBxB,WALI;EIvQN;;;AiBwDA;EACE;;;ACxEN;EACE;EACA,YnBq6BwC;EmBp6BxC,cnBq6BwC;EmBp6BxC,enBq6BwC;;AmBn6BxC;EACE;EACA;;;AAIJ;EACE,enB25BwC;EmB15BxC;EACA;;AAEA;EACE;EACA;EACA;;;AAIJ;EACE;EAEA;EACA,OnB04BwC;EmBz4BxC,QnBy4BwC;EmBx4BxC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,QnB24BwC;EmB14BxC;;AAGA;ElB3BE;;AkB+BF;EAEE,enBm4BsC;;AmBh4BxC;EACE,QnB03BsC;;AmBv3BxC;EACE,cnBs1BoC;EmBr1BpC;EACA,YnB8foB;;AmB3ftB;EACE,kBnB5BM;EmB6BN,cnB7BM;;AmB+BN;EAII;;AAIJ;EAII;;AAKN;EACE,kBnBjDM;EmBkDN,cnBlDM;EmBuDJ;;AAIJ;EACE;EACA;EACA,SnBk2BuC;;AmB31BvC;EACE;EACA,SnBy1BqC;;;AmB30B3C;EACE,cnBo1BgC;;AmBl1BhC;EACE;EAEA,OnB80B8B;EmB70B9B;EACA;EACA;ElBjHA;EeHE,YGsHF;;AHlHE;EG0GJ;IHzGM;;;AGmHJ;EACE;;AAGF;EACE,qBnB60B4B;EmBx0B1B;;AAKN;EACE,enBwzB8B;EmBvzB9B;;AAEA;EACE;EACA;;;AAKN;EACE;EACA,cnBsyBgC;;;AmBnyBlC;EACE;EACA;EACA;;AAIE;EACE;EACA;EACA,SnBspBwB;;;AmB/oB1B;EACE;;;ACnLN;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAIA;EAA0B,YpB8gCa;;AoB7gCvC;EAA0B,YpB6gCa;;AoB1gCzC;EACE;;AAGF;EACE,OpB+/BuC;EoB9/BvC,QpB8/BuC;EoB7/BvC;EACA;EH1BF,kBjBkCQ;EoBNN,QpB6/BuC;EC1gCvC;EeHE,YImBF;;AJfE;EIMJ;IJLM;;;AIgBJ;EHjCF,kBjB8hCyC;;AoBx/BzC;EACE,OpBw+B8B;EoBv+B9B,QpBw+B8B;EoBv+B9B;EACA,QpBu+B8B;EoBt+B9B,kBpBu+B8B;EoBt+B9B;EnB7BA;;AmBkCF;EACE,OpBo+BuC;EoBn+BvC,QpBm+BuC;EoBl+BvC;EHpDF,kBjBkCQ;EoBoBN,QpBm+BuC;EC1gCvC;EeHE,YI6CF;;AJzCE;EIiCJ;IJhCM;;;AI0CJ;EH3DF,kBjB8hCyC;;AoB99BzC;EACE,OpB8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E;EACA;EACA;E3BuRI,oBALI;E2BhRR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;E3BsQI,WALI;E2B/PR;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EvBjBE;EgBfF,kBOkCqB;ERtBjB,YQwBJ;;ARpBI;EQhBN;IRiBQ;;;AQqBN;EACE;EAEA;EACA;;AAGF;EAEE;EACA;EACA;;AAGF;EACE;EPrDF,kBOsDuB;EACrB;EACA;EAKE;;AAIJ;EACE;EACA;EAKE;;AAIJ;EAKE;EACA;EAGA;;AAGA;EAKI;;AAKN;EAKI;;AAIJ;EAGE;EACA;EACA;EAEA;EACA;;;AAYF;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADkGA;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADkGA;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADkGA;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADkGA;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADkGA;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADkGA;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADkGA;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AD4HA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADmGA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADmGA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADmGA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADmGA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADmGA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADmGA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADmGA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AD+GF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA,iBxB8QwC;;AwBpQxC;EACE;;AAGF;EACE;;;AAWJ;ECjJE;EACA;E5B8NI,oBALI;E4BvNR;;;ADkJF;ECrJE;EACA;E5B8NI,oBALI;E4BvNR;;;ACnEF;EVgBM,YUfJ;;AVmBI;EUpBN;IVqBQ;;;AUlBN;EACE;;;AAMF;EACE;;;AAIJ;EACE;EACA;EVDI,YUEJ;;AVEI;EULN;IVMQ;;;AUDN;EACE;EACA;EVNE,YUOF;;AVHE;EUAJ;IVCM;;;;AWpBR;AAAA;AAAA;AAAA;AAAA;AAAA;EAME;;;AAGF;EACE;;ACwBE;EACE;EACA,a5B6hBwB;E4B5hBxB,gB5B2hBwB;E4B1hBxB;EArCJ;EACA;EACA;EACA;;AA0DE;EACE;;;AD9CN;EAEE;EACA;EACA;EACA;EACA;E9BuQI,yBALI;E8BhQR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;E9B0OI,WALI;E8BnOR;EACA;EACA;EACA;EACA;EACA;E1BzCE;;A0B6CF;EACE;EACA;EACA;;;AAwBA;EACE;;AAEA;EACE;E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EA;EAEE;;;AAUJ;EAEE;EACA;EAEA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;;AAGE;EAEE;;AAIJ;EACE;;;AASJ;EACE,a/B8gCkC;E+B7gClC,gB/B6gCkC;E+B5gClC;;AAEA;AAAA;AAAA;EAGE;;;AAaJ;EACE;EACA;EAGA;;;AAIF;EACE;ElCyII,WALI;EkClIR;EACA;EACA;EACA;E9BxIE;EeHE,Ye6IJ;;AfzII;EeiIN;IfhIQ;;;Ae0IN;EACE;;AAGF;EACE;EACA;EACA;;;AAMJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AvB1HE;EuBsIA;IAEI;IACA;;EAEA;IACE;;EAEA;IACE;;EAGF;IACE;IACA;;EAIJ;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;If9NJ,YegOI;;EAGA;IACE;;EAGF;IACE;IACA;IACA;IACA;;;AvB5LR;EuBsIA;IAEI;IACA;;EAEA;IACE;;EAEA;IACE;;EAGF;IACE;IACA;;EAIJ;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;If9NJ,YegOI;;EAGA;IACE;;EAGF;IACE;IACA;IACA;IACA;;;AvB5LR;EuBsIA;IAEI;IACA;;EAEA;IACE;;EAEA;IACE;;EAGF;IACE;IACA;;EAIJ;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;If9NJ,YegOI;;EAGA;IACE;;EAGF;IACE;IACA;IACA;IACA;;;AvB5LR;EuBsIA;IAEI;IACA;;EAEA;IACE;;EAEA;IACE;;EAGF;IACE;IACA;;EAIJ;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;If9NJ,YegOI;;EAGA;IACE;;EAGF;IACE;IACA;IACA;IACA;;;AvB5LR;EuBsIA;IAEI;IACA;;EAEA;IACE;;EAEA;IACE;;EAGF;IACE;IACA;;EAIJ;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;If9NJ,YegOI;;EAGA;IACE;;EAGF;IACE;IACA;IACA;IACA;;;AAtDR;EAEI;EACA;;AAEA;EACE;;AAEA;EACE;;AAGF;EACE;EACA;;AAIJ;EACE;;AAGF;EACE;EACA;;AAGF;EACE;;AAGF;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;Ef9NJ,YegOI;;AAGA;EACE;;AAGF;EACE;EACA;EACA;EACA;;;AAiBZ;AAAA;EAGE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAME;EACE;;;ACzRN;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;E/BjBE;;A+BqBF;EACE;EACA;;AAGF;EACE;EACA;;AAEA;EACE;E/BtBF;EACA;;A+ByBA;EACE;E/BbF;EACA;;A+BmBF;AAAA;EAEE;;;AAIJ;EAGE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAQA;EACE;;;AAQJ;EACE;EACA;EACA;EACA;EACA;;AAEA;E/B7FE;;;A+BkGJ;EACE;EACA;EACA;EACA;;AAEA;E/BxGE;;;A+BkHJ;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;;AAIJ;EACE;EACA;;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;E/B1IE;;;A+B8IJ;AAAA;AAAA;EAGE;;;AAGF;AAAA;E/B3II;EACA;;;A+B+IJ;AAAA;E/BlII;EACA;;;A+B8IF;EACE;;AxB3HA;EwBuHJ;IAQI;IACA;;EAGA;IACE;IACA;;EAEA;IACE;IACA;;EAKA;I/B1KJ;IACA;;E+B4KM;AAAA;IAGE;;EAEF;AAAA;IAGE;;EAIJ;I/B3KJ;IACA;;E+B6KM;AAAA;IAGE;;EAEF;AAAA;IAGE;;;;ACnOZ;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIF;EACE;EACA;EACA;EACA;EACA;EpC4PI,WALI;EoCrPR;EACA;EACA;EACA;EhCrBE;EgCuBF;EjB1BI,YiB2BJ;;AjBvBI;EiBUN;IjBTQ;;;AiBwBN;EACE;EACA;EACA;;AAEA;EACE;EACA;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EjBjDE,YiBkDF;;AjB9CE;EiBqCJ;IjBpCM;;;AiBgDN;EACE;;AAGF;EACE;EACA;EACA;;;AAIJ;EACE;;;AAGF;EACE;EACA;EACA;;AAEA;EhC7DE;EACA;;AgC+DA;EhChEA;EACA;;AgCoEF;EACE;;AAIF;EhC5DE;EACA;;AgC+DE;EhChEF;EACA;;AgCoEA;EhCrEA;EACA;;;AgC0EJ;EACE;;;AASA;EACE;EACA;EhC9GA;;AgCiHA;EAAgB;;AAChB;EAAe;;AAGf;AAAA;AAAA;EhCrHA;;;AgCgIA;EACE;EACA;;;ACrJN;EAEE;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;ErC+QI,WALI;EqCxQR;EACA;EjCAE;;;AiCMF;EACE;;AAEA;EACE;EACA;EACA;EACA;;AAIJ;EACE;;;ACrCJ;EAEE;EACA;EtC4RI,2BALI;EsCrRR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EhCpBA;EACA;;;AgCuBF;EACE;EACA;EACA;EtCgQI,WALI;EsCzPR;EACA;EACA;EACA;EnBpBI,YmBqBJ;;AnBjBI;EmBQN;InBPQ;;;AmBkBN;EACE;EACA;EAEA;EACA;;AAGF;EACE;EACA;EACA;EACA,SnC2uCgC;EmC1uChC;;AAGF;EAEE;EACA;ElBtDF,kBkBuDuB;EACrB;;AAGF;EAEE;EACA;EACA;EACA;;;AAKF;EACE,anC8sCgC;;AmCzsC9B;ElC9BF;EACA;;AkCmCE;ElClDF;EACA;;;AkCkEJ;EClGE;EACA;EvC0RI,2BALI;EuCnRR;;;ADmGF;ECtGE;EACA;EvC0RI,2BALI;EuCnRR;;;ACFF;EAEE;EACA;ExCuRI,sBALI;EwChRR;EACA;EACA;EAGA;EACA;ExC+QI,WALI;EwCxQR;EACA;EACA;EACA;EACA;EACA;EpCJE;;AoCSF;EACE;;;AAKJ;EACE;EACA;;;AChCF;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;ErCHE;;;AqCQJ;EAEE;;;AAIF;EACE,atC6kB4B;EsC5kB5B;;;AAQF;EACE,etCs+C8B;;AsCn+C9B;EACE;EACA;EACA;EACA;EACA;;;AAQF;EACE;EACA;EACA;EACA;;;AAJF;EACE;EACA;EACA;EACA;;;AAJF;EACE;EACA;EACA;EACA;;;AAJF;EACE;EACA;EACA;EACA;;;AAJF;EACE;EACA;EACA;EACA;;;AAJF;EACE;EACA;EACA;EACA;;;AAJF;EACE;EACA;EACA;EACA;;;AAJF;EACE;EACA;EACA;EACA;;;AC5DF;EACE;IAAK;;;AAKT;AAAA;EAGE;E1CkRI,yBALI;E0C3QR;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;E1CsQI,WALI;E0C/PR;EtCRE;;;AsCaJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EvBxBI,YuByBJ;;AvBrBI;EuBYN;IvBXQ;;;;AuBuBR;EtBAE;EsBEA;;;AAGF;EACE;;;AAGF;EACE;;;AAIA;EACE;;AAGE;EAJJ;IAKM;;;;AC3DR;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EAGA;EACA;EvCXE;;;AuCeJ;EACE;EACA;;AAEA;EAEE;EACA;;;AAQJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EvC9BE;EACA;;AuCiCF;EvCpBE;EACA;;AuCuBF;EAEE;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;;AAIF;EACE;;AAEA;EACE;EACA;;;AAUN;EACE;EACA;EACA;;AAIE;EAEE;EACA;EACA;EACA;;AAGF;EACE;EACA;;;AAaF;EACE;;AAGE;EvCzDJ;EAZA;;AuC0EI;EvC1EJ;EAYA;;AuCmEI;EACE;;AAGF;EACE;EACA;;AAEA;EACE;EACA;;;AhCxFR;EgCgEA;IACE;;EAGE;IvCzDJ;IAZA;;EuC0EI;IvC1EJ;IAYA;;EuCmEI;IACE;;EAGF;IACE;IACA;;EAEA;IACE;IACA;;;AhCxFR;EgCgEA;IACE;;EAGE;IvCzDJ;IAZA;;EuC0EI;IvC1EJ;IAYA;;EuCmEI;IACE;;EAGF;IACE;IACA;;EAEA;IACE;IACA;;;AhCxFR;EgCgEA;IACE;;EAGE;IvCzDJ;IAZA;;EuC0EI;IvC1EJ;IAYA;;EuCmEI;IACE;;EAGF;IACE;IACA;;EAEA;IACE;IACA;;;AhCxFR;EgCgEA;IACE;;EAGE;IvCzDJ;IAZA;;EuC0EI;IvC1EJ;IAYA;;EuCmEI;IACE;;EAGF;IACE;IACA;;EAEA;IACE;IACA;;;AhCxFR;EgCgEA;IACE;;EAGE;IvCzDJ;IAZA;;EuC0EI;IvC1EJ;IAYA;;EuCmEI;IACE;;EAGF;IACE;IACA;;EAEA;IACE;IACA;;;AAcZ;EvClJI;;AuCqJF;EACE;;AAEA;EACE;;;AAaJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAVF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAVF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAVF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAVF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAVF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAVF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAVF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AC9LJ;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA,OzCupD2B;EyCtpD3B,QzCspD2B;EyCrpD3B;EACA;EACA;EACA;EACA;ExCJE;EwCMF;;AAGA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EAEE;EACA;EACA;;;AAQJ;EAHE;;;AAOF;AAAA;EAEE;;;A3C3CE;E2CkCF;;;ACjDF;EAEE;EACA;EACA;EACA;EACA;E7CyRI,sBALI;E6ClRR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;E7C2QI,WALI;E6CpQR;EACA;EACA;EACA;EACA;EACA;EzCRE;;AyCWF;EACE;;AAGF;EACE;;;AAIJ;EACE;EAEA;EACA;EACA;EACA;EACA;;AAEA;EACE;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EzChCE;EACA;;AyCkCF;EACE;EACA;;;AAIJ;EACE;EACA;;;AC9DF;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;;;AAOF;EACE;EACA;EACA;EAEA;;AAGA;EACE,W3Cm8CgC;EgBh/C9B,Y2B8CF;;A3B1CE;E2BwCJ;I3BvCM;;;A2B2CN;EACE,W3Cg8CgC;;A2C57ClC;EACE,W3C67CgC;;;A2Cz7CpC;EACE;;AAEA;EACE;EACA;;AAGF;EACE;;;AAIJ;EACE;EACA;EACA;;;AAIF;EACE;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;E1CrFE;E0CyFF;;;AAIF;EAEE;EACA;EACA;EClHA;EACA;EACA;EACA,SDkH0B;ECjH1B;EACA;EACA,kBD+G4D;;AC5G5D;EAAS;;AACT;EAAS,SD2GiF;;;AAK5F;EACE;EACA;EACA;EACA;EACA;E1CrGE;EACA;;A0CuGF;EACE;EAEA;EACA;EACA;EACA;;;AAKJ;EACE;EACA;;;AAKF;EACE;EAGA;EACA;;;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IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;;EAGF;IAEE;;EAGF;IAGE;;;A3C5BJ;E2C/BF;IAiEM;IACA;IACA;;EAEA;IACE;;EAGF;IACE;IACA;IACA;IACA;IAEA;;;;A3CnCN;E2C5CF;IAEI;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;InC5BA,YmC8BA;;;AnC1BA;EmCYJ;InCXM;;;ARuDJ;E2C5BE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;;EAGF;IAEE;;EAGF;IAGE;;;A3C5BJ;E2C/BF;IAiEM;IACA;IACA;;EAEA;IACE;;EAGF;IACE;IACA;IACA;IACA;IAEA;;;;A3CnCN;E2C5CF;IAEI;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;InC5BA,YmC8BA;;;AnC1BA;EmCYJ;InCXM;;;ARuDJ;E2C5BE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;;EAGF;IAEE;;EAGF;IAGE;;;A3C5BJ;E2C/BF;IAiEM;IACA;IACA;;EAEA;IACE;;EAGF;IACE;IACA;IACA;IACA;IAEA;;;;A3CnCN;E2C5CF;IAEI;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;InC5BA,YmC8BA;;;AnC1BA;EmCYJ;InCXM;;;ARuDJ;E2C5BE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;;EAGF;IAEE;;EAGF;IAGE;;;A3C5BJ;E2C/BF;IAiEM;IACA;IACA;;EAEA;IACE;;EAGF;IACE;IACA;IACA;IACA;IAEA;;;;A3CnCN;E2C5CF;IAEI;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;InC5BA,YmC8BA;;;AnC1BA;EmCYJ;InCXM;;;ARuDJ;E2C5BE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;;EAGF;IAEE;;EAGF;IAGE;;;A3C5BJ;E2C/BF;IAiEM;IACA;IACA;;EAEA;IACE;;EAGF;IACE;IACA;IACA;IACA;IAEA;;;;AA/ER;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EnC5BA,YmC8BA;;AnC1BA;EmCYJ;InCXM;;;AmC2BF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EAEE;;AAGF;EAGE;;;AA2BR;EPpHE;EACA;EACA;EACA,S5C0mCkC;E4CzmClC;EACA;EACA,kB5CUS;;A4CPT;EAAS;;AACT;EAAS,S5Cm+CyB;;;AmDr3CpC;EACE;EACA;EACA;;AAEA;EACE;EAEA;EACA;EACA;EACA;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;ACjJF;EACE;EACA;EACA;EACA;EACA;EACA,SpDgzCkC;;AoD9yClC;EACE;EACA;;;AAKJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKA;EACE;;;AAIJ;EACE;IACE,SpDmxCgC;;;AoD/wCpC;EACE;EACA;EACA;;;AAGF;EACE;IACE;;;AH9CF;EACE;EACA;EACA;;;AIHF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;ACFF;EACE;EACA;;AAGE;EAGE;EACA;;;AATN;EACE;EACA;;AAGE;EAGE;EACA;;;AATN;EACE;EACA;;AAGE;EAGE;EACA;;;AATN;EACE;EACA;;AAGE;EAGE;EACA;;;AATN;EACE;EACA;;AAGE;EAGE;EACA;;;AATN;EACE;EACA;;AAGE;EAGE;EACA;;;AATN;EACE;EACA;;AAGE;EAGE;EACA;;;AATN;EACE;EACA;;AAGE;EAGE;EACA;;;AAOR;EACE;EACA;;AAGE;EAEE;EACA;;;AC1BN;EACE;EAEA;;;ACHF;EACE;EACA,KxD6c4B;EwD5c5B;EACA;EACA,uBxD2c4B;EwD1c5B;;AAEA;EACE;EACA,OxDuc0B;EwDtc1B,QxDsc0B;EwDrc1B;ExCIE,YwCHF;;AxCOE;EwCZJ;IxCaM;;;;AwCDJ;EACE;;;ACnBN;EACE;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAKF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;ACrBJ;EACE;EACA;EACA;EACA;EACA,S1DumCkC;;;A0DpmCpC;EACE;EACA;EACA;EACA;EACA,S1D+lCkC;;;A0DvlChC;EACE;EACA;EACA,S1DmlC8B;;;A0DhlChC;EACE;EACA;EACA,S1D6kC8B;;;AQ9iChC;EkDxCA;IACE;IACA;IACA,S1DmlC8B;;E0DhlChC;IACE;IACA;IACA,S1D6kC8B;;;AQ9iChC;EkDxCA;IACE;IACA;IACA,S1DmlC8B;;E0DhlChC;IACE;IACA;IACA,S1D6kC8B;;;AQ9iChC;EkDxCA;IACE;IACA;IACA,S1DmlC8B;;E0DhlChC;IACE;IACA;IACA,S1D6kC8B;;;AQ9iChC;EkDxCA;IACE;IACA;IACA,S1DmlC8B;;E0DhlChC;IACE;IACA;IACA,S1D6kC8B;;;AQ9iChC;EkDxCA;IACE;IACA;IACA,S1DmlC8B;;E0DhlChC;IACE;IACA;IACA,S1D6kC8B;;;A2D5mCpC;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;ACRF;AAAA;ECIE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGA;AAAA;EACE;;AAIF;AAAA;EACE;;;ACnBF;EACE;EACA;EACA;EACA;EACA;EACA,S9DgcsC;E8D/btC;;;ACRJ;ECAE;EACA;EACA;;;ACNF;EACE;EACA;EACA,OjEisB4B;EiEhsB5B;EACA;EACA,SjE2rB4B;;;AkE/nBtB;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAjBJ;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AASF;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAjBJ;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AASF;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAP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AOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;A1DVR;E0DGI;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;;A1DVR;E0DGI;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;;A1DVR;E0DGI;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;;A1DVR;E0DGI;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;;A1DVR;E0DGI;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;;ACtDZ;ED+CQ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;;ACnCZ;ED4BQ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;;AExEZ;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AC7FF;EACE;EACA;EACA;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;ACnIF;EACE;EACA;EACA;EACA;EACA;;ACJF;EACE;EACA;EACA;EACA;EACA;EACA;EACA,YACE;;AAGF;EAEE;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;;AAEF;EACE;;AAEF;EACE;;;AC7BJ;ACEA;AAAA;EAEE;;;AAGF;AAAA;EAEE;EACA;EACA;;;AAGF;EACE,aCRU;;;ADWZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAME,aCrBc;EDsBd;;;AEzBe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOjB;EACE;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;;;AAEF;EACE;IACE;IACA;IACA;IACA;IACA;IACA;;EAGF;IACE;;;AAGJ;AACA;EACE;IAIE;IACA;IACA;IACA;;EAGF;IAEE;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;IAIE;IACA;IACA;IACA;;EAGF;IAEE;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;EACA;EACA;EACA;;;AAEF;EACE;IAGE;;EAGF;IAEE;;;AAGJ;EACE;IAGE;;EAGF;IAEE;;;AAGJ;EACE;EACA;;;AAEF;AACA;EACE;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;EACA;EACA;EACA;;;AAEF;EACE;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IAEE;IACA;;EAGF;IAKE;IACA;;EAGF;IAIE;IACA;;;AAGJ;EACE;IAEE;IACA;;EAGF;IAKE;IACA;;EAGF;IAIE;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IAEE;IACA;;EAGF;IAKE;IACA;;EAGF;IAIE;IACA;;;AAGJ;EACE;IAEE;IACA;;EAGF;IAKE;IACA;;EAGF;IAIE;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;EACA;EACA;EACA;;;AAEF;EACE;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;EACA;EACA;EACA;;;AAEF;EACE;IACE;IACA;;EAGF;IAEE;IACA;;EAGF;IAIE;IACA;;EAGF;IAGE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;IACE;IACA;;EAGF;IAEE;IACA;;EAGF;IAIE;IACA;;EAGF;IAGE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;EACA;;;AAEF;AACA;EACE;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IAGE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;IAGE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;EACA;EACA;EACA;;;AAEF;EACE;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;AACA;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;AACA;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;AACA;EACE;IAME;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IAME;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;IAKE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;IAKE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IAKE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;IAKE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IAKE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;IAKE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IAKE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;IAKE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;EACA;;;AAEF;AACA;EACE;IACE;IACA;;EAGF;IAEE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;;EAGF;IAEE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;IACE;IACA;;EAGF;IAEE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;;EAGF;IAEE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;;EAGF;IAEE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;;EAGF;IAEE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;AACA;EACE;IACE;;EAGF;IACE;;;AAGJ;EACE;IACE;;EAGF;IACE;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAEF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAEF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAEF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAEF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAEF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAEF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAEF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAEF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;AACA;EACE;IACE;;EAGF;IACE;;;AAGJ;EACE;IACE;;EAGF;IACE;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAEF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAEF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAEF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAEF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAEF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAEF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAEF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAEF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;AACA;EACE;IACE;IACA;IACA;IACA;;EAGF;IACE;IAEA;IAEA;IACA;;EAGF;IACE;IAEA;IAEA;IACA;;EAGF;IACE;IAEA;IAEA;IACA;;EAGF;IACE;IACA;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;IACA;;EAGF;IACE;IAEA;IAEA;IACA;;EAGF;IACE;IAEA;IAEA;IACA;;EAGF;IACE;IAEA;IAEA;IACA;;EAGF;IACE;IACA;IACA;IACA;;;AAGJ;EACE;EACA;EACA;EACA;;;AAEF;EACE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;EACA;EACA;EACA;;;AAEF;EACE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;EACA;EACA;EACA;;;AAEF;EACE;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;AACA;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;EACA;EACA;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;EACA;EACA;EACA;;;AAEF;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;EACA;EACA;;;AAEF;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;EACA;EACA;;;AAEF;AACA;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;EACA;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;EACA;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;EACA;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;EACA;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;EACA;EACA;;;AAEF;AACA;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;EACA;EACA;;;AAEF;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;EACA;EACA;;;AAEF;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;EACA;EACA;;;AAEF;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;EACA;EACA;;;AAEF;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;EACA;EACA;;;AAEF;AACA;EACE;IACE;IACA;;EAGF;IAEE;IACA;IACA;IACA;;EAGF;IAEE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;;EAGF;IAEE;IACA;IACA;IACA;;EAGF;IAEE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;AACA;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;AACA;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;AACA;EACE;IACE;IACA;IACA;;EAGF;IACE;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;AACA;EACE;IACE;;EAGF;IACE;IACA;IACA;;EAGF;IACE;;;AAGJ;EACE;IACE;;EAGF;IACE;IACA;IACA;;EAGF;IACE;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;;;AAGJ;EACE;EACA;EACA;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;EACA;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;EACA;EACA;;;AAEF;EACE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;;;AAGJ;EACE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;;;AAGJ;EACE;EACA;EACA;EACA;;;AAEF;AACA;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;IACE;IACA;IACA;;EAGF;IACE;IACA;;;AAGJ;EACE;EACA;;;AAEF;AACA;EACE;IACE;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;IACE;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;IACE;IACA;;EAGF;IACE;IACA;IACA;;;AAGJ;EACE;EACA;;;ACp+HF;EACE;EACA;;AACA;EACE;EACA;;AALJ;EAQE;EACA;EACA;EACA,aFNU;EEOV;EACA;;AAEA;EACE;;AACA;EACE;EACA;EACA;EACA;;AACA;AAAA;EAEE;;AAEF;EACE;;AAEF;EACE;;AAEF;EACE;EACA;EACA;;AAKN;EACE;EACA;;AACA;EACE;EACA;EACA;EACA;;AACA;EACE;;AAEF;EACE;;AAGJ;EACE;EAEA;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE","file":"main.css"} \ No newline at end of file diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-500.woff2 b/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-500.woff2 deleted file mode 100644 index 64d6e11..0000000 Binary files a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-500.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-500italic.woff2 b/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-500italic.woff2 deleted file mode 100644 index 8e3e680..0000000 Binary files a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-500italic.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-600.woff2 b/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-600.woff2 deleted file mode 100644 index c19fbc1..0000000 Binary files a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-600.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-600italic.woff2 b/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-600italic.woff2 deleted file mode 100644 index 78abff9..0000000 Binary files a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-600italic.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-700.woff2 b/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-700.woff2 deleted file mode 100644 index 39eefe0..0000000 Binary files a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-700.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-700italic.woff2 b/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-700italic.woff2 deleted file mode 100644 index d7f6b28..0000000 Binary files a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-700italic.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-800.woff2 b/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-800.woff2 deleted file mode 100644 index 1128d50..0000000 Binary files a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-800.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-800italic.woff2 b/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-800italic.woff2 deleted file mode 100644 index dc86c01..0000000 Binary files a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-800italic.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-900.woff2 b/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-900.woff2 deleted file mode 100644 index 87eff24..0000000 Binary files a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-900.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-900italic.woff2 b/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-900italic.woff2 deleted file mode 100644 index 61fa874..0000000 Binary files a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-900italic.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-italic.woff2 b/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-italic.woff2 deleted file mode 100644 index 30828de..0000000 Binary files a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-italic.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-regular.woff2 b/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-regular.woff2 deleted file mode 100644 index 141ea84..0000000 Binary files a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/playfair-display-v40-latin/playfair-display-v40-latin-regular.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-200.woff2 b/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-200.woff2 deleted file mode 100644 index 1a88824..0000000 Binary files a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-200.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-200italic.woff2 b/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-200italic.woff2 deleted file mode 100644 index 24c53f0..0000000 Binary files a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-200italic.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-300.woff2 b/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-300.woff2 deleted file mode 100644 index b47991a..0000000 Binary files a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-300.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-300italic.woff2 b/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-300italic.woff2 deleted file mode 100644 index e24cd5a..0000000 Binary files a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-300italic.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-500.woff2 b/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-500.woff2 deleted file mode 100644 index 5918916..0000000 Binary files a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-500.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-500italic.woff2 b/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-500italic.woff2 deleted file mode 100644 index 0706a1f..0000000 Binary files a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-500italic.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-600.woff2 b/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-600.woff2 deleted file mode 100644 index 9351177..0000000 Binary files a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-600.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-600italic.woff2 b/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-600italic.woff2 deleted file mode 100644 index b216f26..0000000 Binary files a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-600italic.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-700.woff2 b/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-700.woff2 deleted file mode 100644 index 3cb944c..0000000 Binary files a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-700.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-700italic.woff2 b/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-700italic.woff2 deleted file mode 100644 index f9a6d5f..0000000 Binary files a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-700italic.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-800.woff2 b/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-800.woff2 deleted file mode 100644 index cd37781..0000000 Binary files a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-800.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-800italic.woff2 b/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-800italic.woff2 deleted file mode 100644 index 7f43c11..0000000 Binary files a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-800italic.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-900.woff2 b/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-900.woff2 deleted file mode 100644 index c3ac211..0000000 Binary files a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-900.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-900italic.woff2 b/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-900italic.woff2 deleted file mode 100644 index cc339ed..0000000 Binary files a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-900italic.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-italic.woff2 b/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-italic.woff2 deleted file mode 100644 index 515b6b3..0000000 Binary files a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-italic.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-regular.woff2 b/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-regular.woff2 deleted file mode 100644 index 0c4242e..0000000 Binary files a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-regular.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/special-elite-v20-latin/special-elite-v20-latin-regular.woff2 b/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/special-elite-v20-latin/special-elite-v20-latin-regular.woff2 deleted file mode 100644 index 569a27e..0000000 Binary files a/02_advanced/unterricht/tag19/01_weather-box/assets/fonts/special-elite-v20-latin/special-elite-v20-latin-regular.woff2 and /dev/null differ diff --git a/02_advanced/unterricht/tag19/01_weather-box/assets/js/build.js b/02_advanced/unterricht/tag19/01_weather-box/assets/js/build.js deleted file mode 100644 index fca82af..0000000 --- a/02_advanced/unterricht/tag19/01_weather-box/assets/js/build.js +++ /dev/null @@ -1,67 +0,0 @@ -"use strict"; -(() => { - // dev/assets/js/main.js - (() => { - const DOM = { - weatherBox: document.querySelector(".weather-box"), - weatherIcon: document.querySelector(".weather-pic img"), - figcaption: document.querySelector("figcaption"), - description: document.querySelector(".description"), - temp: document.querySelector(".temp"), - tempMin: document.querySelector(".temp-min"), - tempMax: document.querySelector(".temp-max"), - windIcon: document.querySelector(".wind-icon"), - speed: document.querySelector(".speed"), - deg: document.querySelector(".deg") - }; - console.log(DOM); - const API_KEY = ""; - const LAT = 43.72072300281546; - const LON = 7.352450291796612; - const TEMP_MAX_ALERT_AMOUNT = 30; - const TEMP_MIN_ALERT_AMOUNT = 10; - const init = () => { - console.log("init!"); - getWeather().then((data) => { - console.log(data); - if (data) { - DOM.weatherBox.classList.add("show", "animate__flipInX"); - setWeather(data); - } - }); - }; - const getWeather = async () => { - try { - const res = await fetch( - `https://api.openweathermap.org/data/2.5/weather?lat=${LAT}&lon=${LON}&units=metric&appid=${API_KEY}` - ); - if (!res.ok) throw new Error("Fetch Error"); - const data = await res.json(); - return data; - } catch (error) { - console.error(error); - return error; - } - }; - const setWeather = (data) => { - const { main, description, icon } = data.weather[0]; - const { temp, temp_min: tempMin, temp_max: tempMax } = data.main; - const { deg, speed } = data.wind; - DOM.figcaption.textContent = main; - DOM.description.textContent = description; - DOM.temp.textContent = Number(temp).toFixed(1); - DOM.tempMin.textContent = Number(tempMin).toFixed(2); - DOM.tempMax.textContent = Number(tempMax).toFixed(2); - DOM.speed.textContent = Number(speed); - DOM.deg.textContent = Number(deg); - DOM.weatherIcon.src = `https://openweathermap.org/img/wn/${icon}@2x.png`; - DOM.windIcon.style.transform = `rotate(${Number(deg) - 45}deg)`; - if (Number(temp) >= TEMP_MAX_ALERT_AMOUNT) { - DOM.temp.classList.add("danger"); - } else if (Number(temp) <= TEMP_MIN_ALERT_AMOUNT) { - DOM.temp.classList.add("frozen"); - } - }; - init(); - })(); -})(); diff --git a/02_advanced/unterricht/tag19/01_weather-box/dev/assets/js/main.js b/02_advanced/unterricht/tag19/01_weather-box/dev/assets/js/main.js deleted file mode 100644 index 4396752..0000000 --- a/02_advanced/unterricht/tag19/01_weather-box/dev/assets/js/main.js +++ /dev/null @@ -1,88 +0,0 @@ -'use strict'; - -(() => { - // === DOM & VARS ======= - const DOM = { - weatherBox: document.querySelector('.weather-box'), - weatherIcon: document.querySelector('.weather-pic img'), - figcaption: document.querySelector('figcaption'), - description: document.querySelector('.description'), - temp: document.querySelector('.temp'), - tempMin: document.querySelector('.temp-min'), - tempMax: document.querySelector('.temp-max'), - windIcon: document.querySelector('.wind-icon'), - speed: document.querySelector('.speed'), - deg: document.querySelector('.deg'), - }; - - console.log(DOM); - - // BITTE EIGENEN API KEY VERWENDEN - // (NICHT DIESEN KEY VERWENDEN: b62eaccfd1a09cf1d04b00bd2ec689e7) - const API_KEY = ''; - - // https://www.latlong.net/ - const LAT = 43.72072300281546; - const LON = 7.352450291796612; - - const TEMP_MAX_ALERT_AMOUNT = 30; - const TEMP_MIN_ALERT_AMOUNT = 10; - - // === INIT ============= - const init = () => { - console.log('init!'); - getWeather().then((data) => { - console.log(data); - if (data) { - DOM.weatherBox.classList.add('show', 'animate__flipInX'); - setWeather(data); - } - }); - }; - - // === EVENTHANDLER ===== - - // === XHR/FETCH ======== - const getWeather = async () => { - try { - const res = await fetch( - `https://api.openweathermap.org/data/2.5/weather?lat=${LAT}&lon=${LON}&units=metric&appid=${API_KEY}`, - ); - - if (!res.ok) throw new Error('Fetch Error'); - - const data = await res.json(); - return data; // -> Promise - } catch (error) { - console.error(error); - return error; - } - }; - - // === FUNCTIONS ======== - const setWeather = (data) => { - const { main, description, icon } = data.weather[0]; - const { temp, temp_min: tempMin, temp_max: tempMax } = data.main; - const { deg, speed } = data.wind; - - DOM.figcaption.textContent = main; - DOM.description.textContent = description; - DOM.temp.textContent = Number(temp).toFixed(1); - DOM.tempMin.textContent = Number(tempMin).toFixed(2); - DOM.tempMax.textContent = Number(tempMax).toFixed(2); - DOM.speed.textContent = Number(speed); - DOM.deg.textContent = Number(deg); - - DOM.weatherIcon.src = `https://openweathermap.org/img/wn/${icon}@2x.png`; - - DOM.windIcon.style.transform = `rotate(${Number(deg) - 45}deg)`; - - if (Number(temp) >= TEMP_MAX_ALERT_AMOUNT) { - DOM.temp.classList.add('danger'); - } else if (Number(temp) <= TEMP_MIN_ALERT_AMOUNT) { - DOM.temp.classList.add('frozen'); - } - }; - - init(); -})(); diff --git a/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/_index.scss b/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/_index.scss deleted file mode 100644 index dcefbc9..0000000 --- a/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/_index.scss +++ /dev/null @@ -1,3 +0,0 @@ -// @import 'bootstrap-5.3.8/bootstrap-grid'; -@import 'bootstrap-5.3.8/bootstrap'; -// @import 'bulma-1.04/index' diff --git a/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_accordion.scss b/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_accordion.scss deleted file mode 100644 index e9f267f..0000000 --- a/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_accordion.scss +++ /dev/null @@ -1,153 +0,0 @@ -// -// Base styles -// - -.accordion { - // scss-docs-start accordion-css-vars - --#{$prefix}accordion-color: #{$accordion-color}; - --#{$prefix}accordion-bg: #{$accordion-bg}; - --#{$prefix}accordion-transition: #{$accordion-transition}; - --#{$prefix}accordion-border-color: #{$accordion-border-color}; - --#{$prefix}accordion-border-width: #{$accordion-border-width}; - --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; - --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; - --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; - --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; - --#{$prefix}accordion-btn-color: #{$accordion-button-color}; - --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; - --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; - --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; - --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; - --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; - --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; - --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; - --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; - --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; - // scss-docs-end accordion-css-vars -} - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); - @include font-size($font-size-base); - color: var(--#{$prefix}accordion-btn-color); - text-align: left; // Reset button style - background-color: var(--#{$prefix}accordion-btn-bg); - border: 0; - @include border-radius(0); - overflow-anchor: none; - @include transition(var(--#{$prefix}accordion-transition)); - - &:not(.collapsed) { - color: var(--#{$prefix}accordion-active-color); - background-color: var(--#{$prefix}accordion-active-bg); - box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list - - &::after { - background-image: var(--#{$prefix}accordion-btn-active-icon); - transform: var(--#{$prefix}accordion-btn-icon-transform); - } - } - - // Accordion icon - &::after { - flex-shrink: 0; - width: var(--#{$prefix}accordion-btn-icon-width); - height: var(--#{$prefix}accordion-btn-icon-width); - margin-left: auto; - content: ""; - background-image: var(--#{$prefix}accordion-btn-icon); - background-repeat: no-repeat; - background-size: var(--#{$prefix}accordion-btn-icon-width); - @include transition(var(--#{$prefix}accordion-btn-icon-transition)); - } - - &:hover { - z-index: 2; - } - - &:focus { - z-index: 3; - outline: 0; - box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); - } -} - -.accordion-header { - margin-bottom: 0; -} - -.accordion-item { - color: var(--#{$prefix}accordion-color); - background-color: var(--#{$prefix}accordion-bg); - border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); - - &:first-of-type { - @include border-top-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - &:not(:first-of-type) { - border-top: 0; - } - - // Only set a border-radius on the last item if the accordion is collapsed - &:last-of-type { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - &.collapsed { - @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - > .accordion-collapse { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - } - } -} - -.accordion-body { - padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); -} - - -// Flush accordion items -// -// Remove borders and border-radius to keep accordion items edge-to-edge. - -.accordion-flush { - > .accordion-item { - border-right: 0; - border-left: 0; - @include border-radius(0); - - &:first-child { border-top: 0; } - &:last-child { border-bottom: 0; } - - // stylelint-disable selector-max-class - > .accordion-collapse, - > .accordion-header .accordion-button, - > .accordion-header .accordion-button.collapsed { - @include border-radius(0); - } - // stylelint-enable selector-max-class - } -} - -@if $enable-dark-mode { - @include color-mode(dark) { - .accordion-button::after { - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; - } - } -} diff --git a/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_alert.scss b/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_alert.scss deleted file mode 100644 index b8cff9b..0000000 --- a/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_alert.scss +++ /dev/null @@ -1,68 +0,0 @@ -// -// Base styles -// - -.alert { - // scss-docs-start alert-css-vars - --#{$prefix}alert-bg: transparent; - --#{$prefix}alert-padding-x: #{$alert-padding-x}; - --#{$prefix}alert-padding-y: #{$alert-padding-y}; - --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; - --#{$prefix}alert-color: inherit; - --#{$prefix}alert-border-color: transparent; - --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); - --#{$prefix}alert-border-radius: #{$alert-border-radius}; - --#{$prefix}alert-link-color: inherit; - // scss-docs-end alert-css-vars - - position: relative; - padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); - margin-bottom: var(--#{$prefix}alert-margin-bottom); - color: var(--#{$prefix}alert-color); - background-color: var(--#{$prefix}alert-bg); - border: var(--#{$prefix}alert-border); - @include border-radius(var(--#{$prefix}alert-border-radius)); -} - -// Headings for larger alerts -.alert-heading { - // Specified to prevent conflicts of changing $headings-color - color: inherit; -} - -// Provide class for links that match alerts -.alert-link { - font-weight: $alert-link-font-weight; - color: var(--#{$prefix}alert-link-color); -} - - -// Dismissible alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissible { - padding-right: $alert-dismissible-padding-r; - - // Adjust close link position - .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: $stretched-link-z-index + 1; - padding: $alert-padding-y * 1.25 $alert-padding-x; - } -} - - -// scss-docs-start alert-modifiers -// Generate contextual modifier classes for colorizing the alert -@each $state in map-keys($theme-colors) { - .alert-#{$state} { - --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); - --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); - --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); - --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); - } -} -// scss-docs-end alert-modifiers diff --git a/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_badge.scss b/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_badge.scss deleted file mode 100644 index cc3d269..0000000 --- a/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_badge.scss +++ /dev/null @@ -1,38 +0,0 @@ -// Base class -// -// Requires one of the contextual, color modifier classes for `color` and -// `background-color`. - -.badge { - // scss-docs-start badge-css-vars - --#{$prefix}badge-padding-x: #{$badge-padding-x}; - --#{$prefix}badge-padding-y: #{$badge-padding-y}; - @include rfs($badge-font-size, --#{$prefix}badge-font-size); - --#{$prefix}badge-font-weight: #{$badge-font-weight}; - --#{$prefix}badge-color: #{$badge-color}; - --#{$prefix}badge-border-radius: #{$badge-border-radius}; - // scss-docs-end badge-css-vars - - display: inline-block; - padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x); - @include font-size(var(--#{$prefix}badge-font-size)); - font-weight: var(--#{$prefix}badge-font-weight); - line-height: 1; - color: var(--#{$prefix}badge-color); - text-align: center; - white-space: nowrap; - vertical-align: baseline; - @include border-radius(var(--#{$prefix}badge-border-radius)); - @include gradient-bg(); - - // Empty badges collapse automatically - &:empty { - display: none; - } -} - -// Quick fix for badges in buttons -.btn .badge { - position: relative; - top: -1px; -} diff --git a/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss b/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss deleted file mode 100644 index b8252ff..0000000 --- a/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss +++ /dev/null @@ -1,40 +0,0 @@ -.breadcrumb { - // scss-docs-start breadcrumb-css-vars - --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x}; - --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y}; - --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom}; - @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size); - --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg}; - --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius}; - --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color}; - --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x}; - --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color}; - // scss-docs-end breadcrumb-css-vars - - display: flex; - flex-wrap: wrap; - padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x); - margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom); - @include font-size(var(--#{$prefix}breadcrumb-font-size)); - list-style: none; - background-color: var(--#{$prefix}breadcrumb-bg); - @include border-radius(var(--#{$prefix}breadcrumb-border-radius)); -} - -.breadcrumb-item { - // The separator between breadcrumbs (by default, a forward-slash: "/") - + .breadcrumb-item { - padding-left: var(--#{$prefix}breadcrumb-item-padding-x); - - &::before { - float: left; // Suppress inline spacings and underlining of the separator - padding-right: var(--#{$prefix}breadcrumb-item-padding-x); - color: var(--#{$prefix}breadcrumb-divider-color); - content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; - } - } - - &.active { - color: var(--#{$prefix}breadcrumb-item-active-color); - } -} diff --git a/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_button-group.scss b/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_button-group.scss deleted file mode 100644 index 78e1252..0000000 --- a/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_button-group.scss +++ /dev/null @@ -1,147 +0,0 @@ -// Make the div behave like a button -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; // match .btn alignment given font-size hack above - - > .btn { - position: relative; - flex: 1 1 auto; - } - - // Bring the hover, focused, and "active" buttons to the front to overlay - // the borders properly - > .btn-check:checked + .btn, - > .btn-check:focus + .btn, - > .btn:hover, - > .btn:focus, - > .btn:active, - > .btn.active { - z-index: 1; - } -} - -// Optional: Group multiple button groups together for a toolbar -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; - - .input-group { - width: auto; - } -} - -.btn-group { - @include border-radius($btn-border-radius); - - // Prevent double borders when buttons are next to each other - > :not(.btn-check:first-child) + .btn, - > .btn-group:not(:first-child) { - margin-left: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn.dropdown-toggle-split:first-child, - > .btn-group:not(:last-child) > .btn { - @include border-end-radius(0); - } - - // The left radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-start-radius(0); - } -} - -// Sizing -// -// Remix the default button sizing classes into new ones for easier manipulation. - -.btn-group-sm > .btn { @extend .btn-sm; } -.btn-group-lg > .btn { @extend .btn-lg; } - - -// -// Split button dropdowns -// - -.dropdown-toggle-split { - padding-right: $btn-padding-x * .75; - padding-left: $btn-padding-x * .75; - - &::after, - .dropup &::after, - .dropend &::after { - margin-left: 0; - } - - .dropstart &::before { - margin-right: 0; - } -} - -.btn-sm + .dropdown-toggle-split { - padding-right: $btn-padding-x-sm * .75; - padding-left: $btn-padding-x-sm * .75; -} - -.btn-lg + .dropdown-toggle-split { - padding-right: $btn-padding-x-lg * .75; - padding-left: $btn-padding-x-lg * .75; -} - - -// The clickable button for toggling the menu -// Set the same inset shadow as the :active state -.btn-group.show .dropdown-toggle { - @include box-shadow($btn-active-box-shadow); - - // Show no shadow for `.btn-link` since it has no other button styles. - &.btn-link { - @include box-shadow(none); - } -} - - -// -// Vertical button groups -// - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; - - > .btn, - > .btn-group { - width: 100%; - } - - > .btn:not(:first-child), - > .btn-group:not(:first-child) { - margin-top: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn-group:not(:last-child) > .btn { - @include border-bottom-radius(0); - } - - // The top radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-top-radius(0); - } -} diff --git a/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_buttons.scss b/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_buttons.scss deleted file mode 100644 index caa4518..0000000 --- a/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_buttons.scss +++ /dev/null @@ -1,216 +0,0 @@ -// -// Base styles -// - -.btn { - // scss-docs-start btn-css-vars - --#{$prefix}btn-padding-x: #{$btn-padding-x}; - --#{$prefix}btn-padding-y: #{$btn-padding-y}; - --#{$prefix}btn-font-family: #{$btn-font-family}; - @include rfs($btn-font-size, --#{$prefix}btn-font-size); - --#{$prefix}btn-font-weight: #{$btn-font-weight}; - --#{$prefix}btn-line-height: #{$btn-line-height}; - --#{$prefix}btn-color: #{$btn-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-width: #{$btn-border-width}; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-border-radius: #{$btn-border-radius}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-box-shadow: #{$btn-box-shadow}; - --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity}; - --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5); - // scss-docs-end btn-css-vars - - display: inline-block; - padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x); - font-family: var(--#{$prefix}btn-font-family); - @include font-size(var(--#{$prefix}btn-font-size)); - font-weight: var(--#{$prefix}btn-font-weight); - line-height: var(--#{$prefix}btn-line-height); - color: var(--#{$prefix}btn-color); - text-align: center; - text-decoration: if($link-decoration == none, null, none); - white-space: $btn-white-space; - vertical-align: middle; - cursor: if($enable-button-pointers, pointer, null); - user-select: none; - border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color); - @include border-radius(var(--#{$prefix}btn-border-radius)); - @include gradient-bg(var(--#{$prefix}btn-bg)); - @include box-shadow(var(--#{$prefix}btn-box-shadow)); - @include transition($btn-transition); - - &:hover { - color: var(--#{$prefix}btn-hover-color); - text-decoration: if($link-hover-decoration == underline, none, null); - background-color: var(--#{$prefix}btn-hover-bg); - border-color: var(--#{$prefix}btn-hover-border-color); - } - - .btn-check + &:hover { - // override for the checkbox/radio buttons - color: var(--#{$prefix}btn-color); - background-color: var(--#{$prefix}btn-bg); - border-color: var(--#{$prefix}btn-border-color); - } - - &:focus-visible { - color: var(--#{$prefix}btn-hover-color); - @include gradient-bg(var(--#{$prefix}btn-hover-bg)); - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:focus-visible + & { - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:checked + &, - :not(.btn-check) + &:active, - &:first-child:active, - &.active, - &.show { - color: var(--#{$prefix}btn-active-color); - background-color: var(--#{$prefix}btn-active-bg); - // Remove CSS gradients if they're enabled - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-active-border-color); - @include box-shadow(var(--#{$prefix}btn-active-shadow)); - - &:focus-visible { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - } - - .btn-check:checked:focus-visible + & { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - &:disabled, - &.disabled, - fieldset:disabled & { - color: var(--#{$prefix}btn-disabled-color); - pointer-events: none; - background-color: var(--#{$prefix}btn-disabled-bg); - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-disabled-border-color); - opacity: var(--#{$prefix}btn-disabled-opacity); - @include box-shadow(none); - } -} - - -// -// Alternate buttons -// - -// scss-docs-start btn-variant-loops -@each $color, $value in $theme-colors { - .btn-#{$color} { - @if $color == "light" { - @include button-variant( - $value, - $value, - $hover-background: shade-color($value, $btn-hover-bg-shade-amount), - $hover-border: shade-color($value, $btn-hover-border-shade-amount), - $active-background: shade-color($value, $btn-active-bg-shade-amount), - $active-border: shade-color($value, $btn-active-border-shade-amount) - ); - } @else if $color == "dark" { - @include button-variant( - $value, - $value, - $hover-background: tint-color($value, $btn-hover-bg-tint-amount), - $hover-border: tint-color($value, $btn-hover-border-tint-amount), - $active-background: tint-color($value, $btn-active-bg-tint-amount), - $active-border: tint-color($value, $btn-active-border-tint-amount) - ); - } @else { - @include button-variant($value, $value); - } - } -} - -@each $color, $value in $theme-colors { - .btn-outline-#{$color} { - @include button-outline-variant($value); - } -} -// scss-docs-end btn-variant-loops - - -// -// Link buttons -// - -// Make a button look and behave like a link -.btn-link { - --#{$prefix}btn-font-weight: #{$font-weight-normal}; - --#{$prefix}btn-color: #{$btn-link-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-hover-color: #{$btn-link-hover-color}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-active-color: #{$btn-link-hover-color}; - --#{$prefix}btn-active-border-color: transparent; - --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color}; - --#{$prefix}btn-disabled-border-color: transparent; - --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows - --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb}; - - text-decoration: $link-decoration; - @if $enable-gradients { - background-image: none; - } - - &:hover, - &:focus-visible { - text-decoration: $link-hover-decoration; - } - - &:focus-visible { - color: var(--#{$prefix}btn-color); - } - - &:hover { - color: var(--#{$prefix}btn-hover-color); - } - - // No need for an active state here -} - - -// -// Button Sizes -// - -.btn-lg { - @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); -} - -.btn-sm { - @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); -} diff --git a/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_card.scss b/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_card.scss deleted file mode 100644 index dcebe6a..0000000 --- a/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_card.scss +++ /dev/null @@ -1,238 +0,0 @@ -// -// Base styles -// - -.card { - // scss-docs-start card-css-vars - --#{$prefix}card-spacer-y: #{$card-spacer-y}; - --#{$prefix}card-spacer-x: #{$card-spacer-x}; - --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y}; - --#{$prefix}card-title-color: #{$card-title-color}; - --#{$prefix}card-subtitle-color: #{$card-subtitle-color}; - --#{$prefix}card-border-width: #{$card-border-width}; - --#{$prefix}card-border-color: #{$card-border-color}; - --#{$prefix}card-border-radius: #{$card-border-radius}; - --#{$prefix}card-box-shadow: #{$card-box-shadow}; - --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius}; - --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y}; - --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x}; - --#{$prefix}card-cap-bg: #{$card-cap-bg}; - --#{$prefix}card-cap-color: #{$card-cap-color}; - --#{$prefix}card-height: #{$card-height}; - --#{$prefix}card-color: #{$card-color}; - --#{$prefix}card-bg: #{$card-bg}; - --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding}; - --#{$prefix}card-group-margin: #{$card-group-margin}; - // scss-docs-end card-css-vars - - position: relative; - display: flex; - flex-direction: column; - min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 - height: var(--#{$prefix}card-height); - color: var(--#{$prefix}body-color); - word-wrap: break-word; - background-color: var(--#{$prefix}card-bg); - background-clip: border-box; - border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - @include border-radius(var(--#{$prefix}card-border-radius)); - @include box-shadow(var(--#{$prefix}card-box-shadow)); - - > hr { - margin-right: 0; - margin-left: 0; - } - - > .list-group { - border-top: inherit; - border-bottom: inherit; - - &:first-child { - border-top-width: 0; - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); - } - - &:last-child { - border-bottom-width: 0; - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); - } - } - - // Due to specificity of the above selector (`.card > .list-group`), we must - // use a child selector here to prevent double borders. - > .card-header + .list-group, - > .list-group + .card-footer { - border-top: 0; - } -} - -.card-body { - // Enable `flex-grow: 1` for decks and groups so that card blocks take up - // as much space as possible, ensuring footers are aligned to the bottom. - flex: 1 1 auto; - padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x); - color: var(--#{$prefix}card-color); -} - -.card-title { - margin-bottom: var(--#{$prefix}card-title-spacer-y); - color: var(--#{$prefix}card-title-color); -} - -.card-subtitle { - margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list - margin-bottom: 0; - color: var(--#{$prefix}card-subtitle-color); -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link { - &:hover { - text-decoration: if($link-hover-decoration == underline, none, null); - } - - + .card-link { - margin-left: var(--#{$prefix}card-spacer-x); - } -} - -// -// Optional textual caps -// - -.card-header { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - margin-bottom: 0; // Removes the default margin-bottom of - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:first-child { - @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0); - } -} - -.card-footer { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:last-child { - @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius)); - } -} - - -// -// Header navs -// - -.card-header-tabs { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - border-bottom: 0; - - .nav-link.active { - background-color: var(--#{$prefix}card-bg); - border-bottom-color: var(--#{$prefix}card-bg); - } -} - -.card-header-pills { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list -} - -// Card image -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: var(--#{$prefix}card-img-overlay-padding); - @include border-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch -} - -.card-img, -.card-img-top { - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-bottom { - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); -} - - -// -// Card groups -// - -.card-group { - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - margin-bottom: var(--#{$prefix}card-group-margin); - } - - @include media-breakpoint-up(sm) { - display: flex; - flex-flow: row wrap; - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - flex: 1 0 0; - margin-bottom: 0; - - + .card { - margin-left: 0; - border-left: 0; - } - - // Handle rounded corners - @if $enable-rounded { - &:not(:last-child) { - @include border-end-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-right-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-right-radius: 0; - } - } - - &:not(:first-child) { - @include border-start-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-left-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-left-radius: 0; - } - } - } - } - } -} diff --git a/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_carousel.scss b/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_carousel.scss deleted file mode 100644 index 5ebf6b1..0000000 --- a/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_carousel.scss +++ /dev/null @@ -1,226 +0,0 @@ -// Notes on the classes: -// -// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) -// even when their scroll action started on a carousel, but for compatibility (with Firefox) -// we're preventing all actions instead -// 2. The .carousel-item-start and .carousel-item-end is used to indicate where -// the active slide is heading. -// 3. .active.carousel-item is the current slide. -// 4. .active.carousel-item-start and .active.carousel-item-end is the current -// slide in its in-transition state. Only one of these occurs at a time. -// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end -// is the upcoming slide in transition. - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; - @include clearfix(); -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - @include transition($carousel-transition); -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); -} - - -// -// Alternate transitions -// - -.carousel-fade { - .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; - } - - .carousel-item.active, - .carousel-item-next.carousel-item-start, - .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; - } - - .active.carousel-item-start, - .active.carousel-item-end { - z-index: 0; - opacity: 0; - @include transition(opacity 0s $carousel-transition-duration); - } -} - - -// -// Left/right controls for nav -// - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - // Use flex for alignment (1-3) - display: flex; // 1. allow flex styles - align-items: center; // 2. vertically center contents - justify-content: center; // 3. horizontally center contents - width: $carousel-control-width; - padding: 0; - color: $carousel-control-color; - text-align: center; - background: none; - filter: var(--#{$prefix}carousel-control-icon-filter); - border: 0; - opacity: $carousel-control-opacity; - @include transition($carousel-control-transition); - - // Hover/focus state - &:hover, - &:focus { - color: $carousel-control-color; - text-decoration: none; - outline: 0; - opacity: $carousel-control-hover-opacity; - } -} -.carousel-control-prev { - left: 0; - background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); -} -.carousel-control-next { - right: 0; - background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); -} - -// Icons for within -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: $carousel-control-icon-width; - height: $carousel-control-icon-width; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; -} - -.carousel-control-prev-icon { - background-image: escape-svg($carousel-control-prev-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-next-icon-bg) + "*/"}; -} -.carousel-control-next-icon { - background-image: escape-svg($carousel-control-next-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-prev-icon-bg) + "*/"}; -} - -// Optional indicator pips/controls -// -// Add a container (such as a list) with the following class and add an item (ideally a focusable control, -// like a button) with data-bs-target for each slide your carousel holds. - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - // Use the .carousel-control's width as margin so we don't overlay those - margin-right: $carousel-control-width; - margin-bottom: 1rem; - margin-left: $carousel-control-width; - - [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: $carousel-indicator-width; - height: $carousel-indicator-height; - padding: 0; - margin-right: $carousel-indicator-spacer; - margin-left: $carousel-indicator-spacer; - text-indent: -999px; - cursor: pointer; - background-color: var(--#{$prefix}carousel-indicator-active-bg); - background-clip: padding-box; - border: 0; - // Use transparent borders to increase the hit area by 10px on top and bottom. - border-top: $carousel-indicator-hit-area-height solid transparent; - border-bottom: $carousel-indicator-hit-area-height solid transparent; - opacity: $carousel-indicator-opacity; - @include transition($carousel-indicator-transition); - } - - .active { - opacity: $carousel-indicator-active-opacity; - } -} - - -// Optional captions -// -// - -.carousel-caption { - position: absolute; - right: (100% - $carousel-caption-width) * .5; - bottom: $carousel-caption-spacer; - left: (100% - $carousel-caption-width) * .5; - padding-top: $carousel-caption-padding-y; - padding-bottom: $carousel-caption-padding-y; - color: var(--#{$prefix}carousel-caption-color); - text-align: center; -} - -// Dark mode carousel - -@mixin carousel-dark() { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg-dark}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color-dark}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter-dark}; -} - -.carousel-dark { - @include carousel-dark(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include carousel-dark(); - } -} diff --git a/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_close.scss b/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_close.scss deleted file mode 100644 index d53c96f..0000000 --- a/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_close.scss +++ /dev/null @@ -1,66 +0,0 @@ -// Transparent background and border properties included for button version. -// iOS requires the button element instead of an anchor tag. -// If you want the anchor version, it requires `href="#"`. -// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile - -.btn-close { - // scss-docs-start close-css-vars - --#{$prefix}btn-close-color: #{$btn-close-color}; - --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) }; - --#{$prefix}btn-close-opacity: #{$btn-close-opacity}; - --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity}; - --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow}; - --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity}; - --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity}; - // scss-docs-end close-css-vars - - box-sizing: content-box; - width: $btn-close-width; - height: $btn-close-height; - padding: $btn-close-padding-y $btn-close-padding-x; - color: var(--#{$prefix}btn-close-color); - background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements - filter: var(--#{$prefix}btn-close-filter); - border: 0; // for button elements - @include border-radius(); - opacity: var(--#{$prefix}btn-close-opacity); - - // Override 's hover style - &:hover { - color: var(--#{$prefix}btn-close-color); - text-decoration: none; - opacity: var(--#{$prefix}btn-close-hover-opacity); - } - - &:focus { - outline: 0; - box-shadow: var(--#{$prefix}btn-close-focus-shadow); - opacity: var(--#{$prefix}btn-close-focus-opacity); - } - - &:disabled, - &.disabled { - pointer-events: none; - user-select: none; - opacity: var(--#{$prefix}btn-close-disabled-opacity); - } -} - -@mixin btn-close-white() { - --#{$prefix}btn-close-filter: #{$btn-close-filter-dark}; -} - -.btn-close-white { - @include btn-close-white(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}btn-close-filter: #{$btn-close-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include btn-close-white(); - } -} diff --git a/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_containers.scss b/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_containers.scss deleted file mode 100644 index 83b3138..0000000 --- a/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_containers.scss +++ /dev/null @@ -1,41 +0,0 @@ -// Container widths -// -// Set the container width, and override it for fixed navbars in media queries. - -@if $enable-container-classes { - // Single container class with breakpoint max-widths - .container, - // 100% wide container at all breakpoints - .container-fluid { - @include make-container(); - } - - // Responsive containers that are 100% wide until a breakpoint - @each $breakpoint, $container-max-width in $container-max-widths { - .container-#{$breakpoint} { - @extend .container-fluid; - } - - @include media-breakpoint-up($breakpoint, $grid-breakpoints) { - %responsive-container-#{$breakpoint} { - max-width: $container-max-width; - } - - // Extend each breakpoint which is smaller or equal to the current breakpoint - $extend-breakpoint: true; - - @each $name, $width in $grid-breakpoints { - @if ($extend-breakpoint) { - .container#{breakpoint-infix($name, $grid-breakpoints)} { - @extend %responsive-container-#{$breakpoint}; - } - - // Once the current breakpoint is reached, stop extending - @if ($breakpoint == $name) { - $extend-breakpoint: false; - } - } - } - } - } -} diff --git a/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_dropdown.scss b/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_dropdown.scss deleted file mode 100644 index 587ebb4..0000000 --- a/02_advanced/unterricht/tag19/01_weather-box/dev/assets/scss/01_frameworks/bootstrap-5.3.8/_dropdown.scss +++ /dev/null @@ -1,250 +0,0 @@ -// The dropdown wrapper (`
    `) -.dropup, -.dropend, -.dropdown, -.dropstart, -.dropup-center, -.dropdown-center { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; - - // Generate the caret automatically - @include caret(); -} - -// The dropdown menu -.dropdown-menu { - // scss-docs-start dropdown-css-vars - --#{$prefix}dropdown-zindex: #{$zindex-dropdown}; - --#{$prefix}dropdown-min-width: #{$dropdown-min-width}; - --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x}; - --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y}; - --#{$prefix}dropdown-spacer: #{$dropdown-spacer}; - @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size); - --#{$prefix}dropdown-color: #{$dropdown-color}; - --#{$prefix}dropdown-bg: #{$dropdown-bg}; - --#{$prefix}dropdown-border-color: #{$dropdown-border-color}; - --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius}; - --#{$prefix}dropdown-border-width: #{$dropdown-border-width}; - --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius}; - --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg}; - --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y}; - --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow}; - --#{$prefix}dropdown-link-color: #{$dropdown-link-color}; - --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color}; - --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg}; - --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color}; - --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg}; - --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color}; - --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x}; - --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y}; - --#{$prefix}dropdown-header-color: #{$dropdown-header-color}; - --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x}; - --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y}; - // scss-docs-end dropdown-css-vars - - position: absolute; - z-index: var(--#{$prefix}dropdown-zindex); - display: none; // none by default, but block on "open" of the menu - min-width: var(--#{$prefix}dropdown-min-width); - padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x); - margin: 0; // Override default margin of ul - @include font-size(var(--#{$prefix}dropdown-font-size)); - color: var(--#{$prefix}dropdown-color); - text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) - list-style: none; - background-color: var(--#{$prefix}dropdown-bg); - background-clip: padding-box; - border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color); - @include border-radius(var(--#{$prefix}dropdown-border-radius)); - @include box-shadow(var(--#{$prefix}dropdown-box-shadow)); - - &[data-bs-popper] { - top: 100%; - left: 0; - margin-top: var(--#{$prefix}dropdown-spacer); - } - - @if $dropdown-padding-y == 0 { - > .dropdown-item:first-child, - > li:first-child .dropdown-item { - @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - > .dropdown-item:last-child, - > li:last-child .dropdown-item { - @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - - } -} - -// scss-docs-start responsive-breakpoints -// We deliberately hardcode the `bs-` prefix because we check -// this custom property in JS to determine Popper's positioning - -@each $breakpoint in map-keys($grid-breakpoints) { - @include media-breakpoint-up($breakpoint) { - $infix: breakpoint-infix($breakpoint, $grid-breakpoints); - - .dropdown-menu#{$infix}-start { - --bs-position: start; - - &[data-bs-popper] { - right: auto; - left: 0; - } - } - - .dropdown-menu#{$infix}-end { - --bs-position: end; - - &[data-bs-popper] { - right: 0; - left: auto; - } - } - } -} -// scss-docs-end responsive-breakpoints - -// Allow for dropdowns to go bottom up (aka, dropup-menu) -// Just add .dropup after the standard .dropdown class and you're set. -.dropup { - .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(up); - } -} - -.dropend { - .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(end); - &::after { - vertical-align: 0; - } - } -} - -.dropstart { - .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(start); - &::before { - vertical-align: 0; - } - } -} - - -// Dividers (basically an `
    `) within the dropdown -.dropdown-divider { - height: 0; - margin: var(--#{$prefix}dropdown-divider-margin-y) 0; - overflow: hidden; - border-top: 1px solid var(--#{$prefix}dropdown-divider-bg); - opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
    element -} - -// Links, buttons, and more within the dropdown menu -// -// `
    - - - - - - - ); -}; -export default RowProduct; diff --git a/05_react/unterricht/tag53/react-app/src/main.jsx b/05_react/unterricht/tag53/react-app/src/main.jsx deleted file mode 100644 index 6187b22..0000000 --- a/05_react/unterricht/tag53/react-app/src/main.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; -import { BrowserRouter } from 'react-router-dom'; - -// eigene separate Gestaltung mit main.scss (beinhaltet boostrap) -import './styles/main.scss'; - -import 'bootstrap'; // bootstrap JS wird über esbuild aus node_modules ausgelesen und eingebunden (bundled) - -import App from './App.jsx'; - -createRoot(document.getElementById('root')).render( - - - - - , -); diff --git a/05_react/unterricht/tag53/react-app/src/pages/About.jsx b/05_react/unterricht/tag53/react-app/src/pages/About.jsx deleted file mode 100644 index 6be700c..0000000 --- a/05_react/unterricht/tag53/react-app/src/pages/About.jsx +++ /dev/null @@ -1,13 +0,0 @@ -const About = (props) => { - // const { } = props; - - return ( -
    -
    -

    About

    -

    Welcome to the Single-Page-Application (SPA) with React. This is the About page.

    -
    -
    - ); -}; -export default About; diff --git a/05_react/unterricht/tag53/react-app/src/pages/Contact.jsx b/05_react/unterricht/tag53/react-app/src/pages/Contact.jsx deleted file mode 100644 index 68ff51a..0000000 --- a/05_react/unterricht/tag53/react-app/src/pages/Contact.jsx +++ /dev/null @@ -1,16 +0,0 @@ -const Contact = (props) => { - // const { } = props; - - return ( -
    -
    -

    Contact

    -

    - Lorem ipsum dolor, sit amet consectetur adipisicing elit. Iste suscipit eos autem iure soluta laboriosam in - perferendis atque explicabo, possimus eius? Ea magnam sed atque exercitationem officiis ipsum, deserunt iste. -

    -
    -
    - ); -}; -export default Contact; diff --git a/05_react/unterricht/tag53/react-app/src/pages/Home.jsx b/05_react/unterricht/tag53/react-app/src/pages/Home.jsx deleted file mode 100644 index ee88d61..0000000 --- a/05_react/unterricht/tag53/react-app/src/pages/Home.jsx +++ /dev/null @@ -1,13 +0,0 @@ -const Home = (props) => { - // const { } = props; - - return ( -
    -
    -

    Hello, Spa!

    -

    Welcome to the Single-Page-Application (SPA) with React. This is the Home page.

    -
    -
    - ); -}; -export default Home; diff --git a/05_react/unterricht/tag53/react-app/src/pages/projects/Fibonacci.jsx b/05_react/unterricht/tag53/react-app/src/pages/projects/Fibonacci.jsx deleted file mode 100644 index 0bfeda6..0000000 --- a/05_react/unterricht/tag53/react-app/src/pages/projects/Fibonacci.jsx +++ /dev/null @@ -1,45 +0,0 @@ -import { useState, useMemo } from 'react'; -import { FaMinus, FaPlus } from 'react-icons/fa6'; - -const Fibonacci = () => { - const [num, setNum] = useState(5); - - const fibonacci = useMemo(() => { - console.log('Fibonacci number is being calculated...'); - function fib(n) { - // Define a recursive function within the callback - if (n <= 1) { - return n; - } - return fib(n - 1) + fib(n - 2); - } - return fib(num); // Call the inner function - }, [num]); - - return ( -
    -
    -
    - - {num} - -
    -

    - The {num}th Fibonacci number is: {fibonacci} -

    -
    -
    - ); -}; - -export default Fibonacci; diff --git a/05_react/unterricht/tag53/react-app/src/pages/projects/TableProducts.jsx b/05_react/unterricht/tag53/react-app/src/pages/projects/TableProducts.jsx deleted file mode 100644 index 37f60fb..0000000 --- a/05_react/unterricht/tag53/react-app/src/pages/projects/TableProducts.jsx +++ /dev/null @@ -1,36 +0,0 @@ -import { useEffect, useState } from 'react'; -import axios from 'axios'; - -import Table from '../../components/tables/TableProducts'; - -const TableProducts = (props) => { - // const { } = props; - - const [items, setItems] = useState([]); - - useEffect(() => { - const getItems = async () => { - const { data } = await axios.get('/data/nerdshop-products.json'); - setItems(data); - }; - getItems(); - - // axios.get('/data/nerdshop-products.json').then((res) => { - // // console.log(res.data); - // setItems(res.data); - // }); - - return () => {}; - }, []); - - return ( -
    -
    -

    Table products

    -

    A inventory table of products

    -
    - {items.length > 0 &&
    ` alignment by inheriting `text-align`. -// 3. Fix alignment for Safari - -th { - font-weight: $table-th-font-weight; // 1 - text-align: inherit; // 2 - text-align: -webkit-match-parent; // 3 -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - - -// Forms -// -// 1. Allow labels to use `margin` for spacing. - -label { - display: inline-block; // 1 -} - -// Remove the default `border-radius` that macOS Chrome adds. -// See https://github.com/twbs/bootstrap/issues/24093 - -button { - // stylelint-disable-next-line property-disallowed-list - border-radius: 0; -} - -// Explicitly remove focus outline in Chromium when it shouldn't be -// visible (e.g. as result of mouse click or touch tap). It already -// should be doing this automatically, but seems to currently be -// confused and applies its very visible two-tone outline anyway. - -button:focus:not(:focus-visible) { - outline: 0; -} - -// 1. Remove the margin in Firefox and Safari - -input, -button, -select, -optgroup, -textarea { - margin: 0; // 1 - font-family: inherit; - @include font-size(inherit); - line-height: inherit; -} - -// Remove the inheritance of text transform in Firefox -button, -select { - text-transform: none; -} -// Set the cursor for non-` - - diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/6/exercises/buy_button/buy_button.js b/03_dom/MATERIAL/accompanying_files/accompanying-files/6/exercises/buy_button/buy_button.js deleted file mode 100644 index d5be2e1..0000000 --- a/03_dom/MATERIAL/accompanying_files/accompanying-files/6/exercises/buy_button/buy_button.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -// Implement your code here \ No newline at end of file diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/6/exercises/running_light/light_off.png b/03_dom/MATERIAL/accompanying_files/accompanying-files/6/exercises/running_light/light_off.png deleted file mode 100644 index 4043472..0000000 Binary files a/03_dom/MATERIAL/accompanying_files/accompanying-files/6/exercises/running_light/light_off.png and /dev/null differ diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/6/exercises/running_light/light_on.png b/03_dom/MATERIAL/accompanying_files/accompanying-files/6/exercises/running_light/light_on.png deleted file mode 100644 index 0230d78..0000000 Binary files a/03_dom/MATERIAL/accompanying_files/accompanying-files/6/exercises/running_light/light_on.png and /dev/null differ diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/6/exercises/running_light/running_light.html b/03_dom/MATERIAL/accompanying_files/accompanying-files/6/exercises/running_light/running_light.html deleted file mode 100644 index cf73dee..0000000 --- a/03_dom/MATERIAL/accompanying_files/accompanying-files/6/exercises/running_light/running_light.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - Running light - - - - - - - lightbulb - lightbulb - lightbulb - lightbulb - lightbulb - lightbulb - lightbulb - lightbulb - lightbulb - lightbulb - - diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/6/exercises/running_light/running_light.js b/03_dom/MATERIAL/accompanying_files/accompanying-files/6/exercises/running_light/running_light.js deleted file mode 100644 index d5be2e1..0000000 --- a/03_dom/MATERIAL/accompanying_files/accompanying-files/6/exercises/running_light/running_light.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -// Implement your code here \ No newline at end of file diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/7/examples/font_size_big_small/font_size.html b/03_dom/MATERIAL/accompanying_files/accompanying-files/7/examples/font_size_big_small/font_size.html deleted file mode 100644 index 7ca6853..0000000 --- a/03_dom/MATERIAL/accompanying_files/accompanying-files/7/examples/font_size_big_small/font_size.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - Font Size - - - - - - - - - -

    - Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nam, error. Possimus in reiciendis quo numquam - assumenda, deleniti doloremque, facere alias odio animi est aliquam delectus corrupti ducimus fugiat ea commodi. -

    - - diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/7/examples/font_size_big_small/font_size.js b/03_dom/MATERIAL/accompanying_files/accompanying-files/7/examples/font_size_big_small/font_size.js deleted file mode 100644 index 31e65b8..0000000 --- a/03_dom/MATERIAL/accompanying_files/accompanying-files/7/examples/font_size_big_small/font_size.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -// Implement your code here diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/7/examples/tooltips/tooltips.css b/03_dom/MATERIAL/accompanying_files/accompanying-files/7/examples/tooltips/tooltips.css deleted file mode 100644 index 0880e5a..0000000 --- a/03_dom/MATERIAL/accompanying_files/accompanying-files/7/examples/tooltips/tooltips.css +++ /dev/null @@ -1,19 +0,0 @@ -p { - font-size: 1.5em; -} - -.keyword { - font-weight: bolder; - color: #225; -} - -#tooltip { - width: 250px; - border: 2px solid #339; - padding: 5px; - background-color: #eef; - opacity: 0.9; - - font-size: 1em; - text-align: justify; -} diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/7/examples/tooltips/tooltips.html b/03_dom/MATERIAL/accompanying_files/accompanying-files/7/examples/tooltips/tooltips.html deleted file mode 100644 index 58559df..0000000 --- a/03_dom/MATERIAL/accompanying_files/accompanying-files/7/examples/tooltips/tooltips.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - Tooltips - - - - - - - - -

    Quantum Entanglement Mugs

    -

    DRINK IN SYNC.

    - -

    - In the realm of quantum mechanics, particles - can be entangled in such a way that the state - of one instantly influences the state of another, no matter the distance. - This phenomenon fascinates physicists and challenges our understanding of - reality. Imagine sipping your coffee from a mug that celebrates this - quantum wonder. Just like entangled - particles, you and a friend can share a connection over any distance with - these mugs. Introducing the Quantum - Entanglement Mugs. -

    - -

    - Each set of Quantum Entanglement Mugs - includes two ceramic mugs designed to reflect the concept of entanglement. - Share one with a friend, and no matter how far apart you are, you'll feel - connected. Use them at your next physics meetup, and your colleagues will - appreciate your thoughtful nod to quantum theory. Enjoy your coffee! -

    - - diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/7/examples/tooltips/tooltips.js b/03_dom/MATERIAL/accompanying_files/accompanying-files/7/examples/tooltips/tooltips.js deleted file mode 100644 index 31e65b8..0000000 --- a/03_dom/MATERIAL/accompanying_files/accompanying-files/7/examples/tooltips/tooltips.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -// Implement your code here diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/7/exercises/color_change/color_change.html b/03_dom/MATERIAL/accompanying_files/accompanying-files/7/exercises/color_change/color_change.html deleted file mode 100644 index 6d99cd5..0000000 --- a/03_dom/MATERIAL/accompanying_files/accompanying-files/7/exercises/color_change/color_change.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - Document - - - - - - - - - - diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/7/exercises/color_change/color_change.js b/03_dom/MATERIAL/accompanying_files/accompanying-files/7/exercises/color_change/color_change.js deleted file mode 100644 index 31e65b8..0000000 --- a/03_dom/MATERIAL/accompanying_files/accompanying-files/7/exercises/color_change/color_change.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -// Implement your code here diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/7/exercises/tabbed_navigation/tabs.css b/03_dom/MATERIAL/accompanying_files/accompanying-files/7/exercises/tabbed_navigation/tabs.css deleted file mode 100644 index 6b97fdd..0000000 --- a/03_dom/MATERIAL/accompanying_files/accompanying-files/7/exercises/tabbed_navigation/tabs.css +++ /dev/null @@ -1,34 +0,0 @@ -.tabs > nav ul { - margin: 0; - padding: 8px 0 0 5px; - list-style-type: none; - list-style: none; - height: 30px; - border: 1px solid #999999; - background-color: #b0b0b0; -} -.tabs > nav ul li { - display: block; - float: left; - padding: 0 10px; - margin: 0 2px 0 0; - height: 29px; - white-space: nowrap; - line-height: 30px; - border-color: #999999; - border-width: 1px; - border-style: solid solid none solid; - border-top-left-radius: 5px; - border-top-right-radius: 5px; - background-color: #d8d8d8; - background-image: linear-gradient(to bottom, #f9f9f9, #d8d8d8); -} -.tabs > nav ul li:hover { - background-color: #cacaca; - background-image: linear-gradient(to bottom, #eeeeee, #cacaca); -} -.tabs > nav ul li.active { - border-bottom: 2px solid #f9f9f9; - background-image: none; - background-color: #f9f9f9; -} diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/7/exercises/tabbed_navigation/tabs.html b/03_dom/MATERIAL/accompanying_files/accompanying-files/7/exercises/tabbed_navigation/tabs.html deleted file mode 100644 index 8ff71b7..0000000 --- a/03_dom/MATERIAL/accompanying_files/accompanying-files/7/exercises/tabbed_navigation/tabs.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - SEO Seminar: 2-tägige Schulung Suchmaschinenoptimierung - - - - - - - -
    - - -
    -

    2-day SEO intensive seminar: with search engine optimization (SEO) to success on the web!

    -

    -
    - -
    -

    Topics

    -

    -
    - -
    -

    Learning Objectives

    -

    -
    - -
    -

    Date

    -

    -
    -
    - - diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/7/exercises/tabbed_navigation/tabs.js b/03_dom/MATERIAL/accompanying_files/accompanying-files/7/exercises/tabbed_navigation/tabs.js deleted file mode 100644 index 31e65b8..0000000 --- a/03_dom/MATERIAL/accompanying_files/accompanying-files/7/exercises/tabbed_navigation/tabs.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -// Implement your code here diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/8/exercises/awesome_tours/awesome_tours.css b/03_dom/MATERIAL/accompanying_files/accompanying-files/8/exercises/awesome_tours/awesome_tours.css deleted file mode 100644 index 594772a..0000000 --- a/03_dom/MATERIAL/accompanying_files/accompanying-files/8/exercises/awesome_tours/awesome_tours.css +++ /dev/null @@ -1,34 +0,0 @@ -#info { - position: absolute; - left: 20px; - top: 410px; - width: 639px; - border: 2px solid #000077; - padding: 4px; -} - -#info h3 { - margin-top: 2px; -} - -#pois { - position: absolute; - left: 20px; -} - -#pois img { - position: absolute; -} - -#fr { - top: 0px; - left: 0px; -} -#uk { - top: 0px; - left: 312px; -} -#it { - top: 201px; - left: 312px; -} diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/8/exercises/awesome_tours/awesome_tours.html b/03_dom/MATERIAL/accompanying_files/accompanying-files/8/exercises/awesome_tours/awesome_tours.html deleted file mode 100644 index c26621a..0000000 --- a/03_dom/MATERIAL/accompanying_files/accompanying-files/8/exercises/awesome_tours/awesome_tours.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - Awesome Tours - - - - - - -
    - Eiffel Tower - - Tower Bride - - Colosseum -
    - -
    -

    Move your mouse pointer over the images to read the descriptions here!

    -
    - - diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/8/exercises/awesome_tours/awesome_tours.js b/03_dom/MATERIAL/accompanying_files/accompanying-files/8/exercises/awesome_tours/awesome_tours.js deleted file mode 100644 index 31e65b8..0000000 --- a/03_dom/MATERIAL/accompanying_files/accompanying-files/8/exercises/awesome_tours/awesome_tours.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -// Implement your code here diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/8/exercises/awesome_tours/colosseum.jpg b/03_dom/MATERIAL/accompanying_files/accompanying-files/8/exercises/awesome_tours/colosseum.jpg deleted file mode 100644 index 1ed563e..0000000 Binary files a/03_dom/MATERIAL/accompanying_files/accompanying-files/8/exercises/awesome_tours/colosseum.jpg and /dev/null differ diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/8/exercises/awesome_tours/eiffelturm.jpg b/03_dom/MATERIAL/accompanying_files/accompanying-files/8/exercises/awesome_tours/eiffelturm.jpg deleted file mode 100644 index 5a0f7a4..0000000 Binary files a/03_dom/MATERIAL/accompanying_files/accompanying-files/8/exercises/awesome_tours/eiffelturm.jpg and /dev/null differ diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/8/exercises/awesome_tours/fr.png b/03_dom/MATERIAL/accompanying_files/accompanying-files/8/exercises/awesome_tours/fr.png deleted file mode 100644 index 01ecb01..0000000 Binary files a/03_dom/MATERIAL/accompanying_files/accompanying-files/8/exercises/awesome_tours/fr.png and /dev/null differ diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/8/exercises/awesome_tours/it.png b/03_dom/MATERIAL/accompanying_files/accompanying-files/8/exercises/awesome_tours/it.png deleted file mode 100644 index dfdd76a..0000000 Binary files a/03_dom/MATERIAL/accompanying_files/accompanying-files/8/exercises/awesome_tours/it.png and /dev/null differ diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/8/exercises/awesome_tours/tower_bridge.jpg b/03_dom/MATERIAL/accompanying_files/accompanying-files/8/exercises/awesome_tours/tower_bridge.jpg deleted file mode 100644 index e81a030..0000000 Binary files a/03_dom/MATERIAL/accompanying_files/accompanying-files/8/exercises/awesome_tours/tower_bridge.jpg and /dev/null differ diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/8/exercises/awesome_tours/uk.png b/03_dom/MATERIAL/accompanying_files/accompanying-files/8/exercises/awesome_tours/uk.png deleted file mode 100644 index b4555e5..0000000 Binary files a/03_dom/MATERIAL/accompanying_files/accompanying-files/8/exercises/awesome_tours/uk.png and /dev/null differ diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/9/examples/product_manager/product_list.js b/03_dom/MATERIAL/accompanying_files/accompanying-files/9/examples/product_manager/product_list.js deleted file mode 100644 index f582ff8..0000000 --- a/03_dom/MATERIAL/accompanying_files/accompanying-files/9/examples/product_manager/product_list.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -const PRODUCTS = [ - { name: '3Doodler 3D Printing Pen', price: 29.99 }, - { name: 'Powerstation 5- E. Maximus Chargus', price: 44.95 }, - { name: '8-Bit Legendary Hero Heat-Change Mug', price: 6.99 }, -]; diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/9/examples/product_manager/product_manager.html b/03_dom/MATERIAL/accompanying_files/accompanying-files/9/examples/product_manager/product_manager.html deleted file mode 100644 index 1b5a6f4..0000000 --- a/03_dom/MATERIAL/accompanying_files/accompanying-files/9/examples/product_manager/product_manager.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - Product Management - - - - - - -

    Products

    - - - - - - - - - - - - - - - - - - - - - -
    NamePrice in €
    3Doodler 3D Printing Pen29.99
    Powerstation 5- E. Maximus Chargus44.95
    8-Bit Legendary Hero Heat-Change Mug6.99
    - -

    - - € - - -

    - - diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/9/examples/product_manager/product_manager.js b/03_dom/MATERIAL/accompanying_files/accompanying-files/9/examples/product_manager/product_manager.js deleted file mode 100644 index 2d665e3..0000000 --- a/03_dom/MATERIAL/accompanying_files/accompanying-files/9/examples/product_manager/product_manager.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict' - -// Implement your code here diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/9/examples/product_manager/products.css b/03_dom/MATERIAL/accompanying_files/accompanying-files/9/examples/product_manager/products.css deleted file mode 100644 index a79e7b2..0000000 --- a/03_dom/MATERIAL/accompanying_files/accompanying-files/9/examples/product_manager/products.css +++ /dev/null @@ -1,31 +0,0 @@ -.price { - width: 4em; -} - -#products td { - border: 1px solid black; -} - -#products { - border-collapse: collapse; -} - -#products th, -#products td { - padding: 5px; - border: 1px solid black; -} - -#products th { - background-color: #aaa; -} - -#products td > button { - margin-right: 5px; - font-size: 120%; - width: 40px; -} - -.remove_product { - color: red; -} diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/css/styles.css b/03_dom/MATERIAL/accompanying_files/accompanying-files/css/styles.css deleted file mode 100644 index d904e6a..0000000 --- a/03_dom/MATERIAL/accompanying_files/accompanying-files/css/styles.css +++ /dev/null @@ -1,368 +0,0 @@ -/* -------------------------------------------- Haupt CSS fuer alle Seiten -------------------------------------------- */ - -/* ---------------- CSS-Reset ------------------- */ -html, -body, -a, -div, -h1, -h2, -h3, -h4, -h5, -h6, -span, -p, -img, -strong, -ul, -li, -table, -th, -td, -tr { - margin: 0px; - padding: 0px; - border: 0px none; - font-weight: normal; - font-style: inherit; - font-family: inherit; - font-variant: inherit; - text-decoration: none; - table-layout: inherit; -} - -/* ---------------- Body / HTML ------------------- */ - -html { - font-size: 100%; - background-color: #fffef7; -} - -body { - font-family: Helvetica, Arial, sans-serif; - font-size: 1.2em; - font-weight: normal; - color: black; - margin: 0rem auto 2rem auto; -} - -/* ---------------- layout ------------------- */ - -header { - background: url(../img/js_header.png) left top no-repeat transparent; - background-size: cover; - height: 250px; - min-width: 850px; -} - -header:after { - content: ' '; - display: block; - height: 250px; - background: rgba(255, 254, 247, 0); - background: -moz-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -webkit-gradient( - left top, - left bottom, - color-stop(0%, rgba(255, 254, 247, 0)), - color-stop(22%, rgba(255, 254, 247, 0.55)), - color-stop(42%, rgba(255, 254, 247, 0.7)), - color-stop(43%, rgba(255, 254, 247, 0.71)), - color-stop(61%, rgba(255, 254, 247, 0.78)), - color-stop(75%, rgba(255, 254, 247, 0.92)), - color-stop(87%, rgba(255, 254, 247, 1)), - color-stop(100%, rgba(255, 254, 247, 1)) - ); - background: -webkit-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -o-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -ms-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: linear-gradient( - to bottom, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fffef7', endColorstr='#fffef7', GradientType=0 ); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fffef7', endColorstr='#fffef7', GradientType=0 ); -} - -main, -footer { - width: 70%; - margin: 3rem auto; - min-width: 850px; - padding: 0 20px; - box-sizing: border-box; -} - -/* ---------------- Content ------------------- */ - -h1 { - color: #93412b; - font-size: 3em; - margin-bottom: 20px; - font-weight: bold; -} - -h2 { - color: #93412b; - font-size: 2.5em; - margin-bottom: 15px; -} - -h3 { - color: #93412b; - font-size: 2em; - margin-bottom: 10px; -} - -p { - line-height: 15px; - margin-bottom: 15px; - line-height: 1.7em; -} - -.cited { - font-style: italic; - font-size: 0.8em; -} - -.u { - text-decoration: underline; -} -.b { - font-weight: bold; -} -.i { - font-style: italic; -} -.align_right { - text-align: right; -} -.align_left { - text-align: left; - margin-right: 10px; -} -.align_center { - text-align: center; -} -.float_left { - float: left; -} -.float_right { - float: right; -} -.clear_both { - clear: both; -} -strong { - font-weight: bold; -} -.special { - color: #b7595b; - font-weight: bold; -} -.keyword { - color: #db6f50; - font-weight: bold; - font-style: italic; -} -.gray { - color: gray; -} - -/* Links */ -main a:link, -main a:visited { - color: #eb690b; - font-weight: bold; -} - -main a:focus, -main a:hover, -main a:active { - color: #eb690b; -} - -ul { - list-style-position: outside; - margin-bottom: 20px; - padding-left: 22px; -} - -ol { - margin-bottom: 20px; - padding-left: 30px; -} - -li { - line-height: 1.4em; -} - -/* ------- Article ------- */ - -h1 { - color: #93412b; - font-size: 2.7em; - margin-bottom: 20px; -} - -#buy_form input[type='button'] { - display: inline-block; - padding: 1px 20px 3px 20px; - background-color: #93412b; - color: white; - border: 1px solid white; - font-size: 1em; - height: 32px; -} - -#buy_form input[type='button']:hover { - background-color: white; - color: #93412b; - border: 1px solid #93412b; -} - -#buy_form select { - display: inline-block; - font-size: 1em; - background-color: white; - color: #93412b; - border: 1px solid #93412b; - height: 32px; -} - -/* ------- Chat ------- */ - -#chat { - width: 100%; - background-color: white; - border: 1px solid #9c352f; - height: 20rem; - position: relative; -} - -#chat_window { - background-color: white; - width: 85%; - float: left; - height: 95%; -} - -#chat_history { - position: absolute; - bottom: 8%; - max-height: 92%; - padding: 0px 0px 5px 7px; -} - -#chat_history p { - font-size: 0.6em; - margin: 0; -} - -#chat_text { - height: 8%; - position: absolute; - bottom: 0; - width: 85%; -} - -#chat_text input { - width: 98%; - display: block; - margin: auto; -} - -#chat_members { - list-style-type: none; - height: 100%; - width: 15%; - margin-left: 85%; - border-left: 1px solid #9c352f; - text-align: right; - box-sizing: border-box; - min-width: 100px; - font-size: 0.8em; - padding-top: 5px; -} - -#chat_members li { - line-height: 1.2em; - padding: 5px 10px 2px 15px; -} - -#chat_members .highlighted { - background-color: #c14d45; - color: white; -} -.chat_member { - font-weight: bold; -} -.chat_member1 { - color: #3626c8; -} -.chat_member2 { - color: #e38d0b; -} - -#member_search { - position: absolute; - right: 0; - bottom: 0; - width: 15%; - height: 8%; -} - -#member_search input { - width: 88%; - display: block; - margin: auto; - text-align: right; -} diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/img/favicon.icon b/03_dom/MATERIAL/accompanying_files/accompanying-files/img/favicon.icon deleted file mode 100644 index bd2cd28..0000000 Binary files a/03_dom/MATERIAL/accompanying_files/accompanying-files/img/favicon.icon and /dev/null differ diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/img/js_header.png b/03_dom/MATERIAL/accompanying_files/accompanying-files/img/js_header.png deleted file mode 100644 index 4d14ceb..0000000 Binary files a/03_dom/MATERIAL/accompanying_files/accompanying-files/img/js_header.png and /dev/null differ diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/img/logo.png b/03_dom/MATERIAL/accompanying_files/accompanying-files/img/logo.png deleted file mode 100644 index bbd9fcc..0000000 Binary files a/03_dom/MATERIAL/accompanying_files/accompanying-files/img/logo.png and /dev/null differ diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/img/newsboard_empty.png b/03_dom/MATERIAL/accompanying_files/accompanying-files/img/newsboard_empty.png deleted file mode 100644 index d650b1b..0000000 Binary files a/03_dom/MATERIAL/accompanying_files/accompanying-files/img/newsboard_empty.png and /dev/null differ diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/img/newsboard_paperclip.png b/03_dom/MATERIAL/accompanying_files/accompanying-files/img/newsboard_paperclip.png deleted file mode 100644 index 7f24721..0000000 Binary files a/03_dom/MATERIAL/accompanying_files/accompanying-files/img/newsboard_paperclip.png and /dev/null differ diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/img/newsboard_sheets.png b/03_dom/MATERIAL/accompanying_files/accompanying-files/img/newsboard_sheets.png deleted file mode 100644 index 14680cb..0000000 Binary files a/03_dom/MATERIAL/accompanying_files/accompanying-files/img/newsboard_sheets.png and /dev/null differ diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/img/thinkgeek_2024_hot_binary_heat_change_mug.gif b/03_dom/MATERIAL/accompanying_files/accompanying-files/img/thinkgeek_2024_hot_binary_heat_change_mug.gif deleted file mode 100644 index 3a9c8ad..0000000 Binary files a/03_dom/MATERIAL/accompanying_files/accompanying-files/img/thinkgeek_2024_hot_binary_heat_change_mug.gif and /dev/null differ diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/img/thinkgeek_2024_hot_binary_heat_change_mug_grid_embed.jpg b/03_dom/MATERIAL/accompanying_files/accompanying-files/img/thinkgeek_2024_hot_binary_heat_change_mug_grid_embed.jpg deleted file mode 100644 index 4399460..0000000 Binary files a/03_dom/MATERIAL/accompanying_files/accompanying-files/img/thinkgeek_2024_hot_binary_heat_change_mug_grid_embed.jpg and /dev/null differ diff --git a/03_dom/MATERIAL/accompanying_files/accompanying-files/lib/dom_helper.js b/03_dom/MATERIAL/accompanying_files/accompanying-files/lib/dom_helper.js deleted file mode 100644 index 53ac95c..0000000 --- a/03_dom/MATERIAL/accompanying_files/accompanying-files/lib/dom_helper.js +++ /dev/null @@ -1,4 +0,0 @@ -'use strict'; - -const $ = (q) => document.querySelector(q); -const $$ = (q) => Array.from(document.querySelectorAll(q)); diff --git a/03_dom/MATERIAL/accompanying_files/template/index.html b/03_dom/MATERIAL/accompanying_files/template/index.html deleted file mode 100644 index b0cee8e..0000000 --- a/03_dom/MATERIAL/accompanying_files/template/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - Index - - - - diff --git a/03_dom/MATERIAL/accompanying_files/template/script.js b/03_dom/MATERIAL/accompanying_files/template/script.js deleted file mode 100644 index a726efc..0000000 --- a/03_dom/MATERIAL/accompanying_files/template/script.js +++ /dev/null @@ -1 +0,0 @@ -'use strict'; \ No newline at end of file diff --git a/03_dom/agenda.md b/03_dom/agenda.md deleted file mode 100644 index b4ae06c..0000000 --- a/03_dom/agenda.md +++ /dev/null @@ -1,468 +0,0 @@ ---- -marp: true -theme: default ---- - -## JavaScript Grundlagen Teil 1. - ---- - -#### Tag 01 - -**Inhalt:** - -- Vorstellungsrunde -- Einrichtung der IDE -- Tools für die Webentwicklung (Emmet, Markdown, VS-Code) -- Arbeiten mit VSCode -- Konsolenausgaben mit `console.log()` - -**Übungen:** - -- Übungen Content Factory - ---- - -#### Tag 02 - -**Inhalt:** - -- Dialogfenster in JS `prompt()`, `alert()`, `confirm()` -- Kommentare in JS -- Rechnen in JS -- Datentyp String, Number, Boolean -- literal und typeof -- Prioritätsreihenfolge - -**Übungen:** - -Übung 3 - 6 - ---- - -#### Tag 03 - -**Inhalt:** - -- Variablen und Konstanten in JS -- Zusammengesetzte Zuweisungsoperatoren -- Increment & Decrement -- Strings verketten mit + - -**Übungen:** - -Übung 7 - 12 - ---- - -#### Tag 04 - -**Inhalt:** - -- Escape-Notation -- Implizite und explizite Typkonvertierung -- NaN - Paradoxon -- Math Object -- Number.toFixed() - -**Übungen:** - -Übung 14 - 18 - ---- - -#### Tag 05 - -**Inhalt:** - -- Repetition der Inhalte -- Relationale Operatoren & Vergleichoperatoren -- isNaN -- Lexikographische Vergleiche -- **Exkurs: HTML-Formularfelder** -- 1:1 Meeting - -**Übungen:** - -Übung Kontaktformular mit HTML und BS - ---- - -#### Tag 06 - -**Inhalt:** - -- **Exkurs: HTML Formularfelder mit BS** -- if else Verzweigung und ternärer Operator -- logische Operatoren UND und ODER -- unärer Operator (!) -- String Methoden Part I - -**Übungen:** - -Übung 19 - 26 - ---- - -#### Tag 07 - -**Inhalt:** - -- String Methoden Part II -- Funktionen in JS -- Funktionen mit Übergabeparameter -- Funktionen mit Rückgabewerten - -**Übungen:** - -Übung 26 - 35 - ---- - -#### Tag 08 - -**Inhalt:** - -- Funktionen mit Übergabeparameter -- Funktionen mit Rückgabewerten -- Guards -- Array Part 1 - -**Übungen:** - -Übung 35 - 38 - ---- - -#### Tag 09 - -**Inhalt:** - -- Array Methoden toSorted, toReversed, toSpliced -- toSorted, toReversed -- Array sort mit "compare function" -- Array: Higher Order Funktionen Part (sort map, forEach, reduce, some, every) - -**Übungen:** - -Übung 39 - 48 - ---- - -#### Tag 10 - -**Inhalt:** - -- Array.find und Array.findIndex -- Alle Array Higher Order Funktionen im Überblick -- local scoping -- **Exkurs: Schleifen** - -**Übungen:** - -Übung 46 - 48 - ---- - -## JavaScript für Fortgeschrittene - ---- - -#### Tag 11 - -**Inhalt:** - -- Einführung in JS für Fortgeschrittene -- Objekte in JS - -**Übungen:** - -Projektarbeit -Abschlussquiz - JS Grundlagen - ---- - -#### Tag 12 - -**Inhalt:** - -- Destructuring von Objekten und Arrays -- Rekursion - -**Übungen:** - -Übung 01 - 10 - ---- - -#### Tag 13 - -**Inhalt:** - -- Promises -- Callback-Hell -- Installation von node (npm) und Windows Terminal (für Node) -- **Exkurs: Statische Webseite mit Sass und HTML** -- **Exkurs: Versionierung mit Github Part I** - -**Übungen:** - ---- - -#### Tag 14 - -**Inhalt:** - -- Promise Aufbau -- Promise in Funktionen -- File System von Node -- commonjs vs esm -- async await - -**Übungen:** - -Übung 09 - 11 - ---- - -#### Tag 15 - -**Inhalt:** - -- Wiederholung der Inhalte -- Promise.all() -- **Exkurs: Switch Case Abfragen** -- **Exkurs: Statische Webseite mit Sass und HTML** -- **Exkurs: Versionierung mit Github Part I** -- 1:1 Meeting - ---- - -#### Tag 16 - -**Inhalt:** - -- **Exkurs: Statische Webseite mit Sass und HTML Part II** -- Mehrdimensionale Arrays - -**Übungen:** - -Projektarbeiten -Übungen 11 -13 - ---- - -#### Tag 17 - -**Inhalt:** - -- Chess-Beispiel -- Arbeiten mit Fetch API -- fetch mit Promise und async...await -- Joke API auslesen -- **Exkurs: Versionierung mit Github Part I** - -**Übungen:** - -Übungen 14 - 24 - ---- - -#### Tag 18 - -**Inhalt:** - -- XML-HttpRequest und AJAX mit jQuery -- Node Installation (Wiederholung) -- Node Standardbib - - fs - -**Übungen:** - -Projektarbeit - ---- - -#### Tag 19 - -**Inhalt:** - -- NPM Befehle -- CSV to HTML -- Node Standardbib - - zlib (stream) - - Crypto -- Abschluss von JS für Fortgeschrittene -- Projektvorstellung 1 + 2 - -**Übungen:** - -Übungen 25 - 31 - ---- - -#### Tag 20 - -**Inhalt:** - -- **Einrichtung von Git** -- **Exkurs: Webseite mit Gulp, SASS, HTML/CSS, JS** - -**Übungen:** - -Projektarbeit -Übungen 31 - 32 - ---- - -# JavaScript und das Document Object Model (DOM) - ---- - -#### Tag 21 - -**Inhalt:** - -- Einführung in JS DOM -- DOM Selection (querySelector, querySelectorAll) -- $ & $$ Helper -- CSS Selektoren - -**Übungen:** - -Übungen 01 - 05 - ---- - -#### Tag 22 - -- Defer & Async -- JS Dateien auslagern -- Chat Gestaltung (DOMTokenList Objekt) -- Optimierung von Projektstruktur -- Events in JS MouseEvent, KeyboardEvent - -**Übungen:** - -Übungen 06 - 07 - ---- - -#### Tag 23 - -**Inhalt:** - -- Projekt: Newsboard -- HTML Element Progress -- IDL-Attribut vs. Content-Attribut -- HTML Attribute mit boolescher Zuweisung - -**Übungen:** - -Übung 08 - 10 - ---- - -#### Tag 24 - -**Inhalt:** - -- Tooltip: HTML erweitern mit Data-Attribut -- Dataset Attribut, DOMStringMap Objekt -- getComputedStyle, Attribute mit boolscher Zuweisung - -**Übungen:** - -Übung 11 - 14 - ---- - -#### Tag 25 - -**Inhalt:** - -- DOM Creation - Elemente erstellen -- createElement() & appendChild() -- Projekt: Produktmanager Part I -- DOM Creation Befehle -- Entfernen von Elementen - -**Übungen:** - -Übung 15 - 17 -**Projektarbeit / Content Factory** - ---- - -#### Tag 26 - -**Inhalt:** - -- Import von Modulen in JS (Browserseitig) -- Separation of Concerns -- Projekt: Produktmanager final -- DOM Traversal Befehle & alle DOM Bereiche -- insertBefore(), appendChild(), append(), prepend(), before(), after() -- Refactoring von Produktmanager mit Template - -**Übungen:** - -Übung 18 + optionale Übungen -**Projektarbeit / Content Factory** - ---- - -#### Tag 27 - -**Inhalt:** - -- **Exkurs: Weitere Events: Drag and Drop** -- **Rest API erstellen mit Express** -- JS DOM Projektvorstellung -- Abschlussquiz JS DOM - -**Übungen:** - -Projekte - ---- - -#### Tag 28 - -**Inhalt:** - -- **Exkurs: DOM Inhalte über REST API mit Express Part I** -- **Routing in JS** -- CRUD - Create - (Read) - Update - Delete -- Object Methoden. -- Verwendung von Modulen (Bootstrap) - -**Übungen:** - -Projekte & optionale Übungen - ---- - -#### Tag 29 - -**Inhalt:** - -- **Exkurs: DOM Inhalte über mit REST API Express** -- **Erweiterung Frontend um REST API** -- CRUD - Create - Read - Update - Delete -- BREAD - Browse - Read - Edit - Add - Delete -- Verwendung von Modulen (Modal von BS, Toastify, Splide) - -**Übungen** - -Projekte + weiteres Modul einbinden - ---- - -#### Tag 30 - -- **Projektfinalisierung Express + REST API** -- Einführung in Typescript -- Meeting - ---- diff --git a/03_dom/docs copy/nodejs-installation.md b/03_dom/docs copy/nodejs-installation.md deleted file mode 100644 index 862e2c3..0000000 --- a/03_dom/docs copy/nodejs-installation.md +++ /dev/null @@ -1,114 +0,0 @@ -## NVM - Node Version Manager - -nvm ist ein Versionsmanager für node.js. Über nvm können mehrere unterschiedliche Node Versionen installiert werden. NVM wird über die Konsole aufgerufen und ist mit verschiedenen Shells kompatibel (sh, dash, ksh, zsh, bash). - -#### Links - -- (Win) -- (Mac OS) - -#### Installation Windows - -1. Lade den NVM-Installer über folgenden Link herunter: -2. Installiere NVM über den [Installer](https://github.com/coreybutler/nvm-windows/releases/download/1.2.2/nvm-setup.zip) -3. Sollte vorher bereits NodeJS global ohne NVM installiert worden sein, wird empfohlen die vorherige NodeJS Version zu [deinstallieren](https://stackoverflow.com/a/55300310). - -### Installation Mac OS - -- Installiere NVM über die Konsole mit: - -```bash -curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash -``` - -- Füge den Pfad zum NVM Ordner zur Shell-Config hinzu. (`~/.bash_profile`, `~/.zshrc`, `~/.profile`, or `~/.bashrc`). - -```bash -export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")" -[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm -``` - -- Aktuelle Informationen zur Installation findet man unter folgendem Link: - -#### Erste Schritte - -Sobald NVM erfolgreich installiert wurde kann man über nvm in der Konsole eine neue Node Version mit folgendem Befehl installieren: - -```bash -nvm install [NODE VERSIONSNUMMER] -``` - -> Hinweis: Die aktuellste Versionsnummer von NodeJS findet man am einfachsten auf der [NodeJS-Seite](https://nodejs.org/en/) - -Installierte Node Versionen auflisten - -```bash -nvm list -``` - -Node Version verwenden/wechseln - -```bash -nvm use [NODE VERSIONSNUMMER] -``` - -Node Version als Standard einrichten - -```bash -nvm alias default [NODE VERSIONSNUMMER] -``` - -## Node.js - -### Definition - -Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. - -## Neues Projekt erstellen - -- Über die Konsole in den Projektordner gehen. - -Projektordner wechsel über "change directory" (cd) - -```bash -cd [projektpfad] -``` - -- Eigene Package.json Datei generieren (nur einmalig bei einem neuen Projekt notwendig.) - -```bash -npm init -``` - -- Module installieren, die nur für die Entwicklung benötigt werden. (devDependicies) - -| Befehl | Zweck | -| ------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------- | -| `npm install Modul@Version` | installiere Modul in der Version Version (semantic versioning) | -| `npm install Modul@Version --save`
    `npm install Modul@Version -S` | Modul wird in der Datei `package.json` unter dependencies hinzugefügt (Mittlerweile default) | -| `npm install Modul@Version --save-dev`
    `npm install Modul@Version -D` | Modul wird in der Datei `package.json` unter devdependencies hinzugefügt | -| `npm install Modul@Version --global`
    `npm install Modul@Version -g` | Modul wird global installiert. (Von jedem Ordner aus anwendbar) | -| `npm uninstall Modul@Version` | entfernt Modul aus `node_modules` | -| `npm uninstall Modul@Version --save` | entfernt Modul aus `node_modules` und aus der dependencies- Eigenschaft in der `package.json`. | -| `npm update Modul` | Aktualisiert Modul auf die neueste Version | -| `npm update Modul --save` |  Aktualisiert Modul auf die neueste Version und auch die Versionsnummer der dependencies- Eigenschaft in der `package.json`. | -| `npm init` | erstellt eine package.json-Datei (der Befehl fragt die Eigenschaften ab) | -| `npm init --yes` | erstellt eine package.json-Datei (der Befehl setzt Default-Werte ein) | -| `npm list` | listet alle installierten Module auf. | -| `npm search` | Suchbegriff sucht Module, deren Namen den Suchbegriff enthält | - -# Globale Module - -## SASS - -### Definition - -> Sass is the most mature, stable, and powerful professional grade CSS extension language in the world. - -Sass ist eine CSS-Preprocessor Sprache. - -```bash -npm install sass -g -``` - -## Liste von verwendeten Modulen diff --git a/03_dom/docs copy/nodejs-installation.pdf b/03_dom/docs copy/nodejs-installation.pdf deleted file mode 100644 index c12907f..0000000 Binary files a/03_dom/docs copy/nodejs-installation.pdf and /dev/null differ diff --git a/03_dom/docs/nodejs-installation.md b/03_dom/docs/nodejs-installation.md deleted file mode 100644 index 862e2c3..0000000 --- a/03_dom/docs/nodejs-installation.md +++ /dev/null @@ -1,114 +0,0 @@ -## NVM - Node Version Manager - -nvm ist ein Versionsmanager für node.js. Über nvm können mehrere unterschiedliche Node Versionen installiert werden. NVM wird über die Konsole aufgerufen und ist mit verschiedenen Shells kompatibel (sh, dash, ksh, zsh, bash). - -#### Links - -- (Win) -- (Mac OS) - -#### Installation Windows - -1. Lade den NVM-Installer über folgenden Link herunter: -2. Installiere NVM über den [Installer](https://github.com/coreybutler/nvm-windows/releases/download/1.2.2/nvm-setup.zip) -3. Sollte vorher bereits NodeJS global ohne NVM installiert worden sein, wird empfohlen die vorherige NodeJS Version zu [deinstallieren](https://stackoverflow.com/a/55300310). - -### Installation Mac OS - -- Installiere NVM über die Konsole mit: - -```bash -curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash -``` - -- Füge den Pfad zum NVM Ordner zur Shell-Config hinzu. (`~/.bash_profile`, `~/.zshrc`, `~/.profile`, or `~/.bashrc`). - -```bash -export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")" -[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm -``` - -- Aktuelle Informationen zur Installation findet man unter folgendem Link: - -#### Erste Schritte - -Sobald NVM erfolgreich installiert wurde kann man über nvm in der Konsole eine neue Node Version mit folgendem Befehl installieren: - -```bash -nvm install [NODE VERSIONSNUMMER] -``` - -> Hinweis: Die aktuellste Versionsnummer von NodeJS findet man am einfachsten auf der [NodeJS-Seite](https://nodejs.org/en/) - -Installierte Node Versionen auflisten - -```bash -nvm list -``` - -Node Version verwenden/wechseln - -```bash -nvm use [NODE VERSIONSNUMMER] -``` - -Node Version als Standard einrichten - -```bash -nvm alias default [NODE VERSIONSNUMMER] -``` - -## Node.js - -### Definition - -Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. - -## Neues Projekt erstellen - -- Über die Konsole in den Projektordner gehen. - -Projektordner wechsel über "change directory" (cd) - -```bash -cd [projektpfad] -``` - -- Eigene Package.json Datei generieren (nur einmalig bei einem neuen Projekt notwendig.) - -```bash -npm init -``` - -- Module installieren, die nur für die Entwicklung benötigt werden. (devDependicies) - -| Befehl | Zweck | -| ------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------- | -| `npm install Modul@Version` | installiere Modul in der Version Version (semantic versioning) | -| `npm install Modul@Version --save`
    `npm install Modul@Version -S` | Modul wird in der Datei `package.json` unter dependencies hinzugefügt (Mittlerweile default) | -| `npm install Modul@Version --save-dev`
    `npm install Modul@Version -D` | Modul wird in der Datei `package.json` unter devdependencies hinzugefügt | -| `npm install Modul@Version --global`
    `npm install Modul@Version -g` | Modul wird global installiert. (Von jedem Ordner aus anwendbar) | -| `npm uninstall Modul@Version` | entfernt Modul aus `node_modules` | -| `npm uninstall Modul@Version --save` | entfernt Modul aus `node_modules` und aus der dependencies- Eigenschaft in der `package.json`. | -| `npm update Modul` | Aktualisiert Modul auf die neueste Version | -| `npm update Modul --save` |  Aktualisiert Modul auf die neueste Version und auch die Versionsnummer der dependencies- Eigenschaft in der `package.json`. | -| `npm init` | erstellt eine package.json-Datei (der Befehl fragt die Eigenschaften ab) | -| `npm init --yes` | erstellt eine package.json-Datei (der Befehl setzt Default-Werte ein) | -| `npm list` | listet alle installierten Module auf. | -| `npm search` | Suchbegriff sucht Module, deren Namen den Suchbegriff enthält | - -# Globale Module - -## SASS - -### Definition - -> Sass is the most mature, stable, and powerful professional grade CSS extension language in the world. - -Sass ist eine CSS-Preprocessor Sprache. - -```bash -npm install sass -g -``` - -## Liste von verwendeten Modulen diff --git a/03_dom/docs/nodejs-installation.pdf b/03_dom/docs/nodejs-installation.pdf deleted file mode 100644 index c12907f..0000000 Binary files a/03_dom/docs/nodejs-installation.pdf and /dev/null differ diff --git a/03_dom/faq/ordered-list.html b/03_dom/faq/ordered-list.html deleted file mode 100644 index 57190f9..0000000 --- a/03_dom/faq/ordered-list.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - Ordered List - - - -
    -
    -

    Ordered List

    - -
      -
    1. Eintrag 01
    2. -
    3. Eintrag 02
    4. -
    5. - Eintrag 03 -
        -
      1. Unterpunkt 01
      2. -
      3. Unterpunkt 02
      4. -
      5. Unterpunkt 03
      6. -
      7. Unterpunkt 04
      8. -
      -
    6. -
    7. Eintrag 04
    8. -
    9. Eintrag 05
    10. -
    11. Eintrag 06
    12. -
    -
    -
    - - - diff --git a/03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main.zip b/03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main.zip deleted file mode 100644 index abe1320..0000000 Binary files a/03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main.zip and /dev/null differ diff --git a/03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main/.gitignore b/03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main/.gitignore deleted file mode 100644 index 54f07af..0000000 --- a/03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? \ No newline at end of file diff --git a/03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main/Aufgabgenstellung.md b/03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main/Aufgabgenstellung.md deleted file mode 100644 index 8e321f8..0000000 --- a/03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main/Aufgabgenstellung.md +++ /dev/null @@ -1,23 +0,0 @@ -## JavaScript Cafe - -Willkommen beim JavaScript Cafe! Als Entwickler bist du verantwortlich für die Erstellung eines Moduls, das dem Cafe-Manager hilft, die Daten der Speisekarte effizient zu analysieren und zu verwalten. Die Speisekarte ist in verschiedene Kategorien unterteilt (z.B. Getränke, Gebäck), die jeweils mehrere Artikel mit spezifischen Details enthalten. - -In dem Starter-Code ist ein mehrdimensionales Array, das die Speisekarte des Cafés darstellt. Jede Kategorie enthält mehrere Artikel, die jeweils mit einem Namen und einem Preis versehen sind. - -**Die Aufgaben sind** - -1. Liste alle Menüpunkte auf: - -- Schreib eine rekursive Funktion listMenuItems, die das Array menu bekommt und ein flaches Array mit den Namen aller Einträge zurückgibt. - -2. Eintragsdetails destrukturieren: - -- Nutze die Destrukturierung innerhalb der Funktion listMenuItems, um den Namen und den Preis jedes Eintrags herauszuziehen. - -3. Durchschnittlichen Preis berechnen: - -- Nachdem du alle Menüeinträge aufgelistet hast, berechne den Durchschnittspreis für alle Einträge. - -4. Artikel nach Kategorie suchen: - -- Schreib eine Funktion findItemsByCategory, die das Menü-Array und einen Kategorienamen nimmt und ein Array mit allen Einträgen dieser Kategorie zurückgibt. \ No newline at end of file diff --git a/03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main/README.md b/03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main/README.md deleted file mode 100644 index 601f2df..0000000 --- a/03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main/README.md +++ /dev/null @@ -1,17 +0,0 @@ -## License and terms of use - -© Web Professional Institute Inc. All rights reserved. - -This material is provided solely for students enrolled in courses offered by Web Professional Institute Inc. By accessing or using this code, you acknowledge that it is strictly for educational use within the context of Web Professional Institute Inc. programs. - -**Usage Restrictions:** - -- Redistribution, sharing, or copying of this material outside the course environment is strictly prohibited. -- The content is designed to support your learning objectives and is not authorized for commercial projects, public repositories, or applications beyond the course scope. -- Unauthorized commercial use or open-source distribution is strictly prohibited and may result in expulsion from the program and legal action. - -**Agreement & Rights:** - -As a student, you have agreed to these terms as part of your enrollment agreement, which includes additional details on permitted uses, restrictions, and policies. The author and Web Professional Institute Inc. retain all rights to this material, including the code base and instructional content. - -For any questions regarding these terms, please contact Web Professional Institute Inc. for clarification. diff --git a/03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main/index.js b/03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main/index.js deleted file mode 100644 index 442ef2f..0000000 --- a/03_dom/projects/js-advanced-javascript-cafe-template-gkontra-main/index.js +++ /dev/null @@ -1,33 +0,0 @@ -'use strict'; -(() => { - // === DOM & VARS ======= - const DOM = {}; - - // === DATA ============= - const menu = [ - { - category: 'Beverages', - items: [ - { name: 'Coffee', price: 3.5 }, - { name: 'Tea', price: 2.5 }, - { name: 'Juice', price: 4 }, - ], - }, - { - category: 'Pastries', - items: [ - { name: 'Croissant', price: 2.75 }, - { name: 'Muffin', price: 2.5 }, - { name: 'Bagel', price: 2.25 }, - ], - }, - { - category: 'Sandwiches', - items: [ - { name: 'Ham Sandwich', price: 5.5 }, - { name: 'Veggie Sandwich', price: 5 }, - { name: 'Turkey Sandwich', price: 6 }, - ], - }, - ]; -})(); diff --git a/03_dom/projects/js-alkoholtester/Aufgabenstellung-alkoholtester.md b/03_dom/projects/js-alkoholtester/Aufgabenstellung-alkoholtester.md deleted file mode 100644 index e4f41af..0000000 --- a/03_dom/projects/js-alkoholtester/Aufgabenstellung-alkoholtester.md +++ /dev/null @@ -1,140 +0,0 @@ -# Projektarbeit 2: Fahrtüchtigkeitstester - - -## Einleitung -Dein Auftraggeber arbeitet an einer App, die es Anwendern erlaubt, eine grobe Einschätzung ihres jeweiligen Blutalkoholgehalts vorzunehmen. Die Anwendung hat natürlich keine Rechtsverbindlichkeit — möglicherweise hält sie jedoch manch angetrunkenen Partygast davon ab, sich ans Steuer zu setzen, um Schlangenlinien zu erproben und Schafe zu überfahren. Mit Sicherheit wird die App der Hit auf der nächsten Party. - -Das Ganze funktioniert folgendermaßen: Anwender geben zunächst ihr Gewicht in der App an und loggen danach bei Bedarf Getränke ein. Die App errechnet daraus den geschätzten aktuellen Blutalkoholgehalt (EBAC) und gibt diesen in Promille aus — inkl. eines Warnhinweises zur Fahrtauglichkeit. - -Der mobile Client ist bereits fertig. Deine Aufgabe besteht nun darin, den Kern der Anwendung zu entwickeln, die später auf dem Server laufen soll. Du bekommst fertige JSON-Datensätze geliefert, kannst dich aber nicht unbedingt darauf verlassen, dass sie komplett fehlerfrei sind und der Spezifikation entsprechen. Um Fehler zu vermeiden, müssen die Datensätze zunächst auf ihre Richtigkeit überprüft, d. h. validiert werden. Erst anschließend kümmerst du dich um die eigentliche Berechnung des Blutalkoholgehalts und die Ausgabe einer Empfehlung. - -## Technologien -Setze JavaScript – ECMAScript 2015 (ES6) oder neuer ein. Externe JavaScript-Bibliotheken (oder aus Drittquellen übernommener Code) sind nicht zugelassen. Überprüft wird die Aufgabe im aktuellen Chrome-Browser. - -## Arbeitsschritt 1: Validierung entstandener Datensätze -Die mobile App produziert Datensätze nach folgendem Format: - -- Es handelt sich um ein Objekt mit den Keys weight und drinks. -- Der Value von weight ist eine positive Zahl. -- Der Value von drinks ist ein Array. -- Das drinks-Array enthält seinerseits Objekte — es können beliebig viele sein. -- Die Objekte im drinks-Array haben die Keys type und amount. -- Der Value von type ist ein String. -- Der Value von amount ist eine positive Ganzzahl. - -## Beispiel - -Jemand, der 89,5 Kilogramm wiegt und 5 Gläser Wein, dann 3 Flaschen Bier und später noch mal 2 Gläser Wein getrunken hat … dem ist vermutlich ziemlich übel. Außerdem erhält er den nachfolgenden Datensatz (oder zumindest einen inhaltlich vergleichbaren): - -```js -{ - weight: 89.5, - drinks: [ - {type: "wine", amount: 5}, - {type: "beer", amount: 3}, - {type: "wine", amount: 2}, - ] -} -``` -​ - -Schreibe eine Funktion validateRecords, die einen Datensatz entgegennimmt und Fehler feststellt, wenn der Datensatz von folgenden Vorgaben abweicht: - -- Der Datensatz hat das korrekte Format (siehe Auflistung oben). -- Die benötigten Keys sind in den Objekten vorhanden. Es spielt dabei keine Rolle, in welcher Reihenfolge die Keys hinterlegt sind, d. h. {weight: …, drinks: …} ist genauso korrekt wie {drinks: …, weight: …} -- Die Anzahl der Keys ist nicht festgelegt, d. h. es dürfen neben den verlangten Keys noch weitere vorhanden sein. -- Das Gewicht enthält eine valide (positive) Zahl (62.5 wäre beispielsweise zulässig). -- Die Anzahl der Flaschen oder Gläser ist eine valide (positive) Ganzzahl (1.5 Flaschen wären beispielsweise nicht zulässig). -- Deine Funktion validateRecords soll ein Array zurückliefern, das alle gefundenen Fehler enthält. Gib das Array zur Kontrolle aus — jeweils eine Zeile pro Fehlermeldung. - -**Beispiel** - -```js -{ - weight: "sixty", - drinks: [ - {type: "wine", amount: 2.5}, - {type: "beer", amount: 3} - ] -} -{ - weight: "sixty", - drinks: [ - {type: "wine", amount: 2.5}, - {type: "beer", amount: 3} - ] -} -// > ['sixty is not a valid weight', -// '2.5 is not a valid number of bottles or glasses'] -``` -​ - -## Arbeitsschritt 2: Berechnung des Blutalkoholgehalts - -Schreibe eine Funktion bloodAlcoholContentFor, die einen Datensatz (wie in Teil 1 beschrieben) entgegennimmt, den Blutalkoholgehalt berechnet und anschließend in Promille zurückgibt. Gib den berechneten Wert anschließend in der Konsole aus. - -Hier sind die Formeln, die du benötigst: - -Die sogenannte Widmark-Formel für den EBAC in % (estimated peak blood alcohol concentration – Blutalkoholgehalt; siehe https://en.wikipedia.org/wiki/Blood_alcohol_content). - -```js -ebac = (0.806 * Anzahl der Standarddrinks * 1.2) / (0.5 * Gewicht) -``` - -Beachte, dass es sich hier um eine vereinfachte Formel handelt — Geschlecht und Zeitraum werden nicht beachtet. - -Zur Berechnung des EBACs benötigst du neben dem Gewicht die Anzahl der Standarddrinks. Deswegen musst du zunächst die Menge des reinen Alkohols im Datensatz berechnen und diese dann in eine Anzahl von Standarddrinks umrechnen. Dazu dient folgende Formel: - -```js -Anzahl der Standarddrinks = Alkoholmenge in L * 1000 / STANDARD_DRINK_ALCOHOL_CONTENT -``` - -Hier noch die Formeln zur Berechnung der Alkoholmenge: - -```js -Alkoholmenge im Wein = Anzahl der Gläser * WINE_GLASS_SIZE * WINE_ALC_PERCENTAGE / 100 -Alkoholmenge im Bier = Anzahl der Flaschen * BEER_BOTTLE_SIZE * BEER_ALC_PERCENTAGE / 100 -``` - -Außerdem gelten folgende (vereinfachte) Vorgaben: - -```js -const WINE_GLASS_SIZE = 0.2; -const WINE_ALC_PERCENTAGE = 14; -const BEER_BOTTLE_SIZE = 0.7; -const BEER_ALC_PERCENTAGE = 5; -const STANDARD -const WINE_GLASS_SIZE = 0.2; -const WINE_ALC_PERCENTAGE = 14; -const BEER_BOTTLE_SIZE = 0.7; -const BEER_ALC_PERCENTAGE = 5; -const STANDARD_DRINK_ALCOHOL_CONTENT = 17; -``` -​ -Denke auch daran, für die Ausgabe den EBAC von % in Promille umzurechnen. - -## Arbeitsschritt 3: Ausgabe der Empfehlung - -Gib eine Bemerkung zum übergebenen Datensatz in der Konsole aus. Die Bemerkung soll sich dabei am berechneten Blutalkoholgehalt orientieren. Ein Beispiel zeigt die folgende Tabelle. Du kannst aber natürlich eigene Werte und eigene Texte verwenden. Wichtig ist, dass du wenigstens fünf Abstufungen unterscheidest. - -BAC in Promille | Ausgabe ---- | --- -bis 0.29 | Sie sind vermutlich noch fahrtüchtig. Diese Angabe ist nicht rechtsverbindlich! -ab 0.3 | Sie haben vermutlich schon Konzentrationsschwierigkeiten. Sie sollten nicht mehr fahren. -ab 0.6 | Fahren Sie nicht, das könnte Sie sonst den Führerschein kosten. Denken Sie auch an die armen Schafe. -ab 1.0 | Wie viele Handys halten Sie in der Hand? -ab 5.0 | Sie sind vermutlich tot — oder haben sich vertippt. - - -**Hinweise** - -Du musst die Daten nicht vom Anwender per Prompt, Formular oder ähnlichem erfragen. Gehe einfach davon aus, dass du die JSON-Daten fertig geliefert bekommst. - -Die in der Aufgabe genannten Angaben zur API sind grundsätzlich verpflichtend. D. h. du verwendest die in der Aufgabenstellung genannten Funktionsnamen, Argumente, Argumentnamen, Rückgabewerte, usw. Dazu gehört auch der beschriebene Aufbau der JSON-Datensätze. - -**Tipps zur Vorgehensweise** -Schreibe nicht den kompletten Validierungscode innerhalb von validateRecords. Entwickle stattdessen kleinere Funktionen, die Teile der Funktionalität erledigen. - -Selbstverständlich kannst du die Implementierung der verlangten Funktionen jederzeit wieder in weitere Funktionen unterteilen. - -Schreibe kleine Einzelfunktionen, z. B. zur Berechnung der Alkoholmenge in einem Weindatensatz. Diese sollten auch jede Formel als eigene Funktion repräsentieren. \ No newline at end of file diff --git a/03_dom/uebungen/u01_almost-quotes/assets/css/styles.css b/03_dom/uebungen/u01_almost-quotes/assets/css/styles.css deleted file mode 100644 index d4c6b71..0000000 --- a/03_dom/uebungen/u01_almost-quotes/assets/css/styles.css +++ /dev/null @@ -1,368 +0,0 @@ -/* -------------------------------------------- Haupt CSS fuer alle Seiten -------------------------------------------- */ - -/* ---------------- CSS-Reset ------------------- */ -html, -body, -a, -div, -h1, -h2, -h3, -h4, -h5, -h6, -span, -p, -img, -strong, -ul, -li, -table, -th, -td, -tr { - margin: 0px; - padding: 0px; - border: 0px none; - font-weight: normal; - font-style: inherit; - font-family: inherit; - font-variant: inherit; - text-decoration: none; - table-layout: inherit; -} - -/* ---------------- Body / HTML ------------------- */ - -html { - font-size: 100%; - background-color: #fffef7; -} - -body { - font-family: Helvetica, Arial, sans-serif; - font-size: 1.2em; - font-weight: normal; - color: black; - margin: 0rem auto 2rem auto; -} - -/* ---------------- layout ------------------- */ - -header { - background: url(../img/js_header.png) left top no-repeat transparent; - background-size: cover; - height: 250px; - min-width: 850px; -} - -header:after { - content: ' '; - display: block; - height: 250px; - background: rgba(255, 254, 247, 0); - background: -moz-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -webkit-gradient( - left top, - left bottom, - color-stop(0%, rgba(255, 254, 247, 0)), - color-stop(22%, rgba(255, 254, 247, 0.55)), - color-stop(42%, rgba(255, 254, 247, 0.7)), - color-stop(43%, rgba(255, 254, 247, 0.71)), - color-stop(61%, rgba(255, 254, 247, 0.78)), - color-stop(75%, rgba(255, 254, 247, 0.92)), - color-stop(87%, rgba(255, 254, 247, 1)), - color-stop(100%, rgba(255, 254, 247, 1)) - ); - background: -webkit-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -o-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -ms-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: linear-gradient( - to bottom, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fffef7', endColorstr='#fffef7', GradientType=0 ); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fffef7', endColorstr='#fffef7', GradientType=0 ); -} - -main, -footer { - width: 70%; - margin: 3rem auto; - min-width: 850px; - padding: 0 20px; - box-sizing: border-box; -} - -/* ---------------- Content ------------------- */ - -h1 { - color: #93412b; - font-size: 3em; - margin-bottom: 20px; - font-weight: bold; -} - -h2 { - color: #93412b; - font-size: 2.5em; - margin-bottom: 15px; -} - -h3 { - color: #93412b; - font-size: 2em; - margin-bottom: 10px; -} - -p { - line-height: 15px; - margin-bottom: 15px; - line-height: 1.7em; -} - -.cited { - font-style: italic; - font-size: 0.8em; -} - -.u { - text-decoration: underline; -} -.b { - font-weight: bold; -} -.i { - font-style: italic; -} -.align_right { - text-align: right; -} -.align_left { - text-align: left; - margin-right: 10px; -} -.align_center { - text-align: center; -} -.float_left { - float: left; -} -.float_right { - float: right; -} -.clear_both { - clear: both; -} -strong { - font-weight: bold; -} -.special { - color: #b7595b; - font-weight: bold; -} -.keyword { - color: #db6f50; - font-weight: bold; - font-style: italic; -} -.gray { - color: gray; -} - -/* Links */ -main a:link, -main a:visited { - color: #eb690b; - font-weight: bold; -} - -main a:focus, -main a:hover, -main a:active { - color: #eb690b; -} - -ul { - list-style-position: outside; - margin-bottom: 20px; - padding-left: 22px; -} - -ol { - margin-bottom: 20px; - padding-left: 30px; -} - -li { - line-height: 1.4em; -} - -/* ------- Article ------- */ - -h1 { - color: #93412b; - font-size: 2.7em; - margin-bottom: 20px; -} - -#buy_form input[type='button'] { - display: inline-block; - padding: 1px 20px 3px 20px; - background-color: #93412b; - color: white; - border: 1px solid white; - font-size: 1em; - height: 32px; -} - -#buy_form input[type='button']:hover { - background-color: white; - color: #93412b; - border: 1px solid #93412b; -} - -#buy_form select { - display: inline-block; - font-size: 1em; - background-color: white; - color: #93412b; - border: 1px solid #93412b; - height: 32px; -} - -/* ------- Chat ------- */ - -#chat { - width: 100%; - background-color: white; - border: 1px solid #9c352f; - height: 20rem; - position: relative; -} - -#chat_window { - background-color: white; - width: 85%; - float: left; - height: 95%; -} - -#chat_history { - position: absolute; - bottom: 8%; - max-height: 92%; - padding: 0px 0px 5px 7px; -} - -#chat_history p { - font-size: 0.6em; - margin: 0; -} - -#chat_text { - height: 8%; - position: absolute; - bottom: 0; - width: 85%; -} - -#chat_text input { - width: 98%; - display: block; - margin: auto; -} - -#chat_members { - list-style-type: none; - height: 100%; - width: 15%; - margin-left: 85%; - border-left: 1px solid #9c352f; - text-align: right; - box-sizing: border-box; - min-width: 100px; - font-size: 0.8em; - padding-top: 5px; -} - -#chat_members li { - line-height: 1.2em; - padding: 5px 10px 2px 15px; -} - -#chat_members .highlighted { - background-color: #c14d45; - color: white; -} -.chat_member { - font-weight: bold; -} -.chat_member1 { - color: #3626c8; -} -.chat_member2 { - color: #e38d0b; -} - -#member_search { - position: absolute; - right: 0; - bottom: 0; - width: 15%; - height: 8%; -} - -#member_search input { - width: 88%; - display: block; - margin: auto; - text-align: right; -} diff --git a/03_dom/uebungen/u01_almost-quotes/assets/img/favicon.icon b/03_dom/uebungen/u01_almost-quotes/assets/img/favicon.icon deleted file mode 100644 index bd2cd28..0000000 Binary files a/03_dom/uebungen/u01_almost-quotes/assets/img/favicon.icon and /dev/null differ diff --git a/03_dom/uebungen/u01_almost-quotes/assets/img/js_header.png b/03_dom/uebungen/u01_almost-quotes/assets/img/js_header.png deleted file mode 100644 index 4d14ceb..0000000 Binary files a/03_dom/uebungen/u01_almost-quotes/assets/img/js_header.png and /dev/null differ diff --git a/03_dom/uebungen/u01_almost-quotes/index.html b/03_dom/uebungen/u01_almost-quotes/index.html deleted file mode 100644 index e447c66..0000000 --- a/03_dom/uebungen/u01_almost-quotes/index.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - Übung 1: Almost Famous Quotes 1 - - - - -
    - -
    -

    Famous Quotes

    - -
    -
    - - - diff --git a/03_dom/uebungen/u02_tasse-01001/assets/css/styles.css b/03_dom/uebungen/u02_tasse-01001/assets/css/styles.css deleted file mode 100644 index c30a2d3..0000000 --- a/03_dom/uebungen/u02_tasse-01001/assets/css/styles.css +++ /dev/null @@ -1,266 +0,0 @@ -/* -------------------------------------------- Haupt CSS fuer alle Seiten -------------------------------------------- */ - -/* ---------------- CSS-Reset ------------------- */ -html, body, a, div, h1, h2, h3, h4, h5, h6, span, p, img, strong, ul, li, table, th, td, tr { - margin: 0px; - padding: 0px; - border: 0px none; - font-weight: normal; - font-style: inherit; - font-family: inherit; - font-variant: inherit; - text-decoration: none; - table-layout: inherit; -} - - -/* ---------------- Body / HTML ------------------- */ - -html { - font-size: 100%; - background-color: #fffef7; -} - -body { - font-family: Helvetica, Arial, sans-serif; - font-size: 1.2em; - font-weight: normal; - color: black; - margin: 0rem auto 2rem auto; -} - -/* ---------------- layout ------------------- */ - -header { - - background: url(../img/js_header.png) left top no-repeat transparent; - background-size: cover; - height: 250px; - min-width: 850px; -} - -header:after { - content: ' '; - display: block; - height: 250px; -background: rgba(255,254,247,0); -background: -moz-linear-gradient(top, rgba(255,254,247,0) 0%, rgba(255,254,247,0.55) 22%, rgba(255,254,247,0.7) 42%, rgba(255,254,247,0.71) 43%, rgba(255,254,247,0.78) 61%, rgba(255,254,247,0.92) 75%, rgba(255,254,247,1) 87%, rgba(255,254,247,1) 100%); -background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(255,254,247,0)), color-stop(22%, rgba(255,254,247,0.55)), color-stop(42%, rgba(255,254,247,0.7)), color-stop(43%, rgba(255,254,247,0.71)), color-stop(61%, rgba(255,254,247,0.78)), color-stop(75%, rgba(255,254,247,0.92)), color-stop(87%, rgba(255,254,247,1)), color-stop(100%, rgba(255,254,247,1))); -background: -webkit-linear-gradient(top, rgba(255,254,247,0) 0%, rgba(255,254,247,0.55) 22%, rgba(255,254,247,0.7) 42%, rgba(255,254,247,0.71) 43%, rgba(255,254,247,0.78) 61%, rgba(255,254,247,0.92) 75%, rgba(255,254,247,1) 87%, rgba(255,254,247,1) 100%); -background: -o-linear-gradient(top, rgba(255,254,247,0) 0%, rgba(255,254,247,0.55) 22%, rgba(255,254,247,0.7) 42%, rgba(255,254,247,0.71) 43%, rgba(255,254,247,0.78) 61%, rgba(255,254,247,0.92) 75%, rgba(255,254,247,1) 87%, rgba(255,254,247,1) 100%); -background: -ms-linear-gradient(top, rgba(255,254,247,0) 0%, rgba(255,254,247,0.55) 22%, rgba(255,254,247,0.7) 42%, rgba(255,254,247,0.71) 43%, rgba(255,254,247,0.78) 61%, rgba(255,254,247,0.92) 75%, rgba(255,254,247,1) 87%, rgba(255,254,247,1) 100%); -background: linear-gradient(to bottom, rgba(255,254,247,0) 0%, rgba(255,254,247,0.55) 22%, rgba(255,254,247,0.7) 42%, rgba(255,254,247,0.71) 43%, rgba(255,254,247,0.78) 61%, rgba(255,254,247,0.92) 75%, rgba(255,254,247,1) 87%, rgba(255,254,247,1) 100%); -filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fffef7', endColorstr='#fffef7', GradientType=0 ); -filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fffef7', endColorstr='#fffef7', GradientType=0 ); -} - -main, -footer { - width: 70%; - margin: 3rem auto; - min-width: 850px; - padding: 0 20px; - box-sizing: border-box; -} - - - - - -/* ---------------- Content ------------------- */ - - - -h1 { - color: #93412b; - font-size: 3em; - margin-bottom: 20px; - font-weight: bold; -} - - -h2 { - color: #93412b; - font-size: 2.5em; - margin-bottom: 15px; -} - -h3 { - color: #93412b; - font-size: 2em; - margin-bottom: 10px; -} - -p { - line-height: 15px; - margin-bottom: 15px; - line-height: 1.7em; -} - -.cited { - font-style: italic; - font-size: .8em; -} - -.u {text-decoration: underline;} -.b {font-weight: bold;} -.i {font-style: italic} -.align_right {text-align: right;} -.align_left {text-align: left; margin-right: 10px;} -.align_center {text-align: center;} -.float_left {float: left;} -.float_right {float: right;} -.clear_both {clear: both;} -strong {font-weight: bold;} -.special { color: #b7595b; font-weight: bold; } -.keyword { color: #db6f50; font-weight: bold; font-style: italic;} -.gray {color: gray;} - -/* Links */ -main a:link, -main a:visited { - color: #eb690b; - font-weight: bold; -} - -main a:focus, -main a:hover, -main a:active {color: #eb690b;} - -ul { - list-style-position: outside; - margin-bottom: 20px; - padding-left: 22px; -} - -ol { - margin-bottom: 20px; - padding-left: 30px; -} - -li { - line-height: 1.4em; -} - - -/* ------- Article ------- */ - - -h1 { - color: #93412b; - font-size: 2.7em; - margin-bottom: 20px; -} - -#buy_form input[type=button] { - display: inline-block; - padding: 1px 20px 3px 20px; - background-color: #93412b; - color: white; - border: 1px solid white; - font-size: 1em; - height: 32px; -} - -#buy_form input[type=button]:hover { - background-color: white; - color: #93412b; - border: 1px solid #93412b; -} - -#buy_form select { - display: inline-block; - font-size: 1em; - background-color: white; - color: #93412b; - border: 1px solid #93412b; - height: 32px; -} - - -/* ------- Chat ------- */ - - -#chat { - width: 100%; - background-color: white; - border: 1px solid #9c352f; - height: 20rem; - position: relative; - -} - -#chat_window { - background-color: white; - width: 85%; - float: left; - height: 95%; -} - -#chat_history { - position: absolute; - bottom: 8%; - max-height: 92%; - padding: 0px 0px 5px 7px; -} - -#chat_history p { - font-size: .6em; - margin: 0; -} - -#chat_text { - height: 8%; - position: absolute; - bottom: 0; - width: 85%; -} - -#chat_text input { - width: 98%; - display: block; - margin: auto; -} - -#chat_members { - list-style-type: none; - height: 100%; - width: 15%; - margin-left: 85%; - border-left: 1px solid #9c352f; - text-align: right; - box-sizing: border-box; - min-width: 100px; - font-size: .8em; - padding-top: 5px; - -} - -#chat_members li { - line-height: 1.2em; - padding: 5px 10px 2px 15px; -} - - -#chat_members .highlighted { - background-color: #c14d45; - color: white; -} -.chat_member {font-weight: bold;} -.chat_member1 { color: #3626c8;} -.chat_member2 { color: #e38d0b;} - -#member_search { - position: absolute; - right: 0; - bottom: 0; - width: 15%; - height: 8%; -} - -#member_search input { - width: 88%; - display: block; - margin: auto; - text-align: right; -} diff --git a/03_dom/uebungen/u02_tasse-01001/assets/img/favicon.ico b/03_dom/uebungen/u02_tasse-01001/assets/img/favicon.ico deleted file mode 100644 index bd2cd28..0000000 Binary files a/03_dom/uebungen/u02_tasse-01001/assets/img/favicon.ico and /dev/null differ diff --git a/03_dom/uebungen/u02_tasse-01001/assets/img/js_header.png b/03_dom/uebungen/u02_tasse-01001/assets/img/js_header.png deleted file mode 100644 index 4d14ceb..0000000 Binary files a/03_dom/uebungen/u02_tasse-01001/assets/img/js_header.png and /dev/null differ diff --git a/03_dom/uebungen/u02_tasse-01001/assets/img/logo.png b/03_dom/uebungen/u02_tasse-01001/assets/img/logo.png deleted file mode 100644 index bbd9fcc..0000000 Binary files a/03_dom/uebungen/u02_tasse-01001/assets/img/logo.png and /dev/null differ diff --git a/03_dom/uebungen/u02_tasse-01001/assets/img/newsboard_empty.png b/03_dom/uebungen/u02_tasse-01001/assets/img/newsboard_empty.png deleted file mode 100644 index d650b1b..0000000 Binary files a/03_dom/uebungen/u02_tasse-01001/assets/img/newsboard_empty.png and /dev/null differ diff --git a/03_dom/uebungen/u02_tasse-01001/assets/img/newsboard_paperclip.png b/03_dom/uebungen/u02_tasse-01001/assets/img/newsboard_paperclip.png deleted file mode 100644 index 7f24721..0000000 Binary files a/03_dom/uebungen/u02_tasse-01001/assets/img/newsboard_paperclip.png and /dev/null differ diff --git a/03_dom/uebungen/u02_tasse-01001/assets/img/newsboard_sheets.png b/03_dom/uebungen/u02_tasse-01001/assets/img/newsboard_sheets.png deleted file mode 100644 index 14680cb..0000000 Binary files a/03_dom/uebungen/u02_tasse-01001/assets/img/newsboard_sheets.png and /dev/null differ diff --git a/03_dom/uebungen/u02_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug.gif b/03_dom/uebungen/u02_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug.gif deleted file mode 100644 index 3a9c8ad..0000000 Binary files a/03_dom/uebungen/u02_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug.gif and /dev/null differ diff --git a/03_dom/uebungen/u02_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug_grid_embed.jpg b/03_dom/uebungen/u02_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug_grid_embed.jpg deleted file mode 100644 index 4399460..0000000 Binary files a/03_dom/uebungen/u02_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug_grid_embed.jpg and /dev/null differ diff --git a/03_dom/uebungen/u02_tasse-01001/index.html b/03_dom/uebungen/u02_tasse-01001/index.html deleted file mode 100644 index b95f009..0000000 --- a/03_dom/uebungen/u02_tasse-01001/index.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - 010010000100111101010100 - - - - - - - -
    - -
    -

    - Hot Binary Heat Changing Mug - "010010000100111101010100" -

    - - Hot Binary Heat Changing Mug - -

    Description

    - -

    - Numbers make up - everything in our digital world. They flow around us, invisible like the Force or - the Matrix, controlling all our many computer-y devices. Two numbers, in particular: - 0 and 1. Off and On. Well, we can tell you this: when - there's no coffee in our cup, we're completely OFF our game. But when our mug is full of hot coffee, we're - totally ON. And now, with the Hot Binary Heat Changing Mug, there's a mug that - tells us which state our mug is in. In binary! -

    - -

    - See, the - Hot Binary Heat Changing Mug - looks like just a dark mug with binary numbers all over it. That's its OFF or cold state. Add hot coffee (or any - liquid) and a series of digits will turn white. Read them continuously from left to right, and you'll read: - 010010000100111101010100. That's in binary. Of course, - your - Hot Binary Heat Changing Mug - could just be paying you a compliment. Cheeky, mug. -

    - -

    - 010010000100111101010100 -

    - -

    Product Specifications

    - -
      -
    • Hot Binary Heat Changing Mug
    • -
    • - As you add hot liquids, the binary for "HOT" appears (read from left to right in one line, not two: - 010010000100111101010100) -
    • -
    • A ThinkGeek creation and exclusive!
    • -
    • - Care Instructions: - Hand wash only. Not microwave or dishwasher safe. -
    • -
    • Materials: Ceramic
    • -
    • Dimensions: approx. 3.15" diameter x 3.75" tall
    • -
    - -

    You wanna buy it?

    - -

    If you like to buy this brilliant mug, just do the following steps:

    - -
      -
    1. Select how many items do you want.
    2. -
    3. Press "buy".
    4. -
    - -
    - - -
    -
    - -
    (C) by ThinkGeek – Produkttext mit freundlicher Genehmigung von ThinkGeek Inc.
    - - - - diff --git a/03_dom/uebungen/u03_tasse-01001/assets/css/styles.css b/03_dom/uebungen/u03_tasse-01001/assets/css/styles.css deleted file mode 100644 index c30a2d3..0000000 --- a/03_dom/uebungen/u03_tasse-01001/assets/css/styles.css +++ /dev/null @@ -1,266 +0,0 @@ -/* -------------------------------------------- Haupt CSS fuer alle Seiten -------------------------------------------- */ - -/* ---------------- CSS-Reset ------------------- */ -html, body, a, div, h1, h2, h3, h4, h5, h6, span, p, img, strong, ul, li, table, th, td, tr { - margin: 0px; - padding: 0px; - border: 0px none; - font-weight: normal; - font-style: inherit; - font-family: inherit; - font-variant: inherit; - text-decoration: none; - table-layout: inherit; -} - - -/* ---------------- Body / HTML ------------------- */ - -html { - font-size: 100%; - background-color: #fffef7; -} - -body { - font-family: Helvetica, Arial, sans-serif; - font-size: 1.2em; - font-weight: normal; - color: black; - margin: 0rem auto 2rem auto; -} - -/* ---------------- layout ------------------- */ - -header { - - background: url(../img/js_header.png) left top no-repeat transparent; - background-size: cover; - height: 250px; - min-width: 850px; -} - -header:after { - content: ' '; - display: block; - height: 250px; -background: rgba(255,254,247,0); -background: -moz-linear-gradient(top, rgba(255,254,247,0) 0%, rgba(255,254,247,0.55) 22%, rgba(255,254,247,0.7) 42%, rgba(255,254,247,0.71) 43%, rgba(255,254,247,0.78) 61%, rgba(255,254,247,0.92) 75%, rgba(255,254,247,1) 87%, rgba(255,254,247,1) 100%); -background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(255,254,247,0)), color-stop(22%, rgba(255,254,247,0.55)), color-stop(42%, rgba(255,254,247,0.7)), color-stop(43%, rgba(255,254,247,0.71)), color-stop(61%, rgba(255,254,247,0.78)), color-stop(75%, rgba(255,254,247,0.92)), color-stop(87%, rgba(255,254,247,1)), color-stop(100%, rgba(255,254,247,1))); -background: -webkit-linear-gradient(top, rgba(255,254,247,0) 0%, rgba(255,254,247,0.55) 22%, rgba(255,254,247,0.7) 42%, rgba(255,254,247,0.71) 43%, rgba(255,254,247,0.78) 61%, rgba(255,254,247,0.92) 75%, rgba(255,254,247,1) 87%, rgba(255,254,247,1) 100%); -background: -o-linear-gradient(top, rgba(255,254,247,0) 0%, rgba(255,254,247,0.55) 22%, rgba(255,254,247,0.7) 42%, rgba(255,254,247,0.71) 43%, rgba(255,254,247,0.78) 61%, rgba(255,254,247,0.92) 75%, rgba(255,254,247,1) 87%, rgba(255,254,247,1) 100%); -background: -ms-linear-gradient(top, rgba(255,254,247,0) 0%, rgba(255,254,247,0.55) 22%, rgba(255,254,247,0.7) 42%, rgba(255,254,247,0.71) 43%, rgba(255,254,247,0.78) 61%, rgba(255,254,247,0.92) 75%, rgba(255,254,247,1) 87%, rgba(255,254,247,1) 100%); -background: linear-gradient(to bottom, rgba(255,254,247,0) 0%, rgba(255,254,247,0.55) 22%, rgba(255,254,247,0.7) 42%, rgba(255,254,247,0.71) 43%, rgba(255,254,247,0.78) 61%, rgba(255,254,247,0.92) 75%, rgba(255,254,247,1) 87%, rgba(255,254,247,1) 100%); -filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fffef7', endColorstr='#fffef7', GradientType=0 ); -filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fffef7', endColorstr='#fffef7', GradientType=0 ); -} - -main, -footer { - width: 70%; - margin: 3rem auto; - min-width: 850px; - padding: 0 20px; - box-sizing: border-box; -} - - - - - -/* ---------------- Content ------------------- */ - - - -h1 { - color: #93412b; - font-size: 3em; - margin-bottom: 20px; - font-weight: bold; -} - - -h2 { - color: #93412b; - font-size: 2.5em; - margin-bottom: 15px; -} - -h3 { - color: #93412b; - font-size: 2em; - margin-bottom: 10px; -} - -p { - line-height: 15px; - margin-bottom: 15px; - line-height: 1.7em; -} - -.cited { - font-style: italic; - font-size: .8em; -} - -.u {text-decoration: underline;} -.b {font-weight: bold;} -.i {font-style: italic} -.align_right {text-align: right;} -.align_left {text-align: left; margin-right: 10px;} -.align_center {text-align: center;} -.float_left {float: left;} -.float_right {float: right;} -.clear_both {clear: both;} -strong {font-weight: bold;} -.special { color: #b7595b; font-weight: bold; } -.keyword { color: #db6f50; font-weight: bold; font-style: italic;} -.gray {color: gray;} - -/* Links */ -main a:link, -main a:visited { - color: #eb690b; - font-weight: bold; -} - -main a:focus, -main a:hover, -main a:active {color: #eb690b;} - -ul { - list-style-position: outside; - margin-bottom: 20px; - padding-left: 22px; -} - -ol { - margin-bottom: 20px; - padding-left: 30px; -} - -li { - line-height: 1.4em; -} - - -/* ------- Article ------- */ - - -h1 { - color: #93412b; - font-size: 2.7em; - margin-bottom: 20px; -} - -#buy_form input[type=button] { - display: inline-block; - padding: 1px 20px 3px 20px; - background-color: #93412b; - color: white; - border: 1px solid white; - font-size: 1em; - height: 32px; -} - -#buy_form input[type=button]:hover { - background-color: white; - color: #93412b; - border: 1px solid #93412b; -} - -#buy_form select { - display: inline-block; - font-size: 1em; - background-color: white; - color: #93412b; - border: 1px solid #93412b; - height: 32px; -} - - -/* ------- Chat ------- */ - - -#chat { - width: 100%; - background-color: white; - border: 1px solid #9c352f; - height: 20rem; - position: relative; - -} - -#chat_window { - background-color: white; - width: 85%; - float: left; - height: 95%; -} - -#chat_history { - position: absolute; - bottom: 8%; - max-height: 92%; - padding: 0px 0px 5px 7px; -} - -#chat_history p { - font-size: .6em; - margin: 0; -} - -#chat_text { - height: 8%; - position: absolute; - bottom: 0; - width: 85%; -} - -#chat_text input { - width: 98%; - display: block; - margin: auto; -} - -#chat_members { - list-style-type: none; - height: 100%; - width: 15%; - margin-left: 85%; - border-left: 1px solid #9c352f; - text-align: right; - box-sizing: border-box; - min-width: 100px; - font-size: .8em; - padding-top: 5px; - -} - -#chat_members li { - line-height: 1.2em; - padding: 5px 10px 2px 15px; -} - - -#chat_members .highlighted { - background-color: #c14d45; - color: white; -} -.chat_member {font-weight: bold;} -.chat_member1 { color: #3626c8;} -.chat_member2 { color: #e38d0b;} - -#member_search { - position: absolute; - right: 0; - bottom: 0; - width: 15%; - height: 8%; -} - -#member_search input { - width: 88%; - display: block; - margin: auto; - text-align: right; -} diff --git a/03_dom/uebungen/u03_tasse-01001/assets/img/favicon.ico b/03_dom/uebungen/u03_tasse-01001/assets/img/favicon.ico deleted file mode 100644 index bd2cd28..0000000 Binary files a/03_dom/uebungen/u03_tasse-01001/assets/img/favicon.ico and /dev/null differ diff --git a/03_dom/uebungen/u03_tasse-01001/assets/img/js_header.png b/03_dom/uebungen/u03_tasse-01001/assets/img/js_header.png deleted file mode 100644 index 4d14ceb..0000000 Binary files a/03_dom/uebungen/u03_tasse-01001/assets/img/js_header.png and /dev/null differ diff --git a/03_dom/uebungen/u03_tasse-01001/assets/img/logo.png b/03_dom/uebungen/u03_tasse-01001/assets/img/logo.png deleted file mode 100644 index bbd9fcc..0000000 Binary files a/03_dom/uebungen/u03_tasse-01001/assets/img/logo.png and /dev/null differ diff --git a/03_dom/uebungen/u03_tasse-01001/assets/img/newsboard_empty.png b/03_dom/uebungen/u03_tasse-01001/assets/img/newsboard_empty.png deleted file mode 100644 index d650b1b..0000000 Binary files a/03_dom/uebungen/u03_tasse-01001/assets/img/newsboard_empty.png and /dev/null differ diff --git a/03_dom/uebungen/u03_tasse-01001/assets/img/newsboard_paperclip.png b/03_dom/uebungen/u03_tasse-01001/assets/img/newsboard_paperclip.png deleted file mode 100644 index 7f24721..0000000 Binary files a/03_dom/uebungen/u03_tasse-01001/assets/img/newsboard_paperclip.png and /dev/null differ diff --git a/03_dom/uebungen/u03_tasse-01001/assets/img/newsboard_sheets.png b/03_dom/uebungen/u03_tasse-01001/assets/img/newsboard_sheets.png deleted file mode 100644 index 14680cb..0000000 Binary files a/03_dom/uebungen/u03_tasse-01001/assets/img/newsboard_sheets.png and /dev/null differ diff --git a/03_dom/uebungen/u03_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug.gif b/03_dom/uebungen/u03_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug.gif deleted file mode 100644 index 3a9c8ad..0000000 Binary files a/03_dom/uebungen/u03_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug.gif and /dev/null differ diff --git a/03_dom/uebungen/u03_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug_grid_embed.jpg b/03_dom/uebungen/u03_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug_grid_embed.jpg deleted file mode 100644 index 4399460..0000000 Binary files a/03_dom/uebungen/u03_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug_grid_embed.jpg and /dev/null differ diff --git a/03_dom/uebungen/u03_tasse-01001/index.html b/03_dom/uebungen/u03_tasse-01001/index.html deleted file mode 100644 index ce64d50..0000000 --- a/03_dom/uebungen/u03_tasse-01001/index.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - 010010000100111101010100 - - - - - - - -
    - -
    -

    - Hot Binary Heat Changing Mug - "010010000100111101010100" -

    - - Hot Binary Heat Changing Mug - -

    Description

    - -

    - Numbers make up - everything in our digital world. They flow around us, invisible like the Force or - the Matrix, controlling all our many computer-y devices. Two numbers, in particular: - 0 and 1. Off and On. Well, we can tell you this: when - there's no coffee in our cup, we're completely OFF our game. But when our mug is full of hot coffee, we're - totally ON. And now, with the Hot Binary Heat Changing Mug, there's a mug that - tells us which state our mug is in. In binary! -

    - -

    - See, the - Hot Binary Heat Changing Mug - looks like just a dark mug with binary numbers all over it. That's its OFF or cold state. Add hot coffee (or any - liquid) and a series of digits will turn white. Read them continuously from left to right, and you'll read: - 010010000100111101010100. That's in binary. Of course, - your - Hot Binary Heat Changing Mug - could just be paying you a compliment. Cheeky, mug. -

    - -

    - 010010000100111101010100 -

    - -

    Product Specifications

    - -
      -
    • Hot Binary Heat Changing Mug
    • -
    • - As you add hot liquids, the binary for "HOT" appears (read from left to right in one line, not two: - 010010000100111101010100) -
    • -
    • A ThinkGeek creation and exclusive!
    • -
    • - Care Instructions: - Hand wash only. Not microwave or dishwasher safe. -
    • -
    • Materials: Ceramic
    • -
    • Dimensions: approx. 3.15" diameter x 3.75" tall
    • -
    - -

    You wanna buy it?

    - -

    If you like to buy this brilliant mug, just do the following steps:

    - -
      -
    1. Select how many items do you want.
    2. -
    3. Press "buy".
    4. -
    - -
    - - -
    -
    - -
    (C) by ThinkGeek – Produkttext mit freundlicher Genehmigung von ThinkGeek Inc.
    - - - - diff --git a/03_dom/uebungen/u04_tasse-01001/assets/css/styles.css b/03_dom/uebungen/u04_tasse-01001/assets/css/styles.css deleted file mode 100644 index c30a2d3..0000000 --- a/03_dom/uebungen/u04_tasse-01001/assets/css/styles.css +++ /dev/null @@ -1,266 +0,0 @@ -/* -------------------------------------------- Haupt CSS fuer alle Seiten -------------------------------------------- */ - -/* ---------------- CSS-Reset ------------------- */ -html, body, a, div, h1, h2, h3, h4, h5, h6, span, p, img, strong, ul, li, table, th, td, tr { - margin: 0px; - padding: 0px; - border: 0px none; - font-weight: normal; - font-style: inherit; - font-family: inherit; - font-variant: inherit; - text-decoration: none; - table-layout: inherit; -} - - -/* ---------------- Body / HTML ------------------- */ - -html { - font-size: 100%; - background-color: #fffef7; -} - -body { - font-family: Helvetica, Arial, sans-serif; - font-size: 1.2em; - font-weight: normal; - color: black; - margin: 0rem auto 2rem auto; -} - -/* ---------------- layout ------------------- */ - -header { - - background: url(../img/js_header.png) left top no-repeat transparent; - background-size: cover; - height: 250px; - min-width: 850px; -} - -header:after { - content: ' '; - display: block; - height: 250px; -background: rgba(255,254,247,0); -background: -moz-linear-gradient(top, rgba(255,254,247,0) 0%, rgba(255,254,247,0.55) 22%, rgba(255,254,247,0.7) 42%, rgba(255,254,247,0.71) 43%, rgba(255,254,247,0.78) 61%, rgba(255,254,247,0.92) 75%, rgba(255,254,247,1) 87%, rgba(255,254,247,1) 100%); -background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(255,254,247,0)), color-stop(22%, rgba(255,254,247,0.55)), color-stop(42%, rgba(255,254,247,0.7)), color-stop(43%, rgba(255,254,247,0.71)), color-stop(61%, rgba(255,254,247,0.78)), color-stop(75%, rgba(255,254,247,0.92)), color-stop(87%, rgba(255,254,247,1)), color-stop(100%, rgba(255,254,247,1))); -background: -webkit-linear-gradient(top, rgba(255,254,247,0) 0%, rgba(255,254,247,0.55) 22%, rgba(255,254,247,0.7) 42%, rgba(255,254,247,0.71) 43%, rgba(255,254,247,0.78) 61%, rgba(255,254,247,0.92) 75%, rgba(255,254,247,1) 87%, rgba(255,254,247,1) 100%); -background: -o-linear-gradient(top, rgba(255,254,247,0) 0%, rgba(255,254,247,0.55) 22%, rgba(255,254,247,0.7) 42%, rgba(255,254,247,0.71) 43%, rgba(255,254,247,0.78) 61%, rgba(255,254,247,0.92) 75%, rgba(255,254,247,1) 87%, rgba(255,254,247,1) 100%); -background: -ms-linear-gradient(top, rgba(255,254,247,0) 0%, rgba(255,254,247,0.55) 22%, rgba(255,254,247,0.7) 42%, rgba(255,254,247,0.71) 43%, rgba(255,254,247,0.78) 61%, rgba(255,254,247,0.92) 75%, rgba(255,254,247,1) 87%, rgba(255,254,247,1) 100%); -background: linear-gradient(to bottom, rgba(255,254,247,0) 0%, rgba(255,254,247,0.55) 22%, rgba(255,254,247,0.7) 42%, rgba(255,254,247,0.71) 43%, rgba(255,254,247,0.78) 61%, rgba(255,254,247,0.92) 75%, rgba(255,254,247,1) 87%, rgba(255,254,247,1) 100%); -filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fffef7', endColorstr='#fffef7', GradientType=0 ); -filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fffef7', endColorstr='#fffef7', GradientType=0 ); -} - -main, -footer { - width: 70%; - margin: 3rem auto; - min-width: 850px; - padding: 0 20px; - box-sizing: border-box; -} - - - - - -/* ---------------- Content ------------------- */ - - - -h1 { - color: #93412b; - font-size: 3em; - margin-bottom: 20px; - font-weight: bold; -} - - -h2 { - color: #93412b; - font-size: 2.5em; - margin-bottom: 15px; -} - -h3 { - color: #93412b; - font-size: 2em; - margin-bottom: 10px; -} - -p { - line-height: 15px; - margin-bottom: 15px; - line-height: 1.7em; -} - -.cited { - font-style: italic; - font-size: .8em; -} - -.u {text-decoration: underline;} -.b {font-weight: bold;} -.i {font-style: italic} -.align_right {text-align: right;} -.align_left {text-align: left; margin-right: 10px;} -.align_center {text-align: center;} -.float_left {float: left;} -.float_right {float: right;} -.clear_both {clear: both;} -strong {font-weight: bold;} -.special { color: #b7595b; font-weight: bold; } -.keyword { color: #db6f50; font-weight: bold; font-style: italic;} -.gray {color: gray;} - -/* Links */ -main a:link, -main a:visited { - color: #eb690b; - font-weight: bold; -} - -main a:focus, -main a:hover, -main a:active {color: #eb690b;} - -ul { - list-style-position: outside; - margin-bottom: 20px; - padding-left: 22px; -} - -ol { - margin-bottom: 20px; - padding-left: 30px; -} - -li { - line-height: 1.4em; -} - - -/* ------- Article ------- */ - - -h1 { - color: #93412b; - font-size: 2.7em; - margin-bottom: 20px; -} - -#buy_form input[type=button] { - display: inline-block; - padding: 1px 20px 3px 20px; - background-color: #93412b; - color: white; - border: 1px solid white; - font-size: 1em; - height: 32px; -} - -#buy_form input[type=button]:hover { - background-color: white; - color: #93412b; - border: 1px solid #93412b; -} - -#buy_form select { - display: inline-block; - font-size: 1em; - background-color: white; - color: #93412b; - border: 1px solid #93412b; - height: 32px; -} - - -/* ------- Chat ------- */ - - -#chat { - width: 100%; - background-color: white; - border: 1px solid #9c352f; - height: 20rem; - position: relative; - -} - -#chat_window { - background-color: white; - width: 85%; - float: left; - height: 95%; -} - -#chat_history { - position: absolute; - bottom: 8%; - max-height: 92%; - padding: 0px 0px 5px 7px; -} - -#chat_history p { - font-size: .6em; - margin: 0; -} - -#chat_text { - height: 8%; - position: absolute; - bottom: 0; - width: 85%; -} - -#chat_text input { - width: 98%; - display: block; - margin: auto; -} - -#chat_members { - list-style-type: none; - height: 100%; - width: 15%; - margin-left: 85%; - border-left: 1px solid #9c352f; - text-align: right; - box-sizing: border-box; - min-width: 100px; - font-size: .8em; - padding-top: 5px; - -} - -#chat_members li { - line-height: 1.2em; - padding: 5px 10px 2px 15px; -} - - -#chat_members .highlighted { - background-color: #c14d45; - color: white; -} -.chat_member {font-weight: bold;} -.chat_member1 { color: #3626c8;} -.chat_member2 { color: #e38d0b;} - -#member_search { - position: absolute; - right: 0; - bottom: 0; - width: 15%; - height: 8%; -} - -#member_search input { - width: 88%; - display: block; - margin: auto; - text-align: right; -} diff --git a/03_dom/uebungen/u04_tasse-01001/assets/img/favicon.ico b/03_dom/uebungen/u04_tasse-01001/assets/img/favicon.ico deleted file mode 100644 index bd2cd28..0000000 Binary files a/03_dom/uebungen/u04_tasse-01001/assets/img/favicon.ico and /dev/null differ diff --git a/03_dom/uebungen/u04_tasse-01001/assets/img/js_header.png b/03_dom/uebungen/u04_tasse-01001/assets/img/js_header.png deleted file mode 100644 index 4d14ceb..0000000 Binary files a/03_dom/uebungen/u04_tasse-01001/assets/img/js_header.png and /dev/null differ diff --git a/03_dom/uebungen/u04_tasse-01001/assets/img/logo.png b/03_dom/uebungen/u04_tasse-01001/assets/img/logo.png deleted file mode 100644 index bbd9fcc..0000000 Binary files a/03_dom/uebungen/u04_tasse-01001/assets/img/logo.png and /dev/null differ diff --git a/03_dom/uebungen/u04_tasse-01001/assets/img/newsboard_empty.png b/03_dom/uebungen/u04_tasse-01001/assets/img/newsboard_empty.png deleted file mode 100644 index d650b1b..0000000 Binary files a/03_dom/uebungen/u04_tasse-01001/assets/img/newsboard_empty.png and /dev/null differ diff --git a/03_dom/uebungen/u04_tasse-01001/assets/img/newsboard_paperclip.png b/03_dom/uebungen/u04_tasse-01001/assets/img/newsboard_paperclip.png deleted file mode 100644 index 7f24721..0000000 Binary files a/03_dom/uebungen/u04_tasse-01001/assets/img/newsboard_paperclip.png and /dev/null differ diff --git a/03_dom/uebungen/u04_tasse-01001/assets/img/newsboard_sheets.png b/03_dom/uebungen/u04_tasse-01001/assets/img/newsboard_sheets.png deleted file mode 100644 index 14680cb..0000000 Binary files a/03_dom/uebungen/u04_tasse-01001/assets/img/newsboard_sheets.png and /dev/null differ diff --git a/03_dom/uebungen/u04_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug.gif b/03_dom/uebungen/u04_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug.gif deleted file mode 100644 index 3a9c8ad..0000000 Binary files a/03_dom/uebungen/u04_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug.gif and /dev/null differ diff --git a/03_dom/uebungen/u04_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug_grid_embed.jpg b/03_dom/uebungen/u04_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug_grid_embed.jpg deleted file mode 100644 index 4399460..0000000 Binary files a/03_dom/uebungen/u04_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug_grid_embed.jpg and /dev/null differ diff --git a/03_dom/uebungen/u04_tasse-01001/index.html b/03_dom/uebungen/u04_tasse-01001/index.html deleted file mode 100644 index 64bba5d..0000000 --- a/03_dom/uebungen/u04_tasse-01001/index.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - 010010000100111101010100 - - - - - - - -
    - -
    -

    - Hot Binary Heat Changing Mug - "010010000100111101010100" -

    - - Hot Binary Heat Changing Mug - -

    Description

    - -

    - Numbers make up - everything in our digital world. They flow around us, invisible like the Force or - the Matrix, controlling all our many computer-y devices. Two numbers, in particular: - 0 and 1. Off and On. Well, we can tell you this: when - there's no coffee in our cup, we're completely OFF our game. But when our mug is full of hot coffee, we're - totally ON. And now, with the Hot Binary Heat Changing Mug, there's a mug that - tells us which state our mug is in. In binary! -

    - -

    - See, the - Hot Binary Heat Changing Mug - looks like just a dark mug with binary numbers all over it. That's its OFF or cold state. Add hot coffee (or any - liquid) and a series of digits will turn white. Read them continuously from left to right, and you'll read: - 010010000100111101010100. That's in binary. Of course, - your - Hot Binary Heat Changing Mug - could just be paying you a compliment. Cheeky, mug. -

    - -

    - 010010000100111101010100 -

    - -

    Product Specifications

    - -
      -
    • Hot Binary Heat Changing Mug
    • -
    • - As you add hot liquids, the binary for "HOT" appears (read from left to right in one line, not two: - 010010000100111101010100) -
    • -
    • A ThinkGeek creation and exclusive!
    • -
    • - Care Instructions: - Hand wash only. Not microwave or dishwasher safe. -
    • -
    • Materials: Ceramic
    • -
    • Dimensions: approx. 3.15" diameter x 3.75" tall
    • -
    - -

    You wanna buy it?

    - -

    If you like to buy this brilliant mug, just do the following steps:

    - -
      -
    1. Select how many items do you want.
    2. -
    3. Press "buy".
    4. -
    - -
    - - -
    -
    - -
    (C) by ThinkGeek – Produkttext mit freundlicher Genehmigung von ThinkGeek Inc.
    - - - - diff --git a/03_dom/uebungen/u05_tasse-01001/assets/css/styles.css b/03_dom/uebungen/u05_tasse-01001/assets/css/styles.css deleted file mode 100644 index c30a2d3..0000000 --- a/03_dom/uebungen/u05_tasse-01001/assets/css/styles.css +++ /dev/null @@ -1,266 +0,0 @@ -/* -------------------------------------------- Haupt CSS fuer alle Seiten -------------------------------------------- */ - -/* ---------------- CSS-Reset ------------------- */ -html, body, a, div, h1, h2, h3, h4, h5, h6, span, p, img, strong, ul, li, table, th, td, tr { - margin: 0px; - padding: 0px; - border: 0px none; - font-weight: normal; - font-style: inherit; - font-family: inherit; - font-variant: inherit; - text-decoration: none; - table-layout: inherit; -} - - -/* ---------------- Body / HTML ------------------- */ - -html { - font-size: 100%; - background-color: #fffef7; -} - -body { - font-family: Helvetica, Arial, sans-serif; - font-size: 1.2em; - font-weight: normal; - color: black; - margin: 0rem auto 2rem auto; -} - -/* ---------------- layout ------------------- */ - -header { - - background: url(../img/js_header.png) left top no-repeat transparent; - background-size: cover; - height: 250px; - min-width: 850px; -} - -header:after { - content: ' '; - display: block; - height: 250px; -background: rgba(255,254,247,0); -background: -moz-linear-gradient(top, rgba(255,254,247,0) 0%, rgba(255,254,247,0.55) 22%, rgba(255,254,247,0.7) 42%, rgba(255,254,247,0.71) 43%, rgba(255,254,247,0.78) 61%, rgba(255,254,247,0.92) 75%, rgba(255,254,247,1) 87%, rgba(255,254,247,1) 100%); -background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(255,254,247,0)), color-stop(22%, rgba(255,254,247,0.55)), color-stop(42%, rgba(255,254,247,0.7)), color-stop(43%, rgba(255,254,247,0.71)), color-stop(61%, rgba(255,254,247,0.78)), color-stop(75%, rgba(255,254,247,0.92)), color-stop(87%, rgba(255,254,247,1)), color-stop(100%, rgba(255,254,247,1))); -background: -webkit-linear-gradient(top, rgba(255,254,247,0) 0%, rgba(255,254,247,0.55) 22%, rgba(255,254,247,0.7) 42%, rgba(255,254,247,0.71) 43%, rgba(255,254,247,0.78) 61%, rgba(255,254,247,0.92) 75%, rgba(255,254,247,1) 87%, rgba(255,254,247,1) 100%); -background: -o-linear-gradient(top, rgba(255,254,247,0) 0%, rgba(255,254,247,0.55) 22%, rgba(255,254,247,0.7) 42%, rgba(255,254,247,0.71) 43%, rgba(255,254,247,0.78) 61%, rgba(255,254,247,0.92) 75%, rgba(255,254,247,1) 87%, rgba(255,254,247,1) 100%); -background: -ms-linear-gradient(top, rgba(255,254,247,0) 0%, rgba(255,254,247,0.55) 22%, rgba(255,254,247,0.7) 42%, rgba(255,254,247,0.71) 43%, rgba(255,254,247,0.78) 61%, rgba(255,254,247,0.92) 75%, rgba(255,254,247,1) 87%, rgba(255,254,247,1) 100%); -background: linear-gradient(to bottom, rgba(255,254,247,0) 0%, rgba(255,254,247,0.55) 22%, rgba(255,254,247,0.7) 42%, rgba(255,254,247,0.71) 43%, rgba(255,254,247,0.78) 61%, rgba(255,254,247,0.92) 75%, rgba(255,254,247,1) 87%, rgba(255,254,247,1) 100%); -filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fffef7', endColorstr='#fffef7', GradientType=0 ); -filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fffef7', endColorstr='#fffef7', GradientType=0 ); -} - -main, -footer { - width: 70%; - margin: 3rem auto; - min-width: 850px; - padding: 0 20px; - box-sizing: border-box; -} - - - - - -/* ---------------- Content ------------------- */ - - - -h1 { - color: #93412b; - font-size: 3em; - margin-bottom: 20px; - font-weight: bold; -} - - -h2 { - color: #93412b; - font-size: 2.5em; - margin-bottom: 15px; -} - -h3 { - color: #93412b; - font-size: 2em; - margin-bottom: 10px; -} - -p { - line-height: 15px; - margin-bottom: 15px; - line-height: 1.7em; -} - -.cited { - font-style: italic; - font-size: .8em; -} - -.u {text-decoration: underline;} -.b {font-weight: bold;} -.i {font-style: italic} -.align_right {text-align: right;} -.align_left {text-align: left; margin-right: 10px;} -.align_center {text-align: center;} -.float_left {float: left;} -.float_right {float: right;} -.clear_both {clear: both;} -strong {font-weight: bold;} -.special { color: #b7595b; font-weight: bold; } -.keyword { color: #db6f50; font-weight: bold; font-style: italic;} -.gray {color: gray;} - -/* Links */ -main a:link, -main a:visited { - color: #eb690b; - font-weight: bold; -} - -main a:focus, -main a:hover, -main a:active {color: #eb690b;} - -ul { - list-style-position: outside; - margin-bottom: 20px; - padding-left: 22px; -} - -ol { - margin-bottom: 20px; - padding-left: 30px; -} - -li { - line-height: 1.4em; -} - - -/* ------- Article ------- */ - - -h1 { - color: #93412b; - font-size: 2.7em; - margin-bottom: 20px; -} - -#buy_form input[type=button] { - display: inline-block; - padding: 1px 20px 3px 20px; - background-color: #93412b; - color: white; - border: 1px solid white; - font-size: 1em; - height: 32px; -} - -#buy_form input[type=button]:hover { - background-color: white; - color: #93412b; - border: 1px solid #93412b; -} - -#buy_form select { - display: inline-block; - font-size: 1em; - background-color: white; - color: #93412b; - border: 1px solid #93412b; - height: 32px; -} - - -/* ------- Chat ------- */ - - -#chat { - width: 100%; - background-color: white; - border: 1px solid #9c352f; - height: 20rem; - position: relative; - -} - -#chat_window { - background-color: white; - width: 85%; - float: left; - height: 95%; -} - -#chat_history { - position: absolute; - bottom: 8%; - max-height: 92%; - padding: 0px 0px 5px 7px; -} - -#chat_history p { - font-size: .6em; - margin: 0; -} - -#chat_text { - height: 8%; - position: absolute; - bottom: 0; - width: 85%; -} - -#chat_text input { - width: 98%; - display: block; - margin: auto; -} - -#chat_members { - list-style-type: none; - height: 100%; - width: 15%; - margin-left: 85%; - border-left: 1px solid #9c352f; - text-align: right; - box-sizing: border-box; - min-width: 100px; - font-size: .8em; - padding-top: 5px; - -} - -#chat_members li { - line-height: 1.2em; - padding: 5px 10px 2px 15px; -} - - -#chat_members .highlighted { - background-color: #c14d45; - color: white; -} -.chat_member {font-weight: bold;} -.chat_member1 { color: #3626c8;} -.chat_member2 { color: #e38d0b;} - -#member_search { - position: absolute; - right: 0; - bottom: 0; - width: 15%; - height: 8%; -} - -#member_search input { - width: 88%; - display: block; - margin: auto; - text-align: right; -} diff --git a/03_dom/uebungen/u05_tasse-01001/assets/img/favicon.ico b/03_dom/uebungen/u05_tasse-01001/assets/img/favicon.ico deleted file mode 100644 index bd2cd28..0000000 Binary files a/03_dom/uebungen/u05_tasse-01001/assets/img/favicon.ico and /dev/null differ diff --git a/03_dom/uebungen/u05_tasse-01001/assets/img/js_header.png b/03_dom/uebungen/u05_tasse-01001/assets/img/js_header.png deleted file mode 100644 index 4d14ceb..0000000 Binary files a/03_dom/uebungen/u05_tasse-01001/assets/img/js_header.png and /dev/null differ diff --git a/03_dom/uebungen/u05_tasse-01001/assets/img/logo.png b/03_dom/uebungen/u05_tasse-01001/assets/img/logo.png deleted file mode 100644 index bbd9fcc..0000000 Binary files a/03_dom/uebungen/u05_tasse-01001/assets/img/logo.png and /dev/null differ diff --git a/03_dom/uebungen/u05_tasse-01001/assets/img/newsboard_empty.png b/03_dom/uebungen/u05_tasse-01001/assets/img/newsboard_empty.png deleted file mode 100644 index d650b1b..0000000 Binary files a/03_dom/uebungen/u05_tasse-01001/assets/img/newsboard_empty.png and /dev/null differ diff --git a/03_dom/uebungen/u05_tasse-01001/assets/img/newsboard_paperclip.png b/03_dom/uebungen/u05_tasse-01001/assets/img/newsboard_paperclip.png deleted file mode 100644 index 7f24721..0000000 Binary files a/03_dom/uebungen/u05_tasse-01001/assets/img/newsboard_paperclip.png and /dev/null differ diff --git a/03_dom/uebungen/u05_tasse-01001/assets/img/newsboard_sheets.png b/03_dom/uebungen/u05_tasse-01001/assets/img/newsboard_sheets.png deleted file mode 100644 index 14680cb..0000000 Binary files a/03_dom/uebungen/u05_tasse-01001/assets/img/newsboard_sheets.png and /dev/null differ diff --git a/03_dom/uebungen/u05_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug.gif b/03_dom/uebungen/u05_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug.gif deleted file mode 100644 index 3a9c8ad..0000000 Binary files a/03_dom/uebungen/u05_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug.gif and /dev/null differ diff --git a/03_dom/uebungen/u05_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug_grid_embed.jpg b/03_dom/uebungen/u05_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug_grid_embed.jpg deleted file mode 100644 index 4399460..0000000 Binary files a/03_dom/uebungen/u05_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug_grid_embed.jpg and /dev/null differ diff --git a/03_dom/uebungen/u05_tasse-01001/index.html b/03_dom/uebungen/u05_tasse-01001/index.html deleted file mode 100644 index c4b7bbb..0000000 --- a/03_dom/uebungen/u05_tasse-01001/index.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - 010010000100111101010100 - - - - - - - -
    - -
    -

    - Hot Binary Heat Changing Mug - "010010000100111101010100" -

    - - Hot Binary Heat Changing Mug - -

    Description

    - -

    - Numbers make up - everything in our digital world. They flow around us, invisible like the Force or - the Matrix, controlling all our many computer-y devices. Two numbers, in particular: - 0 and 1. Off and On. Well, we can tell you this: when - there's no coffee in our cup, we're completely OFF our game. But when our mug is full of hot coffee, we're - totally ON. And now, with the Hot Binary Heat Changing Mug, there's a mug that - tells us which state our mug is in. In binary! -

    - -

    - See, the - Hot Binary Heat Changing Mug - looks like just a dark mug with binary numbers all over it. That's its OFF or cold state. Add hot coffee (or any - liquid) and a series of digits will turn white. Read them continuously from left to right, and you'll read: - 010010000100111101010100. That's in binary. Of course, - your - Hot Binary Heat Changing Mug - could just be paying you a compliment. Cheeky, mug. -

    - -

    - 010010000100111101010100 -

    - -

    Product Specifications

    - -
      -
    • Hot Binary Heat Changing Mug
    • -
    • - As you add hot liquids, the binary for "HOT" appears (read from left to right in one line, not two: - 010010000100111101010100) -
    • -
    • A ThinkGeek creation and exclusive!
    • -
    • - Care Instructions: - Hand wash only. Not microwave or dishwasher safe. -
    • -
    • Materials: Ceramic
    • -
    • Dimensions: approx. 3.15" diameter x 3.75" tall
    • -
    - -

    You wanna buy it?

    - -

    If you like to buy this brilliant mug, just do the following steps:

    - -
      -
    1. Select how many items do you want.
    2. -
    3. Press "buy".
    4. -
    - -
    - - - -
    -
    - -
    (C) by ThinkGeek – Produkttext mit freundlicher Genehmigung von ThinkGeek Inc.
    - - - - diff --git a/03_dom/uebungen/u06_tasse-01001/assets/css/styles.css b/03_dom/uebungen/u06_tasse-01001/assets/css/styles.css deleted file mode 100644 index 6da8361..0000000 --- a/03_dom/uebungen/u06_tasse-01001/assets/css/styles.css +++ /dev/null @@ -1,369 +0,0 @@ -/* -------------------------------------------- Haupt CSS fuer alle Seiten -------------------------------------------- */ - -/* ---------------- CSS-Reset ------------------- */ -html, -body, -a, -div, -h1, -h2, -h3, -h4, -h5, -h6, -span, -p, -img, -strong, -ul, -li, -table, -th, -td, -tr { - margin: 0px; - padding: 0px; - border: 0px none; - font-weight: normal; - font-style: inherit; - font-family: inherit; - font-variant: inherit; - text-decoration: none; - table-layout: inherit; -} - -/* ---------------- Body / HTML ------------------- */ - -html { - font-size: 100%; - background-color: #fffef7; -} - -body { - font-family: Helvetica, Arial, sans-serif; - font-size: 1.2em; - font-weight: normal; - color: black; - margin: 0rem auto 2rem auto; -} - -/* ---------------- layout ------------------- */ - -header { - background: url(../img/js_header.png) left top no-repeat transparent; - background-size: cover; - height: 250px; - min-width: 850px; -} - -header:after { - content: ' '; - display: block; - height: 250px; - background: rgba(255, 254, 247, 0); - background: -moz-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -webkit-gradient( - left top, - left bottom, - color-stop(0%, rgba(255, 254, 247, 0)), - color-stop(22%, rgba(255, 254, 247, 0.55)), - color-stop(42%, rgba(255, 254, 247, 0.7)), - color-stop(43%, rgba(255, 254, 247, 0.71)), - color-stop(61%, rgba(255, 254, 247, 0.78)), - color-stop(75%, rgba(255, 254, 247, 0.92)), - color-stop(87%, rgba(255, 254, 247, 1)), - color-stop(100%, rgba(255, 254, 247, 1)) - ); - background: -webkit-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -o-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -ms-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: linear-gradient( - to bottom, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fffef7', endColorstr='#fffef7', GradientType=0 ); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fffef7', endColorstr='#fffef7', GradientType=0 ); -} - -main, -footer { - width: 70%; - margin: 3rem auto; - min-width: 850px; - padding: 0 20px; - box-sizing: border-box; -} - -/* ---------------- Content ------------------- */ - -h1 { - color: #93412b; - font-size: 3em; - margin-bottom: 20px; - font-weight: bold; -} - -h2 { - color: #93412b; - font-size: 2.5em; - margin-bottom: 15px; -} - -h3 { - color: #93412b; - font-size: 2em; - margin-bottom: 10px; -} - -p { - line-height: 15px; - margin-bottom: 15px; - line-height: 1.7em; -} - -.cited { - font-style: italic; - font-size: 0.8em; -} - -.u { - text-decoration: underline; -} -.b { - font-weight: bold; -} -.i { - font-style: italic; -} -.align_right { - text-align: right; -} -.align_left { - text-align: left; - margin-right: 10px; -} -.align_center { - text-align: center; -} -.float_left { - float: left; -} -.float_right { - float: right; -} -.clear_both { - clear: both; -} -strong { - font-weight: bold; -} -.special { - color: #b7595b; - font-weight: bold; -} -.keyword { - color: #db6f50; - font-weight: bold; - font-style: italic; -} -.gray, -.grey { - color: gray; -} - -/* Links */ -main a:link, -main a:visited { - color: #eb690b; - font-weight: bold; -} - -main a:focus, -main a:hover, -main a:active { - color: #eb690b; -} - -ul { - list-style-position: outside; - margin-bottom: 20px; - padding-left: 22px; -} - -ol { - margin-bottom: 20px; - padding-left: 30px; -} - -li { - line-height: 1.4em; -} - -/* ------- Article ------- */ - -h1 { - color: #93412b; - font-size: 2.7em; - margin-bottom: 20px; -} - -#buy_form input[type='button'] { - display: inline-block; - padding: 1px 20px 3px 20px; - background-color: #93412b; - color: white; - border: 1px solid white; - font-size: 1em; - height: 32px; -} - -#buy_form input[type='button']:hover { - background-color: white; - color: #93412b; - border: 1px solid #93412b; -} - -#buy_form select { - display: inline-block; - font-size: 1em; - background-color: white; - color: #93412b; - border: 1px solid #93412b; - height: 32px; -} - -/* ------- Chat ------- */ - -#chat { - width: 100%; - background-color: white; - border: 1px solid #9c352f; - height: 20rem; - position: relative; -} - -#chat_window { - background-color: white; - width: 85%; - float: left; - height: 95%; -} - -#chat_history { - position: absolute; - bottom: 8%; - max-height: 92%; - padding: 0px 0px 5px 7px; -} - -#chat_history p { - font-size: 0.6em; - margin: 0; -} - -#chat_text { - height: 8%; - position: absolute; - bottom: 0; - width: 85%; -} - -#chat_text input { - width: 98%; - display: block; - margin: auto; -} - -#chat_members { - list-style-type: none; - height: 100%; - width: 15%; - margin-left: 85%; - border-left: 1px solid #9c352f; - text-align: right; - box-sizing: border-box; - min-width: 100px; - font-size: 0.8em; - padding-top: 5px; -} - -#chat_members li { - line-height: 1.2em; - padding: 5px 10px 2px 15px; -} - -#chat_members .highlighted { - background-color: #c14d45; - color: white; -} -.chat_member { - font-weight: bold; -} -.chat_member1 { - color: #3626c8; -} -.chat_member2 { - color: #e38d0b; -} - -#member_search { - position: absolute; - right: 0; - bottom: 0; - width: 15%; - height: 8%; -} - -#member_search input { - width: 88%; - display: block; - margin: auto; - text-align: right; -} diff --git a/03_dom/uebungen/u06_tasse-01001/assets/img/favicon.ico b/03_dom/uebungen/u06_tasse-01001/assets/img/favicon.ico deleted file mode 100644 index bd2cd28..0000000 Binary files a/03_dom/uebungen/u06_tasse-01001/assets/img/favicon.ico and /dev/null differ diff --git a/03_dom/uebungen/u06_tasse-01001/assets/img/js_header.png b/03_dom/uebungen/u06_tasse-01001/assets/img/js_header.png deleted file mode 100644 index 4d14ceb..0000000 Binary files a/03_dom/uebungen/u06_tasse-01001/assets/img/js_header.png and /dev/null differ diff --git a/03_dom/uebungen/u06_tasse-01001/assets/img/logo.png b/03_dom/uebungen/u06_tasse-01001/assets/img/logo.png deleted file mode 100644 index bbd9fcc..0000000 Binary files a/03_dom/uebungen/u06_tasse-01001/assets/img/logo.png and /dev/null differ diff --git a/03_dom/uebungen/u06_tasse-01001/assets/img/newsboard_empty.png b/03_dom/uebungen/u06_tasse-01001/assets/img/newsboard_empty.png deleted file mode 100644 index d650b1b..0000000 Binary files a/03_dom/uebungen/u06_tasse-01001/assets/img/newsboard_empty.png and /dev/null differ diff --git a/03_dom/uebungen/u06_tasse-01001/assets/img/newsboard_paperclip.png b/03_dom/uebungen/u06_tasse-01001/assets/img/newsboard_paperclip.png deleted file mode 100644 index 7f24721..0000000 Binary files a/03_dom/uebungen/u06_tasse-01001/assets/img/newsboard_paperclip.png and /dev/null differ diff --git a/03_dom/uebungen/u06_tasse-01001/assets/img/newsboard_sheets.png b/03_dom/uebungen/u06_tasse-01001/assets/img/newsboard_sheets.png deleted file mode 100644 index 14680cb..0000000 Binary files a/03_dom/uebungen/u06_tasse-01001/assets/img/newsboard_sheets.png and /dev/null differ diff --git a/03_dom/uebungen/u06_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug.gif b/03_dom/uebungen/u06_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug.gif deleted file mode 100644 index 3a9c8ad..0000000 Binary files a/03_dom/uebungen/u06_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug.gif and /dev/null differ diff --git a/03_dom/uebungen/u06_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug_grid_embed.jpg b/03_dom/uebungen/u06_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug_grid_embed.jpg deleted file mode 100644 index 4399460..0000000 Binary files a/03_dom/uebungen/u06_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug_grid_embed.jpg and /dev/null differ diff --git a/03_dom/uebungen/u06_tasse-01001/index.html b/03_dom/uebungen/u06_tasse-01001/index.html deleted file mode 100644 index f3adfb6..0000000 --- a/03_dom/uebungen/u06_tasse-01001/index.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - 010010000100111101010100 - - - - - - - -
    - -
    -

    - Hot Binary Heat Changing Mug - "010010000100111101010100" -

    - - Hot Binary Heat Changing Mug - -

    Description

    - -

    - Numbers make up - everything in our digital world. They flow around us, invisible like the Force or - the Matrix, controlling all our many computer-y devices. Two numbers, in particular: - 0 and 1. Off and On. Well, we can tell you this: when - there's no coffee in our cup, we're completely OFF our game. But when our mug is full of hot coffee, we're - totally ON. And now, with the Hot Binary Heat Changing Mug, there's a mug that - tells us which state our mug is in. In binary! -

    - -

    - See, the - Hot Binary Heat Changing Mug - looks like just a dark mug with binary numbers all over it. That's its OFF or cold state. Add hot coffee (or any - liquid) and a series of digits will turn white. Read them continuously from left to right, and you'll read: - 010010000100111101010100. That's in binary. Of course, - your - Hot Binary Heat Changing Mug - could just be paying you a compliment. Cheeky, mug. -

    - -

    - 010010000100111101010100 -

    - -

    Product Specifications

    - -
      -
    • Hot Binary Heat Changing Mug
    • -
    • - As you add hot liquids, the binary for "HOT" appears (read from left to right in one line, not two: - 010010000100111101010100) -
    • -
    • A ThinkGeek creation and exclusive!
    • -
    • - Care Instructions: - Hand wash only. Not microwave or dishwasher safe. -
    • -
    • Materials: Ceramic
    • -
    • Dimensions: approx. 3.15" diameter x 3.75" tall
    • -
    - -

    You wanna buy it?

    - -

    If you like to buy this brilliant mug, just do the following steps:

    - -
      -
    1. Select how many items do you want.
    2. -
    3. Press "buy".
    4. -
    - -
    - - -
    -
    - -
    (C) by ThinkGeek – Produkttext mit freundlicher Genehmigung von ThinkGeek Inc.
    - - - - diff --git a/03_dom/uebungen/u07_content-length/assets/css/main.css b/03_dom/uebungen/u07_content-length/assets/css/main.css deleted file mode 100644 index 18d1085..0000000 --- a/03_dom/uebungen/u07_content-length/assets/css/main.css +++ /dev/null @@ -1,38 +0,0 @@ -*, -html { - box-sizing: border-box; -} - -html, -body { - font-family: 'Helvetica', 'Arial', sans-serif; - color: #444; - font-weight: normal; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - padding: 0.5em; -} - -.coffee_break_article { - background-color: BurlyWood; -} - -.normal_length_article { - background-color: #cafe69; -} - -.lone_weekend_article { - background-color: DarkTurquoise; -} - -.container { - margin: 0 auto; - padding: 1rem; - max-width: 1140px; -} diff --git a/03_dom/uebungen/u07_content-length/index.html b/03_dom/uebungen/u07_content-length/index.html deleted file mode 100644 index eea3a24..0000000 --- a/03_dom/uebungen/u07_content-length/index.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - Article Detail Page - - - - -
    -
    -

    Lorem ipsum

    -
    -

    - Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et - dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex - ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat - nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit - anim id est laborum. -

    - -

    ...

    -

    - Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et - dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex - ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat - nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit - anim id est laborum. -

    -
    -
    -
    - - - diff --git a/03_dom/uebungen/u08-09_newsboard/assets/css/main.css b/03_dom/uebungen/u08-09_newsboard/assets/css/main.css deleted file mode 100644 index 60e194c..0000000 --- a/03_dom/uebungen/u08-09_newsboard/assets/css/main.css +++ /dev/null @@ -1,239 +0,0 @@ -* { - margin: 0; -} -html { - font-size: 100%; - padding: 0; - background-attachment: fixed; - background-image: -webkit-linear-gradient(top, #eef0f2, #d3d5d9); - background-image: -moz-linear-gradient(top, #eef0f2, #d3d5d9); - background-image: linear-gradient(to bottom, #eef0f2, #d3d5d9); -} -body { - color: #333; - font-size: 1em; - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; - text-align: left; - margin: 1em; - padding: 0; -} -p, -h1, -h2, -h3, -h4, -h5, -h6 { - margin-bottom: 1rem; -} -p { - line-height: 1.5em; - -webkit-hyphens: auto; - -moz-hyphens: auto; - hyphens: auto; -} -p:last-child { - margin-bottom: 0; -} -a { - color: #2f83e8; - text-decoration: none; -} -a:hover { - text-decoration: underline; -} -strong, -b { - font-weight: bold; -} -em, -i { - font-style: italic; -} -.float_left { - float: left; -} -.float_right { - float: right; -} -.disabled { - opacity: 0.4; - cursor: default; -} -.message_number { - color: #fff; - font-size: 0.8em; - font-weight: bold; - text-align: center; - line-height: 1em; - position: absolute; - top: -0.5em; - left: -0.5em; - display: block; - padding-top: 0.3em; - min-width: 2em; - height: 2em; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - cursor: default; - background-color: #ea2314; - background-image: -webkit-linear-gradient(top, #f78f91, #c50404); - background-image: -moz-linear-gradient(top, #f78f91, #c50404); - background-image: linear-gradient(to bottom, #f78f91, #c50404); - border: 2px solid #fff; - -webkit-border-radius: 1em; - -moz-border-radius: 1em; - border-radius: 1em; - -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3); - box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3); -} -.newsboard_wrapper { - margin: 0 auto 2em auto; - padding: 13px 0 0 17px; - max-width: 550px; - position: relative; - background: url('../img/sheets.png') no-repeat; -} -.newsboard_wrapper:before { - content: url('../img/paperclip.png'); - position: absolute; - top: 5px; - right: 35px; - z-index: 1; -} -.newsboard_wrapper .newsboard { - padding: 29px 1.25rem 4rem 1.25rem; - min-height: 20em; - position: relative; - border: 1px solid #ccc; - background-color: #fff; - background-image: -webkit-linear-gradient(#dddddd, #ffffff 1px); - background-image: -moz-linear-gradient(#dddddd, #ffffff 1px); - background-image: linear-gradient(#dddddd, #ffffff 1px); - background-position: 0 1.3em; - -webkit-background-size: 100% 1.5em; - -moz-background-size: 100% 1.5em; - background-size: 100% 1.5em; - -webkit-box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.3); - box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.3); -} -.newsboard_wrapper .newsboard .close_button { - color: #777; - font-size: 1.2em; - text-decoration: none; - line-height: 1em; - position: absolute; - top: 10px; - right: 14px; - display: block; -} -.newsboard_wrapper .newsboard .close_button:hover { - color: #444; -} -.newsboard_wrapper .newsboard .newsboard_footer { - color: #999; - font-size: 0.8em; -} -.newsboard_wrapper .newsboard .paging_bar { - font-size: 1.8em; - padding: 0 1.25rem; - position: absolute; - left: 0; - right: 0; - bottom: 1rem; - white-space: nowrap; -} -.newsboard_wrapper .newsboard .paging_bar .float_left a, -.newsboard_wrapper .newsboard .paging_bar .float_right a { - color: #777; - text-decoration: none; -} -.newsboard_wrapper .newsboard .paging_bar .float_left a { - margin-right: 0.3em; -} -.newsboard_wrapper .newsboard .paging_bar .float_right a { - margin-left: 0.3em; -} -.newsboard_wrapper .newsboard .paging_bar .progressbar { - display: block; - width: 40%; - margin: 0 auto; -} -.newsboard_wrapper .newsboard .paging_bar progress { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - vertical-align: 0; - line-height: normal; - color: #2f83e8; - width: 100%; - height: 0.6rem; - border-style: none; - padding: 0; - background-color: #eee; - -webkit-border-radius: 0.3rem; - -moz-border-radius: 0.3rem; - border-radius: 0.3rem; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.4); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.4); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.4); -} -.newsboard_wrapper .newsboard .paging_bar progress::-webkit-progress-bar { - padding: 0; - border-style: none; - background-color: transparent; -} -.newsboard_wrapper .newsboard .paging_bar progress::-webkit-progress-value { - -webkit-border-radius: 0.3rem; - border-radius: 0.3rem; - background-color: #2f83e8; - background-image: -webkit-linear-gradient(top, #8bbaf2, #176acd); - background-image: linear-gradient(to bottom, #8bbaf2, #176acd); -} -.newsboard_wrapper .newsboard .paging_bar progress::-moz-progress-bar { - -moz-border-radius: 0.3rem; - border-radius: 0.3rem; - background-color: #2f83e8; - background-image: -moz-linear-gradient(top, #8bbaf2, #176acd); - background-image: linear-gradient(to bottom, #8bbaf2, #176acd); -} -.newsboard_wrapper .newsboard .newsboard_content h1, -.newsboard_wrapper .newsboard .newsboard_content h2 { - font-weight: normal; - font-family: - 'Helvetica Neue Light', 'HelveticaNeue-Light', 'Helvetica Light', 'Helvetica-Light', Helvetica, Arial, sans-serif; - letter-spacing: 0.03em; -} -.newsboard_wrapper .newsboard .newsboard_content h1 { - font-size: 1.75em; -} -.newsboard_wrapper .newsboard .newsboard_content h2 { - color: #2f83e8; - font-size: 1.2em; - line-height: 1.4em; -} -.newsboard_wrapper .newsboard .newsboard_content:empty { - color: #999; - font-size: 1.15em; - text-align: center; - padding-top: 10.5rem; - background: url('../img/empty.png') no-repeat center 3.75rem; -} -.newsboard_wrapper .newsboard .newsboard_content:empty:after { - content: 'Keine neuen Mitteilungen.'; -} - -.sr-only { - width: 1px !important; - height: 1px !important; - padding: 0 !important; - margin: -1px !important; - overflow: hidden !important; - clip: rect(0, 0, 0, 0) !important; - white-space: nowrap !important; - border: 0 !important; - display: inline-block !important; -} diff --git a/03_dom/uebungen/u08-09_newsboard/assets/img/empty.png b/03_dom/uebungen/u08-09_newsboard/assets/img/empty.png deleted file mode 100644 index d650b1b..0000000 Binary files a/03_dom/uebungen/u08-09_newsboard/assets/img/empty.png and /dev/null differ diff --git a/03_dom/uebungen/u08-09_newsboard/assets/img/paperclip.png b/03_dom/uebungen/u08-09_newsboard/assets/img/paperclip.png deleted file mode 100644 index 7f24721..0000000 Binary files a/03_dom/uebungen/u08-09_newsboard/assets/img/paperclip.png and /dev/null differ diff --git a/03_dom/uebungen/u08-09_newsboard/assets/img/sheets.png b/03_dom/uebungen/u08-09_newsboard/assets/img/sheets.png deleted file mode 100644 index 14680cb..0000000 Binary files a/03_dom/uebungen/u08-09_newsboard/assets/img/sheets.png and /dev/null differ diff --git a/03_dom/uebungen/u08-09_newsboard/assets/js/main.js b/03_dom/uebungen/u08-09_newsboard/assets/js/main.js deleted file mode 100644 index f41b4da..0000000 --- a/03_dom/uebungen/u08-09_newsboard/assets/js/main.js +++ /dev/null @@ -1,162 +0,0 @@ -'use strict'; - -(() => { - // === DOM & VARS ======= - const module = document.querySelector('.newsboard') || console.error('newsboard not found'); - const DOM = { - messageNumber: module.querySelector('.message_number'), - newsboardContent: module.querySelector('.newsboard_content'), - buttonNext: module.querySelector('.button-next'), - buttonLast: module.querySelector('.button-last'), - buttonPrev: module.querySelector('.button-prev'), - buttonFirst: module.querySelector('.button-first'), - progressBar: module.querySelector('.progressbar progress'), - }; - - console.log(DOM); - - // === INIT ============= - const init = () => { - // Funktionaufrufe zu beginn der Anwendung - - ////////////////// - // Start 9.2 & 9.3 - // ich musste hier die Reihenfolge ändern, damit meine Lösung funktioniert - // sonst wäre DOM.progressBar.value = 0 (wird erst in der initPro... auf 1 initialisiert) - initProgressbar(); - updateMessageByNumber(1); - // Ende 9.2 & 9.3 - ///////////////// - - //////////////// - // Start 8.2 - setMessageNumber(1); - // Ende 8.2 - //////////////// - - // Eventlauscher zu beginn der Anwendung - DOM.buttonNext.addEventListener('click', onClickNext); - DOM.buttonPrev.addEventListener('click', onClickPrev); - /////////////////////// - // Start 8.1 - DOM.buttonFirst.addEventListener('click', onClickFirst); - DOM.buttonLast.addEventListener('click', onClickLast); - // Ende 8.1 - /////////////// - window.addEventListener('keyup', onKeyUp); - }; - - // === EVENTHANDLER ===== - const onKeyUp = (e) => { - // Übung 8.3 && 8.4 Tastatursteuerung - console.log(e); - if (e.key === 'ArrowLeft') { - if (!e.altKey) { - onClickPrev(e); - } else { - onClickFirst(e); - } - } else if (e.key === 'ArrowRight') { - if (!e.altKey) { - onClickNext(e); - } else { - onClickLast(e); - } - } - }; - - const onClickNext = (e) => { - updateMessageByNumber((DOM.progressBar.value += 1)); - }; - const onClickPrev = (e) => { - updateMessageByNumber((DOM.progressBar.value -= 1)); - }; - - ////////////////// - // Start 8.1 - const onClickFirst = (e) => { - updateMessageByNumber((DOM.progressBar.value = 1)); - }; - const onClickLast = (e) => { - updateMessageByNumber((DOM.progressBar.value = MESSAGES.length)); - }; - // Ende 8.1 - ///////////////////////// - - // === XHR/FETCH ======== - - // === FUNCTIONS ======== - const updateMessageByNumber = (n) => { - DOM.newsboardContent.innerHTML = MESSAGES[n - 1]; - ////////////// - // Start 8.2 - setMessageNumber(n); - // Ende 8.2 - ////////////////// - - ////////////////// - // Start 9.2 - updateBtnState(); - // Ende 9.2 - /////////////////////// - }; - - ///////////////////////// - // Start 9.2 - const updateBtnState = () => { - const n = DOM.progressBar.value; - if (n === 1) { - // wir sind am Anfang, also die linken Buttons AUSschalten und - // die rechten EINschalten - DOM.buttonFirst.disabled = DOM.buttonPrev.disabled = true; - DOM.buttonLast.disabled = DOM.buttonNext.disabled = false; - } else if (n > 1 && n < MESSAGES.length) { - // wir sind mitten in der message liste - also alle Buttons aktivieren - DOM.buttonFirst.disabled = false; - DOM.buttonPrev.disabled = false; - DOM.buttonLast.disabled = false; - DOM.buttonNext.disabled = false; - } else if (n === MESSAGES.length) { - // wir sind am Ende, also die linken Buttons EINschalten und - // die rechten EINschalten - DOM.buttonLast.disabled = DOM.buttonNext.disabled = true; - DOM.buttonFirst.disabled = DOM.buttonPrev.disabled = false; - } - }; - // Ende 9.2 & 9.3 - ///////////////////// - - const initProgressbar = () => { - DOM.progressBar.max = MESSAGES.length; - DOM.progressBar.value = 1; - }; - - ////////////// - // Start 8.2 - const setMessageNumber = (n) => { - DOM.messageNumber.textContent = `${n}/${MESSAGES.length}`; - }; - // Ende 8.2 - ///////////////////////////////// - - init(); -})(); - -// Übung 8: Newsboard: Das geht noch besser -// Das Newsboard wartet noch auf das Vervollständigen seiner Funktionen. - -// 1. Belege die Links » und « mit Funktionalität. Der Link mit der Aufschrift « soll es erlauben, zur ersten Nachricht zu springen, der Link » zur letzten. - -// 2. Der bisher eher sinnlose rote Kreis in der linken oberen Ecke soll nun die Gesamtanzahl der Nachrichten anzeigen. Schreibe eine Funktion, die diese Anzahl ausliest und in das mit der Klasse message_number einträgt. - -// 3. Unterstütze ab sofort das Navigieren durch die News mit der Tastatur. Die Pfeiltasten nach links und rechts sollen dabei jeweils die gleiche Funktionalität wie die Buttons < und > ermöglichen. - -// 4. Auch das Springen auf die erste bzw. letzte Position soll nun mit Tastatur möglich sein. Die Tastenkombination dafür ist alt und die Pfeiltaste nach links (zur ersten Nachricht) bzw. rechts (zur letzten Nachricht). - -// Übung 9: Newsboard: Jetzt ist aber Schluss! - -// Die neuen Features des Newsboards sind schon fast fertig. Problematisch ist aber, dass die Vorwärts- und Rückwärts-Buttons auch aktiv sind, wenn es keine vorige bzw. nächste Nachricht mehr gibt. Dies führt zu einem sehr unschönen Fehler. - -// 2. Sorge dafür, dass die Vor- und Rückwärts-Buttons jeweils deaktiviert werden, sobald der Anwender am Anfang bzw. Ende der Nachrichtenliste angekommen ist. - -// 3. Auch die Buttons, die den Anwender zur ersten bzw. zur letzten Nachricht führen, sollen deaktiviert sein, sobald sich der Anwender bei der ersten bzw. letzten Nachricht befindet. diff --git a/03_dom/uebungen/u08-09_newsboard/assets/js/messages.js b/03_dom/uebungen/u08-09_newsboard/assets/js/messages.js deleted file mode 100644 index 0b78d36..0000000 --- a/03_dom/uebungen/u08-09_newsboard/assets/js/messages.js +++ /dev/null @@ -1,19 +0,0 @@ -// Konfigurationsvariablen - -const MESSAGES = [ - `

    Tutors are on a strike!!!

    -

    All assignmnent are automatically graded with 0 points

    -

    Duis pretium ornare odio nec cursus. Nulla quis dolor vitae nulla condimentum maximus nec vitae purus. Curabitur ut mi non nulla molestie porta. Curabitur dignissim lacinia condimentum. In hac habitasse platea dictumst. Mauris ut urna magna. Mauris venenatis eu quam nec posuere. Nulla facilisi. Donec convallis sodales massa, et consequat nunc vehicula malesuada.

    - `, - - `

    Madness!

    -

    How to earn a fortune, with a complete stupid idea

    -

    Ut molestie elementum risus, eget rutrum dui tristique id. Duis ac elit a mi convallis lacinia. Sed at ultricies magna. Pellentesque nisl est, mattis eget porta eu, rhoncus in urna. Integer faucibus lectus nec malesuada tempus. Duis consectetur sollicitudin ultricies. Cras massa nulla, aliquet vitae interdum quis, venenatis at quam.

    - `, - - `

    I did something, and you will never guess what happened next...

    -

    Donec tristique, leo at suscipit pellentesque, mauris neque congue leo!

    -

    Aenean egestas mauris at neque egestas hendrerit id ut erat. Donec iaculis ornare gravida. Vestibulum condimentum, tortor nec eleifend consectetur, justo lacus dignissim ante, eget commodo enim urna sollicitudin arcu. Odio eu leo pulvinar rutrum sed a turpis. Nunc dui tortor, rutrum vitae gravida quis, hendrerit a massa. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas

    -

    Integer non venenatis tellus. Phasellus tellus leo, suscipit ac vulputate non, varius nec eros. Etiam scelerisque nisi arcu, interdum tempus dui volutpat vel. Donec eget posuere nulla. Etiam ornare dapibus tortor, ac sollicitudin nisi porta a. Donec tristique, leo at suscipit pellentesque, mauris neque congue leo, sed tempor massa justo a ligula. Curabitur vitae rhoncus lacus, quis varius felis. Ut tincidunt sit amet nisl finibus tempus. Curabitur mollis sit amet leo a sagittis.

    - `, -]; diff --git a/03_dom/uebungen/u08-09_newsboard/index.html b/03_dom/uebungen/u08-09_newsboard/index.html deleted file mode 100644 index d4137ff..0000000 --- a/03_dom/uebungen/u08-09_newsboard/index.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - Newsboard - - - - - - - - - -
    -
    - X - - × - -
    - -
    - - - - - - - - - - - - - -
    -
    -
    - - diff --git a/03_dom/uebungen/u10_running-lights/assets/css/main.css b/03_dom/uebungen/u10_running-lights/assets/css/main.css deleted file mode 100644 index 0a9dcdd..0000000 --- a/03_dom/uebungen/u10_running-lights/assets/css/main.css +++ /dev/null @@ -1,4 +0,0 @@ -.light-bulbs{ - padding: 1rem; - border: 2px solid #555; -} \ No newline at end of file diff --git a/03_dom/uebungen/u10_running-lights/assets/img/light_off.png b/03_dom/uebungen/u10_running-lights/assets/img/light_off.png deleted file mode 100644 index 4043472..0000000 Binary files a/03_dom/uebungen/u10_running-lights/assets/img/light_off.png and /dev/null differ diff --git a/03_dom/uebungen/u10_running-lights/assets/img/light_on.png b/03_dom/uebungen/u10_running-lights/assets/img/light_on.png deleted file mode 100644 index 0230d78..0000000 Binary files a/03_dom/uebungen/u10_running-lights/assets/img/light_on.png and /dev/null differ diff --git a/03_dom/uebungen/u10_running-lights/assets/js/libs/helpers.js b/03_dom/uebungen/u10_running-lights/assets/js/libs/helpers.js deleted file mode 100644 index 097d2c2..0000000 --- a/03_dom/uebungen/u10_running-lights/assets/js/libs/helpers.js +++ /dev/null @@ -1,92 +0,0 @@ -// Helper DOM Selektion mit $ & $$ -const $ = (qs) => document.querySelector(qs); -const $$ = (qs) => Array.from(document.querySelectorAll(qs)); - -Node.prototype.on = function(name, fn) { - this.addEventListener(name, fn); - return this; -}; - -// // anstatt -// document.querySelector('button').addEventListener('click', (event) => { }); -// // wird zu: -// document.querySelector('button').on('click', (event) => { }); - -Array.prototype.on = Array.prototype.addEventListener = function(name, fn) { - this.forEach((elem) => elem.on(name, fn)); - return this; -}; - -// anstatt -// Array.from(document.querySelectorAll('.menu-main li a')).forEach((elem) => -// elem.addEventListener('click', (event) => { -// console.log(event); -// }) -// ); -// // wird zu -// Array.from(document.querySelectorAll('.menu-main li a')).on( -// 'click', -// (event) => { -// console.log(event); -// } -// ); - - - -// helper -const $on = (el, ev, fn) => { - Array.isArray(el) ? el.forEach(ae => $on(ae, ev, fn)) : - el.addEventListener(ev, fn); - return el; -}; - -// times - funktion -function times(n, fn) { - const result = Array(n); - for (let i = 0; i < n; i++) { - result[i] = fn(i); - } - return result; -} -// oder von lodash -function baseTimes(n, iteratee) { - var index = -1, - result = Array(n); - - while (++index < n) { - result[index] = iteratee(index); - } - return result; -} - -/* - * range(zahl bis wohin array befüllt werden soll) : array - * - array von 0 bis - parameterzahl (nicht inklusive) - * - * range(anfangswert, endwert) : array - * - array von anfangswert bis endwert (nicht inklusive) - * - * range(nfangswert, endwert, übersprungswert) : : array - * - array von anfangswert bis endwert (nicht inklusive), zwischenwerte durch übersprungswert entfallen -*/ -function rangeFromStartToEnd(start, end, step = 1) { - const length = Math.max(Math.ceil((end - start) / step), 0); - const result = new Array(length); - const sign = step / Math.abs(step); - - let index = 0; - for (let value = start; value * sign < end * sign; value += step) { - result[index++] = value; - } - return result; -}; - - -function range(startOrEnd, end, step) { - if (end) { - return rangeFromStartToEnd(startOrEnd, end, step); - } else { - return rangeFromStartToEnd(0, startOrEnd); - } -}; diff --git a/03_dom/uebungen/u10_running-lights/assets/js/libs/jquery.min.js b/03_dom/uebungen/u10_running-lights/assets/js/libs/jquery.min.js deleted file mode 100644 index b061403..0000000 --- a/03_dom/uebungen/u10_running-lights/assets/js/libs/jquery.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 { - // === DOM & VARS ======= - const module = document.querySelector('.light-bulbs'); - const DOM = { - lights: Array.from(module.querySelectorAll('img[alt="lightbulb"]')), - }; - - const LIGHT_PATH_ON = 'assets/img/light_on.png'; - const LIGHT_PATH_OFF = 'assets/img/light_off.png'; - - // - // === INIT ============= - const init = () => { - // Eventlistener für jede Lampe - DOM.lights.forEach((light) => { - light.addEventListener('mouseenter', enterMouseLight); - }); - - turnAllLightsOff(); - }; - - // === EVENTHANDLER ===== - const enterMouseLight = (e) => { - // idx des aktuellen lichtes holen - console.log(e.target); - const idx = DOM.lights.indexOf(e.target); - - if (idx === -1) return; - - // nu alle lichter aus - turnAllLightsOff(); - - // mit den index das nächste licht einschalten oder das erste, wenn das letzte an ist - if (idx === DOM.lights.length - 1) { - DOM.lights[0].src = LIGHT_PATH_ON; - } else { - DOM.lights[idx + 1].src = LIGHT_PATH_ON; - } - }; - // === XHR/FETCH ======== - - // === FUNCTIONS ======== - const turnAllLightsOff = () => { - DOM.lights.forEach((light) => { - light.src = LIGHT_PATH_OFF; - }); - }; - init(); -})(); diff --git a/03_dom/uebungen/u10_running-lights/assets/js/main-ersin.js b/03_dom/uebungen/u10_running-lights/assets/js/main-ersin.js deleted file mode 100644 index bed4340..0000000 --- a/03_dom/uebungen/u10_running-lights/assets/js/main-ersin.js +++ /dev/null @@ -1,68 +0,0 @@ -'use strict'; - -(() => { - const $ = (qs) => document.querySelector(qs); - const $$ = (qs) => Array.from(document.querySelectorAll(qs)); - - // === DOM & VARS ======= - const DOM = { - // Alle Glühbirnen-Bilder auswählen - bulbs: $$('.light-bulbs img'), - }; - - const LIGHT_PATH_ON = 'assets/img/light_on.png'; - const LIGHT_PATH_OFF = 'assets/img/light_off.png'; - - // Zähler - let activeIndex = 0; - - // === INIT ============= - const init = () => { - if (DOM.bulbs.length === 0) return; - - // zustand reseten - updateLights(); // first bulb on - - DOM.bulbs.forEach((bulb, index) => { - bulb.addEventListener('mouseenter', (e) => onBulbHover(e, index)); - - bulb.addEventListener('click', onBulbClick); - }); - }; - - // === EVENTHANDLER ===== - - const onBulbHover = (e, hoveredIndex) => { - if (hoveredIndex === activeIndex) { - nextLight(); - } - }; - - const onBulbClick = () => { - nextLight(); - }; - - // === FUNCTIONS ======== - - const nextLight = () => { - activeIndex++; - - if (activeIndex >= DOM.bulbs.length) { - activeIndex = 0; - } - - updateLights(); - }; - - const updateLights = () => { - DOM.bulbs.forEach((bulb, index) => { - if (index === activeIndex) { - bulb.src = LIGHT_PATH_ON; - } else { - bulb.src = LIGHT_PATH_OFF; - } - }); - }; - - init(); -})(); diff --git a/03_dom/uebungen/u10_running-lights/assets/js/main.js b/03_dom/uebungen/u10_running-lights/assets/js/main.js deleted file mode 100644 index 6dfd415..0000000 --- a/03_dom/uebungen/u10_running-lights/assets/js/main.js +++ /dev/null @@ -1,56 +0,0 @@ -'use strict'; - -(() => { - // === DOM & VARS ======= - const module = document.querySelector('.light-bulbs'); - const DOM = { - lightBulbs: Array.from(module.querySelectorAll('img[alt="lightbulb"]')), - }; - - const LIGHT_PATH_ON = 'assets/img/light_on.png'; - const LIGHT_PATH_OFF = 'assets/img/light_off.png'; - - // console.log(DOM); - // === INIT ============= - const init = () => { - setAllLightsOff(); - - DOM.lightBulbs.forEach((el, idx) => { - el.dataset.index = idx; // Index im HTMLImageElement ablegen (V1) - el.addEventListener('mouseenter', (e) => onMouseEnter(e, idx)); // Index als zweiten Parameter mitgeben (V2) - }); - }; - - // === EVENTHANDLER ===== - const onMouseEnter = (e, idx) => { - // const index = e.currentTarget.dataset.index; - const img = e.currentTarget; - const index = getIndexBy(img); // Index über Funktion ermitteln (V3) - - // if (e.currentTarget.src.includes(LIGHT_PATH_ON)) { - const nextIndex = getNextIndex(index); - - console.log(nextIndex); - setAllLightsOff(); - DOM.lightBulbs[nextIndex].src = LIGHT_PATH_ON; - // - }; - - // === XHR/FETCH ======== - - // === FUNCTIONS ======== - const getIndexBy = (img) => { - return DOM.lightBulbs.indexOf(img); - }; - const getNextIndex = (currentIndex) => { - return currentIndex === DOM.lightBulbs.length - 1 ? 0 : currentIndex + 1; - }; - - const setAllLightsOff = () => { - DOM.lightBulbs.forEach((el) => { - el.src = LIGHT_PATH_OFF; - }); - }; - - init(); -})(); diff --git a/03_dom/uebungen/u10_running-lights/index.html b/03_dom/uebungen/u10_running-lights/index.html deleted file mode 100644 index 203d0ee..0000000 --- a/03_dom/uebungen/u10_running-lights/index.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - Übung 10 - Chasing Lights - - - - - -
    -
    -

    Übung 10 - Chasing Lights

    - -

    - Eine erste Variante sind die chasing Lights. Dabei muss der Anwender das Lauflicht mit der Maus »jagen«. Immer - wenn der Mauszeiger sich über einer Glühbirne befindet, schaltet sich die nächste Birne ein und die aktuelle - aus. Versucht der Benutzer, mit dem Mauszeiger die leuchtende Glühbirne zu berühren, springt das Licht auf die - nächste über. Er »jagt« quasi das Lauflicht. Bei der letzten Lampe beginnt das Spiel wieder von vorn! -

    -

    - Programmiere ein weiteres Lauflicht. Diesmal soll das Lauflicht weiterspringen, wenn der Benutzer auf eine der - Lampen klickt. Auch hier gilt: Nach der letzten Lampe fängt das Licht wieder von vorn an zu laufen. -

    -
    -
    - lightbulb - lightbulb - lightbulb - lightbulb - lightbulb - lightbulb - lightbulb - lightbulb - lightbulb - lightbulb -
    -
    - - diff --git a/03_dom/uebungen/u11_tasse-01001/assets/css/styles.css b/03_dom/uebungen/u11_tasse-01001/assets/css/styles.css deleted file mode 100644 index 6da8361..0000000 --- a/03_dom/uebungen/u11_tasse-01001/assets/css/styles.css +++ /dev/null @@ -1,369 +0,0 @@ -/* -------------------------------------------- Haupt CSS fuer alle Seiten -------------------------------------------- */ - -/* ---------------- CSS-Reset ------------------- */ -html, -body, -a, -div, -h1, -h2, -h3, -h4, -h5, -h6, -span, -p, -img, -strong, -ul, -li, -table, -th, -td, -tr { - margin: 0px; - padding: 0px; - border: 0px none; - font-weight: normal; - font-style: inherit; - font-family: inherit; - font-variant: inherit; - text-decoration: none; - table-layout: inherit; -} - -/* ---------------- Body / HTML ------------------- */ - -html { - font-size: 100%; - background-color: #fffef7; -} - -body { - font-family: Helvetica, Arial, sans-serif; - font-size: 1.2em; - font-weight: normal; - color: black; - margin: 0rem auto 2rem auto; -} - -/* ---------------- layout ------------------- */ - -header { - background: url(../img/js_header.png) left top no-repeat transparent; - background-size: cover; - height: 250px; - min-width: 850px; -} - -header:after { - content: ' '; - display: block; - height: 250px; - background: rgba(255, 254, 247, 0); - background: -moz-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -webkit-gradient( - left top, - left bottom, - color-stop(0%, rgba(255, 254, 247, 0)), - color-stop(22%, rgba(255, 254, 247, 0.55)), - color-stop(42%, rgba(255, 254, 247, 0.7)), - color-stop(43%, rgba(255, 254, 247, 0.71)), - color-stop(61%, rgba(255, 254, 247, 0.78)), - color-stop(75%, rgba(255, 254, 247, 0.92)), - color-stop(87%, rgba(255, 254, 247, 1)), - color-stop(100%, rgba(255, 254, 247, 1)) - ); - background: -webkit-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -o-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -ms-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: linear-gradient( - to bottom, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fffef7', endColorstr='#fffef7', GradientType=0 ); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fffef7', endColorstr='#fffef7', GradientType=0 ); -} - -main, -footer { - width: 70%; - margin: 3rem auto; - min-width: 850px; - padding: 0 20px; - box-sizing: border-box; -} - -/* ---------------- Content ------------------- */ - -h1 { - color: #93412b; - font-size: 3em; - margin-bottom: 20px; - font-weight: bold; -} - -h2 { - color: #93412b; - font-size: 2.5em; - margin-bottom: 15px; -} - -h3 { - color: #93412b; - font-size: 2em; - margin-bottom: 10px; -} - -p { - line-height: 15px; - margin-bottom: 15px; - line-height: 1.7em; -} - -.cited { - font-style: italic; - font-size: 0.8em; -} - -.u { - text-decoration: underline; -} -.b { - font-weight: bold; -} -.i { - font-style: italic; -} -.align_right { - text-align: right; -} -.align_left { - text-align: left; - margin-right: 10px; -} -.align_center { - text-align: center; -} -.float_left { - float: left; -} -.float_right { - float: right; -} -.clear_both { - clear: both; -} -strong { - font-weight: bold; -} -.special { - color: #b7595b; - font-weight: bold; -} -.keyword { - color: #db6f50; - font-weight: bold; - font-style: italic; -} -.gray, -.grey { - color: gray; -} - -/* Links */ -main a:link, -main a:visited { - color: #eb690b; - font-weight: bold; -} - -main a:focus, -main a:hover, -main a:active { - color: #eb690b; -} - -ul { - list-style-position: outside; - margin-bottom: 20px; - padding-left: 22px; -} - -ol { - margin-bottom: 20px; - padding-left: 30px; -} - -li { - line-height: 1.4em; -} - -/* ------- Article ------- */ - -h1 { - color: #93412b; - font-size: 2.7em; - margin-bottom: 20px; -} - -#buy_form input[type='button'] { - display: inline-block; - padding: 1px 20px 3px 20px; - background-color: #93412b; - color: white; - border: 1px solid white; - font-size: 1em; - height: 32px; -} - -#buy_form input[type='button']:hover { - background-color: white; - color: #93412b; - border: 1px solid #93412b; -} - -#buy_form select { - display: inline-block; - font-size: 1em; - background-color: white; - color: #93412b; - border: 1px solid #93412b; - height: 32px; -} - -/* ------- Chat ------- */ - -#chat { - width: 100%; - background-color: white; - border: 1px solid #9c352f; - height: 20rem; - position: relative; -} - -#chat_window { - background-color: white; - width: 85%; - float: left; - height: 95%; -} - -#chat_history { - position: absolute; - bottom: 8%; - max-height: 92%; - padding: 0px 0px 5px 7px; -} - -#chat_history p { - font-size: 0.6em; - margin: 0; -} - -#chat_text { - height: 8%; - position: absolute; - bottom: 0; - width: 85%; -} - -#chat_text input { - width: 98%; - display: block; - margin: auto; -} - -#chat_members { - list-style-type: none; - height: 100%; - width: 15%; - margin-left: 85%; - border-left: 1px solid #9c352f; - text-align: right; - box-sizing: border-box; - min-width: 100px; - font-size: 0.8em; - padding-top: 5px; -} - -#chat_members li { - line-height: 1.2em; - padding: 5px 10px 2px 15px; -} - -#chat_members .highlighted { - background-color: #c14d45; - color: white; -} -.chat_member { - font-weight: bold; -} -.chat_member1 { - color: #3626c8; -} -.chat_member2 { - color: #e38d0b; -} - -#member_search { - position: absolute; - right: 0; - bottom: 0; - width: 15%; - height: 8%; -} - -#member_search input { - width: 88%; - display: block; - margin: auto; - text-align: right; -} diff --git a/03_dom/uebungen/u11_tasse-01001/assets/img/favicon.ico b/03_dom/uebungen/u11_tasse-01001/assets/img/favicon.ico deleted file mode 100644 index bd2cd28..0000000 Binary files a/03_dom/uebungen/u11_tasse-01001/assets/img/favicon.ico and /dev/null differ diff --git a/03_dom/uebungen/u11_tasse-01001/assets/img/js_header.png b/03_dom/uebungen/u11_tasse-01001/assets/img/js_header.png deleted file mode 100644 index 4d14ceb..0000000 Binary files a/03_dom/uebungen/u11_tasse-01001/assets/img/js_header.png and /dev/null differ diff --git a/03_dom/uebungen/u11_tasse-01001/assets/img/logo.png b/03_dom/uebungen/u11_tasse-01001/assets/img/logo.png deleted file mode 100644 index bbd9fcc..0000000 Binary files a/03_dom/uebungen/u11_tasse-01001/assets/img/logo.png and /dev/null differ diff --git a/03_dom/uebungen/u11_tasse-01001/assets/img/newsboard_empty.png b/03_dom/uebungen/u11_tasse-01001/assets/img/newsboard_empty.png deleted file mode 100644 index d650b1b..0000000 Binary files a/03_dom/uebungen/u11_tasse-01001/assets/img/newsboard_empty.png and /dev/null differ diff --git a/03_dom/uebungen/u11_tasse-01001/assets/img/newsboard_paperclip.png b/03_dom/uebungen/u11_tasse-01001/assets/img/newsboard_paperclip.png deleted file mode 100644 index 7f24721..0000000 Binary files a/03_dom/uebungen/u11_tasse-01001/assets/img/newsboard_paperclip.png and /dev/null differ diff --git a/03_dom/uebungen/u11_tasse-01001/assets/img/newsboard_sheets.png b/03_dom/uebungen/u11_tasse-01001/assets/img/newsboard_sheets.png deleted file mode 100644 index 14680cb..0000000 Binary files a/03_dom/uebungen/u11_tasse-01001/assets/img/newsboard_sheets.png and /dev/null differ diff --git a/03_dom/uebungen/u11_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug.gif b/03_dom/uebungen/u11_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug.gif deleted file mode 100644 index 3a9c8ad..0000000 Binary files a/03_dom/uebungen/u11_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug.gif and /dev/null differ diff --git a/03_dom/uebungen/u11_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug_grid_embed.jpg b/03_dom/uebungen/u11_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug_grid_embed.jpg deleted file mode 100644 index 4399460..0000000 Binary files a/03_dom/uebungen/u11_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug_grid_embed.jpg and /dev/null differ diff --git a/03_dom/uebungen/u11_tasse-01001/index.html b/03_dom/uebungen/u11_tasse-01001/index.html deleted file mode 100644 index d89702f..0000000 --- a/03_dom/uebungen/u11_tasse-01001/index.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - 010010000100111101010100 - - - - - - - -
    - -
    -

    - Hot Binary Heat Changing Mug - "010010000100111101010100" -

    - - Hot Binary Heat Changing Mug - -

    Description

    - -

    - Numbers make up - everything in our digital world. They flow around us, invisible like the Force or - the Matrix, controlling all our many computer-y devices. Two numbers, in particular: - 0 and 1. Off and On. Well, we can tell you this: when - there's no coffee in our cup, we're completely OFF our game. But when our mug is full of hot coffee, we're - totally ON. And now, with the Hot Binary Heat Changing Mug, there's a mug that - tells us which state our mug is in. In binary! -

    - -

    - See, the - Hot Binary Heat Changing Mug - looks like just a dark mug with binary numbers all over it. That's its OFF or cold state. Add hot coffee (or any - liquid) and a series of digits will turn white. Read them continuously from left to right, and you'll read: - 010010000100111101010100. That's in binary. Of course, - your - Hot Binary Heat Changing Mug - could just be paying you a compliment. Cheeky, mug. -

    - -

    - 010010000100111101010100 -

    - -

    Product Specifications

    - -
      -
    • Hot Binary Heat Changing Mug
    • -
    • - As you add hot liquids, the binary for "HOT" appears (read from left to right in one line, not two: - 010010000100111101010100) -
    • -
    • A ThinkGeek creation and exclusive!
    • -
    • - Care Instructions: - Hand wash only. Not microwave or dishwasher safe. -
    • -
    • Materials: Ceramic
    • -
    • Dimensions: approx. 3.15" diameter x 3.75" tall
    • -
    - -

    You wanna buy it?

    - -

    If you like to buy this brilliant mug, just do the following steps:

    - -
      -
    1. Select how many items do you want.
    2. -
    3. Press "buy".
    4. -
    - -
    - - -
    -
    - -
    (C) by ThinkGeek – Produkttext mit freundlicher Genehmigung von ThinkGeek Inc.
    - - - - diff --git a/03_dom/uebungen/u12_button-bg-color/index.html b/03_dom/uebungen/u12_button-bg-color/index.html deleted file mode 100644 index 6c1f157..0000000 --- a/03_dom/uebungen/u12_button-bg-color/index.html +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - Übung 12: Farbe Wechsel Dich - - - - - -
    -
    -

    Übung 12: Farbe Wechsel Dich

    - -
    - - - -
    -
    -
    - - - diff --git a/03_dom/uebungen/u13_range-bg-color/index.html b/03_dom/uebungen/u13_range-bg-color/index.html deleted file mode 100644 index f614e4c..0000000 --- a/03_dom/uebungen/u13_range-bg-color/index.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - Übung 13: Farbe Wechsel Dich — Teil 2 - - - - -
    -
    -

    Übung 13: Farbe Wechsel Dich — Teil 2

    - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - Aktuelle Farbe: - rgb(255, 255, 255) - #FFFFFF -
    -
    -
    -
    - - - diff --git a/03_dom/uebungen/u14_awesome-tours/assets/css/awesome-tours.css b/03_dom/uebungen/u14_awesome-tours/assets/css/awesome-tours.css deleted file mode 100644 index 285a5a0..0000000 --- a/03_dom/uebungen/u14_awesome-tours/assets/css/awesome-tours.css +++ /dev/null @@ -1,86 +0,0 @@ -.main-wrapper { - margin: 5rem auto; - width: 650px; - padding: 1rem; - border: 1px solid black; -} - -.tours-grid { - display: grid; - width: 100%; - grid-template-columns: 1fr 1fr; - grid-template-rows: 200px 200px 0.5fr; - gap: 1rem; - grid-template-areas: - 'item1 item2' - 'item1 item3' - 'item4 item4'; -} - -#fr { - grid-area: item1; -} - -#uk { - grid-area: item2; -} - -#it { - grid-area: item3; -} - -#info { - grid-area: item4; - - border: 2px solid #000077; - padding: 0.5rem; - border-radius: 10px; -} - -img { - width: 100%; - height: 100%; - border-radius: 10px; -} - -.tours { - position: relative; -} - -.m-tours #info img { - width: 30px; -} - -.flag { - font-size: 1.5rem; -} - -.french-flag::before { - content: ''; - display: inline-block; - width: 50px; - height: 30px; - background: red url('../img/fr.png') no-repeat; - background-size: cover; - margin-right: 0.5rem; -} - -.union-jack::before { - content: ''; - display: inline-block; - width: 60px; - height: 30px; - background: red url('../img/uk.png') no-repeat; - background-size: cover; - margin-right: 0.5rem; -} - -.italian-flag::before { - content: ''; - display: inline-block; - width: 60px; - height: 30px; - background: red url('../img/it.png') no-repeat; - background-size: cover; - margin-right: 0.5rem; -} diff --git a/03_dom/uebungen/u14_awesome-tours/assets/img/colosseum.jpg b/03_dom/uebungen/u14_awesome-tours/assets/img/colosseum.jpg deleted file mode 100644 index 1ed563e..0000000 Binary files a/03_dom/uebungen/u14_awesome-tours/assets/img/colosseum.jpg and /dev/null differ diff --git a/03_dom/uebungen/u14_awesome-tours/assets/img/eiffelturm.jpg b/03_dom/uebungen/u14_awesome-tours/assets/img/eiffelturm.jpg deleted file mode 100644 index 5a0f7a4..0000000 Binary files a/03_dom/uebungen/u14_awesome-tours/assets/img/eiffelturm.jpg and /dev/null differ diff --git a/03_dom/uebungen/u14_awesome-tours/assets/img/fr.png b/03_dom/uebungen/u14_awesome-tours/assets/img/fr.png deleted file mode 100644 index 01ecb01..0000000 Binary files a/03_dom/uebungen/u14_awesome-tours/assets/img/fr.png and /dev/null differ diff --git a/03_dom/uebungen/u14_awesome-tours/assets/img/fr.svg b/03_dom/uebungen/u14_awesome-tours/assets/img/fr.svg deleted file mode 100644 index 4110e59..0000000 --- a/03_dom/uebungen/u14_awesome-tours/assets/img/fr.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/03_dom/uebungen/u14_awesome-tours/assets/img/it.png b/03_dom/uebungen/u14_awesome-tours/assets/img/it.png deleted file mode 100644 index dfdd76a..0000000 Binary files a/03_dom/uebungen/u14_awesome-tours/assets/img/it.png and /dev/null differ diff --git a/03_dom/uebungen/u14_awesome-tours/assets/img/it.svg b/03_dom/uebungen/u14_awesome-tours/assets/img/it.svg deleted file mode 100644 index 20a8bfd..0000000 --- a/03_dom/uebungen/u14_awesome-tours/assets/img/it.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/03_dom/uebungen/u14_awesome-tours/assets/img/tower_bridge.jpg b/03_dom/uebungen/u14_awesome-tours/assets/img/tower_bridge.jpg deleted file mode 100644 index e81a030..0000000 Binary files a/03_dom/uebungen/u14_awesome-tours/assets/img/tower_bridge.jpg and /dev/null differ diff --git a/03_dom/uebungen/u14_awesome-tours/assets/img/uk.png b/03_dom/uebungen/u14_awesome-tours/assets/img/uk.png deleted file mode 100644 index b4555e5..0000000 Binary files a/03_dom/uebungen/u14_awesome-tours/assets/img/uk.png and /dev/null differ diff --git a/03_dom/uebungen/u14_awesome-tours/assets/img/uk.svg b/03_dom/uebungen/u14_awesome-tours/assets/img/uk.svg deleted file mode 100644 index 7991383..0000000 --- a/03_dom/uebungen/u14_awesome-tours/assets/img/uk.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/03_dom/uebungen/u14_awesome-tours/assets/js/awesome-tours-adel.js b/03_dom/uebungen/u14_awesome-tours/assets/js/awesome-tours-adel.js deleted file mode 100644 index 55d9d40..0000000 --- a/03_dom/uebungen/u14_awesome-tours/assets/js/awesome-tours-adel.js +++ /dev/null @@ -1,81 +0,0 @@ -'use strict'; - -(() => { - const $ = (qs) => document.querySelector(qs); - const $$ = (qs) => Array.from(document.querySelectorAll(qs)); - // === DOM & VARS ======= - const DOM = { - france: $('#fr'), - england: $('#uk'), - italian: $('#it'), - info: $('#info p'), - imgFrance: $('#fr').querySelector('img'), - imgEngland: $('#uk').querySelector('img'), - imgItalien: $('#it').querySelector('img'), - }; - - console.log(DOM); - // === INIT ============= - const init = () => { - DOM.info.dataset.info = DOM.info.textContent; - - //bildFrance.addEventListener('mouseenter', onMouseEnterOfFrance); - - DOM.imgFrance.addEventListener('mouseenter', onMouseEnter); - DOM.imgFrance.addEventListener('mouseleave', onMouseLeave); - - DOM.imgEngland.addEventListener('mouseenter', onMouseEnter); - DOM.imgEngland.addEventListener('mouseleave', onMouseLeave); - - DOM.imgItalien.addEventListener('mouseenter', onMouseEnter); - DOM.imgItalien.addEventListener('mouseleave', onMouseLeave); - }; - - // === EVENTHANDLER ===== - // const onMouseEnterOfFrance = (e) => { - // const img = e.currentTarget; - // DOM.info.textContent = img.dataset.description; - // // DOM.info.style.color = 'blue'; - // // DOM.info.style.backgroundColor.color = 'green'; - // }; - const onMouseEnter = (e) => { - console.log('enter'); - const img = e.currentTarget; - console.log(img); - DOM.info.textContent = img.dataset.description; - DOM.info.style.color = 'white'; - DOM.info.style.backgroundColor = 'green'; - }; - - const onMouseLeave = () => { - DOM.info.textContent = DOM.info.dataset.info; - DOM.info.style.color = 'black'; - DOM.info.style.backgroundColor = 'white'; - }; - - init(); -})(); - -// Übung 14: Awesome Tours - -// Das Reiseunternehmen Awesome Tours bietet Rundreisen zu verschiedenen Sehenswürdigkeiten in Europa an. Im Zuge eines Rebuilds der Website möchte das Unternehmen die Darstellung der Sehenswürdigkeiten ebenfalls modernisieren. Das Design inklusive HTML- und CSS-Code hat bereits eine Agentur übernommen. - -// Die Informationen zu den Sehenswürdigkeiten (Name, Beschreibung, Land usw.) sind dabei bereits im HTML-Code hinterlegt. Deine Aufgabe ist es nun, bei Mouseenter eine Darstellung wie in Abb. 28 zu ermöglichen. - -// Dazu gehört folgende Anzeige: - -// - Name der Sehenswürdigkeit -// - Beschreibung -// - Landesflagge als Bild - -// Das HTML zur Anzeige der Eiffelturm-Infos könnte beispielsweise so aussehen: - -//
    -//

    -// Italian Flag -// Colosseum -//

    -//

    -// The Colosseum or Coliseum, also known as the Flavian Amphitheatre or Colosseo, is an oval amphitheatre in... -//

    -//
    diff --git a/03_dom/uebungen/u14_awesome-tours/assets/js/awesome-tours.js b/03_dom/uebungen/u14_awesome-tours/assets/js/awesome-tours.js deleted file mode 100644 index d4c3eac..0000000 --- a/03_dom/uebungen/u14_awesome-tours/assets/js/awesome-tours.js +++ /dev/null @@ -1,67 +0,0 @@ -'use strict'; - -(() => { - // === DOM & VARS ======= - const module = document.querySelector('.m-tours'); - const DOM = { - imgEls: Array.from(module.querySelectorAll('img')), - infoBox: document.querySelector('#info'), - }; - - console.log(DOM.infoBox); - - // === INIT ============= - const init = () => { - module.dataset.info = DOM.infoBox.innerHTML.trim(); - - DOM.imgEls.forEach((el) => { - el.addEventListener('mouseenter', onMouseEnterImage); - }); - module.addEventListener('mouseleave', onMouseLeave); - }; - - // === EVENTHANDLER ===== - const onMouseEnterImage = (e) => { - const { description, countryCode, flagName } = e.currentTarget.dataset; - const title = e.currentTarget.alt; - - console.log(title); - - // DOM.infoBox.innerHTML = `${description} ${countryCode} ${alt}`; - DOM.infoBox.innerHTML = `

    ${flagName} ${title}

    ${description}

    `; - }; - - const onMouseLeave = (e) => { - DOM.infoBox.innerHTML = module.dataset.info; - }; - - // === XHR/FETCH ======== - - // === FUNCTIONS ======== - - init(); -})(); - -// Übung 14: Awesome Tours - -// Das Reiseunternehmen Awesome Tours bietet Rundreisen zu verschiedenen Sehenswürdigkeiten in Europa an. Im Zuge eines Rebuilds der Website möchte das Unternehmen die Darstellung der Sehenswürdigkeiten ebenfalls modernisieren. Das Design inklusive HTML- und CSS-Code hat bereits eine Agentur übernommen. - -// Die Informationen zu den Sehenswürdigkeiten (Name, Beschreibung, Land usw.) sind dabei bereits im HTML-Code hinterlegt. Deine Aufgabe ist es nun, bei Mouseenter eine Darstellung wie in Abb. 28 zu ermöglichen. - -// Dazu gehört folgende Anzeige: - -// - Name der Sehenswürdigkeit -// - Beschreibung -// - Landesflagge als Bild - -// Das HTML zur Anzeige der Eiffelturm-Infos könnte beispielsweise so aussehen: - -//
    -//

    -// Italian Flag -// Colosseum -//

    -//

    -// The Colosseum or Coliseum, also known as the Flavian Amphitheatre or Colosseo, is an oval amphitheatre in... -//

    -//
    diff --git a/03_dom/uebungen/u14_awesome-tours/index.html b/03_dom/uebungen/u14_awesome-tours/index.html deleted file mode 100644 index a99d29e..0000000 --- a/03_dom/uebungen/u14_awesome-tours/index.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - Übung 14: awesome tours - - - - - -
    -
    -

    Übung 14: awesome tours

    - -
    -
    - Eiffel Tower -
    - -
    - Tower Bride -
    - -
    - Colosseum -
    -
    -

    Move your mouse pointer over the images to read the descriptions here!

    -
    -
    -
    -
    - - diff --git a/03_dom/uebungen/u15_tasse-01001/assets/css/styles.css b/03_dom/uebungen/u15_tasse-01001/assets/css/styles.css deleted file mode 100644 index 6da8361..0000000 --- a/03_dom/uebungen/u15_tasse-01001/assets/css/styles.css +++ /dev/null @@ -1,369 +0,0 @@ -/* -------------------------------------------- Haupt CSS fuer alle Seiten -------------------------------------------- */ - -/* ---------------- CSS-Reset ------------------- */ -html, -body, -a, -div, -h1, -h2, -h3, -h4, -h5, -h6, -span, -p, -img, -strong, -ul, -li, -table, -th, -td, -tr { - margin: 0px; - padding: 0px; - border: 0px none; - font-weight: normal; - font-style: inherit; - font-family: inherit; - font-variant: inherit; - text-decoration: none; - table-layout: inherit; -} - -/* ---------------- Body / HTML ------------------- */ - -html { - font-size: 100%; - background-color: #fffef7; -} - -body { - font-family: Helvetica, Arial, sans-serif; - font-size: 1.2em; - font-weight: normal; - color: black; - margin: 0rem auto 2rem auto; -} - -/* ---------------- layout ------------------- */ - -header { - background: url(../img/js_header.png) left top no-repeat transparent; - background-size: cover; - height: 250px; - min-width: 850px; -} - -header:after { - content: ' '; - display: block; - height: 250px; - background: rgba(255, 254, 247, 0); - background: -moz-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -webkit-gradient( - left top, - left bottom, - color-stop(0%, rgba(255, 254, 247, 0)), - color-stop(22%, rgba(255, 254, 247, 0.55)), - color-stop(42%, rgba(255, 254, 247, 0.7)), - color-stop(43%, rgba(255, 254, 247, 0.71)), - color-stop(61%, rgba(255, 254, 247, 0.78)), - color-stop(75%, rgba(255, 254, 247, 0.92)), - color-stop(87%, rgba(255, 254, 247, 1)), - color-stop(100%, rgba(255, 254, 247, 1)) - ); - background: -webkit-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -o-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -ms-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: linear-gradient( - to bottom, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fffef7', endColorstr='#fffef7', GradientType=0 ); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fffef7', endColorstr='#fffef7', GradientType=0 ); -} - -main, -footer { - width: 70%; - margin: 3rem auto; - min-width: 850px; - padding: 0 20px; - box-sizing: border-box; -} - -/* ---------------- Content ------------------- */ - -h1 { - color: #93412b; - font-size: 3em; - margin-bottom: 20px; - font-weight: bold; -} - -h2 { - color: #93412b; - font-size: 2.5em; - margin-bottom: 15px; -} - -h3 { - color: #93412b; - font-size: 2em; - margin-bottom: 10px; -} - -p { - line-height: 15px; - margin-bottom: 15px; - line-height: 1.7em; -} - -.cited { - font-style: italic; - font-size: 0.8em; -} - -.u { - text-decoration: underline; -} -.b { - font-weight: bold; -} -.i { - font-style: italic; -} -.align_right { - text-align: right; -} -.align_left { - text-align: left; - margin-right: 10px; -} -.align_center { - text-align: center; -} -.float_left { - float: left; -} -.float_right { - float: right; -} -.clear_both { - clear: both; -} -strong { - font-weight: bold; -} -.special { - color: #b7595b; - font-weight: bold; -} -.keyword { - color: #db6f50; - font-weight: bold; - font-style: italic; -} -.gray, -.grey { - color: gray; -} - -/* Links */ -main a:link, -main a:visited { - color: #eb690b; - font-weight: bold; -} - -main a:focus, -main a:hover, -main a:active { - color: #eb690b; -} - -ul { - list-style-position: outside; - margin-bottom: 20px; - padding-left: 22px; -} - -ol { - margin-bottom: 20px; - padding-left: 30px; -} - -li { - line-height: 1.4em; -} - -/* ------- Article ------- */ - -h1 { - color: #93412b; - font-size: 2.7em; - margin-bottom: 20px; -} - -#buy_form input[type='button'] { - display: inline-block; - padding: 1px 20px 3px 20px; - background-color: #93412b; - color: white; - border: 1px solid white; - font-size: 1em; - height: 32px; -} - -#buy_form input[type='button']:hover { - background-color: white; - color: #93412b; - border: 1px solid #93412b; -} - -#buy_form select { - display: inline-block; - font-size: 1em; - background-color: white; - color: #93412b; - border: 1px solid #93412b; - height: 32px; -} - -/* ------- Chat ------- */ - -#chat { - width: 100%; - background-color: white; - border: 1px solid #9c352f; - height: 20rem; - position: relative; -} - -#chat_window { - background-color: white; - width: 85%; - float: left; - height: 95%; -} - -#chat_history { - position: absolute; - bottom: 8%; - max-height: 92%; - padding: 0px 0px 5px 7px; -} - -#chat_history p { - font-size: 0.6em; - margin: 0; -} - -#chat_text { - height: 8%; - position: absolute; - bottom: 0; - width: 85%; -} - -#chat_text input { - width: 98%; - display: block; - margin: auto; -} - -#chat_members { - list-style-type: none; - height: 100%; - width: 15%; - margin-left: 85%; - border-left: 1px solid #9c352f; - text-align: right; - box-sizing: border-box; - min-width: 100px; - font-size: 0.8em; - padding-top: 5px; -} - -#chat_members li { - line-height: 1.2em; - padding: 5px 10px 2px 15px; -} - -#chat_members .highlighted { - background-color: #c14d45; - color: white; -} -.chat_member { - font-weight: bold; -} -.chat_member1 { - color: #3626c8; -} -.chat_member2 { - color: #e38d0b; -} - -#member_search { - position: absolute; - right: 0; - bottom: 0; - width: 15%; - height: 8%; -} - -#member_search input { - width: 88%; - display: block; - margin: auto; - text-align: right; -} diff --git a/03_dom/uebungen/u15_tasse-01001/assets/img/favicon.ico b/03_dom/uebungen/u15_tasse-01001/assets/img/favicon.ico deleted file mode 100644 index bd2cd28..0000000 Binary files a/03_dom/uebungen/u15_tasse-01001/assets/img/favicon.ico and /dev/null differ diff --git a/03_dom/uebungen/u15_tasse-01001/assets/img/js_header.png b/03_dom/uebungen/u15_tasse-01001/assets/img/js_header.png deleted file mode 100644 index 4d14ceb..0000000 Binary files a/03_dom/uebungen/u15_tasse-01001/assets/img/js_header.png and /dev/null differ diff --git a/03_dom/uebungen/u15_tasse-01001/assets/img/logo.png b/03_dom/uebungen/u15_tasse-01001/assets/img/logo.png deleted file mode 100644 index bbd9fcc..0000000 Binary files a/03_dom/uebungen/u15_tasse-01001/assets/img/logo.png and /dev/null differ diff --git a/03_dom/uebungen/u15_tasse-01001/assets/img/newsboard_empty.png b/03_dom/uebungen/u15_tasse-01001/assets/img/newsboard_empty.png deleted file mode 100644 index d650b1b..0000000 Binary files a/03_dom/uebungen/u15_tasse-01001/assets/img/newsboard_empty.png and /dev/null differ diff --git a/03_dom/uebungen/u15_tasse-01001/assets/img/newsboard_paperclip.png b/03_dom/uebungen/u15_tasse-01001/assets/img/newsboard_paperclip.png deleted file mode 100644 index 7f24721..0000000 Binary files a/03_dom/uebungen/u15_tasse-01001/assets/img/newsboard_paperclip.png and /dev/null differ diff --git a/03_dom/uebungen/u15_tasse-01001/assets/img/newsboard_sheets.png b/03_dom/uebungen/u15_tasse-01001/assets/img/newsboard_sheets.png deleted file mode 100644 index 14680cb..0000000 Binary files a/03_dom/uebungen/u15_tasse-01001/assets/img/newsboard_sheets.png and /dev/null differ diff --git a/03_dom/uebungen/u15_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug.gif b/03_dom/uebungen/u15_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug.gif deleted file mode 100644 index 3a9c8ad..0000000 Binary files a/03_dom/uebungen/u15_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug.gif and /dev/null differ diff --git a/03_dom/uebungen/u15_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug_grid_embed.jpg b/03_dom/uebungen/u15_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug_grid_embed.jpg deleted file mode 100644 index 4399460..0000000 Binary files a/03_dom/uebungen/u15_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug_grid_embed.jpg and /dev/null differ diff --git a/03_dom/uebungen/u15_tasse-01001/index.html b/03_dom/uebungen/u15_tasse-01001/index.html deleted file mode 100644 index 88da7b7..0000000 --- a/03_dom/uebungen/u15_tasse-01001/index.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - 010010000100111101010100 - - - - - - - -
    - -
    -

    - Hot Binary Heat Changing Mug - "010010000100111101010100" -

    - - Hot Binary Heat Changing Mug - -

    Description

    - -

    - Numbers make up - everything in our digital world. They flow around us, invisible like the Force or - the Matrix, controlling all our many computer-y devices. Two numbers, in particular: - 0 and 1. Off and On. Well, we can tell you this: when - there's no coffee in our cup, we're completely OFF our game. But when our mug is full of hot coffee, we're - totally ON. And now, with the Hot Binary Heat Changing Mug, there's a mug that - tells us which state our mug is in. In binary! -

    - -

    - See, the - Hot Binary Heat Changing Mug - looks like just a dark mug with binary numbers all over it. That's its OFF or cold state. Add hot coffee (or any - liquid) and a series of digits will turn white. Read them continuously from left to right, and you'll read: - 010010000100111101010100. That's in binary. Of course, - your - Hot Binary Heat Changing Mug - could just be paying you a compliment. Cheeky, mug. -

    - -

    - 010010000100111101010100 -

    - -

    Product Specifications

    - -
      -
    • Hot Binary Heat Changing Mug
    • -
    • - As you add hot liquids, the binary for "HOT" appears (read from left to right in one line, not two: - 010010000100111101010100) -
    • -
    • A ThinkGeek creation and exclusive!
    • -
    • - Care Instructions: - Hand wash only. Not microwave or dishwasher safe. -
    • -
    • Materials: Ceramic
    • -
    • Dimensions: approx. 3.15" diameter x 3.75" tall
    • -
    - -

    You wanna buy it?

    - -

    If you like to buy this brilliant mug, just do the following steps:

    - -
      -
    1. Select how many items do you want.
    2. -
    3. Press "buy".
    4. -
    - -
    - - -
    -
    - -
    (C) by ThinkGeek – Produkttext mit freundlicher Genehmigung von ThinkGeek Inc.
    - - - - diff --git a/03_dom/uebungen/u16_tasse-01001/assets/css/styles.css b/03_dom/uebungen/u16_tasse-01001/assets/css/styles.css deleted file mode 100644 index 6da8361..0000000 --- a/03_dom/uebungen/u16_tasse-01001/assets/css/styles.css +++ /dev/null @@ -1,369 +0,0 @@ -/* -------------------------------------------- Haupt CSS fuer alle Seiten -------------------------------------------- */ - -/* ---------------- CSS-Reset ------------------- */ -html, -body, -a, -div, -h1, -h2, -h3, -h4, -h5, -h6, -span, -p, -img, -strong, -ul, -li, -table, -th, -td, -tr { - margin: 0px; - padding: 0px; - border: 0px none; - font-weight: normal; - font-style: inherit; - font-family: inherit; - font-variant: inherit; - text-decoration: none; - table-layout: inherit; -} - -/* ---------------- Body / HTML ------------------- */ - -html { - font-size: 100%; - background-color: #fffef7; -} - -body { - font-family: Helvetica, Arial, sans-serif; - font-size: 1.2em; - font-weight: normal; - color: black; - margin: 0rem auto 2rem auto; -} - -/* ---------------- layout ------------------- */ - -header { - background: url(../img/js_header.png) left top no-repeat transparent; - background-size: cover; - height: 250px; - min-width: 850px; -} - -header:after { - content: ' '; - display: block; - height: 250px; - background: rgba(255, 254, 247, 0); - background: -moz-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -webkit-gradient( - left top, - left bottom, - color-stop(0%, rgba(255, 254, 247, 0)), - color-stop(22%, rgba(255, 254, 247, 0.55)), - color-stop(42%, rgba(255, 254, 247, 0.7)), - color-stop(43%, rgba(255, 254, 247, 0.71)), - color-stop(61%, rgba(255, 254, 247, 0.78)), - color-stop(75%, rgba(255, 254, 247, 0.92)), - color-stop(87%, rgba(255, 254, 247, 1)), - color-stop(100%, rgba(255, 254, 247, 1)) - ); - background: -webkit-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -o-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -ms-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: linear-gradient( - to bottom, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fffef7', endColorstr='#fffef7', GradientType=0 ); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fffef7', endColorstr='#fffef7', GradientType=0 ); -} - -main, -footer { - width: 70%; - margin: 3rem auto; - min-width: 850px; - padding: 0 20px; - box-sizing: border-box; -} - -/* ---------------- Content ------------------- */ - -h1 { - color: #93412b; - font-size: 3em; - margin-bottom: 20px; - font-weight: bold; -} - -h2 { - color: #93412b; - font-size: 2.5em; - margin-bottom: 15px; -} - -h3 { - color: #93412b; - font-size: 2em; - margin-bottom: 10px; -} - -p { - line-height: 15px; - margin-bottom: 15px; - line-height: 1.7em; -} - -.cited { - font-style: italic; - font-size: 0.8em; -} - -.u { - text-decoration: underline; -} -.b { - font-weight: bold; -} -.i { - font-style: italic; -} -.align_right { - text-align: right; -} -.align_left { - text-align: left; - margin-right: 10px; -} -.align_center { - text-align: center; -} -.float_left { - float: left; -} -.float_right { - float: right; -} -.clear_both { - clear: both; -} -strong { - font-weight: bold; -} -.special { - color: #b7595b; - font-weight: bold; -} -.keyword { - color: #db6f50; - font-weight: bold; - font-style: italic; -} -.gray, -.grey { - color: gray; -} - -/* Links */ -main a:link, -main a:visited { - color: #eb690b; - font-weight: bold; -} - -main a:focus, -main a:hover, -main a:active { - color: #eb690b; -} - -ul { - list-style-position: outside; - margin-bottom: 20px; - padding-left: 22px; -} - -ol { - margin-bottom: 20px; - padding-left: 30px; -} - -li { - line-height: 1.4em; -} - -/* ------- Article ------- */ - -h1 { - color: #93412b; - font-size: 2.7em; - margin-bottom: 20px; -} - -#buy_form input[type='button'] { - display: inline-block; - padding: 1px 20px 3px 20px; - background-color: #93412b; - color: white; - border: 1px solid white; - font-size: 1em; - height: 32px; -} - -#buy_form input[type='button']:hover { - background-color: white; - color: #93412b; - border: 1px solid #93412b; -} - -#buy_form select { - display: inline-block; - font-size: 1em; - background-color: white; - color: #93412b; - border: 1px solid #93412b; - height: 32px; -} - -/* ------- Chat ------- */ - -#chat { - width: 100%; - background-color: white; - border: 1px solid #9c352f; - height: 20rem; - position: relative; -} - -#chat_window { - background-color: white; - width: 85%; - float: left; - height: 95%; -} - -#chat_history { - position: absolute; - bottom: 8%; - max-height: 92%; - padding: 0px 0px 5px 7px; -} - -#chat_history p { - font-size: 0.6em; - margin: 0; -} - -#chat_text { - height: 8%; - position: absolute; - bottom: 0; - width: 85%; -} - -#chat_text input { - width: 98%; - display: block; - margin: auto; -} - -#chat_members { - list-style-type: none; - height: 100%; - width: 15%; - margin-left: 85%; - border-left: 1px solid #9c352f; - text-align: right; - box-sizing: border-box; - min-width: 100px; - font-size: 0.8em; - padding-top: 5px; -} - -#chat_members li { - line-height: 1.2em; - padding: 5px 10px 2px 15px; -} - -#chat_members .highlighted { - background-color: #c14d45; - color: white; -} -.chat_member { - font-weight: bold; -} -.chat_member1 { - color: #3626c8; -} -.chat_member2 { - color: #e38d0b; -} - -#member_search { - position: absolute; - right: 0; - bottom: 0; - width: 15%; - height: 8%; -} - -#member_search input { - width: 88%; - display: block; - margin: auto; - text-align: right; -} diff --git a/03_dom/uebungen/u16_tasse-01001/assets/img/favicon.ico b/03_dom/uebungen/u16_tasse-01001/assets/img/favicon.ico deleted file mode 100644 index bd2cd28..0000000 Binary files a/03_dom/uebungen/u16_tasse-01001/assets/img/favicon.ico and /dev/null differ diff --git a/03_dom/uebungen/u16_tasse-01001/assets/img/js_header.png b/03_dom/uebungen/u16_tasse-01001/assets/img/js_header.png deleted file mode 100644 index 4d14ceb..0000000 Binary files a/03_dom/uebungen/u16_tasse-01001/assets/img/js_header.png and /dev/null differ diff --git a/03_dom/uebungen/u16_tasse-01001/assets/img/logo.png b/03_dom/uebungen/u16_tasse-01001/assets/img/logo.png deleted file mode 100644 index bbd9fcc..0000000 Binary files a/03_dom/uebungen/u16_tasse-01001/assets/img/logo.png and /dev/null differ diff --git a/03_dom/uebungen/u16_tasse-01001/assets/img/newsboard_empty.png b/03_dom/uebungen/u16_tasse-01001/assets/img/newsboard_empty.png deleted file mode 100644 index d650b1b..0000000 Binary files a/03_dom/uebungen/u16_tasse-01001/assets/img/newsboard_empty.png and /dev/null differ diff --git a/03_dom/uebungen/u16_tasse-01001/assets/img/newsboard_paperclip.png b/03_dom/uebungen/u16_tasse-01001/assets/img/newsboard_paperclip.png deleted file mode 100644 index 7f24721..0000000 Binary files a/03_dom/uebungen/u16_tasse-01001/assets/img/newsboard_paperclip.png and /dev/null differ diff --git a/03_dom/uebungen/u16_tasse-01001/assets/img/newsboard_sheets.png b/03_dom/uebungen/u16_tasse-01001/assets/img/newsboard_sheets.png deleted file mode 100644 index 14680cb..0000000 Binary files a/03_dom/uebungen/u16_tasse-01001/assets/img/newsboard_sheets.png and /dev/null differ diff --git a/03_dom/uebungen/u16_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug.gif b/03_dom/uebungen/u16_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug.gif deleted file mode 100644 index 3a9c8ad..0000000 Binary files a/03_dom/uebungen/u16_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug.gif and /dev/null differ diff --git a/03_dom/uebungen/u16_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug_grid_embed.jpg b/03_dom/uebungen/u16_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug_grid_embed.jpg deleted file mode 100644 index 4399460..0000000 Binary files a/03_dom/uebungen/u16_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug_grid_embed.jpg and /dev/null differ diff --git a/03_dom/uebungen/u16_tasse-01001/index.html b/03_dom/uebungen/u16_tasse-01001/index.html deleted file mode 100644 index f8aecee..0000000 --- a/03_dom/uebungen/u16_tasse-01001/index.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - 010010000100111101010100 - - - - - - - -
    - -
    -

    - Hot Binary Heat Changing Mug - "010010000100111101010100" -

    - - Hot Binary Heat Changing Mug - -

    Description

    - -

    - Numbers make up - everything in our digital world. They flow around us, invisible like the Force or - the Matrix, controlling all our many computer-y devices. Two numbers, in particular: - 0 and 1. Off and On. Well, we can tell you this: when - there's no coffee in our cup, we're completely OFF our game. But when our mug is full of hot coffee, we're - totally ON. And now, with the Hot Binary Heat Changing Mug, there's a mug that - tells us which state our mug is in. In binary! -

    - -

    - See, the - Hot Binary Heat Changing Mug - looks like just a dark mug with binary numbers all over it. That's its OFF or cold state. Add hot coffee (or any - liquid) and a series of digits will turn white. Read them continuously from left to right, and you'll read: - 010010000100111101010100. That's in binary. Of course, - your - Hot Binary Heat Changing Mug - could just be paying you a compliment. Cheeky, mug. -

    - -

    - 010010000100111101010100 -

    - -

    Product Specifications

    - -
      -
    • Hot Binary Heat Changing Mug
    • -
    • - As you add hot liquids, the binary for "HOT" appears (read from left to right in one line, not two: - 010010000100111101010100) -
    • -
    • A ThinkGeek creation and exclusive!
    • -
    • - Care Instructions: - Hand wash only. Not microwave or dishwasher safe. -
    • -
    • Materials: Ceramic
    • -
    • Dimensions: approx. 3.15" diameter x 3.75" tall
    • -
    - -

    You wanna buy it?

    - -

    If you like to buy this brilliant mug, just do the following steps:

    - -
      -
    1. Select how many items do you want.
    2. -
    3. Press "buy".
    4. -
    - -
    - - -
    -
    - -
    (C) by ThinkGeek – Produkttext mit freundlicher Genehmigung von ThinkGeek Inc.
    - - - - diff --git a/03_dom/uebungen/u17_tasse-01001/assets/css/styles.css b/03_dom/uebungen/u17_tasse-01001/assets/css/styles.css deleted file mode 100644 index 6da8361..0000000 --- a/03_dom/uebungen/u17_tasse-01001/assets/css/styles.css +++ /dev/null @@ -1,369 +0,0 @@ -/* -------------------------------------------- Haupt CSS fuer alle Seiten -------------------------------------------- */ - -/* ---------------- CSS-Reset ------------------- */ -html, -body, -a, -div, -h1, -h2, -h3, -h4, -h5, -h6, -span, -p, -img, -strong, -ul, -li, -table, -th, -td, -tr { - margin: 0px; - padding: 0px; - border: 0px none; - font-weight: normal; - font-style: inherit; - font-family: inherit; - font-variant: inherit; - text-decoration: none; - table-layout: inherit; -} - -/* ---------------- Body / HTML ------------------- */ - -html { - font-size: 100%; - background-color: #fffef7; -} - -body { - font-family: Helvetica, Arial, sans-serif; - font-size: 1.2em; - font-weight: normal; - color: black; - margin: 0rem auto 2rem auto; -} - -/* ---------------- layout ------------------- */ - -header { - background: url(../img/js_header.png) left top no-repeat transparent; - background-size: cover; - height: 250px; - min-width: 850px; -} - -header:after { - content: ' '; - display: block; - height: 250px; - background: rgba(255, 254, 247, 0); - background: -moz-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -webkit-gradient( - left top, - left bottom, - color-stop(0%, rgba(255, 254, 247, 0)), - color-stop(22%, rgba(255, 254, 247, 0.55)), - color-stop(42%, rgba(255, 254, 247, 0.7)), - color-stop(43%, rgba(255, 254, 247, 0.71)), - color-stop(61%, rgba(255, 254, 247, 0.78)), - color-stop(75%, rgba(255, 254, 247, 0.92)), - color-stop(87%, rgba(255, 254, 247, 1)), - color-stop(100%, rgba(255, 254, 247, 1)) - ); - background: -webkit-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -o-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -ms-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: linear-gradient( - to bottom, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fffef7', endColorstr='#fffef7', GradientType=0 ); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fffef7', endColorstr='#fffef7', GradientType=0 ); -} - -main, -footer { - width: 70%; - margin: 3rem auto; - min-width: 850px; - padding: 0 20px; - box-sizing: border-box; -} - -/* ---------------- Content ------------------- */ - -h1 { - color: #93412b; - font-size: 3em; - margin-bottom: 20px; - font-weight: bold; -} - -h2 { - color: #93412b; - font-size: 2.5em; - margin-bottom: 15px; -} - -h3 { - color: #93412b; - font-size: 2em; - margin-bottom: 10px; -} - -p { - line-height: 15px; - margin-bottom: 15px; - line-height: 1.7em; -} - -.cited { - font-style: italic; - font-size: 0.8em; -} - -.u { - text-decoration: underline; -} -.b { - font-weight: bold; -} -.i { - font-style: italic; -} -.align_right { - text-align: right; -} -.align_left { - text-align: left; - margin-right: 10px; -} -.align_center { - text-align: center; -} -.float_left { - float: left; -} -.float_right { - float: right; -} -.clear_both { - clear: both; -} -strong { - font-weight: bold; -} -.special { - color: #b7595b; - font-weight: bold; -} -.keyword { - color: #db6f50; - font-weight: bold; - font-style: italic; -} -.gray, -.grey { - color: gray; -} - -/* Links */ -main a:link, -main a:visited { - color: #eb690b; - font-weight: bold; -} - -main a:focus, -main a:hover, -main a:active { - color: #eb690b; -} - -ul { - list-style-position: outside; - margin-bottom: 20px; - padding-left: 22px; -} - -ol { - margin-bottom: 20px; - padding-left: 30px; -} - -li { - line-height: 1.4em; -} - -/* ------- Article ------- */ - -h1 { - color: #93412b; - font-size: 2.7em; - margin-bottom: 20px; -} - -#buy_form input[type='button'] { - display: inline-block; - padding: 1px 20px 3px 20px; - background-color: #93412b; - color: white; - border: 1px solid white; - font-size: 1em; - height: 32px; -} - -#buy_form input[type='button']:hover { - background-color: white; - color: #93412b; - border: 1px solid #93412b; -} - -#buy_form select { - display: inline-block; - font-size: 1em; - background-color: white; - color: #93412b; - border: 1px solid #93412b; - height: 32px; -} - -/* ------- Chat ------- */ - -#chat { - width: 100%; - background-color: white; - border: 1px solid #9c352f; - height: 20rem; - position: relative; -} - -#chat_window { - background-color: white; - width: 85%; - float: left; - height: 95%; -} - -#chat_history { - position: absolute; - bottom: 8%; - max-height: 92%; - padding: 0px 0px 5px 7px; -} - -#chat_history p { - font-size: 0.6em; - margin: 0; -} - -#chat_text { - height: 8%; - position: absolute; - bottom: 0; - width: 85%; -} - -#chat_text input { - width: 98%; - display: block; - margin: auto; -} - -#chat_members { - list-style-type: none; - height: 100%; - width: 15%; - margin-left: 85%; - border-left: 1px solid #9c352f; - text-align: right; - box-sizing: border-box; - min-width: 100px; - font-size: 0.8em; - padding-top: 5px; -} - -#chat_members li { - line-height: 1.2em; - padding: 5px 10px 2px 15px; -} - -#chat_members .highlighted { - background-color: #c14d45; - color: white; -} -.chat_member { - font-weight: bold; -} -.chat_member1 { - color: #3626c8; -} -.chat_member2 { - color: #e38d0b; -} - -#member_search { - position: absolute; - right: 0; - bottom: 0; - width: 15%; - height: 8%; -} - -#member_search input { - width: 88%; - display: block; - margin: auto; - text-align: right; -} diff --git a/03_dom/uebungen/u17_tasse-01001/assets/img/favicon.ico b/03_dom/uebungen/u17_tasse-01001/assets/img/favicon.ico deleted file mode 100644 index bd2cd28..0000000 Binary files a/03_dom/uebungen/u17_tasse-01001/assets/img/favicon.ico and /dev/null differ diff --git a/03_dom/uebungen/u17_tasse-01001/assets/img/js_header.png b/03_dom/uebungen/u17_tasse-01001/assets/img/js_header.png deleted file mode 100644 index 4d14ceb..0000000 Binary files a/03_dom/uebungen/u17_tasse-01001/assets/img/js_header.png and /dev/null differ diff --git a/03_dom/uebungen/u17_tasse-01001/assets/img/logo.png b/03_dom/uebungen/u17_tasse-01001/assets/img/logo.png deleted file mode 100644 index bbd9fcc..0000000 Binary files a/03_dom/uebungen/u17_tasse-01001/assets/img/logo.png and /dev/null differ diff --git a/03_dom/uebungen/u17_tasse-01001/assets/img/newsboard_empty.png b/03_dom/uebungen/u17_tasse-01001/assets/img/newsboard_empty.png deleted file mode 100644 index d650b1b..0000000 Binary files a/03_dom/uebungen/u17_tasse-01001/assets/img/newsboard_empty.png and /dev/null differ diff --git a/03_dom/uebungen/u17_tasse-01001/assets/img/newsboard_paperclip.png b/03_dom/uebungen/u17_tasse-01001/assets/img/newsboard_paperclip.png deleted file mode 100644 index 7f24721..0000000 Binary files a/03_dom/uebungen/u17_tasse-01001/assets/img/newsboard_paperclip.png and /dev/null differ diff --git a/03_dom/uebungen/u17_tasse-01001/assets/img/newsboard_sheets.png b/03_dom/uebungen/u17_tasse-01001/assets/img/newsboard_sheets.png deleted file mode 100644 index 14680cb..0000000 Binary files a/03_dom/uebungen/u17_tasse-01001/assets/img/newsboard_sheets.png and /dev/null differ diff --git a/03_dom/uebungen/u17_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug.gif b/03_dom/uebungen/u17_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug.gif deleted file mode 100644 index 3a9c8ad..0000000 Binary files a/03_dom/uebungen/u17_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug.gif and /dev/null differ diff --git a/03_dom/uebungen/u17_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug_grid_embed.jpg b/03_dom/uebungen/u17_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug_grid_embed.jpg deleted file mode 100644 index 4399460..0000000 Binary files a/03_dom/uebungen/u17_tasse-01001/assets/img/thinkgeek_2024_hot_binary_heat_change_mug_grid_embed.jpg and /dev/null differ diff --git a/03_dom/uebungen/u17_tasse-01001/index.html b/03_dom/uebungen/u17_tasse-01001/index.html deleted file mode 100644 index ee50087..0000000 --- a/03_dom/uebungen/u17_tasse-01001/index.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - 010010000100111101010100 - - - - - - - -
    - -
    -

    - Hot Binary Heat Changing Mug - "010010000100111101010100" -

    - - Hot Binary Heat Changing Mug - -

    Description

    - -

    - Numbers make up - everything in our digital world. They flow around us, invisible like the Force or - the Matrix, controlling all our many computer-y devices. Two numbers, in particular: - 0 and 1. Off and On. Well, we can tell you this: when - there's no coffee in our cup, we're completely OFF our game. But when our mug is full of hot coffee, we're - totally ON. And now, with the Hot Binary Heat Changing Mug, there's a mug that - tells us which state our mug is in. In binary! -

    - -

    - See, the - Hot Binary Heat Changing Mug - looks like just a dark mug with binary numbers all over it. That's its OFF or cold state. Add hot coffee (or any - liquid) and a series of digits will turn white. Read them continuously from left to right, and you'll read: - 010010000100111101010100. That's in binary. Of course, - your - Hot Binary Heat Changing Mug - could just be paying you a compliment. Cheeky, mug. -

    - -

    - 010010000100111101010100 -

    - -

    Product Specifications

    - -
      -
    • Hot Binary Heat Changing Mug
    • -
    • - As you add hot liquids, the binary for "HOT" appears (read from left to right in one line, not two: - 010010000100111101010100) -
    • -
    • A ThinkGeek creation and exclusive!
    • -
    • - Care Instructions: - Hand wash only. Not microwave or dishwasher safe. -
    • -
    • Materials: Ceramic
    • -
    • Dimensions: approx. 3.15" diameter x 3.75" tall
    • -
    - -

    You wanna buy it?

    - -

    If you like to buy this brilliant mug, just do the following steps:

    - -
      -
    1. Select how many items do you want.
    2. -
    3. Press "buy".
    4. -
    - -
    - - -
    -
    - -
    (C) by ThinkGeek – Produkttext mit freundlicher Genehmigung von ThinkGeek Inc.
    - - - - diff --git a/03_dom/uebungen/u18_cuteycats/README.md b/03_dom/uebungen/u18_cuteycats/README.md deleted file mode 100644 index c30fc74..0000000 --- a/03_dom/uebungen/u18_cuteycats/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Übung 18: Cuteycat - -Der Katzenfreundeverein Cuteycat hat einen Auftrag für dich. Der Verein möchte auf seiner Website einen Wettbewerb ausrichten. Die Seite zeigt eine Reihe von Katzen, aus denen ein Besucher jeweils die drei niedlichsten auswählen soll. - -1. Sobald ein Besucher auf eine der Katzen klickt, soll diese auch in der rechten Box (Cutest Cats) erscheinen. Sie darf aber aus der Liste der Katzen (Our Cats) nicht verschwinden! - -2. Achte darauf, dass sich die gleiche Katze nicht zweimal auswählen lässt. - -3. Es darf nicht mehr als drei niedlichste Katzen geben. - -4. Benutzer sollen eine Katze in der Gewinnerbox (Cutest Cats) anklicken können, um sie wieder herauszunehmen. - -**Hinweise** -Versuche die Übung ohne .innerHTML zu lösen! - -Unter der URL kannst du weitere zufällige Katzenbilder generieren. - -Die Seite produziert zufällige Katzennamen. - -Verwende `.cloneNode(true)` auf den `li`-Elementen, um das Entfernen der Katzen aus Our Cats zu verhindern. - -Registriere den Event-Handler auf den `li`-Elementen. Falls der Benutzer aber nicht direkt das `li` anklickt, sondern nur Bild oder Text (Name der Katze), so zeigt event.target auf das angeklickte Element. Mittels event.currentTarget kannst du aber immer noch auf das `li` zugreifen. `currentTarget` enthält immer das Element, auf dem der Handler tatsächlich registriert wurde. diff --git a/03_dom/uebungen/u18_cuteycats/assets/css/main.css b/03_dom/uebungen/u18_cuteycats/assets/css/main.css deleted file mode 100644 index 7d4d64b..0000000 --- a/03_dom/uebungen/u18_cuteycats/assets/css/main.css +++ /dev/null @@ -1,76 +0,0 @@ -@charset "UTF-8"; -/* Color Theme Swatches in Hex */ -/* Color Theme Swatches in RGBA */ -*, -html { - box-sizing: border-box; -} - -html, -body { - height: 100%; - background-color: #f7eedf; -} - -.m-cutey-cat h2 { - color: #7aa67a; -} -.m-cutey-cat .box-cat-selection { - position: fixed; -} -.m-cutey-cat ul.list { - margin: 0; - padding: 0; - list-style: none; - font-family: Georgia, "Times New Roman", Times, serif; - font-size: 2rem; -} -.m-cutey-cat ul.list li { - min-width: 400px; - background-color: #feaea5; - margin: 0 0 10px; - user-select: none; - border-radius: 16px; - overflow: hidden; - box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.1); - transition: all 0.4s cubic-bezier(0.52, 0.02, 0.43, 1.39); -} -.m-cutey-cat ul.list li:not(.selected):hover { - background-color: #fd8173; - box-shadow: 0 0 0 rgba(0, 0, 0, 0.1); - transform: scale(1.1); -} -.m-cutey-cat ul.list li:not(.selected):hover img { - border-width: 0; -} -.m-cutey-cat ul.list li img { - width: 120px; - border: 10px solid rgba(255, 255, 255, 0.6); - transition: all 0.4s; -} -.m-cutey-cat ul.list li span { - color: white; - padding: 0 1rem; - letter-spacing: 2px; -} -.m-cutey-cat ul.list.list-cat-vote li.selected { - background-color: #ffdbd7; - opacity: 0.5; -} -.m-cutey-cat ul.list.list-cat-selection li { - background-color: #b7cfb7; -} -.m-cutey-cat ul.list.list-cat-selection li:hover { - background-color: #98bb98; -} -.m-cutey-cat ul.list.list-cat-selection li:hover::after { - position: absolute; - top: 30px; - right: 1.5rem; - content: ""; - font-family: "Font Awesome 5 Free"; - font-weight: 900; - color: white; -} - -/*# sourceMappingURL=main.css.map */ diff --git a/03_dom/uebungen/u18_cuteycats/assets/css/main.css.map b/03_dom/uebungen/u18_cuteycats/assets/css/main.css.map deleted file mode 100644 index 9cf6e3d..0000000 --- a/03_dom/uebungen/u18_cuteycats/assets/css/main.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sourceRoot":"","sources":["../scss/main.scss"],"names":[],"mappings":";AAEA;AAOA;AAWA;AAAA;EAEE;;;AAGF;AAAA;EAEE;EACA,kBAzBa;;;AA+Bb;EACE;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA,kBA7CS;EA8CT;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAMA;EACE;EACA;;AAMJ;EACE,kBAxFO;;AAyFP;EACE;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA","file":"main.css"} \ No newline at end of file diff --git a/03_dom/uebungen/u18_cuteycats/assets/img/kittens/1.jpg b/03_dom/uebungen/u18_cuteycats/assets/img/kittens/1.jpg deleted file mode 100644 index de9ac3e..0000000 Binary files a/03_dom/uebungen/u18_cuteycats/assets/img/kittens/1.jpg and /dev/null differ diff --git a/03_dom/uebungen/u18_cuteycats/assets/img/kittens/10.jpg b/03_dom/uebungen/u18_cuteycats/assets/img/kittens/10.jpg deleted file mode 100644 index 705e1b4..0000000 Binary files a/03_dom/uebungen/u18_cuteycats/assets/img/kittens/10.jpg and /dev/null differ diff --git a/03_dom/uebungen/u18_cuteycats/assets/img/kittens/11.jpg b/03_dom/uebungen/u18_cuteycats/assets/img/kittens/11.jpg deleted file mode 100644 index 46149b4..0000000 Binary files a/03_dom/uebungen/u18_cuteycats/assets/img/kittens/11.jpg and /dev/null differ diff --git a/03_dom/uebungen/u18_cuteycats/assets/img/kittens/12.jpg b/03_dom/uebungen/u18_cuteycats/assets/img/kittens/12.jpg deleted file mode 100644 index f2549ce..0000000 Binary files a/03_dom/uebungen/u18_cuteycats/assets/img/kittens/12.jpg and /dev/null differ diff --git a/03_dom/uebungen/u18_cuteycats/assets/img/kittens/13.jpg b/03_dom/uebungen/u18_cuteycats/assets/img/kittens/13.jpg deleted file mode 100644 index f40d24c..0000000 Binary files a/03_dom/uebungen/u18_cuteycats/assets/img/kittens/13.jpg and /dev/null differ diff --git a/03_dom/uebungen/u18_cuteycats/assets/img/kittens/14.jpg b/03_dom/uebungen/u18_cuteycats/assets/img/kittens/14.jpg deleted file mode 100644 index 7fee98b..0000000 Binary files a/03_dom/uebungen/u18_cuteycats/assets/img/kittens/14.jpg and /dev/null differ diff --git a/03_dom/uebungen/u18_cuteycats/assets/img/kittens/15.jpg b/03_dom/uebungen/u18_cuteycats/assets/img/kittens/15.jpg deleted file mode 100644 index 72c7126..0000000 Binary files a/03_dom/uebungen/u18_cuteycats/assets/img/kittens/15.jpg and /dev/null differ diff --git a/03_dom/uebungen/u18_cuteycats/assets/img/kittens/2.jpg b/03_dom/uebungen/u18_cuteycats/assets/img/kittens/2.jpg deleted file mode 100644 index 9c03bd1..0000000 Binary files a/03_dom/uebungen/u18_cuteycats/assets/img/kittens/2.jpg and /dev/null differ diff --git a/03_dom/uebungen/u18_cuteycats/assets/img/kittens/3.jpg b/03_dom/uebungen/u18_cuteycats/assets/img/kittens/3.jpg deleted file mode 100644 index b8406b3..0000000 Binary files a/03_dom/uebungen/u18_cuteycats/assets/img/kittens/3.jpg and /dev/null differ diff --git a/03_dom/uebungen/u18_cuteycats/assets/img/kittens/4.jpg b/03_dom/uebungen/u18_cuteycats/assets/img/kittens/4.jpg deleted file mode 100644 index a62c936..0000000 Binary files a/03_dom/uebungen/u18_cuteycats/assets/img/kittens/4.jpg and /dev/null differ diff --git a/03_dom/uebungen/u18_cuteycats/assets/img/kittens/5.jpg b/03_dom/uebungen/u18_cuteycats/assets/img/kittens/5.jpg deleted file mode 100644 index 8b14bbd..0000000 Binary files a/03_dom/uebungen/u18_cuteycats/assets/img/kittens/5.jpg and /dev/null differ diff --git a/03_dom/uebungen/u18_cuteycats/assets/img/kittens/6.jpg b/03_dom/uebungen/u18_cuteycats/assets/img/kittens/6.jpg deleted file mode 100644 index da0806a..0000000 Binary files a/03_dom/uebungen/u18_cuteycats/assets/img/kittens/6.jpg and /dev/null differ diff --git a/03_dom/uebungen/u18_cuteycats/assets/img/kittens/7.jpg b/03_dom/uebungen/u18_cuteycats/assets/img/kittens/7.jpg deleted file mode 100644 index 1fa7768..0000000 Binary files a/03_dom/uebungen/u18_cuteycats/assets/img/kittens/7.jpg and /dev/null differ diff --git a/03_dom/uebungen/u18_cuteycats/assets/img/kittens/8.jpg b/03_dom/uebungen/u18_cuteycats/assets/img/kittens/8.jpg deleted file mode 100644 index cb364f4..0000000 Binary files a/03_dom/uebungen/u18_cuteycats/assets/img/kittens/8.jpg and /dev/null differ diff --git a/03_dom/uebungen/u18_cuteycats/assets/img/kittens/9.jpg b/03_dom/uebungen/u18_cuteycats/assets/img/kittens/9.jpg deleted file mode 100644 index 62291b8..0000000 Binary files a/03_dom/uebungen/u18_cuteycats/assets/img/kittens/9.jpg and /dev/null differ diff --git a/03_dom/uebungen/u18_cuteycats/assets/js/libs/helpers.js b/03_dom/uebungen/u18_cuteycats/assets/js/libs/helpers.js deleted file mode 100644 index 8e5ed8d..0000000 --- a/03_dom/uebungen/u18_cuteycats/assets/js/libs/helpers.js +++ /dev/null @@ -1,17 +0,0 @@ -const $ = (qs) => document.querySelector(qs); -const $$ = (qs) => Array.from(document.querySelectorAll(qs)); - -const $on = (el, ev, fn) => { - Array.isArray(el) ? el.forEach((ae) => $on(ae, ev, fn)) : el.addEventListener(ev, fn); - return el; -}; - -Node.prototype.on = function (name, fn) { - this.addEventListener(name, fn); - return this; -}; - -Array.prototype.on = Array.prototype.addEventListener = function (name, fn) { - this.forEach((elem) => elem.addEventListener(name, fn)); - return this; -}; diff --git a/03_dom/uebungen/u18_cuteycats/assets/js/libs/jquery-3.6.0.min.js b/03_dom/uebungen/u18_cuteycats/assets/js/libs/jquery-3.6.0.min.js deleted file mode 100644 index c4c6022..0000000 --- a/03_dom/uebungen/u18_cuteycats/assets/js/libs/jquery-3.6.0.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 { - // === DOM & VARS ======= - const module = document.querySelector('.m-cutey-cat') || console.error('Element: ".m-cutey-cat" not found'); - - if (!module) return; - - const DOM = { - listItemsCatVote: Array.from(module.querySelectorAll('.list-cat-vote li')), - listCatSelection: module.querySelector('.list-cat-selection'), - }; - - // console.log(module); - // console.log('listItemsCatVote: ', DOM.listItemsCatVote); - // console.log('listCatSelection', DOM.listCatSelection); - - // === INIT ============= - const init = () => { - // Eventhandler für die vorhandenen Katzen - DOM.listItemsCatVote.forEach((el) => { - el.addEventListener('click', onClickCatVoteAdd); - }); - }; - - // === EVENTHANDLER ===== - const onClickCatVoteAdd = (e) => { - const selCat = e.currentTarget.cloneNode(true); - const altSelCat = selCat.querySelector('img').alt; - - //console.log(DOM.listCatSelection.childElementCount); - // Guard - if (isCastInSelection(altSelCat) || DOM.listCatSelection.childElementCount === 3) return; - - // if (!isCastInSelection(altSelCat) && DOM.listCatSelection.childElementCount < 3) { - selCat.addEventListener('click', onClickCatSelRemove); - DOM.listCatSelection.appendChild(selCat); - // } - }; - - const onClickCatSelRemove = (e) => { - e.currentTarget.remove(); - }; - - // === XHR/FETCH ======== - - // === FUNCTIONS ======== - const isCastInSelection = (alt) => { - const votedCats = Array.from(DOM.listCatSelection.querySelectorAll('li img')); - - return votedCats.some((el) => alt === el.alt); - }; - - init(); -})(); - -// Übung 18: Cuteycat - -// Der Katzenfreundeverein Cuteycat hat einen Auftrag für dich. Der Verein möchte auf seiner Website einen Wettbewerb ausrichten. Die Seite zeigt eine Reihe von Katzen, aus denen ein Besucher jeweils die drei niedlichsten auswählen soll. - -// 1. Sobald ein Besucher auf eine der Katzen klickt, soll diese auch in der rechten Box (Cutest Cats) erscheinen. Sie darf aber aus der Liste der Katzen (Our Cats) nicht verschwinden! - -// 2. Achte darauf, dass sich die gleiche Katze nicht zweimal auswählen lässt. - -// 3. Es darf nicht mehr als drei niedlichste Katzen geben. - -// 4. Benutzer sollen eine Katze in der Gewinnerbox (Cutest Cats) anklicken können, um sie wieder herauszunehmen. - -// Hinweise -// Versuche die Übung ohne .innerHTML zu lösen! - -// Unter der URL http://loremflickr.com/150/150/cute,kitten/all kannst du weitere zufällige Katzenbilder generieren. - -// Die Seite http://fantasynamegenerators.com/cat-names.php produziert zufällige Katzennamen. - -// Verwende .cloneNode(true) auf den li-Elementen, um das Entfernen der Katzen aus Our Cats zu verhindern. - -// Registriere den Event-Handler auf den li-Elementen. Falls der Benutzer aber nicht direkt das li anklickt, sondern nur Bild oder Text (Name der Katze), so zeigt event.target auf das angeklickte Element. Mittels event.currentTarget kannst du aber immer noch auf das li zugreifen. currentTarget enthält immer das Element, auf dem der Handler tatsächlich registriert wurde. diff --git a/03_dom/uebungen/u18_cuteycats/assets/scss/main.scss b/03_dom/uebungen/u18_cuteycats/assets/scss/main.scss deleted file mode 100644 index c3fa484..0000000 --- a/03_dom/uebungen/u18_cuteycats/assets/scss/main.scss +++ /dev/null @@ -1,103 +0,0 @@ -// sass assets/scss/main.scss:assets/css/main.css --style=expanded --watch - -/* Color Theme Swatches in Hex */ -$color-theme1: #f7eedf; -$color-theme2: #b7cfb7; -$color-theme3: #ffcdb6; -$color-theme4: #feaea5; -$color-theme5: #ffc7a2; - -$primary-color: #efefef; - -// Allgemeine Formatierung ================================= - -*, -html { - box-sizing: border-box; -} - -html, -body { - height: 100%; - background-color: $color-theme1; -} - -// Module cutey cat ====================== - -.m-cutey-cat { - h2 { - color: darken($color-theme2, 20); - } - - .box-cat-selection { - position: fixed; - } - - ul.list { - margin: 0; - padding: 0; - list-style: none; - font-family: Georgia, 'Times New Roman', Times, serif; - font-size: 2rem; - - li { - min-width: 400px; - background-color: $color-theme4; - margin: 0 0 10px; - user-select: none; - border-radius: 16px; - overflow: hidden; - box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.1); - transition: all 0.4s cubic-bezier(0.52, 0.02, 0.43, 1.39); - &:not(.selected):hover { - background-color: darken($color-theme4, 10); - box-shadow: 0 0 0 rgba(0, 0, 0, 0.1); - transform: scale(1.1); - - img { - border-width: 0; - } - } - - img { - width: 120px; - border: 10px solid rgba(white, 0.6); - transition: all 0.4s; - } - - span { - color: white; - padding: 0 1rem; - letter-spacing: 2px; - } - } - - &.list-cat-vote { - li { - &.selected { - background-color: lighten($color-theme4, 10); - opacity: 0.5; - } - } - } - - &.list-cat-selection { - li { - background-color: $color-theme2; - &:hover { - background-color: darken($color-theme2, 10); - - &::after { - position: absolute; - top: 30px; - right: 1.5rem; - content: '\f1f8'; - font-family: 'Font Awesome 5 Free'; - font-weight: 900; - color: white; - } - } - } - } - } -} diff --git a/03_dom/uebungen/u18_cuteycats/index.html b/03_dom/uebungen/u18_cuteycats/index.html deleted file mode 100644 index 1ff6a02..0000000 --- a/03_dom/uebungen/u18_cuteycats/index.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - Cutey Cats - - - - - - - - -
    -
    -

    Cutey Cats

    -
    - -
    -
    -
    -
    -
    -
    -

    Our Cats

    -
      -
    • cat 1Chance
    • -
    • cat 2MeowMix
    • -
    • cat 3Stripes
    • -
    • cat 4Schrodinger
    • -
    • cat 5Waffles
    • -
    • cat 6Tazmina
    • -
    • cat 7Wiggle
    • -
    • cat 8Gin
    • -
    • cat 9Paws
    • -
    • cat 10Marshmallow
    • -
    • cat 11Caesar
    • -
    • cat 12Trogdor
    • -
    • cat 13Sourpuss
    • -
    • cat 14Stitch
    • -
    • cat 15Sunshine
    • -
    -
    -
    - -
    -
    -

    Cutest Cats

    -
      -
      -
      -
      -
      -
      -
      -
      - - diff --git a/03_dom/uebungen/uebungen-1-5.zip b/03_dom/uebungen/uebungen-1-5.zip deleted file mode 100644 index aed49cc..0000000 Binary files a/03_dom/uebungen/uebungen-1-5.zip and /dev/null differ diff --git a/03_dom/uebungen/uebungen-11-14.zip b/03_dom/uebungen/uebungen-11-14.zip deleted file mode 100644 index fe6f4c7..0000000 Binary files a/03_dom/uebungen/uebungen-11-14.zip and /dev/null differ diff --git a/03_dom/uebungen/uebungen-15-17.zip b/03_dom/uebungen/uebungen-15-17.zip deleted file mode 100644 index ce3d980..0000000 Binary files a/03_dom/uebungen/uebungen-15-17.zip and /dev/null differ diff --git a/03_dom/uebungen/uebungen-17-18.zip b/03_dom/uebungen/uebungen-17-18.zip deleted file mode 100644 index 349d32c..0000000 Binary files a/03_dom/uebungen/uebungen-17-18.zip and /dev/null differ diff --git a/03_dom/uebungen/uebungen-18_cuteycats.zip b/03_dom/uebungen/uebungen-18_cuteycats.zip deleted file mode 100644 index 1c1b015..0000000 Binary files a/03_dom/uebungen/uebungen-18_cuteycats.zip and /dev/null differ diff --git a/03_dom/uebungen/uebungen-6-7.zip b/03_dom/uebungen/uebungen-6-7.zip deleted file mode 100644 index d5bd32f..0000000 Binary files a/03_dom/uebungen/uebungen-6-7.zip and /dev/null differ diff --git a/03_dom/uebungen/uebungen-8-10.zip b/03_dom/uebungen/uebungen-8-10.zip deleted file mode 100644 index 04046be..0000000 Binary files a/03_dom/uebungen/uebungen-8-10.zip and /dev/null differ diff --git a/03_dom/unterricht/tag21/01_vorwort/vorwort.md b/03_dom/unterricht/tag21/01_vorwort/vorwort.md deleted file mode 100644 index fabe20a..0000000 --- a/03_dom/unterricht/tag21/01_vorwort/vorwort.md +++ /dev/null @@ -1,22 +0,0 @@ -| Bezeichnung | Abkürzung | -| ----------- | ------------------------------------- | -| DOM | Document Object Model | -| API | Application Programming Interface | -| ROCA | Resource-Oriented Client Architecture | -| SEO |  Search Engine Optimization | -| SEA | Search Engine Advertising | -| Vanilla JS | reines JavaScript ohne Framework | - -## Links: Warum kein jQuery mehr? - -- -- -- -- - -## Links: Warum jQuery yeah! - -- -- -- -- diff --git a/03_dom/unterricht/tag21/02_document-query-selector/index.html b/03_dom/unterricht/tag21/02_document-query-selector/index.html deleted file mode 100644 index 8a7f2b4..0000000 --- a/03_dom/unterricht/tag21/02_document-query-selector/index.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - document.querySelector() - Hello World - - - -
      -
      -

      document.querySelector() - Hello World

      -
      -
      - - - diff --git a/03_dom/unterricht/tag21/03_css-selektoren/index.html b/03_dom/unterricht/tag21/03_css-selektoren/index.html deleted file mode 100644 index cd08ca3..0000000 --- a/03_dom/unterricht/tag21/03_css-selektoren/index.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - CSS Selektoren - - - - - -
      -
      -

      CSS Selektoren

      -

      - Lorem ipsum dolor sit amet consectetur adipisicing elit. Debitis iusto ea id quos dolor accusantium ipsum at - natus quidem commodi dolorem aspernatur a porro, vitae cumque. Soluta temporibus quis facilis? -

      -
      Box
      - - image -
      -
      - - - diff --git a/03_dom/unterricht/tag21/04_document-query-selector-all/index.html b/03_dom/unterricht/tag21/04_document-query-selector-all/index.html deleted file mode 100644 index 41226c9..0000000 --- a/03_dom/unterricht/tag21/04_document-query-selector-all/index.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - document.querySelectorAll() - - - -
      -
      -

      document.querySelectorAll()

      -
      -

      Quod eligendi saepe voluptates eveniet.

      -

      Architecto reiciendis magnam modi inventore.

      -

      Modi ipsum, velit rem ipsam.

      -

      Provident, officia quisquam aliquam deserunt!

      -
      -
      - - - diff --git a/03_dom/unterricht/tag21/05_css-attribut-selektoren/index.html b/03_dom/unterricht/tag21/05_css-attribut-selektoren/index.html deleted file mode 100644 index e857853..0000000 --- a/03_dom/unterricht/tag21/05_css-attribut-selektoren/index.html +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - CSS Attribut Selektor - - - - -
      -
      -

      CSS Attribut Selektor

      -
      - - - -

      Bilder

      -

      Erstellte Bilder über Dummyimage.com

      -
        -
      • -
      • -
      • -
      • -
      -

      - Lorem, ipsum dolor sit amet consectetur Zur GFN Webseite adipisicing elit. - Veniam quisquam quidem ut eos dolorem corrupti aut Link sed rerum voluptate dolore quod unde - explicabo architecto numquam eaque in, qui possimus voluptatem? -

      -
      -
      - - - diff --git a/03_dom/unterricht/tag21/06_css-combinator-selektoren/index.html b/03_dom/unterricht/tag21/06_css-combinator-selektoren/index.html deleted file mode 100644 index 2650cfe..0000000 --- a/03_dom/unterricht/tag21/06_css-combinator-selektoren/index.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - CSS Kombinator Selektor - - - - -
      -
      -

      CSS Kombinator Selektor

      -
      - - - -

      Bilder

      -

      Erstellte Bilder über Dummyimage.com

      -
        -
      • -
      • -
      • -
      • -
      -

      - Lorem, ipsum dolor sit amet consectetur Zur GFN Webseite adipisicing elit. - Veniam quisquam quidem ut eos dolorem corrupti aut Link sed rerum voluptate dolore quod unde - explicabo architecto numquam eaque in, qui possimus voluptatem? -

      -
      -
      - - - diff --git a/03_dom/unterricht/tag21/07_css-pseudoklassen/index.html b/03_dom/unterricht/tag21/07_css-pseudoklassen/index.html deleted file mode 100644 index 849dd07..0000000 --- a/03_dom/unterricht/tag21/07_css-pseudoklassen/index.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - - CSS Selektor - Pseudoklassen - - - - - -
      -
      -

      CSS Selektor - Pseudoklassen

      -
      -

      - Eine - Pseudoklasse - in CSS ist ein Schlüsselbegriff, welcher hinter einen Selektor gestellt wird, um einen besonderen Zustand - abzufragen. So steht beispielsweise :hover für Elemente, die gerade mit dem Mauszeiger berührt - werden. -

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      NameBeschreibung
      :nth-child - Die Pseudo-Klasse spricht das x-te Kind-Element an — im Beispiel das fünfte Element innerhalb von ul, - falls es vom Tag-Typ li ist. -
      :first-childDie Pseudo-Klasse selektiert das erste Kind-Element, sofern es vom richtigen Tag-Typ ist..
      :last-child - Äquivalent zu :first-child selektieren Sie hier das letzte Kind-Element, sofern es vom richtigen Tag-Typ - ist. -
      :empty - Mit dieser Pseudo-Klasse sprechen Sie nur Elemente an, die ohne Kind-Elemente sind. Inhalt in Form von - Text wird dabei ebenfalls als Kind-Element betrachtet. -
      :not(selector) - Negation. Wählt Elemente aus, wenn sie nicht dem in Klammern angegebenen Selektor entsprechen. Im - Beispiel würde alles außer span-Elementen ausgewählt. -
      :only-child - Diese Klasse selektiert ein Element nur, wenn es sich um das einzige Kind eines angegebenen - Eltern-Elementes handelt. -
      :checkedDiese Klasse selektiert eine Checkbox oder ein Radio-button nur, wenn es ausgewählt wurde.
      - -
      - - -
      -
      -
      - - - diff --git a/03_dom/unterricht/tag21/08_document-vs-element-selektion/index.html b/03_dom/unterricht/tag21/08_document-vs-element-selektion/index.html deleted file mode 100644 index 4e3cbf0..0000000 --- a/03_dom/unterricht/tag21/08_document-vs-element-selektion/index.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - document.querySelector() vs. element.querySelector() - - - -
      -
      -

      document.querySelector() vs. element.querySelector()

      -
      -
        -
      • 1
      • -
      • 2
      • -
      -
        -
      • 3
      • -
      • 4
      • -
      -
      -
      - - - diff --git a/03_dom/unterricht/tag21/09_$-$$-helper/index.html b/03_dom/unterricht/tag21/09_$-$$-helper/index.html deleted file mode 100644 index 508d14b..0000000 --- a/03_dom/unterricht/tag21/09_$-$$-helper/index.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - Helferfunktion $ und $$ - - - - -
      -
      -

      Helferfunktion $ und $$

      -
      -

      Lorem ipsum dolor sit amet.

      -

      Quod eligendi saepe voluptates eveniet.

      -

      Architecto reiciendis magnam modi inventore.

      -

      Modi ipsum, velit rem ipsam.

      -

      Provident, officia quisquam aliquam deserunt!

      -
      -
      - - - diff --git a/03_dom/unterricht/tag22/01_dom-selection/index.html b/03_dom/unterricht/tag22/01_dom-selection/index.html deleted file mode 100644 index a09950a..0000000 --- a/03_dom/unterricht/tag22/01_dom-selection/index.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - DOM Selection - - - -
      -
      -

      DOM Selection

      -
      - -
        -
      • Listenpunkt 01
      • -
      • Listenpunkt 02
      • -
      • Listenpunkt 03
      • -
      • Listenpunkt 04
      • -
      -
      -
      - - - diff --git a/03_dom/unterricht/tag22/02_class-list-chat/assets/css/styles.css b/03_dom/unterricht/tag22/02_class-list-chat/assets/css/styles.css deleted file mode 100644 index d904e6a..0000000 --- a/03_dom/unterricht/tag22/02_class-list-chat/assets/css/styles.css +++ /dev/null @@ -1,368 +0,0 @@ -/* -------------------------------------------- Haupt CSS fuer alle Seiten -------------------------------------------- */ - -/* ---------------- CSS-Reset ------------------- */ -html, -body, -a, -div, -h1, -h2, -h3, -h4, -h5, -h6, -span, -p, -img, -strong, -ul, -li, -table, -th, -td, -tr { - margin: 0px; - padding: 0px; - border: 0px none; - font-weight: normal; - font-style: inherit; - font-family: inherit; - font-variant: inherit; - text-decoration: none; - table-layout: inherit; -} - -/* ---------------- Body / HTML ------------------- */ - -html { - font-size: 100%; - background-color: #fffef7; -} - -body { - font-family: Helvetica, Arial, sans-serif; - font-size: 1.2em; - font-weight: normal; - color: black; - margin: 0rem auto 2rem auto; -} - -/* ---------------- layout ------------------- */ - -header { - background: url(../img/js_header.png) left top no-repeat transparent; - background-size: cover; - height: 250px; - min-width: 850px; -} - -header:after { - content: ' '; - display: block; - height: 250px; - background: rgba(255, 254, 247, 0); - background: -moz-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -webkit-gradient( - left top, - left bottom, - color-stop(0%, rgba(255, 254, 247, 0)), - color-stop(22%, rgba(255, 254, 247, 0.55)), - color-stop(42%, rgba(255, 254, 247, 0.7)), - color-stop(43%, rgba(255, 254, 247, 0.71)), - color-stop(61%, rgba(255, 254, 247, 0.78)), - color-stop(75%, rgba(255, 254, 247, 0.92)), - color-stop(87%, rgba(255, 254, 247, 1)), - color-stop(100%, rgba(255, 254, 247, 1)) - ); - background: -webkit-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -o-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -ms-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: linear-gradient( - to bottom, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fffef7', endColorstr='#fffef7', GradientType=0 ); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fffef7', endColorstr='#fffef7', GradientType=0 ); -} - -main, -footer { - width: 70%; - margin: 3rem auto; - min-width: 850px; - padding: 0 20px; - box-sizing: border-box; -} - -/* ---------------- Content ------------------- */ - -h1 { - color: #93412b; - font-size: 3em; - margin-bottom: 20px; - font-weight: bold; -} - -h2 { - color: #93412b; - font-size: 2.5em; - margin-bottom: 15px; -} - -h3 { - color: #93412b; - font-size: 2em; - margin-bottom: 10px; -} - -p { - line-height: 15px; - margin-bottom: 15px; - line-height: 1.7em; -} - -.cited { - font-style: italic; - font-size: 0.8em; -} - -.u { - text-decoration: underline; -} -.b { - font-weight: bold; -} -.i { - font-style: italic; -} -.align_right { - text-align: right; -} -.align_left { - text-align: left; - margin-right: 10px; -} -.align_center { - text-align: center; -} -.float_left { - float: left; -} -.float_right { - float: right; -} -.clear_both { - clear: both; -} -strong { - font-weight: bold; -} -.special { - color: #b7595b; - font-weight: bold; -} -.keyword { - color: #db6f50; - font-weight: bold; - font-style: italic; -} -.gray { - color: gray; -} - -/* Links */ -main a:link, -main a:visited { - color: #eb690b; - font-weight: bold; -} - -main a:focus, -main a:hover, -main a:active { - color: #eb690b; -} - -ul { - list-style-position: outside; - margin-bottom: 20px; - padding-left: 22px; -} - -ol { - margin-bottom: 20px; - padding-left: 30px; -} - -li { - line-height: 1.4em; -} - -/* ------- Article ------- */ - -h1 { - color: #93412b; - font-size: 2.7em; - margin-bottom: 20px; -} - -#buy_form input[type='button'] { - display: inline-block; - padding: 1px 20px 3px 20px; - background-color: #93412b; - color: white; - border: 1px solid white; - font-size: 1em; - height: 32px; -} - -#buy_form input[type='button']:hover { - background-color: white; - color: #93412b; - border: 1px solid #93412b; -} - -#buy_form select { - display: inline-block; - font-size: 1em; - background-color: white; - color: #93412b; - border: 1px solid #93412b; - height: 32px; -} - -/* ------- Chat ------- */ - -#chat { - width: 100%; - background-color: white; - border: 1px solid #9c352f; - height: 20rem; - position: relative; -} - -#chat_window { - background-color: white; - width: 85%; - float: left; - height: 95%; -} - -#chat_history { - position: absolute; - bottom: 8%; - max-height: 92%; - padding: 0px 0px 5px 7px; -} - -#chat_history p { - font-size: 0.6em; - margin: 0; -} - -#chat_text { - height: 8%; - position: absolute; - bottom: 0; - width: 85%; -} - -#chat_text input { - width: 98%; - display: block; - margin: auto; -} - -#chat_members { - list-style-type: none; - height: 100%; - width: 15%; - margin-left: 85%; - border-left: 1px solid #9c352f; - text-align: right; - box-sizing: border-box; - min-width: 100px; - font-size: 0.8em; - padding-top: 5px; -} - -#chat_members li { - line-height: 1.2em; - padding: 5px 10px 2px 15px; -} - -#chat_members .highlighted { - background-color: #c14d45; - color: white; -} -.chat_member { - font-weight: bold; -} -.chat_member1 { - color: #3626c8; -} -.chat_member2 { - color: #e38d0b; -} - -#member_search { - position: absolute; - right: 0; - bottom: 0; - width: 15%; - height: 8%; -} - -#member_search input { - width: 88%; - display: block; - margin: auto; - text-align: right; -} diff --git a/03_dom/unterricht/tag22/02_class-list-chat/assets/img/favicon.icon b/03_dom/unterricht/tag22/02_class-list-chat/assets/img/favicon.icon deleted file mode 100644 index bd2cd28..0000000 Binary files a/03_dom/unterricht/tag22/02_class-list-chat/assets/img/favicon.icon and /dev/null differ diff --git a/03_dom/unterricht/tag22/02_class-list-chat/assets/img/js_header.png b/03_dom/unterricht/tag22/02_class-list-chat/assets/img/js_header.png deleted file mode 100644 index 4d14ceb..0000000 Binary files a/03_dom/unterricht/tag22/02_class-list-chat/assets/img/js_header.png and /dev/null differ diff --git a/03_dom/unterricht/tag22/02_class-list-chat/index.html b/03_dom/unterricht/tag22/02_class-list-chat/index.html deleted file mode 100644 index a51cad3..0000000 --- a/03_dom/unterricht/tag22/02_class-list-chat/index.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - classList - DOMTokenList - - - - - -
      -
      -

      classList - DOMTokenList

      -
      -

      The Chat

      -
      -
      -
      -

      - Ladislaus: - Anybody there? -

      -

      - Friedlinde - Yes, me! -

      -
      - -
      - -
      -
      - -
        -
      • Heribert
      • -
      • Friedlinde
      • -
      • Tusnelda
      • -
      • Berthold
      • -
      • Oswine
      • -
      • Ladislaus
      • -
      - - -
      -
      -
      - - - diff --git a/03_dom/unterricht/tag22/03_js-auslagern-defer/assets/img/defer_async.png b/03_dom/unterricht/tag22/03_js-auslagern-defer/assets/img/defer_async.png deleted file mode 100644 index d7bf779..0000000 Binary files a/03_dom/unterricht/tag22/03_js-auslagern-defer/assets/img/defer_async.png and /dev/null differ diff --git a/03_dom/unterricht/tag22/03_js-auslagern-defer/assets/js/main.js b/03_dom/unterricht/tag22/03_js-auslagern-defer/assets/js/main.js deleted file mode 100644 index 6501a56..0000000 --- a/03_dom/unterricht/tag22/03_js-auslagern-defer/assets/js/main.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict'; - -console.log('Datei wurde eingebunden.'); - -const h1El = document.querySelector('h1'); // =>

      ...

      - mit "defer" Attribut | null - ohne "defer" Attribut - -console.log('h1El: ', h1El); - -const onReady = () => { - const h1El = document.querySelector('h1'); - h1El.style.color = 'tomato'; - - console.log('h1El: ', h1El); -}; - -// Eventlauscher - EventHandler wird ausgelöst, wenn Dokument komplett initialisiert wurde. -document.addEventListener('DOMContentLoaded', onReady); diff --git a/03_dom/unterricht/tag22/03_js-auslagern-defer/index.html b/03_dom/unterricht/tag22/03_js-auslagern-defer/index.html deleted file mode 100644 index 8c6f3a4..0000000 --- a/03_dom/unterricht/tag22/03_js-auslagern-defer/index.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - JS Dateien auslagern und Attribut "defer" - - - - -
      -
      -

      JS Dateien auslagern und Attribut "defer"

      - -
      -
      - - - diff --git a/03_dom/unterricht/tag22/04_chat-lernheft/assets/css/styles.css b/03_dom/unterricht/tag22/04_chat-lernheft/assets/css/styles.css deleted file mode 100644 index d904e6a..0000000 --- a/03_dom/unterricht/tag22/04_chat-lernheft/assets/css/styles.css +++ /dev/null @@ -1,368 +0,0 @@ -/* -------------------------------------------- Haupt CSS fuer alle Seiten -------------------------------------------- */ - -/* ---------------- CSS-Reset ------------------- */ -html, -body, -a, -div, -h1, -h2, -h3, -h4, -h5, -h6, -span, -p, -img, -strong, -ul, -li, -table, -th, -td, -tr { - margin: 0px; - padding: 0px; - border: 0px none; - font-weight: normal; - font-style: inherit; - font-family: inherit; - font-variant: inherit; - text-decoration: none; - table-layout: inherit; -} - -/* ---------------- Body / HTML ------------------- */ - -html { - font-size: 100%; - background-color: #fffef7; -} - -body { - font-family: Helvetica, Arial, sans-serif; - font-size: 1.2em; - font-weight: normal; - color: black; - margin: 0rem auto 2rem auto; -} - -/* ---------------- layout ------------------- */ - -header { - background: url(../img/js_header.png) left top no-repeat transparent; - background-size: cover; - height: 250px; - min-width: 850px; -} - -header:after { - content: ' '; - display: block; - height: 250px; - background: rgba(255, 254, 247, 0); - background: -moz-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -webkit-gradient( - left top, - left bottom, - color-stop(0%, rgba(255, 254, 247, 0)), - color-stop(22%, rgba(255, 254, 247, 0.55)), - color-stop(42%, rgba(255, 254, 247, 0.7)), - color-stop(43%, rgba(255, 254, 247, 0.71)), - color-stop(61%, rgba(255, 254, 247, 0.78)), - color-stop(75%, rgba(255, 254, 247, 0.92)), - color-stop(87%, rgba(255, 254, 247, 1)), - color-stop(100%, rgba(255, 254, 247, 1)) - ); - background: -webkit-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -o-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -ms-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: linear-gradient( - to bottom, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fffef7', endColorstr='#fffef7', GradientType=0 ); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fffef7', endColorstr='#fffef7', GradientType=0 ); -} - -main, -footer { - width: 70%; - margin: 3rem auto; - min-width: 850px; - padding: 0 20px; - box-sizing: border-box; -} - -/* ---------------- Content ------------------- */ - -h1 { - color: #93412b; - font-size: 3em; - margin-bottom: 20px; - font-weight: bold; -} - -h2 { - color: #93412b; - font-size: 2.5em; - margin-bottom: 15px; -} - -h3 { - color: #93412b; - font-size: 2em; - margin-bottom: 10px; -} - -p { - line-height: 15px; - margin-bottom: 15px; - line-height: 1.7em; -} - -.cited { - font-style: italic; - font-size: 0.8em; -} - -.u { - text-decoration: underline; -} -.b { - font-weight: bold; -} -.i { - font-style: italic; -} -.align_right { - text-align: right; -} -.align_left { - text-align: left; - margin-right: 10px; -} -.align_center { - text-align: center; -} -.float_left { - float: left; -} -.float_right { - float: right; -} -.clear_both { - clear: both; -} -strong { - font-weight: bold; -} -.special { - color: #b7595b; - font-weight: bold; -} -.keyword { - color: #db6f50; - font-weight: bold; - font-style: italic; -} -.gray { - color: gray; -} - -/* Links */ -main a:link, -main a:visited { - color: #eb690b; - font-weight: bold; -} - -main a:focus, -main a:hover, -main a:active { - color: #eb690b; -} - -ul { - list-style-position: outside; - margin-bottom: 20px; - padding-left: 22px; -} - -ol { - margin-bottom: 20px; - padding-left: 30px; -} - -li { - line-height: 1.4em; -} - -/* ------- Article ------- */ - -h1 { - color: #93412b; - font-size: 2.7em; - margin-bottom: 20px; -} - -#buy_form input[type='button'] { - display: inline-block; - padding: 1px 20px 3px 20px; - background-color: #93412b; - color: white; - border: 1px solid white; - font-size: 1em; - height: 32px; -} - -#buy_form input[type='button']:hover { - background-color: white; - color: #93412b; - border: 1px solid #93412b; -} - -#buy_form select { - display: inline-block; - font-size: 1em; - background-color: white; - color: #93412b; - border: 1px solid #93412b; - height: 32px; -} - -/* ------- Chat ------- */ - -#chat { - width: 100%; - background-color: white; - border: 1px solid #9c352f; - height: 20rem; - position: relative; -} - -#chat_window { - background-color: white; - width: 85%; - float: left; - height: 95%; -} - -#chat_history { - position: absolute; - bottom: 8%; - max-height: 92%; - padding: 0px 0px 5px 7px; -} - -#chat_history p { - font-size: 0.6em; - margin: 0; -} - -#chat_text { - height: 8%; - position: absolute; - bottom: 0; - width: 85%; -} - -#chat_text input { - width: 98%; - display: block; - margin: auto; -} - -#chat_members { - list-style-type: none; - height: 100%; - width: 15%; - margin-left: 85%; - border-left: 1px solid #9c352f; - text-align: right; - box-sizing: border-box; - min-width: 100px; - font-size: 0.8em; - padding-top: 5px; -} - -#chat_members li { - line-height: 1.2em; - padding: 5px 10px 2px 15px; -} - -#chat_members .highlighted { - background-color: #c14d45; - color: white; -} -.chat_member { - font-weight: bold; -} -.chat_member1 { - color: #3626c8; -} -.chat_member2 { - color: #e38d0b; -} - -#member_search { - position: absolute; - right: 0; - bottom: 0; - width: 15%; - height: 8%; -} - -#member_search input { - width: 88%; - display: block; - margin: auto; - text-align: right; -} diff --git a/03_dom/unterricht/tag22/04_chat-lernheft/assets/img/favicon.icon b/03_dom/unterricht/tag22/04_chat-lernheft/assets/img/favicon.icon deleted file mode 100644 index bd2cd28..0000000 Binary files a/03_dom/unterricht/tag22/04_chat-lernheft/assets/img/favicon.icon and /dev/null differ diff --git a/03_dom/unterricht/tag22/04_chat-lernheft/assets/img/js_header.png b/03_dom/unterricht/tag22/04_chat-lernheft/assets/img/js_header.png deleted file mode 100644 index 4d14ceb..0000000 Binary files a/03_dom/unterricht/tag22/04_chat-lernheft/assets/img/js_header.png and /dev/null differ diff --git a/03_dom/unterricht/tag22/04_chat-lernheft/assets/js/main.js b/03_dom/unterricht/tag22/04_chat-lernheft/assets/js/main.js deleted file mode 100644 index b5232d3..0000000 --- a/03_dom/unterricht/tag22/04_chat-lernheft/assets/js/main.js +++ /dev/null @@ -1,19 +0,0 @@ -'use strict'; - -{ - const highlightChatMembersBy = (partOfMemberName) => { - chatMembers() // 2 - .filter((member) => doesMemberMatch(partOfMemberName, member)) //4 - .forEach(highlight); // 6 - }; - - const doesMemberMatch = (partOfMemberName, member) => - member.innerHTML.toLowerCase().includes(partOfMemberName.toLowerCase()); // 5 - - const chatMembers = () => $$('#chat_members li'); // 3 - const highlight = (el) => el.classList.add('highlighted'); //7 - - const $$ = (qs) => Array.from(document.querySelectorAll(qs)); - - highlightChatMembersBy('ert'); // 1 -} diff --git a/03_dom/unterricht/tag22/04_chat-lernheft/index.html b/03_dom/unterricht/tag22/04_chat-lernheft/index.html deleted file mode 100644 index 00d705e..0000000 --- a/03_dom/unterricht/tag22/04_chat-lernheft/index.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - classList - DOMTokenList - - - - - - -
      -
      -

      The Chat

      -
      -
      -
      -

      - Ladislaus: - Anybody there? -

      -

      - Friedlinde - Yes, me! -

      -
      - -
      - -
      -
      - -
        -
      • Heribert
      • -
      • Friedlinde
      • -
      • Tusnelda
      • -
      • Berthold
      • -
      • Oswine
      • -
      • Ladislaus
      • -
      - - -
      -
      -
      - - diff --git a/03_dom/unterricht/tag22/05_chat-refactored/assets/css/styles.css b/03_dom/unterricht/tag22/05_chat-refactored/assets/css/styles.css deleted file mode 100644 index d904e6a..0000000 --- a/03_dom/unterricht/tag22/05_chat-refactored/assets/css/styles.css +++ /dev/null @@ -1,368 +0,0 @@ -/* -------------------------------------------- Haupt CSS fuer alle Seiten -------------------------------------------- */ - -/* ---------------- CSS-Reset ------------------- */ -html, -body, -a, -div, -h1, -h2, -h3, -h4, -h5, -h6, -span, -p, -img, -strong, -ul, -li, -table, -th, -td, -tr { - margin: 0px; - padding: 0px; - border: 0px none; - font-weight: normal; - font-style: inherit; - font-family: inherit; - font-variant: inherit; - text-decoration: none; - table-layout: inherit; -} - -/* ---------------- Body / HTML ------------------- */ - -html { - font-size: 100%; - background-color: #fffef7; -} - -body { - font-family: Helvetica, Arial, sans-serif; - font-size: 1.2em; - font-weight: normal; - color: black; - margin: 0rem auto 2rem auto; -} - -/* ---------------- layout ------------------- */ - -header { - background: url(../img/js_header.png) left top no-repeat transparent; - background-size: cover; - height: 250px; - min-width: 850px; -} - -header:after { - content: ' '; - display: block; - height: 250px; - background: rgba(255, 254, 247, 0); - background: -moz-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -webkit-gradient( - left top, - left bottom, - color-stop(0%, rgba(255, 254, 247, 0)), - color-stop(22%, rgba(255, 254, 247, 0.55)), - color-stop(42%, rgba(255, 254, 247, 0.7)), - color-stop(43%, rgba(255, 254, 247, 0.71)), - color-stop(61%, rgba(255, 254, 247, 0.78)), - color-stop(75%, rgba(255, 254, 247, 0.92)), - color-stop(87%, rgba(255, 254, 247, 1)), - color-stop(100%, rgba(255, 254, 247, 1)) - ); - background: -webkit-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -o-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -ms-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: linear-gradient( - to bottom, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fffef7', endColorstr='#fffef7', GradientType=0 ); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fffef7', endColorstr='#fffef7', GradientType=0 ); -} - -main, -footer { - width: 70%; - margin: 3rem auto; - min-width: 850px; - padding: 0 20px; - box-sizing: border-box; -} - -/* ---------------- Content ------------------- */ - -h1 { - color: #93412b; - font-size: 3em; - margin-bottom: 20px; - font-weight: bold; -} - -h2 { - color: #93412b; - font-size: 2.5em; - margin-bottom: 15px; -} - -h3 { - color: #93412b; - font-size: 2em; - margin-bottom: 10px; -} - -p { - line-height: 15px; - margin-bottom: 15px; - line-height: 1.7em; -} - -.cited { - font-style: italic; - font-size: 0.8em; -} - -.u { - text-decoration: underline; -} -.b { - font-weight: bold; -} -.i { - font-style: italic; -} -.align_right { - text-align: right; -} -.align_left { - text-align: left; - margin-right: 10px; -} -.align_center { - text-align: center; -} -.float_left { - float: left; -} -.float_right { - float: right; -} -.clear_both { - clear: both; -} -strong { - font-weight: bold; -} -.special { - color: #b7595b; - font-weight: bold; -} -.keyword { - color: #db6f50; - font-weight: bold; - font-style: italic; -} -.gray { - color: gray; -} - -/* Links */ -main a:link, -main a:visited { - color: #eb690b; - font-weight: bold; -} - -main a:focus, -main a:hover, -main a:active { - color: #eb690b; -} - -ul { - list-style-position: outside; - margin-bottom: 20px; - padding-left: 22px; -} - -ol { - margin-bottom: 20px; - padding-left: 30px; -} - -li { - line-height: 1.4em; -} - -/* ------- Article ------- */ - -h1 { - color: #93412b; - font-size: 2.7em; - margin-bottom: 20px; -} - -#buy_form input[type='button'] { - display: inline-block; - padding: 1px 20px 3px 20px; - background-color: #93412b; - color: white; - border: 1px solid white; - font-size: 1em; - height: 32px; -} - -#buy_form input[type='button']:hover { - background-color: white; - color: #93412b; - border: 1px solid #93412b; -} - -#buy_form select { - display: inline-block; - font-size: 1em; - background-color: white; - color: #93412b; - border: 1px solid #93412b; - height: 32px; -} - -/* ------- Chat ------- */ - -#chat { - width: 100%; - background-color: white; - border: 1px solid #9c352f; - height: 20rem; - position: relative; -} - -#chat_window { - background-color: white; - width: 85%; - float: left; - height: 95%; -} - -#chat_history { - position: absolute; - bottom: 8%; - max-height: 92%; - padding: 0px 0px 5px 7px; -} - -#chat_history p { - font-size: 0.6em; - margin: 0; -} - -#chat_text { - height: 8%; - position: absolute; - bottom: 0; - width: 85%; -} - -#chat_text input { - width: 98%; - display: block; - margin: auto; -} - -#chat_members { - list-style-type: none; - height: 100%; - width: 15%; - margin-left: 85%; - border-left: 1px solid #9c352f; - text-align: right; - box-sizing: border-box; - min-width: 100px; - font-size: 0.8em; - padding-top: 5px; -} - -#chat_members li { - line-height: 1.2em; - padding: 5px 10px 2px 15px; -} - -#chat_members .highlighted { - background-color: #c14d45; - color: white; -} -.chat_member { - font-weight: bold; -} -.chat_member1 { - color: #3626c8; -} -.chat_member2 { - color: #e38d0b; -} - -#member_search { - position: absolute; - right: 0; - bottom: 0; - width: 15%; - height: 8%; -} - -#member_search input { - width: 88%; - display: block; - margin: auto; - text-align: right; -} diff --git a/03_dom/unterricht/tag22/05_chat-refactored/assets/img/favicon.icon b/03_dom/unterricht/tag22/05_chat-refactored/assets/img/favicon.icon deleted file mode 100644 index bd2cd28..0000000 Binary files a/03_dom/unterricht/tag22/05_chat-refactored/assets/img/favicon.icon and /dev/null differ diff --git a/03_dom/unterricht/tag22/05_chat-refactored/assets/img/js_header.png b/03_dom/unterricht/tag22/05_chat-refactored/assets/img/js_header.png deleted file mode 100644 index 4d14ceb..0000000 Binary files a/03_dom/unterricht/tag22/05_chat-refactored/assets/img/js_header.png and /dev/null differ diff --git a/03_dom/unterricht/tag22/05_chat-refactored/assets/js/main.js b/03_dom/unterricht/tag22/05_chat-refactored/assets/js/main.js deleted file mode 100644 index 7fd809d..0000000 --- a/03_dom/unterricht/tag22/05_chat-refactored/assets/js/main.js +++ /dev/null @@ -1,35 +0,0 @@ -'use strict'; - -// IIFE -(() => { - // === DOM & VARS ======= - const module = document.querySelector('#chat') || console.error('Element not found'); - - const DOM = { - listItems: Array.from(module.querySelectorAll('#chat_members li')), - }; - - console.log(DOM); - - // === INIT ============= - const init = () => { - // Funktionsaufrufe zu beginn der Anwendung - highlightListItemBy('ert'); - }; - - // === EVENTHANDLER ===== - - // === XHR/FETCH ======== - - // === FUNCTIONS ======== - const highlightListItemBy = (searchValue = '') => { - DOM.listItems.forEach((el) => { - const text = el.textContent.trim().toLowerCase(); - if (text.includes(searchValue.trim().toLowerCase())) { - el.classList.add('highlighted'); - } - }); - }; - - init(); -})(); diff --git a/03_dom/unterricht/tag22/05_chat-refactored/index.html b/03_dom/unterricht/tag22/05_chat-refactored/index.html deleted file mode 100644 index 00d705e..0000000 --- a/03_dom/unterricht/tag22/05_chat-refactored/index.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - classList - DOMTokenList - - - - - - -
      -
      -

      The Chat

      -
      -
      -
      -

      - Ladislaus: - Anybody there? -

      -

      - Friedlinde - Yes, me! -

      -
      - -
      - -
      -
      - -
        -
      • Heribert
      • -
      • Friedlinde
      • -
      • Tusnelda
      • -
      • Berthold
      • -
      • Oswine
      • -
      • Ladislaus
      • -
      - - -
      -
      -
      - - diff --git a/03_dom/unterricht/tag22/06_event-mouse/index.html b/03_dom/unterricht/tag22/06_event-mouse/index.html deleted file mode 100644 index f2a8a8a..0000000 --- a/03_dom/unterricht/tag22/06_event-mouse/index.html +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - Events - MouseEvent | PointerEvent - - - - -
      -
      -

      Events - MouseEvent | PointerEvent

      -

      Standard Events

      -

      JS Events in W3Schools

      -
      - - -
      - - - - - -
      Content
      - -
      -
      -
      -
      -
      - - - diff --git a/03_dom/unterricht/tag22/07_event-keyboard/index.html b/03_dom/unterricht/tag22/07_event-keyboard/index.html deleted file mode 100644 index 2486ade..0000000 --- a/03_dom/unterricht/tag22/07_event-keyboard/index.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - Events - KeyboardEvent | InputEvent | FocusEvent - - - -
      -
      -

      Events - KeyboardEvent | InputEvent | FocusEvent

      -

      Standard Events

      -

      JS Events in W3Schools

      -
      - - - - -
      - - -
      - - -
      - - -
      - -
      - - -
      -
      -
      - - - diff --git a/03_dom/unterricht/tag23/01_chat-final/assets/css/styles.css b/03_dom/unterricht/tag23/01_chat-final/assets/css/styles.css deleted file mode 100644 index d904e6a..0000000 --- a/03_dom/unterricht/tag23/01_chat-final/assets/css/styles.css +++ /dev/null @@ -1,368 +0,0 @@ -/* -------------------------------------------- Haupt CSS fuer alle Seiten -------------------------------------------- */ - -/* ---------------- CSS-Reset ------------------- */ -html, -body, -a, -div, -h1, -h2, -h3, -h4, -h5, -h6, -span, -p, -img, -strong, -ul, -li, -table, -th, -td, -tr { - margin: 0px; - padding: 0px; - border: 0px none; - font-weight: normal; - font-style: inherit; - font-family: inherit; - font-variant: inherit; - text-decoration: none; - table-layout: inherit; -} - -/* ---------------- Body / HTML ------------------- */ - -html { - font-size: 100%; - background-color: #fffef7; -} - -body { - font-family: Helvetica, Arial, sans-serif; - font-size: 1.2em; - font-weight: normal; - color: black; - margin: 0rem auto 2rem auto; -} - -/* ---------------- layout ------------------- */ - -header { - background: url(../img/js_header.png) left top no-repeat transparent; - background-size: cover; - height: 250px; - min-width: 850px; -} - -header:after { - content: ' '; - display: block; - height: 250px; - background: rgba(255, 254, 247, 0); - background: -moz-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -webkit-gradient( - left top, - left bottom, - color-stop(0%, rgba(255, 254, 247, 0)), - color-stop(22%, rgba(255, 254, 247, 0.55)), - color-stop(42%, rgba(255, 254, 247, 0.7)), - color-stop(43%, rgba(255, 254, 247, 0.71)), - color-stop(61%, rgba(255, 254, 247, 0.78)), - color-stop(75%, rgba(255, 254, 247, 0.92)), - color-stop(87%, rgba(255, 254, 247, 1)), - color-stop(100%, rgba(255, 254, 247, 1)) - ); - background: -webkit-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -o-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: -ms-linear-gradient( - top, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - background: linear-gradient( - to bottom, - rgba(255, 254, 247, 0) 0%, - rgba(255, 254, 247, 0.55) 22%, - rgba(255, 254, 247, 0.7) 42%, - rgba(255, 254, 247, 0.71) 43%, - rgba(255, 254, 247, 0.78) 61%, - rgba(255, 254, 247, 0.92) 75%, - rgba(255, 254, 247, 1) 87%, - rgba(255, 254, 247, 1) 100% - ); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fffef7', endColorstr='#fffef7', GradientType=0 ); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fffef7', endColorstr='#fffef7', GradientType=0 ); -} - -main, -footer { - width: 70%; - margin: 3rem auto; - min-width: 850px; - padding: 0 20px; - box-sizing: border-box; -} - -/* ---------------- Content ------------------- */ - -h1 { - color: #93412b; - font-size: 3em; - margin-bottom: 20px; - font-weight: bold; -} - -h2 { - color: #93412b; - font-size: 2.5em; - margin-bottom: 15px; -} - -h3 { - color: #93412b; - font-size: 2em; - margin-bottom: 10px; -} - -p { - line-height: 15px; - margin-bottom: 15px; - line-height: 1.7em; -} - -.cited { - font-style: italic; - font-size: 0.8em; -} - -.u { - text-decoration: underline; -} -.b { - font-weight: bold; -} -.i { - font-style: italic; -} -.align_right { - text-align: right; -} -.align_left { - text-align: left; - margin-right: 10px; -} -.align_center { - text-align: center; -} -.float_left { - float: left; -} -.float_right { - float: right; -} -.clear_both { - clear: both; -} -strong { - font-weight: bold; -} -.special { - color: #b7595b; - font-weight: bold; -} -.keyword { - color: #db6f50; - font-weight: bold; - font-style: italic; -} -.gray { - color: gray; -} - -/* Links */ -main a:link, -main a:visited { - color: #eb690b; - font-weight: bold; -} - -main a:focus, -main a:hover, -main a:active { - color: #eb690b; -} - -ul { - list-style-position: outside; - margin-bottom: 20px; - padding-left: 22px; -} - -ol { - margin-bottom: 20px; - padding-left: 30px; -} - -li { - line-height: 1.4em; -} - -/* ------- Article ------- */ - -h1 { - color: #93412b; - font-size: 2.7em; - margin-bottom: 20px; -} - -#buy_form input[type='button'] { - display: inline-block; - padding: 1px 20px 3px 20px; - background-color: #93412b; - color: white; - border: 1px solid white; - font-size: 1em; - height: 32px; -} - -#buy_form input[type='button']:hover { - background-color: white; - color: #93412b; - border: 1px solid #93412b; -} - -#buy_form select { - display: inline-block; - font-size: 1em; - background-color: white; - color: #93412b; - border: 1px solid #93412b; - height: 32px; -} - -/* ------- Chat ------- */ - -#chat { - width: 100%; - background-color: white; - border: 1px solid #9c352f; - height: 20rem; - position: relative; -} - -#chat_window { - background-color: white; - width: 85%; - float: left; - height: 95%; -} - -#chat_history { - position: absolute; - bottom: 8%; - max-height: 92%; - padding: 0px 0px 5px 7px; -} - -#chat_history p { - font-size: 0.6em; - margin: 0; -} - -#chat_text { - height: 8%; - position: absolute; - bottom: 0; - width: 85%; -} - -#chat_text input { - width: 98%; - display: block; - margin: auto; -} - -#chat_members { - list-style-type: none; - height: 100%; - width: 15%; - margin-left: 85%; - border-left: 1px solid #9c352f; - text-align: right; - box-sizing: border-box; - min-width: 100px; - font-size: 0.8em; - padding-top: 5px; -} - -#chat_members li { - line-height: 1.2em; - padding: 5px 10px 2px 15px; -} - -#chat_members .highlighted { - background-color: #c14d45; - color: white; -} -.chat_member { - font-weight: bold; -} -.chat_member1 { - color: #3626c8; -} -.chat_member2 { - color: #e38d0b; -} - -#member_search { - position: absolute; - right: 0; - bottom: 0; - width: 15%; - height: 8%; -} - -#member_search input { - width: 88%; - display: block; - margin: auto; - text-align: right; -} diff --git a/03_dom/unterricht/tag23/01_chat-final/assets/img/favicon.icon b/03_dom/unterricht/tag23/01_chat-final/assets/img/favicon.icon deleted file mode 100644 index bd2cd28..0000000 Binary files a/03_dom/unterricht/tag23/01_chat-final/assets/img/favicon.icon and /dev/null differ diff --git a/03_dom/unterricht/tag23/01_chat-final/assets/img/js_header.png b/03_dom/unterricht/tag23/01_chat-final/assets/img/js_header.png deleted file mode 100644 index 4d14ceb..0000000 Binary files a/03_dom/unterricht/tag23/01_chat-final/assets/img/js_header.png and /dev/null differ diff --git a/03_dom/unterricht/tag23/01_chat-final/assets/js/main.js b/03_dom/unterricht/tag23/01_chat-final/assets/js/main.js deleted file mode 100644 index 145b874..0000000 --- a/03_dom/unterricht/tag23/01_chat-final/assets/js/main.js +++ /dev/null @@ -1,44 +0,0 @@ -'use strict'; - -// IIFE -(() => { - // === DOM & VARS ======= - const module = document.querySelector('#chat') || console.error('Element not found'); - - const DOM = { - listItems: Array.from(module.querySelectorAll('#chat_members li')), - inputSearch: module.querySelector('#member_search input'), - }; - - console.log(DOM); - - // === INIT ============= - const init = () => { - // Funktionsaufrufe zu beginn der Anwendung - // highlightListItemBy('ert'); - // Eventhandler zu beginn der Anwendung - DOM.inputSearch.addEventListener('input', onInputSearch); - }; - - // === EVENTHANDLER ===== - const onInputSearch = (e) => { - const inputEl = e.target; - const value = inputEl.value; // aktuelle Eingabe von input - highlightListItemBy(value); - }; - - // === XHR/FETCH ======== - - // === FUNCTIONS ======== - const highlightListItemBy = (searchValue = '') => { - DOM.listItems.forEach((el) => { - el.classList.remove('highlighted'); - const text = el.textContent.trim().toLowerCase(); - if (searchValue !== '' && text.includes(searchValue.trim().toLowerCase())) { - el.classList.add('highlighted'); - } - }); - }; - - init(); -})(); diff --git a/03_dom/unterricht/tag23/01_chat-final/index.html b/03_dom/unterricht/tag23/01_chat-final/index.html deleted file mode 100644 index 00d705e..0000000 --- a/03_dom/unterricht/tag23/01_chat-final/index.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - classList - DOMTokenList - - - - - - -
      -
      -

      The Chat

      -
      -
      -
      -

      - Ladislaus: - Anybody there? -

      -

      - Friedlinde - Yes, me! -

      -
      - -
      - -
      -
      - -
        -
      • Heribert
      • -
      • Friedlinde
      • -
      • Tusnelda
      • -
      • Berthold
      • -
      • Oswine
      • -
      • Ladislaus
      • -
      - - -
      -
      -
      - - diff --git a/03_dom/unterricht/tag23/02_defer-examples/01_example_defer.html b/03_dom/unterricht/tag23/02_defer-examples/01_example_defer.html deleted file mode 100644 index 10247ec..0000000 --- a/03_dom/unterricht/tag23/02_defer-examples/01_example_defer.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - 01 Example Defer - - - - - - - - - - - - diff --git a/03_dom/unterricht/tag23/02_defer-examples/02_example_defer.html b/03_dom/unterricht/tag23/02_defer-examples/02_example_defer.html deleted file mode 100644 index e9e57a4..0000000 --- a/03_dom/unterricht/tag23/02_defer-examples/02_example_defer.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - 02 Example Defer - - - - - - - - - - - - - diff --git a/03_dom/unterricht/tag23/02_defer-examples/03_example_defer.html b/03_dom/unterricht/tag23/02_defer-examples/03_example_defer.html deleted file mode 100644 index 46de993..0000000 --- a/03_dom/unterricht/tag23/02_defer-examples/03_example_defer.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - 03 Example Defer - - - - - - - - - - - - diff --git a/03_dom/unterricht/tag23/02_defer-examples/04_dom-laden.html b/03_dom/unterricht/tag23/02_defer-examples/04_dom-laden.html deleted file mode 100644 index 8863249..0000000 --- a/03_dom/unterricht/tag23/02_defer-examples/04_dom-laden.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - DOM Laden - Event DOMContentLoaded - - - - -
      -
      -

      DOM Laden - Event DOMContentLoaded

      -
      -
      - - - diff --git a/03_dom/unterricht/tag23/02_defer-examples/assets/js/file01.js b/03_dom/unterricht/tag23/02_defer-examples/assets/js/file01.js deleted file mode 100644 index ffde053..0000000 --- a/03_dom/unterricht/tag23/02_defer-examples/assets/js/file01.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -console.log('File 01: '); - -const a = 'a'; - -console.log(output()); diff --git a/03_dom/unterricht/tag23/02_defer-examples/assets/js/file02.js b/03_dom/unterricht/tag23/02_defer-examples/assets/js/file02.js deleted file mode 100644 index 28b3deb..0000000 --- a/03_dom/unterricht/tag23/02_defer-examples/assets/js/file02.js +++ /dev/null @@ -1,7 +0,0 @@ -"use strict"; - -console.log('File 02: '); - -const b = 'b'; - -console.log(output()); \ No newline at end of file diff --git a/03_dom/unterricht/tag23/02_defer-examples/assets/js/file03.js b/03_dom/unterricht/tag23/02_defer-examples/assets/js/file03.js deleted file mode 100644 index 427161f..0000000 --- a/03_dom/unterricht/tag23/02_defer-examples/assets/js/file03.js +++ /dev/null @@ -1,7 +0,0 @@ -"use strict"; - -console.log('File 03: '); - -const c = 'c'; - -console.log(output()); \ No newline at end of file diff --git a/03_dom/unterricht/tag23/02_defer-examples/assets/js/file04.js b/03_dom/unterricht/tag23/02_defer-examples/assets/js/file04.js deleted file mode 100644 index b07391c..0000000 --- a/03_dom/unterricht/tag23/02_defer-examples/assets/js/file04.js +++ /dev/null @@ -1,7 +0,0 @@ -"use strict"; - -console.log('File 04: '); - -const d = 'd'; - -console.log(output()); \ No newline at end of file diff --git a/03_dom/unterricht/tag23/02_defer-examples/assets/js/helper.js b/03_dom/unterricht/tag23/02_defer-examples/assets/js/helper.js deleted file mode 100644 index 8be183f..0000000 --- a/03_dom/unterricht/tag23/02_defer-examples/assets/js/helper.js +++ /dev/null @@ -1,22 +0,0 @@ -const output = () => { - let outputText = '\t'; - try{ - outputText += a + ','; - } catch(err) {} - try{ - outputText += b + ','; - } catch(err) {} - try{ - outputText += c + ','; - } catch(err) {} - try{ - outputText += d + ','; - } catch(err) {} - try{ - outputText += e + ','; - } catch(err) {} - try{ - outputText += i + ','; - } catch(err) {} - return outputText.replace(/,+$/,'');; -} \ No newline at end of file diff --git a/03_dom/unterricht/tag23/03_newsboard-lernheft/assets/css/main.css b/03_dom/unterricht/tag23/03_newsboard-lernheft/assets/css/main.css deleted file mode 100644 index 58fcd5a..0000000 --- a/03_dom/unterricht/tag23/03_newsboard-lernheft/assets/css/main.css +++ /dev/null @@ -1,227 +0,0 @@ -* { - margin: 0; -} -html { - font-size: 100%; - padding: 0; - background-attachment: fixed; - background-image: -webkit-linear-gradient(top, #eef0f2, #d3d5d9); - background-image: -moz-linear-gradient(top, #eef0f2, #d3d5d9); - background-image: linear-gradient(to bottom, #eef0f2, #d3d5d9); -} -body { - color: #333; - font-size: 1em; - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; - text-align: left; - margin: 1em; - padding: 0; -} -p, -h1, -h2, -h3, -h4, -h5, -h6 { - margin-bottom: 1rem; -} -p { - line-height: 1.5em; - -webkit-hyphens: auto; - -moz-hyphens: auto; - hyphens: auto; -} -p:last-child { - margin-bottom: 0; -} -a { - color: #2f83e8; - text-decoration: none; -} -a:hover { - text-decoration: underline; -} -strong, -b { - font-weight: bold; -} -em, -i { - font-style: italic; -} -.float_left { - float: left; -} -.float_right { - float: right; -} -.disabled { - opacity: 0.4; - cursor: default; -} -.message_number { - color: #fff; - font-size: 0.8em; - font-weight: bold; - text-align: center; - line-height: 1em; - position: absolute; - top: -0.5em; - left: -0.5em; - display: block; - padding-top: 0.3em; - min-width: 2em; - height: 2em; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - cursor: default; - background-color: #ea2314; - background-image: -webkit-linear-gradient(top, #f78f91, #c50404); - background-image: -moz-linear-gradient(top, #f78f91, #c50404); - background-image: linear-gradient(to bottom, #f78f91, #c50404); - border: 2px solid #fff; - -webkit-border-radius: 1em; - -moz-border-radius: 1em; - border-radius: 1em; - -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3); - box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3); -} -.newsboard_wrapper { - margin: 0 auto 2em auto; - padding: 13px 0 0 17px; - max-width: 550px; - position: relative; - background: url('../img/sheets.png') no-repeat; -} -.newsboard_wrapper:before { - content: url('../img/paperclip.png'); - position: absolute; - top: 5px; - right: 35px; - z-index: 1; -} -.newsboard_wrapper .newsboard { - padding: 29px 1.25rem 4rem 1.25rem; - min-height: 20em; - position: relative; - border: 1px solid #ccc; - background-color: #fff; - background-image: -webkit-linear-gradient(#dddddd, #ffffff 1px); - background-image: -moz-linear-gradient(#dddddd, #ffffff 1px); - background-image: linear-gradient(#dddddd, #ffffff 1px); - background-position: 0 1.3em; - -webkit-background-size: 100% 1.5em; - -moz-background-size: 100% 1.5em; - background-size: 100% 1.5em; - -webkit-box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.3); - box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.3); -} -.newsboard_wrapper .newsboard .close_button { - color: #777; - font-size: 1.2em; - text-decoration: none; - line-height: 1em; - position: absolute; - top: 10px; - right: 14px; - display: block; -} -.newsboard_wrapper .newsboard .close_button:hover { - color: #444; -} -.newsboard_wrapper .newsboard .newsboard_footer { - color: #999; - font-size: 0.8em; -} -.newsboard_wrapper .newsboard .paging_bar { - font-size: 1.8em; - padding: 0 1.25rem; - position: absolute; - left: 0; - right: 0; - bottom: 1rem; - white-space: nowrap; -} -.newsboard_wrapper .newsboard .paging_bar .float_left a, -.newsboard_wrapper .newsboard .paging_bar .float_right a { - color: #777; - text-decoration: none; -} -.newsboard_wrapper .newsboard .paging_bar .float_left a { - margin-right: 0.3em; -} -.newsboard_wrapper .newsboard .paging_bar .float_right a { - margin-left: 0.3em; -} -.newsboard_wrapper .newsboard .paging_bar .progressbar { - display: block; - width: 40%; - margin: 0 auto; -} -.newsboard_wrapper .newsboard .paging_bar progress { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - vertical-align: 0; - line-height: normal; - color: #2f83e8; - width: 100%; - height: 0.6rem; - border-style: none; - padding: 0; - background-color: #eee; - -webkit-border-radius: 0.3rem; - -moz-border-radius: 0.3rem; - border-radius: 0.3rem; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.4); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.4); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.4); -} -.newsboard_wrapper .newsboard .paging_bar progress::-webkit-progress-bar { - padding: 0; - border-style: none; - background-color: transparent; -} -.newsboard_wrapper .newsboard .paging_bar progress::-webkit-progress-value { - -webkit-border-radius: 0.3rem; - border-radius: 0.3rem; - background-color: #2f83e8; - background-image: -webkit-linear-gradient(top, #8bbaf2, #176acd); - background-image: linear-gradient(to bottom, #8bbaf2, #176acd); -} -.newsboard_wrapper .newsboard .paging_bar progress::-moz-progress-bar { - -moz-border-radius: 0.3rem; - border-radius: 0.3rem; - background-color: #2f83e8; - background-image: -moz-linear-gradient(top, #8bbaf2, #176acd); - background-image: linear-gradient(to bottom, #8bbaf2, #176acd); -} -.newsboard_wrapper .newsboard .newsboard_content h1, -.newsboard_wrapper .newsboard .newsboard_content h2 { - font-weight: normal; - font-family: - 'Helvetica Neue Light', 'HelveticaNeue-Light', 'Helvetica Light', 'Helvetica-Light', Helvetica, Arial, sans-serif; - letter-spacing: 0.03em; -} -.newsboard_wrapper .newsboard .newsboard_content h1 { - font-size: 1.75em; -} -.newsboard_wrapper .newsboard .newsboard_content h2 { - color: #2f83e8; - font-size: 1.2em; - line-height: 1.4em; -} -.newsboard_wrapper .newsboard .newsboard_content:empty { - color: #999; - font-size: 1.15em; - text-align: center; - padding-top: 10.5rem; - background: url('../img/empty.png') no-repeat center 3.75rem; -} -.newsboard_wrapper .newsboard .newsboard_content:empty:after { - content: 'Keine neuen Mitteilungen.'; -} diff --git a/03_dom/unterricht/tag23/03_newsboard-lernheft/assets/img/empty.png b/03_dom/unterricht/tag23/03_newsboard-lernheft/assets/img/empty.png deleted file mode 100644 index d650b1b..0000000 Binary files a/03_dom/unterricht/tag23/03_newsboard-lernheft/assets/img/empty.png and /dev/null differ diff --git a/03_dom/unterricht/tag23/03_newsboard-lernheft/assets/img/paperclip.png b/03_dom/unterricht/tag23/03_newsboard-lernheft/assets/img/paperclip.png deleted file mode 100644 index 7f24721..0000000 Binary files a/03_dom/unterricht/tag23/03_newsboard-lernheft/assets/img/paperclip.png and /dev/null differ diff --git a/03_dom/unterricht/tag23/03_newsboard-lernheft/assets/img/sheets.png b/03_dom/unterricht/tag23/03_newsboard-lernheft/assets/img/sheets.png deleted file mode 100644 index 14680cb..0000000 Binary files a/03_dom/unterricht/tag23/03_newsboard-lernheft/assets/img/sheets.png and /dev/null differ diff --git a/03_dom/unterricht/tag23/03_newsboard-lernheft/assets/js/main.js b/03_dom/unterricht/tag23/03_newsboard-lernheft/assets/js/main.js deleted file mode 100644 index 0ed6caa..0000000 --- a/03_dom/unterricht/tag23/03_newsboard-lernheft/assets/js/main.js +++ /dev/null @@ -1,50 +0,0 @@ -'use strict'; - -{ - const init = () => { - showFirstMessage(); - $('[title=next]').addEventListener('click', nextMessage); - $('[title=prev]').addEventListener('click', prevMessage); - }; - - const showFirstMessage = () => showMessageByNumber(1); - - const showMessageByNumber = (messageNumber) => { - $('.newsboard_content').innerHTML = messages[messageNumber - 1]; - }; - - const nextMessage = (e) => { - e.preventDefault(); // Standardverhalten unterbinden - showMessageByNumber(++currentMessageNumber); - console.log('next'); - }; - const prevMessage = (e) => { - e.preventDefault(); // Standardverhalten unterbinden - showMessageByNumber(--currentMessageNumber); - console.log('prev'); - }; - - const messages = [ - `

      Tutors are on a strike!!!

      -

      All assignmnent are automatically graded with 0 points

      -

      Duis pretium ornare odio nec cursus. Nulla quis dolor vitae nulla condimentum maximus nec vitae purus. Curabitur ut mi non nulla molestie porta. Curabitur dignissim lacinia condimentum. In hac habitasse platea dictumst. Mauris ut urna magna. Mauris venenatis eu quam nec posuere. Nulla facilisi. Donec convallis sodales massa, et consequat nunc vehicula malesuada.

      - `, - - `

      Madness!

      -

      How to earn a fortune, with a complete stupid idea

      -

      Ut molestie elementum risus, eget rutrum dui tristique id. Duis ac elit a mi convallis lacinia. Sed at ultricies magna. Pellentesque nisl est, mattis eget porta eu, rhoncus in urna. Integer faucibus lectus nec malesuada tempus. Duis consectetur sollicitudin ultricies. Cras massa nulla, aliquet vitae interdum quis, venenatis at quam.

      - `, - - `

      I did something, and you will never guess what happened next...

      -

      Donec tristique, leo at suscipit pellentesque, mauris neque congue leo!

      -

      Aenean egestas mauris at neque egestas hendrerit id ut erat. Donec iaculis ornare gravida. Vestibulum condimentum, tortor nec eleifend consectetur, justo lacus dignissim ante, eget commodo enim urna sollicitudin arcu. Odio eu leo pulvinar rutrum sed a turpis. Nunc dui tortor, rutrum vitae gravida quis, hendrerit a massa. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas

      -

      Integer non venenatis tellus. Phasellus tellus leo, suscipit ac vulputate non, varius nec eros. Etiam scelerisque nisi arcu, interdum tempus dui volutpat vel. Donec eget posuere nulla. Etiam ornare dapibus tortor, ac sollicitudin nisi porta a. Donec tristique, leo at suscipit pellentesque, mauris neque congue leo, sed tempor massa justo a ligula. Curabitur vitae rhoncus lacus, quis varius felis. Ut tincidunt sit amet nisl finibus tempus. Curabitur mollis sit amet leo a sagittis.

      - `, - ]; - let currentMessageNumber = 1; - - const $ = (qs) => document.querySelector(qs); - const $$ = (qs) => Array.from(document.querySelectorAll(qs)); - - init(); -} diff --git a/03_dom/unterricht/tag23/03_newsboard-lernheft/index.html b/03_dom/unterricht/tag23/03_newsboard-lernheft/index.html deleted file mode 100644 index 9c007ea..0000000 --- a/03_dom/unterricht/tag23/03_newsboard-lernheft/index.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - Newsboard - - - - - - - -
      -
      - X - - × - -
      - -
      - - « - - - - - - » - - - - - -
      -
      -
      - - diff --git a/03_dom/unterricht/tag23/04_newsboard-refactored/assets/css/main.css b/03_dom/unterricht/tag23/04_newsboard-refactored/assets/css/main.css deleted file mode 100644 index 60e194c..0000000 --- a/03_dom/unterricht/tag23/04_newsboard-refactored/assets/css/main.css +++ /dev/null @@ -1,239 +0,0 @@ -* { - margin: 0; -} -html { - font-size: 100%; - padding: 0; - background-attachment: fixed; - background-image: -webkit-linear-gradient(top, #eef0f2, #d3d5d9); - background-image: -moz-linear-gradient(top, #eef0f2, #d3d5d9); - background-image: linear-gradient(to bottom, #eef0f2, #d3d5d9); -} -body { - color: #333; - font-size: 1em; - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; - text-align: left; - margin: 1em; - padding: 0; -} -p, -h1, -h2, -h3, -h4, -h5, -h6 { - margin-bottom: 1rem; -} -p { - line-height: 1.5em; - -webkit-hyphens: auto; - -moz-hyphens: auto; - hyphens: auto; -} -p:last-child { - margin-bottom: 0; -} -a { - color: #2f83e8; - text-decoration: none; -} -a:hover { - text-decoration: underline; -} -strong, -b { - font-weight: bold; -} -em, -i { - font-style: italic; -} -.float_left { - float: left; -} -.float_right { - float: right; -} -.disabled { - opacity: 0.4; - cursor: default; -} -.message_number { - color: #fff; - font-size: 0.8em; - font-weight: bold; - text-align: center; - line-height: 1em; - position: absolute; - top: -0.5em; - left: -0.5em; - display: block; - padding-top: 0.3em; - min-width: 2em; - height: 2em; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - cursor: default; - background-color: #ea2314; - background-image: -webkit-linear-gradient(top, #f78f91, #c50404); - background-image: -moz-linear-gradient(top, #f78f91, #c50404); - background-image: linear-gradient(to bottom, #f78f91, #c50404); - border: 2px solid #fff; - -webkit-border-radius: 1em; - -moz-border-radius: 1em; - border-radius: 1em; - -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3); - box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3); -} -.newsboard_wrapper { - margin: 0 auto 2em auto; - padding: 13px 0 0 17px; - max-width: 550px; - position: relative; - background: url('../img/sheets.png') no-repeat; -} -.newsboard_wrapper:before { - content: url('../img/paperclip.png'); - position: absolute; - top: 5px; - right: 35px; - z-index: 1; -} -.newsboard_wrapper .newsboard { - padding: 29px 1.25rem 4rem 1.25rem; - min-height: 20em; - position: relative; - border: 1px solid #ccc; - background-color: #fff; - background-image: -webkit-linear-gradient(#dddddd, #ffffff 1px); - background-image: -moz-linear-gradient(#dddddd, #ffffff 1px); - background-image: linear-gradient(#dddddd, #ffffff 1px); - background-position: 0 1.3em; - -webkit-background-size: 100% 1.5em; - -moz-background-size: 100% 1.5em; - background-size: 100% 1.5em; - -webkit-box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.3); - box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.3); -} -.newsboard_wrapper .newsboard .close_button { - color: #777; - font-size: 1.2em; - text-decoration: none; - line-height: 1em; - position: absolute; - top: 10px; - right: 14px; - display: block; -} -.newsboard_wrapper .newsboard .close_button:hover { - color: #444; -} -.newsboard_wrapper .newsboard .newsboard_footer { - color: #999; - font-size: 0.8em; -} -.newsboard_wrapper .newsboard .paging_bar { - font-size: 1.8em; - padding: 0 1.25rem; - position: absolute; - left: 0; - right: 0; - bottom: 1rem; - white-space: nowrap; -} -.newsboard_wrapper .newsboard .paging_bar .float_left a, -.newsboard_wrapper .newsboard .paging_bar .float_right a { - color: #777; - text-decoration: none; -} -.newsboard_wrapper .newsboard .paging_bar .float_left a { - margin-right: 0.3em; -} -.newsboard_wrapper .newsboard .paging_bar .float_right a { - margin-left: 0.3em; -} -.newsboard_wrapper .newsboard .paging_bar .progressbar { - display: block; - width: 40%; - margin: 0 auto; -} -.newsboard_wrapper .newsboard .paging_bar progress { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - vertical-align: 0; - line-height: normal; - color: #2f83e8; - width: 100%; - height: 0.6rem; - border-style: none; - padding: 0; - background-color: #eee; - -webkit-border-radius: 0.3rem; - -moz-border-radius: 0.3rem; - border-radius: 0.3rem; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.4); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.4); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.4); -} -.newsboard_wrapper .newsboard .paging_bar progress::-webkit-progress-bar { - padding: 0; - border-style: none; - background-color: transparent; -} -.newsboard_wrapper .newsboard .paging_bar progress::-webkit-progress-value { - -webkit-border-radius: 0.3rem; - border-radius: 0.3rem; - background-color: #2f83e8; - background-image: -webkit-linear-gradient(top, #8bbaf2, #176acd); - background-image: linear-gradient(to bottom, #8bbaf2, #176acd); -} -.newsboard_wrapper .newsboard .paging_bar progress::-moz-progress-bar { - -moz-border-radius: 0.3rem; - border-radius: 0.3rem; - background-color: #2f83e8; - background-image: -moz-linear-gradient(top, #8bbaf2, #176acd); - background-image: linear-gradient(to bottom, #8bbaf2, #176acd); -} -.newsboard_wrapper .newsboard .newsboard_content h1, -.newsboard_wrapper .newsboard .newsboard_content h2 { - font-weight: normal; - font-family: - 'Helvetica Neue Light', 'HelveticaNeue-Light', 'Helvetica Light', 'Helvetica-Light', Helvetica, Arial, sans-serif; - letter-spacing: 0.03em; -} -.newsboard_wrapper .newsboard .newsboard_content h1 { - font-size: 1.75em; -} -.newsboard_wrapper .newsboard .newsboard_content h2 { - color: #2f83e8; - font-size: 1.2em; - line-height: 1.4em; -} -.newsboard_wrapper .newsboard .newsboard_content:empty { - color: #999; - font-size: 1.15em; - text-align: center; - padding-top: 10.5rem; - background: url('../img/empty.png') no-repeat center 3.75rem; -} -.newsboard_wrapper .newsboard .newsboard_content:empty:after { - content: 'Keine neuen Mitteilungen.'; -} - -.sr-only { - width: 1px !important; - height: 1px !important; - padding: 0 !important; - margin: -1px !important; - overflow: hidden !important; - clip: rect(0, 0, 0, 0) !important; - white-space: nowrap !important; - border: 0 !important; - display: inline-block !important; -} diff --git a/03_dom/unterricht/tag23/04_newsboard-refactored/assets/img/empty.png b/03_dom/unterricht/tag23/04_newsboard-refactored/assets/img/empty.png deleted file mode 100644 index d650b1b..0000000 Binary files a/03_dom/unterricht/tag23/04_newsboard-refactored/assets/img/empty.png and /dev/null differ diff --git a/03_dom/unterricht/tag23/04_newsboard-refactored/assets/img/paperclip.png b/03_dom/unterricht/tag23/04_newsboard-refactored/assets/img/paperclip.png deleted file mode 100644 index 7f24721..0000000 Binary files a/03_dom/unterricht/tag23/04_newsboard-refactored/assets/img/paperclip.png and /dev/null differ diff --git a/03_dom/unterricht/tag23/04_newsboard-refactored/assets/img/sheets.png b/03_dom/unterricht/tag23/04_newsboard-refactored/assets/img/sheets.png deleted file mode 100644 index 14680cb..0000000 Binary files a/03_dom/unterricht/tag23/04_newsboard-refactored/assets/img/sheets.png and /dev/null differ diff --git a/03_dom/unterricht/tag23/04_newsboard-refactored/assets/js/main.js b/03_dom/unterricht/tag23/04_newsboard-refactored/assets/js/main.js deleted file mode 100644 index 45975ed..0000000 --- a/03_dom/unterricht/tag23/04_newsboard-refactored/assets/js/main.js +++ /dev/null @@ -1,54 +0,0 @@ -'use strict'; - -(() => { - // === DOM & VARS ======= - const module = document.querySelector('.newsboard') || console.error('newsboard not found'); - const DOM = { - messageNumber: module.querySelector('.message_number'), - newsboardContent: module.querySelector('.newsboard_content'), - buttonNext: module.querySelector('.button-next'), - buttonLast: module.querySelector('.button-last'), - buttonPrev: module.querySelector('.button-prev'), - buttonFirst: module.querySelector('.button-first'), - progressBar: module.querySelector('.progressbar progress'), - }; - - console.log(DOM); - - // === INIT ============= - const init = () => { - // Funktionaufrufe zu beginn der Anwendung - showMessageByNumber(1); - initProgressbar(); - - // Eventlauscher zu beginn der Anwendung - DOM.buttonNext.addEventListener('click', onClickNext); - DOM.buttonPrev.addEventListener('click', onClickPrev); - window.addEventListener('keyup', onKeyUp); - }; - - // === EVENTHANDLER ===== - const onKeyUp = (e) => { - // Übung 8.3 && 8.4 Tastatursteuerung - }; - - const onClickNext = (e) => { - showMessageByNumber((DOM.progressBar.value += 1)); - }; - const onClickPrev = (e) => { - showMessageByNumber((DOM.progressBar.value -= 1)); - }; - // === XHR/FETCH ======== - - // === FUNCTIONS ======== - const showMessageByNumber = (n) => { - DOM.newsboardContent.innerHTML = MESSAGES[n - 1]; - }; - - const initProgressbar = () => { - DOM.progressBar.max = MESSAGES.length; - DOM.progressBar.value = 1; - }; - - init(); -})(); diff --git a/03_dom/unterricht/tag23/04_newsboard-refactored/assets/js/messages.js b/03_dom/unterricht/tag23/04_newsboard-refactored/assets/js/messages.js deleted file mode 100644 index 0b78d36..0000000 --- a/03_dom/unterricht/tag23/04_newsboard-refactored/assets/js/messages.js +++ /dev/null @@ -1,19 +0,0 @@ -// Konfigurationsvariablen - -const MESSAGES = [ - `

      Tutors are on a strike!!!

      -

      All assignmnent are automatically graded with 0 points

      -

      Duis pretium ornare odio nec cursus. Nulla quis dolor vitae nulla condimentum maximus nec vitae purus. Curabitur ut mi non nulla molestie porta. Curabitur dignissim lacinia condimentum. In hac habitasse platea dictumst. Mauris ut urna magna. Mauris venenatis eu quam nec posuere. Nulla facilisi. Donec convallis sodales massa, et consequat nunc vehicula malesuada.

      - `, - - `

      Madness!

      -

      How to earn a fortune, with a complete stupid idea

      -

      Ut molestie elementum risus, eget rutrum dui tristique id. Duis ac elit a mi convallis lacinia. Sed at ultricies magna. Pellentesque nisl est, mattis eget porta eu, rhoncus in urna. Integer faucibus lectus nec malesuada tempus. Duis consectetur sollicitudin ultricies. Cras massa nulla, aliquet vitae interdum quis, venenatis at quam.

      - `, - - `

      I did something, and you will never guess what happened next...

      -

      Donec tristique, leo at suscipit pellentesque, mauris neque congue leo!

      -

      Aenean egestas mauris at neque egestas hendrerit id ut erat. Donec iaculis ornare gravida. Vestibulum condimentum, tortor nec eleifend consectetur, justo lacus dignissim ante, eget commodo enim urna sollicitudin arcu. Odio eu leo pulvinar rutrum sed a turpis. Nunc dui tortor, rutrum vitae gravida quis, hendrerit a massa. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas

      -

      Integer non venenatis tellus. Phasellus tellus leo, suscipit ac vulputate non, varius nec eros. Etiam scelerisque nisi arcu, interdum tempus dui volutpat vel. Donec eget posuere nulla. Etiam ornare dapibus tortor, ac sollicitudin nisi porta a. Donec tristique, leo at suscipit pellentesque, mauris neque congue leo, sed tempor massa justo a ligula. Curabitur vitae rhoncus lacus, quis varius felis. Ut tincidunt sit amet nisl finibus tempus. Curabitur mollis sit amet leo a sagittis.

      - `, -]; diff --git a/03_dom/unterricht/tag23/04_newsboard-refactored/index.html b/03_dom/unterricht/tag23/04_newsboard-refactored/index.html deleted file mode 100644 index d4137ff..0000000 --- a/03_dom/unterricht/tag23/04_newsboard-refactored/index.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - Newsboard - - - - - - - - - -
      -
      - X - - × - -
      - -
      - - - - - - - - - - - - - -
      -
      -
      - - diff --git a/03_dom/unterricht/tag23/05_progress-element/index.html b/03_dom/unterricht/tag23/05_progress-element/index.html deleted file mode 100644 index 0fb7952..0000000 --- a/03_dom/unterricht/tag23/05_progress-element/index.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - HTML5 - Progress Element | IDL vs. Content-Attribut - - - -
      -
      -

      HTML5 - Progress Element | IDL vs. Content-Attribut

      -
      -
      -
      -
      -
      - - -
      -
      - -
      - -
      -
      -
      - - -
      -
      - -
      - -
      -
      -
      - - - diff --git a/03_dom/unterricht/tag23/06_attribut-boolean/index.html b/03_dom/unterricht/tag23/06_attribut-boolean/index.html deleted file mode 100644 index 59b7e61..0000000 --- a/03_dom/unterricht/tag23/06_attribut-boolean/index.html +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - IDL (mit Boolean) vs Content Attribute (get|setAttribute) - - - -
      -
      -

      IDL (mit Boolean) vs Content Attribute (get|setAttribute)

      -
      -
      -
      - -
      - -
      - -
      - -
      - - - -
      - - - -
      - - - - - - -
      -
      -
      - - - diff --git a/03_dom/unterricht/tag24/01_style-font-size/assets/js/main.js b/03_dom/unterricht/tag24/01_style-font-size/assets/js/main.js deleted file mode 100644 index dcaae50..0000000 --- a/03_dom/unterricht/tag24/01_style-font-size/assets/js/main.js +++ /dev/null @@ -1,105 +0,0 @@ -'use strict'; - -(() => { - const $ = (qs) => document.querySelector(qs); - const $$ = (qs) => Array.from(document.querySelectorAll(qs)); - - // === DOM & VARS ======= - const SMALL = 14; - const NORMAL = 16; - const BIG = 24; - const VERY_LARGE = 36; - - const DOM = { - // btnVeryLarge: $('.button-very-large'), - // btnBig: $('.button-big'), - // btnNormal: $('.button-normal'), - // btnSmall: $('.button-small'), - // btnInc: $('.button-increase'), - // btnDec: $('.button-decrease'), - btns: $$('.button-controls button'), - - text: $('p'), - }; - - // === INIT ============= - const init = () => { - // einmalige Zuweisung der Schriftgröße aus Browser oder CSS-Definition - DOM.text.style.fontSize = window.getComputedStyle(DOM.text).fontSize; - - console.log(window.getComputedStyle(DOM.text)); - - console.log(DOM); - // DOM.text.style.color = 'tomato'; - // DOM.text.style.backgroundColor = '#222'; - // DOM.text.style.fontSize = '48px'; - - DOM.btns.forEach((el) => { - el.addEventListener('click', onClickFontSize); - }); - // DOM.btnVeryLarge.addEventListener('click', onClickVeryLarge); - // DOM.btnBig.addEventListener('click', onClickBig); - // DOM.btnNormal.addEventListener('click', onClickNormal); - // DOM.btnSmall.addEventListener('click', onClickSmall); - // DOM.btnInc.addEventListener('click', onClickInc); - // DOM.btnDec.addEventListener('click', onClickDec); - }; - - // === EVENTHANDLER ===== - - const onClickFontSize = (e) => { - const btn = e.currentTarget; - const label = btn.dataset.label; // btn.getAttribute('data-label') - const size = btn.dataset.size; // btn.getAttribute('data-size'); - - switch (label) { - case 'INCREASE': - setFontSizeTo(currentFontSize() + 5); - break; - case 'DECREASE': - setFontSizeTo(currentFontSize() - 5); - break; - default: - setFontSizeTo(size); - - // setFontSizeTo(eval(label)); // eval is evil -> 'VERY_LARGE' -> eval('VERY_LARGE') -> VERY_LARGE <- die Konfigurationsvariable - } - }; - // const onClickVeryLarge = (e) => { - // console.log('click'); - // setFontSizeTo(VERY_LARGE); - // }; - // const onClickBig = (e) => { - // console.log('click'); - // setFontSizeTo(BIG); - // }; - // const onClickNormal = (e) => { - // console.log('click'); - // setFontSizeTo(NORMAL); - // }; - // const onClickSmall = (e) => { - // console.log('click'); - // setFontSizeTo(SMALL); - // }; - - // const onClickInc = (e) => { - // setFontSizeTo(currentFontSize() + 5); - // }; - // const onClickDec = (e) => { - // setFontSizeTo(currentFontSize() - 5); - // }; - - // === XHR/FETCH ======== - - // === FUNCTIONS ======== - const setFontSizeTo = (size) => { - DOM.text.style.fontSize = `${size}px`; - }; - - const currentFontSize = () => { - // return parseInt(window.getComputedStyle(DOM.text).fontSize); // => '16px' -> 16 - return parseInt(DOM.text.style.fontSize); // => '16px' -> 16 - }; - - init(); -})(); diff --git a/03_dom/unterricht/tag24/01_style-font-size/index.html b/03_dom/unterricht/tag24/01_style-font-size/index.html deleted file mode 100644 index 3c5ca09..0000000 --- a/03_dom/unterricht/tag24/01_style-font-size/index.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - Style Font-Size (Beispiel) - - - - - -
      -
      -

      Style Font-Size (Beispiel)

      -
      - -
      -

      - Lorem ipsum dolor sit amet consectetur adipisicing elit. Esse eveniet, voluptatem sint enim culpa dicta - accusamus maiores consequuntur quisquam nisi, itaque voluptas, corrupti velit. Adipisci quo suscipit, - repellendus, necessitatibus modi dolore inventore incidunt, tenetur odit numquam dolorum saepe doloribus - voluptatum eaque in quisquam neque. Nemo animi facere ipsam earum ipsa tempore porro, exercitationem debitis - perspiciatis quisquam ut ea eum. Ea quia delectus odit labore atque nesciunt esse voluptatibus reiciendis - saepe nam provident aspernatur sapiente cumque, incidunt quasi neque dignissimos impedit amet sequi aut - minus optio aliquam officiis. Deserunt dolorem quod, in voluptas sunt, praesentium tenetur ullam dolore - doloremque repudiandae reiciendis veniam debitis eaque nobis quisquam ex quibusdam fugit. Ullam nemo tenetur - perferendis iusto neque fugit excepturi, dolorum ab totam maiores ut aspernatur? Cumque dicta dolore - mollitia, porro sit hic tenetur error voluptate facere iste nisi natus? Libero quaerat ullam explicabo modi - beatae eveniet, aliquid debitis facere enim id rem illum nobis sequi hic quasi. In qui et illo officiis, - animi doloremque ipsa harum, natus voluptate quod, voluptatum architecto doloribus asperiores cupiditate. - Tenetur fuga tempore voluptatum illo velit, sed nemo commodi. Unde perspiciatis aspernatur est iusto - quisquam, magni quibusdam accusantium illo laborum nesciunt laboriosam. Quam reiciendis et ipsum sequi dolor - minus aspernatur commodi repellat, aut vero expedita libero quod consequatur! Explicabo temporibus dolore - nihil labore fugit nisi velit veniam dignissimos aperiam id eaque blanditiis, expedita voluptas inventore. - Quisquam minus consequuntur ipsum eos, pariatur fuga minima eaque, temporibus illo placeat dignissimos - laborum maiores incidunt. Dignissimos delectus eum nostrum fuga hic cum aut nesciunt eveniet, cumque ut - beatae officiis et minus vero soluta accusamus corporis aliquam eligendi. Ad, qui ipsum. Distinctio - temporibus ea sequi dignissimos voluptatum quidem! Consequuntur, veniam odit exercitationem sint a - blanditiis voluptatibus quae doloribus adipisci cupiditate, dignissimos placeat asperiores, vel at enim - impedit id debitis! Provident asperiores reprehenderit sit nesciunt? -

      -
      -
      -
      - - diff --git a/03_dom/unterricht/tag24/02_tooltip/assets/css/tooltips.css b/03_dom/unterricht/tag24/02_tooltip/assets/css/tooltips.css deleted file mode 100644 index e8da8f2..0000000 --- a/03_dom/unterricht/tag24/02_tooltip/assets/css/tooltips.css +++ /dev/null @@ -1,45 +0,0 @@ -p { - font-size: 1.5em; -} - -.keyword { - font-weight: bolder; - color: #225; -} - -#tooltip { - width: 250px; - border: 2px solid #339; - padding: 1rem; - background-color: rgba(238, 238, 255, 0.9); - - font-size: 1em; - text-align: justify; - - position: absolute; - display: flex; - justify-content: center; - align-items: center; -} - -.show { - display: block !important; - animation-name: fadeIn; - animation-duration: 0.4s; - animation-fill-mode: both; -} -.hide { - display: none !important; -} - -@keyframes fadeIn { - 0% { - opacity: 0; - transform: translate3d(0, 20%, 0); - } - 100% { - opacity: 1; - - transform: translate3d(0, 0, 0); - } -} diff --git a/03_dom/unterricht/tag24/02_tooltip/assets/js/tooltips.js b/03_dom/unterricht/tag24/02_tooltip/assets/js/tooltips.js deleted file mode 100644 index 936e985..0000000 --- a/03_dom/unterricht/tag24/02_tooltip/assets/js/tooltips.js +++ /dev/null @@ -1,57 +0,0 @@ -'use strict'; - -(() => { - const $ = (qs) => document.querySelector(qs); - const $$ = (qs) => Array.from(document.querySelectorAll(qs)); - - // === DOM & VARS ======= - const DOM = { - keywords: $$('.keyword'), - tooltip: $('#tooltip'), - }; - - const MOUSE_OFFSET_Y = 20; - const MOUSE_OFFSET_X = 10; - - // === INIT ============= - const init = () => { - DOM.keywords.forEach((el) => { - el.addEventListener('mousemove', onMouseMoveKeyword); - el.addEventListener('mouseleave', onMouseLeaveKeyword); - }); - }; - - // === EVENTHANDLER ===== - const onMouseMoveKeyword = (e) => { - const keywordEl = e.currentTarget; - - DOM.tooltip.style.top = `${e.clientY + MOUSE_OFFSET_Y}px`; - DOM.tooltip.style.left = `${e.clientX + MOUSE_OFFSET_X}px`; - - showTooltip(keywordEl); - }; - // === EVENTHANDLER ===== - const onMouseLeaveKeyword = (e) => { - hideTooltip(); - }; - - // === XHR/FETCH ======== - - // === FUNCTIONS ======== - const showTooltip = (el) => { - const text = el.dataset.tooltip; - - DOM.tooltip.textContent = text; - - // DOM.tooltip.style.display = 'block'; - DOM.tooltip.classList.add('show'); - DOM.tooltip.classList.remove('hide'); - }; - const hideTooltip = () => { - // DOM.tooltip.style.display = 'none'; - DOM.tooltip.classList.add('hide'); - DOM.tooltip.classList.remove('show'); - }; - - init(); -})(); diff --git a/03_dom/unterricht/tag24/02_tooltip/index.html b/03_dom/unterricht/tag24/02_tooltip/index.html deleted file mode 100644 index a720f6a..0000000 --- a/03_dom/unterricht/tag24/02_tooltip/index.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - Tooltips - - - - - -

      Quantum Entanglement Mugs

      -

      DRINK IN SYNC.

      - -

      - In the realm of - quantum mechanics , particles can be - - entangled - - in such a way that the state of one instantly influences the state of another, no matter the distance. This - phenomenon fascinates physicists and challenges our understanding of reality. Imagine sipping your coffee from a - mug that celebrates this - - quantum - - wonder. Just like entangled particles, you and a friend can share a connection over any distance with these mugs. - Introducing the Quantum Entanglement Mugs. -

      - -

      - Each set of Quantum Entanglement Mugs includes two ceramic mugs designed to reflect - the concept of entanglement. Share one with a friend, and no matter how far apart you are, you'll feel connected. - Use them at your next physics meetup, and your colleagues will appreciate your thoughtful nod to quantum theory. - Enjoy your coffee! -

      -
      - Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quis voluptates, veniam facere laudantium. -
      - - diff --git a/03_dom/unterricht/tag24/03_auslesen-width-position/index.html b/03_dom/unterricht/tag24/03_auslesen-width-position/index.html deleted file mode 100644 index e94bc60..0000000 --- a/03_dom/unterricht/tag24/03_auslesen-width-position/index.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - Auslesen von Breite, Höhe und Postion - - - - - -
      -
      -

      Auslesen von Breite, Höhe und Postion

      -
      -
      -
      - - - diff --git a/03_dom/unterricht/tag24/04_data-attribute/index.html b/03_dom/unterricht/tag24/04_data-attribute/index.html deleted file mode 100644 index 6a76006..0000000 --- a/03_dom/unterricht/tag24/04_data-attribute/index.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - Eigene Attribute mit data-[ATTRIBUT_NAME] - DOMStringMap - - - -
      -
      -

      Eigene Attribute mit data-[ATTRIBUT_NAME] - DOMStringMap

      -

      - DOMStringMap - - Die DOMStringMap-Schnittstelle wird für das HTMLElement.dataset-Attribut verwendet, um Daten - für benutzerdefinierte Attribute darzustellen, die zu Elementen hinzugefügt werden. -

      -
      - -

      - Lorem ipsum dolor sit - cerebral cortex - - amet consectetur adipisicing elit. Harum voluptatem iure earum suscipit nihil! Recusandae pariatur corporis - odit optio excepturi labore dolore non, expedita temporibus adipisci vero, modi magnam veritatis? -

      - -
      -
      - - - diff --git a/03_dom/unterricht/tag25/01_product-manager/.gitignore b/03_dom/unterricht/tag25/01_product-manager/.gitignore deleted file mode 100644 index 4073eac..0000000 --- a/03_dom/unterricht/tag25/01_product-manager/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -node_modules/ -dist/ -.env -.env.local -.env.*.local -.DS_Store -*.log -.vite/ -coverage/ -.idea/ -# .vscode/ diff --git a/03_dom/unterricht/tag25/01_product-manager/assets/css/main.css b/03_dom/unterricht/tag25/01_product-manager/assets/css/main.css deleted file mode 100644 index 1a93676..0000000 --- a/03_dom/unterricht/tag25/01_product-manager/assets/css/main.css +++ /dev/null @@ -1,34 +0,0 @@ -*, -html { - box-sizing: border-box; -} - -html, -body { - margin: 0; - padding: 0; - height: 100%; -} - -body { - background-color: #efefef; -} - -/* Mobile first */ -.product-manager table tfoot .row > * { - margin-bottom: 1rem; -} - -@media (min-width: 992px) { - .product-manager table tfoot .row > * { - margin-bottom: 0; - } -} - -.product-manager table .th-actions { - width: 150px; -} - -.product-manager table tbody td button { - margin: 3px; -} diff --git a/03_dom/unterricht/tag25/01_product-manager/assets/js/main.js b/03_dom/unterricht/tag25/01_product-manager/assets/js/main.js deleted file mode 100644 index e43a210..0000000 --- a/03_dom/unterricht/tag25/01_product-manager/assets/js/main.js +++ /dev/null @@ -1,181 +0,0 @@ -'use strict'; - -(() => { - // === DOM & VARS ======= - - const module = document.querySelector('.product-manager') || console.error('Product Manager not found'); - - if (!module) return; - - const DOM = { - module, - table: module.querySelector('.table-products'), - tBody: module.querySelector('tbody'), - inputName: module.querySelector('.input-product-name'), - inputPrice: module.querySelector('.input-product-price'), - btnAdd: module.querySelector('.button-product-add'), - }; - - console.log(DOM); - - // === INIT ============= - const init = () => { - console.log('init'); - // Funktionaufrufe zu beginn der Anwendung - initProducts(); - // Event-Lauscher zu beginn der Anwendung - DOM.btnAdd.addEventListener('click', onClickAdd); - }; - - // === EVENTHANDLER ===== - const onClickAdd = (e) => { - console.log('click'); - - const product = { - name: DOM.inputName.value, - price: Number(DOM.inputPrice.value), - }; - - addProduct(product); - }; - - const onClickRemove = (e) => { - const btnEl = e.currentTarget; - const currentRowEl = btnEl.parentNode.parentNode; // parentNode -> td - parentNode -> tr - - currentRowEl.remove(); // kein IE11 support - // DOM.tBody.removeChild(currentRowEl); - }; - - const onClickMoveUp = (e) => { - const btnEl = e.currentTarget; - const currentRowEl = btnEl.parentNode.parentNode; // aktuelle Zeile (tr) mit dem Button - - // ParentNode.insertBefore(referenceElement, targetElement) - DOM.tBody.insertBefore(currentRowEl, currentRowEl.previousElementSibling); - - console.log('move up'); - }; - - const onClickMoveDown = (e) => { - const btnEl = e.currentTarget; - const currentRowEl = btnEl.parentNode.parentNode; // aktuelle Zeile (tr) mit dem Button - - // ParentNode.insertBefore(referenceElement, targetElement) - DOM.tBody.insertBefore(currentRowEl, currentRowEl.nextElementSibling.nextElementSibling); - console.log('move down'); - }; - - // === XHR/FETCH ======== - - // === FUNCTIONS ======== - const initProducts = () => { - PRODUCTS.forEach((product) => { - addProduct(product); - }); - - // PRODUCTS.forEach(addProduct); - }; - - const addProduct = (product) => { - const { name, price } = product; - - const tdName = createTd(name, 'td-name'); - const tdPrice = createTd(price, 'td-price'); - const tdActions = createTdWithActions(); - - const trEl = createTr(tdName, tdPrice, tdActions); - - DOM.tBody.appendChild(trEl); // Im DOM hinzufügen - }; - - const createTdWithActions = () => { - const td = document.createElement('td'); - td.classList.add('td-actions'); - - const btnRemove = createButtonRemove(); - const btnMoveUp = createButtonMoveUp(); - const btnMoveDown = createButtonMoveDown(); - - // td.append(btnRemove, btnMoveUp, btnMoveDown) - td.appendChild(btnRemove); - td.appendChild(btnMoveUp); - td.appendChild(btnMoveDown); - - return td; - }; - - const createButtonRemove = () => { - const btn = document.createElement('button'); - const icon = document.createElement('i'); - const span = document.createElement('span'); - - btn.classList.add('btn', 'btn-sm', 'btn-danger', 'button-product-remove'); - icon.classList.add('fas', 'fa-trash-can'); - span.classList.add('visually-hidden'); - span.textContent = 'Remove Product'; - - btn.addEventListener('click', onClickRemove); - // btn.append(icon,span) - btn.appendChild(icon); - btn.appendChild(span); - - return btn; - }; - - const createButtonMoveUp = () => { - const btn = document.createElement('button'); - const icon = document.createElement('i'); - const span = document.createElement('span'); - - btn.classList.add('btn', 'btn-sm', 'btn-secondary', 'button-product-move-up'); - icon.classList.add('fas', 'fa-caret-up'); - span.classList.add('visually-hidden'); - span.textContent = 'Move Up'; - - btn.addEventListener('click', onClickMoveUp); - // btn.append(icon,span) - btn.appendChild(icon); - btn.appendChild(span); - - return btn; - }; - - const createButtonMoveDown = () => { - const btn = document.createElement('button'); - const icon = document.createElement('i'); - const span = document.createElement('span'); - - btn.classList.add('btn', 'btn-sm', 'btn-secondary', 'button-product-move-down'); - icon.classList.add('fas', 'fa-caret-down'); - span.classList.add('visually-hidden'); - span.textContent = 'Move Down'; - - btn.addEventListener('click', onClickMoveDown); - // btn.append(icon,span) - btn.appendChild(icon); - btn.appendChild(span); - - return btn; - }; - - const createTd = (text, className = '') => { - const td = document.createElement('td'); - td.classList.add(className); - td.textContent = text; - - return td; - }; - - const createTr = (...tds) => { - const tr = document.createElement('tr'); - tr.append(...tds); - - // tds.forEach((td) => { - // tr.appendChild(td); - // }); - return tr; - }; - - init(); -})(); diff --git a/03_dom/unterricht/tag25/01_product-manager/data/products.js b/03_dom/unterricht/tag25/01_product-manager/data/products.js deleted file mode 100644 index 940c04c..0000000 --- a/03_dom/unterricht/tag25/01_product-manager/data/products.js +++ /dev/null @@ -1,7 +0,0 @@ -// Konfigurationsvariable -const PRODUCTS = [ - { name: '3Doodler 3D Printing Pen', price: 29.99 }, - { name: 'Powerstation 5- E. Maximus Chargus', price: 44.95 }, - { name: '8-Bit Legendary Hero Heat-Change Mug', price: 6.99 }, - { name: '16-Bit Legendary Hero Heat-Change Mug', price: 10.99 }, -]; diff --git a/03_dom/unterricht/tag25/01_product-manager/data/products.json b/03_dom/unterricht/tag25/01_product-manager/data/products.json deleted file mode 100644 index 67e8369..0000000 --- a/03_dom/unterricht/tag25/01_product-manager/data/products.json +++ /dev/null @@ -1,5 +0,0 @@ -[ - { "name": "3Doodler 3D Printing Pen", "price": 29.99 }, - { "name": "Powerstation 5- E. Maximus Chargus", "price": 44.95 }, - { "name": "8-Bit Legendary Hero Heat-Change Mug", "price": 6.99 } -] diff --git a/03_dom/unterricht/tag25/01_product-manager/index.html b/03_dom/unterricht/tag25/01_product-manager/index.html deleted file mode 100644 index a10c3ad..0000000 --- a/03_dom/unterricht/tag25/01_product-manager/index.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - Product Manager - - - - - - - -
      -
      -
      - - - - - - - - - - - - - - - - - -
      NamePrice in €Actions
      -
      -
      - -
      - -
      -
      - - -
      -
      - -
      - -
      -
      - -
      -
      -
      -
      - - diff --git a/03_dom/unterricht/tag25/01_product-manager/package.json b/03_dom/unterricht/tag25/01_product-manager/package.json deleted file mode 100644 index 26b0799..0000000 --- a/03_dom/unterricht/tag25/01_product-manager/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "01_product-manager", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "type": "module" -} diff --git a/03_dom/unterricht/tag25/02_dom-creation/index.html b/03_dom/unterricht/tag25/02_dom-creation/index.html deleted file mode 100644 index 493cdbd..0000000 --- a/03_dom/unterricht/tag25/02_dom-creation/index.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - DOM Creation - - - - -
      -
      -

      DOM Creation

      -
      -
        -
      • Listenpunkt 01
      • -
      • Listenpunkt 02
      • -
      • Listenpunkt 03
      • -
      • Listenpunkt 04
      • -
      -
      -
      - - - diff --git a/03_dom/unterricht/tag26/01_product-manager-final/.gitignore b/03_dom/unterricht/tag26/01_product-manager-final/.gitignore deleted file mode 100644 index 4073eac..0000000 --- a/03_dom/unterricht/tag26/01_product-manager-final/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -node_modules/ -dist/ -.env -.env.local -.env.*.local -.DS_Store -*.log -.vite/ -coverage/ -.idea/ -# .vscode/ diff --git a/03_dom/unterricht/tag26/01_product-manager-final/assets/css/main.css b/03_dom/unterricht/tag26/01_product-manager-final/assets/css/main.css deleted file mode 100644 index 1a93676..0000000 --- a/03_dom/unterricht/tag26/01_product-manager-final/assets/css/main.css +++ /dev/null @@ -1,34 +0,0 @@ -*, -html { - box-sizing: border-box; -} - -html, -body { - margin: 0; - padding: 0; - height: 100%; -} - -body { - background-color: #efefef; -} - -/* Mobile first */ -.product-manager table tfoot .row > * { - margin-bottom: 1rem; -} - -@media (min-width: 992px) { - .product-manager table tfoot .row > * { - margin-bottom: 0; - } -} - -.product-manager table .th-actions { - width: 150px; -} - -.product-manager table tbody td button { - margin: 3px; -} diff --git a/03_dom/unterricht/tag26/01_product-manager-final/assets/js/main.js b/03_dom/unterricht/tag26/01_product-manager-final/assets/js/main.js deleted file mode 100644 index 908cd70..0000000 --- a/03_dom/unterricht/tag26/01_product-manager-final/assets/js/main.js +++ /dev/null @@ -1,285 +0,0 @@ -'use strict'; - -(() => { - // === DOM & VARS ======= - - const module = document.querySelector('.product-manager') || console.error('Product Manager not found'); - - if (!module) return; - - const DOM = { - module, - table: module.querySelector('.table-products'), - tBody: module.querySelector('tbody'), - inputName: module.querySelector('.input-product-name'), - inputPrice: module.querySelector('.input-product-price'), - btnAdd: module.querySelector('.button-product-add'), - }; - - console.log(DOM); - - // === INIT ============= - const init = () => { - console.log('init'); - // Funktionaufrufe zu beginn der Anwendung - initProducts(); - - // Event-Lauscher zu beginn der Anwendung - DOM.btnAdd.addEventListener('click', onClickAdd); - }; - - // === EVENTHANDLER ===== - const onClickAdd = (e) => { - console.log('click'); - - const product = { - name: DOM.inputName.value, - price: Number(DOM.inputPrice.value), - }; - - addProduct(product); - - disableNonFunctionalButtons(); - }; - - const onClickRemove = (e) => { - const btnEl = e.currentTarget; - //const currentRowEl = btnEl.parentNode.parentNode; // parentNode -> td - parentNode -> tr - // MDN https://developer.mozilla.org/de/docs/Web/API/Element/closest - //const currentRowEl = btnEl.closest('tr'); - - const currentRowEl = parents(btnEl, 'tr')[0]; - - currentRowEl.remove(); // kein IE11 support - // DOM.tBody.removeChild(currentRowEl); - disableNonFunctionalButtons(); - }; - - const onClickMoveUp = (e) => { - const btnEl = e.currentTarget; - // const currentRowEl = btnEl.parentNode.parentNode; // aktuelle Zeile (tr) mit dem Button - const currentRowEl = parents(btnEl, 'tr')[0]; - - // ParentNode.insertBefore(referenceElement, targetElement) - // DOM.tBody.insertBefore(currentRowEl, currentRowEl.previousElementSibling); - - // targetElement.before(referenceElement) - currentRowEl.previousElementSibling.before(currentRowEl); - - console.log('move up'); - disableNonFunctionalButtons(); - }; - - const onClickMoveDown = (e) => { - const btnEl = e.currentTarget; - // const currentRowEl = btnEl.parentNode.parentNode; // aktuelle Zeile (tr) mit dem Button - const currentRowEl = parents(btnEl, 'tr')[0]; - - // ParentNode.insertBefore(referenceElement, targetElement) - // DOM.tBody.insertBefore(currentRowEl, currentRowEl.nextElementSibling.nextElementSibling); - - // targetElement.after(referenceElement) - currentRowEl.nextElementSibling.after(currentRowEl); - - console.log('move down'); - disableNonFunctionalButtons(); - }; - - // === XHR/FETCH ======== - - // === FUNCTIONS ======== - const initProducts = () => { - PRODUCTS.forEach((product) => { - addProduct(product); - }); - disableNonFunctionalButtons(); - // PRODUCTS.forEach(addProduct); - }; - - const addProduct = (product) => { - const { name, price } = product; - - const tdName = createTd(name, 'td-name'); - const tdPrice = createTd(price, 'td-price'); - const tdActions = createTdWithActions(); - - const trEl = createTr(tdName, tdPrice, tdActions); - - DOM.tBody.appendChild(trEl); // Im DOM hinzufügen - }; - - const createTdWithActions = () => { - const td = document.createElement('td'); - td.classList.add('td-actions'); - - const btnRemove = createButton({ - classes: ['btn-danger', 'button-product-remove'], - iconName: 'trash-can', - label: 'Remove Product', - clickHandler: onClickRemove, - }); - const btnMoveUp = createButton({ - classes: ['btn-secondary', 'button-product-move-up'], - iconName: 'caret-up', - label: 'Move Up', - clickHandler: onClickMoveUp, - }); - const btnMoveDown = createButton({ - classes: ['btn-secondary', 'button-product-move-down'], - iconName: 'caret-down', - label: 'Move Down', - clickHandler: onClickMoveDown, - }); - - // td.append(btnRemove, btnMoveUp, btnMoveDown) - td.appendChild(btnRemove); - td.appendChild(btnMoveUp); - td.appendChild(btnMoveDown); - - // td.appendChild( - // createButton({ - // classes: ['btn-primary', 'button-login'], - // label: 'login', - // iconName: 'right-to-bracket', - // clickHandler() { - // console.log(`${this.type} process...`); - // }, - // }), - // ); - - return td; - }; - - const createButton = (options = {}) => { - // Destructuring - const { - classes = [], - iconName = 'circle', - label = 'No Label', - clickHandler = () => { - console.log('no action'); - }, - } = options; - - const btn = document.createElement('button'); - const icon = document.createElement('i'); - const span = document.createElement('span'); - - btn.classList.add('btn', 'btn-sm', ...classes); - icon.classList.add('fas', `fa-${iconName}`); - span.classList.add('visually-hidden'); - span.textContent = label; - - btn.addEventListener('click', clickHandler); - // btn.append(icon,span) - btn.appendChild(icon); - btn.appendChild(span); - - return btn; - }; - - // createButton({ - // classes: ['btn-primary', 'button-login-user'], - // iconName: 'right-to-bracket', - // label: 'Login', - // // clickHandler() { - // // console.log(`${this.label} process...`); - // // }, - // clickHandler: () => { - // console.log('login process...'); - // }, - // }); - - // const createButtonRemove = () => { - // const btn = document.createElement('button'); - // const icon = document.createElement('i'); - // const span = document.createElement('span'); - - // btn.classList.add('btn', 'btn-sm', 'btn-danger', 'button-product-remove'); - // icon.classList.add('fas', 'fa-trash-can'); - // span.classList.add('visually-hidden'); - // span.textContent = 'Remove Product'; - - // btn.addEventListener('click', onClickRemove); - // // btn.append(icon,span) - // btn.appendChild(icon); - // btn.appendChild(span); - - // return btn; - // }; - - // const createButtonMoveUp = () => { - // const btn = document.createElement('button'); - // const icon = document.createElement('i'); - // const span = document.createElement('span'); - - // btn.classList.add('btn', 'btn-sm', 'btn-secondary', 'button-product-move-up'); - // icon.classList.add('fas', 'fa-caret-up'); - // span.classList.add('visually-hidden'); - // span.textContent = 'Move Up'; - - // btn.addEventListener('click', onClickMoveUp); - // // btn.append(icon,span) - // btn.appendChild(icon); - // btn.appendChild(span); - - // return btn; - // }; - - // const createButtonMoveDown = () => { - // const btn = document.createElement('button'); - // const icon = document.createElement('i'); - // const span = document.createElement('span'); - - // btn.classList.add('btn', 'btn-sm', 'btn-secondary', 'button-product-move-down'); - // icon.classList.add('fas', 'fa-caret-down'); - // span.classList.add('visually-hidden'); - // span.textContent = 'Move Down'; - - // btn.addEventListener('click', onClickMoveDown); - // // btn.append(icon,span) - // btn.appendChild(icon); - // btn.appendChild(span); - - // return btn; - // }; - - const createTd = (text, className = '') => { - const td = document.createElement('td'); - td.classList.add(className); - td.textContent = text; - - return td; - }; - - const createTr = (...tds) => { - const tr = document.createElement('tr'); - tr.append(...tds); - - // tds.forEach((td) => { - // tr.appendChild(td); - // }); - return tr; - }; - - const disableNonFunctionalButtons = () => { - Array.from(DOM.tBody.querySelectorAll('tr')).forEach((tr) => { - const btnMoveUp = tr.querySelector('.button-product-move-up'); - const btnMoveDown = tr.querySelector('.button-product-move-down'); - - btnMoveUp.disabled = !tr.previousElementSibling; // !(false) -> true | !(true) -> false - btnMoveDown.disabled = !tr.nextElementSibling; - }); - }; - - // Helferfunktion aus jQuery (youmightnotjquery) - const parents = (el, selector) => { - const parents = []; - while ((el = el.parentNode) && el !== document) { - if (!selector || el.matches(selector)) parents.push(el); - } - return parents; - }; - - init(); -})(); diff --git a/03_dom/unterricht/tag26/01_product-manager-final/data/products.js b/03_dom/unterricht/tag26/01_product-manager-final/data/products.js deleted file mode 100644 index 940c04c..0000000 --- a/03_dom/unterricht/tag26/01_product-manager-final/data/products.js +++ /dev/null @@ -1,7 +0,0 @@ -// Konfigurationsvariable -const PRODUCTS = [ - { name: '3Doodler 3D Printing Pen', price: 29.99 }, - { name: 'Powerstation 5- E. Maximus Chargus', price: 44.95 }, - { name: '8-Bit Legendary Hero Heat-Change Mug', price: 6.99 }, - { name: '16-Bit Legendary Hero Heat-Change Mug', price: 10.99 }, -]; diff --git a/03_dom/unterricht/tag26/01_product-manager-final/data/products.json b/03_dom/unterricht/tag26/01_product-manager-final/data/products.json deleted file mode 100644 index 67e8369..0000000 --- a/03_dom/unterricht/tag26/01_product-manager-final/data/products.json +++ /dev/null @@ -1,5 +0,0 @@ -[ - { "name": "3Doodler 3D Printing Pen", "price": 29.99 }, - { "name": "Powerstation 5- E. Maximus Chargus", "price": 44.95 }, - { "name": "8-Bit Legendary Hero Heat-Change Mug", "price": 6.99 } -] diff --git a/03_dom/unterricht/tag26/01_product-manager-final/index.html b/03_dom/unterricht/tag26/01_product-manager-final/index.html deleted file mode 100644 index a10c3ad..0000000 --- a/03_dom/unterricht/tag26/01_product-manager-final/index.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - Product Manager - - - - - - - -
      -
      -
      - - - - - - - - - - - - - - - - - -
      NamePrice in €Actions
      -
      -
      - -
      - -
      -
      - - -
      -
      - -
      - -
      -
      - -
      -
      -
      -
      - - diff --git a/03_dom/unterricht/tag26/01_product-manager-final/package.json b/03_dom/unterricht/tag26/01_product-manager-final/package.json deleted file mode 100644 index 26b0799..0000000 --- a/03_dom/unterricht/tag26/01_product-manager-final/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "01_product-manager", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "type": "module" -} diff --git a/03_dom/unterricht/tag26/02_dom-bereiche/dom-creation.html b/03_dom/unterricht/tag26/02_dom-bereiche/dom-creation.html deleted file mode 100644 index 8111bbb..0000000 --- a/03_dom/unterricht/tag26/02_dom-bereiche/dom-creation.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - DOM Creation - - - -
      -
      -

      DOM Creation

      -
      -
        -
      • Listenpunkt 01
      • -
      • Listenpunkt 02
      • -
      • Listenpunkt 03
      • -
      • Listenpunkt 04
      • -
      -
      -
      - - - diff --git a/03_dom/unterricht/tag26/02_dom-bereiche/dom-manipulation.html b/03_dom/unterricht/tag26/02_dom-bereiche/dom-manipulation.html deleted file mode 100644 index 9826d5c..0000000 --- a/03_dom/unterricht/tag26/02_dom-bereiche/dom-manipulation.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - DOM Manipulation - - - -
      -
      -

      DOM Manipulation

      -
      -
        -
      • Listenpunkt 01
      • -
      • Listenpunkt 02
      • -
      • Listenpunkt 03
      • -
      • Listenpunkt 04
      • -
      -
      -
      - - - diff --git a/03_dom/unterricht/tag26/02_dom-bereiche/dom-selection.html b/03_dom/unterricht/tag26/02_dom-bereiche/dom-selection.html deleted file mode 100644 index 2ad48d4..0000000 --- a/03_dom/unterricht/tag26/02_dom-bereiche/dom-selection.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - DOM Selection - - - -
      -
      -

      DOM Selection

      -
      - -
        -
      • Listenpunkt 01
      • -
      • Listenpunkt 02
      • -
      • Listenpunkt 03
      • -
      • Listenpunkt 04
      • -
      -
      -
      - - - diff --git a/03_dom/unterricht/tag26/02_dom-bereiche/dom-traversal.html b/03_dom/unterricht/tag26/02_dom-bereiche/dom-traversal.html deleted file mode 100644 index c606346..0000000 --- a/03_dom/unterricht/tag26/02_dom-bereiche/dom-traversal.html +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - DOM Traversal - - - -
      -
      -

      DOM Traversal

      -
      - -
        -
      • Listenpunkt 01
      • -
      • Listenpunkt 02
      • -
      • Listenpunkt 03
      • -
      • Listenpunkt 04
      • -
      -
      -
      - - - diff --git a/03_dom/unterricht/tag26/03_text-content-vs-inner-text-vs-inner-html/index.html b/03_dom/unterricht/tag26/03_text-content-vs-inner-text-vs-inner-html/index.html deleted file mode 100644 index 5bd01d0..0000000 --- a/03_dom/unterricht/tag26/03_text-content-vs-inner-text-vs-inner-html/index.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - textContent vs innerText vs innerHTML - - - -
      -
      -

      textContent vs innerText vs innerHTML

      -
      -

      - Lorem ipsum dolor sit, GFN Link amet consectetur adipisicing elit. Amet - tempora repudiandae dicta et libero, ex, quibusdam nisi id atque quaerat nam asperiores laborum hic ipsum - suscipit numquam. Obcaecati vero consequatur repellendus nostrum beatae laborum voluptate aperiam numquam - - VERSTECKT!!!! Lorem ipsum dolor sit amet consectetur adipisicing elit. Obcaecati, commodi. - - iusto optio delectus animi quia quam, provident vitae ex. Accusantium, officiis? Nemo quidem accusantium - voluptatibus cumque voluptates natus, consequatur exercitationem eum eligendi dolor sit nisi. Magni enim omnis - voluptatibus obcaecati aut? Nulla asperiores incidunt atque labore alias quia assumenda molestias, dolores - facilis aspernatur ea quos! Magnam suscipit et, saepe culpa repellat nesciunt repudiandae dignissimos? Nemo - neque nisi repellendus doloribus reiciendis, ducimus quae id? -

      - -
      -
      -
      -
      -
      - - - diff --git a/03_dom/unterricht/tag26/04_outer-html-vs-inner-html/index.html b/03_dom/unterricht/tag26/04_outer-html-vs-inner-html/index.html deleted file mode 100644 index c7e9df0..0000000 --- a/03_dom/unterricht/tag26/04_outer-html-vs-inner-html/index.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - Node.outerHTML vs Node.innerHTML - - - -
      -
      -

      Node.outerHTML vs Node.innerHTML

      -
      -
      - - - diff --git a/03_dom/unterricht/tag26/05_es6-module/assets/js/main.js b/03_dom/unterricht/tag26/05_es6-module/assets/js/main.js deleted file mode 100644 index 94caf9f..0000000 --- a/03_dom/unterricht/tag26/05_es6-module/assets/js/main.js +++ /dev/null @@ -1,35 +0,0 @@ -// 'use strict'; // - nicht mehr notwendig, da JS über type="module" in den strikten Modus gesetzt wird. - -import EigenerName from './modules/Example.js'; // WICHTIG mit Dateiendung ohne JS-Bundler (esbuild, rollup, browserify, parcel, webpack). Es muss der komplette Pfad (absolut oder relativ) mit Dateiendung angegeben werden. - -import { Example as ExampleRenamed, Example2, TAX_RATE } from './modules/examples.js'; - -import Examples from './modules/examples.js'; - -(() => { - // === DOM & VARS ======= - const DOM = {}; - - // === INIT ============= - const init = () => { - EigenerName(); // => init Example - - ExampleRenamed(); // => Example init aus examples - Example2(); // => Example2 init aus examples - console.log(TAX_RATE); // => 1.19 - - Examples.method(); - Examples.method2(); - - console.log(Examples.eigenschaft); //=> 'Wert' - console.log(Examples.text); // => 'Ich bin ein Text' - }; - - // === EVENTHANDLER ===== - - // === XHR/FETCH ======== - - // === FUNCTIONS ======== - - init(); -})(); diff --git a/03_dom/unterricht/tag26/05_es6-module/assets/js/modules/Example.js b/03_dom/unterricht/tag26/05_es6-module/assets/js/modules/Example.js deleted file mode 100644 index 9061616..0000000 --- a/03_dom/unterricht/tag26/05_es6-module/assets/js/modules/Example.js +++ /dev/null @@ -1,9 +0,0 @@ -const Example = () => { - console.log('init Example'); -}; - -// Freigabe in ES6 // import Example from './Example.js' -export default Example; - -// CommonJS ("old" Node) -> require('./Example) -// exports.Example = Example; diff --git a/03_dom/unterricht/tag26/05_es6-module/assets/js/modules/examples.js b/03_dom/unterricht/tag26/05_es6-module/assets/js/modules/examples.js deleted file mode 100644 index d839ec5..0000000 --- a/03_dom/unterricht/tag26/05_es6-module/assets/js/modules/examples.js +++ /dev/null @@ -1,21 +0,0 @@ -export const Example = () => { - console.log('Example init aus examples'); -}; - -export const Example2 = () => { - console.log('Example2 init aus examples'); -}; - -export const TAX_RATE = 1.19; -export const UPDATE_TODO = 'updateTodo'; - -const text = 'Ich bin ein Text'; - -// Default Objekt als Freigabe -export default { - method: Example, - method2: Example2, - eigenschaft: 'Wert', - // text: text - text, // Kurzschreibweise für text: text -}; diff --git a/03_dom/unterricht/tag26/05_es6-module/index.html b/03_dom/unterricht/tag26/05_es6-module/index.html deleted file mode 100644 index b261638..0000000 --- a/03_dom/unterricht/tag26/05_es6-module/index.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - Verwendung von Import - Module in (ES6) - - - - - -
      -
      -

      Verwendung von Import - Module in (ES6)

      -

      - Die statische - import-Statement Deklaration wird verwendet, um schreibgeschützte, dynamische Bindings zu importieren, die von - einem anderen Modul exportiert werden. Die importierten Bindings werden dynamische Bindings genannt, weil sie - durch das Modul, das das Binding exportiert, aktualisiert werden, aber nicht durch das importierende Modul neu - zugewiesen werden können. -

      -

      - Um die import-Deklaration in einer Quelldatei zu verwenden, muss die Datei zur Laufzeit als Modul - interpretiert werden. In HTML geschieht dies, indem type="module" zum - <script>-Tag hinzugefügt wird. Module werden automatisch im Strict Mode interpretiert. -

      - -

      - Es gibt auch eine funktionsähnliche dynamische import(), die keine Skripte des Typs - type="module" erfordert. -

      -
      -

      Um die Modul-Schreibweise in JS zu verwenden, müssen folgende Punkte berücksichtigt werden:

      -
        -
      • Script Tag benötigt Modulangabe mit type="module"
      • -
      • - Kommunikation läuft über über das HTTP-Protokoll (HTTP-Kommunikation lokal über Server) -
      • -
      • Eingebundene Module müssen mit Dateiendung (.js) angegeben werden.
      • -
      -
      -
      - - - diff --git a/03_dom/unterricht/tag26/05_es6-module/package.json b/03_dom/unterricht/tag26/05_es6-module/package.json deleted file mode 100644 index dd68fb5..0000000 --- a/03_dom/unterricht/tag26/05_es6-module/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "05_es6-module", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "start": "npx http-server -c-1 -p 3000" - }, - "keywords": [], - "type": "commonjs" -} diff --git a/03_dom/unterricht/tag26/06_product-manager-tpl-json/.gitignore b/03_dom/unterricht/tag26/06_product-manager-tpl-json/.gitignore deleted file mode 100644 index 4073eac..0000000 --- a/03_dom/unterricht/tag26/06_product-manager-tpl-json/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -node_modules/ -dist/ -.env -.env.local -.env.*.local -.DS_Store -*.log -.vite/ -coverage/ -.idea/ -# .vscode/ diff --git a/03_dom/unterricht/tag26/06_product-manager-tpl-json/assets/css/main.css b/03_dom/unterricht/tag26/06_product-manager-tpl-json/assets/css/main.css deleted file mode 100644 index 1a93676..0000000 --- a/03_dom/unterricht/tag26/06_product-manager-tpl-json/assets/css/main.css +++ /dev/null @@ -1,34 +0,0 @@ -*, -html { - box-sizing: border-box; -} - -html, -body { - margin: 0; - padding: 0; - height: 100%; -} - -body { - background-color: #efefef; -} - -/* Mobile first */ -.product-manager table tfoot .row > * { - margin-bottom: 1rem; -} - -@media (min-width: 992px) { - .product-manager table tfoot .row > * { - margin-bottom: 0; - } -} - -.product-manager table .th-actions { - width: 150px; -} - -.product-manager table tbody td button { - margin: 3px; -} diff --git a/03_dom/unterricht/tag26/06_product-manager-tpl-json/assets/js/main.js b/03_dom/unterricht/tag26/06_product-manager-tpl-json/assets/js/main.js deleted file mode 100644 index 4d93ada..0000000 --- a/03_dom/unterricht/tag26/06_product-manager-tpl-json/assets/js/main.js +++ /dev/null @@ -1,24 +0,0 @@ -import ProductManager from './modules/ProductManager.js'; - -(() => { - // === DOM & VARS ======= - const DOM = { - productManagers: Array.from(document.querySelectorAll('.product-manager')), - }; - - // === INIT ============= - const init = () => { - DOM.productManagers.forEach((el) => { - const pm = ProductManager(el); - // pm.initProducts() - }); - }; - - // === EVENTHANDLER ===== - - // === XHR/FETCH ======== - - // === FUNCTIONS ======== - - init(); -})(); diff --git a/03_dom/unterricht/tag26/06_product-manager-tpl-json/assets/js/modules/ProductManager.js b/03_dom/unterricht/tag26/06_product-manager-tpl-json/assets/js/modules/ProductManager.js deleted file mode 100644 index 12977ce..0000000 --- a/03_dom/unterricht/tag26/06_product-manager-tpl-json/assets/js/modules/ProductManager.js +++ /dev/null @@ -1,171 +0,0 @@ -// Factory Function -const ProductManager = (el = null) => { - // === DOM & VARS ======= - - const module = el || document.querySelector('.product-manager') || console.error('Product Manager not found'); - - if (!module) return; - - const DOM = { - module, - table: module.querySelector('.table-products'), - tBody: module.querySelector('tbody'), - inputName: module.querySelector('.input-product-name'), - inputPrice: module.querySelector('.input-product-price'), - btnAdd: module.querySelector('.button-product-add'), - templateRow: module.querySelector('.template-row'), - }; - - console.log(DOM); - - // === INIT ============= - const init = () => { - console.log('init'); - // Funktionaufrufe zu beginn der Anwendung - initProducts(); - - // Event-Lauscher zu beginn der Anwendung - DOM.btnAdd.addEventListener('click', onClickAdd); - }; - - // === EVENTHANDLER ===== - const onClickAdd = (e) => { - console.log('click'); - - const product = { - name: DOM.inputName.value, - price: Number(DOM.inputPrice.value), - }; - - addProduct(product); - - disableNonFunctionalButtons(); - }; - - const onClickRemove = (e) => { - const btnEl = e.currentTarget; - //const currentRowEl = btnEl.parentNode.parentNode; // parentNode -> td - parentNode -> tr - // MDN https://developer.mozilla.org/de/docs/Web/API/Element/closest - //const currentRowEl = btnEl.closest('tr'); - - const currentRowEl = parents(btnEl, 'tr')[0]; - - currentRowEl.remove(); // kein IE11 support - // DOM.tBody.removeChild(currentRowEl); - disableNonFunctionalButtons(); - }; - - const onClickMoveUp = (e) => { - const btnEl = e.currentTarget; - // const currentRowEl = btnEl.parentNode.parentNode; // aktuelle Zeile (tr) mit dem Button - const currentRowEl = parents(btnEl, 'tr')[0]; - - // ParentNode.insertBefore(referenceElement, targetElement) - // DOM.tBody.insertBefore(currentRowEl, currentRowEl.previousElementSibling); - - // targetElement.before(referenceElement) - currentRowEl.previousElementSibling.before(currentRowEl); - - console.log('move up'); - disableNonFunctionalButtons(); - }; - - const onClickMoveDown = (e) => { - const btnEl = e.currentTarget; - // const currentRowEl = btnEl.parentNode.parentNode; // aktuelle Zeile (tr) mit dem Button - const currentRowEl = parents(btnEl, 'tr')[0]; - - // ParentNode.insertBefore(referenceElement, targetElement) - // DOM.tBody.insertBefore(currentRowEl, currentRowEl.nextElementSibling.nextElementSibling); - - // targetElement.after(referenceElement) - currentRowEl.nextElementSibling.after(currentRowEl); - - console.log('move down'); - disableNonFunctionalButtons(); - }; - - // === XHR/FETCH ======== - const fetchProducts = async () => { - try { - const response = await fetch('data/products.json'); // HTTP Request URL - if (!response.ok) { - throw new Error('Fetch went wrong.'); - } - const data = await response.json(); // HTTP-Response - - return data; - } catch (error) { - console.error(error); - return error; - } - }; - - // === FUNCTIONS ======== - - const initProducts = () => { - fetchProducts().then((products) => { - products.forEach((product) => { - addProduct(product); - }); - disableNonFunctionalButtons(); - }); - - // PRODUCTS.forEach((product) => { - // addProduct(product); - // }); - //disableNonFunctionalButtons(); - // PRODUCTS.forEach(addProduct); - }; - - const addProduct = (product) => { - const { name, price } = product; - - // https://developer.mozilla.org/de/docs/Web/API/HTMLTemplateElement/content - const trEl = DOM.templateRow.content.firstElementChild.cloneNode(true); - - const tdNameEl = trEl.querySelector('.td-name'); - const tdPriceEl = trEl.querySelector('.td-price'); - const btnRemoveEl = trEl.querySelector('.button-product-remove'); - const btnMoveUpEl = trEl.querySelector('.button-product-move-up'); - const btnMoveDownEl = trEl.querySelector('.button-product-move-down'); - - tdNameEl.textContent = name; - tdPriceEl.textContent = price; - - btnRemoveEl.addEventListener('click', onClickRemove); - btnMoveUpEl.addEventListener('click', onClickMoveUp); - btnMoveDownEl.addEventListener('click', onClickMoveDown); - - DOM.tBody.appendChild(trEl); // Im DOM hinzufügen - }; - - const disableNonFunctionalButtons = () => { - Array.from(DOM.tBody.querySelectorAll('tr')).forEach((tr) => { - const btnMoveUp = tr.querySelector('.button-product-move-up'); - const btnMoveDown = tr.querySelector('.button-product-move-down'); - - btnMoveUp.disabled = !tr.previousElementSibling; - btnMoveDown.disabled = !tr.nextElementSibling; - }); - }; - - // Helferfunktion aus jQuery (youmightnotjquery) - const parents = (el, selector) => { - const parents = []; - while ((el = el.parentNode) && el !== document) { - if (!selector || el.matches(selector)) parents.push(el); - } - return parents; - }; - - init(); - - return { - init, - initProducts, - }; -}; - -// Freigabe für import -export default ProductManager; diff --git a/03_dom/unterricht/tag26/06_product-manager-tpl-json/data/products.js b/03_dom/unterricht/tag26/06_product-manager-tpl-json/data/products.js deleted file mode 100644 index 940c04c..0000000 --- a/03_dom/unterricht/tag26/06_product-manager-tpl-json/data/products.js +++ /dev/null @@ -1,7 +0,0 @@ -// Konfigurationsvariable -const PRODUCTS = [ - { name: '3Doodler 3D Printing Pen', price: 29.99 }, - { name: 'Powerstation 5- E. Maximus Chargus', price: 44.95 }, - { name: '8-Bit Legendary Hero Heat-Change Mug', price: 6.99 }, - { name: '16-Bit Legendary Hero Heat-Change Mug', price: 10.99 }, -]; diff --git a/03_dom/unterricht/tag26/06_product-manager-tpl-json/data/products.json b/03_dom/unterricht/tag26/06_product-manager-tpl-json/data/products.json deleted file mode 100644 index 67e8369..0000000 --- a/03_dom/unterricht/tag26/06_product-manager-tpl-json/data/products.json +++ /dev/null @@ -1,5 +0,0 @@ -[ - { "name": "3Doodler 3D Printing Pen", "price": 29.99 }, - { "name": "Powerstation 5- E. Maximus Chargus", "price": 44.95 }, - { "name": "8-Bit Legendary Hero Heat-Change Mug", "price": 6.99 } -] diff --git a/03_dom/unterricht/tag26/06_product-manager-tpl-json/index.html b/03_dom/unterricht/tag26/06_product-manager-tpl-json/index.html deleted file mode 100644 index 82e57d3..0000000 --- a/03_dom/unterricht/tag26/06_product-manager-tpl-json/index.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - Product Manager - - - - - - - -
      - -
      -
      - - - - - - - - - - - - - - - -
      NamePrice in €Actions
      -
      -
      - -
      - -
      -
      - - -
      -
      - -
      - -
      -
      - -
      -
      - - -
      - -
      - - diff --git a/03_dom/unterricht/tag26/06_product-manager-tpl-json/package.json b/03_dom/unterricht/tag26/06_product-manager-tpl-json/package.json deleted file mode 100644 index af9677e..0000000 --- a/03_dom/unterricht/tag26/06_product-manager-tpl-json/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "06_product-manager-tpl-json", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "start": "npx http-server -c-1 -p 3000" - }, - "keywords": [], - "type": "module" -} diff --git a/03_dom/unterricht/tag27/01_drag-drop/index.html b/03_dom/unterricht/tag27/01_drag-drop/index.html deleted file mode 100644 index 781250d..0000000 --- a/03_dom/unterricht/tag27/01_drag-drop/index.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - Drag 'n Drop Example - - - - - -
      -
      -

      Drag 'n Drop Example

      -
      -
      -
      -
      -
      - - - diff --git a/03_dom/unterricht/tag27/02_README.md b/03_dom/unterricht/tag27/02_README.md deleted file mode 100644 index 29f78f0..0000000 --- a/03_dom/unterricht/tag27/02_README.md +++ /dev/null @@ -1 +0,0 @@ -# ProductManager in Webseite integrieren und erweitern (CRUD) diff --git a/03_dom/unterricht/tag28/01_README.md b/03_dom/unterricht/tag28/01_README.md deleted file mode 100644 index 4d6d937..0000000 --- a/03_dom/unterricht/tag28/01_README.md +++ /dev/null @@ -1 +0,0 @@ -**Exkurs: Webserver mit Express + Edit-Funktionalität in Frontend mit Bootstrap** diff --git a/03_dom/unterricht/tag28/o02_website-with-plugins/README.md b/03_dom/unterricht/tag28/o02_website-with-plugins/README.md deleted file mode 100644 index 1179236..0000000 --- a/03_dom/unterricht/tag28/o02_website-with-plugins/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# Optionale Übungen - -## 1. Integration eines weiteren Moduls - -- Intergriere ein weiteres Modul deiner Wahl in die Webseite. (Splide, GlideJS, photoswipe, tiny-slider) - -## 2. Tooltip als Modul verwenden - -Intergriere das Plugin [`popper.js`](https://popper.js.org/docs/v2/) oder die neuere Version [`floating-ui`](https://floating-ui.com/) -in die Webseite. - -## 3. Formularvalidierung als Modul - -Erstelle ein Modul für die Validierung von einem Formular (`FormValidator`) mit folgenden Feldern - -- Vor- und Nachname -- E-Mail -- Adresse bestehend aus: - - Strasse, Hausnummer - - PLZ, Ort - - Land -- Nachricht - -Die Validierung soll direkt während (`input`) oder nach der Eingabe (`blur`) der Felder stattfinden. Die Verwendung von Validierungsmodulen wie `validator` dürfen dabei verwenden werden. diff --git a/03_dom/unterricht/tag29/01_README.md b/03_dom/unterricht/tag29/01_README.md deleted file mode 100644 index 7b3dd7d..0000000 --- a/03_dom/unterricht/tag29/01_README.md +++ /dev/null @@ -1 +0,0 @@ -**Exkurs: Webserver mit Express + REST API + Frontend nach CRUD/BREAD** diff --git a/03_dom/unterricht/tag29/02_routenparameter-queries.zip b/03_dom/unterricht/tag29/02_routenparameter-queries.zip deleted file mode 100644 index 839c90d..0000000 Binary files a/03_dom/unterricht/tag29/02_routenparameter-queries.zip and /dev/null differ diff --git a/03_dom/unterricht/tag29/02_routenparameter-queries/package-lock.json b/03_dom/unterricht/tag29/02_routenparameter-queries/package-lock.json deleted file mode 100644 index abff028..0000000 --- a/03_dom/unterricht/tag29/02_routenparameter-queries/package-lock.json +++ /dev/null @@ -1,874 +0,0 @@ -{ - "name": "02_routenparameter-queries", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "02_routenparameter-queries", - "version": "1.0.0", - "dependencies": { - "chalk": "^5.6.2", - "express": "^5.2.1" - } - }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/body-parser": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", - "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^2.0.0", - "debug": "^4.4.3", - "http-errors": "^2.0.1", - "iconv-lite": "^0.7.2", - "on-finished": "^2.4.1", - "qs": "^6.15.2", - "raw-body": "^3.0.2", - "type-is": "^2.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/body-parser/node_modules/content-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", - "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/content-disposition": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", - "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", - "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.1", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "depd": "^2.0.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/finalhandler": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", - "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/iconv-lite": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", - "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-to-regexp": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", - "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/qs": { - "version": "6.15.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", - "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", - "license": "BSD-3-Clause", - "dependencies": { - "es-define-property": "^1.0.1", - "side-channel": "^1.1.1" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz", - "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/raw-body": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.7.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", - "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.3", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.1", - "mime-types": "^3.0.2", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/serve-static": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", - "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/side-channel": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", - "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4", - "side-channel-list": "^1.0.1", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", - "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/type-is": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz", - "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", - "license": "MIT", - "dependencies": { - "content-type": "^2.0.0", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/type-is/node_modules/content-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", - "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - } - } -} diff --git a/03_dom/unterricht/tag29/02_routenparameter-queries/package.json b/03_dom/unterricht/tag29/02_routenparameter-queries/package.json deleted file mode 100644 index 66decca..0000000 --- a/03_dom/unterricht/tag29/02_routenparameter-queries/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "02_routenparameter-queries", - "version": "1.0.0", - "description": "", - "main": "server.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "type": "module", - "dependencies": { - "chalk": "^5.6.2", - "express": "^5.2.1" - } -} diff --git a/03_dom/unterricht/tag29/02_routenparameter-queries/server.js b/03_dom/unterricht/tag29/02_routenparameter-queries/server.js deleted file mode 100644 index c12e876..0000000 --- a/03_dom/unterricht/tag29/02_routenparameter-queries/server.js +++ /dev/null @@ -1,32 +0,0 @@ -import express from 'express'; -import color from 'chalk'; - -const PORT = 8080; -const HOST = '127.0.0.1'; // 'localhost' -const BASE_URL = `http://${HOST}:${PORT}`; - -const app = express(); - -// Middleware -app.use(express.static('./public')); - -// Routes -app.get('/', (req, res) => { - res.send('Server works..'); -}); - -// http://127.0.0.1:8080/api/flight/NCE-FRA -app.get('/api/flight/:from-:to', (req, res) => { - res.send(req.params); // Routenparameter -}); - -// http://127.0.0.1:8080/api/flights?from=NCE&to=FRA' -app.get('/api/flights', (req, res) => { - res.send(req.query); // Query-Object -}); - -// Server start -app.listen(PORT, HOST, () => { - console.log(color.green(`🚀 SERVER IS RUNNING AT: ${BASE_URL}`)); - console.log(color.yellow('CTRL + C to shutdown')); -}); diff --git a/03_dom/unterricht/tag29/02_routenparameter-queries/test.rest b/03_dom/unterricht/tag29/02_routenparameter-queries/test.rest deleted file mode 100644 index b1623d2..0000000 --- a/03_dom/unterricht/tag29/02_routenparameter-queries/test.rest +++ /dev/null @@ -1,6 +0,0 @@ -GET http://127.0.0.1:8080/api/flight/NCE-FRA - -### - -GET http://127.0.0.1:8080/api/flights?from=NCE&to=FRA - diff --git a/03_dom/unterricht/tag29/o03_website-with-plugins/README.md b/03_dom/unterricht/tag29/o03_website-with-plugins/README.md deleted file mode 100644 index 1179236..0000000 --- a/03_dom/unterricht/tag29/o03_website-with-plugins/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# Optionale Übungen - -## 1. Integration eines weiteren Moduls - -- Intergriere ein weiteres Modul deiner Wahl in die Webseite. (Splide, GlideJS, photoswipe, tiny-slider) - -## 2. Tooltip als Modul verwenden - -Intergriere das Plugin [`popper.js`](https://popper.js.org/docs/v2/) oder die neuere Version [`floating-ui`](https://floating-ui.com/) -in die Webseite. - -## 3. Formularvalidierung als Modul - -Erstelle ein Modul für die Validierung von einem Formular (`FormValidator`) mit folgenden Feldern - -- Vor- und Nachname -- E-Mail -- Adresse bestehend aus: - - Strasse, Hausnummer - - PLZ, Ort - - Land -- Nachricht - -Die Validierung soll direkt während (`input`) oder nach der Eingabe (`blur`) der Felder stattfinden. Die Verwendung von Validierungsmodulen wie `validator` dürfen dabei verwenden werden. diff --git a/03_dom/unterricht/tag30/README.md b/03_dom/unterricht/tag30/README.md deleted file mode 100644 index b27e4d2..0000000 --- a/03_dom/unterricht/tag30/README.md +++ /dev/null @@ -1 +0,0 @@ -**Exkurs: Finalisierung Webseite mit Express + ProduktManager nach CRUD + Verwendung von Modulen** diff --git a/04_typescript/.vscode/extensions.json b/04_typescript/.vscode/extensions.json deleted file mode 100644 index bb659e6..0000000 --- a/04_typescript/.vscode/extensions.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "recommendations": [ - "kamikillerto.vscode-colorize", - "sleistner.vscode-fileutils", - "bierner.github-markdown-preview", - "bradgashler.htmltagwrap", - "zhuangtongfa.material-theme", - "techer.open-in-browser", - "esbenp.prettier-vscode", - "pdconsec.vscode-print", - "vscode-icons-team.vscode-icons", - "formulahendry.auto-rename-tag", - "tomoki1207.pdf" - ] -} diff --git a/04_typescript/.vscode/marp-theme.css b/04_typescript/.vscode/marp-theme.css deleted file mode 100644 index 90ea8da..0000000 --- a/04_typescript/.vscode/marp-theme.css +++ /dev/null @@ -1,332 +0,0 @@ -/* @theme marp-theme */ - -@charset "UTF-8"; -/*! - * Marp Dracula theme. - * @theme marp-theme - * @author Daniel Nicolas Gisolfi & modified by Philippe Botzek - * - * @auto-scaling true - * @size 4:3 960px 720px - * @size 16:9 1280px 720px - */ - -@import url('https://fonts.googleapis.com/css?family=Lato:400,900|IBM+Plex+Sans:400,700'); - -:root { - --dracula-background: #282a36; - --dracula-current-line: #44475a; - --dracula-foreground: #f8f8f2; - --dracula-comment: #6272a4; - --dracula-cyan: #8be9fd; - --dracula-green: #50fa7b; - --dracula-orange: #ffb86c; - --dracula-pink: #ff79c6; - --dracula-purple: #bd93f9; - --dracula-red: #ff5555; - --dracula-yellow: #f1fa8c; -} - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: var(--dracula-background); -} - -/* Dracula Foreground */ -.hljs, -.hljs-subst, -.hljs-typing, -.hljs-variable, -.hljs-template-variable { - color: var(--dracula-foreground); -} - -/* Dracula Comment */ -.hljs-comment, -.hljs-quote, -.hljs-deletion { - color: var(--dracula-comment); -} - -/* Dracula Cyan */ -.hljs-meta .hljs-doctag, -.hljs-built_in, -.hljs-selector-tag, -.hljs-section, -.hljs-link, -.hljs-class { - color: var(--dracula-cyan); -} - -/* Dracula Green */ -.hljs-title { - color: var(--dracula-green); -} - -/* Dracula Orange */ -.hljs-params { - color: var(--dracula-orange); -} - -/* Dracula Pink */ -.hljs-keyword { - color: var(--dracula-pink); -} - -/* Dracula Purple */ -.hljs-literal, -.hljs-number { - color: var(--dracula-purple); -} - -/* Dracula Red */ -.hljs-regexp { - color: var(--dracula-red); -} - -/* Dracula Yellow */ -.hljs-string, -.hljs-name, -.hljs-type, -.hljs-attr, -.hljs-symbol, -.hljs-bullet, -.hljs-addition, -.hljs-template-tag { - color: var(--dracula-yellow); -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-literal, -.hljs-title, -.hljs-section, -.hljs-doctag, -.hljs-type, -.hljs-name, -.hljs-strong { - font-weight: bold; -} - -.hljs-params, -.hljs-emphasis { - font-style: italic; -} - -svg[data-marp-fitting='svg'] { - max-height: 580px; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 0.5em 0 0 0; - color: var(--dracula-pink); -} -h1 strong, -h2 strong, -h3 strong, -h4 strong, -h5 strong, -h6 strong { - font-weight: inherit; -} - -h1 { - font-size: 1.8em; -} - -h2 { - font-size: 1.5em; -} - -h3 { - font-size: 1.3em; -} - -h4 { - font-size: 1.1em; -} - -h5 { - font-size: 1em; -} - -h6 { - font-size: 0.9em; -} - -p, -blockquote { - margin: 1em 0 0 0; -} - -ul > li, -ol > li { - margin: 0.3em 0 0 0; - color: var(--dracula-cyan); -} -ul > li > p, -ol > li > p { - margin: 0.6em 0 0 0; -} - -code { - display: inline-block; - font-family: 'IBM Plex Mono', monospace; - font-size: 0.8em; - letter-spacing: 0; - margin: -0.1em 0.15em; - padding: 0.1em 0.2em; - vertical-align: baseline; - color: var(--dracula-green); -} - -pre { - display: block; - margin: 1em 0 0 0; - min-height: 1em; - overflow: visible; -} -pre code { - box-sizing: border-box; - margin: 0; - min-width: 100%; - padding: 0.5em; - font-size: 0.7em; -} -pre code svg[data-marp-fitting='svg'] { - max-height: calc(580px - 1em); -} - -blockquote { - margin: 1em 0 0 0; - padding: 0 1em; - position: relative; - color: var(--dracula-orange); -} -blockquote::after, -blockquote::before { - content: '“'; - display: block; - font-family: 'Times New Roman', serif; - font-weight: bold; - position: absolute; - color: var(--dracula-green); -} -blockquote::before { - top: 0; - left: 0; -} -blockquote::after { - right: 0; - bottom: 0; - transform: rotate(180deg); -} -blockquote > *:first-child { - margin-top: 0; -} - -mark { - background: transparent; -} - -table { - border-spacing: 0; - border-collapse: collapse; - margin: 1em 0 0 0; -} -table th, -table td { - padding: 0.2em 0.4em; - border-width: 1px; - border-style: solid; -} - -section { - font-size: 35px; - font-family: 'IBM Plex Sans'; - line-height: 1.35; - letter-spacing: 1.25px; - padding: 70px; - color: var(--dracula-foreground); - background-color: var(--dracula-background); -} -section > *:first-child, -section > header:first-child + * { - margin-top: 0; -} -section a, -section mark { - color: var(--dracula-red); -} -section code { - background: var(--dracula-current-line); - color: var(--dracula-current-green); -} -section h1 strong, -section h2 strong, -section h3 strong, -section h4 strong, -section h5 strong, -section h6 strong { - color: var(--dracula-current-line); -} -section pre > code { - background: var(--dracula-current-line); -} -section header, -section footer, -section section::after, -section blockquote::before, -section blockquote::after { - color: var(--dracula-comment); -} -section table th, -section table td { - border-color: var(--dracula-current-line); -} -section table thead th { - background: var(--dracula-current-line); - color: var(--dracula-yellow); -} -section table tbody > tr:nth-child(even) td, -section table tbody > tr:nth-child(even) th { - background: var(--dracula-current-line); -} - -header, -footer, -section::after { - box-sizing: border-box; - font-size: 66%; - height: 70px; - line-height: 50px; - overflow: hidden; - padding: 10px 25px; - position: absolute; - color: var(--dracula-comment); -} - -header { - left: 0; - right: 0; - top: 0; -} - -footer { - left: 0; - right: 0; - bottom: 0; -} - -section::after { - right: 0; - bottom: 0; - font-size: 80%; -} diff --git a/04_typescript/.vscode/settings.json b/04_typescript/.vscode/settings.json deleted file mode 100644 index 3fa021c..0000000 --- a/04_typescript/.vscode/settings.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "workbench.iconTheme": "vscode-icons", - "workbench.colorTheme": "One Dark Pro", - "prettier.printWidth": 120, - "prettier.singleQuote": true, - "editor.hover.enabled": "on", - "editor.wordWrap": "on", - "explorer.confirmDelete": false, - "explorer.confirmDragAndDrop": false, - "editor.quickSuggestionsDelay": 600, - "editor.tabSize": 2, - "editor.formatOnSave": true, - "emmet.includeLanguages": { - "javascript": "javascriptreact", - "ejs": "html" - }, - "html.format.unformatted": "wbr,%", - "files.associations": { - "*.ejs": "html" - }, - "editor.fontFamily": "'MesloLGS NF', Hack, Consolas, 'Courier New', monospace", - "oneDarkPro.markdownStyle": false, - "explorer.compactFolders": false, - "workbench.editor.labelFormat": "short", - "editor.hover.delay": 800, - "editor.bracketPairColorization.enabled": true, - "editor.guides.bracketPairs": "active", - "markdown.marp.themes": ["./.vscode/marp-theme.css"], - "markdown-preview-github-styles.colorTheme": "light" -} diff --git a/04_typescript/.vscode/snippets.code-snippets b/04_typescript/.vscode/snippets.code-snippets deleted file mode 100644 index 259f93d..0000000 --- a/04_typescript/.vscode/snippets.code-snippets +++ /dev/null @@ -1,73 +0,0 @@ -{ - "Output HTML Element": { - "scope": "html", - "prefix": "output", - "body": ["
      "], - "description": "generate a div Element with output alert and alert secondary class" - }, - "Bootstrap html": { - "scope": "html", - "prefix": "!bs", - "body": [ - "", - "", - "\t", - "\t\t", - "\t\t", - "\t\t$0", - "\t\t", - "\t", - "\t", - "\t\t
      ", - "\t\t\t
      ", - "\t\t\t\t

      $0

      ", - "\t\t\t
      ", - "\t\t
      ", - "\t\t", - "\t", - "" - ], - "description": "Generate HTML with Bootstrap CDN and script-tag" - }, - "$ und $$ helper function": { - "scope": "javascript,typescript", - "prefix": "$$$", - "body": [ - "const $ = (qs) => document.querySelector(qs);", - "const $$ = (qs) => Array.from(document.querySelectorAll(qs));" - ], - "description": "$ and $$ shorthand helper function" - }, - - "JavaScript Dateivorlage": { - "scope": "javascript,typescript", - "prefix": "vjs", - "body": [ - "'use strict';", - "", - "(() => {", - "", - "\t// === DOM & VARS =======", - "\tconst DOM = {};", - "", - "\t// === INIT =============", - "\tconst init = () => {", - "", - "\t}", - "", - "\t// === EVENTHANDLER =====", - "", - "\t// === XHR/FETCH ========", - "", - "\t// === FUNCTIONS ========", - "", - "\tinit();", - "", - "})();" - ], - "description": "JavaScript Dateivorlage" - } -} diff --git a/04_typescript/agenda.md b/04_typescript/agenda.md deleted file mode 100644 index f300d65..0000000 --- a/04_typescript/agenda.md +++ /dev/null @@ -1,552 +0,0 @@ ---- -marp: true -theme: default ---- - -## JavaScript Grundlagen Teil 1. - ---- - -#### Tag 01 - -**Inhalt:** - -- Vorstellungsrunde -- Einrichtung der IDE -- Tools für die Webentwicklung (Emmet, Markdown, VS-Code) -- Arbeiten mit VSCode -- Konsolenausgaben mit `console.log()` - -**Übungen:** - -- Übungen Content Factory - ---- - -#### Tag 02 - -**Inhalt:** - -- Dialogfenster in JS `prompt()`, `alert()`, `confirm()` -- Kommentare in JS -- Rechnen in JS -- Datentyp String, Number, Boolean -- literal und typeof -- Prioritätsreihenfolge - -**Übungen:** - -Übung 3 - 6 - ---- - -#### Tag 03 - -**Inhalt:** - -- Variablen und Konstanten in JS -- Zusammengesetzte Zuweisungsoperatoren -- Increment & Decrement -- Strings verketten mit + - -**Übungen:** - -Übung 7 - 12 - ---- - -#### Tag 04 - -**Inhalt:** - -- Escape-Notation -- Implizite und explizite Typkonvertierung -- NaN - Paradoxon -- Math Object -- Number.toFixed() - -**Übungen:** - -Übung 14 - 18 - ---- - -#### Tag 05 - -**Inhalt:** - -- Repetition der Inhalte -- Relationale Operatoren & Vergleichoperatoren -- isNaN -- Lexikographische Vergleiche -- **Exkurs: HTML-Formularfelder** -- 1:1 Meeting - -**Übungen:** - -Übung Kontaktformular mit HTML und BS - ---- - -#### Tag 06 - -**Inhalt:** - -- **Exkurs: HTML Formularfelder mit BS** -- if else Verzweigung und ternärer Operator -- logische Operatoren UND und ODER -- unärer Operator (!) -- String Methoden Part I - -**Übungen:** - -Übung 19 - 26 - ---- - -#### Tag 07 - -**Inhalt:** - -- String Methoden Part II -- Funktionen in JS -- Funktionen mit Übergabeparameter -- Funktionen mit Rückgabewerten - -**Übungen:** - -Übung 26 - 35 - ---- - -#### Tag 08 - -**Inhalt:** - -- Funktionen mit Übergabeparameter -- Funktionen mit Rückgabewerten -- Guards -- Array Part 1 - -**Übungen:** - -Übung 35 - 38 - ---- - -#### Tag 09 - -**Inhalt:** - -- Array Methoden toSorted, toReversed, toSpliced -- toSorted, toReversed -- Array sort mit "compare function" -- Array: Higher Order Funktionen Part (sort map, forEach, reduce, some, every) - -**Übungen:** - -Übung 39 - 48 - ---- - -#### Tag 10 - -**Inhalt:** - -- Array.find und Array.findIndex -- Alle Array Higher Order Funktionen im Überblick -- local scoping -- **Exkurs: Schleifen** - -**Übungen:** - -Übung 46 - 48 - ---- - -## JavaScript für Fortgeschrittene - ---- - -#### Tag 11 - -**Inhalt:** - -- Einführung in JS für Fortgeschrittene -- Objekte in JS - -**Übungen:** - -Projektarbeit -Abschlussquiz - JS Grundlagen - ---- - -#### Tag 12 - -**Inhalt:** - -- Destructuring von Objekten und Arrays -- Rekursion - -**Übungen:** - -Übung 01 - 10 - ---- - -#### Tag 13 - -**Inhalt:** - -- Promises -- Callback-Hell -- Installation von node (npm) und Windows Terminal (für Node) -- **Exkurs: Statische Webseite mit Sass und HTML** -- **Exkurs: Versionierung mit Github Part I** - -**Übungen:** - ---- - -#### Tag 14 - -**Inhalt:** - -- Promise Aufbau -- Promise in Funktionen -- File System von Node -- commonjs vs esm -- async await - -**Übungen:** - -Übung 09 - 11 - ---- - -#### Tag 15 - -**Inhalt:** - -- Wiederholung der Inhalte -- Promise.all() -- **Exkurs: Switch Case Abfragen** -- **Exkurs: Statische Webseite mit Sass und HTML** -- **Exkurs: Versionierung mit Github Part I** -- 1:1 Meeting - ---- - -#### Tag 16 - -**Inhalt:** - -- **Exkurs: Statische Webseite mit Sass und HTML Part II** -- Mehrdimensionale Arrays - -**Übungen:** - -Projektarbeiten -Übungen 11 -13 - ---- - -#### Tag 17 - -**Inhalt:** - -- Chess-Beispiel -- Arbeiten mit Fetch API -- fetch mit Promise und async...await -- Joke API auslesen -- **Exkurs: Versionierung mit Github Part I** - -**Übungen:** - -Übungen 14 - 24 - ---- - -#### Tag 18 - -**Inhalt:** - -- XML-HttpRequest und AJAX mit jQuery -- Node Installation (Wiederholung) -- Node Standardbib - - fs - -**Übungen:** - -Projektarbeit - ---- - -#### Tag 19 - -**Inhalt:** - -- NPM Befehle -- CSV to HTML -- Node Standardbib - - zlib (stream) - - Crypto -- Abschluss von JS für Fortgeschrittene -- Projektvorstellung 1 + 2 - -**Übungen:** - -Übungen 25 - 31 - ---- - -#### Tag 20 - -**Inhalt:** - -- **Einrichtung von Git** -- **Exkurs: Webseite mit Gulp, SASS, HTML/CSS, JS** - -**Übungen:** - -Projektarbeit -Übungen 31 - 32 - ---- - -# JavaScript und das Document Object Model (DOM) - ---- - -#### Tag 21 - -**Inhalt:** - -- Einführung in JS DOM -- DOM Selection (querySelector, querySelectorAll) -- $ & $$ Helper -- CSS Selektoren - -**Übungen:** - -Übungen 01 - 05 - ---- - -#### Tag 22 - -- Defer & Async -- JS Dateien auslagern -- Chat Gestaltung (DOMTokenList Objekt) -- Optimierung von Projektstruktur -- Events in JS MouseEvent, KeyboardEvent - -**Übungen:** - -Übungen 06 - 07 - ---- - -#### Tag 23 - -**Inhalt:** - -- Projekt: Newsboard -- HTML Element Progress -- IDL-Attribut vs. Content-Attribut -- HTML Attribute mit boolescher Zuweisung - -**Übungen:** - -Übung 08 - 10 - ---- - -#### Tag 24 - -**Inhalt:** - -- Tooltip: HTML erweitern mit Data-Attribut -- Dataset Attribut, DOMStringMap Objekt -- getComputedStyle, Attribute mit boolscher Zuweisung - -**Übungen:** - -Übung 11 - 14 - ---- - -#### Tag 25 - -**Inhalt:** - -- DOM Creation - Elemente erstellen -- createElement() & appendChild() -- Projekt: Produktmanager Part I -- DOM Creation Befehle -- Entfernen von Elementen - -**Übungen:** - -Übung 15 - 17 -**Projektarbeit / Content Factory** - ---- - -#### Tag 26 - -**Inhalt:** - -- Import von Modulen in JS (Browserseitig) -- Separation of Concerns -- Projekt: Produktmanager final -- DOM Traversal Befehle & alle DOM Bereiche -- insertBefore(), appendChild(), append(), prepend(), before(), after() -- Refactoring von Produktmanager mit Template - -**Übungen:** - -Übung 18 + optionale Übungen -**Projektarbeit / Content Factory** - ---- - -#### Tag 27 - -**Inhalt:** - -- **Exkurs: Weitere Events: Drag and Drop** -- **Rest API erstellen mit Express** -- JS DOM Projektvorstellung -- Abschlussquiz JS DOM - -**Übungen:** - -Projekte - ---- - -#### Tag 28 - -**Inhalt:** - -- **Exkurs: DOM Inhalte über REST API mit Express Part I** -- **Routing in JS** -- CRUD - Create - (Read) - Update - Delete -- Object Methoden. -- Verwendung von Modulen (Bootstrap) - -**Übungen:** - -Projekte & optionale Übungen - ---- - -#### Tag 29 - -**Inhalt:** - -- **Exkurs: DOM Inhalte über mit REST API Express** -- **Erweiterung Frontend um REST API** -- CRUD - Create - Read - Update - Delete -- BREAD - Browse - Read - Edit - Add - Delete -- Verwendung von Modulen (Modal von BS, Toastify, Splide) - -**Übungen** - -Projekte + weiteres Modul einbinden - ---- - -#### Tag 30 - -- **Projektfinalisierung Express + REST API** -- Einführung in Typescript -- Meeting - ---- - -### Tag 31 - -**Inhalt:** - -- Typescript Grundlagen -- Typescript Annotationen -- Typescript "more Types" - -**Übungen:** - -Übungen 1 - 5 - ---- - -### Tag 32 - -**Inhalt:** - -- Typescript Annotationen -- Primitive Types, Object, Union Types -- type statement vs interface -- Type Assertion with as and <> -- Typescript "more Types" - -**Übungen:** - -Übungen 4 - 9 - ---- - -### Tag 33 - -**Inhalt:** - -- Typescript "more Types" - - Interface, as statement, literale -- Typescript Narrowing with Guards - - truthiness, equality, in-operator, type-predicate -- TS Funktionen und Objekte - -**Übungen:** - -Übungen 10 - 19 - ---- - -### Tag 34 - -**Inhalt:** - -- TS Funktionen und Objekte -- Abschluss TypeScript Grundlagen - -**Übungen:** - -Übungen 20 - 31 -Projektarbeit - ---- - -### Tag 35 - -**Inhalt:** - -- Abschlussquiz -- Projekt-Webseite in TS -- Optimierung mit KI -- 1:1 Meeting - -**Übungen:** - -Projektarbeit - ---- - -### Tag 36 - -**Inhalt:** - -- **Exkurs: Finalisierung Projekt Webseite in TS (Gulp)** - - - diff --git a/04_typescript/docs/TypeScript Classes.pdf b/04_typescript/docs/TypeScript Classes.pdf deleted file mode 100644 index 6f6eeba..0000000 Binary files a/04_typescript/docs/TypeScript Classes.pdf and /dev/null differ diff --git a/04_typescript/docs/TypeScript Control Flow Analysis.pdf b/04_typescript/docs/TypeScript Control Flow Analysis.pdf deleted file mode 100644 index 00cf618..0000000 Binary files a/04_typescript/docs/TypeScript Control Flow Analysis.pdf and /dev/null differ diff --git a/04_typescript/docs/TypeScript Interfaces.pdf b/04_typescript/docs/TypeScript Interfaces.pdf deleted file mode 100644 index cba9bc7..0000000 Binary files a/04_typescript/docs/TypeScript Interfaces.pdf and /dev/null differ diff --git a/04_typescript/docs/TypeScript Types.pdf b/04_typescript/docs/TypeScript Types.pdf deleted file mode 100644 index b3d867c..0000000 Binary files a/04_typescript/docs/TypeScript Types.pdf and /dev/null differ diff --git a/04_typescript/docs/nodejs-installation.md b/04_typescript/docs/nodejs-installation.md deleted file mode 100644 index 862e2c3..0000000 --- a/04_typescript/docs/nodejs-installation.md +++ /dev/null @@ -1,114 +0,0 @@ -## NVM - Node Version Manager - -nvm ist ein Versionsmanager für node.js. Über nvm können mehrere unterschiedliche Node Versionen installiert werden. NVM wird über die Konsole aufgerufen und ist mit verschiedenen Shells kompatibel (sh, dash, ksh, zsh, bash). - -#### Links - -- (Win) -- (Mac OS) - -#### Installation Windows - -1. Lade den NVM-Installer über folgenden Link herunter: -2. Installiere NVM über den [Installer](https://github.com/coreybutler/nvm-windows/releases/download/1.2.2/nvm-setup.zip) -3. Sollte vorher bereits NodeJS global ohne NVM installiert worden sein, wird empfohlen die vorherige NodeJS Version zu [deinstallieren](https://stackoverflow.com/a/55300310). - -### Installation Mac OS - -- Installiere NVM über die Konsole mit: - -```bash -curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash -``` - -- Füge den Pfad zum NVM Ordner zur Shell-Config hinzu. (`~/.bash_profile`, `~/.zshrc`, `~/.profile`, or `~/.bashrc`). - -```bash -export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")" -[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm -``` - -- Aktuelle Informationen zur Installation findet man unter folgendem Link: - -#### Erste Schritte - -Sobald NVM erfolgreich installiert wurde kann man über nvm in der Konsole eine neue Node Version mit folgendem Befehl installieren: - -```bash -nvm install [NODE VERSIONSNUMMER] -``` - -> Hinweis: Die aktuellste Versionsnummer von NodeJS findet man am einfachsten auf der [NodeJS-Seite](https://nodejs.org/en/) - -Installierte Node Versionen auflisten - -```bash -nvm list -``` - -Node Version verwenden/wechseln - -```bash -nvm use [NODE VERSIONSNUMMER] -``` - -Node Version als Standard einrichten - -```bash -nvm alias default [NODE VERSIONSNUMMER] -``` - -## Node.js - -### Definition - -Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. - -## Neues Projekt erstellen - -- Über die Konsole in den Projektordner gehen. - -Projektordner wechsel über "change directory" (cd) - -```bash -cd [projektpfad] -``` - -- Eigene Package.json Datei generieren (nur einmalig bei einem neuen Projekt notwendig.) - -```bash -npm init -``` - -- Module installieren, die nur für die Entwicklung benötigt werden. (devDependicies) - -| Befehl | Zweck | -| ------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------- | -| `npm install Modul@Version` | installiere Modul in der Version Version (semantic versioning) | -| `npm install Modul@Version --save`
      `npm install Modul@Version -S` | Modul wird in der Datei `package.json` unter dependencies hinzugefügt (Mittlerweile default) | -| `npm install Modul@Version --save-dev`
      `npm install Modul@Version -D` | Modul wird in der Datei `package.json` unter devdependencies hinzugefügt | -| `npm install Modul@Version --global`
      `npm install Modul@Version -g` | Modul wird global installiert. (Von jedem Ordner aus anwendbar) | -| `npm uninstall Modul@Version` | entfernt Modul aus `node_modules` | -| `npm uninstall Modul@Version --save` | entfernt Modul aus `node_modules` und aus der dependencies- Eigenschaft in der `package.json`. | -| `npm update Modul` | Aktualisiert Modul auf die neueste Version | -| `npm update Modul --save` |  Aktualisiert Modul auf die neueste Version und auch die Versionsnummer der dependencies- Eigenschaft in der `package.json`. | -| `npm init` | erstellt eine package.json-Datei (der Befehl fragt die Eigenschaften ab) | -| `npm init --yes` | erstellt eine package.json-Datei (der Befehl setzt Default-Werte ein) | -| `npm list` | listet alle installierten Module auf. | -| `npm search` | Suchbegriff sucht Module, deren Namen den Suchbegriff enthält | - -# Globale Module - -## SASS - -### Definition - -> Sass is the most mature, stable, and powerful professional grade CSS extension language in the world. - -Sass ist eine CSS-Preprocessor Sprache. - -```bash -npm install sass -g -``` - -## Liste von verwendeten Modulen diff --git a/04_typescript/docs/nodejs-installation.pdf b/04_typescript/docs/nodejs-installation.pdf deleted file mode 100644 index c12907f..0000000 Binary files a/04_typescript/docs/nodejs-installation.pdf and /dev/null differ diff --git a/04_typescript/faq/describable-fn.js b/04_typescript/faq/describable-fn.js deleted file mode 100644 index cf5f7a9..0000000 --- a/04_typescript/faq/describable-fn.js +++ /dev/null @@ -1,10 +0,0 @@ -const greet = () => { - return 'Hello!'; -}; - -greet.description = 'Function that says hello'; -greet.anotherProp = 'Wert'; - -console.log(greet()); -console.log(greet.description); -console.log(greet.anotherProp); diff --git a/04_typescript/faq/describable-fn.ts b/04_typescript/faq/describable-fn.ts deleted file mode 100644 index e8a0b0b..0000000 --- a/04_typescript/faq/describable-fn.ts +++ /dev/null @@ -1,29 +0,0 @@ -// Type - describable Function -type GreetFn = { - anotherProp: string; - (): void; -}; - -// Type - Object -type Greet = { - prop: string; - greed: () => void; -}; - -const greetObj: Greet = { - prop: 'bin ein objekt', - greed: () => { - console.log('hello'); - }, -}; - -const greet: GreetFn = () => { - return 'Hello!'; -}; - -// greet.description = 'Function that says hello'; -greet.anotherProp = 'Wert'; - -console.log(greet()); -// console.log(greet.description); -console.log(greet.anotherProp); diff --git a/04_typescript/projects/typescript-ecom-manager-template.zip b/04_typescript/projects/typescript-ecom-manager-template.zip deleted file mode 100644 index 9c6a47e..0000000 Binary files a/04_typescript/projects/typescript-ecom-manager-template.zip and /dev/null differ diff --git a/04_typescript/projects/typescript-ecom-manager-template/.gitignore b/04_typescript/projects/typescript-ecom-manager-template/.gitignore deleted file mode 100644 index a547bf3..0000000 --- a/04_typescript/projects/typescript-ecom-manager-template/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/04_typescript/projects/typescript-ecom-manager-template/README.md b/04_typescript/projects/typescript-ecom-manager-template/README.md deleted file mode 100644 index 601f2df..0000000 --- a/04_typescript/projects/typescript-ecom-manager-template/README.md +++ /dev/null @@ -1,17 +0,0 @@ -## License and terms of use - -© Web Professional Institute Inc. All rights reserved. - -This material is provided solely for students enrolled in courses offered by Web Professional Institute Inc. By accessing or using this code, you acknowledge that it is strictly for educational use within the context of Web Professional Institute Inc. programs. - -**Usage Restrictions:** - -- Redistribution, sharing, or copying of this material outside the course environment is strictly prohibited. -- The content is designed to support your learning objectives and is not authorized for commercial projects, public repositories, or applications beyond the course scope. -- Unauthorized commercial use or open-source distribution is strictly prohibited and may result in expulsion from the program and legal action. - -**Agreement & Rights:** - -As a student, you have agreed to these terms as part of your enrollment agreement, which includes additional details on permitted uses, restrictions, and policies. The author and Web Professional Institute Inc. retain all rights to this material, including the code base and instructional content. - -For any questions regarding these terms, please contact Web Professional Institute Inc. for clarification. diff --git a/04_typescript/projects/typescript-ecom-manager-template/assets/index.html b/04_typescript/projects/typescript-ecom-manager-template/assets/index.html deleted file mode 100644 index 0e453f4..0000000 --- a/04_typescript/projects/typescript-ecom-manager-template/assets/index.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - Assignment 02: E-Commerce Product Inventory System - - - - -
      -

      E-Commerce Product Inventory System

      -

      Open the console to see the output

      -
      - - diff --git a/04_typescript/projects/typescript-ecom-manager-template/package-lock.json b/04_typescript/projects/typescript-ecom-manager-template/package-lock.json deleted file mode 100644 index 4c00c4d..0000000 --- a/04_typescript/projects/typescript-ecom-manager-template/package-lock.json +++ /dev/null @@ -1,2393 +0,0 @@ -{ - "name": "ecom-management-system", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "ecom-management-system", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "chalk": "^6.0.0", - "esbuild": "^0.28.2", - "npm-run-all": "^4.1.5" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", - "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", - "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", - "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", - "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", - "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", - "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", - "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", - "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", - "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", - "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", - "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", - "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", - "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", - "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", - "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", - "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", - "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", - "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", - "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", - "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", - "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", - "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", - "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", - "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", - "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", - "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/chalk": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-6.0.0.tgz", - "integrity": "sha512-2uNTXIuTTxk7ciZgAU1BQcgnchcG0xXnrs6jzkQfj9SsRa9M2s5zE8WT96hS6KmG4MzWHSrvH43DF1m4XRkrFg==", - "license": "MIT", - "engines": { - "node": ">=22" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", - "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", - "license": "MIT", - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", - "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/esbuild": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", - "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.28.2", - "@esbuild/android-arm": "0.28.2", - "@esbuild/android-arm64": "0.28.2", - "@esbuild/android-x64": "0.28.2", - "@esbuild/darwin-arm64": "0.28.2", - "@esbuild/darwin-x64": "0.28.2", - "@esbuild/freebsd-arm64": "0.28.2", - "@esbuild/freebsd-x64": "0.28.2", - "@esbuild/linux-arm": "0.28.2", - "@esbuild/linux-arm64": "0.28.2", - "@esbuild/linux-ia32": "0.28.2", - "@esbuild/linux-loong64": "0.28.2", - "@esbuild/linux-mips64el": "0.28.2", - "@esbuild/linux-ppc64": "0.28.2", - "@esbuild/linux-riscv64": "0.28.2", - "@esbuild/linux-s390x": "0.28.2", - "@esbuild/linux-x64": "0.28.2", - "@esbuild/netbsd-arm64": "0.28.2", - "@esbuild/netbsd-x64": "0.28.2", - "@esbuild/openbsd-arm64": "0.28.2", - "@esbuild/openbsd-x64": "0.28.2", - "@esbuild/openharmony-arm64": "0.28.2", - "@esbuild/sunos-x64": "0.28.2", - "@esbuild/win32-arm64": "0.28.2", - "@esbuild/win32-ia32": "0.28.2", - "@esbuild/win32-x64": "0.28.2" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/generator-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "license": "ISC" - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "node_modules/is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", - "license": "MIT", - "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.4", - "generator-function": "^2.0.0", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "license": "MIT" - }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "license": "MIT" - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/npm-run-all": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", - "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "memorystream": "^0.3.1", - "minimatch": "^3.0.4", - "pidtree": "^0.3.0", - "read-pkg": "^3.0.0", - "shell-quote": "^1.6.1", - "string.prototype.padend": "^3.0.0" - }, - "bin": { - "npm-run-all": "bin/npm-run-all/index.js", - "run-p": "bin/run-p/index.js", - "run-s": "bin/run-s/index.js" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm-run-all/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "license": "MIT", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "license": "MIT", - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pidtree": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", - "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", - "license": "MIT", - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "license": "MIT", - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shell-quote": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.10.0.tgz", - "integrity": "sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.22", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", - "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", - "license": "CC0-1.0" - }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/string.prototype.padend": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz", - "integrity": "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "license": "MIT", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - } - } -} diff --git a/04_typescript/projects/typescript-ecom-manager-template/package.json b/04_typescript/projects/typescript-ecom-manager-template/package.json deleted file mode 100644 index 4a63606..0000000 --- a/04_typescript/projects/typescript-ecom-manager-template/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "ecom-management-system", - "version": "1.0.0", - "main": "index.ts", - "scripts": { - "ts": "npx esbuild src/tests/ecomManager.test.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts", - "ts-build": "npx esbuild src/tests/ecomManager.test.ts --bundle --outfile=assets/js/bundle.js --loader:.ts=ts", - "build:test": "npx esbuild src/tests/ecomManager.test.ts --bundle --platform=node --outfile=dist/test-bundle.js", - "run:test": "node dist/test-bundle.js", - "test": "run-s build:test run:test" - }, - "dependencies": { - "chalk": "^6.0.0", - "esbuild": "^0.28.2", - "npm-run-all": "^4.1.5" - }, - "keywords": [], - "author": "", - "license": "ISC", - "description": "" -} diff --git a/04_typescript/projects/typescript-ecom-manager-template/src/Product.ts b/04_typescript/projects/typescript-ecom-manager-template/src/Product.ts deleted file mode 100644 index e69de29..0000000 diff --git a/04_typescript/projects/typescript-ecom-manager-template/src/productFilters.ts b/04_typescript/projects/typescript-ecom-manager-template/src/productFilters.ts deleted file mode 100644 index e69de29..0000000 diff --git a/04_typescript/projects/typescript-ecom-manager-template/src/productManager.ts b/04_typescript/projects/typescript-ecom-manager-template/src/productManager.ts deleted file mode 100644 index e69de29..0000000 diff --git a/04_typescript/projects/typescript-ecom-manager-template/src/salesManager.ts b/04_typescript/projects/typescript-ecom-manager-template/src/salesManager.ts deleted file mode 100644 index e69de29..0000000 diff --git a/04_typescript/projects/typescript-ecom-manager-template/src/tests/ecomManager.test.ts b/04_typescript/projects/typescript-ecom-manager-template/src/tests/ecomManager.test.ts deleted file mode 100644 index 862d062..0000000 --- a/04_typescript/projects/typescript-ecom-manager-template/src/tests/ecomManager.test.ts +++ /dev/null @@ -1,145 +0,0 @@ -/* -This is a test file for the `productManager`, `productFilters`, and `salesManager` modules. It tests the core functionality implemented in these modules. - -IMPORTANT: -- DO NOT MODIFY this file. -- After implementing the modules, you should be able to run this file by using the command `npm run ts-build`. -- Once the project is built, open the `index.html` file located in the `assets` folder in your browser to see the output of the test cases in the browser's console. - -The test file will: -- Add products. -- Update product stock. -- Remove products. -- Apply discounts. -- Filter products by category. -- Fetch low-stock products. -- Get top products by sales. -- Test edge cases, such as updating or deleting non-existing products. -- Test invalid discount values. -- Test automatic ID generation. - -EXPECTED BEHAVIOR: -- This file should run successfully without any modifications. -- Ensure that your implementation in the modules meets the requirements of these tests. - -DO NOT MODIFY this file. You should aim to pass all the tests provided here by only working on the respective modules. -*/ - -import { - addProduct, - removeProduct, - updateProductStock, - applyDiscount, -} from '../productManager'; -import { - filterProductsByCategory, - getLowStockProducts, -} from '../productFilters'; -import { getTopProductsBySales } from '../salesManager'; -import { products } from '../Product'; - -// ===== 1. Adding Products ===== -console.warn('=== Adding Products ==='); -const shirt = addProduct('T-Shirt', 29.99, 'clothing', 100, 30, 'id-1'); -console.log('Added T-Shirt (ID should be id-1):'); -console.log(shirt); - -const laptop = addProduct('Laptop', 999.99, 'electronics', 50, 10, 'id-2'); -console.log('Added Laptop (ID should be id-2):'); -console.log(laptop); - -const sofa = addProduct('Sofa', 499.99, 'home', 20, 15, 'id-3'); -console.log('Added Sofa (ID should be id-3):'); -console.log(sofa); - -// ===== 2. Applying Discount to a Product ===== -console.warn('=== Applying Discount to a Product ==='); -const discountedShirt = applyDiscount(shirt.id, 15); -console.log('It should say "Discount of 15% applied to product T-Shirt.":'); -console.log(discountedShirt); - -// ===== 3. Updating Product Stock ===== -console.warn('=== Updating Product Stock ==='); -const updatedLaptop = updateProductStock(laptop.id, 40); -console.log( - 'It should say "Stock quantity for product Laptop updated to 40.":' -); -console.log(updatedLaptop); - -// ===== 4. Removing a Product ===== -console.warn('=== Removing a Product ==='); -const removedLipstick = removeProduct('id-5'); -console.log('It should say "Product with ID id-5 not found.":'); -console.log(removedLipstick); - -// ===== 5. Filtering Products by Category ===== -console.warn('=== Filtering Products by Category ==='); -console.log('Clothing products (Expecting only T-Shirt):'); -console.log(filterProductsByCategory('clothing')); - -console.log('Clothing and Home products (Expecting T-Shirt and Sofa):'); -console.log(filterProductsByCategory(['clothing', 'home'])); - -// ===== 6. Fetching Low Stock Products ===== -console.warn('=== Fetching Low Stock Products ==='); -console.log('It should return the Laptop and Sofa products:'); -console.log(getLowStockProducts(50)); - -// ===== 7. Getting Top Products by Sales ===== -console.warn('=== Getting Top Products by Sales ==='); -const salesData = [ - { productId: 'id-2', soldUnits: 120 }, - { productId: 'id-1', soldUnits: 80 }, - { productId: 'id-4', soldUnits: 150 }, - { productId: 'id-3', soldUnits: 172 }, - { productId: 'id-5', soldUnits: 26 }, -]; -console.log('Top 2 products by sales (Expecting Sofa and Laptop):'); -console.log(getTopProductsBySales([shirt, laptop, sofa], salesData, 2)); - -// ===== 8. Edge Case: Updating Non-existing Product Stock ===== -console.warn('=== Attempting to Update a Non-existing Product ==='); -const updateNonExistingProduct = updateProductStock('id-9999', 50); -console.log( - 'Updating a non-existing product should return "Product with ID id-9999 not found.":' -); -console.log(updateNonExistingProduct); - -// ===== 9. Edge Case: Removing a Non-existing Product ===== -console.warn('=== Attempting to Remove a Non-existing Product ==='); -const removeNonExistingProduct = removeProduct('id-1000'); -console.log( - 'Removing a non-existing product should return "Product with ID id-1000 not found.":' -); -console.log(removeNonExistingProduct); - -// ===== 10. Adding Product After Removal and Checking IDs ===== -console.warn('=== Adding New Product After Removal ==='); -const basketball = addProduct('Basketball', 29.99, 'sports', 30, 25, 'id-6'); -console.log( - 'A basketball product with ID id-6 should be added in the products list:' -); -console.log(products); - -console.warn('=== Verifying Product IDs ==='); -console.log('All Product IDs should be [id-1, id-2, id-3, id-6]:'); -console.log([shirt.id, laptop.id, sofa.id, basketball.id]); - -// ===== 11. Invalid Discount Values (NEW TEST) ===== -console.warn('=== Testing Invalid Discount Values ==='); -console.log(applyDiscount(shirt.id, -10)); // Expecting error message -console.log(applyDiscount(shirt.id, 120)); // Expecting error message - -// ===== 12. Automatic ID Generation (NEW TEST) ===== -console.warn('=== Testing Automatic ID Generation ==='); -const autoGeneratedProduct = addProduct( - 'Headphones', - 79.99, - 'electronics', - 25, - 5 -); -console.log( - 'Generated ID should not be undefined or empty:', - autoGeneratedProduct.id -); diff --git a/04_typescript/projects/typescript-task-manager-template.zip b/04_typescript/projects/typescript-task-manager-template.zip deleted file mode 100644 index af312aa..0000000 Binary files a/04_typescript/projects/typescript-task-manager-template.zip and /dev/null differ diff --git a/04_typescript/projects/typescript-task-manager-template/.gitignore b/04_typescript/projects/typescript-task-manager-template/.gitignore deleted file mode 100644 index a547bf3..0000000 --- a/04_typescript/projects/typescript-task-manager-template/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/04_typescript/projects/typescript-task-manager-template/README.md b/04_typescript/projects/typescript-task-manager-template/README.md deleted file mode 100644 index 601f2df..0000000 --- a/04_typescript/projects/typescript-task-manager-template/README.md +++ /dev/null @@ -1,17 +0,0 @@ -## License and terms of use - -© Web Professional Institute Inc. All rights reserved. - -This material is provided solely for students enrolled in courses offered by Web Professional Institute Inc. By accessing or using this code, you acknowledge that it is strictly for educational use within the context of Web Professional Institute Inc. programs. - -**Usage Restrictions:** - -- Redistribution, sharing, or copying of this material outside the course environment is strictly prohibited. -- The content is designed to support your learning objectives and is not authorized for commercial projects, public repositories, or applications beyond the course scope. -- Unauthorized commercial use or open-source distribution is strictly prohibited and may result in expulsion from the program and legal action. - -**Agreement & Rights:** - -As a student, you have agreed to these terms as part of your enrollment agreement, which includes additional details on permitted uses, restrictions, and policies. The author and Web Professional Institute Inc. retain all rights to this material, including the code base and instructional content. - -For any questions regarding these terms, please contact Web Professional Institute Inc. for clarification. diff --git a/04_typescript/projects/typescript-task-manager-template/Todo.md b/04_typescript/projects/typescript-task-manager-template/Todo.md deleted file mode 100644 index 9c7b756..0000000 --- a/04_typescript/projects/typescript-task-manager-template/Todo.md +++ /dev/null @@ -1,84 +0,0 @@ -## Projektarbeit 1: Aufgaben-Management-System - -In dieser Projektarbeit entwickelst du ein Aufgabenmanagementsystem, mit dem Studierende der Informatik ihre Teamprojekte effizient verwalten können. Ein Team benötigt ein System, mit dem es Aufgaben wie das Design der Benutzeroberfläche, die Programmierung des Backends oder die Erstellung der Dokumentation nachverfolgen und Deadlines und Prioritäten im Auge behalten kann. - -Du erstellst mit Hilfe von TypeScript ein vereinfachtes Aufgabenverwaltungssystem, mit dem die Teammitglieder Aufgaben hinzufügen, aktualisieren, löschen, filtern und überfällige Aufgaben finden können. - -In dieser Projektarbeit wirst du zeigen, dass du das Typsystem von TypeScript verstehst, einschließlich Union Types, Type Annotations, Type Assertions, Interfaces und Literal Types. Du wirst auch mit Funktionen, Objekten und Arrays arbeiten, um die benötigten Funktionen zu implementieren. - -root/ -│ -├── assets/ -│ ├── js/ -│ │ └── bundle.js // Bundled JavaScript file after running "npm run ts" -│ └── index.html // Main HTML file to view your JavaScript code -│ -├── src/ -│ ├── tests/ -│ │ └── taskManager.test.ts // Test file to check your code (DO NOT MODIFY) -│ └── taskManager.ts // Solve the task in this file only (ADD YOUR CODE HERE) -│ -├── .gitignore // Ignore files for git -│ -└── package.json // Project metadata and dependencies - -**Anforderungen** - -1. Definiere ein Task Interface: - -- id: Ein eindeutiger Identifikator (Nummer). -- title: Ein String, der den Titel der Aufgabe darstellt. -- description: Ein optionaler String mit der Aufgabenbeschreibung. -- status: Ein Union Type, der aus den folgenden String Literals bestehen kann: 'not-started', 'in-progress', 'completed'. -- priority: Ein Union Type, der die Priorität der Aufgabe darstellt. Er sollte 'low', 'medium', oder 'high' akzeptieren. -- dueDate: Ein Datum, das als String im Format YYYY-MM-DD dargestellt wird. - -2. Tasks hinzufügen: Erstelle eine Funktion, um dem System eine neue Aufgabe hinzuzufügen. - -- Akzeptiere ein task Objekt (mit title, priority, dueDate und optional description). -- Erstelle automatisch eine eindeutige id für jede Aufgabe. -- Setze den Standardstatus auf 'not-started'. -- Füge die neue Aufgabe zu einer internen Aufgabenliste hinzu (z. B. einem Array). -- Gib das erstellte Task-Objekt mit der generierten id zurück. - -3. Tasks aktualisieren: Erstelle eine Funktion, um den Status und die Priorität einer bestehenden Aufgabe zu aktualisieren. Verwende bei Bedarf Type Assertions, um sicherzustellen, dass nur gültige Werte aktualisiert werden. - -- Die Funktion sollte ein Objekt als Parameter akzeptieren, das mindestens eine `id` (number) enthält und optional `status` und/oder `priority` Eigenschaften. -- Verwende Union Types für `status` und `priority`, um nur gültige Werte zu akzeptieren. -- Finde die Aufgabe über ihre id. -- Aktualisiere die status und/oder priority der Aufgabe, wenn gültige Werte angegeben sind. -- Gib die aktualisierte Aufgabe zurück oder undefined, wenn die Aufgabe nicht gefunden wird. - -4. Tasks löschen: Erstelle eine Funktion, die es Teammitgliedern ermöglicht, eine Aufgabe über ihre id zu löschen. - -- Die Funktion sollte true zurückgeben, wenn die Aufgabe erfolgreich gelöscht wurde, oder false, wenn die Aufgabe nicht gefunden werden konnte. - -5. Tasks abrufen und filtern: Erstelle eine Funktion, mit der du alle Aufgaben abrufen oder nach ihrem Status filtern kannst (z. B. nur Aufgaben in Bearbeitung anzeigen). - -- Wenn ein bestimmter Status (z. B. 'in-progress') angegeben wird, sollte die Funktion nur Aufgaben mit diesem Status zurückgeben. -- Wenn kein Status angegeben wird, werden alle Aufgaben zurückgegeben. - -6. Überfällige Tasks finden: Erstelle eine Funktion, um Aufgaben zu finden, die überfällig sind. - -- Eine Aufgabe gilt als überfällig, wenn ihr dueDate früher als das aktuelle Datum ist und ihr Status nicht 'completed' lautet. - -7. Static Type-Checking: Implementiere Static Type-Checking, um sicherzustellen, dass hinzugefügte oder aktualisierte Tasks mit der Task-Interface/dem Task-Typ übereinstimmen. Stelle sicher, dass falsche oder fehlende Eigenschaften bereits beim Kompilieren erkannt werden, um zu verhindern, dass ungültige Daten verarbeitet werden. - -8. Export des tasks Arrays: Exportiere das interne tasks Array, damit es in den Tests verwendet werden kann. Das Array sollte direkt exportiert werden (nicht als Funktion), da die Tests `tasks.map()` verwenden. - -**Wichtige Hinweise** - -Du erhältst Zugang zu einer vorgefertigten **Testdatei**, mit der du die Kernfunktionen deines taskManager.ts Moduls testen kannst. - -Die Testdatei wird: - -- Aufgaben hinzufügen. -- Aktualisiere den Status und die Prioritäten der Aufgaben. -- Aufgaben löschen. -- Aufgaben basierend auf ihrem Status abrufen. -- Überfällige Aufgaben finden. -- Edge Cases testen, z. B. das Aktualisieren oder Löschen nicht existierender Aufgaben. - -**Du solltest die Testdatei nicht verändern**. Du kannst sie öffnen und dir den Code ansehen, um dir ein Bild von den Parametern der Funktionen zu machen. Die Datei dient dazu, deinen Code während der Entwicklung zu testen, aber du musst alle angebotenen Tests bestehen, indem du nur deine Implementierung in `taskManager.ts` verwendest. Du kannst die Namen der Funktionen in `taskManager.ts` ändern, aber es ist deine Aufgabe, die Exportfunktionen so beizubehalten, wie du sie in der Datei findest. - -Du kannst die Testfälle mit verschiedenen Befehlen ausführen. Der empfohlene Befehl ist `npm run test`, der die Tests in Node.js ausführt. Alternativ kannst du mit `npm run ts-build` ein Bundle für den Browser erstellen und dann die Datei `assets/index.html` im Browser öffnen. Für eine kontinuierliche Entwicklung bietet sich `npm run test:watch` an, der Tests automatisch bei Änderungen ausführt. Die Ergebnisse der Testfälle werden in der Konsole ausgegeben. diff --git a/04_typescript/projects/typescript-task-manager-template/assets/index.html b/04_typescript/projects/typescript-task-manager-template/assets/index.html deleted file mode 100644 index 347cdab..0000000 --- a/04_typescript/projects/typescript-task-manager-template/assets/index.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - Assignment 01: Task Manager - - - - -
      -

      Task Manager

      -

      Open the console to see the output

      -
      - - diff --git a/04_typescript/projects/typescript-task-manager-template/assets/js/bundle.js b/04_typescript/projects/typescript-task-manager-template/assets/js/bundle.js deleted file mode 100644 index 8afef30..0000000 --- a/04_typescript/projects/typescript-task-manager-template/assets/js/bundle.js +++ /dev/null @@ -1,2 +0,0 @@ -(() => { -})(); diff --git a/04_typescript/projects/typescript-task-manager-template/package.json b/04_typescript/projects/typescript-task-manager-template/package.json deleted file mode 100644 index 6736f92..0000000 --- a/04_typescript/projects/typescript-task-manager-template/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "ts-assignment-task-manager", - "version": "1.1.0", - "main": "src/taskManager.ts", - "scripts": { - "ts": "npx esbuild src/taskManager.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts", - "ts-build": "npx esbuild src/tests/taskManager.test.ts --bundle --outfile=assets/js/test-bundle.js --loader:.ts=ts", - "build:test": "npx esbuild src/tests/taskManager.test.ts --bundle --platform=node --outfile=dist/test-bundle.js", - "run:test": "node dist/test-bundle.js", - "test": "npm run build:test && npm run run:test", - "test:watch": "npx nodemon --watch src --ext ts --exec \"npm run test\"" - }, - "author": "", - "license": "SEE LICENSE IN README.md", - "description": "", - "dependencies": { - "esbuild": "^0.25.12" - } -} diff --git a/04_typescript/projects/typescript-task-manager-template/src/taskManager.ts b/04_typescript/projects/typescript-task-manager-template/src/taskManager.ts deleted file mode 100644 index af604bb..0000000 --- a/04_typescript/projects/typescript-task-manager-template/src/taskManager.ts +++ /dev/null @@ -1,16 +0,0 @@ -let nextTaskId = 1; // Initialize the task ID counter (it has to be a number) - -const tasks = () => {}; - -const addTask = () => {}; - -const updateTask = () => {}; - -const deleteTask = () => {}; - -const getTasks = () => {}; - -const findOverdueTasks = () => {}; - -// Uncomment the following code. Otherwise, the tests will fail. Make sure that the names of your functions are the same as in the commented code. -export { tasks, addTask, updateTask, deleteTask, getTasks, findOverdueTasks }; diff --git a/04_typescript/projects/typescript-task-manager-template/src/tests/taskManager.test.ts b/04_typescript/projects/typescript-task-manager-template/src/tests/taskManager.test.ts deleted file mode 100644 index 51989af..0000000 --- a/04_typescript/projects/typescript-task-manager-template/src/tests/taskManager.test.ts +++ /dev/null @@ -1,160 +0,0 @@ -/* -This is a test file for the `taskManager` module. It is designed to test the core functionality that you have implemented in the `taskManager.ts` module. - -IMPORTANT: -- DO NOT MODIFY this file. -- After implementing the `taskManager` module, you should be able to run this file by using the command `npm run test` or `npm run ts-build`. -- Once the project is built, open the `index.html` file located in the `assets` folder in your browser to see the output of the test cases in the browser's console. - -The test file will: -- Add tasks. -- Update task statuses and priorities. -- Delete tasks. -- Fetch tasks based on their status. -- Find overdue tasks. -- Test edge cases, such as updating or deleting non-existing tasks. - -EXPECTED BEHAVIOR: -- This file should run successfully without any modifications. -- Ensure that your implementation in the `taskManager.ts` module meets the requirements of these tests. - -DO NOT MODIFY this file. You should aim to pass all the tests provided here by only working on the `taskManager.ts` module. -*/ - -import { - tasks, - addTask, - updateTask, - deleteTask, - getTasks, - findOverdueTasks, -} from '../taskManager'; - -// ===== 1. Adding tasks ===== -console.warn('=== Adding Tasks ==='); -const task1 = addTask({ - title: 'Task 1', - priority: 'high', - dueDate: '2024-10-10', - description: 'This is a high priority task.', -}); -console.log('Added Task 1 (ID should be 1):'); -console.log(task1); - -const task2 = addTask({ - title: 'Task 2', - priority: 'medium', - dueDate: '2024-10-15', -}); -console.log('Added Task 2 (ID should be 2):'); -console.log(task2); - -const task3 = addTask({ - title: 'Task 3', - priority: 'low', - dueDate: '2024-09-30', - description: 'Low priority task, overdue.', -}); -console.log('Added Task 3 (ID should be 3):'); -console.log(task3); - -const task4 = addTask({ - title: 'Task 4', - priority: 'high', - dueDate: '2024-12-01', - description: 'Upcoming high priority task.', -}); -console.log('Added Task 4 (ID should be 4):'); -console.log(task4); - -const task5 = addTask({ - title: 'Task 5', - priority: 'medium', - dueDate: '2024-09-25', - description: 'Overdue medium task.', -}); -console.log('Added Task 5 (ID should be 5):'); -console.log(task5); - -// ===== 2. Fetching all tasks ===== -console.warn('=== Fetching All Tasks ==='); -console.log('Expecting 5 tasks:'); -console.log(getTasks()); - -// ===== 3. Updating a task's status and priority ===== -console.warn('=== Updating Task 1 Status and Priority ==='); -const updatedTask1 = updateTask({ - id: task1.id, - status: 'in-progress', - priority: 'medium', -}); -console.log( - 'Updated Task 1 (status should be "in-progress", priority should be "medium"):' -); -console.log(updatedTask1); - -console.warn('=== Updating Task 3 to Completed ==='); -const updatedTask3 = updateTask({ - id: task3.id, - status: 'completed', -}); -console.log('Updated Task 3 (status should be "completed"):'); -console.log(updatedTask3); - -// ===== 4. Deleting a task ===== -console.warn('=== Deleting Task 2 ==='); -const isDeleted = deleteTask(task2.id); -console.log('Task 2 deleted (should return true):'); -console.log(isDeleted); -console.log( - 'Fetching all tasks after deletion (Task 2 should no longer be in the list):' -); -console.log(getTasks()); - -// ===== 5. Fetching tasks with a specific status ===== -console.warn('=== Fetching In-progress Tasks ==='); -console.log('Expecting 1 in-progress task (Task 1):'); -console.log(getTasks('in-progress')); - -// ===== 6. Fetching overdue tasks ===== -console.warn('=== Fetching Overdue Tasks ==='); -console.log( - 'Expecting 3 overdue tasks (Task 1, Task 4, and Task 5, Task 3 is completed):' -); -console.log(findOverdueTasks()); - -// ===== 7. Edge Case: Updating a task that doesn't exist ===== -console.warn('=== Attempting to Update a Non-existing Task ==='); -const updateNonExistingTask = updateTask({ - id: 999, - status: 'completed', -}); -console.log('Trying to update non-existing task (should return undefined):'); -console.log(updateNonExistingTask); - -// ===== 8. Edge Case: Deleting a task that doesn't exist ===== -console.warn('=== Attempting to Delete a Non-existing Task ==='); -const deleteNonExistingTask = deleteTask(999); -console.log('Trying to delete non-existing task (should return false):'); -console.log(deleteNonExistingTask); - -// ===== 9. Adding and Fetching Tasks After Deletion ===== -console.warn('=== Adding a New Task After Deletion ==='); -const task6 = addTask({ - title: 'Task 6', - priority: 'low', - dueDate: '2024-11-05', -}); -console.log('Added Task 6 (ID should be 6):'); -console.log(task6); - -console.warn('=== Fetching All Tasks After Adding Task 6 ==='); -console.log('Expecting 5 tasks (Task 6 should be added):'); -console.log(getTasks()); - -// ===== 10. Verifying if Task IDs are auto-incremented correctly ===== -console.warn('=== Verifying Task ID Continuity ==='); -console.log('Task 6 ID (should be 6):'); -console.log(task6.id); -console.log('All Task IDs (should be [1, 3, 4, 5, 6]):'); -console.log(tasks.map((t) => t.id)); diff --git a/04_typescript/uebungen/01_erkennung-typenfehlern/assets/js/bundle.js b/04_typescript/uebungen/01_erkennung-typenfehlern/assets/js/bundle.js deleted file mode 100644 index 4657130..0000000 --- a/04_typescript/uebungen/01_erkennung-typenfehlern/assets/js/bundle.js +++ /dev/null @@ -1,10 +0,0 @@ -(() => { - // src/main.ts - { - const calculateDiscount = (price, discount) => { - return price - discount; - }; - const finalPrice = calculateDiscount(100, 10); - console.log(finalPrice); - } -})(); diff --git a/04_typescript/uebungen/01_erkennung-typenfehlern/index.html b/04_typescript/uebungen/01_erkennung-typenfehlern/index.html deleted file mode 100644 index 25cb74c..0000000 --- a/04_typescript/uebungen/01_erkennung-typenfehlern/index.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - Übung 1: Erkennung von Typenfehlern - - - - -
      -
      -
      -

      Übung 1: Erkennung von Typenfehlern

      -

      - In dieser Übung übst du, Type Mismatches in TypeScript-Funktionen zu erkennen und aufzulösen. Dir wird eine - Funktion vorgelegt, die falsche Type Annotations hat. Deine Aufgabe ist es, die Probleme zu erkennen und die - Funktion so zu korrigieren, dass sie dem beabsichtigten Verhalten entspricht. -

      -
      -
      -
      - - diff --git a/04_typescript/uebungen/01_erkennung-typenfehlern/package-lock.json b/04_typescript/uebungen/01_erkennung-typenfehlern/package-lock.json deleted file mode 100644 index 77304c6..0000000 --- a/04_typescript/uebungen/01_erkennung-typenfehlern/package-lock.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "01_erkennung-typenfehlern", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "01_erkennung-typenfehlern", - "version": "1.0.0", - "license": "ISC" - } - } -} diff --git a/04_typescript/uebungen/01_erkennung-typenfehlern/package.json b/04_typescript/uebungen/01_erkennung-typenfehlern/package.json deleted file mode 100644 index 9c9a260..0000000 --- a/04_typescript/uebungen/01_erkennung-typenfehlern/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "01_erkennung-typenfehlern", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "module" -} diff --git a/04_typescript/uebungen/01_erkennung-typenfehlern/src/main.ts b/04_typescript/uebungen/01_erkennung-typenfehlern/src/main.ts deleted file mode 100644 index 304f8b5..0000000 --- a/04_typescript/uebungen/01_erkennung-typenfehlern/src/main.ts +++ /dev/null @@ -1,9 +0,0 @@ -{ - const calculateDiscount = (price: number, discount: number): number => { - return price - discount; - }; - - const finalPrice = calculateDiscount(100, 10); - - console.log(finalPrice); -} diff --git a/04_typescript/uebungen/02_user-email/assets/js/bundle.js b/04_typescript/uebungen/02_user-email/assets/js/bundle.js deleted file mode 100644 index 5afc701..0000000 --- a/04_typescript/uebungen/02_user-email/assets/js/bundle.js +++ /dev/null @@ -1,16 +0,0 @@ -(() => { - // src/main.ts - var user = { - name: "John Doe", - age: 30 - }; - user.email = "johndoe@mail.com"; - var user2 = { - name: "Jane Doe", - age: 30 - }; - console.log(user.email ? user.email : "no email"); - console.log(user2.email ? user2.email : "no email"); - console.log("Email user: ", user?.email); - console.log("Email user2: ", user2?.email); -})(); diff --git a/04_typescript/uebungen/02_user-email/index.html b/04_typescript/uebungen/02_user-email/index.html deleted file mode 100644 index f4ef99f..0000000 --- a/04_typescript/uebungen/02_user-email/index.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - Übung 2: User E-Mail - - - - -
      -
      -
      -

      Übung 2: User E-Mail

      -

      - In dieser Übung arbeitest du mit einem Objekt und stellst sicher, dass alle notwendigen Eigenschaften - vorhanden sind, bevor du auf sie zugreifst. Du nutzt Static Type-Checking von TypeScript, um undefinierte - Fehler beim Zugriff auf Objekteigenschaften zu vermeiden. -

      -
        -
      • - Ändere den Code, um einen Typ (Interface) einzuführen, der eine optionale E-Mail-Eigenschaft - enthält. -
      • -
      • - Verwende eine bedingte Anweisung für das Vorhandensein der E-Mail-Eigenschaft, bevor du versuchst, auf sie - zuzugreifen. -
      • -
      -
      -
      -
      - - diff --git a/04_typescript/uebungen/02_user-email/package.json b/04_typescript/uebungen/02_user-email/package.json deleted file mode 100644 index 7863254..0000000 --- a/04_typescript/uebungen/02_user-email/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "02_user-email", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "module" -} diff --git a/04_typescript/uebungen/02_user-email/src/main.ts b/04_typescript/uebungen/02_user-email/src/main.ts deleted file mode 100644 index 669d656..0000000 --- a/04_typescript/uebungen/02_user-email/src/main.ts +++ /dev/null @@ -1,22 +0,0 @@ -interface User { - name: string; - age: number; - email?: string; -} - -const user: User = { - name: 'John Doe', - age: 30, -}; - -user.email = 'johndoe@mail.com'; - -const user2: User = { - name: 'Jane Doe', - age: 30, -}; - -console.log(user.email ? user.email : 'no email'); -console.log(user2.email ? user2.email : 'no email'); -console.log('Email user: ', user?.email); -console.log('Email user2: ', user2?.email); diff --git a/04_typescript/uebungen/03_vehicle-interface/assets/js/bundle.js b/04_typescript/uebungen/03_vehicle-interface/assets/js/bundle.js deleted file mode 100644 index d96d56f..0000000 --- a/04_typescript/uebungen/03_vehicle-interface/assets/js/bundle.js +++ /dev/null @@ -1,22 +0,0 @@ -(() => { - // src/main.ts - { - let operateVehicle = function(vehicle) { - if (vehicle.startEngine("car-key")) { - return vehicle.drive(60); - } else { - return "Engine failed to start."; - } - }; - const myCar = { - startEngine: (key) => { - console.log(`Engine started with key: ${key}`); - return true; - }, - drive: (speed) => { - return `Driving at ${speed} km/h`; - } - }; - console.log(operateVehicle(myCar)); - } -})(); diff --git a/04_typescript/uebungen/03_vehicle-interface/index.html b/04_typescript/uebungen/03_vehicle-interface/index.html deleted file mode 100644 index a4aa0c8..0000000 --- a/04_typescript/uebungen/03_vehicle-interface/index.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - Übung 3: Vehicle Interface - - - - -
      -
      -
      -

      Übung 3: Vehicle Interface

      -

      - In dieser Übung arbeitest du mit einem Interface Vehicle und einem Objekt myCar, um sicherzustellen, dass - beide mit den richtigen Methodensignaturen übereinstimmen. In Fällen, in denen Interface und Objekt nicht - übereinstimmen, musst du Anpassungen vornehmen. -

      -

      Aufgaben:

      -
        -
      1. - Identifiziere alle Unstimmigkeiten zwischen dem Interface Vehicle und dem Objekt - myCar. -
      2. -
      3. - Ändere das Interface Vehicle, das Objekt myCar oder beides, damit sie richtig - übereinstimmen. -
      4. -
      5. - Stelle sicher, dass die Funktion operateVehicle beide Methoden fehlerfrei aufrufen kann und - dass sie den Fahrzeugstatus korrekt zurückgibt. -
      6. -
      -

      Anweisungen:

      -
        -
      • - Das Interface Vehicle umfasst zwei Methoden: -
          -
        • - startEngine: Akzeptiert einen String-Parameter für den Schlüssel und gibt einen - booleschen Wert zurück, der angibt, ob der Motor erfolgreich gestartet wurde. -
        • -
        • - drive: Akzeptiert einen Zahlenparameter für die Geschwindigkeit und gibt einen String - zurück, der den Fahrstatus beschreibt. -
        • -
        -
      • -
      • - Das Objekt myCar sollte beide Methoden korrekt implementieren, um das Interface Vehicle zu - entsprechen. -
      • -
      • - Ändere entweder das Interface Vehicle oder das Objekt myCar so, dass sie - übereinstimmen. -
      • - -

        - Stelle sicher, dass operateVehicle den Status des Fahrzeugs zurückgibt, nachdem du versucht - hast, den Motor zu starten und zu fahren. -

        -
      -
      -
      -
      - - diff --git a/04_typescript/uebungen/03_vehicle-interface/package.json b/04_typescript/uebungen/03_vehicle-interface/package.json deleted file mode 100644 index 9361abd..0000000 --- a/04_typescript/uebungen/03_vehicle-interface/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "03_vehicle-interface", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "module" -} diff --git a/04_typescript/uebungen/03_vehicle-interface/src/main.ts b/04_typescript/uebungen/03_vehicle-interface/src/main.ts deleted file mode 100644 index b94a87f..0000000 --- a/04_typescript/uebungen/03_vehicle-interface/src/main.ts +++ /dev/null @@ -1,26 +0,0 @@ -{ - interface Vehicle { - startEngine: (key: string) => boolean; - drive: (speed: number) => string; - } - - const myCar = { - startEngine: (key: string): boolean => { - console.log(`Engine started with key: ${key}`); - return true; - }, - drive: (speed: number): string => { - return `Driving at ${speed} km/h`; - }, - }; - - function operateVehicle(vehicle: Vehicle): string { - if (vehicle.startEngine('car-key')) { - return vehicle.drive(60); - } else { - return 'Engine failed to start.'; - } - } - - console.log(operateVehicle(myCar)); -} diff --git a/04_typescript/uebungen/04_without-any/assets/js/bundle.js b/04_typescript/uebungen/04_without-any/assets/js/bundle.js deleted file mode 100644 index e52bbec..0000000 --- a/04_typescript/uebungen/04_without-any/assets/js/bundle.js +++ /dev/null @@ -1,10 +0,0 @@ -(() => { - // src/main.ts - { - const processData = (input) => { - return input * 2; - }; - let result = processData(100); - console.log(result); - } -})(); diff --git a/04_typescript/uebungen/04_without-any/index.html b/04_typescript/uebungen/04_without-any/index.html deleted file mode 100644 index 4472844..0000000 --- a/04_typescript/uebungen/04_without-any/index.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - Übung 4: Vermeiden von any Parametern in Funktionen - - - - -
      -
      -
      -

      Übung 4: Vermeiden von any Parametern in Funktionen

      -

      - Refaktoriere eine Funktion, die den Type any für ihre Parameter verwendet. Ersetze any durch spezifischere - Typen, um die Type-Safety zu verbessern. -

      -
      -
      -
      - - diff --git a/04_typescript/uebungen/04_without-any/package.json b/04_typescript/uebungen/04_without-any/package.json deleted file mode 100644 index 845a96d..0000000 --- a/04_typescript/uebungen/04_without-any/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "04_without-any", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "module" -} diff --git a/04_typescript/uebungen/04_without-any/src/main.ts b/04_typescript/uebungen/04_without-any/src/main.ts deleted file mode 100644 index 722b862..0000000 --- a/04_typescript/uebungen/04_without-any/src/main.ts +++ /dev/null @@ -1,8 +0,0 @@ -{ - const processData = (input: number): number => { - return input * 2; - }; - - let result = processData(100); - console.log(result); -} diff --git a/04_typescript/uebungen/05_type-annotations/index.html b/04_typescript/uebungen/05_type-annotations/index.html deleted file mode 100644 index b8a134c..0000000 --- a/04_typescript/uebungen/05_type-annotations/index.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - Übung 5: Type Annotations in TypeScript-Funktionen - - - - -
      -
      -
      -

      Übung 5: Type Annotations in TypeScript-Funktionen

      -

      - In dieser Übung übst du das Hinzufügen von Type Annotations zu Variablen und Funktionen in TypeScript. Das - hilft dir dabei, zu verstehen, wie TypeScript Typen herleitet und wann es sinnvoll ist, sie explizit zu - deklarieren. -

      -

      - Deine Aufgabe ist es, ein einfaches TypeScript-Programm zu erstellen, das die folgenden Schritte ausführt: -

      -
        -
      1. - Deklariere eine Variable, um den Namen einer Person zu speichern, und gib ihn explizit - als String ein. -
      2. -
      3. - Deklariere eine Funktion, die zwei Parameter, firstName und - lastName, beide vom Typ String, benötigt und einen verketteten vollständigen Namen (ebenfalls - vom Typ String) zurückgibt. -
      4. -
      5. - Deklariere eine weitere Funktion, die die Summe des Zahlenfeldes - [10, 20, 30] berechnet. Diese Funktion sollte das Zahlenfeld als Eingabe haben und die Summe - der Zahlen zurückgeben (der Rückgabetyp sollte Zahl sein). -
      6. -
      7. - Verwende die Funktionen und Variablen, um eine Nachricht zu protokollieren, die den vollständigen Namen - einer Person und die Summe einer Reihe von Zahlen enthält. -
      8. -
      -
      -
      -
      - - diff --git a/04_typescript/uebungen/05_type-annotations/package.json b/04_typescript/uebungen/05_type-annotations/package.json deleted file mode 100644 index 2907c16..0000000 --- a/04_typescript/uebungen/05_type-annotations/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "05_type-annotations", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "module" -} diff --git a/04_typescript/uebungen/05_type-annotations/src/main.ts b/04_typescript/uebungen/05_type-annotations/src/main.ts deleted file mode 100644 index 60efb39..0000000 --- a/04_typescript/uebungen/05_type-annotations/src/main.ts +++ /dev/null @@ -1,22 +0,0 @@ -{ - // [x] : Deklariere eine Variable, um den Namen einer Person zu speichern, und gib ihn explizit als String ein. - const john: string = 'John'; - - // [x]: Deklariere eine Funktion, die zwei Parameter, firstName und lastName, beide vom Typ String, benötigt und einen verketteten vollständigen Namen (ebenfalls vom Typ String) zurückgibt. - const greet = (firstName: string, lastName: string): string => { - const greet: string = `Hello ${firstName} ${lastName}`; - return greet; - }; - - // [x]: Deklariere eine weitere Funktion, die die Summe des Zahlenfeldes [10, 20, 30] berechnet. Diese Funktion sollte das Zahlenfeld als Eingabe haben und die Summe der Zahlen zurückgeben (der Rückgabetyp sollte Zahl sein). - const sumNumbers = (numbers: number[]): number => { - return numbers.reduce((sum, num) => sum + num, 0); - }; - - // [x]: Verwende die Funktionen und Variablen, um eine Nachricht zu protokollieren, die den vollständigen Namen einer Person und die Summe einer Reihe von Zahlen enthält. - - const name: string = greet('John', 'Wick'); - const sum: number = sumNumbers([10, 20, 30]); - - console.log(`Gruß: ${name}, Summe des Arrays: ${sum}`); -} diff --git a/04_typescript/uebungen/06_optional-properties/index.html b/04_typescript/uebungen/06_optional-properties/index.html deleted file mode 100644 index 1a4f8bd..0000000 --- a/04_typescript/uebungen/06_optional-properties/index.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - Übung 6: Definieren und Verwenden von Objekttypen mit optionalen Eigenschaften - - - - -
      -
      -
      -

      Übung 6: Definieren und Verwenden von Objekttypen mit optionalen Eigenschaften

      -

      - In dieser Übung übst du, Object Types mit erforderlichen und optionalen Eigenschaften in TypeScript zu - definieren. Du erstellst eine Funktion, die mit einem Objekt arbeitet, das ein Buch darstellt. Das Objekt - sollte Eigenschaften für den Titel (ein String), den Autor (ein String) und ein optionales Erscheinungsjahr - (eine Zahl) enthalten. Dann implementierst du eine Logik, um sicher auf diese Eigenschaften zuzugreifen und - sie zu verwenden, einschließlich der optionalen Eigenschaft. -

      -
        -
      1. - Definiere einen Objekttyp Book mit den folgenden Eigenschaften: -
          -
        • title: Eine Zeichenkette, die den Titel des Buches angibt.
        • -
        • author: Eine Zeichenkette, die den Autor des Buches angibt.
        • -
        • - yearPublished: Eine optionale Zahl, die das Jahr angibt, in dem das Buch veröffentlicht - wurde. -
        • -
        -
      2. -
      3. - Implementiere eine Funktion printBookDetails, die einen Parameter vom Typ - Book annimmt und die Details des Buches ausgibt. - -
          -
        • - Wenn die yearPublished bereitgestellt wird, drucke sie zusammen mit der title und author - aus. -
        • -
        • - Wenn yearPublished nicht angegeben wird, wird eine Meldung gedruckt, die besagt, dass das - Erscheinungsjahr unbekannt ist. -
        • -
        -
      4. -
      5. - Teste die Funktion mit verschiedenen Objekten, die entweder die Eigenschaft - yearPublished enthalten oder nicht. -
      6. -
      -
      -
      -
      - - diff --git a/04_typescript/uebungen/06_optional-properties/package.json b/04_typescript/uebungen/06_optional-properties/package.json deleted file mode 100644 index bf98b04..0000000 --- a/04_typescript/uebungen/06_optional-properties/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "06_optional-properties", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "module" -} diff --git a/04_typescript/uebungen/06_optional-properties/src/main.ts b/04_typescript/uebungen/06_optional-properties/src/main.ts deleted file mode 100644 index 09141b5..0000000 --- a/04_typescript/uebungen/06_optional-properties/src/main.ts +++ /dev/null @@ -1,19 +0,0 @@ -// Step 1: Define the Book object type -type Book = { - title: string; - author: string; - yearPublished?: number; -}; - -// Step 2: Implement the function to print book details -const printBookDetails = (book: Book): void => { - if (typeof book.yearPublished !== 'undefined') { - console.log(`Title: ${book.title} Author: ${book.author} Year Published: ${book.yearPublished}`); - } else { - console.log(`Title: ${book.title} Author: ${book.author} Year Published: Not Available`); - } -}; - -// Test cases to verify your code implementation (comment out the code below to remove the initial errors) -printBookDetails({ title: 'The TypeScript Handbook', author: 'Dan Vanderkam' }); -printBookDetails({ title: 'Clean Code', author: 'Robert C. Martin', yearPublished: 2008 }); diff --git a/04_typescript/uebungen/07_union-types/index.html b/04_typescript/uebungen/07_union-types/index.html deleted file mode 100644 index 6da4066..0000000 --- a/04_typescript/uebungen/07_union-types/index.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - Übung 7: Umgang mit Union Types in TypeScript - - - - -
      -
      -
      -

      Übung 7: Umgang mit Union Types in TypeScript

      -

      - In dieser Übung übst du den Umgang mit Union Types in TypeScript, indem du eine Funktion erstellst, die - mehrere Typen annimmt und jeden Typ entsprechend behandelt. Du verwendest Techniken fürs Type Narrowing, um - sicherzustellen, dass sich die Funktion je nach Art der Eingabe richtig verhält. -

      -
      -
      -
      - - diff --git a/04_typescript/uebungen/07_union-types/package.json b/04_typescript/uebungen/07_union-types/package.json deleted file mode 100644 index c19d3e0..0000000 --- a/04_typescript/uebungen/07_union-types/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "07_union-types", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "module" -} diff --git a/04_typescript/uebungen/07_union-types/src/main.ts b/04_typescript/uebungen/07_union-types/src/main.ts deleted file mode 100644 index 1380937..0000000 --- a/04_typescript/uebungen/07_union-types/src/main.ts +++ /dev/null @@ -1,37 +0,0 @@ -{ - const processInput = (input: string | number | boolean): string | number => { - // [x]: Implement logic here to handle different types of input - // - If the input is a string, return the string in uppercase - if (typeof input === 'string') { - return input.toUpperCase(); - - // - If the input is a number, return the square of the number - } else if (typeof input === 'number') { - return input * input; - - // - If the input is a boolean, return "Yes" if true, otherwise "No" - } else if (typeof input === 'boolean') { - return input ? 'Yes' : 'No'; - } - - // switch (typeof input) { - // case 'string': - // return input.toUpperCase(); - // case 'number': - // return input ** 2; - // case 'boolean': - // return input ? 'Yes' : 'No'; - // default: - // return 'ungültiger Datentyp'; - // } - - // Placeholder return statement to be replaced - return 'Ungültiger Parameter "input"'; - }; - - // Test cases to verify your code implementation (comment out the code below to remove the initial errors) - console.log(processInput('example')); // => "EXAMPLE" - console.log(processInput(7)); // => 49 - console.log(processInput(true)); // => "Yes" - console.log(processInput(false)); // => "No" -} diff --git a/04_typescript/uebungen/08_type-aliase/index.html b/04_typescript/uebungen/08_type-aliase/index.html deleted file mode 100644 index d6ffb95..0000000 --- a/04_typescript/uebungen/08_type-aliase/index.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - Übung 8: Type Aliase in TypeScript verwenden - - - - -
      -
      -
      -

      Übung 8: Type Aliase in TypeScript verwenden

      -

      - In dieser Übung übst du das Erstellen und Verwenden von Type Aliasen, um deinen TypeScript-Code zu - vereinfachen und klarer zu gestalten. Du definierst Type Aliase für einen Objekt- und einen Union Type und - verwendest diese Aliase dann in Funktionen, um deinen Code lesbarer und wartbarer zu machen. -

      -
      -
      -
      - - diff --git a/04_typescript/uebungen/08_type-aliase/package.json b/04_typescript/uebungen/08_type-aliase/package.json deleted file mode 100644 index dc6ed54..0000000 --- a/04_typescript/uebungen/08_type-aliase/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "08_type-aliase", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "module" -} diff --git a/04_typescript/uebungen/08_type-aliase/src/main.ts b/04_typescript/uebungen/08_type-aliase/src/main.ts deleted file mode 100644 index f361749..0000000 --- a/04_typescript/uebungen/08_type-aliase/src/main.ts +++ /dev/null @@ -1,50 +0,0 @@ -{ - // Step 1: Define a type alias 'Person' for an object type with the following properties: - type Person = { - name: string; - age: number; - isActive: boolean; - }; - - // Step 2: Define a type alias 'ResponseStatus' for a union type that includes the following string literals: - type ResponseStatus = 'success' | 'failure' | 'pending'; - - // Step 3: Implement a function 'printPersonDetails' that takes a parameter of type 'Person' - // - The function should print out the person's name, age, and activity status ("Active" or "Inactive" based on the isActive property). - - const printPersonDetails = (person: Person): void => { - const status = person.isActive ? 'Active' : 'Inactive'; - - console.log(`Name: ${person.name}, Age: ${person.age}, ${status}`); - }; - - // Step 4: Implement a function 'handleResponse' that takes a parameter of type 'ResponseStatus' - // - The function should print different messages based on the value of the 'ResponseStatus' ("Operation successful", "Operation failed", "Operation pending"). - const handleResponse = (responseStatus: ResponseStatus): void => { - switch (responseStatus) { - case 'success': - console.log('Operation successfull'); - break; - case 'failure': - console.log('Operation failed'); - break; - case 'pending': - console.log('Operation pending'); - break; - default: - console.error('error'); - } - }; - - // Test cases to verify your code implementation (comment out the code below to remove the initial errors) - - // Create an object of type 'Person' and pass it to 'printPersonDetails' - const person = { name: 'Alice', age: 30, isActive: true }; - printPersonDetails(person); // => Name: Alice, Age: 30, Status: Active - printPersonDetails({ name: 'John', age: 80, isActive: false }); // => Name: John, Age: 80, Inactive - - // Pass different 'ResponseStatus' values to 'handleResponse' - handleResponse('success'); // => "Operation successful" - handleResponse('failure'); // => "Operation failed" - handleResponse('pending'); // => "Operation pending" -} diff --git a/04_typescript/uebungen/09_interfaces/index.html b/04_typescript/uebungen/09_interfaces/index.html deleted file mode 100644 index 4b8003b..0000000 --- a/04_typescript/uebungen/09_interfaces/index.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - Übung 9: Implementieren und Erweitern von Interfaces in TypeScript - - - - -
      -
      -
      -

      Übung 9: Implementieren und Erweitern von Interfaces in TypeScript

      -

      - In dieser Übung übst du das Erstellen und Verwenden von Interfaces in TypeScript. Du definierst Interfaces, - um die Struktur von Objekten zu beschreiben, und erweiterst diese Interfaces dann, um zusätzliche - Eigenschaften hinzuzufügen. Außerdem lernst du das Konzept der declaration merging kennen, indem du neue - Felder zu einem bestehenden Interface hinzufügst. -

      -
      -
      -
      - - diff --git a/04_typescript/uebungen/09_interfaces/package.json b/04_typescript/uebungen/09_interfaces/package.json deleted file mode 100644 index edefa08..0000000 --- a/04_typescript/uebungen/09_interfaces/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "09_interfaces", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "module" -} diff --git a/04_typescript/uebungen/09_interfaces/src/main.ts b/04_typescript/uebungen/09_interfaces/src/main.ts deleted file mode 100644 index 3950c17..0000000 --- a/04_typescript/uebungen/09_interfaces/src/main.ts +++ /dev/null @@ -1,51 +0,0 @@ -{ - // Step 1: Define an interface 'Person' with the following properties: - // - name: a string - // - age: a number - - interface Person { - name: string; - age: number; - } - - // Step 2: Extend the 'Person' interface to create an 'Employee' interface with an additional property: - // - employeeId: a number - interface Employee extends Person { - employeeId: number; - } - - // Step 3: Implement a function 'printEmployeeDetails' that takes a parameter of type 'Employee' - // - The function should print out the employee's name, age, and employeeId. - - const printEmployeeDetails = (emp: Employee) => { - console.log(`Name: ${emp.name}, Age: ${emp.age}, eID: ${emp.employeeId}`); - }; - - // Step 4: Declare the 'Display' interface with a property: - // - resolution: a string - interface Display { - resolution: string; - } - - // Step 5: Add a new property 'size: number' to the 'Display' interface using declaration merging - interface Display { - size: number; - } - - // Step 6: Implement a function 'printDisplayDetails' that takes a parameter of type 'Display' - // - The function should print out the display's resolution and size. - const printDisplayDetails = (display: Display) => { - const { resolution, size } = display; - console.log(`Resoultion: ${resolution}, Size: ${size}`); - }; - - // Test cases to verify your code implementation (comment out the code below to remove the initial errors) - - // Create an 'Employee' object and pass it to 'printEmployeeDetails' - const employee = { name: 'Bob', age: 40, employeeId: 12345 }; - printEmployeeDetails(employee); // => Name: Bob, Age: 40, Employee ID: 12345 - - // Create a 'Display' object and pass it to 'printDisplayDetails' - const display = { resolution: '4K', size: 27 }; - printDisplayDetails(display); // => Resolution: 4K, Size: 27 -} diff --git a/04_typescript/uebungen/10_assertions/index.html b/04_typescript/uebungen/10_assertions/index.html deleted file mode 100644 index 435e437..0000000 --- a/04_typescript/uebungen/10_assertions/index.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - Übung 10: Type Assertions in TypeScript anwenden - - - - -
      -
      -
      -

      Übung 10: Type Assertions in TypeScript anwenden

      -

      - In dieser Übung verwendest du Type Assertions, um mit unbekannten Typen zu arbeiten und ein Objekt in einen - benutzerdefinierten Typ zu casten. -

      -

      Anweisungen

      -
        -
      • Erstelle ein Objekt mysteryObject mit einer Eigenschaft info, die eine Zeichenkette enthält.
      • - -
      • Das Objekt sollte vom Typ unknown sein.
      • - -
      • Verwende eine Type Assertion, um zu behaupten, dass mysteryObject vom Typ { info: string } ist.
      • - -
      • - Greife auf die Info-Eigenschaft von mysteryObject zu und ändere ihren Wert in eine neue Zeichenkette. -
      • -
      • Definiere einen eigenen Typ ComplexObject mit einer Methode compute, die einen String zurückgibt.
      • - -
      • - Erstelle ein Objekt basicObject mit einer Methode compute. -
          -
        • Die Methode sollte die Zeichenfolge "Basic Computation" zurückgeben.
        • -
        -
      • -
      • - Verwende eine zweistufige Type Assertion, um zu behaupten, dass basicObject vom Typ ComplexObject ist. -
      • - -
      • Rufe die Berechnungsmethode auf basicObject auf und protokolliere das Ergebnis.
      • -
      -
      -
      -
      - - diff --git a/04_typescript/uebungen/10_assertions/package.json b/04_typescript/uebungen/10_assertions/package.json deleted file mode 100644 index d294086..0000000 --- a/04_typescript/uebungen/10_assertions/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "10_assertions", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "module" -} diff --git a/04_typescript/uebungen/10_assertions/src/main.ts b/04_typescript/uebungen/10_assertions/src/main.ts deleted file mode 100644 index b72a644..0000000 --- a/04_typescript/uebungen/10_assertions/src/main.ts +++ /dev/null @@ -1,56 +0,0 @@ -{ - // [x] Step 1: Create an object 'mysteryObject' with a property 'info' that holds a string. - // - The object should be of type 'unknown'. - const mysteryObject: unknown = { - info: 'Holding string', - }; - - // [x] Step 2: Use a type assertion to assert that 'mysteryObject' is of type '{ info: string }'. - const typedMysteryObject = mysteryObject as { info: string }; - - // [x] Step 3: Access the 'info' property and assign a new string to it. - typedMysteryObject.info = 'A new String'; - - // [x] Step 4: Define a custom type 'ComplexObject' with a method 'compute' that returns a string. - type ComplexObject = { - compute: () => string; - }; - - // [x] Step 5: Create an object 'basicObject' with a method 'compute'. - // - The method should return a string "Basic Computation". - const basicObject = { - // compute: () => { - // return 'Basic Computation'; - // }, - compute() { - return 'Basic Computation'; - }, - }; - - // [x] Step 6: Use a two-step type assertion to assert that 'basicObject' is of type 'ComplexObject'. - const complexObject = basicObject as unknown as ComplexObject; - // TODO: two-step type assertion Wann? - - // [x] Step 7: Call the 'compute' method on 'basicObject' and log the result. - console.log('Step 7 basicObject: ', basicObject.compute()); - console.log('Step 7 complexObject: ', complexObject.compute()); - - // Test cases to verify your code implementation (comment out the code below to remove the initial errors) - - // Verify that 'info' was correctly accessed and modified - console.log('Updated info:', typedMysteryObject.info); // => "Updated Info" - - // Verify that 'compute' method of 'complexObject' returns the expected result - if (complexObject.compute() === 'Basic Computation') { - console.log('compute method returned the expected result.'); - } else { - console.error('compute method did not return the expected result.'); - } - - // Verify 'info' type compatibility - if (typeof typedMysteryObject.info === 'string') { - console.log('info property is of type string.'); - } else { - console.error('info property is not of type string.'); - } -} diff --git a/04_typescript/uebungen/11_literals/assets/js/bundle.js b/04_typescript/uebungen/11_literals/assets/js/bundle.js deleted file mode 100644 index ef7a6ec..0000000 --- a/04_typescript/uebungen/11_literals/assets/js/bundle.js +++ /dev/null @@ -1,34 +0,0 @@ -(() => { - var __getOwnPropNames = Object.getOwnPropertyNames; - var __commonJS = (cb, mod) => function __require() { - try { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; - } catch (e) { - throw mod = 0, e; - } - }; - - // src/main.ts - var require_main = __commonJS({ - "src/main.ts"() { - { - const setStatus = (status) => { - console.log(status); - }; - const rateExperience = (rating) => { - return `You rated the experience as ${rating}`; - }; - const togglePower = (state) => { - return state ? "Power is on" : "Power is off"; - }; - setStatus("success"); - setStatus("error"); - console.log(rateExperience(5)); - console.log(rateExperience(3)); - console.log(togglePower(true)); - console.log(togglePower(false)); - } - } - }); - require_main(); -})(); diff --git a/04_typescript/uebungen/11_literals/index.html b/04_typescript/uebungen/11_literals/index.html deleted file mode 100644 index 5a933d0..0000000 --- a/04_typescript/uebungen/11_literals/index.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - Übung 11: Arbeiten mit Literal Types in TypeScript - - - - -
      -
      -
      -

      Übung 11: Arbeiten mit Literal Types in TypeScript

      -

      - In dieser Übung übst du die Verwendung von Literal Types in TypeScript, um spezifischere und kontrollierte - Typen für deine Variablen und Funktionsparameter zu erstellen. Du wirst Funktionen definieren, die bestimmte - String-, numerische und boolesche Literal Types akzeptieren und sicherstellen, dass nur die erlaubten Werte - an diese Funktionen übergeben werden können. -

      -
      -
      -
      - - diff --git a/04_typescript/uebungen/11_literals/package.json b/04_typescript/uebungen/11_literals/package.json deleted file mode 100644 index 2feb560..0000000 --- a/04_typescript/uebungen/11_literals/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "10_assertions", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "commonjs" -} diff --git a/04_typescript/uebungen/11_literals/src/main.ts b/04_typescript/uebungen/11_literals/src/main.ts deleted file mode 100644 index 7d5a4f8..0000000 --- a/04_typescript/uebungen/11_literals/src/main.ts +++ /dev/null @@ -1,45 +0,0 @@ -{ - // [x] Step 1: Create a function 'setStatus' that accepts a string literal type parameter 'status'. - // - The 'status' can only be "success", "error", or "loading". - // - The function should log the status to the console. - - const setStatus = (status: 'success' | 'error' | 'loading'): void => { - console.log(status); - }; - - // [x] Step 2: Create a function 'rateExperience' that accepts a numeric literal type parameter 'rating'. - // - The 'rating' can only be 1, 2, 3, 4, or 5. - // - The function should return a message indicating the rating. - type Rating = 1 | 2 | 3 | 4 | 5; - - const rateExperience = (rating: Rating): string => { - return `You rated the experience as ${rating}`; - }; - - // [x] Step 3: Create a function 'togglePower' that accepts a boolean literal type parameter 'state'. - // - The 'state' can only be true or false. - // - The function should return a message indicating whether the power is ON or OFF. - - const togglePower = (state: boolean) => { - return state ? 'Power is on' : 'Power is off'; - }; - - // [x] Step 4: Test the functions with valid and invalid values to ensure the correct behavior and type safety. - - // Test cases (students should verify that these work as expected) - - // Test 'setStatus' function - setStatus('success'); // OK - setStatus('error'); // OK - //setStatus('complete'); // Error: Argument of type '"complete"' is not assignable to parameter of type '"success" | "error" | "loading"'. - - // Test 'rateExperience' function - console.log(rateExperience(5)); // => "You rated the experience as 5" - console.log(rateExperience(3)); // => "You rated the experience as 3" - //console.log(rateExperience(6)); // Error: Argument of type '6' is not assignable to parameter of type '1 | 2 | 3 | 4 | 5'. - - // Test 'togglePower' function - console.log(togglePower(true)); // => "Power is ON" - console.log(togglePower(false)); // => "Power is OFF" - //console.log(togglePower('on')); // Error: Argument of type '"on"' is not assignable to parameter of type 'true | false'. -} diff --git a/04_typescript/uebungen/12_type-guard/assets/js/bundle.js b/04_typescript/uebungen/12_type-guard/assets/js/bundle.js deleted file mode 100644 index 2662f2c..0000000 --- a/04_typescript/uebungen/12_type-guard/assets/js/bundle.js +++ /dev/null @@ -1,35 +0,0 @@ -(() => { - var __getOwnPropNames = Object.getOwnPropertyNames; - var __commonJS = (cb, mod) => function __require() { - try { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; - } catch (e) { - throw mod = 0, e; - } - }; - - // src/main.ts - var require_main = __commonJS({ - "src/main.ts"() { - { - const formatInput = (input) => { - switch (typeof input) { - case "number": - return String(input * 100); - case "string": - return input.toLowerCase(); - case "boolean": - return input ? "Yes" : "No"; - } - }; - console.log(formatInput(0.5)); - console.log(formatInput(12)); - console.log(formatInput("Hello")); - console.log(formatInput("WORLD")); - console.log(formatInput(true)); - console.log(formatInput(false)); - } - } - }); - require_main(); -})(); diff --git a/04_typescript/uebungen/12_type-guard/index.html b/04_typescript/uebungen/12_type-guard/index.html deleted file mode 100644 index 391d3df..0000000 --- a/04_typescript/uebungen/12_type-guard/index.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - Übung 12: Implementiere eine Type Guard Funktion - - - - -
      -
      -
      -

      Übung 12: Implementiere eine Type Guard Funktion

      -

      - Schreibe eine TypeScript-Funktion namens formatInput, die einen Parameter - input akzeptiert, der vom Typ number, string oder - boolean - sein kann. Die Funktion sollte einen formatierten String zurückgeben, der auf dem Typ der Eingabe basiert: -

      -
        -
      • - Wenn input eine number ist, gibst du die Zahl multipliziert mit - 100 als string zurück. -
      • -
      • - Wenn input ein string ist, wird - string - in Kleinbuchstaben zurückgegeben. -
      • -
      • - Wenn input eine boolean ist, gib "Yes" zurück, wenn input eine - true ist, und "No", wenn input eine false ist. -
      • -
      -

      - Verwende den typeof Operator, um die Typen innerhalb der Funktion einzugrenzen. -
      - Kopiere den Code unten und füge ihn ein, um deine Implementierung zu testen. -

      -
      -
      -
      - - diff --git a/04_typescript/uebungen/12_type-guard/package.json b/04_typescript/uebungen/12_type-guard/package.json deleted file mode 100644 index 8f779d7..0000000 --- a/04_typescript/uebungen/12_type-guard/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "12_type-guard", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "commonjs" -} diff --git a/04_typescript/uebungen/12_type-guard/src/main.ts b/04_typescript/uebungen/12_type-guard/src/main.ts deleted file mode 100644 index 85f5676..0000000 --- a/04_typescript/uebungen/12_type-guard/src/main.ts +++ /dev/null @@ -1,34 +0,0 @@ -{ - // Übung 12: Implementiere eine Type Guard Funktion - // Schreibe eine TypeScript-Funktion namens formatInput, die einen Parameter input akzeptiert, der vom Typ number, string oder boolean sein kann. Die Funktion sollte einen formatierten String zurückgeben, der auf dem Typ der Eingabe basiert: - const formatInput = (input: number | string | boolean): string => { - switch (typeof input) { - case 'number': - return String(input * 100); - case 'string': - return input.toLowerCase(); - case 'boolean': - return input ? 'Yes' : 'No'; - default: - console.error('No provided type'); - - return ''; - } - }; - - // [x] Wenn input eine number ist, gibst du die Zahl multipliziert mit 100 als string zurück. - - // [x] Wenn input ein string ist, wird string in Kleinbuchstaben zurückgegeben. - - // [x] Wenn input eine boolean ist, gib "Yes" zurück, wenn input eine true ist, und "No", wenn input eine false ist. - - // Verwende den typeof Operator, um die Typen innerhalb der Funktion einzugrenzen. - // Kopiere den Code unten und füge ihn ein, um deine Implementierung zu testen. - - console.log(formatInput(0.5)); // => "50" - console.log(formatInput(12)); // => "1200" - console.log(formatInput('Hello')); // => "hello" - console.log(formatInput('WORLD')); // => "world" - console.log(formatInput(true)); // => "Yes" - console.log(formatInput(false)); // => "No" -} diff --git a/04_typescript/uebungen/13_narrowing/assets/js/bundle.js b/04_typescript/uebungen/13_narrowing/assets/js/bundle.js deleted file mode 100644 index 542dc95..0000000 --- a/04_typescript/uebungen/13_narrowing/assets/js/bundle.js +++ /dev/null @@ -1,33 +0,0 @@ -(() => { - var __getOwnPropNames = Object.getOwnPropertyNames; - var __commonJS = (cb, mod) => function __require() { - try { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; - } catch (e) { - throw mod = 0, e; - } - }; - - // src/main.ts - var require_main = __commonJS({ - "src/main.ts"() { - { - const displayStatus = (status2) => { - if (status2) { - return `Status: ${status2}`; - } else { - return "No status avaible"; - } - }; - let status; - console.log(displayStatus("Active")); - console.log(displayStatus("Pending")); - console.log(displayStatus(null)); - console.log(displayStatus(void 0)); - console.log(displayStatus(status)); - console.log(displayStatus("")); - } - } - }); - require_main(); -})(); diff --git a/04_typescript/uebungen/13_narrowing/index.html b/04_typescript/uebungen/13_narrowing/index.html deleted file mode 100644 index d53943c..0000000 --- a/04_typescript/uebungen/13_narrowing/index.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - Übung 13: Implementierung der Truthiness Narrowing in einer Funktion - - - - -
      -
      -
      -

      Übung 13: Implementierung der Truthiness Narrowing in einer Funktion

      -

      - Schreibe eine TypeScript-Funktion namens displayStatus, die einen Parameter - status akzeptiert, der ein string, null oder - undefined sein kann. Die Funktion sollte: -

      -
        -
      • Wenn status truthy ist, wird die Zeichenfolge "Status: ", verkettet mit Status.
      • -
      • - Wenn status fehlerhaft ist, wird die Zeichenfolge "No status available." zurückgegeben. -
      • -
      -

      Verwende die Truthiness Narrowing, um zu prüfen, ob der Status truthy oder falsch ist.

      -
      -
      -
      - - diff --git a/04_typescript/uebungen/13_narrowing/package.json b/04_typescript/uebungen/13_narrowing/package.json deleted file mode 100644 index 358b0ee..0000000 --- a/04_typescript/uebungen/13_narrowing/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "13_narrowing", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "commonjs" -} diff --git a/04_typescript/uebungen/13_narrowing/src/main.ts b/04_typescript/uebungen/13_narrowing/src/main.ts deleted file mode 100644 index c44de65..0000000 --- a/04_typescript/uebungen/13_narrowing/src/main.ts +++ /dev/null @@ -1,31 +0,0 @@ -{ - // Übung 13: Implementierung der Truthiness Narrowing in einer Funktion - // Schreibe eine TypeScript-Funktion namens displayStatus, die einen Parameter status akzeptiert, der ein string, null oder undefined sein kann. Die Funktion sollte: - - const displayStatus = (status: string | null | undefined): string => { - if (status) { - return `Status: ${status}`; - } else { - return 'No status avaible'; - } - }; - - // [x] Wenn status truthy ist, wird die Zeichenfolge "Status: ", verkettet mit Status. - - // [x] Wenn status fehlerhaft ist, wird die Zeichenfolge "No status available." zurückgegeben. - - // [x] Verwende die Truthiness Narrowing, um zu prüfen, ob der Status truthy oder falsch ist. - - // [x] Kopiere den Code unten und füge ihn ein, um deine Implementierung zu testen. - // [x] Kopiere den Code unten und füge ihn ein, um deine Implementierung zu testen. - - let status; - - console.log(displayStatus('Active')); // => "Status: Active" - console.log(displayStatus('Pending')); // => "Status: Pending" - console.log(displayStatus(null)); // => "No status available." - console.log(displayStatus(undefined)); // => "No status available." - console.log(displayStatus(status)); // => "No status available." - console.log(displayStatus('')); // => "No status available." - // console.log(displayStatus()); // => Expected 1 arguments, but got 0. -} diff --git a/04_typescript/uebungen/14_narrowing-equality/assets/js/bundle.js b/04_typescript/uebungen/14_narrowing-equality/assets/js/bundle.js deleted file mode 100644 index 573a040..0000000 --- a/04_typescript/uebungen/14_narrowing-equality/assets/js/bundle.js +++ /dev/null @@ -1,52 +0,0 @@ -(() => { - var __getOwnPropNames = Object.getOwnPropertyNames; - var __commonJS = (cb, mod) => function __require() { - try { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; - } catch (e) { - throw mod = 0, e; - } - }; - - // src/main.ts - var require_main = __commonJS({ - "src/main.ts"() { - { - const analyzeInput = (input) => { - switch (typeof input) { - case "boolean": - return input ? "Input is exactly true" : "Input is exactly false"; - case "number": - if (input === 0) { - return "Input is zero"; - } else if (input > 0) { - return "Input is a positive number"; - } else { - return "Input is a negative number"; - } - case "string": - if (input === "hello") { - return `Input is the string '${input}'`; - } else { - return "Input is another string"; - } - default: - return "Unknown input"; - } - }; - console.log("undefined", "object"); - console.log(analyzeInput(true)); - console.log(analyzeInput(false)); - console.log(analyzeInput(0)); - console.log(analyzeInput(42)); - console.log(analyzeInput(-7)); - console.log(analyzeInput("hello")); - console.log(analyzeInput("world")); - console.log(analyzeInput("")); - console.log(analyzeInput(void 0)); - console.log(analyzeInput(null)); - } - } - }); - require_main(); -})(); diff --git a/04_typescript/uebungen/14_narrowing-equality/index.html b/04_typescript/uebungen/14_narrowing-equality/index.html deleted file mode 100644 index 2d4c188..0000000 --- a/04_typescript/uebungen/14_narrowing-equality/index.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - Übung 14: Equality Narrowing in einer Funktion implementieren - - - - -
      -
      -
      -

      Übung 14: Equality Narrowing in einer Funktion implementieren

      -

      - Gegeben ist eine unvollständige Funktion analyzeInput
      - Vervollständige die Funktion analyzeInput so, dass sie zurückgegeben wird: -

      -
        -
      • "Input is exactly true" wenn input === true.
      • -
      • "Input is exactly false" wenn input === false.
      • -
      • "Input is zero" wenn input === 0.
      • -
      • "Input is a positive number" wenn input eine Zahl größer als null ist.
      • -
      • "Input is a negative number" wenn input eine Zahl kleiner als null ist.
      • -
      • "Input is the string 'hello'" wenn input === "hello".
      • -
      • "Input is another string" wenn input irgendein anderer String ist.
      • -
      • "Unknown input" andernfalls.
      • -
      -

      Verwende Equality- und Vergleichsoperatoren, um den Typ und den Wert der Eingabe einzugrenzen.

      -
      -
      -
      - - diff --git a/04_typescript/uebungen/14_narrowing-equality/package.json b/04_typescript/uebungen/14_narrowing-equality/package.json deleted file mode 100644 index acce904..0000000 --- a/04_typescript/uebungen/14_narrowing-equality/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "14_narrowing-equality", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "commonjs" -} diff --git a/04_typescript/uebungen/14_narrowing-equality/src/main.ts b/04_typescript/uebungen/14_narrowing-equality/src/main.ts deleted file mode 100644 index 6c8607f..0000000 --- a/04_typescript/uebungen/14_narrowing-equality/src/main.ts +++ /dev/null @@ -1,51 +0,0 @@ -{ - const analyzeInput = (input: string | number | boolean | undefined | null): string => { - switch (typeof input) { - case 'boolean': - return input ? 'Input is exactly true' : 'Input is exactly false'; - case 'number': - if (input === 0) { - return 'Input is zero'; - } else if (input > 0) { - return 'Input is a positive number'; - } else { - return 'Input is a negative number'; - } - case 'string': - if (input === 'hello') { - return `Input is the string '${input}'`; - } else { - return 'Input is another string'; - } - default: - return 'Unknown input'; - } - }; - - console.log(typeof undefined, typeof null); - - console.log(analyzeInput(true)); // => "Input is exactly true" - console.log(analyzeInput(false)); // => "Input is exactly false" - console.log(analyzeInput(0)); // => "Input is zero" - console.log(analyzeInput(42)); // => "Input is a positive number" - console.log(analyzeInput(-7)); // => "Input is a negative number" - console.log(analyzeInput('hello')); // => "Input is the string 'hello'" - console.log(analyzeInput('world')); // => "Input is another string" - console.log(analyzeInput('')); // => "Input is another string" - console.log(analyzeInput(undefined)); // => "Unknown input" - console.log(analyzeInput(null)); // => "Unknown input" - - // Übung 14: Equality Narrowing in einer Funktion implementieren - // Vervollständige die Funktion analyzeInput so, dass sie zurückgegeben wird: - - // [x] "Input is exactly true" wenn input === true. - // [x] "Input is exactly false" wenn input === false. - // [x] "Input is zero" wenn input === 0. - // [x] "Input is a positive number" wenn input eine Zahl größer als null ist. - // [x] "Input is a negative number" wenn input eine Zahl kleiner als null ist. - // [x] "Input is the string 'hello'" wenn input === "hello". - // [x] "Input is another string" wenn input irgendein anderer String ist. - // [x] "Unknown input" andernfalls. - - // Verwende Equality- und Vergleichsoperatoren, um den Typ und den Wert der Eingabe einzugrenzen. -} diff --git a/04_typescript/uebungen/15_narrowing-in-operator/index.html b/04_typescript/uebungen/15_narrowing-in-operator/index.html deleted file mode 100644 index 88d9baf..0000000 --- a/04_typescript/uebungen/15_narrowing-in-operator/index.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - Übung 15: Verwendung des in-Operators zur Type Narrowing in TypeScript - - - - -
      -
      -
      -

      Übung 15: Verwendung des in-Operators zur Type Narrowing in TypeScript

      -

      - Erstelle eine TypeScript-Funktion mit dem Namen play, die einen Parameter vom Typ - Guitar | Piano annimmt. Der Typ Guitar hat eine Methode strum, und - der Typ Piano hat eine Methode pressKeys. -

      -

      - In der Funktion play verwendest du den Operator in, um festzustellen, ob das - übergebene instrument ein Guitar oder ein Piano ist, und rufst dann die - entsprechende Methode auf. Achte darauf, dass deine Funktion beide Typen richtig behandelt. -

      -
      -
      -
      - - diff --git a/04_typescript/uebungen/15_narrowing-in-operator/package.json b/04_typescript/uebungen/15_narrowing-in-operator/package.json deleted file mode 100644 index cf35cf9..0000000 --- a/04_typescript/uebungen/15_narrowing-in-operator/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "15_narrowing-in-operator", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "commonjs" -} diff --git a/04_typescript/uebungen/15_narrowing-in-operator/src/main.ts b/04_typescript/uebungen/15_narrowing-in-operator/src/main.ts deleted file mode 100644 index ceed89d..0000000 --- a/04_typescript/uebungen/15_narrowing-in-operator/src/main.ts +++ /dev/null @@ -1,26 +0,0 @@ -{ - type Guitar = { strum: () => void }; - type Piano = { pressKeys: () => void }; - - const play = (instrument: Guitar | Piano) => { - if ('strum' in instrument) { - instrument.strum(); - } else { - instrument.pressKeys(); - } - }; - - // Create guitar instance - const guitar: Guitar = { - strum: () => console.log('Strumming the guitar!'), - }; - - // Create piano instance - const piano: Piano = { - pressKeys: () => console.log('Pressing piano keys!'), - }; - - // Call functions - play(guitar); // => "Strumming the guitar!" - play(piano); // => "Pressing piano keys!" -} diff --git a/04_typescript/uebungen/16_narrowing-zuweisung/assets/js/bundle.js b/04_typescript/uebungen/16_narrowing-zuweisung/assets/js/bundle.js deleted file mode 100644 index 0afbb8d..0000000 --- a/04_typescript/uebungen/16_narrowing-zuweisung/assets/js/bundle.js +++ /dev/null @@ -1,31 +0,0 @@ -(() => { - var __getOwnPropNames = Object.getOwnPropertyNames; - var __commonJS = (cb, mod) => function __require() { - try { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; - } catch (e) { - throw mod = 0, e; - } - }; - - // src/main.ts - var require_main = __commonJS({ - "src/main.ts"() { - var handleValue = (value) => { - if (typeof value === "string") { - console.log(value.toUpperCase()); - } else if (typeof value === "number") { - console.log(value * 2); - } - console.log(value ? "It's true!" : "It's false!"); - }; - handleValue("hello"); - handleValue("TypeScript"); - handleValue(21); - handleValue(50); - handleValue(false); - handleValue(true); - } - }); - require_main(); -})(); diff --git a/04_typescript/uebungen/16_narrowing-zuweisung/index.html b/04_typescript/uebungen/16_narrowing-zuweisung/index.html deleted file mode 100644 index 9bfa0ee..0000000 --- a/04_typescript/uebungen/16_narrowing-zuweisung/index.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - Übung 16: Type Narrowing mit Zuweisungsoperationen - - - - -
      -
      -
      -

      Übung 16: Type Narrowing mit Zuweisungsoperationen

      -

      - In dieser Übung arbeitest du mit TypeScripts Features zur Type Narrowing durch Zuweisungsoperationen. Du - definierst eine Variable mit einem Union Type (string | number | boolean) und demonstrierst, - wie TypeScript den Typ dynamisch auf Basis der zugewiesenen Werte einschränkt. -

      -

      - Du wirst auch eine Funktion implementieren, die einen Union Type Parameter akzeptiert und diesen korrekt - behandelt, indem du die TypeScript-Funktionen fürs Type Narrowing nutzt. -

      -

      Anweisungen:

      -
        -
      1. - Schreibe eine Funktion handleValue, die einen string | number | boolean Parameter annimmt und - je nach Typ des Arguments ein anderes Verhalten protokolliert. -
          -
        • Wenn es eine string ist, protokolliere die Version in Großbuchstaben.
        • -
        • Wenn es sich um eine number handelt, logge ihren Wert multipliziert mit 2.
        • -
        • - Wenn es eine boolean ist, protokolliere "It's true!" oder "It's false!". Verwende einen - ternären Operator. -
        • -
        -
      2. -
      3. Teste die Funktion mit verschiedenen Eingaben.
      4. -
      -
      -
      -
      - - diff --git a/04_typescript/uebungen/16_narrowing-zuweisung/package.json b/04_typescript/uebungen/16_narrowing-zuweisung/package.json deleted file mode 100644 index c8b8c36..0000000 --- a/04_typescript/uebungen/16_narrowing-zuweisung/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "16_narrowing-zuweisung", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "commonjs" -} diff --git a/04_typescript/uebungen/16_narrowing-zuweisung/src/main.ts b/04_typescript/uebungen/16_narrowing-zuweisung/src/main.ts deleted file mode 100644 index 691345a..0000000 --- a/04_typescript/uebungen/16_narrowing-zuweisung/src/main.ts +++ /dev/null @@ -1,32 +0,0 @@ -// Übung 16: Type Narrowing mit Zuweisungsoperationen - -// In dieser Übung arbeitest du mit TypeScripts Features zur Type Narrowing durch Zuweisungsoperationen. Du definierst eine Variable mit einem Union Type (string | number | boolean) und demonstrierst, wie TypeScript den Typ dynamisch auf Basis der zugewiesenen Werte einschränkt. - -// Du wirst auch eine Funktion implementieren, die einen Union Type Parameter akzeptiert und diesen korrekt behandelt, indem du die TypeScript-Funktionen fürs Type Narrowing nutzt. - -// Anweisungen: - -// 1. Schreibe eine Funktion handleValue, die einen string | number | boolean Parameter annimmt und je nach Typ des Arguments ein anderes Verhalten protokolliert. - -const handleValue = (value: string | number | boolean): void => { - // Wenn es eine string ist, protokolliere die Version in Großbuchstaben. - if (typeof value === 'string') { - console.log(value.toUpperCase()); - // Wenn es sich um eine number handelt, logge ihren Wert multipliziert mit 2. - } else if (typeof value === 'number') { - console.log(value * 2); - // Wenn es eine boolean ist, protokolliere "It's true!" oder "It's false!". Verwende einen ternären Operator. - } - - console.log(value ? "It's true!" : "It's false!"); -}; - -// 2Teste die Funktion mit verschiedenen Eingaben. - -// Test handleValue with different inputs -handleValue('hello'); // => "HELLO" -handleValue('TypeScript'); // => "TYPESCRIPT" -handleValue(21); // => 42 -handleValue(50); // => 100 -handleValue(false); // => "It's false!" -handleValue(true); // => "It's true!" diff --git a/04_typescript/uebungen/17_narrowing-kontrollfluss/index.html b/04_typescript/uebungen/17_narrowing-kontrollfluss/index.html deleted file mode 100644 index b460257..0000000 --- a/04_typescript/uebungen/17_narrowing-kontrollfluss/index.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - Übung 17: Kontrollflussanalyse und Type Narrowing - - - - -
      -
      -
      -

      Übung 17: Kontrollflussanalyse und Type Narrowing

      -

      - In dieser Übung erstellst du eine Funktion, die einen Union Type Parameter akzeptiert und demonstriert, wie - TypeScript automatisch eine Type Narrowing basierend auf dem Kontrollfluss durchführt. -

      -

      - Du wirst Bedingungen implementieren, um verschiedene Typen zu behandeln und je nach Typ der Eingabe - unterschiedliche Ergebnisse zurückzugeben. Ziel ist es, die Verwendung der TypeScript Kontrollflussanalyse - zu üben, um Typsicherheit ohne unnötiges Type-Checking zu gewährleisten. -

      -

      Anweisungen:

      -
        -
      1. - Erstelle eine Funktion handleInput, die einen Parameter vom Typ string | number | boolean | null - akzeptiert. -
      2. -
      3. - Verwende innerhalb der Funktion die Blöcke if, else if und else, um verschiedene Typen zu behandeln: -
          -
        • Wenn die input null ist, gibst du "No value provided" zurück.
        • -
        • Wenn die input eine boolean ist, wird "True" oder "False" zurückgegeben.
        • -
        • Wenn input eine string ist, wird die Großbuchstabenversion der Zeichenkette zurückgegeben.
        • -
        • Wenn input eine number ist, wird das Quadrat der Zahl zurückgegeben.
        • -
        -
      4. -
      5. - Teste die Funktion mit verschiedenen Eingaben, um zu überprüfen, ob TypeScript die Typen korrekt - eingrenzt. -
      6. -
      -
      -
      -
      - - diff --git a/04_typescript/uebungen/17_narrowing-kontrollfluss/package.json b/04_typescript/uebungen/17_narrowing-kontrollfluss/package.json deleted file mode 100644 index 6afb9ca..0000000 --- a/04_typescript/uebungen/17_narrowing-kontrollfluss/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "17_narrowing-kontrollfluss", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "commonjs" -} diff --git a/04_typescript/uebungen/17_narrowing-kontrollfluss/src/main.ts b/04_typescript/uebungen/17_narrowing-kontrollfluss/src/main.ts deleted file mode 100644 index e173cd4..0000000 --- a/04_typescript/uebungen/17_narrowing-kontrollfluss/src/main.ts +++ /dev/null @@ -1,31 +0,0 @@ -// Übung 17: Kontrollflussanalyse und Type Narrowing - -// In dieser Übung erstellst du eine Funktion, die einen Union Type Parameter akzeptiert und demonstriert, wie TypeScript automatisch eine Type Narrowing basierend auf dem Kontrollfluss durchführt. - -// Du wirst Bedingungen implementieren, um verschiedene Typen zu behandeln und je nach Typ der Eingabe unterschiedliche Ergebnisse zurückzugeben. Ziel ist es, die Verwendung der TypeScript Kontrollflussanalyse zu üben, um Typsicherheit ohne unnötiges Type-Checking zu gewährleisten. - -// Anweisungen: - -// 1 Erstelle eine Funktion handleInput, die einen Parameter vom Typ string | number | boolean | null akzeptiert. -// 2 Verwende innerhalb der Funktion die Blöcke if, else if und else, um verschiedene Typen zu behandeln: - -const handleInput = (value: string | number | boolean | null): string | number => { - if (typeof value === 'number') { - return value * value; - // Wenn die input eine boolean ist, wird "True" oder "False" zurückgegeben. - } else if (typeof value === 'boolean') { - return value ? 'True' : 'False'; - // Wenn input eine string ist, wird die Großbuchstabenversion der Zeichenkette zurückgegeben. - } else if (typeof value === 'string') { - return value.toUpperCase(); - // Wenn input eine number ist, wird das Quadrat der Zahl zurückgegeben. - } - // Wenn die input null ist, gibst du "No value provided" zurück. - return 'No value provided'; -}; - -// 3 Teste die Funktion mit verschiedenen Eingaben, um zu überprüfen, ob TypeScript die Typen korrekt eingrenzt. -console.log(handleInput(null)); // => "No value provided" -console.log(handleInput(true)); // => "True" -console.log(handleInput('hello')); // => "HELLO" -console.log(handleInput(5)); // => 25 diff --git a/04_typescript/uebungen/18_type-predicates/index.html b/04_typescript/uebungen/18_type-predicates/index.html deleted file mode 100644 index 6da5be5..0000000 --- a/04_typescript/uebungen/18_type-predicates/index.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - Übung 18: Type Predicates implementieren - - - - -
      -
      -
      -

      Übung 18: Type Predicates implementieren

      -

      - In dieser Aufgabe definierst du zwei verschiedene Typen und implementierst eine benutzerdefinierte Predicate - Function, um zwischen ihnen zu unterscheiden. Dann benutzt du diese Funktion, um verschiedene Objekte in - einem Array zu filtern und zu behandeln. -

      - -

      Anweisungen:

      -
        -
      1. - Definiere zwei Typen, Car und Truck, wobei: -
          -
        • Car hat eine Methode drive().
        • -
        • Truck hat eine Methode loadCargo().
        • -
        -
      2. -
      3. - Erstelle eine Type Predicate Funktion isCar, um zu prüfen, ob ein bestimmtes Fahrzeug ein Car ist und eine - Fahrfunktion hat. Hinweis: .drive !== undefined. -
      4. -
      5. - Implementiere eine Funktion handleVehicle, die einen Parameter vom Typ Car | Truck akzeptiert: -
          -
        • Wenn das Fahrzeug ein Car ist, rufe drive() an.
        • -
        • Wenn das Fahrzeug ein Truck ist, rufe loadCargo() an.
        • -
        -
      6. -
      7. - Erstelle ein Array von Car | Truck Objekten und filtere nur die Autos mit dem isCar Predicate heraus. -
      8. -
      9. Teste deine Funktionen mit verschiedenen Eingaben.
      10. -
      -
      -
      -
      - - diff --git a/04_typescript/uebungen/18_type-predicates/package.json b/04_typescript/uebungen/18_type-predicates/package.json deleted file mode 100644 index 3f4439a..0000000 --- a/04_typescript/uebungen/18_type-predicates/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "18_type-predicates", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "commonjs" -} diff --git a/04_typescript/uebungen/18_type-predicates/src/main.ts b/04_typescript/uebungen/18_type-predicates/src/main.ts deleted file mode 100644 index 896b4b5..0000000 --- a/04_typescript/uebungen/18_type-predicates/src/main.ts +++ /dev/null @@ -1,79 +0,0 @@ -// Übung 18: Type Predicates implementieren -// In dieser Aufgabe definierst du zwei verschiedene Typen und implementierst eine benutzerdefinierte Predicate Function, um zwischen ihnen zu unterscheiden. Dann benutzt du diese Funktion, um verschiedene Objekte in einem Array zu filtern und zu behandeln. - -// Anweisungen: - -// 1 Definiere zwei Typen, Car und Truck, wobei: - -// Car hat eine Methode drive(). -type Car = { - drive: () => void; -}; - -// Truck hat eine Methode loadCargo(). -type Truck = { - loadCargo: () => void; -}; - -// 2 Erstelle eine Type Predicate Funktion isCar, um zu prüfen, ob ein bestimmtes Fahrzeug ein Car ist und eine Fahrfunktion hat. Hinweis: .drive !== undefined. -const isCar = (vehicle: Car | Truck): vehicle is Car => { - return Object.hasOwn(vehicle, 'drive'); - return (vehicle as Car).drive !== undefined; -}; - -// 3 Implementiere eine Funktion handleVehicle, die einen Parameter vom Typ Car | Truck akzeptiert: -const handleVehicle = (vehicle: Car | Truck) => { - // Wenn das Fahrzeug ein Car ist, rufe drive() an. - if (isCar(vehicle)) { - vehicle.drive(); - // Wenn das Fahrzeug ein Truck ist, rufe loadCargo() an. - } else { - vehicle.loadCargo(); - } -}; - -// 4 Erstelle ein Array von Car | Truck Objekten und filtere nur die Autos mit dem isCar Predicate heraus. -const vehicles: (Car | Truck)[] = [ - { - drive: () => { - console.log('Car driving'); - }, - }, - { - loadCargo: () => { - console.log('Truck loading cargo!'); - }, - }, - { - drive: () => { - console.log('Car driving'); - }, - }, - { - drive: () => { - console.log('Car driving'); - }, - }, - { - drive: () => { - console.log('Car driving'); - }, - }, -]; - -// 5 Teste deine Funktionen mit verschiedenen Eingaben. - -// Test the filtered array -// const cars = vehicles.filter(isCar); -const cars = vehicles.filter((vehicle) => { - return isCar(vehicle); -}); -cars.forEach((car) => { - car.drive(); -}); // => "Car driving" - -console.log('Filter End'); - -// Test handleVehicle with both Car and Truck -handleVehicle({ drive: () => console.log('Car driving') }); // => "Car driving" -handleVehicle({ loadCargo: () => console.log('Truck loading cargo') }); // => "Truck loading cargo" diff --git a/04_typescript/uebungen/19_fn-typausdruecke/index.html b/04_typescript/uebungen/19_fn-typausdruecke/index.html deleted file mode 100644 index 8651fa1..0000000 --- a/04_typescript/uebungen/19_fn-typausdruecke/index.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - Übung 19: Arbeiten mit Function Type Expressions - - - - -
      -
      -
      -

      Übung 19: Arbeiten mit Function Type Expressions

      -

      - In dieser Aufgabe schreibst du eine Funktion, die andere Funktionen - als Parameter akzeptiert und Logik basierend auf diesen Function - Type Expressions implementiert. -

      - -

      Anweisungen:

      -
        -
      1. - Definiere einen Type Alias MathOperation für eine - Funktion, die zwei numbers als Parameter nimmt und - einen number zurückgibt. -
      2. -
      3. - Implementiere eine Funktion calculate, die eine - Funktion vom Typ MathOperation und zwei - numbers - annimmt und die Funktion auf die Zahlen anwendet. -
      4. -
      5. - Erstelle zwei neue Funktionen, add und - multiply, die der Signatur - MathOperation entsprechen. -
      6. -
      7. - Teste alle Funktionen, indem du geeignete Argumente übergibst und - die Ergebnisse protokollierst. -
      8. -
      -
      -
      -
      - - diff --git a/04_typescript/uebungen/19_fn-typausdruecke/package.json b/04_typescript/uebungen/19_fn-typausdruecke/package.json deleted file mode 100644 index ac050ae..0000000 --- a/04_typescript/uebungen/19_fn-typausdruecke/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "19_fn-typausdruecke", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "commonjs" -} diff --git a/04_typescript/uebungen/19_fn-typausdruecke/src/main.ts b/04_typescript/uebungen/19_fn-typausdruecke/src/main.ts deleted file mode 100644 index 1446a1f..0000000 --- a/04_typescript/uebungen/19_fn-typausdruecke/src/main.ts +++ /dev/null @@ -1,29 +0,0 @@ -{ - // Übung 19: Arbeiten mit Function Type Expressions - - // In dieser Aufgabe schreibst du eine Funktion, die andere Funktionen als Parameter akzeptiert und Logik basierend auf diesen Function Type Expressions implementiert. - - // Anweisungen: - - // 1 Definiere einen Type Alias MathOperation für eine Funktion, die zwei numbers als Parameter nimmt und einen number zurückgibt. - type MathOperation = (x: number, y: number) => number; - - // 2 Implementiere eine Funktion calculate, die eine Funktion vom Typ MathOperation und zwei numbers annimmt und die Funktion auf die Zahlen anwendet. - const calculate = (func: MathOperation, a: number, b: number): number => { - return func(a, b); - }; - - // 3 Erstelle zwei neue Funktionen, add und multiply, die der Signatur MathOperation entsprechen. - const add: MathOperation = (a, b) => { - return a + b; - }; - - const multiply: MathOperation = (a: number, b: number): number => { - return a * b; - }; - - // 4 Teste alle Funktionen, indem du geeignete Argumente übergibst und die Ergebnisse protokollierst. - // Test cases - console.log(calculate(add, 10, 5)); // => 15 - console.log(calculate(multiply, 10, 5)); // => 50 -} diff --git a/04_typescript/uebungen/20_fn-call-signatures/assets/js/bundle.js b/04_typescript/uebungen/20_fn-call-signatures/assets/js/bundle.js deleted file mode 100644 index 44c90af..0000000 --- a/04_typescript/uebungen/20_fn-call-signatures/assets/js/bundle.js +++ /dev/null @@ -1,33 +0,0 @@ -(() => { - var __getOwnPropNames = Object.getOwnPropertyNames; - var __commonJS = (cb, mod) => function __require() { - try { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; - } catch (e) { - throw mod = 0, e; - } - }; - - // src/main.ts - var require_main = __commonJS({ - "src/main.ts"() { - (() => { - const double = (num) => num * 2; - const halve = (num) => num / 2; - const describeAndApply = (dnObj, num) => { - console.log(dnObj.description); - return dnObj(num); - }; - const describableDouble = Object.assign(double, { - description: "This operation doubles the number." - }); - const describableHalve = Object.assign(halve, { - description: "This operation halves the number." - }); - console.log(describeAndApply(describableDouble, 10)); - console.log(describeAndApply(describableHalve, 10)); - })(); - } - }); - require_main(); -})(); diff --git a/04_typescript/uebungen/20_fn-call-signatures/index.html b/04_typescript/uebungen/20_fn-call-signatures/index.html deleted file mode 100644 index a515ef4..0000000 --- a/04_typescript/uebungen/20_fn-call-signatures/index.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - Übung 20: Call Signatures für Zahlenoperationen - - - - -
      -
      -
      -

      Übung 20: Call Signatures für Zahlenoperationen

      -

      - In dieser Übung erstellst und verwendest du ein paar einfache - Funktionen, die sich an bestimmte Call Signatures für die Arbeit mit - Zahlen halten. -

      - -

      Anweisungen:

      -
        -
      1. - Definiere eine Funktion vom Typ - NumberOperation, die ein einzelnes - number annimmt und ein - number zurückgibt. -
      2. -
      3. - Implementiere zwei Funktionen, - double und halve, die der Call Signature - NumberOperation folgen: - -
          -
        • - double: Multipliziert die eingegebene Zahl mit 2. -
        • -
        • halve: Teilt die eingegebene Zahl durch 2.
        • -
        -
      4. -
      5. - Definiere einen Objekttyp - DescribableNumberOperation mit einer - description-Property vom Typ string und einer Cal - Signature, die NumberOperation entspricht. -
      6. -
      7. - Implementiere eine Funktion - describeAndApply, die ein - DescribableNumberOperation - Objekt annimmt, dessen description protokolliert und - die Operation auf eine bestimmte Zahl anwendet. -
      8. -
      9. Teste alle Funktionen mit ein paar Zahlen.
      10. -
      -
      -
      -
      - - diff --git a/04_typescript/uebungen/20_fn-call-signatures/package.json b/04_typescript/uebungen/20_fn-call-signatures/package.json deleted file mode 100644 index 61f867a..0000000 --- a/04_typescript/uebungen/20_fn-call-signatures/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "20_fn-call-signatures", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "commonjs" -} diff --git a/04_typescript/uebungen/20_fn-call-signatures/src/main.ts b/04_typescript/uebungen/20_fn-call-signatures/src/main.ts deleted file mode 100644 index fd790c8..0000000 --- a/04_typescript/uebungen/20_fn-call-signatures/src/main.ts +++ /dev/null @@ -1,43 +0,0 @@ -(() => { - // Übung 20: Call Signatures für Zahlenoperationen - - // In dieser Übung erstellst und verwendest du ein paar einfache Funktionen, die sich an bestimmte Call Signatures für die Arbeit mit Zahlen halten. - - // Anweisungen: - - // 1 Definiere eine Funktion vom Typ NumberOperation, die ein einzelnes number annimmt und ein number zurückgibt. - - type NumberOperation = (num: number) => number; - - // 2 Implementiere zwei Funktionen, double und halve, die der Call Signature NumberOperation folgen: - - // double: Multipliziert die eingegebene Zahl mit 2. - const double: NumberOperation = (num) => num * 2; // keine geschweiften Klammern - - // halve: Teilt die eingegebene Zahl durch 2. - const halve: NumberOperation = (num) => num / 2; - - // 3 Definiere einen Objekttyp DescribableNumberOperation mit einer description-Property vom Typ string und einer Cal Signature, die NumberOperation entspricht. - type DescribableNumberOperation = { - description: string; - (num: number): number; - }; - - // 4 Implementiere eine Funktion describeAndApply, die ein DescribableNumberOperation Objekt annimmt, dessen description protokolliert und die Operation auf eine bestimmte Zahl anwendet. - const describeAndApply = (dnObj: DescribableNumberOperation, num: number) => { - console.log(dnObj.description); - return dnObj(num); - }; - - // 5 Teste alle Funktionen mit ein paar Zahlen. - const describableDouble: DescribableNumberOperation = Object.assign(double, { - description: 'This operation doubles the number.', - }); - - const describableHalve: DescribableNumberOperation = Object.assign(halve, { - description: 'This operation halves the number.', - }); - - console.log(describeAndApply(describableDouble, 10)); // => 20 - console.log(describeAndApply(describableHalve, 10)); // => 5 -})(); diff --git a/04_typescript/uebungen/21_fn-identity/index.html b/04_typescript/uebungen/21_fn-identity/index.html deleted file mode 100644 index 3720296..0000000 --- a/04_typescript/uebungen/21_fn-identity/index.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - Übung 21: Eine allgemeine Identitätsfunktion erstellen - - - - -
      -
      -
      -

      Übung 21: Eine allgemeine Identitätsfunktion erstellen

      -

      - In dieser Übung erstellst du eine einfache generische Funktion - namens identity, die den ihr übergebenen Wert - zurückgibt. So lernst du, wie generische Funktionen mit - verschiedenen Typen arbeiten können, ohne die Typsicherheit zu - verlieren. -

      - -

      Anweisungen:

      -
        -
      1. - Implementiere eine generische identity Funktion, die - einen Parameter vom Typ T annimmt und denselben Wert - zurückgibt. -
      2. -
      3. - Rufe identity mit einer number auf und - speichere das Ergebnis. -
      4. -
      5. - Rufe identity mit einer string auf und - speichere das Ergebnis. -
      6. -
      7. - Rufe identity mit einem Array von Objekten auf und - speichere das Ergebnis. -
      8. -
      9. - Stelle sicher, dass TypeScript die Rückgabetypen ohne explicit - Type Annotations korrekt herleitet. -
      10. -
      -
      -
      -
      - - diff --git a/04_typescript/uebungen/21_fn-identity/package.json b/04_typescript/uebungen/21_fn-identity/package.json deleted file mode 100644 index 8427e8d..0000000 --- a/04_typescript/uebungen/21_fn-identity/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "21_fn-identity", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "commonjs" -} diff --git a/04_typescript/uebungen/21_fn-identity/src/main.ts b/04_typescript/uebungen/21_fn-identity/src/main.ts deleted file mode 100644 index 382ea58..0000000 --- a/04_typescript/uebungen/21_fn-identity/src/main.ts +++ /dev/null @@ -1,33 +0,0 @@ -(() => { - // Übung 21: Eine allgemeine Identitätsfunktion erstellen - - // In dieser Übung erstellst du eine einfache generische Funktion namens identity, die den ihr übergebenen Wert zurückgibt. So lernst du, wie generische Funktionen mit verschiedenen Typen arbeiten können, ohne die Typsicherheit zu verlieren. - - // Anweisungen: - - // 1 Implementiere eine generische identity Funktion, die einen Parameter vom Typ T annimmt und denselben Wert zurückgibt. - - const identity = (x: T): T => { - return x; - }; - - // 2 Rufe identity mit einer number auf und speichere das Ergebnis. - - const resultNum = identity(2); - - // 3 Rufe identity mit einer string auf und speichere das Ergebnis. - - const resultString = identity('John'); - - // 4 Rufe identity mit einem Array von Objekten auf und speichere das Ergebnis. - - const resultArr = identity([ - { firstName: 'John' }, - { lastName: 'Wick' }, - { firstName: 'Jane', lastName: 'Doe' }, - ]); - - // 5 Stelle sicher, dass TypeScript die Rückgabetypen ohne explicit Type Annotations korrekt herleitet. - - console.log(`Num: ${resultNum}, String: ${resultString}, Arr: ${JSON.stringify(resultArr)}`); -})(); diff --git a/04_typescript/uebungen/22_fn-optional-props/index.html b/04_typescript/uebungen/22_fn-optional-props/index.html deleted file mode 100644 index 603c443..0000000 --- a/04_typescript/uebungen/22_fn-optional-props/index.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - Übung 22: Optionale Parameter implementieren - - - - -
      -
      -
      -

      Übung 22: Optionale Parameter implementieren

      -

      - Erstelle die Funktion createUserProfile, die drei - Parameter benötigt: einen obligatorischen username und zwei - optionale Parameter, age und email. Die - Funktion sollte einen String mit einer Profilzusammenfassung - zurückgeben. Wenn keine optionalen Parameter angegeben werden, - sollten die Standardwerte verwendet werden, um das Profil zu - vervollständigen. -

      - -

      Anweisungen:

      -
        -
      • - Definiere eine Funktion createUserProfile, die - akzeptiert: -
          -
        • username (erforderlich, String)
        • -
        • age (optional, Zahl, Standardwert ist 18)
        • -
        • - email (optional, String, Standardwert: "N/A") -
        • -
        -
      • -
      • - Die Funktion sollte einen String zurückgeben, der das Profil des - Nutzers zusammenfasst. -
      • -
      -
      -
      -
      - - diff --git a/04_typescript/uebungen/22_fn-optional-props/package.json b/04_typescript/uebungen/22_fn-optional-props/package.json deleted file mode 100644 index 88e6a06..0000000 --- a/04_typescript/uebungen/22_fn-optional-props/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "22_fn-optional-props", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "commonjs" -} diff --git a/04_typescript/uebungen/22_fn-optional-props/src/main.ts b/04_typescript/uebungen/22_fn-optional-props/src/main.ts deleted file mode 100644 index 6a083ef..0000000 --- a/04_typescript/uebungen/22_fn-optional-props/src/main.ts +++ /dev/null @@ -1,26 +0,0 @@ -(() => { - // Übung 22: Optionale Parameter implementieren - - // Erstelle die Funktion createUserProfile, die drei Parameter benötigt: einen obligatorischen username und zwei optionale Parameter, age und email. Die Funktion sollte einen String mit einer Profilzusammenfassung zurückgeben. Wenn keine optionalen Parameter angegeben werden, sollten die Standardwerte verwendet werden, um das Profil zu vervollständigen. - - // Anweisungen: - - // Definiere eine Funktion createUserProfile, die akzeptiert: - - // username (erforderlich, String) - // age (optional, Zahl, Standardwert ist 18) - // email (optional, String, Standardwert: "N/A") - - // Keine Fragezeichen nötig - const createUserProfile = (username: string, age: number = 18, email: string = 'N/A') => { - return `User ${username} is ${age} years old and can be contacted at ${email}.`; - }; - - // Die Funktion sollte einen String zurückgeben, der das Profil des Nutzers zusammenfasst. - - console.log(createUserProfile('JohnDoe', 25, 'john@example.com')); - // => "User JohnDoe is 25 years old and can be contacted at john@example.com." - - console.log(createUserProfile('JaneDoe')); - // => "User JaneDoe is 18 years old and can be contacted at N/A." -})(); diff --git a/04_typescript/uebungen/23_fn-rest-params-args/index.html b/04_typescript/uebungen/23_fn-rest-params-args/index.html deleted file mode 100644 index f5de609..0000000 --- a/04_typescript/uebungen/23_fn-rest-params-args/index.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - Übung 23: Restparameter und Restargumente - - - - -
      -
      -
      -

      Übung 23: Restparameter und Restargumente

      -

      - Schreibe zwei Funktionen: eine, die Restparameter verwendet, um eine - unterschiedliche Anzahl von Zahlen zu akzeptieren und ihre Summe zu - berechnen, und eine andere, die die Spread-Syntax verwendet, um ein - Array von Zahlen in einzelne Argumente für eine mathematische - Funktion zu verteilen. -

      - -

      Anweisungen:

      -
        -
      1. - Definiere eine Funktion sumAll, die einen - Restparameter, bestehend aus einer variablen Anzahl von - numerischen Argumenten, annimmt und die Summe aller übergebenen - Zahlen zurückgibt. Verwende die Methode reduce, um die Summe des - Arrays zu berechnen. -
      2. -
      3. - Als Nächstes definierst du eine Funktion namens - calculateHypotenuse, die zwei Zahlen als Argumente - akzeptiert und die Hypotenuse mithilfe der Formel - √(a² + b²) - berechnet. Du solltest diese Funktion aufrufen, indem du ein Array - mit zwei Zahlen mit Hilfe der Spread-Syntax ausbreitest. (Tipp: - Verwende Math.sqrt()) -
      4. -
      5. - Teste schließlich die Funktion sumAll, indem du sie - mit mehreren Zahlen aufrufst und das Ergebnis protokollierst. - Teste die Funktion calculateHypotenuse, indem du ein - Array mit zwei Zahlen erstellst, dieses Array in die Funktion - überträgst und das Ergebnis protokollierst. Versuche außerdem, - calculateHypotenuse mit einem Array aufzurufen, das - nicht genau zwei Zahlen enthält, um das Type-Checking von - TypeScript zu beobachten. -
      6. -
      -
      -
      -
      - - diff --git a/04_typescript/uebungen/23_fn-rest-params-args/package.json b/04_typescript/uebungen/23_fn-rest-params-args/package.json deleted file mode 100644 index ad2213f..0000000 --- a/04_typescript/uebungen/23_fn-rest-params-args/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "23_fn-rest-params-args", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "commonjs" -} diff --git a/04_typescript/uebungen/23_fn-rest-params-args/src/main.ts b/04_typescript/uebungen/23_fn-rest-params-args/src/main.ts deleted file mode 100644 index 761d9d8..0000000 --- a/04_typescript/uebungen/23_fn-rest-params-args/src/main.ts +++ /dev/null @@ -1,42 +0,0 @@ -(() => { - // Übung 23: Restparameter und Restargumente - - // Schreibe zwei Funktionen: eine, die Restparameter verwendet, um eine unterschiedliche Anzahl von Zahlen zu akzeptieren und ihre Summe zu berechnen, und eine andere, die die Spread-Syntax verwendet, um ein Array von Zahlen in einzelne Argumente für eine mathematische Funktion zu verteilen. - - // Anweisungen: - - // 1 Definiere eine Funktion sumAll, die einen Restparameter, bestehend aus einer variablen Anzahl von numerischen Argumenten, annimmt und die Summe aller übergebenen Zahlen zurückgibt. Verwende die Methode reduce, um die Summe des Arrays zu berechnen. - - const sumAll = (...nums: number[]) => { - return nums.reduce((sum, num) => sum + num, 0); - }; - - // 2 Als Nächstes definierst du eine Funktion namens calculateHypotenuse, die zwei Zahlen als Argumente akzeptiert und die Hypotenuse mithilfe der Formel √(a² + b²) berechnet. Du solltest diese Funktion aufrufen, indem du ein Array mit zwei Zahlen mit Hilfe der Spread-Syntax ausbreitest. (Tipp: Verwende Math.sqrt()) - const calculateHypotenuse = (...[n1, n2]: [number, number]): number => { - return Math.sqrt(n1 ** 2 + n2 ** 2); - }; - - // 3 Teste schließlich die Funktion sumAll, indem du sie mit mehreren Zahlen aufrufst und das Ergebnis protokollierst. Teste die Funktion calculateHypotenuse, indem du ein Array mit zwei Zahlen erstellst, dieses Array in die Funktion überträgst und das Ergebnis protokollierst. Versuche außerdem, calculateHypotenuse mit einem Array aufzurufen, das nicht genau zwei Zahlen enthält, um das Type-Checking von TypeScript zu beobachten. - - // console.log(sumAll([1, 2, 3, 4, 5])); - // console.log(sumAll(1, 2, 3, 4, 5)); - - // Example usage of sumAll - // Define total - const sumNums = sumAll(1, 2, 3, 4, 5); - console.log(sumNums); // => 15 - console.log(sumAll()); // => 0 - - // Example usage of calculateHypotenuse with spread syntax - // Define hypotenuse - - console.log(calculateHypotenuse(3, 4)); // => 5 - - // Attempting to call calculateHypotenuse with incorrect number of arguments - const invalidSides: [number, number] = [3, 4]; - const invalidSides2: number[] = [3, 4, 5]; - - // Define invalidHypotenuse to call calculateHypotenuse with invalidSides => TypeScript Error: Expected 2 arguments, but got 3. - calculateHypotenuse(...invalidSides); - // calculateHypotenuse(...invalidSides2); // A spread argument must either have a tuple type or be passed to a rest parameter. -})(); diff --git a/04_typescript/uebungen/24_fn-destructuring/index.html b/04_typescript/uebungen/24_fn-destructuring/index.html deleted file mode 100644 index 84a0500..0000000 --- a/04_typescript/uebungen/24_fn-destructuring/index.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - Übung 24: Parameter Destrukturierung - - - - -
      -
      -
      -

      Übung 24: Parameter Destrukturierung

      -

      - In dieser Übung übst du die Anwendung der Parameterdestrukturierung - in TypeScript, indem du zwei einfache Funktionen erstellst. Die - erste Funktion destrukturiert einen Objektparameter und verwendet - einen Standardwert für eine seiner Eigenschaften. Die zweite - Funktion destrukturiert einen Array-Parameter. Beide Funktionen - enthalten Type Annotations, um sicherzustellen, dass sie die - richtige Struktur erhalten. -

      - -

      Anweisungen:

      -
        -
      1. - Erstelle eine Funktion displayUserInfo, die die - Eigenschaften name und age aus einem - Objektparameter destrukturiert und einen Standardwert für - age liefert. -
      2. -
      3. - Erstelle eine Funktion getFirstTwoElements, die die - ersten beiden Elemente aus einem Array-Parameter zerstört. -
      4. -
      5. - Teste deine Funktionen, indem du sie mit den richtigen Argumenten - aufrufst. -
      6. -
      -
      -
      -
      - - diff --git a/04_typescript/uebungen/24_fn-destructuring/package.json b/04_typescript/uebungen/24_fn-destructuring/package.json deleted file mode 100644 index ee867af..0000000 --- a/04_typescript/uebungen/24_fn-destructuring/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "24_fn-destructuring", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "commonjs" -} diff --git a/04_typescript/uebungen/24_fn-destructuring/src/main.ts b/04_typescript/uebungen/24_fn-destructuring/src/main.ts deleted file mode 100644 index 52e86a9..0000000 --- a/04_typescript/uebungen/24_fn-destructuring/src/main.ts +++ /dev/null @@ -1,36 +0,0 @@ -(() => { - // Übung 24: Parameter Destrukturierung - - // In dieser Übung übst du die Anwendung der Parameterdestrukturierung in TypeScript, indem du zwei einfache Funktionen erstellst. Die erste Funktion destrukturiert einen Objektparameter und verwendet einen Standardwert für eine seiner Eigenschaften. Die zweite Funktion destrukturiert einen Array-Parameter. Beide Funktionen enthalten Type Annotations, um sicherzustellen, dass sie die richtige Struktur erhalten. - - // Anweisungen: - - // 1 Erstelle eine Funktion displayUserInfo, die die Eigenschaften name und age aus einem Objektparameter destrukturiert und einen Standardwert für age liefert. - - // interface User { - type User = { - name: string; - age?: number; - }; - - const displayUserInfo = (user: User): void => { - const { name, age = 18 } = user; - - console.log(`Hello, ${name}! You are ${age} years old`); - }; - - // 2 Erstelle eine Funktion getFirstTwoElements, die die ersten beiden Elemente aus einem Array-Parameter zerstört. - const getFirstTwoElements = ([firstEl, secondEL]: [number, number?]): void => { - console.log(`First: ${firstEl}, Second: ${secondEL}`); - }; - - // 3 Teste deine Funktionen, indem du sie mit den richtigen Argumenten aufrufst. - - // Example usage of displayUserInfo - displayUserInfo({ name: 'John' }); // => Hello, John! You are 25 years old. - displayUserInfo({ name: 'Alice', age: 30 }); // => Hello, Alice! You are 30 years old. - - // Example usage of getFirstTwoElements - getFirstTwoElements([5, 10]); // => First: 5, Second: 10 - getFirstTwoElements([8]); // => First: 8, Second: undefined -})(); diff --git a/04_typescript/uebungen/25_obj-read-only/index.html b/04_typescript/uebungen/25_obj-read-only/index.html deleted file mode 100644 index 8b33cab..0000000 --- a/04_typescript/uebungen/25_obj-read-only/index.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - Übung 25: Optionale und readonly Eigenschaften - - - - -
      -
      -
      -

      Übung 25: Optionale und readonly Eigenschaften

      -

      - In dieser Übung erstellst du eine interface für ein - »Product«, die erforderliche, optionale und readonly Eigenschaften - enthält. Anschließend schreibst du eine Funktion, die Informationen - über das Produkt protokolliert und dabei optionale Eigenschaften - korrekt behandelt. -

      - -

      Anweisungen:

      -
        -
      1. - Definiere ein Product Interface, die Folgendes - beinhaltet: -
          -
        • - Erforderliche Eigenschaften id (Number) und - name (String). -
        • -
        • - Optionale Eigenschaften price (Number) und - description (String). -
        • -
        • - Eine readonly category (String) - Eigenschaft. -
        • -
        -
      2. -
      3. - Schreibe eine Funktion printProductDetails, die ein - Product Objekt annimmt und: -
          -
        • - Druckt die name, category und - id. -
        • -
        • - Wenn price undefined ist, drucke - "Price: Not available". -
        • -
        • - Wenn description undefined ist, - drucke "No description availabler". -
        • -
        -
      4. -
      -
      -
      -
      - - diff --git a/04_typescript/uebungen/25_obj-read-only/package.json b/04_typescript/uebungen/25_obj-read-only/package.json deleted file mode 100644 index a5ad3f3..0000000 --- a/04_typescript/uebungen/25_obj-read-only/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "25_obj-read-only", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "commonjs" -} diff --git a/04_typescript/uebungen/25_obj-read-only/src/main.ts b/04_typescript/uebungen/25_obj-read-only/src/main.ts deleted file mode 100644 index 7b4f3d2..0000000 --- a/04_typescript/uebungen/25_obj-read-only/src/main.ts +++ /dev/null @@ -1,69 +0,0 @@ -(() => { - // Übung 25: Optionale und readonly Eigenschaften - - // In dieser Übung erstellst du eine interface für eine Product, die erforderliche, optionale und readonly Eigenschaften enthält. Anschließend schreibst du eine Funktion, die Informationen über das Produkt protokolliert und dabei optionale Eigenschaften korrekt behandelt. - - // Anweisungen: - - // 1 Definiere ein Product Interface, die Folgendes beinhaltet: - - // Erforderliche Eigenschaften id (Number) und name (String). - // Optionale Eigenschaften price (Number) und description (String). - // Eine readonly category (String) Eigenschaft. - - interface Product { - id: number; - name: string; - price?: number; - description?: string; - readonly category: string; - } - - // 2 Schreibe eine Funktion printProductDetails, die ein Product Objekt annimmt und: - - // Druckt die name, category und id. - // Wenn price undefined ist, drucke "Price: Not available". - // Wenn description undefined ist, drucke "No description availabler". - - const printProductDetails = (product: Product): void => { - // let price = product.price ? product.price : 'Not avaible'; - // let descr = product.description ? product.description : 'No description avaible'; - let price = product.price ?? 'Not avaible'; - let descr = product.description ?? 'No description avaible'; - - console.log( - `Name: ${product.name}, Kategorie: ${product.category}, ID: ${product.id}, Preis: ${price}, Beschreibung: ${descr}`, - ); - }; - - //Aus Faulheit mit KI Objekte zum testen erstellt - - // 1. Produkt mit ALLEN Eigenschaften - const fullProduct: Product = { - id: 101, - name: 'Gaming Laptop', - category: 'Elektronik', - price: 1299.99, - description: 'Leistungsstarker Laptop für Gaming und Arbeit.', - }; - - // 2. Produkt OHNE optionale Eigenschaften (weder Preis noch Beschreibung) - const minimalProduct: Product = { - id: 102, - name: 'Kaffeetasse', - category: 'Haushalt', - }; - - // 3. Produkt NUR MIT Beschreibung (ohne Preis) - const noPriceProduct: Product = { - id: 103, - name: 'Antikes Buch', - category: 'Bücher', - description: 'Ein rares Sammlerstück aus dem 19. Jahrhundert.', - }; - - // Tests ausführen: - printProductDetails(fullProduct); //Name: Gaming Laptop, Kategorie: Elektronik, ID: 101, Preis: 1299.99, Beschreibung: Leistungsstarker Laptop für Gaming und Arbeit. - printProductDetails(minimalProduct); //Name: Kaffeetasse, Kategorie: Haushalt, ID: 102, Preis: Not avaible, Beschreibung: No description avaible - printProductDetails(noPriceProduct); //Name: Antikes Buch, Kategorie: Bücher, ID: 103, Preis: Not avaible, Beschreibung: Ein rares Sammlerstück aus dem 19. Jahrhundert. -})(); diff --git a/04_typescript/uebungen/26_obj-update/index.html b/04_typescript/uebungen/26_obj-update/index.html deleted file mode 100644 index b27bf67..0000000 --- a/04_typescript/uebungen/26_obj-update/index.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Übung 26: Eine verschachtelte Objekteigenschaft aktualisieren - - - - -
      -
      -
      -

      Übung 26: Eine verschachtelte Objekteigenschaft aktualisieren

      -

      - In dieser Übung definierst du ein Interface mit readonly und - veränderbaren Eigenschaften und aktualisierst ein verschachteltes - Objekt innerhalb des Interfaces. Du übst den Umgang mit - verschachtelten Objekten und readonly Eigenschaften. -

      - -

      Anweisungen:

      -
        -
      1. - Erstelle ein Employee Interface, die Folgendes - enthält: -
          -
        • - Eine readonly employeeId (Number) - Eigenschaft. -
        • -
        • - Eine veränderbare Detail-Eigenschaft, die ein Objekt ist, das - Folgendes enthält: position (String) und - salary (Number) -
        • -
        -
      2. -
      3. - Schreibe eine Funktion updateEmployeePosition die: -
          -
        • - Akzeptiert ein Employee Objekt und einen neuen - position String. -
        • -
        • - Aktualisiert die position des Mitarbeiters, - verhindert aber jede Änderung der employeeId. -
        • -
        -
      4. -
      5. - Teste die Funktion, indem du ein Employee-Objekt erstellst und die - Position aktualisierst. -
      6. -
      -
      -
      -
      - - diff --git a/04_typescript/uebungen/26_obj-update/package.json b/04_typescript/uebungen/26_obj-update/package.json deleted file mode 100644 index 9ee6218..0000000 --- a/04_typescript/uebungen/26_obj-update/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "26_obj-update", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "commonjs" -} diff --git a/04_typescript/uebungen/26_obj-update/src/main.ts b/04_typescript/uebungen/26_obj-update/src/main.ts deleted file mode 100644 index de03cc0..0000000 --- a/04_typescript/uebungen/26_obj-update/src/main.ts +++ /dev/null @@ -1,41 +0,0 @@ -(() => { - // Übung 26: Eine verschachtelte Objekteigenschaft aktualisieren - - // In dieser Übung definierst du ein Interface mit readonly und veränderbaren Eigenschaften und aktualisierst ein verschachteltes Objekt innerhalb des Interfaces. Du übst den Umgang mit verschachtelten Objekten und readonly Eigenschaften. - - // Anweisungen: - - // Erstelle ein Employee Interface, die Folgendes enthält: - // Eine readonly employeeId (Number) Eigenschaft. - // Eine veränderbare Detail-Eigenschaft, die ein Objekt ist, das Folgendes enthält: position (String), salary (Number) - - interface Employee { - readonly employeeId: number; - details: { - position: string; - salary: number; - }; - } - - // Schreibe eine Funktion updateEmployeePosition die: - - // Akzeptiert ein Employee Objekt und einen neuen position String. - const updateEmployeePosition = (emp: Employee, pos: string) => { - emp.details.position = pos; - console.log(`ID: ${emp.employeeId}, Position: ${emp.details.position}, Salaray: ${emp.details.salary}`); - }; - - // Aktualisiert die position des Mitarbeiters, verhindert aber jede Änderung der employeeId. - - // Teste die Funktion, indem du ein Employee-Objekt erstellst und die Position aktualisierst. - - const employee: Employee = { - employeeId: 1, - details: { - position: 'normaler Angestellter', - salary: 1400, - }, - }; - - updateEmployeePosition(employee, 'cooler Angestellter'); -})(); diff --git a/04_typescript/uebungen/27_obj-interface-props/index.html b/04_typescript/uebungen/27_obj-interface-props/index.html deleted file mode 100644 index 9da2cc2..0000000 --- a/04_typescript/uebungen/27_obj-interface-props/index.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - Übung 27: Kombiniere Optional, Readonly und Required Properties in einem - Interface - - - - - -
      -
      -
      -

      - Übung 27: Kombiniere Optional, Readonly und Required Properties in - einem Interface -

      -

      - In dieser Übung erstellst du ein Car Interface mit - required, optional und readonly Eigenschaften. Anschließend - schreibst du eine Funktion, um ein neues Car Objekt zu - erstellen und Änderungen an veränderbaren Eigenschaften zu - verarbeiten. -

      - -

      Anweisungen:

      -
        -
      1. - Definiere ein Car Interface, die Folgendes - beinhaltet: -
          -
        • - Erforderliche Eigenschaften make (string) und - model (string). -
        • -
        • - Optionale Eigenschaften year (Number) und - color (String). -
        • -
        • - Eine readonly vin (string) Eigenschaft - (Fahrzeugidentifikationsnummer). -
        • -
        -
      2. -
      3. - Schreibe eine Funktion createCar die: -
          -
        • - Nimmt make, model und - vin auf und gibt ein Car Objekt - zurück. -
        • -
        • - Optional können year und color - akzeptiert werden. -
        • -
        -
      4. -
      5. - Schreibe eine weitere Funktion paintCar die: -
          -
        • - Akzeptiert ein Car Objekt und einen neuen - color String. -
        • -
        • - Aktualisiert die color des Fahrzeugs (falls - vorhanden), verhindert aber jede Änderung an der - vin. -
        • -
        -
      6. -
      -
      -
      -
      - - diff --git a/04_typescript/uebungen/27_obj-interface-props/package.json b/04_typescript/uebungen/27_obj-interface-props/package.json deleted file mode 100644 index b9453a4..0000000 --- a/04_typescript/uebungen/27_obj-interface-props/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "27_obj-interface-props", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "commonjs" -} diff --git a/04_typescript/uebungen/27_obj-interface-props/src/main.ts b/04_typescript/uebungen/27_obj-interface-props/src/main.ts deleted file mode 100644 index 80d0d96..0000000 --- a/04_typescript/uebungen/27_obj-interface-props/src/main.ts +++ /dev/null @@ -1,46 +0,0 @@ -// Übung 27: Kombiniere Optional, Readonly und Required Properties in einem Interface - -// In dieser Übung erstellst du ein Car Interface mit required, optional und readonly Eigenschaften. Anschließend schreibst du eine Funktion, um ein neues Car Objekt zu erstellen und Änderungen an veränderbaren Eigenschaften zu verarbeiten. - -// Anweisungen: - -// 1 Definiere ein Car Interface, die Folgendes beinhaltet: -// Erforderliche Eigenschaften make (string) und model (string). -// Optionale Eigenschaften year (Number) und color (String). -// Eine readonly vin (string) Eigenschaft (Fahrzeugidentifikationsnummer). -interface Car { - make: string; - model: string; - year?: number; - color?: string; - readonly vin: string; -} - -// 2 Schreibe eine Funktion createCar die: -// Nimmt make, model und vin auf und gibt ein Car Objekt zurück. -// Optional können year und color akzeptiert werden. - -type CreateCarFn = (a: string, b: string, c: string, d?: number, e?: string) => Car; - -// const createCar = (make: string, model: string, vin: string, year?: number, color?: string): Car => { -// return { make, model, vin, year, color }; -// }; - -const createCar: CreateCarFn = (make, model, vin, year, color) => { - return { make, model, vin, year, color }; -}; - -// 3 Schreibe eine weitere Funktion paintCar die: -// Akzeptiert ein Car Objekt und einen neuen color String. -// Aktualisiert die color des Fahrzeugs (falls vorhanden), verhindert aber jede Änderung an der vin. -const paintCar = (car: Car, color: string): Car => { - const res: Car = car; - res.color = color; - return res; -}; - -let car1 = createCar('VW', 'Golf', '1234', 2020, 'blau'); -console.log(car1); - -car1 = paintCar(car1, 'gelb'); -console.log(car1); diff --git a/04_typescript/uebungen/28_obj-excess-prop-check/index.html b/04_typescript/uebungen/28_obj-excess-prop-check/index.html deleted file mode 100644 index 41e47fa..0000000 --- a/04_typescript/uebungen/28_obj-excess-prop-check/index.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - Übung 28: Excess Property Checks mit Object Literals - - - - -
      -
      -
      -

      Übung 28: Excess Property Checks mit Object Literals

      -

      - In dieser Übung definierst du ein Interface Car und - schreibst eine Funktion, die ein Objekt vom Typ - Car annimmt. Du wirst untersuchen, wie TypeScript - Excess Property Checks erzwingt, indem es versucht, ein Objekt mit - zusätzlichen Eigenschaften an die Funktion zu übergeben. -

      - -

      Anweisungen:

      -
        -
      1. - Definiere ein Car Interface mit den folgenden - Eigenschaften: -
          -
        • make: String
        • -
        • model: String
        • -
        • year: Number
        • -
        -
      2. -
      3. - Schreibe eine Funktion printCarDetails, die ein - Objekt vom Typ Car annimmt und die Details des Autos - ausgibt (make, model und - year). -
      4. -
      5. - Versuche, der Funktion ein Objekt zu übergeben, das eine - zusätzliche Eigenschaft hat, z. B. color. Beobachte, - wie TypeScript mit der überzähligen Eigenschaft umgeht und - erkläre, warum der Fehler auftritt. -
      6. -
      -
      -
      -
      - - diff --git a/04_typescript/uebungen/28_obj-excess-prop-check/package.json b/04_typescript/uebungen/28_obj-excess-prop-check/package.json deleted file mode 100644 index 0e52588..0000000 --- a/04_typescript/uebungen/28_obj-excess-prop-check/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "28_obj-excess-prop-check", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "commonjs" -} diff --git a/04_typescript/uebungen/28_obj-excess-prop-check/src/main.ts b/04_typescript/uebungen/28_obj-excess-prop-check/src/main.ts deleted file mode 100644 index fd50a39..0000000 --- a/04_typescript/uebungen/28_obj-excess-prop-check/src/main.ts +++ /dev/null @@ -1,26 +0,0 @@ -// Übung 28: Excess Property Checks mit Object Literals - -// In dieser Übung definierst du ein Interface Car und schreibst eine Funktion, die ein Objekt vom Typ Car annimmt. Du wirst untersuchen, wie TypeScript Excess Property Checks erzwingt, indem es versucht, ein Objekt mit zusätzlichen Eigenschaften an die Funktion zu übergeben. - -// Anweisungen: - -// 1 Definiere ein Car Interface mit den folgenden Eigenschaften: - -// - make: String -// - model: String -// - year: Number -interface Car { - make: string; - model: string; - year: number; -} - -// 2 Schreibe eine Funktion printCarDetails, die ein Objekt vom Typ Car annimmt und die Details des Autos ausgibt (make, model und year). -const printCarDetails = (car: Car) => { - console.log(`Hersteller: ${car.make}`); - console.log(`Model: ${car.model}`); - console.log(`Baujahr: ${car.year}`); -}; - -// 3 Versuche, der Funktion ein Objekt zu übergeben, das eine zusätzliche Eigenschaft hat, z. B. color. Beobachte, wie TypeScript mit der überzähligen Eigenschaft umgeht und erkläre, warum der Fehler auftritt. -// printCarDetails({ make: 'VW', model: 'Golf', year: 2020, color: 'blue' }); diff --git a/04_typescript/uebungen/29_obj-extending-interface/index.html b/04_typescript/uebungen/29_obj-extending-interface/index.html deleted file mode 100644 index 23c0bbd..0000000 --- a/04_typescript/uebungen/29_obj-extending-interface/index.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - Übung 29: Extending einer einzelnen Interface - - - - -
      -
      -
      -

      Übung 29: Extending einer einzelnen Interface

      -

      - In dieser Übung wirst du eine bestehende - Product Interface erweitern, um einen spezifischeren - Typ Electronics zu erstellen. Du wirst zusätzliche - Eigenschaften für Elektronikprodukte definieren und ein Objekt des - Typs Electronics - erstellen. -

      - -

      Anweisungen:

      -
        -
      1. - Definiere ein Product Interface mit den Eigenschaften - id, name und price. -
      2. -
      3. - Erweitere die Product Interface um eine - Electronics Interface und füge die Eigenschaften - brand und warranty hinzu. -
      4. -
      5. Erstelle ein Objekt vom Typ Electronics.
      6. -
      -
      -
      -
      - - diff --git a/04_typescript/uebungen/29_obj-extending-interface/package.json b/04_typescript/uebungen/29_obj-extending-interface/package.json deleted file mode 100644 index f8c17c8..0000000 --- a/04_typescript/uebungen/29_obj-extending-interface/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "29_obj-extending-interface", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "commonjs" -} diff --git a/04_typescript/uebungen/29_obj-extending-interface/src/main.ts b/04_typescript/uebungen/29_obj-extending-interface/src/main.ts deleted file mode 100644 index 5275ed1..0000000 --- a/04_typescript/uebungen/29_obj-extending-interface/src/main.ts +++ /dev/null @@ -1,37 +0,0 @@ -{ - // Übung 29: Extending einer einzelnen Interface - - // In dieser Übung wirst du eine bestehende Product Interface erweitern, um einen spezifischeren Typ Electronics zu erstellen. Du wirst zusätzliche Eigenschaften für Elektronikprodukte definieren und ein Objekt des Typs Electronics erstellen. - - // Anweisungen: - - // 1 Definiere ein Product Interface mit den Eigenschaften id, name und price. - interface Product { - readonly id: number; - name: string; - price: number; - } - - // 2 Erweitere die Product Interface um eine Electronics Interface und füge die Eigenschaften brand und warranty hinzu. - interface Electronics extends Product { - brand: string; - warranty: number; - } - - // 3 Erstelle ein Objekt vom Typ Electronics. - const comp: Electronics = { - id: 1, - name: 'Computer', - price: 1499.99, - brand: 'Asus', - warranty: 24, - }; - - const konsole: Electronics = { - id: 2, - name: 'Steam', - price: 1039.99, - brand: 'Valve', - warranty: 24, - }; -} diff --git a/04_typescript/uebungen/30_obj-subtyp/index.html b/04_typescript/uebungen/30_obj-subtyp/index.html deleted file mode 100644 index 837219e..0000000 --- a/04_typescript/uebungen/30_obj-subtyp/index.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - Übung 30: Einzigartige Eigenschaften zu einem Subtyp hinzufügen - - - - - -
      -
      -
      -

      - Übung 30: Einzigartige Eigenschaften zu einem Subtyp hinzufügen -

      -

      - In dieser Übung wirst du die Product Interface - erweitern, um einen Typ Furniture zu erstellen, der - spezielle Eigenschaften für Möbel hinzufügt, wie - material und dimensions. -

      - -

      Anweisungen:

      -
        -
      1. - Erweitere die Product Interface, um eine - Furniture Interface zu erstellen. -
      2. -
      3. - Füge die Eigenschaften material und - dimensions zu den Möbeln hinzu. -
      4. -
      5. - Erstelle ein Objekt vom Typ Furniture, das ein Möbelstück - darstellt. -
      6. -
      -
      -
      -
      - - diff --git a/04_typescript/uebungen/30_obj-subtyp/package.json b/04_typescript/uebungen/30_obj-subtyp/package.json deleted file mode 100644 index 9a80620..0000000 --- a/04_typescript/uebungen/30_obj-subtyp/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "30_obj-subtyp", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "commonjs" -} diff --git a/04_typescript/uebungen/30_obj-subtyp/src/main.ts b/04_typescript/uebungen/30_obj-subtyp/src/main.ts deleted file mode 100644 index 6ed31d8..0000000 --- a/04_typescript/uebungen/30_obj-subtyp/src/main.ts +++ /dev/null @@ -1,25 +0,0 @@ -{ - // 1 Erweitere die Product Interface, um eine Furniture Interface zu erstellen. - interface Product { - readonly id: number; - name: string; - price: number; - } - - // 2 Füge die Eigenschaften material und dimensions zu den Möbeln hinzu. - interface Furniture extends Product { - material: string; - dimensions: { length: number; width: number; height: number }; - } - - // 3 Erstelle ein Objekt vom Typ Furniture, das ein Möbelstück darstellt. - const schrank: Furniture = { - id: 2, - name: 'Schrank', - price: 199.99, - material: 'Holz', - dimensions: { length: 0.7, width: 1.5, height: 1.7 }, - }; - - console.log(JSON.stringify(schrank, null, 2)); -} diff --git a/04_typescript/uebungen/31_obj-generics-fns/index.html b/04_typescript/uebungen/31_obj-generics-fns/index.html deleted file mode 100644 index c4ba6f9..0000000 --- a/04_typescript/uebungen/31_obj-generics-fns/index.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - Übung 31: Generic Functions für Arrays - - - - -
      -
      -
      -

      Übung 31: Generic Functions für Arrays

      -

      - In dieser Übung erstellst du eine generische Funktion, die mit - Arrays beliebigen Typs funktioniert. Du definierst eine Funktion, - die das erste Element des Arrays zurückgibt und es TypeScript - ermöglicht, den Elementtyp aus dem übergebenen Array abzuleiten. -

      - -

      Anweisungen:

      -
        -
      1. - Definiere eine generische Funktion - getFirstElement, die ein Array beliebigen Typs - annimmt und das erste Element oder undefined zurückgibt, wenn das - Array leer ist. -
      2. -
      3. - Rufe die Funktion mit Arrays verschiedener Typen auf - (number[], string[], etc.) und - protokolliere das Ergebnis. -
      4. -
      -
      -
      -
      - - diff --git a/04_typescript/uebungen/31_obj-generics-fns/package.json b/04_typescript/uebungen/31_obj-generics-fns/package.json deleted file mode 100644 index 9af4f66..0000000 --- a/04_typescript/uebungen/31_obj-generics-fns/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "31_obj-generics-fns", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "commonjs" -} diff --git a/04_typescript/uebungen/31_obj-generics-fns/src/main.ts b/04_typescript/uebungen/31_obj-generics-fns/src/main.ts deleted file mode 100644 index 2854787..0000000 --- a/04_typescript/uebungen/31_obj-generics-fns/src/main.ts +++ /dev/null @@ -1,23 +0,0 @@ -{ - // Übung 31: Generic Functions für Arrays - - // In dieser Übung erstellst du eine generische Funktion, die mit Arrays beliebigen Typs funktioniert. Du definierst eine Funktion, die das erste Element des Arrays zurückgibt und es TypeScript ermöglicht, den Elementtyp aus dem übergebenen Array abzuleiten. - - // Anweisungen: - - // 1 Definiere eine generische Funktion getFirstElement, die ein Array beliebigen Typs annimmt und das erste Element oder undefined zurückgibt, wenn das Array leer ist. - const getFirstElement = (arg: T[]): T => { - return arg[0]; - }; - - // 2 Rufe die Funktion mit Arrays verschiedener Typen auf (number[], string[], etc.) und protokolliere das Ergebnis. - console.log(getFirstElement([1, 2, 3])); - console.log(getFirstElement(['a', 'b', 'c'])); - console.log( - getFirstElement([ - { name: 'a', id: 1 }, - { name: 'b', id: 2 }, - ]), - ); - console.log(getFirstElement([])); -} diff --git a/04_typescript/uebungen/o01_create-btn.zip b/04_typescript/uebungen/o01_create-btn.zip deleted file mode 100644 index af3d596..0000000 Binary files a/04_typescript/uebungen/o01_create-btn.zip and /dev/null differ diff --git a/04_typescript/uebungen/o01_create-btn/assets/js/bundle.js b/04_typescript/uebungen/o01_create-btn/assets/js/bundle.js deleted file mode 100644 index f20d2e0..0000000 --- a/04_typescript/uebungen/o01_create-btn/assets/js/bundle.js +++ /dev/null @@ -1,122 +0,0 @@ -(() => { - // src/CreateBtn.ts - var defaultOpts = { - classes: [], - iconName: "circle", - showLabel: false, - label: "No Label", - clickHandler: () => { - console.log("no action"); - } - }; - var CreateButton = (options = defaultOpts) => { - const { - classes = defaultOpts.classes, - iconName = defaultOpts.iconName, - showLabel = defaultOpts.showLabel, - label = defaultOpts.label, - clickHandler = defaultOpts.clickHandler - } = options; - const btn = document.createElement("button"); - const icon = document.createElement("i"); - const span = document.createElement("span"); - btn.classList.add("btn", "me-2", "btn-sm", ...classes); - if (Array.isArray(iconName)) { - icon.classList.add("fas", ...iconName.map((icon2) => `fa-${icon2}`)); - } else { - icon.classList.add("fas", `fa-${iconName}`); - } - !showLabel && span.classList.add("visually-hidden"); - span.textContent = label; - btn.addEventListener("click", clickHandler); - btn.appendChild(icon); - btn.appendChild(span); - return btn; - }; - var CreateBtn_default = CreateButton; - - // src/main.ts - (() => { - const DOM = { - output: document.querySelector(".output") - }; - if (!DOM.output) return; - const init = () => { - renderButtons(); - }; - const renderButtons = () => { - const btn1 = CreateBtn_default({ - classes: ["btn-primary", "me-2"], - iconName: "plus", - label: "Hinzuf\xFCgen", - clickHandler: () => alert("Button 1 geklickt!") - }); - const btn2 = CreateBtn_default({ - classes: ["btn-success", "me-2"], - iconName: "check", - label: "Speichern", - clickHandler: () => console.log("Gespeichert") - }); - const btn3 = CreateBtn_default({ - classes: ["btn-warning", "me-2"], - iconName: "pen", - label: "Bearbeiten", - clickHandler: () => console.log("Bearbeiten gestartet") - }); - const btn4 = CreateBtn_default({ - classes: ["btn-danger"], - iconName: "trash", - label: "L\xF6schen", - clickHandler: () => console.log("Gel\xF6scht") - }); - const btn5 = CreateBtn_default({ - classes: ["btn-danger"], - showLabel: true, - label: "Default", - clickHandler: () => console.log("Gel\xF6scht") - }); - const btn6 = CreateBtn_default(); - const btn7 = CreateBtn_default({ - classes: ["btn-warning"], - iconName: ["compass", "spin"], - label: "compass", - clickHandler: () => console.log("Test") - }); - const btnOption1 = CreateBtn_default({ - classes: ["btn-secondary"], - iconName: "angle-up", - label: "LabelButton1", - clickHandler: () => { - console.log("Button 1 clicki"); - } - }); - const btnOption2 = CreateBtn_default({ - classes: ["btn-primary"], - iconName: "check", - showLabel: true, - label: "LabelButton2" - // clickHandler: () => { - // console.log('Button 2 clicki'); - // }, - }); - const btnOption3 = CreateBtn_default({ - classes: ["btn-dark"], - iconName: "user", - label: "LabelButton3", - clickHandler: () => { - console.log("Button 3 clicki"); - } - }); - const btnOption4 = CreateBtn_default({ - classes: ["btn-light", "btn-outline-primary"], - iconName: "pen", - label: "LabelButton4", - clickHandler: () => { - console.log("Button 4 clicki"); - } - }); - DOM.output.append(btn1, btn2, btn3, btn4, btn5, btn6, btn7, btnOption1, btnOption2, btnOption3, btnOption4); - }; - init(); - })(); -})(); diff --git a/04_typescript/uebungen/o01_create-btn/index.html b/04_typescript/uebungen/o01_create-btn/index.html deleted file mode 100644 index c436963..0000000 --- a/04_typescript/uebungen/o01_create-btn/index.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - CreateBtn als Modul - - - - - -
      -
      -

      CreateBtn als Modul

      -
      - Hier sollen 4 verschiedene Buttons erstellt über das CreateBtn Modul hinzugefügt werden. -
      -
      -
      - - diff --git a/04_typescript/uebungen/o01_create-btn/package-lock.json b/04_typescript/uebungen/o01_create-btn/package-lock.json deleted file mode 100644 index 3973673..0000000 --- a/04_typescript/uebungen/o01_create-btn/package-lock.json +++ /dev/null @@ -1,2100 +0,0 @@ -{ - "name": "create-btn", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "create-btn", - "version": "1.0.0", - "license": "ISC", - "devDependencies": { - "npm-run-all": "^4.1.5" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", - "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/call-bind": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", - "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "get-intrinsic": "^1.3.0", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", - "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", - "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-abstract-get": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-abstract-get/-/es-abstract-get-1.0.0.tgz", - "integrity": "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.2", - "is-callable": "^1.2.7", - "object-inspect": "^1.13.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", - "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz", - "integrity": "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-abstract-get": "^1.0.0", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "is-callable": "^1.2.7", - "is-date-object": "^1.1.0", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz", - "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2", - "hasown": "^2.0.4", - "is-callable": "^1.2.7", - "is-document.all": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/generator-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", - "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true, - "license": "ISC" - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", - "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-document.all": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz", - "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.4", - "generator-function": "^2.0.0", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true, - "license": "MIT" - }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "dev": true, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/npm-run-all": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", - "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "memorystream": "^0.3.1", - "minimatch": "^3.0.4", - "pidtree": "^0.3.0", - "read-pkg": "^3.0.0", - "shell-quote": "^1.6.1", - "string.prototype.padend": "^3.0.0" - }, - "bin": { - "npm-run-all": "bin/npm-run-all/index.js", - "run-p": "bin/run-p/index.js", - "run-s": "bin/run-s/index.js" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/own-keys": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.2.tgz", - "integrity": "sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.4", - "get-intrinsic": "^1.3.0", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "license": "MIT", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pidtree": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", - "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", - "dev": true, - "license": "MIT", - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve": { - "version": "1.22.12", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", - "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", - "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "get-intrinsic": "^1.3.0", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shell-quote": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.10.0.tgz", - "integrity": "sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", - "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4", - "side-channel-list": "^1.0.1", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", - "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.23", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", - "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/string.prototype.padend": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz", - "integrity": "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", - "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.2", - "es-object-atoms": "^1.1.2", - "has-property-descriptors": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", - "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", - "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "for-each": "^0.3.5", - "gopd": "^1.2.0", - "is-typed-array": "^1.1.15", - "possible-typed-array-names": "^1.1.0", - "reflect.getprototypeof": "^1.0.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.22", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", - "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - } - } -} diff --git a/04_typescript/uebungen/o01_create-btn/package.json b/04_typescript/uebungen/o01_create-btn/package.json deleted file mode 100644 index 2d044b6..0000000 --- a/04_typescript/uebungen/o01_create-btn/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "create-btn", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild src/main.ts --watch --bundle --outfile=assets/js/bundle.js --loader:.ts=ts", - "server": "npx http-server -p 3000 -c-1", - "start": "run-p server ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "module", - "devDependencies": { - "npm-run-all": "^4.1.5" - } -} diff --git a/04_typescript/uebungen/o01_create-btn/src/CreateBtn.ts b/04_typescript/uebungen/o01_create-btn/src/CreateBtn.ts deleted file mode 100644 index 3b61a59..0000000 --- a/04_typescript/uebungen/o01_create-btn/src/CreateBtn.ts +++ /dev/null @@ -1,51 +0,0 @@ -export interface Options { - classes: string[]; - iconName?: string | string[]; - label: string; - showLabel?: boolean; - clickHandler?: (e: PointerEvent) => void; // so kann bei nichtangabe des clickhandlers, der def wert der funktion CreateButton verwendet werden -} - -const defaultOpts: Options = { - classes: [], - iconName: 'circle', - showLabel: false, - label: 'No Label', - clickHandler: () => { - console.log('no action'); - }, -}; - -const CreateButton = (options: Options = defaultOpts): HTMLButtonElement => { - // Destructuring - const { - classes = defaultOpts.classes, - iconName = defaultOpts.iconName, - showLabel = defaultOpts.showLabel, - label = defaultOpts.label, - clickHandler = defaultOpts.clickHandler, - } = options; - - const btn = document.createElement('button'); - const icon = document.createElement('i'); - const span = document.createElement('span'); - - btn.classList.add('btn', 'me-2', 'btn-sm', ...classes); - if (Array.isArray(iconName)) { - // ['circle', 'spin'] -> wird zu classList.add('fas', 'fa-circle', 'fa-spin') - icon.classList.add('fas', ...iconName.map((icon) => `fa-${icon}`)); - } else { - icon.classList.add('fas', `fa-${iconName}`); - } - !showLabel && span.classList.add('visually-hidden'); - span.textContent = label; - - btn.addEventListener('click', clickHandler as EventListener); - // btn.append(icon,span) - btn.appendChild(icon); - btn.appendChild(span); - - return btn; -}; - -export default CreateButton; diff --git a/04_typescript/uebungen/o01_create-btn/src/main.ts b/04_typescript/uebungen/o01_create-btn/src/main.ts deleted file mode 100644 index 1112e4b..0000000 --- a/04_typescript/uebungen/o01_create-btn/src/main.ts +++ /dev/null @@ -1,98 +0,0 @@ -import CreateButton from './CreateBtn.js'; // Hinweis: In der Regel nutzt man hier .js als Dateiendung für Modul-Imports im Build-Prozess - -(() => { - // === DOM & VARS ======= - const DOM = { - output: document.querySelector('.output') as HTMLDivElement, - }; - - if (!DOM.output) return; - - // === INIT ============= - const init = () => { - renderButtons(); - }; - - // === FUNCTIONS ======== - const renderButtons = () => { - const btn1 = CreateButton({ - classes: ['btn-primary', 'me-2'], - iconName: 'plus', - label: 'Hinzufügen', - clickHandler: () => alert('Button 1 geklickt!'), - }); - - const btn2 = CreateButton({ - classes: ['btn-success', 'me-2'], - iconName: 'check', - label: 'Speichern', - clickHandler: () => console.log('Gespeichert'), - }); - - const btn3 = CreateButton({ - classes: ['btn-warning', 'me-2'], - iconName: 'pen', - label: 'Bearbeiten', - clickHandler: () => console.log('Bearbeiten gestartet'), - }); - - const btn4 = CreateButton({ - classes: ['btn-danger'], - iconName: 'trash', - label: 'Löschen', - clickHandler: () => console.log('Gelöscht'), - }); - const btn5 = CreateButton({ - classes: ['btn-danger'], - showLabel: true, - label: 'Default', - clickHandler: () => console.log('Gelöscht'), - }); - const btn6 = CreateButton(); - const btn7 = CreateButton({ - classes: ['btn-warning'], - iconName: ['compass', 'spin'], - label: 'compass', - clickHandler: () => console.log('Test'), - }); - - const btnOption1 = CreateButton({ - classes: ['btn-secondary'], - iconName: 'angle-up', - label: 'LabelButton1', - clickHandler: () => { - console.log('Button 1 clicki'); - }, - }); - const btnOption2 = CreateButton({ - classes: ['btn-primary'], - iconName: 'check', - showLabel: true, - label: 'LabelButton2', - // clickHandler: () => { - // console.log('Button 2 clicki'); - // }, - }); - const btnOption3 = CreateButton({ - classes: ['btn-dark'], - iconName: 'user', - label: 'LabelButton3', - clickHandler: () => { - console.log('Button 3 clicki'); - }, - }); - const btnOption4 = CreateButton({ - classes: ['btn-light', 'btn-outline-primary'], - iconName: 'pen', - label: 'LabelButton4', - clickHandler: () => { - console.log('Button 4 clicki'); - }, - }); - - // DOM.output.textContent = ''; - DOM.output.append(btn1, btn2, btn3, btn4, btn5, btn6, btn7, btnOption1, btnOption2, btnOption3, btnOption4); - }; - - init(); -})(); diff --git a/04_typescript/uebungen/uebungen-01-03-ts.zip b/04_typescript/uebungen/uebungen-01-03-ts.zip deleted file mode 100644 index ed9b71a..0000000 Binary files a/04_typescript/uebungen/uebungen-01-03-ts.zip and /dev/null differ diff --git a/04_typescript/uebungen/uebungen-04-10-o1.zip b/04_typescript/uebungen/uebungen-04-10-o1.zip deleted file mode 100644 index 3ed8951..0000000 Binary files a/04_typescript/uebungen/uebungen-04-10-o1.zip and /dev/null differ diff --git a/04_typescript/uebungen/uebungen-11-19.zip b/04_typescript/uebungen/uebungen-11-19.zip deleted file mode 100644 index 912a04d..0000000 Binary files a/04_typescript/uebungen/uebungen-11-19.zip and /dev/null differ diff --git a/04_typescript/uebungen/uebungen-20-31-ts.zip b/04_typescript/uebungen/uebungen-20-31-ts.zip deleted file mode 100644 index 0485e88..0000000 Binary files a/04_typescript/uebungen/uebungen-20-31-ts.zip and /dev/null differ diff --git a/04_typescript/unterricht/tag31/01_ts-fundamentals/assets/img/Understand-Typescript.jpg b/04_typescript/unterricht/tag31/01_ts-fundamentals/assets/img/Understand-Typescript.jpg deleted file mode 100644 index c3a5d16..0000000 Binary files a/04_typescript/unterricht/tag31/01_ts-fundamentals/assets/img/Understand-Typescript.jpg and /dev/null differ diff --git a/04_typescript/unterricht/tag31/01_ts-fundamentals/assets/js/01_interface-user.js b/04_typescript/unterricht/tag31/01_ts-fundamentals/assets/js/01_interface-user.js deleted file mode 100644 index 02a7088..0000000 --- a/04_typescript/unterricht/tag31/01_ts-fundamentals/assets/js/01_interface-user.js +++ /dev/null @@ -1,21 +0,0 @@ -(() => { - // src/01_interface-user.ts - var userOne = { - name: "John", - id: 1, - // username: 'JD', // Object literal may only specify known properties, and 'username' does not exist in type 'User'. - lastName: "Doe" - }; - userOne.id = 2; - userOne.lastName = "Wick"; - var userTwo = { - name: "Jane", - lastName: "Doe", - id: 3 - }; - Object.freeze(userTwo); - if (Object.hasOwn(userTwo, "name") && Object.hasOwn(userTwo, "id") && Object.hasOwn(userTwo, "lastName") && typeof userTwo.name === "string" && typeof userTwo.id === "number" && typeof userTwo.lastName === "string") { - console.log(userTwo); - console.log("Nerdy, without TS"); - } -})(); diff --git a/04_typescript/unterricht/tag31/01_ts-fundamentals/assets/js/02_unions.js b/04_typescript/unterricht/tag31/01_ts-fundamentals/assets/js/02_unions.js deleted file mode 100644 index a593480..0000000 --- a/04_typescript/unterricht/tag31/01_ts-fundamentals/assets/js/02_unions.js +++ /dev/null @@ -1,19 +0,0 @@ -(() => { - // src/02_unions.ts - var value; - var value2; - value = 123; - value = "einszweidrei"; - value2 = 123; - value2 = "einszweidrei"; - function getResults() { - return Math.random() > 0.5 ? "success" : 404; - } - var getResults2 = () => { - return Math.random() > 0.5 ? "success" : "error"; - }; - console.log("John Wick".indexOf("o")); - console.log("John Wick".indexOf("XXX")); - console.log(getResults()); - console.log(getResults2()); -})(); diff --git a/04_typescript/unterricht/tag31/01_ts-fundamentals/assets/js/03_generics.js b/04_typescript/unterricht/tag31/01_ts-fundamentals/assets/js/03_generics.js deleted file mode 100644 index d6cefb7..0000000 --- a/04_typescript/unterricht/tag31/01_ts-fundamentals/assets/js/03_generics.js +++ /dev/null @@ -1,24 +0,0 @@ -(() => { - // src/03_generics.ts - { - let identity = function(value) { - return value; - }; - const identity2 = (value) => { - return value; - }; - let stringResult = identity("Hello"); - let numberResult = identity2(42); - console.log(stringResult, numberResult); - let names = ["Tick", "Trick", "Track"]; - let names2 = ["Tick", "Trick", "Track"]; - let lottoNumbers = [12, 4, 16, 45, 23, 19]; - let lottoNumbers2 = [12, 4, 16, 45, 23, 19]; - let lottoNumbers3 = [12, 4, 16, 45, 23, 19]; - console.log(names, names2, lottoNumbers, lottoNumbers2, lottoNumbers3); - let namesWithAges = ["Bob", 23, "Alice", 44]; - let namesWithAges2 = ["Bob", 23, "Alice", 44]; - console.log("namesWithAges:", namesWithAges); - console.log("namesWithAges2:", namesWithAges2); - } -})(); diff --git a/04_typescript/unterricht/tag31/01_ts-fundamentals/assets/js/04_static-type-checking.js b/04_typescript/unterricht/tag31/01_ts-fundamentals/assets/js/04_static-type-checking.js deleted file mode 100644 index fabb7c1..0000000 --- a/04_typescript/unterricht/tag31/01_ts-fundamentals/assets/js/04_static-type-checking.js +++ /dev/null @@ -1,13 +0,0 @@ -(() => { - // src/04_static-type-checking.ts - { - const data = [1, 2, 3, 4, 5, 6]; - console.log(data.length); - const liEls = document.querySelectorAll("li"); - liEls?.forEach((el) => { - el.addEventListener("click", (e) => { - console.log("click"); - }); - }); - } -})(); diff --git a/04_typescript/unterricht/tag31/01_ts-fundamentals/assets/js/05_type-definition-function.js b/04_typescript/unterricht/tag31/01_ts-fundamentals/assets/js/05_type-definition-function.js deleted file mode 100644 index f0d7340..0000000 --- a/04_typescript/unterricht/tag31/01_ts-fundamentals/assets/js/05_type-definition-function.js +++ /dev/null @@ -1,11 +0,0 @@ -(() => { - // src/05_type-definition-function.ts - { - let calculateTotal = function(cart) { - return cart.getTotal(); - }; - const calculateTotal2 = (cart) => { - return cart.getTotal(); - }; - } -})(); diff --git a/04_typescript/unterricht/tag31/01_ts-fundamentals/assets/js/06_optional-exception.js b/04_typescript/unterricht/tag31/01_ts-fundamentals/assets/js/06_optional-exception.js deleted file mode 100644 index 6c1a5aa..0000000 --- a/04_typescript/unterricht/tag31/01_ts-fundamentals/assets/js/06_optional-exception.js +++ /dev/null @@ -1,25 +0,0 @@ -(() => { - // src/06_optional-exception.ts - { - const vehicle = { - make: "Toyota", - model: "Corolla", - startEngine() { - return `${this.make}: engine startet`; - } - }; - const vehicle2 = { - make: "Jeep", - model: "Renegade", - startEngine() { - return `${this.make}: engine startet`; - }, - stopEngine() { - console.log(`${this.make}: engine stoppt`); - } - }; - console.log(vehicle.startEngine()); - vehicle.stopEngine?.(); - vehicle2.stopEngine?.(); - } -})(); diff --git a/04_typescript/unterricht/tag31/01_ts-fundamentals/assets/js/07_static-type-check2.js b/04_typescript/unterricht/tag31/01_ts-fundamentals/assets/js/07_static-type-check2.js deleted file mode 100644 index 4a2e419..0000000 --- a/04_typescript/unterricht/tag31/01_ts-fundamentals/assets/js/07_static-type-check2.js +++ /dev/null @@ -1,22 +0,0 @@ -(() => { - // src/07_static-type-check2.ts - { - const calculateArea = (radius, pi) => { - return radius ** 2 * parseFloat(pi); - }; - console.log(calculateArea(10, "3.14")); - const greetUser = (name) => { - const greeting = "Hello, " + name; - const timestamp = /* @__PURE__ */ new Date(); - console.log(greeting); - }; - greetUser("John Wick"); - const dayOfWeek = (/* @__PURE__ */ new Date()).getDay(); - let message = ""; - if (dayOfWeek === 0 || dayOfWeek === 6) { - message = "It's a weekend!"; - } else if (dayOfWeek === 2) { - message = "It's Tuesday!"; - } - } -})(); diff --git a/04_typescript/unterricht/tag31/01_ts-fundamentals/assets/js/08_explicit-type-annotaions.js b/04_typescript/unterricht/tag31/01_ts-fundamentals/assets/js/08_explicit-type-annotaions.js deleted file mode 100644 index a007ec5..0000000 --- a/04_typescript/unterricht/tag31/01_ts-fundamentals/assets/js/08_explicit-type-annotaions.js +++ /dev/null @@ -1,18 +0,0 @@ -(() => { - // src/08_explicit-type-annotaions.ts - { - let age = 23; - let message = "Welcome Text"; - let toggle = true; - const logWelcome = (employee, hireDate) => { - console.log(`Welcome ${employee}, your hire date is ${hireDate.toDateString()}!`); - }; - logWelcome("John Wick", /* @__PURE__ */ new Date("2024")); - const processEmployee = (employee) => { - console.log( - `${employee.name} started on ${employee.startDate.toDateString()} with a salary of $${employee.salary}.` - ); - }; - processEmployee({ name: "John", startDate: /* @__PURE__ */ new Date("2026-07-20"), salary: 5e4 }); - } -})(); diff --git a/04_typescript/unterricht/tag31/01_ts-fundamentals/assets/js/09_type-inference.js b/04_typescript/unterricht/tag31/01_ts-fundamentals/assets/js/09_type-inference.js deleted file mode 100644 index 0e0f636..0000000 --- a/04_typescript/unterricht/tag31/01_ts-fundamentals/assets/js/09_type-inference.js +++ /dev/null @@ -1,24 +0,0 @@ -(() => { - // src/09_type-inference.ts - { - let greeting = "Hello World"; - greeting = "Hello TS!"; - let count = 123; - let isCompleted = true; - const isSmoking = true; - const houseNumber = 33; - let age = 40; - let names = ["Andreas", "Kahleel", "Ersin", "Adel"]; - let namesInUpperCase = names.map((name) => { - return name.toUpperCase(); - }); - console.log(namesInUpperCase.join(", ")); - let currentMessageNumber; - let randomValue; - let randomNumber; - randomNumber = "hello"; - randomNumber = 123; - randomNumber = true; - randomNumber = () => "test"; - } -})(); diff --git a/04_typescript/unterricht/tag31/01_ts-fundamentals/index.html b/04_typescript/unterricht/tag31/01_ts-fundamentals/index.html deleted file mode 100644 index 03e086e..0000000 --- a/04_typescript/unterricht/tag31/01_ts-fundamentals/index.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - TypeScript - Grundlagen - - - - - - - - - - - -
      -
      -

      TypeScript - Grundlagen

      -

      - TypeScript ist eine von Microsoft entwickelte Skriptsprache, die auf den Vorschlägen zum - ECMAScript-6-Standardbasiert und statische Typisierung zu JavaScript hinzufügt. Sprachkonstrukte von - TypeScript, wie Klassen, Vererbung, Module und anonyme Funktionen, wurden auch in ECMAScript 6 übernommen. -

      - TypeScript Kreisdiagramm -
      -
      - - diff --git a/04_typescript/unterricht/tag31/01_ts-fundamentals/package-lock.json b/04_typescript/unterricht/tag31/01_ts-fundamentals/package-lock.json deleted file mode 100644 index 10d9ea7..0000000 --- a/04_typescript/unterricht/tag31/01_ts-fundamentals/package-lock.json +++ /dev/null @@ -1,499 +0,0 @@ -{ - "name": "01_ts-fundamentals", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "01_ts-fundamentals", - "version": "1.0.0", - "devDependencies": { - "esbuild": "^0.28.1" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", - "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", - "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", - "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", - "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", - "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", - "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", - "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", - "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", - "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", - "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", - "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", - "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", - "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", - "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", - "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", - "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", - "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", - "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", - "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", - "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", - "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", - "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", - "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", - "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", - "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", - "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", - "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.28.1", - "@esbuild/android-arm": "0.28.1", - "@esbuild/android-arm64": "0.28.1", - "@esbuild/android-x64": "0.28.1", - "@esbuild/darwin-arm64": "0.28.1", - "@esbuild/darwin-x64": "0.28.1", - "@esbuild/freebsd-arm64": "0.28.1", - "@esbuild/freebsd-x64": "0.28.1", - "@esbuild/linux-arm": "0.28.1", - "@esbuild/linux-arm64": "0.28.1", - "@esbuild/linux-ia32": "0.28.1", - "@esbuild/linux-loong64": "0.28.1", - "@esbuild/linux-mips64el": "0.28.1", - "@esbuild/linux-ppc64": "0.28.1", - "@esbuild/linux-riscv64": "0.28.1", - "@esbuild/linux-s390x": "0.28.1", - "@esbuild/linux-x64": "0.28.1", - "@esbuild/netbsd-arm64": "0.28.1", - "@esbuild/netbsd-x64": "0.28.1", - "@esbuild/openbsd-arm64": "0.28.1", - "@esbuild/openbsd-x64": "0.28.1", - "@esbuild/openharmony-arm64": "0.28.1", - "@esbuild/sunos-x64": "0.28.1", - "@esbuild/win32-arm64": "0.28.1", - "@esbuild/win32-ia32": "0.28.1", - "@esbuild/win32-x64": "0.28.1" - } - } - } -} diff --git a/04_typescript/unterricht/tag31/01_ts-fundamentals/package.json b/04_typescript/unterricht/tag31/01_ts-fundamentals/package.json deleted file mode 100644 index f6b4be1..0000000 --- a/04_typescript/unterricht/tag31/01_ts-fundamentals/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "01_ts-fundamentals", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild \"src/*.ts\" --watch --bundle --outdir=\"assets/js\" --loader:.ts=ts" - }, - "keywords": [], - "type": "module", - "devDependencies": { - "esbuild": "^0.28.1" - } -} diff --git a/04_typescript/unterricht/tag31/01_ts-fundamentals/src/01_interface-user.ts b/04_typescript/unterricht/tag31/01_ts-fundamentals/src/01_interface-user.ts deleted file mode 100644 index 7c154d2..0000000 --- a/04_typescript/unterricht/tag31/01_ts-fundamentals/src/01_interface-user.ts +++ /dev/null @@ -1,43 +0,0 @@ -interface User { - name: string; - lastName: string; - id: number; -} - -const userOne: User = { - name: 'John', - id: 1, - // username: 'JD', // Object literal may only specify known properties, and 'username' does not exist in type 'User'. - lastName: 'Doe', -}; - -userOne.id = 2; -userOne.lastName = 'Wick'; - -// userOne._id = 2; // Property '_id' does not exist on type 'User'. -// userOne.lastname = 'Wick'; // Property 'lastname' does not exist on type 'User'. - -// ==== OHNE TypeScript - -const userTwo = { - name: 'Jane', - lastName: 'Doe', - id: 3, -}; - -Object.freeze(userTwo); -// userTwo.username = 'JD' - -if ( - Object.hasOwn(userTwo, 'name') && - Object.hasOwn(userTwo, 'id') && - Object.hasOwn(userTwo, 'lastName') && - typeof userTwo.name === 'string' && - typeof userTwo.id === 'number' && - typeof userTwo.lastName === 'string' -) { - console.log(userTwo); - console.log('Nerdy, without TS'); -} - -// userTwo.hasOwnProperty('name'); diff --git a/04_typescript/unterricht/tag31/01_ts-fundamentals/src/02_unions.ts b/04_typescript/unterricht/tag31/01_ts-fundamentals/src/02_unions.ts deleted file mode 100644 index 8a9bcbd..0000000 --- a/04_typescript/unterricht/tag31/01_ts-fundamentals/src/02_unions.ts +++ /dev/null @@ -1,29 +0,0 @@ -// Unions - Ein Union Type ermöglicht es dir, eine Variable zu deklarieren, die mehr als einen Werttyp enthalten kann. - -// Type Annotation -let text: string = 'Ich bin ein Text'; - -type StringOrNumber = string | number; // unions - -let value: string | number; // unions -let value2: StringOrNumber; - -value = 123; -value = 'einszweidrei'; - -value2 = 123; -value2 = 'einszweidrei'; - -function getResults(): string | number { - return Math.random() > 0.5 ? 'success' : 404; -} - -const getResults2 = (): string => { - return Math.random() > 0.5 ? 'success' : 'error'; -}; - -console.log('John Wick'.indexOf('o')); //=> 1 -console.log('John Wick'.indexOf('XXX')); //=> -1 - -console.log(getResults()); -console.log(getResults2()); diff --git a/04_typescript/unterricht/tag31/01_ts-fundamentals/src/03_generics.ts b/04_typescript/unterricht/tag31/01_ts-fundamentals/src/03_generics.ts deleted file mode 100644 index f55dec1..0000000 --- a/04_typescript/unterricht/tag31/01_ts-fundamentals/src/03_generics.ts +++ /dev/null @@ -1,36 +0,0 @@ -// Generics - Mit Hilfe von Generics kannst du wiederverwendbare Komponenten erstellen, die mit verschiedenen Datentypen arbeiten können und dabei die Typsicherheit wahren. - -{ - function identity(value: T): T { - return value; - } - - const identity2 = (value: T): T => { - return value; - }; - - let stringResult = identity('Hello'); - let numberResult = identity2(42); - - // type Syntax ========= - - console.log(stringResult, numberResult); - - type StringArray = Array; // string[] - type NumberArray = Array; // number[] - - let names: StringArray = ['Tick', 'Trick', 'Track']; - let names2: string[] = ['Tick', 'Trick', 'Track']; - - let lottoNumbers: NumberArray = [12, 4, 16, 45, 23, 19]; - let lottoNumbers2: Array = [12, 4, 16, 45, 23, 19]; - let lottoNumbers3: number[] = [12, 4, 16, 45, 23, 19]; - - console.log(names, names2, lottoNumbers, lottoNumbers2, lottoNumbers3); - - let namesWithAges: Array = ['Bob', 23, 'Alice', 44]; - let namesWithAges2: (string | number)[] = ['Bob', 23, 'Alice', 44]; - - console.log('namesWithAges:', namesWithAges); - console.log('namesWithAges2:', namesWithAges2); -} diff --git a/04_typescript/unterricht/tag31/01_ts-fundamentals/src/04_static-type-checking.ts b/04_typescript/unterricht/tag31/01_ts-fundamentals/src/04_static-type-checking.ts deleted file mode 100644 index b1a6a08..0000000 --- a/04_typescript/unterricht/tag31/01_ts-fundamentals/src/04_static-type-checking.ts +++ /dev/null @@ -1,23 +0,0 @@ -// Static Type Checking -{ - const data = [1, 2, 3, 4, 5, 6]; - - console.log(data.length); - - // Fehler wird bereits während der Laufzeit (im statischen Umfeld) angezeigt - // data(); // This expression is not callable. - // data.toLowerCase(); // Property 'toLowerCase' does not exist on type 'number[]'. - - const liEls = document.querySelectorAll('li'); - - // Property 'addEventListener' does not exist on type 'NodeListOf'. - // liEls.addEventListener('click', (e) => { - // console.log('click'); - // }); - - liEls?.forEach((el) => { - el.addEventListener('click', (e) => { - console.log('click'); - }); - }); -} diff --git a/04_typescript/unterricht/tag31/01_ts-fundamentals/src/05_type-definition-function.ts b/04_typescript/unterricht/tag31/01_ts-fundamentals/src/05_type-definition-function.ts deleted file mode 100644 index 317f9ba..0000000 --- a/04_typescript/unterricht/tag31/01_ts-fundamentals/src/05_type-definition-function.ts +++ /dev/null @@ -1,22 +0,0 @@ -// Type Definition für Funktionen -{ - interface ShoppingCart { - getTotal: () => number; - } - - function calculateTotal(cart: ShoppingCart): number { - // return '123.10'; // Type 'string' is not assignable to type 'number'. - return cart.getTotal(); - } - - const calculateTotal2 = (cart: ShoppingCart): number => { - // return '123.10'; // Type 'string' is not assignable to type 'number'. - return cart.getTotal(); - }; -} - -// Das Prinzip: void bedeutet „Ignoriere die Rückgabe“, nicht „Es darf nichts zurückgegeben werden“ - -// Wenn du ein Interface oder einen Funktionstyp mit void definierst, sagst du TypeScript damit: „Es ist mir völlig egal, was diese Funktion zurückgibt. Ich werde mit dem Rückgabewert sowieso nichts tun.“ - -// Es ist also ein Mindestversprechen. Die Funktion erfüllt den Vertrag, indem sie aufgerufen werden kann. Wenn sie zusätzlich noch eine Zahl (oder einen String) zurückgibt, ignoriert TypeScript das einfach an der Stelle, wo das Interface genutzt wird. diff --git a/04_typescript/unterricht/tag31/01_ts-fundamentals/src/06_optional-exception.js b/04_typescript/unterricht/tag31/01_ts-fundamentals/src/06_optional-exception.js deleted file mode 100644 index fc72468..0000000 --- a/04_typescript/unterricht/tag31/01_ts-fundamentals/src/06_optional-exception.js +++ /dev/null @@ -1,20 +0,0 @@ -// Optional exception Parameter in JS -{ - const vehicle = { - make: 'Toyota', - model: 'Corolla', - // startEngine: function () { - // return `${this.make}: engine startet`; - // }, - startEngine() { - return `${this.make}: engine startet`; - }, - }; - - console.log(vehicle.startEngine()); // => 'Toyota: egine startet' - - const weather = [{ main: [{ icon: '10dn', description: 'Clouds' }] }]; - - console.log(weather[0]?.main[0]?.description); // Optionale Parameter - // console.log(weather[0].main[0].description); // TypeError: Cannot read properties of undefined (reading 'main') -} diff --git a/04_typescript/unterricht/tag31/01_ts-fundamentals/src/06_optional-exception.ts b/04_typescript/unterricht/tag31/01_ts-fundamentals/src/06_optional-exception.ts deleted file mode 100644 index 0ab9899..0000000 --- a/04_typescript/unterricht/tag31/01_ts-fundamentals/src/06_optional-exception.ts +++ /dev/null @@ -1,35 +0,0 @@ -{ - interface Vehicle { - make: string; - model: string; - startEngine: () => string; - stopEngine?: () => void; // ?: optional Property - } - - const vehicle: Vehicle = { - make: 'Toyota', - model: 'Corolla', - startEngine() { - return `${this.make}: engine startet`; - }, - }; - - const vehicle2: Vehicle = { - make: 'Jeep', - model: 'Renegade', - startEngine() { - return `${this.make}: engine startet`; - }, - stopEngine() { - console.log(`${this.make}: engine stoppt`); - }, - }; - - console.log(vehicle.startEngine()); // => 'Toyota: engine startet' - - // Property Exception - // vehicle.stopEngine(); // Cannot invoke an object which is possibly 'undefined'. - vehicle.stopEngine?.(); // => no error - wird nur ausgeführt, wenn Methode existiert - - vehicle2.stopEngine?.(); // 'Jeep: engine stoppt' -} diff --git a/04_typescript/unterricht/tag31/01_ts-fundamentals/src/07_static-type-check2.ts b/04_typescript/unterricht/tag31/01_ts-fundamentals/src/07_static-type-check2.ts deleted file mode 100644 index 147b475..0000000 --- a/04_typescript/unterricht/tag31/01_ts-fundamentals/src/07_static-type-check2.ts +++ /dev/null @@ -1,35 +0,0 @@ -// Static Type Checking Part II -{ - const calculateArea = (radius: number, pi: string): number => { - return radius ** 2 * parseFloat(pi); - }; - - console.log(calculateArea(10, '3.14')); // 314 - // console.log(calculateArea(10, 3.14)); // Argument of type 'number' is not assignable to parameter of type 'string'. - - // Unbenutzte Variablen - const greetUser = (name: string): void => { - const greeting = 'Hello, ' + name; - const timestamp = new Date(); // Unused variable // 'timestamp' is declared but its value is never read. - - console.log(greeting); - }; - - greetUser('John Wick'); - - // Logikfehler in bedingten Anweisungen - - const dayOfWeek = new Date().getDay(); // number - - let message = ''; - - if (dayOfWeek === 0 || dayOfWeek === 6) { - message = "It's a weekend!"; - - // This comparison appears to be unintentional because the types 'number' and 'string' have no overlap. - // } else if (dayOfWeek === 2 || dayOfWeek === 'Tuesday') { - // message = "It's Tuesday!"; - } else if (dayOfWeek === 2) { - message = "It's Tuesday!"; - } -} diff --git a/04_typescript/unterricht/tag31/01_ts-fundamentals/src/08_explicit-type-annotaions.ts b/04_typescript/unterricht/tag31/01_ts-fundamentals/src/08_explicit-type-annotaions.ts deleted file mode 100644 index 75834c6..0000000 --- a/04_typescript/unterricht/tag31/01_ts-fundamentals/src/08_explicit-type-annotaions.ts +++ /dev/null @@ -1,31 +0,0 @@ -// Explicit Type Annotations - In TypeScript hast du die Möglichkeit, die Typen von Variablen und Funktionsparametern explizit zu definieren. -{ - let age: number = 23; - let message: string = 'Welcome Text'; - let toggle: boolean = true; - - // function welcome(employee: string, hireDate: Date) { - // console.log(`Welcome ${employee}, your hire date is ${hireDate.toDateString()}!`); - // } - - const logWelcome = (employee: string, hireDate: Date): void => { - console.log(`Welcome ${employee}, your hire date is ${hireDate.toDateString()}!`); - }; - - // Argument of type 'number' is not assignable to parameter of type 'Date'. - // logWelcome('John Wick', 2024); - logWelcome('John Wick', new Date('2024')); - - type Employee = { name: string; startDate: Date; salary: number }; - - const processEmployee = (employee: Employee): void => { - console.log( - `${employee.name} started on ${employee.startDate.toDateString()} with a salary of $${employee.salary}.`, - ); - }; - - // Type 'string' is not assignable to type 'number'. - // processEmployee({ name: 'John', startDate: new Date('2026-07-20'), salary: '50k' }); - - processEmployee({ name: 'John', startDate: new Date('2026-07-20'), salary: 50000 }); -} diff --git a/04_typescript/unterricht/tag31/01_ts-fundamentals/src/09_type-inference.ts b/04_typescript/unterricht/tag31/01_ts-fundamentals/src/09_type-inference.ts deleted file mode 100644 index ec4849d..0000000 --- a/04_typescript/unterricht/tag31/01_ts-fundamentals/src/09_type-inference.ts +++ /dev/null @@ -1,35 +0,0 @@ -// Type Inference - automatisches erkennen der Datentypen bei Zuweisung - -{ - let greeting = 'Hello World'; - - // greeting = 123; // Type 'number' is not assignable to type 'string'. - - greeting = 'Hello TS!'; - - let count = 123; // inferred as number - let isCompleted = true; //inferred as boolean - - const isSmoking = true; // inferred as literal true - const houseNumber = 33; // inferred as literal 33 - - let age: number = 40; // explicit type annotation as number - - let names = ['Andreas', 'Kahleel', 'Ersin', 'Adel']; // inferred as string[] - - let namesInUpperCase = names.map((name) /* inferred as string */ => { - return name.toUpperCase(); - }); // inferred as string[] - - console.log(namesInUpperCase.join(', ')); - - let currentMessageNumber: number; // explicit type annotation as number - - let randomValue; // inferred as 'any' - let randomNumber: any; // explicit type annotation as 'any' - - randomNumber = 'hello'; - randomNumber = 123; - randomNumber = true; - randomNumber = () => 'test'; -} diff --git a/04_typescript/unterricht/tag32/01_ts-types/assets/img/Understand-Typescript.jpg b/04_typescript/unterricht/tag32/01_ts-types/assets/img/Understand-Typescript.jpg deleted file mode 100644 index c3a5d16..0000000 Binary files a/04_typescript/unterricht/tag32/01_ts-types/assets/img/Understand-Typescript.jpg and /dev/null differ diff --git a/04_typescript/unterricht/tag32/01_ts-types/assets/js/01_grundtypen.js b/04_typescript/unterricht/tag32/01_ts-types/assets/js/01_grundtypen.js deleted file mode 100644 index 1d4e56a..0000000 --- a/04_typescript/unterricht/tag32/01_ts-types/assets/js/01_grundtypen.js +++ /dev/null @@ -1,44 +0,0 @@ -(() => { - // src/01_grundtypen.ts - { - let greeting = "Welcome to TypeScript"; - const greeting2 = "Welcome to TypeScript"; - let wholeNumber = 10; - let decimalNumber = 19.99; - let isLearning = true; - let age = 41; - let age2 = 30; - let scores = [10, 20, 30, 40]; - let moreScores = [50, 60, 70]; - const mixedScores = [10, 20, 30, "40"]; - const moreMixedScores = [50, "60", 70]; - let randomValue = 42; - randomValue = "Now I'm a string!"; - randomValue = { name: "TypeScript" }; - const $ = (qs) => document.querySelector(qs); - const $$ = (qs) => Array.from(document.querySelectorAll(qs)); - const multiply = (a, b) => { - return a * b; - }; - console.log(multiply(2, 4)); - let bigNumber = 9007199254740992n; - console.log(Number.MAX_SAFE_INTEGER); - const id = /* @__PURE__ */ Symbol(1); - const id2 = /* @__PURE__ */ Symbol(1); - console.log(id === id2); - console.log( - greeting, - greeting2, - wholeNumber, - decimalNumber, - isLearning, - age, - age2, - scores.join(", "), - moreScores.join(", "), - mixedScores.join(", "), - moreMixedScores.join(", "), - bigNumber - ); - } -})(); diff --git a/04_typescript/unterricht/tag32/01_ts-types/assets/js/02_fetch-example.js b/04_typescript/unterricht/tag32/01_ts-types/assets/js/02_fetch-example.js deleted file mode 100644 index b0b6405..0000000 --- a/04_typescript/unterricht/tag32/01_ts-types/assets/js/02_fetch-example.js +++ /dev/null @@ -1,43 +0,0 @@ -(() => { - // src/02_fetch-example.ts - { - const fetchData = async () => { - return "Data fetched successfully!"; - }; - const getPerson = () => { - return new Promise((resolve, reject) => { - fetch("https://dummyjson.com/users/1?select=firstName,lastName,age").then((res) => { - if (!res.ok) throw Error("HTTP-Request went wrong."); - return res.json(); - }).then((data) => { - resolve(data); - }).catch((err) => { - console.error(err); - reject(err); - }); - }); - }; - const getPersonAsync = async () => { - try { - const res = await fetch("https://dummyjson.com/users/1?select=firstName,lastName,age"); - if (!res.ok) { - throw Error(`HTTP-Request went wrong: ${res.status}`); - } - const data = await res.json(); - return data; - } catch (err) { - if (err instanceof Error) { - console.error(err); - throw err; - } - throw new Error("An unknown error occurred."); - } - }; - getPerson().then((data) => { - console.log(data); - }); - getPersonAsync().then((data) => { - console.log(data); - }); - } -})(); diff --git a/04_typescript/unterricht/tag32/01_ts-types/assets/js/03_object-types.js b/04_typescript/unterricht/tag32/01_ts-types/assets/js/03_object-types.js deleted file mode 100644 index 95cebd3..0000000 --- a/04_typescript/unterricht/tag32/01_ts-types/assets/js/03_object-types.js +++ /dev/null @@ -1,23 +0,0 @@ -(() => { - // src/03_object-types.ts - { - const calculateArea = (rect) => { - console.log("The area of the rectangle is " + rect.width * rect.height); - }; - calculateArea({ width: 5, height: 10 }); - const calculateArea2 = ({ width, height } = { width: 10, height: 10 }) => { - console.log("The area of the rectangle is " + width * height); - }; - calculateArea2({ width: 5, height: 10 }); - const printPersonInfo = (person) => { - console.log("Name: " + person.name); - if (person.age !== void 0) { - console.log("Age: " + person.age.toString()); - } else { - console.log("Age is not provided"); - } - }; - printPersonInfo({ name: "John" }); - printPersonInfo({ name: "Jane", age: 25 }); - } -})(); diff --git a/04_typescript/unterricht/tag32/01_ts-types/assets/js/04_union-types.js b/04_typescript/unterricht/tag32/01_ts-types/assets/js/04_union-types.js deleted file mode 100644 index 394f6c4..0000000 --- a/04_typescript/unterricht/tag32/01_ts-types/assets/js/04_union-types.js +++ /dev/null @@ -1,24 +0,0 @@ -(() => { - // src/04_union-types.ts - { - const printStatus = (status) => { - console.log("Status: ", status); - }; - printStatus(true); - printStatus("loading..."); - const greetPeople = (names) => { - if (Array.isArray(names)) { - console.log("Hello, " + names.join(" and ")); - } else { - console.log("Hello, " + names); - } - }; - greetPeople("John"); - greetPeople(["Ersin", "Kahleel", "Andreas", "Adel"]); - const greetNames = (...names) => { - console.log(`Hello, ${names.join(" and ")}`); - }; - greetNames("John"); - greetNames("Ersin", "Kahleel", "Andreas", "Adel"); - } -})(); diff --git a/04_typescript/unterricht/tag32/01_ts-types/assets/js/05_type-statement.js b/04_typescript/unterricht/tag32/01_ts-types/assets/js/05_type-statement.js deleted file mode 100644 index 594d92b..0000000 --- a/04_typescript/unterricht/tag32/01_ts-types/assets/js/05_type-statement.js +++ /dev/null @@ -1,31 +0,0 @@ -(() => { - // src/05_type-statement.ts - { - const printCarDetails = (car) => { - console.log(`Car Make: ${car.make}`); - console.log(`Car Model: ${car.model}`); - console.log(`Car Year: ${car.year}`); - }; - const myCar = { make: "Toyota", model: "Corolla", year: 2021 }; - printCarDetails(myCar); - const displayStatus = (status) => { - if (status === "success") { - console.log("Operation was successful!"); - } else if (status === "error") { - console.log("There was an error."); - } else { - console.log("Loading..."); - } - }; - displayStatus("success"); - displayStatus("error"); - displayStatus("loading"); - const capitalize = (input) => { - return input.charAt(0).toUpperCase() + input.slice(1); - }; - const applyTransform = (input, transform) => { - return transform(input); - }; - console.log(applyTransform("hello", capitalize)); - } -})(); diff --git a/04_typescript/unterricht/tag32/01_ts-types/assets/js/06_type-as-statement.js b/04_typescript/unterricht/tag32/01_ts-types/assets/js/06_type-as-statement.js deleted file mode 100644 index 5874ace..0000000 --- a/04_typescript/unterricht/tag32/01_ts-types/assets/js/06_type-as-statement.js +++ /dev/null @@ -1,12 +0,0 @@ -(() => { - // src/06_type-as-statement.ts - { - const h1El = document.querySelector("h1"); - const headlineElement = document.querySelector("h1"); - console.log(h1El); - headlineElement.style.color = "tomato"; - const pEl = document.querySelector("p"); - const paragraphEl = document.querySelector("p"); - console.log(pEl?.offsetHeight, paragraphEl.offsetHeight); - } -})(); diff --git a/04_typescript/unterricht/tag32/01_ts-types/index.html b/04_typescript/unterricht/tag32/01_ts-types/index.html deleted file mode 100644 index 2e3ef61..0000000 --- a/04_typescript/unterricht/tag32/01_ts-types/index.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - TypeScript - Types - - - - - - - - - -
      -
      -

      TypeScript - Types

      -

      - TypeScript ist eine von Microsoft entwickelte Skriptsprache, die auf den Vorschlägen zum - ECMAScript-6-Standardbasiert und statische Typisierung zu JavaScript hinzufügt. Sprachkonstrukte von - TypeScript, wie Klassen, Vererbung, Module und anonyme Funktionen, wurden auch in ECMAScript 6 übernommen. -

      - TypeScript Kreisdiagramm -
      -
      - - diff --git a/04_typescript/unterricht/tag32/01_ts-types/package-lock.json b/04_typescript/unterricht/tag32/01_ts-types/package-lock.json deleted file mode 100644 index 99bb034..0000000 --- a/04_typescript/unterricht/tag32/01_ts-types/package-lock.json +++ /dev/null @@ -1,499 +0,0 @@ -{ - "name": "01_ts-types", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "01_ts-types", - "version": "1.0.0", - "devDependencies": { - "esbuild": "^0.28.1" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", - "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", - "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", - "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", - "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", - "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", - "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", - "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", - "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", - "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", - "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", - "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", - "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", - "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", - "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", - "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", - "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", - "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", - "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", - "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", - "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", - "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", - "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", - "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", - "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", - "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", - "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", - "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.28.1", - "@esbuild/android-arm": "0.28.1", - "@esbuild/android-arm64": "0.28.1", - "@esbuild/android-x64": "0.28.1", - "@esbuild/darwin-arm64": "0.28.1", - "@esbuild/darwin-x64": "0.28.1", - "@esbuild/freebsd-arm64": "0.28.1", - "@esbuild/freebsd-x64": "0.28.1", - "@esbuild/linux-arm": "0.28.1", - "@esbuild/linux-arm64": "0.28.1", - "@esbuild/linux-ia32": "0.28.1", - "@esbuild/linux-loong64": "0.28.1", - "@esbuild/linux-mips64el": "0.28.1", - "@esbuild/linux-ppc64": "0.28.1", - "@esbuild/linux-riscv64": "0.28.1", - "@esbuild/linux-s390x": "0.28.1", - "@esbuild/linux-x64": "0.28.1", - "@esbuild/netbsd-arm64": "0.28.1", - "@esbuild/netbsd-x64": "0.28.1", - "@esbuild/openbsd-arm64": "0.28.1", - "@esbuild/openbsd-x64": "0.28.1", - "@esbuild/openharmony-arm64": "0.28.1", - "@esbuild/sunos-x64": "0.28.1", - "@esbuild/win32-arm64": "0.28.1", - "@esbuild/win32-ia32": "0.28.1", - "@esbuild/win32-x64": "0.28.1" - } - } - } -} diff --git a/04_typescript/unterricht/tag32/01_ts-types/package.json b/04_typescript/unterricht/tag32/01_ts-types/package.json deleted file mode 100644 index 429e72c..0000000 --- a/04_typescript/unterricht/tag32/01_ts-types/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "01_ts-types", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild \"src/*.ts\" --watch --bundle --outdir=\"assets/js\" --loader:.ts=ts" - }, - "keywords": [], - "type": "module", - "devDependencies": { - "esbuild": "^0.28.1" - } -} diff --git a/04_typescript/unterricht/tag32/01_ts-types/src/01_grundtypen.ts b/04_typescript/unterricht/tag32/01_ts-types/src/01_grundtypen.ts deleted file mode 100644 index 809a467..0000000 --- a/04_typescript/unterricht/tag32/01_ts-types/src/01_grundtypen.ts +++ /dev/null @@ -1,87 +0,0 @@ -// Primitive Types - string, number, boolean, null, undefined, (Symbol) und bigint -{ - let greeting: string = 'Welcome to TypeScript'; - // prefer-coonst - const greeting2: string = 'Welcome to TypeScript'; - - let wholeNumber: number = 10; - let decimalNumber: number = 19.99; - - let isLearning: boolean = true; - - let age: number = 41; // RECOMMENDED explicit type annotation - let age2 = 30; // type inference - 'age2' is inferred to be a number - - // Array - let scores: number[] = [10, 20, 30, 40]; - let moreScores: Array = [50, 60, 70]; - - // nicht Grundtypen - let lisItems: Node[] = Array.from(document.querySelectorAll('li')); - let lisItems2: NodeListOf = document.querySelectorAll('li'); - - // Unions mit Array - const mixedScores: (number | string)[] = [10, 20, 30, '40']; - const moreMixedScores: Array = [50, '60', 70]; - - // any - Es kann jeden Datentyp enthalten - // RECOMMENDED - versuchen "any" zu vermeiden - let randomValue: any = 42; - randomValue = "Now I'm a string!"; - randomValue = { name: 'TypeScript' }; - // randomValue.doSomething(); // No error in ts, even though `doSomething` doesn't exist. - // randomValue(); // Uncaught TypeError: randomValue.doSomething is not a function - - const $on = (elOrAr: Node | Node[], type: string, fn: EventListener) => { - if (Array.isArray(elOrAr)) { - elOrAr.forEach((ae) => $on(ae, type, fn)); - } else { - elOrAr.addEventListener(type, fn); - } - return elOrAr; - }; - - const $ = (qs: string) => document.querySelector(qs) as Node; - const $$ = (qs: string): Node[] => Array.from(document.querySelectorAll(qs)); - - // $on($('h1'), 'click', (e) => { - // console.log('click'); - // }); - // $on($$('ul li'), 'click', (e) => { - // console.log('click'); - // }); - - // Funktionen - const multiply = (a: number, b: number): number => { - return a * b; - }; - - // console.log(multiply($('input').value, 4)); - // console.log(multiply('2', 4)); // Argument of type 'string' is not assignable to parameter of type 'number'. - console.log(multiply(2, 4)); // => 8 - - let bigNumber: bigint = 9007199254740992n; - - console.log(Number.MAX_SAFE_INTEGER); - - // Symbol - const id: symbol = Symbol(1); - const id2: symbol = Symbol(1); - - console.log(id === id2); // => false - - console.log( - greeting, - greeting2, - wholeNumber, - decimalNumber, - isLearning, - age, - age2, - scores.join(', '), - moreScores.join(', '), - mixedScores.join(', '), - moreMixedScores.join(', '), - bigNumber, - ); -} diff --git a/04_typescript/unterricht/tag32/01_ts-types/src/02_fetch-example.ts b/04_typescript/unterricht/tag32/01_ts-types/src/02_fetch-example.ts deleted file mode 100644 index 5063e95..0000000 --- a/04_typescript/unterricht/tag32/01_ts-types/src/02_fetch-example.ts +++ /dev/null @@ -1,61 +0,0 @@ -// Promise -{ - // async function fetchData(): Promise { - // return 'Data fetched successfully!'; - // } - - const fetchData = async (): Promise => { - return 'Data fetched successfully!'; - }; - - interface Userdata { - id?: number; - firstName: string; - lastName: string; - age: number; - } - - const getPerson = (): Promise => { - return new Promise((resolve, reject) => { - fetch('https://dummyjson.com/users/1?select=firstName,lastName,age') - .then((res: Response) => { - if (!res.ok) throw Error('HTTP-Request went wrong.'); - return res.json(); // <- Promise HTTP-Response Body - JS Objekt geparsed - }) - .then((data: Userdata) => { - // console.log(data); - resolve(data); - }) - .catch((err) => { - console.error(err); - reject(err); - }); - }); - }; - - const getPersonAsync = async (): Promise => { - try { - const res: Response = await fetch('https://dummyjson.com/users/1?select=firstName,lastName,age'); - if (!res.ok) { - throw Error(`HTTP-Request went wrong: ${res.status}`); - } - const data: Userdata = await res.json(); - return data; - } catch (err: unknown) { - if (err instanceof Error) { - console.log(err.message); - - console.error(err); - throw err; // paranoid - } - throw new Error('An unknown error occurred.'); - } - }; - - getPerson().then((data) => { - console.log(data); - }); - getPersonAsync().then((data) => { - console.log(data); - }); -} diff --git a/04_typescript/unterricht/tag32/01_ts-types/src/03_object-types.ts b/04_typescript/unterricht/tag32/01_ts-types/src/03_object-types.ts deleted file mode 100644 index f624cad..0000000 --- a/04_typescript/unterricht/tag32/01_ts-types/src/03_object-types.ts +++ /dev/null @@ -1,59 +0,0 @@ -// Object Types - bei einem Object Type kann man die Eigenschaften entweder mit einem Komma (,) oder einem Semikolon (;) trennen. Beide sind zulässig -{ - // The parameter's type annotation is an object type - // function calculateArea3(rect: { width: number; height: number }) { - // console.log('The area of the rectangle is ' + rect.width * rect.height); - // } - - // calculateArea3({ width: 5, height: 10 }); - - type RectObj = { width: number; height: number }; - - const calculateArea = (rect: RectObj): void => { - console.log('The area of the rectangle is ' + rect.width * rect.height); - }; - - calculateArea({ width: 5, height: 10 }); - - // ---------------------------- - // Destructuring in der Parameterliste - // const calculateArea2 = (DESTRUCTURING: OBJECT_TYPE = DEFAULT_OBJECT) => {} - const calculateArea2 = ({ width, height }: { width: number; height: number } = { width: 10, height: 10 }): void => { - console.log('The area of the rectangle is ' + width * height); - }; - - calculateArea2({ width: 5, height: 10 }); - - // ---------------------- - - // function printPersonInfo(person: { name: string; age?: number }) { - // console.log('Name: ' + person.name); - // if (person.age !== undefined) { - // console.log('Age: ' + person.age); - // } else { - // console.log('Age is not provided'); - // } - // } - - // interface PersonObj2 { - // name: string; - // age?: number; - // } - type PersonObj = { - name: string; - age?: number; - }; - - const printPersonInfo = (person: PersonObj) => { - console.log('Name: ' + person.name); - if (person.age !== undefined) { - console.log('Age: ' + person.age.toString()); - } else { - console.log('Age is not provided'); - } - }; - - // Both are OK - printPersonInfo({ name: 'John' }); - printPersonInfo({ name: 'Jane', age: 25 }); -} diff --git a/04_typescript/unterricht/tag32/01_ts-types/src/04_union-types.ts b/04_typescript/unterricht/tag32/01_ts-types/src/04_union-types.ts deleted file mode 100644 index 7074dd5..0000000 --- a/04_typescript/unterricht/tag32/01_ts-types/src/04_union-types.ts +++ /dev/null @@ -1,56 +0,0 @@ -// Union Type - Menge von möglichen Datentyp-Werten erlauben -{ - // function printStatus(status: boolean | string) { - // console.log('Status: ' + status); - // } - - type Status = boolean | string; - - const printStatus = (status: Status): void => { - console.log('Status: ', status); - }; - - // OK - printStatus(true); - - // OK - printStatus('loading...'); - - // Error - // printStatus({ status: 'success' }); - // Argument of type '{ status: string; }' is not assignable to parameter of type 'boolean | string'. - - // ---------------- - - // function greetPeople(names: string | string[]) { - // if (Array.isArray(names)) { - // // TypeScript knows 'names' is a 'string[]' here - // console.log('Hello, ' + names.join(' and ')); - // } else { - // // Here, 'names' is a single 'string' - // console.log('Hello, ' + names); - // } - // } - - const greetPeople = (names: string | string[]): void => { - if (Array.isArray(names)) { - // TypeScript knows 'names' is a 'string[]' here - console.log('Hello, ' + names.join(' and ')); - } else { - // Here, 'names' is a single 'string' - console.log('Hello, ' + names); - } - }; - - greetPeople('John'); - greetPeople(['Ersin', 'Kahleel', 'Andreas', 'Adel']); - - const greetNames = (...names: string[]): void => { - console.log(`Hello, ${names.join(' and ')}`); - }; - - greetNames('John'); - greetNames('Ersin', 'Kahleel', 'Andreas', 'Adel'); - - // example CreateBtn() -} diff --git a/04_typescript/unterricht/tag32/01_ts-types/src/05_type-statement.ts b/04_typescript/unterricht/tag32/01_ts-types/src/05_type-statement.ts deleted file mode 100644 index a7df4f5..0000000 --- a/04_typescript/unterricht/tag32/01_ts-types/src/05_type-statement.ts +++ /dev/null @@ -1,62 +0,0 @@ -// type statement - eigene Datentyp-Annotationen definieren -{ - // interface für wachsende und komplexe Datenstrukturen. Meistens (global) ausgelagert. - - // interface Car { - // make: string; - // model: string; - // year: number; - // }; - - // type aliases innerhalb von Dokumenten für einfache, feststehende types und unions - - type Car = { - make: string; - model: string; - year: number; - }; - - const printCarDetails = (car: Car): void => { - console.log(`Car Make: ${car.make}`); - console.log(`Car Model: ${car.model}`); - console.log(`Car Year: ${car.year}`); - }; - - const myCar = { make: 'Toyota', model: 'Corolla', year: 2021 }; - printCarDetails(myCar); - - // ---------------- - - type Status = 'success' | 'error' | 'loading'; - - const displayStatus = (status: Status): void => { - if (status === 'success') { - console.log('Operation was successful!'); - } else if (status === 'error') { - console.log('There was an error.'); - } else { - console.log('Loading...'); - } - }; - - displayStatus('success'); // OK - displayStatus('error'); // OK - displayStatus('loading'); // OK - - // displayStatus('Loading'); // Error: Argument of type '"Loading"' is not assignable to parameter of type 'Status'. - // displayStatus('complete'); // Error: Argument of type '"complete"' is not assignable to parameter of type 'Status'. - - // ----------------------- - // type für Funktionsausdruck - type StringTransform = (input: string) => string; - - const capitalize = (input: string): string => { - return input.charAt(0).toUpperCase() + input.slice(1); - }; - - const applyTransform = (input: string, transform: StringTransform): string => { - return transform(input); - }; - - console.log(applyTransform('hello', capitalize)); // => "Hello" -} diff --git a/04_typescript/unterricht/tag32/01_ts-types/src/06_type-as-statement.ts b/04_typescript/unterricht/tag32/01_ts-types/src/06_type-as-statement.ts deleted file mode 100644 index db3cdda..0000000 --- a/04_typescript/unterricht/tag32/01_ts-types/src/06_type-as-statement.ts +++ /dev/null @@ -1,19 +0,0 @@ -// Type Assertions verwenden - mit "as" statement festen Datentyp zuweisen -{ - const h1El: HTMLHeadingElement | null = document.querySelector('h1'); - - // selber festgelegt - const headlineElement = document.querySelector('h1') as HTMLHeadingElement; - - console.log(h1El); - - // h1El?.style?.color = 'tomato'; - headlineElement.style.color = 'tomato'; - - const pEl: HTMLParagraphElement | null = document.querySelector('p'); - - // selber festgelegt - const paragraphEl = document.querySelector('p'); - - console.log(pEl?.offsetHeight, paragraphEl.offsetHeight); -} diff --git a/04_typescript/unterricht/tag33/01_ts-types/assets/img/Understand-Typescript.jpg b/04_typescript/unterricht/tag33/01_ts-types/assets/img/Understand-Typescript.jpg deleted file mode 100644 index c3a5d16..0000000 Binary files a/04_typescript/unterricht/tag33/01_ts-types/assets/img/Understand-Typescript.jpg and /dev/null differ diff --git a/04_typescript/unterricht/tag33/01_ts-types/assets/js/01_type-interface-extends.js b/04_typescript/unterricht/tag33/01_ts-types/assets/js/01_type-interface-extends.js deleted file mode 100644 index 2b85be3..0000000 --- a/04_typescript/unterricht/tag33/01_ts-types/assets/js/01_type-interface-extends.js +++ /dev/null @@ -1,33 +0,0 @@ -(() => { - // src/01_type-interface-extends.ts - { - const printVehicleInfo = (vehicle) => { - console.log(`Make: ${vehicle.make}`); - console.log(`Model: ${vehicle.model}`); - console.log(`Year: ${vehicle.year}`); - }; - printVehicleInfo({ make: "Honda", model: "Civic", year: 2020 }); - const employee = { - name: "John Doe", - age: 30, - employeeId: 123 - }; - console.log(employee.name); - console.log(employee.age); - console.log(employee.employeeId); - const employee2 = { - name: "Jack Russel", - age: 30, - employeeId: 123 - }; - console.log(employee2.name); - console.log(employee2.age); - console.log(employee2.employeeId); - const monitor = { - resolution: "1080p", - size: 24 - }; - console.log(monitor.resolution); - console.log(monitor.size); - } -})(); diff --git a/04_typescript/unterricht/tag33/01_ts-types/assets/js/02_type-as-statement.js b/04_typescript/unterricht/tag33/01_ts-types/assets/js/02_type-as-statement.js deleted file mode 100644 index 48bc804..0000000 --- a/04_typescript/unterricht/tag33/01_ts-types/assets/js/02_type-as-statement.js +++ /dev/null @@ -1,14 +0,0 @@ -(() => { - // src/02_type-as-statement.ts - { - const h1El = document.querySelector("h1"); - const headlineElement = document.querySelector("h1"); - console.log(h1El); - headlineElement.style.color = "tomato"; - const pEl = document.querySelector("p"); - const paragraphEl = document.querySelector("p"); - console.log(pEl?.offsetHeight, paragraphEl.offsetHeight); - const customElem = document.getElementById("custom-element"); - customElem.customMethod(); - } -})(); diff --git a/04_typescript/unterricht/tag33/01_ts-types/assets/js/03_type-literale.js b/04_typescript/unterricht/tag33/01_ts-types/assets/js/03_type-literale.js deleted file mode 100644 index 830aea5..0000000 --- a/04_typescript/unterricht/tag33/01_ts-types/assets/js/03_type-literale.js +++ /dev/null @@ -1,57 +0,0 @@ -(() => { - // src/03_type-literale.ts - { - let language = "English"; - const lang = "English"; - console.log(language, lang); - const greeting = "Hello"; - const greeting2 = "Hello"; - const number = 23; - const number2 = 23; - const setDirection = (direction) => { - console.log(`Moving ${direction}`); - }; - setDirection("up"); - setDirection("down"); - setDirection("left"); - setDirection("right"); - const evaluateScore = (score) => { - return `You rated the service a ${score}`; - }; - evaluateScore(5); - evaluateScore(3); - const draw = (shape) => { - console.log(`Drawing a ${shape.type} with size ${shape.size}`); - }; - draw({ type: "circle", size: 10 }); - draw({ type: "square", size: 20 }); - let Move; - ((Move2) => { - Move2["Up"] = "up"; - Move2["Down"] = "down"; - Move2["Right"] = "right"; - Move2["Left"] = "left"; - })(Move || (Move = {})); - const setDirection2 = (movement) => { - console.log(`Moving ${movement}`); - }; - setDirection2("down" /* Down */); - setDirection2("right" /* Right */); - setDirection2("left" /* Left */); - setDirection2("right" /* Right */); - let Rating; - ((Rating2) => { - Rating2[Rating2["One"] = 1] = "One"; - Rating2[Rating2["Two"] = 2] = "Two"; - Rating2[Rating2["Three"] = 3] = "Three"; - Rating2[Rating2["Four"] = 4] = "Four"; - Rating2[Rating2["Five"] = 5] = "Five"; - })(Rating || (Rating = {})); - const evaluateScore2 = (score) => { - return `You rated the service a ${score}`; - }; - evaluateScore2(1 /* One */); - evaluateScore2(5 /* Five */); - evaluateScore2(4 /* Four */); - } -})(); diff --git a/04_typescript/unterricht/tag33/01_ts-types/index.html b/04_typescript/unterricht/tag33/01_ts-types/index.html deleted file mode 100644 index 58c90d6..0000000 --- a/04_typescript/unterricht/tag33/01_ts-types/index.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - TypeScript - Types - - - - - - -
      -
      -

      TypeScript - Types

      -

      - TypeScript ist eine von Microsoft entwickelte Skriptsprache, die auf den Vorschlägen zum - ECMAScript-6-Standardbasiert und statische Typisierung zu JavaScript hinzufügt. Sprachkonstrukte von - TypeScript, wie Klassen, Vererbung, Module und anonyme Funktionen, wurden auch in ECMAScript 6 übernommen. -

      - TypeScript Kreisdiagramm -
      -
      - - diff --git a/04_typescript/unterricht/tag33/01_ts-types/package-lock.json b/04_typescript/unterricht/tag33/01_ts-types/package-lock.json deleted file mode 100644 index 99bb034..0000000 --- a/04_typescript/unterricht/tag33/01_ts-types/package-lock.json +++ /dev/null @@ -1,499 +0,0 @@ -{ - "name": "01_ts-types", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "01_ts-types", - "version": "1.0.0", - "devDependencies": { - "esbuild": "^0.28.1" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", - "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", - "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", - "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", - "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", - "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", - "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", - "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", - "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", - "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", - "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", - "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", - "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", - "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", - "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", - "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", - "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", - "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", - "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", - "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", - "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", - "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", - "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", - "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", - "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", - "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", - "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", - "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.28.1", - "@esbuild/android-arm": "0.28.1", - "@esbuild/android-arm64": "0.28.1", - "@esbuild/android-x64": "0.28.1", - "@esbuild/darwin-arm64": "0.28.1", - "@esbuild/darwin-x64": "0.28.1", - "@esbuild/freebsd-arm64": "0.28.1", - "@esbuild/freebsd-x64": "0.28.1", - "@esbuild/linux-arm": "0.28.1", - "@esbuild/linux-arm64": "0.28.1", - "@esbuild/linux-ia32": "0.28.1", - "@esbuild/linux-loong64": "0.28.1", - "@esbuild/linux-mips64el": "0.28.1", - "@esbuild/linux-ppc64": "0.28.1", - "@esbuild/linux-riscv64": "0.28.1", - "@esbuild/linux-s390x": "0.28.1", - "@esbuild/linux-x64": "0.28.1", - "@esbuild/netbsd-arm64": "0.28.1", - "@esbuild/netbsd-x64": "0.28.1", - "@esbuild/openbsd-arm64": "0.28.1", - "@esbuild/openbsd-x64": "0.28.1", - "@esbuild/openharmony-arm64": "0.28.1", - "@esbuild/sunos-x64": "0.28.1", - "@esbuild/win32-arm64": "0.28.1", - "@esbuild/win32-ia32": "0.28.1", - "@esbuild/win32-x64": "0.28.1" - } - } - } -} diff --git a/04_typescript/unterricht/tag33/01_ts-types/package.json b/04_typescript/unterricht/tag33/01_ts-types/package.json deleted file mode 100644 index 429e72c..0000000 --- a/04_typescript/unterricht/tag33/01_ts-types/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "01_ts-types", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild \"src/*.ts\" --watch --bundle --outdir=\"assets/js\" --loader:.ts=ts" - }, - "keywords": [], - "type": "module", - "devDependencies": { - "esbuild": "^0.28.1" - } -} diff --git a/04_typescript/unterricht/tag33/01_ts-types/src/01_type-interface-extends.ts b/04_typescript/unterricht/tag33/01_ts-types/src/01_type-interface-extends.ts deleted file mode 100644 index 7c044c4..0000000 --- a/04_typescript/unterricht/tag33/01_ts-types/src/01_type-interface-extends.ts +++ /dev/null @@ -1,109 +0,0 @@ -// Interfaces - eine leistungsstarke Funktion zur Definition der Form eines Objekts. Ein Interface ermöglicht es dir, die Eigenschaften, die ein Objekt haben soll, zusammen mit ihren Typen festzulegen, was deinen Code lesbarer und einfacher zu pflegen macht. -{ - interface Vehicle { - make: string; - model: string; - year: number; - } - - const printVehicleInfo = (vehicle: Vehicle) => { - console.log(`Make: ${vehicle.make}`); - console.log(`Model: ${vehicle.model}`); - console.log(`Year: ${vehicle.year}`); - }; - - printVehicleInfo({ make: 'Honda', model: 'Civic', year: 2020 }); - // Object literal may only specify known properties, and 'releaseYear' does not exist in type 'Vehicle'. - // printVehicleInfo({ make: 'Nissan', model: 'Pao', releaseYear: 1984 }); - - // ----- - - interface Person { - name: string; - age: number; - } - - interface Employee extends Person { - employeeId: number; - } - - const employee: Employee = { - name: 'John Doe', - age: 30, - employeeId: 123, - }; - - console.log(employee.name); // from Person - console.log(employee.age); // from Person - console.log(employee.employeeId); // from Employee - - // ---- - - type Person2 = { - name: string; - age: number; - }; - - // NOT RECOMMENDED - use interfaces instead - // Erweiterung bei type Objekt mit "&" ampersand - type Employee2 = Person2 & { - employeeId: number; - }; - - const employee2: Employee2 = { - name: 'Jack Russel', - age: 30, - employeeId: 123, - }; - - console.log(employee2.name); // from Person - console.log(employee2.age); // from Person - console.log(employee2.employeeId); // from Employee - - // ------ - - interface Display { - resolution: string; - } - - // Migration bzw. Erweiterung vom bestehenden Display Interface - interface Display { - size: number; - } - - const monitor: Display = { - resolution: '1080p', - size: 24, - }; - - console.log(monitor.resolution); // => 1080p - console.log(monitor.size); // => 24 - - // ----- - - type Display2 = { - resolution: string; - }; - - // type Display2 = { - // size: number; - // }; - // Error: Duplicate identifier 'Display2'. - - // ------ - // interface für wachsende und komplexe Datenstrukturen. Meistens (global) ausgelagert. - - // interface Car { - // make: string; - // model: string; - // year: number; - // }; - - // type aliases innerhalb von Dokumenten für einfache, feststehende types und unions - - type Car = { - make: string; - model: string; - year: number; - }; -} diff --git a/04_typescript/unterricht/tag33/01_ts-types/src/02_type-as-statement.ts b/04_typescript/unterricht/tag33/01_ts-types/src/02_type-as-statement.ts deleted file mode 100644 index dbc5c27..0000000 --- a/04_typescript/unterricht/tag33/01_ts-types/src/02_type-as-statement.ts +++ /dev/null @@ -1,30 +0,0 @@ -// Type Assertions verwenden - mit "as" statement festen Datentyp zuweisen -{ - const h1El: HTMLHeadingElement | null = document.querySelector('h1'); - - // selber festgelegt - const headlineElement = document.querySelector('h1') as HTMLHeadingElement; - - console.log(h1El); - - // h1El?.style?.color = 'tomato'; - headlineElement.style.color = 'tomato'; - - const pEl: HTMLParagraphElement | null = document.querySelector('p'); - - // selber festgelegt - const paragraphEl = document.querySelector('p'); - - console.log(pEl?.offsetHeight, paragraphEl.offsetHeight); - - interface MyCustomElement extends Node { - customMethod: () => void; - } - - // Assume 'Node' is a custom element with a 'customMethod' - const customElem = document.getElementById('custom-element') as unknown as MyCustomElement; - - // Now TypeScript understands that 'customElem' is of type 'MyCustomElement' - - customElem.customMethod(); -} diff --git a/04_typescript/unterricht/tag33/01_ts-types/src/03_type-literale.ts b/04_typescript/unterricht/tag33/01_ts-types/src/03_type-literale.ts deleted file mode 100644 index 5a01847..0000000 --- a/04_typescript/unterricht/tag33/01_ts-types/src/03_type-literale.ts +++ /dev/null @@ -1,102 +0,0 @@ -// Literalzuweisung - Feste alleinstehende Werte zuweisen - -{ - let language = 'English'; // TypeScript infers the type of `language` as `string`. - const lang = 'English'; // TypeScript infers the type of `lang` as literal 'English'. - - console.log(language, lang); - - const greeting = 'Hello'; // inferred as literal 'Hello' - const greeting2: 'Hello' = 'Hello'; // inferred as literal 'Hello' - - const number = 23; // inferred as literal 23 - const number2: 23 = 23; // inferred as literal 23 - - // ------- - - type Direction = 'up' | 'down' | 'left' | 'right'; - - const setDirection = (direction: Direction): void => { - console.log(`Moving ${direction}`); - }; - - setDirection('up'); - setDirection('down'); - setDirection('left'); - setDirection('right'); - // setDirection('north'); // Argument of type '"north"' is not assignable to parameter of type 'Direction' - - // ------ - - type Score = 1 | 2 | 3 | 4 | 5; - - const evaluateScore = (score: Score) => { - return `You rated the service a ${score}`; - }; - - evaluateScore(5); // OK - evaluateScore(3); // OK - // evaluateScore(6); // Error: Argument of type '6' is not assignable to parameter of type '1 | 2 | 3 | 4 | 5'. - - // ------ - - interface Splide { - type: 'loop' | 'slide' | 'fade'; - nav: boolean; - showDots: boolean; - fixedHeight: number | string; - } - - interface Shape { - type: 'circle' | 'square'; - size: number; - } - - const draw = (shape: Shape) => { - console.log(`Drawing a ${shape.type} with size ${shape.size}`); - }; - - draw({ type: 'circle', size: 10 }); // OK - draw({ type: 'square', size: 20 }); // OK - // draw({ type: 'triangle', size: 15 }); // Error: Type '"triangle"' is not assignable to type '"circle" | "square"'. - - // ----- - - // enum - Enumerationen sind ein spezieller Typ, der eine Liste von konstanten Werten definiert. - // Sie sind nützlich, um eine Gruppe von Werten zu definieren, die eine bestimmte Bedeutung haben. - - enum Move { - Up = 'up', - Down = 'down', - Right = 'right', - Left = 'left', - } - - const setDirection2 = (movement: Move): void => { - console.log(`Moving ${movement}`); - }; - - setDirection2(Move.Down); - setDirection2(Move.Right); - setDirection2(Move.Left); - setDirection2(Move.Right); - - // ---- - enum Rating { - One = 1, - Two = 2, - Three = 3, - Four = 4, - Five = 5, - } - - const evaluateScore2 = (score: Rating): string => { - return `You rated the service a ${score}`; - }; - - evaluateScore2(Rating.One); // OK - evaluateScore2(Rating.Five); // OK - evaluateScore2(Rating.Four); // OK - evaluateScore2(5); // OK - // evaluateScore2(Rating.Six); -} diff --git a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/assets/img/Understand-Typescript.jpg b/04_typescript/unterricht/tag33/02_ts-narrowing-guards/assets/img/Understand-Typescript.jpg deleted file mode 100644 index c3a5d16..0000000 Binary files a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/assets/img/Understand-Typescript.jpg and /dev/null differ diff --git a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/assets/js/01_narrowing.js b/04_typescript/unterricht/tag33/02_ts-narrowing-guards/assets/js/01_narrowing.js deleted file mode 100644 index 81a6536..0000000 --- a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/assets/js/01_narrowing.js +++ /dev/null @@ -1,73 +0,0 @@ -(() => { - // src/01_narrowing.ts - { - const displayValue = (value) => { - if (typeof value === "string") { - console.log(value.toUpperCase()); - } else { - console.log(value.toFixed(2)); - } - }; - displayValue("Hello World"); - displayValue(19); - const processPadding = (padding, input) => { - if (typeof padding === "number") { - return `${padding * 2}${input}`; - } else { - return `${padding}${input}`; - } - }; - processPadding(2, "px"); - processPadding("1.5", "rem"); - const handleInput = (input) => { - if (typeof input === "boolean") { - return input ? "The value is true!" : "The value is false."; - } else if (typeof input === "number") { - return `The number is ${input * 10}.`; - } else { - return `The string is "${input.toUpperCase()}".`; - } - }; - handleInput(true); - handleInput(10); - handleInput("super"); - const processNumbers = (numbers) => { - if (Array.isArray(numbers)) { - numbers.forEach((num) => { - console.log(num * 2); - }); - } - }; - processNumbers([1, 2, 3, 4]); - processNumbers(null); - console.log(typeof []); - console.log(typeof {}); - console.log("object"); - const displayInfo = (input) => { - if (input !== null && typeof input === "object") { - console.log(input.name); - } else { - console.log(input); - } - }; - displayInfo({ name: "ErrorHandler" }); - displayInfo("Error"); - displayInfo(null); - const processData = (data2) => { - if (typeof data2 === "string") { - console.log(`String value: ${data2.toUpperCase()}`); - } else if (typeof data2 === "number") { - console.log(`Number squared: ${data2 ** 2}`); - } else if (typeof data2 === "boolean") { - console.log(`Boolean value: ${data2 ? "True" : "False"}`); - } else { - console.log("No valid data provided."); - } - }; - let data; - processData("Hello"); - processData(4); - processData(true); - processData(data); - } -})(); diff --git a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/assets/js/02_truthiness.js b/04_typescript/unterricht/tag33/02_ts-narrowing-guards/assets/js/02_truthiness.js deleted file mode 100644 index 37c9c32..0000000 --- a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/assets/js/02_truthiness.js +++ /dev/null @@ -1,38 +0,0 @@ -(() => { - // src/02_truthiness.ts - { - const showMessage = (userCount) => { - return userCount ? `There are ${userCount} users online.` : "No users online."; - }; - console.log(showMessage(5)); - const printNames = (names) => { - if (names) { - names.forEach((name) => { - console.log(name); - }); - } else { - console.log("No names provided."); - } - }; - printNames(["Adel", "Ersin", "Andreas", "Kahleel"]); - printNames(null); - const displayInput = (input) => { - if (input) { - console.log(`Input provided: ${input}`); - } else { - console.log("No input provided."); - } - }; - displayInput(document.querySelector("h2")); - const multiplyValues = (values, factor) => { - if (!values) { - return void 0; - } - return values.map((value) => value * factor); - }; - let numbers; - console.log(multiplyValues([1, 2, 3, 4], 2)); - console.log(multiplyValues([], 2)); - console.log(multiplyValues(numbers, 2)); - } -})(); diff --git a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/assets/js/03_equality.js b/04_typescript/unterricht/tag33/02_ts-narrowing-guards/assets/js/03_equality.js deleted file mode 100644 index 6a64e67..0000000 --- a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/assets/js/03_equality.js +++ /dev/null @@ -1,34 +0,0 @@ -(() => { - // src/03_equality.ts - { - const compareValues = (a, b) => { - if (a === b) { - console.log(a.toUpperCase()); - console.log(b.toLowerCase()); - } else { - console.log(`a is ${a}, b is ${b}`); - } - }; - const result = compareValues(1, "1"); - console.log(result); - const scaleValue = (container, factor) => { - if (container.value != null) { - container.value *= factor; - } - }; - const processInput = (input) => { - if (input !== null) { - if (typeof input === "number") { - console.log(`Number input: ${input}`); - } else { - console.log(`String input: ${input}`); - } - } else { - console.log("No input provided."); - } - }; - processInput(23); - processInput("23"); - processInput(null); - } -})(); diff --git a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/assets/js/04_in-operator.js b/04_typescript/unterricht/tag33/02_ts-narrowing-guards/assets/js/04_in-operator.js deleted file mode 100644 index 962f533..0000000 --- a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/assets/js/04_in-operator.js +++ /dev/null @@ -1,32 +0,0 @@ -(() => { - // src/04_in-operator.ts - { - const isCar = (vehicle) => { - return Object.hasOwn(vehicle, "drive"); - }; - const operate = (vehicle) => { - if ("drive" in vehicle) { - vehicle.drive(); - } else { - vehicle.sail(); - } - }; - const car = { drive: () => console.log("I'm driving") }; - const sealander = { sail: () => console.log("I'm sailing") }; - operate(car); - operate(sealander); - const move = (entity) => { - if ("walk" in entity) { - entity.walk?.(); - } else if ("fly" in entity) { - entity.fly?.(); - } - }; - const dog = { bark: () => console.log("Woof") }; - const bird = { fly: () => console.log("Flying") }; - const robot = { walk: () => console.log("Walking") }; - move(dog); - move(bird); - move(robot); - } -})(); diff --git a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/assets/js/05_kontrollflussanalyse.js b/04_typescript/unterricht/tag33/02_ts-narrowing-guards/assets/js/05_kontrollflussanalyse.js deleted file mode 100644 index 54eee98..0000000 --- a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/assets/js/05_kontrollflussanalyse.js +++ /dev/null @@ -1,37 +0,0 @@ -(() => { - // src/05_kontrollflussanalyse.ts - { - const processData = (data) => { - if (typeof data === "boolean") { - console.log("Boolean value:", data); - } else if (typeof data === "string") { - console.log("String value:", data.toUpperCase()); - } else { - console.log("Number value:", data.toFixed(2)); - } - }; - processData(true); - processData("hello"); - processData(123); - const checkValue = (value) => { - if (typeof value === "string") { - return `String: ${value}`; - } - return `Number: ${value.toFixed(2)}`; - }; - console.log(checkValue("hello")); - console.log(checkValue(123)); - const describeInput = (input) => { - if (input === null) { - return "No input provided."; - } - if (typeof input === "string") { - return `String input: ${input.toUpperCase()}`; - } - return `Number input: ${input.toFixed(2)}`; - }; - console.log(describeInput("hello")); - console.log(describeInput(123)); - console.log(describeInput(null)); - } -})(); diff --git a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/assets/js/06_type-predicate.js b/04_typescript/unterricht/tag33/02_ts-narrowing-guards/assets/js/06_type-predicate.js deleted file mode 100644 index fac0d8a..0000000 --- a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/assets/js/06_type-predicate.js +++ /dev/null @@ -1,26 +0,0 @@ -(() => { - // src/06_type-predicate.ts - { - const isFish = (pet2) => { - return Object.hasOwn(pet2, "swim"); - }; - const pet = { swim: () => console.log("Is swimming") }; - if (isFish(pet)) { - pet.swim(); - } - const handlePet = (pet2) => { - if (isFish(pet2)) { - pet2.swim(); - } else { - pet2.fly(); - } - }; - handlePet(pet); - const zoo = [ - { swim: () => console.log("Fish swimming") }, - { fly: () => console.log("Bird flying") } - ]; - const fishes = zoo.filter(isFish); - fishes.forEach((fish) => fish.swim()); - } -})(); diff --git a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/index.html b/04_typescript/unterricht/tag33/02_ts-narrowing-guards/index.html deleted file mode 100644 index bd0767f..0000000 --- a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/index.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - TypeScript - Narrowing und Guards - - - - - -
      -
      -

      TypeScript - Narrowing und Guards

      -

      - TypeScript ist eine von Microsoft entwickelte Skriptsprache, die auf den Vorschlägen zum - ECMAScript-6-Standardbasiert und statische Typisierung zu JavaScript hinzufügt. Sprachkonstrukte von - TypeScript, wie Klassen, Vererbung, Module und anonyme Funktionen, wurden auch in ECMAScript 6 übernommen. -

      - TypeScript Kreisdiagramm -
      -
      - - diff --git a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/package-lock.json b/04_typescript/unterricht/tag33/02_ts-narrowing-guards/package-lock.json deleted file mode 100644 index 99bb034..0000000 --- a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/package-lock.json +++ /dev/null @@ -1,499 +0,0 @@ -{ - "name": "01_ts-types", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "01_ts-types", - "version": "1.0.0", - "devDependencies": { - "esbuild": "^0.28.1" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", - "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", - "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", - "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", - "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", - "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", - "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", - "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", - "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", - "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", - "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", - "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", - "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", - "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", - "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", - "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", - "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", - "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", - "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", - "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", - "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", - "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", - "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", - "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", - "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", - "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", - "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", - "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.28.1", - "@esbuild/android-arm": "0.28.1", - "@esbuild/android-arm64": "0.28.1", - "@esbuild/android-x64": "0.28.1", - "@esbuild/darwin-arm64": "0.28.1", - "@esbuild/darwin-x64": "0.28.1", - "@esbuild/freebsd-arm64": "0.28.1", - "@esbuild/freebsd-x64": "0.28.1", - "@esbuild/linux-arm": "0.28.1", - "@esbuild/linux-arm64": "0.28.1", - "@esbuild/linux-ia32": "0.28.1", - "@esbuild/linux-loong64": "0.28.1", - "@esbuild/linux-mips64el": "0.28.1", - "@esbuild/linux-ppc64": "0.28.1", - "@esbuild/linux-riscv64": "0.28.1", - "@esbuild/linux-s390x": "0.28.1", - "@esbuild/linux-x64": "0.28.1", - "@esbuild/netbsd-arm64": "0.28.1", - "@esbuild/netbsd-x64": "0.28.1", - "@esbuild/openbsd-arm64": "0.28.1", - "@esbuild/openbsd-x64": "0.28.1", - "@esbuild/openharmony-arm64": "0.28.1", - "@esbuild/sunos-x64": "0.28.1", - "@esbuild/win32-arm64": "0.28.1", - "@esbuild/win32-ia32": "0.28.1", - "@esbuild/win32-x64": "0.28.1" - } - } - } -} diff --git a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/package.json b/04_typescript/unterricht/tag33/02_ts-narrowing-guards/package.json deleted file mode 100644 index 429e72c..0000000 --- a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "01_ts-types", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild \"src/*.ts\" --watch --bundle --outdir=\"assets/js\" --loader:.ts=ts" - }, - "keywords": [], - "type": "module", - "devDependencies": { - "esbuild": "^0.28.1" - } -} diff --git a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/src/01_narrowing.ts b/04_typescript/unterricht/tag33/02_ts-narrowing-guards/src/01_narrowing.ts deleted file mode 100644 index f756427..0000000 --- a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/src/01_narrowing.ts +++ /dev/null @@ -1,98 +0,0 @@ -// Narrowing - Mit Narrowing kann TypeScript innerhalb eines Codeblocks auf einen bestimmten Typ "eingrenzen", sodass du typspezifische Methoden sicher verwenden kannst. -{ - const displayValue = (value: string | number): void => { - if (typeof value === 'string') { - console.log(value.toUpperCase()); - // Type Guard: typeof value === "string" - // Narrowing: 'value' is now of type 'string' - } else { - // Narrowing: 'value' is now of type 'number' - console.log(value.toFixed(2)); - } - }; - - displayValue('Hello World'); // => 'HELLO WORLD' - displayValue(19); // => '19.00' - - // ------- - const processPadding = (padding: number | string, input: string): string => { - if (typeof padding === 'number') { - // Here, padding is confirmed to be a number - return `${padding * 2}${input}`; - } else { - // Here, padding is confirmed to be a string - return `${padding}${input}`; - } - }; - - processPadding(2, 'px'); // => '4px' - processPadding('1.5', 'rem'); //=> '1.5rem' - - // -------- - const handleInput = (input: boolean | number | string): string => { - // Narrowing - if (typeof input === 'boolean') { - return input ? 'The value is true!' : 'The value is false.'; - } else if (typeof input === 'number') { - return `The number is ${input * 10}.`; - } else { - return `The string is "${input.toUpperCase()}".`; - } - }; - - handleInput(true); // => 'The value is true!' - handleInput(10); // => 'The number is 100' - handleInput('super'); // => 'The string is super' - // -------- - - const processNumbers = (numbers: number[] | null): void => { - // Narrowing - Eingrenzung des Datentyps - // if (numbers !== null && typeof numbers === 'object') { - if (Array.isArray(numbers)) { - numbers.forEach((num) => { - console.log(num * 2); - }); - } - }; - - processNumbers([1, 2, 3, 4]); // => 2 4 6 8 - processNumbers(null); - - // ------- - - console.log(typeof []); // => 'object' - console.log(typeof {}); // => 'object' - console.log(typeof null); // => 'object' - - const displayInfo = (input: string | { name: string } | null) => { - if (input !== null && typeof input === 'object') { - console.log(input.name); // Error: Object is possibly 'null' - } else { - console.log(input); - } - }; - - displayInfo({ name: 'ErrorHandler' }); - displayInfo('Error'); - displayInfo(null); - - // -------- - const processData = (data: string | number | boolean | undefined): void => { - if (typeof data === 'string') { - console.log(`String value: ${data.toUpperCase()}`); - } else if (typeof data === 'number') { - console.log(`Number squared: ${data ** 2}`); - } else if (typeof data === 'boolean') { - console.log(`Boolean value: ${data ? 'True' : 'False'}`); - } else { - console.log('No valid data provided.'); - } - }; - - let data; - - processData('Hello'); //=> 'HELLO' - processData(4); //=> Number squared: 16 - processData(true); //=> Boolean value: True - processData(data); // =>'No valid data provided. -} diff --git a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/src/02_truthiness.ts b/04_typescript/unterricht/tag33/02_ts-narrowing-guards/src/02_truthiness.ts deleted file mode 100644 index 76cb503..0000000 --- a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/src/02_truthiness.ts +++ /dev/null @@ -1,69 +0,0 @@ -// Truthiness -/* -Truthiness wird verwendet, um zu bestimmen, ob eine Variable wahr oder falsch ist. -*/ - -// Falsy types in TypeScript/JavaScript are: -// - false -// - 0 -// - -0 -// - NaN -// - 0n (BigInt) -// - "" (empty string) -// - null -// - undefined -// - [] -{ - const showMessage = (userCount: number): string => { - // if (userCount) { - // return `There are ${userCount} users online.`; - // } - // return 'No users online.'; - - return userCount ? `There are ${userCount} users online.` : 'No users online.'; - }; - - console.log(showMessage(5)); // => There are 5 users online. - - // ---------- - - const printNames = (names: string[] | null): void => { - if (names) { - names.forEach((name) => { - console.log(name); - }); - } else { - console.log('No names provided.'); - } - }; - - printNames(['Adel', 'Ersin', 'Andreas', 'Kahleel']); - printNames(null); - - // ------- - - const displayInput = (input: string | HTMLHeadingElement | null) => { - if (input) { - console.log(`Input provided: ${input}`); - } else { - console.log('No input provided.'); - } - }; - - displayInput(document.querySelector('h2')); - - // -------- - - const multiplyValues = (values: number[] | undefined, factor: number): number[] | undefined => { - if (!values) { - return undefined; - } - return values.map((value) => value * factor); - }; - - let numbers; - - console.log(multiplyValues([1, 2, 3, 4], 2)); // => [2,4,6,8] - console.log(multiplyValues([], 2)); // => [] - console.log(multiplyValues(numbers, 2)); // => undefined -} diff --git a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/src/03_equality.ts b/04_typescript/unterricht/tag33/02_ts-narrowing-guards/src/03_equality.ts deleted file mode 100644 index 610e38a..0000000 --- a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/src/03_equality.ts +++ /dev/null @@ -1,51 +0,0 @@ -// Equality -/* -Equality wird verwendet, um zu bestimmen, ob zwei Werte gleich sind. -*/ - -{ - const compareValues = (a: string | number, b: string | boolean): void => { - if (a === b) { - console.log(a.toUpperCase()); - console.log(b.toLowerCase()); - } else { - console.log(`a is ${a}, b is ${b}`); - } - }; - - // const result = compareValues('1', 1); - const result = compareValues(1, '1'); - - console.log(result); - - // Loose equality - - interface Container { - value: number | null | undefined; - } - - // kein strikter Vergleich (BAD PRACTICE) - const scaleValue = (container: Container, factor: number): void => { - // Douglas Crockford considers the - // == (loose equality) operator to be "bad" because of its inconsistent and surprising behavior, particularly its lack of transitivity, which can lead to unexpected results in JavaScript. He advises against using == and its counterpart != in favor of the strict equality operators === and !== for clearer and safer code - if (container.value != null) { - container.value *= factor; - } - }; - // ------ - const processInput = (input: string | number | null): void => { - if (input !== null) { - if (typeof input === 'number') { - console.log(`Number input: ${input}`); - } else { - console.log(`String input: ${input}`); - } - } else { - console.log('No input provided.'); - } - }; - - processInput(23); // => 'Number input: 23' - processInput('23'); // => 'String input: 23' - processInput(null); // => 'No input provided.' -} diff --git a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/src/04_in-operator.ts b/04_typescript/unterricht/tag33/02_ts-narrowing-guards/src/04_in-operator.ts deleted file mode 100644 index a352f4b..0000000 --- a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/src/04_in-operator.ts +++ /dev/null @@ -1,54 +0,0 @@ -// In Operator - -/* -Der In Operator wird verwendet, um zu bestimmen, ob ein Objekt ein bestimmtes Property hat. -*/ - -{ - type Car = { drive: () => void }; - type Boat = { sail: () => void }; - - // type predicate : vehicle is Car - const isCar = (vehicle: Car | Boat): vehicle is Car => { - return Object.hasOwn(vehicle, 'drive'); - }; - - const operate = (vehicle: Car | Boat) => { - // vehicle.sail(); // Property 'sail' does not exist on type 'Car'. - // if (Object.hasOwn(vehicle, 'drive')) { - // if (isCar(vehicle)) { - if ('drive' in vehicle) { - vehicle.drive(); - } else { - vehicle.sail(); - } - }; - - const car: Car = { drive: () => console.log("I'm driving") }; - const sealander: Boat = { sail: () => console.log("I'm sailing") }; - - operate(car); - operate(sealander); - // -------- - - type Dog = { bark: () => void }; - type Bird = { fly: () => void }; - type Robot = { walk?: () => void; fly?: () => void }; - type Human = { walk: () => void }; - - const move = (entity: Dog | Bird | Robot) => { - if ('walk' in entity) { - entity.walk?.(); - } else if ('fly' in entity) { - entity.fly?.(); - } - }; - - const dog: Dog = { bark: () => console.log('Woof') }; - const bird: Bird = { fly: () => console.log('Flying') }; - const robot: Robot = { walk: () => console.log('Walking') }; - - move(dog); - move(bird); - move(robot); -} diff --git a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/src/05_kontrollflussanalyse.ts b/04_typescript/unterricht/tag33/02_ts-narrowing-guards/src/05_kontrollflussanalyse.ts deleted file mode 100644 index 6ee624f..0000000 --- a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/src/05_kontrollflussanalyse.ts +++ /dev/null @@ -1,50 +0,0 @@ -// Kontrollflussanalyse -/* -In TypeScript wird der Kontrollfluss analysiert, um zu bestimmen, welche Typen eine Variable haben kann. Dies wird auch als "Type Narrowing" bezeichnet. -Type Narrowing wird verwendet, um den Typ einer Variablen zu beschränken, wenn bestimmte Bedingungen erfüllt sind. -*/ - -{ - const processData = (data: string | number | boolean): void => { - if (typeof data === 'boolean') { - console.log('Boolean value:', data); - } else if (typeof data === 'string') { - console.log('String value:', data.toUpperCase()); - } else { - console.log('Number value:', data.toFixed(2)); - } - }; - - processData(true); - processData('hello'); - processData(123); - - // Kontrollfluss mit Early Returns - - const checkValue = (value: string | number): string => { - if (typeof value === 'string') { - return `String: ${value}`; // early return bei Narrowing - } - - return `Number: ${value.toFixed(2)}`; - }; - - console.log(checkValue('hello')); - console.log(checkValue(123)); - - // --- - const describeInput = (input: string | number | null): string => { - if (input === null) { - return 'No input provided.'; - } - - if (typeof input === 'string') { - return `String input: ${input.toUpperCase()}`; - } - return `Number input: ${input.toFixed(2)}`; - }; - - console.log(describeInput('hello')); - console.log(describeInput(123)); - console.log(describeInput(null)); -} diff --git a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/src/06_type-predicate.ts b/04_typescript/unterricht/tag33/02_ts-narrowing-guards/src/06_type-predicate.ts deleted file mode 100644 index d3b0a75..0000000 --- a/04_typescript/unterricht/tag33/02_ts-narrowing-guards/src/06_type-predicate.ts +++ /dev/null @@ -1,45 +0,0 @@ -// Type Predicate -/* -Ein Type Predicate ist eine besondere Art von Funktion, die einen booleschen Wert zurückgibt, der angibt, ob eine Variable einem bestimmten Typ entspricht. - -WICHTIG: "Außerdem grenzt es den Typ der Variablen auf der Grundlage des Ergebnisses der Prüfung ein." -*/ - -{ - type Fish = { swim: () => void }; - type Bird = { fly: () => void }; - - // "pet is Fish" <- Type predicate - const isFish = (pet: Fish | Bird): pet is Fish => { - //return 'swim' in pet; // in Operator führt Type- Narrowing durch. - return Object.hasOwn(pet, 'swim'); - // return pet.hasOwnProperty('swim'); - // return (pet as Fish).swim !== undefined; - }; - - const pet: Fish | Bird = { swim: () => console.log('Is swimming') }; - - if (isFish(pet)) { - pet.swim(); - } - - const handlePet = (pet: Fish | Bird) => { - if (isFish(pet)) { - pet.swim(); // TypeScript knows pet is Fish - } else { - pet.fly(); // TypeScript knows pet is Bird - } - }; - - handlePet(pet); - - //------ - const zoo: (Fish | Bird)[] = [ - { swim: () => console.log('Fish swimming') }, - { fly: () => console.log('Bird flying') }, - ]; - - const fishes = zoo.filter(isFish); - - fishes.forEach((fish) => fish.swim()); -} diff --git a/04_typescript/unterricht/tag34/01_ts-functions/assets/img/Understand-Typescript.jpg b/04_typescript/unterricht/tag34/01_ts-functions/assets/img/Understand-Typescript.jpg deleted file mode 100644 index c3a5d16..0000000 Binary files a/04_typescript/unterricht/tag34/01_ts-functions/assets/img/Understand-Typescript.jpg and /dev/null differ diff --git a/04_typescript/unterricht/tag34/01_ts-functions/assets/js/01_fn-type-expression.js b/04_typescript/unterricht/tag34/01_ts-functions/assets/js/01_fn-type-expression.js deleted file mode 100644 index 9fead3d..0000000 --- a/04_typescript/unterricht/tag34/01_ts-functions/assets/js/01_fn-type-expression.js +++ /dev/null @@ -1,45 +0,0 @@ -(() => { - // src/01_fn-type-expression.ts - { - let printToConsole = function(s) { - console.log(s); - }, mathOperation = function(fn) { - return fn(10, 20); - }; - const mathOperationFn = (fn) => { - return fn(4, 5); - }; - const multiply = (a, b) => { - return a * b; - }; - const multiply2 = (a, b) => { - return a * b; - }; - console.log(multiply2(2, 4)); - mathOperationFn(multiply); - const greeter = (fn) => { - fn("Hello, World"); - }; - const greeter2 = (fn) => { - fn("Hello, World"); - }; - greeter(printToConsole); - greeter2(printToConsole); - const logMessage = (message) => { - console.log(message); - }; - const logMessage2 = (message) => { - console.log(message); - }; - const logMessage3 = (message) => { - console.log(message); - }; - logMessage("Hello"); - logMessage2("Hola"); - logMessage3("Hallo"); - const subtract = (x, y) => { - return x - y; - }; - console.log(mathOperation(subtract)); - } -})(); diff --git a/04_typescript/unterricht/tag34/01_ts-functions/assets/js/02_fn-call-signature.js b/04_typescript/unterricht/tag34/01_ts-functions/assets/js/02_fn-call-signature.js deleted file mode 100644 index 1c548bc..0000000 --- a/04_typescript/unterricht/tag34/01_ts-functions/assets/js/02_fn-call-signature.js +++ /dev/null @@ -1,29 +0,0 @@ -(() => { - // src/02_fn-call-signature.ts - { - let doSomething = function(fn) { - console.log(fn.description + " returned " + fn(6)); - }; - const sum = (a, b) => { - return `The sum is ${a + b}`; - }; - const sum2 = (a, b) => { - return `The sum is ${a + b}`; - }; - console.log(sum(40, 2)); - console.log(sum2(60, 7)); - const add = (x, y) => { - return x + y; - }; - const multiply = (x, y) => { - return x * y; - }; - console.log(add(123, 321)); - console.log(multiply(25, 25)); - const myFunc = (someArg) => { - return someArg > 3; - }; - myFunc.description = "Default description"; - doSomething(myFunc); - } -})(); diff --git a/04_typescript/unterricht/tag34/01_ts-functions/assets/js/03_fn-generics.js b/04_typescript/unterricht/tag34/01_ts-functions/assets/js/03_fn-generics.js deleted file mode 100644 index 1c87fc0..0000000 --- a/04_typescript/unterricht/tag34/01_ts-functions/assets/js/03_fn-generics.js +++ /dev/null @@ -1,34 +0,0 @@ -(() => { - // src/03_fn-generics.ts - { - const identityNumber = (arg) => { - return arg; - }; - const identityString = (arg) => { - return arg; - }; - const identity = (arg) => { - return arg; - }; - let resultNumber = identity(42); - let resultString = identity("Hello TypeScript"); - let resultBoolean = identity(true); - console.log(resultNumber, resultString, resultBoolean); - const firstElement = (arr) => { - return arr[0]; - }; - console.log(firstElement(["Adel", "Andreas", "Ersin", "Kahleel"])); - console.log(firstElement([23, 19, 5, 42, 2, 45])); - console.log( - firstElement([ - { firstName: "John", age: 27 }, - { firstName: "JAne", age: 18 } - ]) - ); - console.log(firstElement([])); - let inferredResult = identity("Hello"); - let explicitResult = identity(42); - console.log(inferredResult); - console.log(explicitResult); - } -})(); diff --git a/04_typescript/unterricht/tag34/01_ts-functions/assets/js/04_fn-optional-parameter.js b/04_typescript/unterricht/tag34/01_ts-functions/assets/js/04_fn-optional-parameter.js deleted file mode 100644 index aa56de4..0000000 --- a/04_typescript/unterricht/tag34/01_ts-functions/assets/js/04_fn-optional-parameter.js +++ /dev/null @@ -1,53 +0,0 @@ -(() => { - // src/04_fn-optional-parameter.ts - { - const greet = (name) => { - if (name) { - return `Hello, ${name}!`; - } else { - return "Hello!"; - } - }; - console.log(greet()); - console.log(greet("Alice")); - } - { - const greet = (name = "Guest") => { - return `Hello, ${name}!`; - }; - console.log(greet()); - console.log(greet("Alice")); - } - { - const sendMessage = (message, recipient) => { - if (recipient) { - return `Message: "${message}" sent to ${recipient}`; - } else { - return `Message: "${message}" sent to default recipient`; - } - }; - console.log(sendMessage("Welcome", "John")); - console.log(sendMessage("Welcome")); - } - { - const formatNumber = (num, decimals) => { - if (decimals !== void 0) { - return num.toFixed(decimals); - } else { - return num.toString(); - } - }; - console.log(formatNumber(3.14159, 2)); - console.log(formatNumber(3.14159)); - } - { - const processItems = (items, callback) => { - for (let i = 0; i < items.length; i++) { - callback(items[i], i); - } - }; - processItems(["apple", "banana", "cherry"], (item) => { - console.log(item); - }); - } -})(); diff --git a/04_typescript/unterricht/tag34/01_ts-functions/assets/js/05_fn-rest-parameter.js b/04_typescript/unterricht/tag34/01_ts-functions/assets/js/05_fn-rest-parameter.js deleted file mode 100644 index ab25184..0000000 --- a/04_typescript/unterricht/tag34/01_ts-functions/assets/js/05_fn-rest-parameter.js +++ /dev/null @@ -1,27 +0,0 @@ -(() => { - // src/05_fn-rest-parameter.ts - { - const multiply = (n, ...m) => { - return m.map((x) => n * x); - }; - const a = multiply(10, 1, 2, 3, 4); - console.log(a); - console.log(multiply(10)); - console.log(multiply(2, 2, 3)); - const greetNames = (greeting, ...names) => { - return names.map((name) => { - return `${greeting} ${name}`; - }); - }; - console.log(greetNames("Hello", "John").join("\n")); - console.log(greetNames("Hi", "John", "Tick", "Trick", "Track").join("\n")); - const concatenate = (...strings) => { - return strings.join(" "); - }; - const concatenate2 = (...strings) => { - return strings.join(" "); - }; - concatenate("Ich", "bin", "ein", "Text"); - concatenate2("Ich", "bin", "ein", "Text"); - } -})(); diff --git a/04_typescript/unterricht/tag34/01_ts-functions/assets/js/06_fn-destructuring.js b/04_typescript/unterricht/tag34/01_ts-functions/assets/js/06_fn-destructuring.js deleted file mode 100644 index 143b35a..0000000 --- a/04_typescript/unterricht/tag34/01_ts-functions/assets/js/06_fn-destructuring.js +++ /dev/null @@ -1,36 +0,0 @@ -(() => { - // src/06_fn-destructuring.ts - { - let printCoordinates = function([x, y]) { - console.log(`X: ${x}, Y: ${y}`); - }; - const greetUser = (user) => { - console.log(`Hello, ${user.name}! You are ${user.age} years old.`); - }; - const greetUser2 = ({ name, age }) => { - console.log(`Hello, ${name}! You are ${age} years old.`); - }; - const greetUser3 = ({ - name, - age - } = { name: "John", age: 18 }) => { - console.log(`Hello, ${name}! You are ${age} years old.`); - }; - greetUser3({ name: "Alice", age: 25 }); - const greetUser4 = (user) => { - const { name, age } = user; - console.log(`Hello, ${name}! You are ${age} years old.`); - }; - greetUser4({ name: "Alice", age: 25 }); - const sum = ({ a, b, c }) => { - console.log(a + b + c); - }; - const sum2 = (sumObj) => { - const { a, b, c } = sumObj; - console.log(a + b + c); - }; - sum({ a: 10, b: 5, c: 15 }); - sum2({ a: 10, b: 5, c: 15 }); - printCoordinates([10, 20]); - } -})(); diff --git a/04_typescript/unterricht/tag34/01_ts-functions/assets/js/07_never-void-unknown.js b/04_typescript/unterricht/tag34/01_ts-functions/assets/js/07_never-void-unknown.js deleted file mode 100644 index f36e7ea..0000000 --- a/04_typescript/unterricht/tag34/01_ts-functions/assets/js/07_never-void-unknown.js +++ /dev/null @@ -1,76 +0,0 @@ -(() => { - // src/07_never-void-unknown.ts - { - let infiniteLoop = function() { - while (true) { - console.log("This loop will never end"); - } - }; - const logMessage = (message) => { - console.log(message); - }; - const logMessage2 = (message) => { - console.log(message); - return "message"; - }; - logMessage("Hello, TypeScript!"); - console.log(logMessage2("Hello, TypeScript!")); - const clearScreen = () => { - }; - clearScreen(); - const processInput = (input) => { - if (typeof input === "string") { - console.log(`The input is a string: ${input.toUpperCase()}`); - } else if (typeof input === "number") { - console.log(`The input is a number: ${input + 10}`); - } else { - console.log("Unknown type of input"); - } - }; - processInput("Hello"); - processInput(42); - processInput(true); - const getPersonAsync = async () => { - try { - const res = await fetch("https://dummyjson.com/users/1?select=firstName,lastName,age"); - if (!res.ok) { - throw Error(`HTTP-Request went wrong: ${res.status}`); - } - const data = await res.json(); - return data; - } catch (err) { - if (err instanceof Error) { - console.log(err.message); - console.error(err); - throw err; - } - throw new Error("An unknown error occurred."); - } - }; - getPersonAsync().then((data) => console.log(data)); - const safeParse = (s) => { - return JSON.parse(s); - }; - const result = safeParse('{"name": "Alice"}'); - if (typeof result === "object" && result !== null && "name" in result) { - console.log(result.name); - } - const throwError = (message) => { - throw new Error(message); - }; - throwError("Something went wrong!"); - const handleShape = (shape) => { - switch (shape) { - case "circle": - return "Handling a circle"; - case "square": - return "Handling a square"; - default: - const _exhaustiveCheck = shape; - return _exhaustiveCheck; - } - }; - console.log(handleShape("circle")); - console.log(handleShape("square")); - } -})(); diff --git a/04_typescript/unterricht/tag34/01_ts-functions/index.html b/04_typescript/unterricht/tag34/01_ts-functions/index.html deleted file mode 100644 index bf7a40d..0000000 --- a/04_typescript/unterricht/tag34/01_ts-functions/index.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - TypeScript - Functions - - - - - - - - - - -
      -
      -

      TypeScript - Functions

      -

      - TypeScript ist eine von Microsoft entwickelte Skriptsprache, die auf den Vorschlägen zum - ECMAScript-6-Standardbasiert und statische Typisierung zu JavaScript hinzufügt. Sprachkonstrukte von - TypeScript, wie Klassen, Vererbung, Module und anonyme Funktionen, wurden auch in ECMAScript 6 übernommen. -

      - TypeScript Kreisdiagramm -
      -
      - - diff --git a/04_typescript/unterricht/tag34/01_ts-functions/package-lock.json b/04_typescript/unterricht/tag34/01_ts-functions/package-lock.json deleted file mode 100644 index 99bb034..0000000 --- a/04_typescript/unterricht/tag34/01_ts-functions/package-lock.json +++ /dev/null @@ -1,499 +0,0 @@ -{ - "name": "01_ts-types", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "01_ts-types", - "version": "1.0.0", - "devDependencies": { - "esbuild": "^0.28.1" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", - "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", - "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", - "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", - "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", - "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", - "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", - "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", - "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", - "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", - "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", - "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", - "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", - "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", - "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", - "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", - "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", - "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", - "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", - "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", - "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", - "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", - "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", - "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", - "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", - "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", - "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", - "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.28.1", - "@esbuild/android-arm": "0.28.1", - "@esbuild/android-arm64": "0.28.1", - "@esbuild/android-x64": "0.28.1", - "@esbuild/darwin-arm64": "0.28.1", - "@esbuild/darwin-x64": "0.28.1", - "@esbuild/freebsd-arm64": "0.28.1", - "@esbuild/freebsd-x64": "0.28.1", - "@esbuild/linux-arm": "0.28.1", - "@esbuild/linux-arm64": "0.28.1", - "@esbuild/linux-ia32": "0.28.1", - "@esbuild/linux-loong64": "0.28.1", - "@esbuild/linux-mips64el": "0.28.1", - "@esbuild/linux-ppc64": "0.28.1", - "@esbuild/linux-riscv64": "0.28.1", - "@esbuild/linux-s390x": "0.28.1", - "@esbuild/linux-x64": "0.28.1", - "@esbuild/netbsd-arm64": "0.28.1", - "@esbuild/netbsd-x64": "0.28.1", - "@esbuild/openbsd-arm64": "0.28.1", - "@esbuild/openbsd-x64": "0.28.1", - "@esbuild/openharmony-arm64": "0.28.1", - "@esbuild/sunos-x64": "0.28.1", - "@esbuild/win32-arm64": "0.28.1", - "@esbuild/win32-ia32": "0.28.1", - "@esbuild/win32-x64": "0.28.1" - } - } - } -} diff --git a/04_typescript/unterricht/tag34/01_ts-functions/package.json b/04_typescript/unterricht/tag34/01_ts-functions/package.json deleted file mode 100644 index 429e72c..0000000 --- a/04_typescript/unterricht/tag34/01_ts-functions/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "01_ts-types", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild \"src/*.ts\" --watch --bundle --outdir=\"assets/js\" --loader:.ts=ts" - }, - "keywords": [], - "type": "module", - "devDependencies": { - "esbuild": "^0.28.1" - } -} diff --git a/04_typescript/unterricht/tag34/01_ts-functions/src/01_fn-type-expression.ts b/04_typescript/unterricht/tag34/01_ts-functions/src/01_fn-type-expression.ts deleted file mode 100644 index aae786a..0000000 --- a/04_typescript/unterricht/tag34/01_ts-functions/src/01_fn-type-expression.ts +++ /dev/null @@ -1,83 +0,0 @@ -// Function Type Expression -/* -Eine Funktionstyp-Deklaration ist eine Möglichkeit, den Typ einer Funktion zu definieren. -Dabei werden die Typen ihrer Eingänge (Parameter) und ihres Ausgangs (Rückgabewert) definiert. -*/ - -{ - type MathFn = (x: number, y: number) => number; // Funktionstyp-deklaration - - const mathOperationFn = (fn: MathFn): number => { - return fn(4, 5); - }; - - const multiply = (a: number, b: number): number => { - return a * b; - }; - - function multiplyFn(a: number, b: number): number { - return a * b; - } - - const multiply2: MathFn = (a, b) => { - return a * b; - }; - - console.log(multiply2(2, 4)); // => 8 - - mathOperationFn(multiply); // => 20 - - //------ - - // Call Signature (a: string) => void - - type greeterFn = (a: string) => void; - - const greeter = (fn: (a: string) => void) => { - fn('Hello, World'); - }; - const greeter2 = (fn: greeterFn) => { - fn('Hello, World'); - }; - - function printToConsole(s: string): void { - console.log(s); - } - - greeter(printToConsole); // => "Hello, World" - greeter2(printToConsole); // => "Hello, World" - // ------ - - const logMessage = (message: string): void => { - console.log(message); - }; - - const logMessage2: (param: string) => void = (message) => { - console.log(message); - }; - - // RECOMMENDED - type LogFn = (param: string) => void; - - const logMessage3: LogFn = (message) => { - console.log(message); - }; - - logMessage('Hello'); - logMessage2('Hola'); - logMessage3('Hallo'); - - // ----- - type MathFunction = (a: number, b: number) => number; - - // In TypeScript kannst du einer klassischen function-Deklaration nicht direkt einen Funktions-Typ zuweisen. - function mathOperation(fn: MathFunction) { - return fn(10, 20); - } - - const subtract: MathFunction = (x, y) => { - return x - y; - }; - - console.log(mathOperation(subtract)); // => -10 -} diff --git a/04_typescript/unterricht/tag34/01_ts-functions/src/02_fn-call-signature.ts b/04_typescript/unterricht/tag34/01_ts-functions/src/02_fn-call-signature.ts deleted file mode 100644 index 89424a8..0000000 --- a/04_typescript/unterricht/tag34/01_ts-functions/src/02_fn-call-signature.ts +++ /dev/null @@ -1,77 +0,0 @@ -// Call Signatures -/* -Eine Call Signature ermöglicht es dir, die Art und Weise zu beschreiben, wie eine Funktion aufgerufen werden soll, indem du die Typen ihrer Parameter und ihren Rückgabetyp auf eine wiederverwendbare Weise festlegst. Dies ist besonders nützlich, wenn du konsistente Funktionstypen erstellen möchtest, die in deiner gesamten Codebasis angewendet werden können. -*/ - -{ - // (a: number, b: number) => string is a call signature - type SumFn = (a: number, b: number) => string; - - const sum: SumFn = (a, b) => { - return `The sum is ${a + b}`; - }; - - const sum2 = (a: number, b: number): string => { - return `The sum is ${a + b}`; - }; - - console.log(sum(40, 2)); // => 'The sum is 42' - console.log(sum2(60, 7)); // => 'The sum is 67' - - // ------ - - // EMPFEHLUNG: call signature und type annotation von einander trennen und call signature in type alias oder interface definieren. - // const sum2:(a: number, b: number) => string = (a:number, b:number):string => { - // return `The sum is ${a + b}`; - // } - - type Operation = (x: number, y: number) => number; - - const add: Operation = (x, y) => { - return x + y; - }; - - const multiply: Operation = (x, y) => { - return x * y; - }; - - console.log(add(123, 321)); //=> 444 - console.log(multiply(25, 25)); //=> 625 - - //-------- - - type Person = { - name: string; - age: number; - walk: (speed?: number) => string; - }; - - const person: Person = { - name: 'John', - age: 23, - walk() { - return "i'm walking."; - }, - }; - - console.log(person.walk()); - - // VORSICHT SONDERFALL in der Signatur bei describable Function - - // Bei Describable Function : anstatt => für Rückgabe - type DescribableFunction = { - description: string; - (someArg: number): boolean; // Call signature - }; - - function doSomething(fn: DescribableFunction) { - console.log(fn.description + ' returned ' + fn(6)); - } - - const myFunc = (someArg: number): boolean => { - return someArg > 3; - }; - myFunc.description = 'Default description'; - - doSomething(myFunc); // => "Default description returned true" -} diff --git a/04_typescript/unterricht/tag34/01_ts-functions/src/03_fn-generics.ts b/04_typescript/unterricht/tag34/01_ts-functions/src/03_fn-generics.ts deleted file mode 100644 index 03c5989..0000000 --- a/04_typescript/unterricht/tag34/01_ts-functions/src/03_fn-generics.ts +++ /dev/null @@ -1,57 +0,0 @@ -// Generic Functions -/* -In TypeScript werden Funktionen durch die Verwendung von Generics noch leistungsfähiger und flexibler. Generics ermöglichen es uns, wiederverwendbare Funktionen zu erstellen, die mit einer Vielzahl von Typen arbeiten können und dabei die Sicherheit und Vorhersagbarkeit des Typsystems von TypeScript beibehalten. - -Diese Flexibilität ermöglicht es Entwicklern, vielseitigeren und besser wartbaren Code zu schreiben, ohne die Typsicherheit zu opfern. -*/ - -{ - const identityNumber = (arg: number): number => { - // code logic which can handle different data types - return arg; - }; - - const identityString = (arg: string): string => { - // code logic which can handle different data types - return arg; - }; - - // Generic Function - const identity = (arg: T): T => { - // code logic with different types - return arg; - }; - - let resultNumber = identity(42); // T is number - let resultString = identity('Hello TypeScript'); // T is string - let resultBoolean = identity(true); // T is boolean - - console.log(resultNumber, resultString, resultBoolean); - // --------------- - - // const firstElement = (arr: any[]) => { - // return arr[0]; - // }; - - const firstElement = (arr: T[]): T | undefined => { - return arr[0]; - }; - - console.log(firstElement(['Adel', 'Andreas', 'Ersin', 'Kahleel'])); // => 'Adel' <- string - console.log(firstElement([23, 19, 5, 42, 2, 45])); // => 23 <- number - console.log( - firstElement([ - { firstName: 'John', age: 27 }, - { firstName: 'JAne', age: 18 }, - ]), - ); // => {...} <- object - console.log(firstElement([])); // => undefined - - // --- - - let inferredResult = identity('Hello'); // TypeScript infers that T is string - let explicitResult = identity(42); // Explicitly sets T to number - - console.log(inferredResult); - console.log(explicitResult); -} diff --git a/04_typescript/unterricht/tag34/01_ts-functions/src/04_fn-optional-parameter.ts b/04_typescript/unterricht/tag34/01_ts-functions/src/04_fn-optional-parameter.ts deleted file mode 100644 index b877e52..0000000 --- a/04_typescript/unterricht/tag34/01_ts-functions/src/04_fn-optional-parameter.ts +++ /dev/null @@ -1,64 +0,0 @@ -// Optionale Parameter -/* -In TypeScript sind Funktionen unglaublich flexibel und du kannst sowohl erforderliche als auch optionale Parameter definieren. -*/ - -{ - const greet = (name?: string): string => { - if (name) { - return `Hello, ${name}!`; - } else { - return 'Hello!'; - } - }; - - console.log(greet()); // => "Hello, Guest!" - console.log(greet('Alice')); // => "Hello, Alice!" -} - -{ - // Default Parameter - const greet = (name: string = 'Guest'): string => { - return `Hello, ${name}!`; - }; - - console.log(greet()); // => "Hello, Guest!" - console.log(greet('Alice')); // => "Hello, Alice!" -} - -{ - const sendMessage = (message: string, recipient?: string): string => { - if (recipient) { - return `Message: "${message}" sent to ${recipient}`; - } else { - return `Message: "${message}" sent to default recipient`; - } - }; - - console.log(sendMessage('Welcome', 'John')); // => 'Message: "Welcome" sent to John' - console.log(sendMessage('Welcome')); // => 'Message: "Welcome" sent to default recipient' -} -{ - const formatNumber = (num: number, decimals?: number): string => { - if (decimals !== undefined) { - return num.toFixed(decimals); - } else { - return num.toString(); - } - }; - - console.log(formatNumber(3.14159, 2)); // => '3.14' - console.log(formatNumber(3.14159)); // => '3.14159' -} -// Optionale Parameter in Callbacks -{ - const processItems = (items: string[], callback: (item: string, index?: number) => void) => { - for (let i = 0; i < items.length; i++) { - callback(items[i], i); - } - }; - - processItems(['apple', 'banana', 'cherry'], (item) => { - console.log(item); - }); -} diff --git a/04_typescript/unterricht/tag34/01_ts-functions/src/05_fn-rest-parameter.ts b/04_typescript/unterricht/tag34/01_ts-functions/src/05_fn-rest-parameter.ts deleted file mode 100644 index 4d967da..0000000 --- a/04_typescript/unterricht/tag34/01_ts-functions/src/05_fn-rest-parameter.ts +++ /dev/null @@ -1,39 +0,0 @@ -// Rest Parameter und Argumente -/* -In TypeScript kannst du mit Restparametern Funktionen erstellen, die eine beliebige Anzahl von Argumenten annehmen können. -*/ - -{ - const multiply = (n: number, ...m: number[]): number[] => { - return m.map((x) => n * x); - }; - - // 'a' gets the value [10, 20, 30, 40] - const a = multiply(10, 1, 2, 3, 4); - - console.log(a); // => [10, 20, 30, 40] - console.log(multiply(10)); // => [] - console.log(multiply(2, 2, 3)); // => [4,6] - - // ------ - - const greetNames = (greeting: string, ...names: string[]): string[] => { - return names.map((name) => { - return `${greeting} ${name}`; - }); - }; - - console.log(greetNames('Hello', 'John').join('\n')); - console.log(greetNames('Hi', 'John', 'Tick', 'Trick', 'Track').join('\n')); - - // ------- - const concatenate = (...strings: string[]): string => { - return strings.join(' '); - }; - const concatenate2 = (...strings: Array): string => { - return strings.join(' '); - }; - - concatenate('Ich', 'bin', 'ein', 'Text'); - concatenate2('Ich', 'bin', 'ein', 'Text'); -} diff --git a/04_typescript/unterricht/tag34/01_ts-functions/src/06_fn-destructuring.ts b/04_typescript/unterricht/tag34/01_ts-functions/src/06_fn-destructuring.ts deleted file mode 100644 index 4882436..0000000 --- a/04_typescript/unterricht/tag34/01_ts-functions/src/06_fn-destructuring.ts +++ /dev/null @@ -1,75 +0,0 @@ -// Parameter-Destrukturierung -/* -Destrukturierung vereinfacht deinen Code, indem du Werte direkt aus Objekten oder Arrays auspacken und sie Variablen innerhalb der Funktionsparameter zuweisen kannst. -*/ -{ - const greetUser = (user: { name: string; age: number }) => { - console.log(`Hello, ${user.name}! You are ${user.age} years old.`); - }; - - const greetUser2 = ({ name, age }: { name: string; age: number }) => { - console.log(`Hello, ${name}! You are ${age} years old.`); - }; - - // NEGATIV BEISPIEL - NOT RECOMMENDED - const greetUser3: (o: { name: string; age: number }) => void = ( - { - name, - age, - }: { - name: string; - age: number; - } = { name: 'John', age: 18 }, - ): void => { - console.log(`Hello, ${name}! You are ${age} years old.`); - }; - - greetUser3({ name: 'Alice', age: 25 }); - // ------ - - // RECOMMENDED - type GreetUserFn = (user: { name: string; age: number }) => void; - - const greetUser4: GreetUserFn = (user) => { - const { name, age } = user; - - console.log(`Hello, ${name}! You are ${age} years old.`); - }; - - greetUser4({ name: 'Alice', age: 25 }); - - // RECOMMENDED ALTERNATIVE - type User = { name: string; age: number }; - - const greetUser5 = (user: User) => { - const { name, age } = user; - - console.log(`Hello, ${name}! You are ${age} years old.`); - }; - - greetUser5({ name: 'Alice', age: 25 }); - - // ----- - const sum = ({ a, b, c }: { a: number; b: number; c: number }): void => { - console.log(a + b + c); - }; - - // RECOMMENDED - type SumObject = { a: number; b: number; c: number }; - - const sum2 = (sumObj: SumObject): void => { - const { a, b, c } = sumObj; - - console.log(a + b + c); - }; - - sum({ a: 10, b: 5, c: 15 }); // => 30 - sum2({ a: 10, b: 5, c: 15 }); // => 30 - - // ------- - function printCoordinates([x, y]: [number, number]) { - console.log(`X: ${x}, Y: ${y}`); - } - - printCoordinates([10, 20]); // => X: 10, Y: 20 -} diff --git a/04_typescript/unterricht/tag34/01_ts-functions/src/07_never-void-unknown.ts b/04_typescript/unterricht/tag34/01_ts-functions/src/07_never-void-unknown.ts deleted file mode 100644 index 5cda185..0000000 --- a/04_typescript/unterricht/tag34/01_ts-functions/src/07_never-void-unknown.ts +++ /dev/null @@ -1,128 +0,0 @@ -// Types: never, unknown, void -/* -In TypeScript gibt es drei spezielle Typen: never, unknown und void. Diese Typen werden in bestimmten Situationen verwendet, um bestimmte Verhaltensweisen zu modellieren. -*/ - -// - void wird für Funktionen verwendet, die keinen Wert zurückgeben, was bedeutet, dass die Funktion eine Aktion ausführt, ohne ein Ergebnis zu liefern. Es wird kein Ergebnis erwartet, dennoch können Ergebnisse zurückgegeben werden ohne Fehlermeldung, wenn void in einer "call Signature" (Funktionstyp-Deklaration verwendet wird) - -// - unknown ist eine sicherere Alternative zu any und erfordert Type-Checking, bevor Operationen mit Werten unbekannten Typs durchgeführt werden, wodurch Laufzeitfehler vermieden werden. - -// - never repräsentiert Funktionen, die niemals zurückkehren, entweder durch das Werfen von Fehlern oder durch unendliches Ausführen, und ist nützlich für die Durchsetzung von exhaustive Type-Checking. - -{ - // - type LogFn = (a: string) => void; - - const logMessage = (message: string): void => { - console.log(message); - }; - - const logMessage2: LogFn = (message) => { - console.log(message); - }; - - logMessage('Hello, TypeScript!'); - console.log(logMessage2('Hello, TypeScript!')); - - const clearScreen = (): void => { - // document.body.innerHTML = ''; - }; - - clearScreen(); - - // ------- - const processInput = (input: unknown): void => { - if (typeof input === 'string') { - console.log(`The input is a string: ${input.toUpperCase()}`); - } else if (typeof input === 'number') { - console.log(`The input is a number: ${input + 10}`); - } else { - console.log('Unknown type of input'); - } - }; - - processInput('Hello'); - processInput(42); - processInput(true); - - // ------ - - interface Userdata { - id?: number; - firstName: string; - lastName: string; - age: number; - } - - // unkown Example - const getPersonAsync = async (): Promise => { - try { - const res: Response = await fetch('https://dummyjson.com/users/1?select=firstName,lastName,age'); - if (!res.ok) { - throw Error(`HTTP-Request went wrong: ${res.status}`); - } - const data: Userdata = await res.json(); - return data; - } catch (err: unknown) { - if (err instanceof Error) { - console.log(err.message); - - console.error(err); - throw err; // paranoid - } - throw new Error('An unknown error occurred.'); - } - }; - - getPersonAsync().then((data) => console.log(data)); - - // ---- - // unknown als Rückgabewert erfordert type checking vor Verwendung - const safeParse = (s: string): unknown => { - return JSON.parse(s); - }; - - const result = safeParse('{"name": "Alice"}'); - - // console.log(result.name); // 'result' is of type 'unknown'. - - // TypeScript requires you to check the type before using `result` - if (typeof result === 'object' && result !== null && 'name' in result) { - console.log(result.name); // Safe access after type check - } - - // ---- - - const throwError = (message: string): never => { - throw new Error(message); - }; - - throwError('Something went wrong!'); - - function infiniteLoop(): never { - while (true) { - console.log('This loop will never end'); - } - } - - //------ - type Shape = 'circle' | 'square'; - - const handleShape = (shape: Shape): string => { - switch (shape) { - case 'circle': - return 'Handling a circle'; - case 'square': - return 'Handling a square'; - - default: - // throw new Error("shape doesn't exist"); - const _exhaustiveCheck: never = shape; // TypeScript error if a new shape is added - return _exhaustiveCheck; - } - }; - - console.log(handleShape('circle')); - console.log(handleShape('square')); - // console.log(handleShape('triangle')); -} diff --git a/04_typescript/unterricht/tag34/02_ts-objects/assets/img/Understand-Typescript.jpg b/04_typescript/unterricht/tag34/02_ts-objects/assets/img/Understand-Typescript.jpg deleted file mode 100644 index c3a5d16..0000000 Binary files a/04_typescript/unterricht/tag34/02_ts-objects/assets/img/Understand-Typescript.jpg and /dev/null differ diff --git a/04_typescript/unterricht/tag34/02_ts-objects/assets/js/01_obj-props.js b/04_typescript/unterricht/tag34/02_ts-objects/assets/js/01_obj-props.js deleted file mode 100644 index 505a460..0000000 --- a/04_typescript/unterricht/tag34/02_ts-objects/assets/js/01_obj-props.js +++ /dev/null @@ -1,46 +0,0 @@ -(() => { - // src/01_obj-props.ts - { - let person = { - name: "Alice", - age: 30 - }; - let person2 = { - name: "Alice", - age: 30 - }; - console.table(person); - console.table(person2); - const book1 = { title: "The Great Gatsby" }; - const book2 = { title: "1984", author: "George Orwell" }; - const book3 = { - title: "Moby Dick", - author: "Herman Melville", - pages: 635 - }; - console.log(book1); - console.log(book2); - console.log(book3); - const printBookInfo = (book) => { - const author = book.author ?? "Unknown"; - const pages = book.pages ?? "Page count not available"; - console.log(`Title: ${book.title}, Author: ${author}, Pages: ${pages}`); - }; - const printBookInfoWithDefaults = ({ title, author = "Unknown", pages = 1 }) => { - console.log(`Title: ${title}, Author: ${author}, Pages: ${pages}`); - }; - printBookInfoWithDefaults({ title: "To Kill a Mockingbird" }); - printBookInfo(book3); - printBookInfo(book2); - } - { - const person = { firstName: "John", lastName: "Doe", age: 30 }; - person.age = 31; - const employee = { - id: 101, - details: { position: "Developer", salary: 5e4 } - }; - employee.details.salary = 55e3; - const config = { apiKey: "abc123", timeout: 5e3 }; - } -})(); diff --git a/04_typescript/unterricht/tag34/02_ts-objects/assets/js/02_excess-property-checks.js b/04_typescript/unterricht/tag34/02_ts-objects/assets/js/02_excess-property-checks.js deleted file mode 100644 index 4b118f6..0000000 --- a/04_typescript/unterricht/tag34/02_ts-objects/assets/js/02_excess-property-checks.js +++ /dev/null @@ -1,12 +0,0 @@ -(() => { - // src/02_excess-property-checks.ts - { - const myCar = { make: "Toyota", model: "Camry", year: 2020 }; - console.log(myCar); - const printCarDetails = (car) => { - const { make, model, year } = car; - console.log(`Car Make: ${car.make}, Model: ${car.model}, Year: ${car.year}`); - }; - printCarDetails({ make: "Tesla", model: "Model 3", year: 2021 }); - } -})(); diff --git a/04_typescript/unterricht/tag34/02_ts-objects/assets/js/03_obj-extends.js b/04_typescript/unterricht/tag34/02_ts-objects/assets/js/03_obj-extends.js deleted file mode 100644 index 8d991a6..0000000 --- a/04_typescript/unterricht/tag34/02_ts-objects/assets/js/03_obj-extends.js +++ /dev/null @@ -1,29 +0,0 @@ -(() => { - // src/03_obj-extends.ts - { - const laptop = { - id: 1, - name: "Gaming Laptop", - price: 1500, - brand: "TechBrand", - warranty: 24 - }; - const chair = { - id: 2, - name: "Office Chair", - price: 200, - material: "Leather", - dimensions: { length: 60, width: 50, height: 110 } - }; - const tshirt = { - id: 2, - name: "T-Shirt", - price: 20, - size: "M", - color: "Red" - }; - console.log(laptop); - console.log(chair); - console.log(tshirt); - } -})(); diff --git a/04_typescript/unterricht/tag34/02_ts-objects/assets/js/04_obj-more-types.js b/04_typescript/unterricht/tag34/02_ts-objects/assets/js/04_obj-more-types.js deleted file mode 100644 index 4658fb4..0000000 --- a/04_typescript/unterricht/tag34/02_ts-objects/assets/js/04_obj-more-types.js +++ /dev/null @@ -1,76 +0,0 @@ -(() => { - // src/04_obj-more-types.ts - { - const numbers = [10, 20, 30, 40]; - const numbers2 = [10, 20, 30, 40]; - const namesAndAges = ["John", 123, "Trick", 32]; - const namesAndAges2 = ["John", 123, "Trick", 32]; - const strings = ["eins", "zwei", "drei"]; - const strings2 = ["eins", "zwei", "drei"]; - console.log(numbers, numbers2, namesAndAges, namesAndAges2, strings, strings2); - } - { - const getFirstElement = (arr) => { - return arr.length > 0 ? arr[0] : void 0; - }; - const firstNumber = getFirstElement([1, 2, 3]); - const firstString = getFirstElement(["apple", "banana", "cherry"]); - console.log(firstNumber); - console.log(firstString); - console.log(getFirstElement([])); - } - { - let pair = ["hello", 42]; - console.log(pair[0]); - console.log(pair[1]); - } - { - let Direction; - ((Direction2) => { - Direction2["Up"] = "up"; - Direction2["Down"] = "down"; - Direction2["Left"] = "left"; - Direction2["Right"] = "right"; - })(Direction || (Direction = {})); - let currentDirection = "up" /* Up */; - console.log(currentDirection); - currentDirection = "down" /* Down */; - console.log(currentDirection); - let Status; - ((Status2) => { - Status2["PENDING"] = "pending"; - Status2["SUCCESS"] = "success"; - Status2["ERROR"] = "error"; - })(Status || (Status = {})); - const status = "success" /* SUCCESS */; - console.log(status); - } - { - let Richtung; - ((Richtung2) => { - Richtung2[Richtung2["Norden"] = 2] = "Norden"; - Richtung2[Richtung2["Osten"] = 3] = "Osten"; - Richtung2[Richtung2["Sueden"] = 4] = "Sueden"; - Richtung2[Richtung2["Westen"] = 5] = "Westen"; - })(Richtung || (Richtung = {})); - console.log(2 /* Norden */); - console.log(3 /* Osten */); - } - { - const numbers = { - one: 1, - two: 2, - three: 3 - }; - console.log(numbers); - } - { - const symbol1 = /* @__PURE__ */ Symbol("key"); - const symbol2 = /* @__PURE__ */ Symbol("key"); - const obj = { - [symbol1]: "value1", - [symbol2]: "value2" - }; - console.log(obj); - } -})(); diff --git a/04_typescript/unterricht/tag34/02_ts-objects/index.html b/04_typescript/unterricht/tag34/02_ts-objects/index.html deleted file mode 100644 index 104a687..0000000 --- a/04_typescript/unterricht/tag34/02_ts-objects/index.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - TypeScript - Objects - - - - - - - -
      -
      -

      TypeScript - Objects

      -

      - TypeScript ist eine von Microsoft entwickelte Skriptsprache, die auf den Vorschlägen zum - ECMAScript-6-Standardbasiert und statische Typisierung zu JavaScript hinzufügt. Sprachkonstrukte von - TypeScript, wie Klassen, Vererbung, Module und anonyme Funktionen, wurden auch in ECMAScript 6 übernommen. -

      - TypeScript Kreisdiagramm -
      -
      - - diff --git a/04_typescript/unterricht/tag34/02_ts-objects/package-lock.json b/04_typescript/unterricht/tag34/02_ts-objects/package-lock.json deleted file mode 100644 index 99bb034..0000000 --- a/04_typescript/unterricht/tag34/02_ts-objects/package-lock.json +++ /dev/null @@ -1,499 +0,0 @@ -{ - "name": "01_ts-types", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "01_ts-types", - "version": "1.0.0", - "devDependencies": { - "esbuild": "^0.28.1" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", - "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", - "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", - "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", - "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", - "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", - "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", - "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", - "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", - "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", - "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", - "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", - "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", - "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", - "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", - "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", - "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", - "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", - "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", - "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", - "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", - "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", - "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", - "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", - "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", - "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", - "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/esbuild": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", - "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.28.1", - "@esbuild/android-arm": "0.28.1", - "@esbuild/android-arm64": "0.28.1", - "@esbuild/android-x64": "0.28.1", - "@esbuild/darwin-arm64": "0.28.1", - "@esbuild/darwin-x64": "0.28.1", - "@esbuild/freebsd-arm64": "0.28.1", - "@esbuild/freebsd-x64": "0.28.1", - "@esbuild/linux-arm": "0.28.1", - "@esbuild/linux-arm64": "0.28.1", - "@esbuild/linux-ia32": "0.28.1", - "@esbuild/linux-loong64": "0.28.1", - "@esbuild/linux-mips64el": "0.28.1", - "@esbuild/linux-ppc64": "0.28.1", - "@esbuild/linux-riscv64": "0.28.1", - "@esbuild/linux-s390x": "0.28.1", - "@esbuild/linux-x64": "0.28.1", - "@esbuild/netbsd-arm64": "0.28.1", - "@esbuild/netbsd-x64": "0.28.1", - "@esbuild/openbsd-arm64": "0.28.1", - "@esbuild/openbsd-x64": "0.28.1", - "@esbuild/openharmony-arm64": "0.28.1", - "@esbuild/sunos-x64": "0.28.1", - "@esbuild/win32-arm64": "0.28.1", - "@esbuild/win32-ia32": "0.28.1", - "@esbuild/win32-x64": "0.28.1" - } - } - } -} diff --git a/04_typescript/unterricht/tag34/02_ts-objects/package.json b/04_typescript/unterricht/tag34/02_ts-objects/package.json deleted file mode 100644 index 429e72c..0000000 --- a/04_typescript/unterricht/tag34/02_ts-objects/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "01_ts-types", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "ts": "npx esbuild \"src/*.ts\" --watch --bundle --outdir=\"assets/js\" --loader:.ts=ts" - }, - "keywords": [], - "type": "module", - "devDependencies": { - "esbuild": "^0.28.1" - } -} diff --git a/04_typescript/unterricht/tag34/02_ts-objects/src/01_obj-props.ts b/04_typescript/unterricht/tag34/02_ts-objects/src/01_obj-props.ts deleted file mode 100644 index 0023851..0000000 --- a/04_typescript/unterricht/tag34/02_ts-objects/src/01_obj-props.ts +++ /dev/null @@ -1,115 +0,0 @@ -// Property Modifiers -/* -In TypeScript kannst du die Modifizierer für Eigenschaften in Objekten verwenden, um die Zugriffsrechte und Verhaltensweisen zu steuern. -*/ - -{ - let person: { name: string; age: number } = { - name: 'Alice', - age: 30, - }; - - type Person = { - name: string; - age: number; - }; - - let person2: Person = { - name: 'Alice', - age: 30, - }; - - // person.lastName // Property 'lastName' does not exist on type '{ name: string; age: number; }'. - console.table(person); - console.table(person2); - - // ------------------------------------------------------------ - - // type Book = { - interface Book { - title: string; - author?: string; - pages?: number; - } - - const book1: Book = { title: 'The Great Gatsby' }; // Valid: no author or pages - const book2: Book = { title: '1984', author: 'George Orwell' }; // Valid: no pages - const book3: Book = { - title: 'Moby Dick', - author: 'Herman Melville', - pages: 635, - }; // Valid - - console.log(book1); - console.log(book2); - console.log(book3); - - // ------------------------------ - // ?? operator => nullish coalescing - const printBookInfo = (book: Book) => { - const author = book.author ?? 'Unknown'; // Use "Unknown" if author is undefined - const author2 = book.author ? book.author : 'Unknown'; // Use "Unknown" if author is undefined - const pages = book.pages ?? 'Page count not available'; - console.log(`Title: ${book.title}, Author: ${author}, Pages: ${pages}`); - }; - - // destructuring with defaults - const printBookInfoWithDefaults = ({ title, author = 'Unknown', pages = 1 }: Book) => { - console.log(`Title: ${title}, Author: ${author}, Pages: ${pages}`); - }; - - printBookInfoWithDefaults({ title: 'To Kill a Mockingbird' }); - // => Title: To Kill a Mockingbird, Author: Unknown, Pages: 1 - - printBookInfo(book3); - // => Title: Moby Dick, Author: Herman Melville, Pages: 635 - printBookInfo(book2); - // => Title: 1984, Author: George Orwell, Pages: Page count not available -} -// ---------------------- -// Readonly Properties -{ - interface Person { - readonly firstName: string; - readonly lastName: string; - age: number; - } - const person: Person = { firstName: 'John', lastName: 'Doe', age: 30 }; - - person.age = 31; // This works: age can be updated - - // The following lines will cause TypeScript errors - // person.firstName = "Jane"; // Error: Cannot assign to 'firstName' because it is a read-only property - // person.lastName = "Smith"; // Error: Cannot assign to 'lastName' because it is a read-only property - - interface Employee { - readonly id: number; - details: { - position: string; - salary: number; - }; - } - - const employee: Employee = { - id: 101, - details: { position: 'Developer', salary: 50000 }, - }; - - employee.details.salary = 55000; // This works: you can modify the 'details' object - - // The following will cause an error - // employee.id = 102; // Error: Cannot assign to 'id' because it is a read-only property - - interface Config { - readonly apiKey?: string; - readonly timeout?: number; - } - - const config: Config = { apiKey: 'abc123', timeout: 5000 }; - - // export default config; // außerhalb von codeblöcken - - // The following will cause errors because both properties are readonly - // config.apiKey = "newKey"; // Error: Cannot assign to 'apiKey' because it is a read-only property - // config.timeout = 3000; // Error: Cannot assign to 'timeout' because it is a read-only property -} diff --git a/04_typescript/unterricht/tag34/02_ts-objects/src/02_excess-property-checks.ts b/04_typescript/unterricht/tag34/02_ts-objects/src/02_excess-property-checks.ts deleted file mode 100644 index eb8785d..0000000 --- a/04_typescript/unterricht/tag34/02_ts-objects/src/02_excess-property-checks.ts +++ /dev/null @@ -1,29 +0,0 @@ -// Excess Property Checks -/* -Wenn du ein Objekt in TypeScript definierst, musst du sicherstellen, dass das Objekt genau der erwarteten Struktur entspricht. TypeScript prüft nicht nur, ob alle erforderlichen Eigenschaften vorhanden sind, sondern auch, dass keine zusätzlichen, unbeabsichtigten Eigenschaften enthalten sind. Diese Funktion wird als "Excess Property Checks" bezeichnet. -*/ - -{ - // type Car = { - interface Car { - make: string; - model: string; - year: number; - } - - const myCar: Car = { make: 'Toyota', model: 'Camry', year: 2020 }; - // const myCar2: Car = { make: "Honda", model: "Accord", year: 2022, color: "blue" }; - // => TypeScript error: Object literal may only specify known properties, and 'color' does not exist in type 'Car'. - - console.log(myCar); - - const printCarDetails = (car: Car) => { - const { make, model, year } = car; - - console.log(`Car Make: ${car.make}, Model: ${car.model}, Year: ${car.year}`); - }; - - printCarDetails({ make: 'Tesla', model: 'Model 3', year: 2021 }); - // printCarDetails({ make: "Tesla", model: "Model 3", year: 2021, color: "black" }); - // => TypeScript error: Object literal may only specify known properties, and 'color' does not exist in type 'Car'. -} diff --git a/04_typescript/unterricht/tag34/02_ts-objects/src/03_obj-extends.ts b/04_typescript/unterricht/tag34/02_ts-objects/src/03_obj-extends.ts deleted file mode 100644 index d636143..0000000 --- a/04_typescript/unterricht/tag34/02_ts-objects/src/03_obj-extends.ts +++ /dev/null @@ -1,57 +0,0 @@ -// Extending Types -/* -In TypeScript kannst du bestehende Typen erweitern, um speziellere Versionen von ihnen zu erstellen. Mit diesem Ansatz kannst du bestehende Typstrukturen wiederverwenden und erweitern, ohne Code zu duplizieren. -*/ - -{ - interface Product { - readonly id: number; - name: string; - price: number; - } - - interface Electronics extends Product { - brand: string; - warranty: number; // warranty in months - } - - interface Furniture extends Product { - material: string; - dimensions: { length: number; width: number; height: number }; - } - - interface Clothing extends Product { - size: string; - color: string; - } - - const laptop: Electronics = { - id: 1, - name: 'Gaming Laptop', - price: 1500, - brand: 'TechBrand', - warranty: 24, - }; - - const chair: Furniture = { - id: 2, - name: 'Office Chair', - price: 200, - material: 'Leather', - dimensions: { length: 60, width: 50, height: 110 }, - }; - - // chair.id = 3; // readonly Cannot assign to 'id' because it is a read-only property. - - const tshirt: Clothing = { - id: 2, - name: 'T-Shirt', - price: 20, - size: 'M', - color: 'Red', - }; - - console.log(laptop); // => { id: 1, name: 'Gaming Laptop', price: 1500, brand: 'TechBrand', warranty: 24 } - console.log(chair); // => { id: 2, name: 'Office Chair', price: 200, material: 'Leather', dimensions: { length: 60, width: 50, height: 110 } } - console.log(tshirt); // => { id: 2, name: 'T-Shirt', price: 20, size: 'M', color: 'Red' } -} diff --git a/04_typescript/unterricht/tag34/02_ts-objects/src/04_obj-more-types.ts b/04_typescript/unterricht/tag34/02_ts-objects/src/04_obj-more-types.ts deleted file mode 100644 index 4176942..0000000 --- a/04_typescript/unterricht/tag34/02_ts-objects/src/04_obj-more-types.ts +++ /dev/null @@ -1,107 +0,0 @@ -// Object (special) Types - -// Der Array-Typ -{ - const numbers: Array = [10, 20, 30, 40]; - const numbers2: number[] = [10, 20, 30, 40]; - - const namesAndAges: Array = ['John', 123, 'Trick', 32]; - const namesAndAges2: (number | string)[] = ['John', 123, 'Trick', 32]; - - const strings: Array = ['eins', 'zwei', 'drei']; - const strings2: string[] = ['eins', 'zwei', 'drei']; - - console.log(numbers, numbers2, namesAndAges, namesAndAges2, strings, strings2); -} - -// generische Funktionen -{ - const getFirstElement = (arr: Array): T | undefined => { - return arr.length > 0 ? arr[0] : undefined; - }; - - const firstNumber = getFirstElement([1, 2, 3]); // TypeScript infers T as number - const firstString = getFirstElement(['apple', 'banana', 'cherry']); // TypeScript infers T as string - - console.log(firstNumber); // => 1 - console.log(firstString); // => "apple" - console.log(getFirstElement([])); // => undefined -} - -// tuple Type -{ - type StringNumberPair = [string, number]; - - let pair: StringNumberPair = ['hello', 42]; - - console.log(pair[0]); // => "hello" - console.log(pair[1]); // => 42 -} - -// enum Type -{ - enum Direction { - Up = 'up', - Down = 'down', - Left = 'left', - Right = 'right', - } - - let currentDirection = Direction.Up; - - console.log(currentDirection); // => 'up' - - currentDirection = Direction.Down; - console.log(currentDirection); // => 'down' - - enum Status { - PENDING = 'pending', - SUCCESS = 'success', - ERROR = 'error', - } - - const status = Status.SUCCESS; - - console.log(status); // => 'success' -} - -{ - enum Richtung { - Norden = 2, - Osten, - Sueden, - Westen, - } - - console.log(Richtung.Norden); //=> 2 - console.log(Richtung.Osten); //=> 3 -} - -// Record Type -{ - type StringNumberMap = Record; - - const numbers: StringNumberMap = { - true: 1, - two: 2, - three: 3, - }; - - console.log(numbers); // => { one: 1, two: 2, three: 3 } -} - -// Symbol Type - -{ - const symbol1: symbol = Symbol('key'); - const symbol2: symbol = Symbol('key'); - - // console.log(symbol1 === symbol2); // => false => because they are different symbols - - const obj = { - [symbol1]: 'value1', - [symbol2]: 'value2', - }; - - console.log(obj); // => { [Symbol(key)]: 'value1', [Symbol(key)]: 'value2' } -} diff --git a/04_typescript/unterricht/tag35/README.md b/04_typescript/unterricht/tag35/README.md deleted file mode 100644 index 6ed5149..0000000 --- a/04_typescript/unterricht/tag35/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Projektarbeit & Exkurs - -- Abschlussquiz -- **Exkurs Webprojekt in TS mit KI Part I** -- 1:1 Meeting diff --git a/04_typescript/unterricht/tag35/meeting.md b/04_typescript/unterricht/tag35/meeting.md deleted file mode 100644 index e309cf8..0000000 --- a/04_typescript/unterricht/tag35/meeting.md +++ /dev/null @@ -1,6 +0,0 @@ -# Meeting Fr. 31.07.2026 - -- [ ] 14:20 - 14:30 Uhr Adel -- [ ] 14:30 - 14:40 Uhr Kahleel -- [ ] 14:40 - 14:50 Uhr Ersin -- [ ] 14:50 - 15:00 Uhr Andreas diff --git a/04_typescript/unterricht/tag36/README.md b/04_typescript/unterricht/tag36/README.md deleted file mode 100644 index 7cb4e5f..0000000 --- a/04_typescript/unterricht/tag36/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Exkurs: Webseite in TS finalisiert - -- mit Copilot und mit Claude Code zum Vergleich -- Webseite Struktur mit `gulp` optimiert. \ No newline at end of file diff --git a/05_react.zip b/05_react.zip deleted file mode 100644 index 018b866..0000000 Binary files a/05_react.zip and /dev/null differ diff --git a/05_react/.vscode/extensions.json b/05_react/.vscode/extensions.json deleted file mode 100644 index bb659e6..0000000 --- a/05_react/.vscode/extensions.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "recommendations": [ - "kamikillerto.vscode-colorize", - "sleistner.vscode-fileutils", - "bierner.github-markdown-preview", - "bradgashler.htmltagwrap", - "zhuangtongfa.material-theme", - "techer.open-in-browser", - "esbenp.prettier-vscode", - "pdconsec.vscode-print", - "vscode-icons-team.vscode-icons", - "formulahendry.auto-rename-tag", - "tomoki1207.pdf" - ] -} diff --git a/05_react/.vscode/marp-theme.css b/05_react/.vscode/marp-theme.css deleted file mode 100644 index 90ea8da..0000000 --- a/05_react/.vscode/marp-theme.css +++ /dev/null @@ -1,332 +0,0 @@ -/* @theme marp-theme */ - -@charset "UTF-8"; -/*! - * Marp Dracula theme. - * @theme marp-theme - * @author Daniel Nicolas Gisolfi & modified by Philippe Botzek - * - * @auto-scaling true - * @size 4:3 960px 720px - * @size 16:9 1280px 720px - */ - -@import url('https://fonts.googleapis.com/css?family=Lato:400,900|IBM+Plex+Sans:400,700'); - -:root { - --dracula-background: #282a36; - --dracula-current-line: #44475a; - --dracula-foreground: #f8f8f2; - --dracula-comment: #6272a4; - --dracula-cyan: #8be9fd; - --dracula-green: #50fa7b; - --dracula-orange: #ffb86c; - --dracula-pink: #ff79c6; - --dracula-purple: #bd93f9; - --dracula-red: #ff5555; - --dracula-yellow: #f1fa8c; -} - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: var(--dracula-background); -} - -/* Dracula Foreground */ -.hljs, -.hljs-subst, -.hljs-typing, -.hljs-variable, -.hljs-template-variable { - color: var(--dracula-foreground); -} - -/* Dracula Comment */ -.hljs-comment, -.hljs-quote, -.hljs-deletion { - color: var(--dracula-comment); -} - -/* Dracula Cyan */ -.hljs-meta .hljs-doctag, -.hljs-built_in, -.hljs-selector-tag, -.hljs-section, -.hljs-link, -.hljs-class { - color: var(--dracula-cyan); -} - -/* Dracula Green */ -.hljs-title { - color: var(--dracula-green); -} - -/* Dracula Orange */ -.hljs-params { - color: var(--dracula-orange); -} - -/* Dracula Pink */ -.hljs-keyword { - color: var(--dracula-pink); -} - -/* Dracula Purple */ -.hljs-literal, -.hljs-number { - color: var(--dracula-purple); -} - -/* Dracula Red */ -.hljs-regexp { - color: var(--dracula-red); -} - -/* Dracula Yellow */ -.hljs-string, -.hljs-name, -.hljs-type, -.hljs-attr, -.hljs-symbol, -.hljs-bullet, -.hljs-addition, -.hljs-template-tag { - color: var(--dracula-yellow); -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-literal, -.hljs-title, -.hljs-section, -.hljs-doctag, -.hljs-type, -.hljs-name, -.hljs-strong { - font-weight: bold; -} - -.hljs-params, -.hljs-emphasis { - font-style: italic; -} - -svg[data-marp-fitting='svg'] { - max-height: 580px; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 0.5em 0 0 0; - color: var(--dracula-pink); -} -h1 strong, -h2 strong, -h3 strong, -h4 strong, -h5 strong, -h6 strong { - font-weight: inherit; -} - -h1 { - font-size: 1.8em; -} - -h2 { - font-size: 1.5em; -} - -h3 { - font-size: 1.3em; -} - -h4 { - font-size: 1.1em; -} - -h5 { - font-size: 1em; -} - -h6 { - font-size: 0.9em; -} - -p, -blockquote { - margin: 1em 0 0 0; -} - -ul > li, -ol > li { - margin: 0.3em 0 0 0; - color: var(--dracula-cyan); -} -ul > li > p, -ol > li > p { - margin: 0.6em 0 0 0; -} - -code { - display: inline-block; - font-family: 'IBM Plex Mono', monospace; - font-size: 0.8em; - letter-spacing: 0; - margin: -0.1em 0.15em; - padding: 0.1em 0.2em; - vertical-align: baseline; - color: var(--dracula-green); -} - -pre { - display: block; - margin: 1em 0 0 0; - min-height: 1em; - overflow: visible; -} -pre code { - box-sizing: border-box; - margin: 0; - min-width: 100%; - padding: 0.5em; - font-size: 0.7em; -} -pre code svg[data-marp-fitting='svg'] { - max-height: calc(580px - 1em); -} - -blockquote { - margin: 1em 0 0 0; - padding: 0 1em; - position: relative; - color: var(--dracula-orange); -} -blockquote::after, -blockquote::before { - content: '“'; - display: block; - font-family: 'Times New Roman', serif; - font-weight: bold; - position: absolute; - color: var(--dracula-green); -} -blockquote::before { - top: 0; - left: 0; -} -blockquote::after { - right: 0; - bottom: 0; - transform: rotate(180deg); -} -blockquote > *:first-child { - margin-top: 0; -} - -mark { - background: transparent; -} - -table { - border-spacing: 0; - border-collapse: collapse; - margin: 1em 0 0 0; -} -table th, -table td { - padding: 0.2em 0.4em; - border-width: 1px; - border-style: solid; -} - -section { - font-size: 35px; - font-family: 'IBM Plex Sans'; - line-height: 1.35; - letter-spacing: 1.25px; - padding: 70px; - color: var(--dracula-foreground); - background-color: var(--dracula-background); -} -section > *:first-child, -section > header:first-child + * { - margin-top: 0; -} -section a, -section mark { - color: var(--dracula-red); -} -section code { - background: var(--dracula-current-line); - color: var(--dracula-current-green); -} -section h1 strong, -section h2 strong, -section h3 strong, -section h4 strong, -section h5 strong, -section h6 strong { - color: var(--dracula-current-line); -} -section pre > code { - background: var(--dracula-current-line); -} -section header, -section footer, -section section::after, -section blockquote::before, -section blockquote::after { - color: var(--dracula-comment); -} -section table th, -section table td { - border-color: var(--dracula-current-line); -} -section table thead th { - background: var(--dracula-current-line); - color: var(--dracula-yellow); -} -section table tbody > tr:nth-child(even) td, -section table tbody > tr:nth-child(even) th { - background: var(--dracula-current-line); -} - -header, -footer, -section::after { - box-sizing: border-box; - font-size: 66%; - height: 70px; - line-height: 50px; - overflow: hidden; - padding: 10px 25px; - position: absolute; - color: var(--dracula-comment); -} - -header { - left: 0; - right: 0; - top: 0; -} - -footer { - left: 0; - right: 0; - bottom: 0; -} - -section::after { - right: 0; - bottom: 0; - font-size: 80%; -} diff --git a/05_react/.vscode/settings.json b/05_react/.vscode/settings.json deleted file mode 100644 index 3fa021c..0000000 --- a/05_react/.vscode/settings.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "workbench.iconTheme": "vscode-icons", - "workbench.colorTheme": "One Dark Pro", - "prettier.printWidth": 120, - "prettier.singleQuote": true, - "editor.hover.enabled": "on", - "editor.wordWrap": "on", - "explorer.confirmDelete": false, - "explorer.confirmDragAndDrop": false, - "editor.quickSuggestionsDelay": 600, - "editor.tabSize": 2, - "editor.formatOnSave": true, - "emmet.includeLanguages": { - "javascript": "javascriptreact", - "ejs": "html" - }, - "html.format.unformatted": "wbr,%", - "files.associations": { - "*.ejs": "html" - }, - "editor.fontFamily": "'MesloLGS NF', Hack, Consolas, 'Courier New', monospace", - "oneDarkPro.markdownStyle": false, - "explorer.compactFolders": false, - "workbench.editor.labelFormat": "short", - "editor.hover.delay": 800, - "editor.bracketPairColorization.enabled": true, - "editor.guides.bracketPairs": "active", - "markdown.marp.themes": ["./.vscode/marp-theme.css"], - "markdown-preview-github-styles.colorTheme": "light" -} diff --git a/05_react/.vscode/snippets.code-snippets b/05_react/.vscode/snippets.code-snippets deleted file mode 100644 index 259f93d..0000000 --- a/05_react/.vscode/snippets.code-snippets +++ /dev/null @@ -1,73 +0,0 @@ -{ - "Output HTML Element": { - "scope": "html", - "prefix": "output", - "body": ["
      "], - "description": "generate a div Element with output alert and alert secondary class" - }, - "Bootstrap html": { - "scope": "html", - "prefix": "!bs", - "body": [ - "", - "", - "\t", - "\t\t", - "\t\t", - "\t\t$0", - "\t\t", - "\t", - "\t", - "\t\t
      ", - "\t\t\t
      ", - "\t\t\t\t

      $0

      ", - "\t\t\t
      ", - "\t\t
      ", - "\t\t", - "\t", - "" - ], - "description": "Generate HTML with Bootstrap CDN and script-tag" - }, - "$ und $$ helper function": { - "scope": "javascript,typescript", - "prefix": "$$$", - "body": [ - "const $ = (qs) => document.querySelector(qs);", - "const $$ = (qs) => Array.from(document.querySelectorAll(qs));" - ], - "description": "$ and $$ shorthand helper function" - }, - - "JavaScript Dateivorlage": { - "scope": "javascript,typescript", - "prefix": "vjs", - "body": [ - "'use strict';", - "", - "(() => {", - "", - "\t// === DOM & VARS =======", - "\tconst DOM = {};", - "", - "\t// === INIT =============", - "\tconst init = () => {", - "", - "\t}", - "", - "\t// === EVENTHANDLER =====", - "", - "\t// === XHR/FETCH ========", - "", - "\t// === FUNCTIONS ========", - "", - "\tinit();", - "", - "})();" - ], - "description": "JavaScript Dateivorlage" - } -} diff --git a/05_react/agenda.md b/05_react/agenda.md deleted file mode 100644 index b4a9d95..0000000 --- a/05_react/agenda.md +++ /dev/null @@ -1,757 +0,0 @@ ---- -marp: true -theme: default ---- - -## JavaScript Grundlagen Teil 1. - ---- - -#### Tag 01 - -**Inhalt:** - -- Vorstellungsrunde -- Einrichtung der IDE -- Tools für die Webentwicklung (Emmet, Markdown, VS-Code) -- Arbeiten mit VSCode -- Konsolenausgaben mit `console.log()` - -**Übungen:** - -- Übungen Content Factory - ---- - -#### Tag 02 - -**Inhalt:** - -- Dialogfenster in JS `prompt()`, `alert()`, `confirm()` -- Kommentare in JS -- Rechnen in JS -- Datentyp String, Number, Boolean -- literal und typeof -- Prioritätsreihenfolge - -**Übungen:** - -Übung 3 - 6 - ---- - -#### Tag 03 - -**Inhalt:** - -- Variablen und Konstanten in JS -- Zusammengesetzte Zuweisungsoperatoren -- Increment & Decrement -- Strings verketten mit + - -**Übungen:** - -Übung 7 - 12 - ---- - -#### Tag 04 - -**Inhalt:** - -- Escape-Notation -- Implizite und explizite Typkonvertierung -- NaN - Paradoxon -- Math Object -- Number.toFixed() - -**Übungen:** - -Übung 14 - 18 - ---- - -#### Tag 05 - -**Inhalt:** - -- Repetition der Inhalte -- Relationale Operatoren & Vergleichoperatoren -- isNaN -- Lexikographische Vergleiche -- **Exkurs: HTML-Formularfelder** -- 1:1 Meeting - -**Übungen:** - -Übung Kontaktformular mit HTML und BS - ---- - -#### Tag 06 - -**Inhalt:** - -- **Exkurs: HTML Formularfelder mit BS** -- if else Verzweigung und ternärer Operator -- logische Operatoren UND und ODER -- unärer Operator (!) -- String Methoden Part I - -**Übungen:** - -Übung 19 - 26 - ---- - -#### Tag 07 - -**Inhalt:** - -- String Methoden Part II -- Funktionen in JS -- Funktionen mit Übergabeparameter -- Funktionen mit Rückgabewerten - -**Übungen:** - -Übung 26 - 35 - ---- - -#### Tag 08 - -**Inhalt:** - -- Funktionen mit Übergabeparameter -- Funktionen mit Rückgabewerten -- Guards -- Array Part 1 - -**Übungen:** - -Übung 35 - 38 - ---- - -#### Tag 09 - -**Inhalt:** - -- Array Methoden toSorted, toReversed, toSpliced -- toSorted, toReversed -- Array sort mit "compare function" -- Array: Higher Order Funktionen Part (sort map, forEach, reduce, some, every) - -**Übungen:** - -Übung 39 - 48 - ---- - -#### Tag 10 - -**Inhalt:** - -- Array.find und Array.findIndex -- Alle Array Higher Order Funktionen im Überblick -- local scoping -- **Exkurs: Schleifen** - -**Übungen:** - -Übung 46 - 48 - ---- - -## JavaScript für Fortgeschrittene - ---- - -#### Tag 11 - -**Inhalt:** - -- Einführung in JS für Fortgeschrittene -- Objekte in JS - -**Übungen:** - -Projektarbeit -Abschlussquiz - JS Grundlagen - ---- - -#### Tag 12 - -**Inhalt:** - -- Destructuring von Objekten und Arrays -- Rekursion - -**Übungen:** - -Übung 01 - 10 - ---- - -#### Tag 13 - -**Inhalt:** - -- Promises -- Callback-Hell -- Installation von node (npm) und Windows Terminal (für Node) -- **Exkurs: Statische Webseite mit Sass und HTML** -- **Exkurs: Versionierung mit Github Part I** - -**Übungen:** - ---- - -#### Tag 14 - -**Inhalt:** - -- Promise Aufbau -- Promise in Funktionen -- File System von Node -- commonjs vs esm -- async await - -**Übungen:** - -Übung 09 - 11 - ---- - -#### Tag 15 - -**Inhalt:** - -- Wiederholung der Inhalte -- Promise.all() -- **Exkurs: Switch Case Abfragen** -- **Exkurs: Statische Webseite mit Sass und HTML** -- **Exkurs: Versionierung mit Github Part I** -- 1:1 Meeting - ---- - -#### Tag 16 - -**Inhalt:** - -- **Exkurs: Statische Webseite mit Sass und HTML Part II** -- Mehrdimensionale Arrays - -**Übungen:** - -Projektarbeiten -Übungen 11 -13 - ---- - -#### Tag 17 - -**Inhalt:** - -- Chess-Beispiel -- Arbeiten mit Fetch API -- fetch mit Promise und async...await -- Joke API auslesen -- **Exkurs: Versionierung mit Github Part I** - -**Übungen:** - -Übungen 14 - 24 - ---- - -#### Tag 18 - -**Inhalt:** - -- XML-HttpRequest und AJAX mit jQuery -- Node Installation (Wiederholung) -- Node Standardbib - - fs - -**Übungen:** - -Projektarbeit - ---- - -#### Tag 19 - -**Inhalt:** - -- NPM Befehle -- CSV to HTML -- Node Standardbib - - zlib (stream) - - Crypto -- Abschluss von JS für Fortgeschrittene -- Projektvorstellung 1 + 2 - -**Übungen:** - -Übungen 25 - 31 - ---- - -#### Tag 20 - -**Inhalt:** - -- **Einrichtung von Git** -- **Exkurs: Webseite mit Gulp, SASS, HTML/CSS, JS** - -**Übungen:** - -Projektarbeit -Übungen 31 - 32 - ---- - -# JavaScript und das Document Object Model (DOM) - ---- - -#### Tag 21 - -**Inhalt:** - -- Einführung in JS DOM -- DOM Selection (querySelector, querySelectorAll) -- $ & $$ Helper -- CSS Selektoren - -**Übungen:** - -Übungen 01 - 05 - ---- - -#### Tag 22 - -- Defer & Async -- JS Dateien auslagern -- Chat Gestaltung (DOMTokenList Objekt) -- Optimierung von Projektstruktur -- Events in JS MouseEvent, KeyboardEvent - -**Übungen:** - -Übungen 06 - 07 - ---- - -#### Tag 23 - -**Inhalt:** - -- Projekt: Newsboard -- HTML Element Progress -- IDL-Attribut vs. Content-Attribut -- HTML Attribute mit boolescher Zuweisung - -**Übungen:** - -Übung 08 - 10 - ---- - -#### Tag 24 - -**Inhalt:** - -- Tooltip: HTML erweitern mit Data-Attribut -- Dataset Attribut, DOMStringMap Objekt -- getComputedStyle, Attribute mit boolscher Zuweisung - -**Übungen:** - -Übung 11 - 14 - ---- - -#### Tag 25 - -**Inhalt:** - -- DOM Creation - Elemente erstellen -- createElement() & appendChild() -- Projekt: Produktmanager Part I -- DOM Creation Befehle -- Entfernen von Elementen - -**Übungen:** - -Übung 15 - 17 -**Projektarbeit / Content Factory** - ---- - -#### Tag 26 - -**Inhalt:** - -- Import von Modulen in JS (Browserseitig) -- Separation of Concerns -- Projekt: Produktmanager final -- DOM Traversal Befehle & alle DOM Bereiche -- insertBefore(), appendChild(), append(), prepend(), before(), after() -- Refactoring von Produktmanager mit Template - -**Übungen:** - -Übung 18 + optionale Übungen -**Projektarbeit / Content Factory** - ---- - -#### Tag 27 - -**Inhalt:** - -- **Exkurs: Weitere Events: Drag and Drop** -- **Rest API erstellen mit Express** -- JS DOM Projektvorstellung -- Abschlussquiz JS DOM - -**Übungen:** - -Projekte - ---- - -#### Tag 28 - -**Inhalt:** - -- **Exkurs: DOM Inhalte über REST API mit Express Part I** -- **Routing in JS** -- CRUD - Create - (Read) - Update - Delete -- Object Methoden. -- Verwendung von Modulen (Bootstrap) - -**Übungen:** - -Projekte & optionale Übungen - ---- - -#### Tag 29 - -**Inhalt:** - -- **Exkurs: DOM Inhalte über mit REST API Express** -- **Erweiterung Frontend um REST API** -- CRUD - Create - Read - Update - Delete -- BREAD - Browse - Read - Edit - Add - Delete -- Verwendung von Modulen (Modal von BS, Toastify, Splide) - -**Übungen** - -Projekte + weiteres Modul einbinden - ---- - -#### Tag 30 - -- **Projektfinalisierung Express + REST API** -- Einführung in Typescript -- Meeting - ---- - -### Tag 31 - -**Inhalt:** - -- Typescript Grundlagen -- Typescript Annotationen -- Typescript "more Types" - -**Übungen:** - -Übungen 1 - 5 - ---- - -### Tag 32 - -**Inhalt:** - -- Typescript Annotationen -- Primitive Types, Object, Union Types -- type statement vs interface -- Type Assertion with as and <> -- Typescript "more Types" - -**Übungen:** - -Übungen 4 - 9 - ---- - -### Tag 33 - -**Inhalt:** - -- Typescript "more Types" - - Interface, as statement, literale -- Typescript Narrowing with Guards - - truthiness, equality, in-operator, type-predicate -- TS Funktionen und Objekte - -**Übungen:** - -Übungen 10 - 19 - ---- - -### Tag 34 - -**Inhalt:** - -- TS Funktionen und Objekte -- Abschluss TypeScript Grundlagen - -**Übungen:** - -Übungen 20 - 31 -Projektarbeit - ---- - -### Tag 35 - -**Inhalt:** - -- Abschlussquiz -- Projekt-Webseite in TS -- Optimierung mit KI -- 1:1 Meeting - -**Übungen:** - -Projektarbeit - ---- - -### Tag 36 - -**Inhalt:** - -- **Exkurs: Finalisierung Projekt Webseite in TS (Gulp)** - - ---- - -# Einführung in React - ---- - - -### Tag 37 - -**Inhalt:** - -- Einführung in REACT -- VDOM von REACT -- ES6 Module mit ohne ohne Bundler - -**Übungen:** - -Übung 01 - 03 - ---- - -### Tag 38 - -**Inhalt:** - -- Build Tools im Vergleich & Einführung in Vite -- Beispiele der Gestaltungsmöglichkeiten in Frameworks -- Layout & wiederverwendbare Komponenten -- EventHandler in React - -**Übungen:** - -Übung 04 - 07 - ---- - -### Tag 39 - -**Inhalt:** - -- Layout & wiederverwendbare Komponenten Part II -- EventHandler in React `onSubmit`, `onChange`, `onClick` -- Hooks in React. - -**Übungen:** - -offene Übungen. -Übung 08 - 11 - ---- - -### Tag 40 - -**Inhalt:** - -- Einführung in Hooks in React. -- Hooks in React. `useState`. - -**Übungen:** - -Übung 12 - 13 - ---- - - -### Tag 41 - -**Inhalt:** - -- Hooks in React. `useState`, `useReducer`, `useContext`, `useId`. -- Routing in React -- Verschachtelte Routen und Layout-Komponenten - -**Übungen:** - -Übung 14 - 15 - ---- - -### Tag 42 - -**Inhalt:** - -- Verschachtelte Routen und Layout-Komponenten -- Formulare in React -- Validierung classic - -**Übungen:** - -Übung 16 - 18 - ---- - -### Tag 43 - -**Inhalt:** - -- Validierung mit `react-hook-form` und Schema Objekten -- Hook: `useEffect`. Arbeiten mit asynchronen Daten. -- Asynchron arbeiten mit axios/ fetch - -**Übungen:** - -Übung 19 - ---- - -### Tag 44 - -**Inhalt:** - -- Aktualisierung von Node -- Testing in React -- Mocking mit async Data -- Weitere Techniken: Snapshot & Cypress - -**Übungen:** - -Übung 20 - ---- - -### Tag 45 - -**Inhalt:** - -- Typische Fehlermeldungen: Syntaxfehler, Referenzfehler, TypeError -- Einrichtung von TS, Testing -- Logische Fehler -- **Exkurs: Sass 7 on 1 Struktur** - -**Übungen:** -Projektarbeit - ---- - -## JS React Finalisierung - ---- - -### Tag 51 - -**Inhalt:** - -- Weitere Testsysteme (Cypress, Snapshot) -- Abschlussquiz JS Debug - - -**Übungen:** -Projektarbeiten - ---- - -### Tag 52 - -**Inhalt:** - -- Performanceoptimierung mit React -- Zusammenfassen der React Komponenten - -**Übungen:** -Projektarbeiten -Übungen 20, 22, 23 - - ---- - -### Tag 53 - -**Inhalt:** - -- Zusammenfassen der React Komponenten -- Finalisierung React SPA -- Abschlussquiz React - - -**Übungen:** -Projektarbeiten - ---- - -### Tag 54 - -**Inhalt:** - -- Erweiterung React mit useContext und useReducer -- Deployment -- Backend-API mit PHP MySQL - -**Übungen:** -Projektarbeiten - ---- - -### Tag 55 - -**Inhalt:** - -- Einführung in Next JS (Vibe Coding) -- Git Grundlagen -- Exkurse: Hostingpakete (Overview) -- Meetings/ Git - -**Übungen:** -Projektarbeiten -Git Übungen 1 - 9 \ No newline at end of file diff --git a/05_react/faq/formular.html b/05_react/faq/formular.html deleted file mode 100644 index 9a5ca2a..0000000 --- a/05_react/faq/formular.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - Formular - - - -
      -
      -

      Formular

      -
      -
      -
      -
      - - -
      -
      -
      -
      - - -
      -
      -
      -
      - - -
      -
      -
      -
      -
      -
      - - - diff --git a/05_react/linksammlung.md b/05_react/linksammlung.md deleted file mode 100644 index dcbbc50..0000000 --- a/05_react/linksammlung.md +++ /dev/null @@ -1,122 +0,0 @@ -# Linksammlung - -## Repo - -- - -## Allgemeine Links - -- [StackOverflow Survey 2023](https://survey.stackoverflow.co/2023) -- [StackOverflow Survey 2024](https://survey.stackoverflow.co/2024) -- [StackOverflow Survey 2025](https://survey.stackoverflow.co/2025) -- [State Of JS 2023](https://2023.stateofjs.com/en-US) -- [State Of JS 2024](https://2024.stateofjs.com/en-US) -- [State Of JS 2025](https://2025.stateofjs.com/en-US) -- [Bootstrap 5](https://getbootstrap.com/) -- [MDN - Mozilla Developer Network](https://developer.mozilla.org/) -- [JavaScript Historie](https://de.wikipedia.org/wiki/JavaScript) -- [Can I Use](https://caniuse.com/) -- [ASCII Table](https://asciitable.xyz/) -- [HTML Entities Liste (W3c)](https://dev.w3.org/html5/html-author/charref) -- [HTML Entities & Tastaturkürzel](https://www.key-shortcut.com/html-entities/alle-entitaeten) -- [What the f\*ck JS?](https://github.com/denysdovhan/wtfjs) -- [CSS BEM (Block-Element-Modifier)](https://getbem.com/introduction/) - -## Tools/ Software - -- [Microsoft Powertoys](https://learn.microsoft.com/fr-fr/windows/powertoys/install?tabs=gh%2Cextract-094) -- [Tipp10](https://online.tipp10.com/de/) -- [NVM - Node Version Manager](https://github.com/coreybutler/nvm-windows/releases/download/1.2.2/nvm-setup.zip) -- [Git - SCM](https://git-scm.com/) - -## Passwordmanager - -- [Enpass](https://www.enpass.io/pricing/) -- [1password](https://1password.com/de/pricing/password-manager) -- [KeepassXC](https://keepassxc.org/) -- [Safe in cloud](https://safe-in-cloud.com/) -- [BitWarden](https://bitwarden.com/de-de/) - - -## JS Tuts - -- [JS CheatSheet](https://dev.to/devsmitra/28-javascript-array-hacks-a-cheat-sheet-for-developer-5769) - -## CSS/SCSS Tuts - -- [CSS Reference](https://cssreference.io/) -- [CSS Tricks - Flexbox](https://css-tricks.com/snippets/css/a-guide-to-flexbox/) -- [CSS Flexboxfroggy](https://flexboxfroggy.com/#de) -- [CSS Gridgarden](https://cssgridgarden.com/#de) - -## JS Styleguide - -- [AirBnb Styleguide](https://github.com/airbnb/javascript) -- [Google](https://google.github.io/styleguide/jsguide.html) -- [jQuery Styleguide](https://contribute.jquery.org/style-guide/js/) -- [MDN (ES6) Styleguide](https://developer.mozilla.org/en-US/docs/MDN/Writing_guidelines/Writing_style_guide/Code_style_guide/JavaScript) - -## Fonts - -- [Hack Font](https://sourcefoundry.org/hack/) -- [Meslo Nerd Font](https://github.com/romkatv/powerlevel10k#fonts) -- [Google Fonts Download](https://gwfh.mranftl.com/fonts) -- [50 Best Google Fonts](https://www.pagecloud.com/blog/best-google-fonts-pairings) -- [200 best google Webfonts](https://www.awwwards.com/20-best-web-fonts-from-google-web-fonts-and-font-face.html) -- [Google Fonts](https://fonts.google.com/) -- [FontAwesome](https://fontawesome.com/icons?d=gallery) -- [FontSquirrl](https://www.fontsquirrel.com/) -- [Dafont](https://www.dafont.com/de/) - -## Bilder/ Vektoren - -- [Freepik](https://www.freepik.com/) -- [Flaticon](https://www.flaticon.com/) -- [Pexels](https://www.pexels.com/de-de/) -- [FavIcon Generator](https://realfavicongenerator.net/) -- [SVG Flaggen](https://hampusborgos.github.io/country-flags/) -- [Flagicons](https://flagicons.lipis.dev/) - -## Farben - -- [CSS Gradient](https://cssgradient.io/) -- [Color Adobe](https://color.adobe.com/de/create/color-wheel) -- [Color Adobe Explore](https://color.adobe.com/de/explore) - -## CSS/SCSS Tuts - -- [CSS Reference](https://cssreference.io/) -- [CSS Tricks - Flexbox](https://css-tricks.com/snippets/css/a-guide-to-flexbox/) -- [CSS Flexboxfroggy](https://flexboxfroggy.com/#de) -- [CSS Gridgarden](https://cssgridgarden.com/#de) -- [CSS Sticky Footer](https://css-tricks.com/couple-takes-sticky-footer/) -- [SASS Structure YT](https://www.youtube.com/watch?v=9Ld-aOKsEDk&t=47s) -- [SASS Structure Guidelines](https://sass-guidelin.es/#architecture) - -## Terminals - -- [iterm - Unix](https://iterm2.com/) - RECOMMENDED (WIN) -- [Ghostty - Unix](https://ghostty.org/) - NEW -- [Warp](https://www.warp.dev/) - NEW -- [Hyper.js](https://hyper.is/) -- [Windows Terminal](https://apps.microsoft.com/detail/9n0dx20hk701?icid=CNavAppsWindowsApps&hl=de-DE&gl=DE) - RECOMMENDED (WIN) -- [Git Bash](https://git-scm.com/) -- [Cmdr Terminal mit Bash](https://cmder.app/) - -## JS Plugins - -- [Floating UI](https://floating-ui.com/) - -## KI Tools - -- [AI Models](https://artificialanalysis.ai/models) - -## REST API - -- [Enable-Cors](https://enable-cors.org/) - CORS Settings für Server/Client - - -## React - -- [useHooks](https://usehooks.com/) -- [react-hook-form](https://react-hook-form.com/) \ No newline at end of file diff --git a/05_react/projects/js-react-product-configurator-template.zip b/05_react/projects/js-react-product-configurator-template.zip deleted file mode 100644 index 10b1eac..0000000 Binary files a/05_react/projects/js-react-product-configurator-template.zip and /dev/null differ diff --git a/05_react/projects/js-react-product-configurator-template/.gitignore b/05_react/projects/js-react-product-configurator-template/.gitignore deleted file mode 100644 index a547bf3..0000000 --- a/05_react/projects/js-react-product-configurator-template/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/05_react/projects/js-react-product-configurator-template/README.md b/05_react/projects/js-react-product-configurator-template/README.md deleted file mode 100644 index b8cf622..0000000 --- a/05_react/projects/js-react-product-configurator-template/README.md +++ /dev/null @@ -1,98 +0,0 @@ -# Task: Complete the product configurator - -In this task, you will complete a product configurator that allows users to create a customized product. The configurator consists of product types that users can select. Your task is to implement the missing parts of the configurator and ensure that the user interface works and displays correctly. Please find below detailed requirements for the implementation and extension of the product configurator. - -## Requirements for the product configurator: - -**General requirements** - -- Set up the project environment and install the necessary dependencies. -- Analyze the existing code and understand the structure and functionality of the product configurator. -- Implement the missing parts of the configurator and, if necessary, customize existing components to complete the functionality. - -**Step 1: Positioning and customization of components** - -- The `ProductInfo`-component is currently on the right side and should be displayed on the left side under the product image. - The `Summary`-component contains the selected configuration options in the form of a list. However, it seems that the styling of the `Summary`-component is not working. Make sure that the component is displayed correctly in the top left corner and that the styling is correct. -- One of the three accordion components is faulty and not displayed correctly. Make sure that all three accordion components are displayed correctly and contain the configuration options for the floor lamp. The `accordion`-components should all be closed at the beginning. - -**Step 2: Extending the configurator to include components for hanging lamps** - -- The tab selection should allow you to choose between »_floor lamp_« and »_pendant lamp_«. So far, the selection option for the pendant lamp has not yet been implemented. Add an additional tab selection for the pendant lamp. -- When the user selects »_pendant lamp_«, the configuration options for the pendant lamp should be displayed. The configuration options for the pendant lamp include: - - Number of planets: 1-3 - - Size of planets: normal, large - - Cable color: black (cotton), beige (cotton), white (cotton) - - Color of mounting base: black (lacquered), white (lacquered) -- When a type is selected, the component `ProductFloorLamp` and `ProductPendantLamp` should be exchanged accordingly. - -**Step 3: Customizing the State Object** - -- The `initialConfiguratorState`-state object currently contains only the floor lamp configuration options. Expand the `state` object to include the pendant lamp configuration options. As a result, the `state` object should contain two distinct sub-objects for the floor and pendant lamps, with the appropriate attributes. In addition, the state object should save the current selection of the product type and calculate the price based on the configuration options. - - **Example of the extended state object:** - - ```javascript - { - type: 'floor', - floor: { - amount: 1, - size: 'normal', - cableColor: 'black-cotton', - standColor: 'black-aluminum', - price: 20, - }, - pendant: { - amount: 1, - size: 'normal', - cableColor: 'black-cotton', - standColor: 'black-aluminum', - price: 60, - }, - } - ``` - - - The `configReducer`-function needs to be extended with the appropriate actions of the products. The actions for the lamps include `UPDATE_TYPE`, `UPDATE_SIZE`, `UPDATE_AMOUNT`, `UPDATE_STAND_COLOR`, and `UPDATE_CABLE_COLOR`. - - The `calculatePrice()` function from the `utils`-folder must be successfully implemented in the `configReducer.jsx` file and calculate the price based on the configuration options. - -**Step 4: Extending the summary** - -- The summary component must be expanded to correctly display the configuration options for the lamp selection. The summary should include the following information: -- Number of planets -- Size of planets -- Wire color -- Color of mounting base or floor lamp -- Price - -**Step 5: Product Preview and User Interface** - -- The ProductImage component currently only displays one image. Implement the ability to change the product images when the product type configuration is changed. The product images for the floor and hanging lamp should be displayed correctly. -- The product preview should also be updated correctly when the number of planets is selected. - The product preview display seems to be faulty. Make sure that the product preview is working correctly and that the configuration options for the floor and hanging lamps are displayed. - -**Step 6: Refactoring and Deployment** - -- The tab component for selecting the floor and hanging lamp can be optimized by moving the `Tab` component to a separate file. -- The `ProductFloorLamp` and `ProductPendantLamp` components should also be moved to separate files. -- The redundancy of the label objects `cableColorLabels` and `standColorLabels` should be eliminated by moving them to a separate file or providing them as a context. -- Remove unnecessary comments and console output. -- File and folder renaming may be performed to ensure a meaningful structure and readability -- Finally, run the build process and ensure that the application contains a `dist` folder with the compiled files. - -## License and terms of use - -© Web Professional Institute Inc. All rights reserved. - -This material is provided solely for students enrolled in courses offered by Web Professional Institute Inc. By accessing or using this code, you acknowledge that it is strictly for educational use within the context of Web Professional Institute Inc. programs. - -**Usage Restrictions:** - -- Redistribution, sharing, or copying of this material outside the course environment is strictly prohibited. -- The content is designed to support your learning objectives and is not authorized for commercial projects, public repositories, or applications beyond the course scope. -- Unauthorized commercial use or open-source distribution is strictly prohibited and may result in expulsion from the program and legal action. - -**Agreement & Rights:** - -As a student, you have agreed to these terms as part of your enrollment agreement, which includes additional details on permitted uses, restrictions, and policies. The author and Web Professional Institute Inc. retain all rights to this material, including the code base and instructional content. - -For any questions regarding these terms, please contact Web Professional Institute Inc. for clarification. diff --git a/05_react/projects/js-react-product-configurator-template/eslint.config.js b/05_react/projects/js-react-product-configurator-template/eslint.config.js deleted file mode 100644 index 238d2e4..0000000 --- a/05_react/projects/js-react-product-configurator-template/eslint.config.js +++ /dev/null @@ -1,38 +0,0 @@ -import js from '@eslint/js' -import globals from 'globals' -import react from 'eslint-plugin-react' -import reactHooks from 'eslint-plugin-react-hooks' -import reactRefresh from 'eslint-plugin-react-refresh' - -export default [ - { ignores: ['dist'] }, - { - files: ['**/*.{js,jsx}'], - languageOptions: { - ecmaVersion: 2020, - globals: globals.browser, - parserOptions: { - ecmaVersion: 'latest', - ecmaFeatures: { jsx: true }, - sourceType: 'module', - }, - }, - settings: { react: { version: '18.3' } }, - plugins: { - react, - 'react-hooks': reactHooks, - 'react-refresh': reactRefresh, - }, - rules: { - ...js.configs.recommended.rules, - ...react.configs.recommended.rules, - ...react.configs['jsx-runtime'].rules, - ...reactHooks.configs.recommended.rules, - 'react/jsx-no-target-blank': 'off', - 'react-refresh/only-export-components': [ - 'warn', - { allowConstantExport: true }, - ], - }, - }, -] diff --git a/05_react/projects/js-react-product-configurator-template/index.html b/05_react/projects/js-react-product-configurator-template/index.html deleted file mode 100644 index 0c589ec..0000000 --- a/05_react/projects/js-react-product-configurator-template/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - Vite + React - - -
      - - - diff --git a/05_react/projects/js-react-product-configurator-template/package-lock.json b/05_react/projects/js-react-product-configurator-template/package-lock.json deleted file mode 100644 index 33ab8de..0000000 --- a/05_react/projects/js-react-product-configurator-template/package-lock.json +++ /dev/null @@ -1,2859 +0,0 @@ -{ - "name": "react-spa", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "react-spa", - "version": "0.0.0", - "dependencies": { - "bootstrap": "^5.3.8", - "react": "^19.2.8", - "react-dom": "^19.2.8", - "react-icons": "^5.7.0", - "react-router-dom": "^7.18.2" - }, - "devDependencies": { - "@eslint/js": "^10.0.1", - "@types/react": "^19.2.18", - "@types/react-dom": "^19.2.5", - "@vitejs/plugin-react": "^6.1.0", - "eslint": "^10.9.1", - "eslint-plugin-react-hooks": "^7.1.1", - "eslint-plugin-react-refresh": "^0.5.5", - "globals": "^17.11.0", - "sass": "^1.103.1", - "vite": "^8.2.2" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", - "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.29.7", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", - "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", - "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-compilation-targets": "^7.29.7", - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helpers": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", - "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.8", - "@babel/types": "^7.29.8", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", - "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", - "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", - "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", - "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", - "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", - "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", - "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.8" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/template": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", - "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", - "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.8", - "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.8", - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.8", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", - "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", - "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.23.5", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", - "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^3.0.5", - "debug": "^4.3.1", - "minimatch": "^10.2.4" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", - "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^1.2.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/core": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", - "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/js": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", - "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "eslint": "^10.0.0" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/@eslint/object-schema": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", - "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", - "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^1.2.1", - "levn": "^0.4.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", - "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/types": "^0.15.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", - "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.2", - "@humanfs/types": "^0.15.0", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/types": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", - "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@oxc-project/types": { - "version": "0.147.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.147.0.tgz", - "integrity": "sha512-IJ3s6ltHLp45S0bh7phkX+gJO7A1Wuz2EaqpAhb8WjqDwbzMiWKHhyyT42tskaWjEYXtHtVCPpnBJVT9+dcRLg==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz", - "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.3", - "is-glob": "^4.0.3", - "node-addon-api": "^7.0.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.6.0", - "@parcel/watcher-darwin-arm64": "2.6.0", - "@parcel/watcher-darwin-x64": "2.6.0", - "@parcel/watcher-freebsd-x64": "2.6.0", - "@parcel/watcher-linux-arm-glibc": "2.6.0", - "@parcel/watcher-linux-arm-musl": "2.6.0", - "@parcel/watcher-linux-arm64-glibc": "2.6.0", - "@parcel/watcher-linux-arm64-musl": "2.6.0", - "@parcel/watcher-linux-x64-glibc": "2.6.0", - "@parcel/watcher-linux-x64-musl": "2.6.0", - "@parcel/watcher-win32-arm64": "2.6.0", - "@parcel/watcher-win32-x64": "2.6.0" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz", - "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz", - "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz", - "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz", - "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz", - "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz", - "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz", - "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz", - "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz", - "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz", - "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz", - "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz", - "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "license": "MIT", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@rolldown/binding-android-arm-eabi": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.6.tgz", - "integrity": "sha512-b+jTcARdTiFLI6jB4a5XjTm0RWd6KcRfQj/I2356fxUZemiho9zQLxo0RtCuMDAyKcLo6cEltkgbQp6d1+sjjQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.6.tgz", - "integrity": "sha512-lkWU8ZJaRk9q3CIEY1Tc7vIFALp3Xw5NfGJo2hQg5oIqNgxWi1zI+IiDEK3r70BF5Dzol1tcXsnzsRc8NLhG+Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.6.tgz", - "integrity": "sha512-dgR56NYnvAszm7Ob1B2/Vn0e8bUQYZH2UjVaMMtMVOCKFSfjhfLmuA/9+O+F+ajUdG6B/bSssrKW6JJYASa8jA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.6.tgz", - "integrity": "sha512-vpVxFvUCFioJqug7OTvqptkc4yb8UX0AwfDmJpaR/0sWz+BUmqSVAf7c8JkUgnN8YLspb4a/N6NhTyMAmdyQ7Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.6.tgz", - "integrity": "sha512-h1wG6Y6K3JlRswxsI64qQJqBAy4vrLuHgRbc8CZMGSWTOFRY6ghMApM1NKzB2I0n5xV1fjkE18SuVl2QpLeNpA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.6.tgz", - "integrity": "sha512-tbCiqub0q2MVWJKgF5PoAlNWCtQydiOYSLIkd8sByqK/6MMYLJRcSXSYodqYtd0O+Fw7QaVmKKlS4oL94YRZ0w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.6.tgz", - "integrity": "sha512-oxK9+baEBPhZG5HB4URY+uU04zJWeZlH6Tb9rB5DK4DF9XR1uXNLXt5Q5ZsugTKayNCNLhkcwz/ye74hRI98dg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.6.tgz", - "integrity": "sha512-muWCk27FVBEZtv0MsK8gnfSmgczA8KQ0uRVJbTABKhkRfQc38aUrcb7fhi3BNiyseFmgcRsoMfQsSNJ+DbZdSw==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.6.tgz", - "integrity": "sha512-eWDoSfU7Co2qj3vgB3Dt4lj1mG6CoWbcJQkRMP3XJplyCMtuaq3LHvPFjS9QIPvMGWVadJC04Xiy0IdcVPtnwQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.6.tgz", - "integrity": "sha512-2bWNjRSIayvupRKxXUY2tWG9fYdoUlTqWywHRvE8Eq3GvuQ+f2HeIkve697fIt+IQs/PV8yFsdWuhp1aJ1PdnA==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.6.tgz", - "integrity": "sha512-KekI0gS0wLxe1UBSQSjenBVwou/JkcQPDzBPICGZjxUv9k3RteHDPBQaiOicZUFKRIH2wKEimGwVpnJsbPzu7w==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.6.tgz", - "integrity": "sha512-TvtPnfVr+HtyGiDmPK4VWmlNm7QhNNAcK5Q9A7aOXsI8545yCyaoMaicXrFZ72JzeYjaUVk7yT243zT0jzjFKQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.6.tgz", - "integrity": "sha512-iOo0VEay2XFhaCcH0sps5XIimkSuOnNaZrf6+ZkoSOQBJPKNU48RkmJv0/lSpipexu5P+ouFgafe5IGr/DiQfg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.6.tgz", - "integrity": "sha512-y5NTmmasMS455JlOCO4ZM9krIchv3Mvm1crL1iUPGOPgEzSkves9n0SdC5Sjz6+qWDFhd8/JpfWMH8NSWNHe+A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.6.tgz", - "integrity": "sha512-np8iZSLfXlAD4kWhiyq/u0Yt8oZDtRQ8lGhQaCXo2rl37KNjeU0GjJuwr4P3oeZ++ROfofsKNBqR5LTO8aXyWQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/esrecurse": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", - "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.2.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", - "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.2.5", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.5.tgz", - "integrity": "sha512-fMPwH9v7r/pp43yUd2/Mbiex5KouJwwR3dzHkhLREUC6764VyDsqxhAxv6OFEYR1RhjOyD1naqba8ECDBe7ZQg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.1.0.tgz", - "integrity": "sha512-qd2BzUBehkov86WFhg0JkEFEYyCLG9uPCe6qWTY/kRlss9OvJrOF2UbIWT7p+8IzZHkEu0DNGHc4HSv+JdDLsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rolldown/pluginutils": "^1.0.1" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", - "babel-plugin-react-compiler": "^1.0.0", - "oxc-transform-react": "^0.145.0", - "vite": "^8.0.0" - }, - "peerDependenciesMeta": { - "@rolldown/plugin-babel": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true - }, - "oxc-transform-react": { - "optional": true - } - } - }, - "node_modules/acorn": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", - "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/baseline-browser-mapping": { - "version": "2.11.19", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.19.tgz", - "integrity": "sha512-Grytf1xOxOEMTGRwx6rLGKkTabd4vMg3VrKdj/7joCmV0qgh4QwMMO6xh34YEXQqirAuUdgQGa5orJQQ+69RBw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/bootstrap": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz", - "integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/twbs" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - } - ], - "license": "MIT", - "peerDependencies": { - "@popperjs/core": "^2.11.8" - } - }, - "node_modules/brace-expansion": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", - "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/browserslist": { - "version": "4.28.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", - "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.11.12", - "caniuse-lite": "^1.0.30001809", - "electron-to-chromium": "^1.5.402", - "node-releases": "^2.0.53", - "update-browserslist-db": "^1.3.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001810", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", - "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", - "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.415", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.415.tgz", - "integrity": "sha512-958V+Kbhtgz+SxXeEVKBjrlKRBIDAYvUJfwhjxMZ5S6ut9jAl7l9ZKBkBrvjyjZE36PabLUo2L8kEeV5O4vgJg==", - "dev": true, - "license": "ISC" - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.9.1.tgz", - "integrity": "sha512-9VaAkDURekixUQJy0oJYl2DcN6oKMfxay7XzaGYAWQwsb6qfKf+x76R2k1L8kb1boc+FyCAaTA9GmiKaaiaF+A==", - "dev": true, - "license": "MIT", - "workspaces": [ - "packages/*" - ], - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.2", - "@eslint/config-array": "^0.23.5", - "@eslint/config-helpers": "^0.7.0", - "@eslint/core": "^1.2.1", - "@eslint/plugin-kit": "^0.7.2", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.14.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^9.1.2", - "eslint-visitor-keys": "^5.0.1", - "espree": "^11.2.0", - "esquery": "^1.7.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "minimatch": "^10.2.5", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", - "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.24.4", - "@babel/parser": "^7.24.4", - "hermes-parser": "^0.25.1", - "zod": "^3.25.0 || ^4.0.0", - "zod-validation-error": "^3.5.0 || ^4.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" - } - }, - "node_modules/eslint-plugin-react-refresh": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.5.tgz", - "integrity": "sha512-vG7yLURXNvCHy0FBdbZRwIu0BLPJMlUUJS2Ep7ud9w1YCLftFZtuEjyjhym0Qq9yuZ6LJUitNlu/hMk0gakXAw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "eslint": "^9 || ^10" - } - }, - "node_modules/eslint-scope": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", - "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@types/esrecurse": "^4.3.1", - "@types/estree": "^1.0.8", - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", - "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.16.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^5.0.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", - "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "17.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-17.11.0.tgz", - "integrity": "sha512-Z2I8hM+PbJDXQDq3Icgpzv+mPdwr68iZUU9d5WW4FuXfDUQfkZaZuvjMv42/5crNyw154+9+VWXbYrUgDXbxNw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hermes-estree": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", - "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", - "dev": true, - "license": "MIT" - }, - "node_modules/hermes-parser": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", - "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "hermes-estree": "0.25.1" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/immutable": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", - "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", - "dev": true, - "license": "MIT" - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lightningcss": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", - "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.33.0", - "lightningcss-darwin-arm64": "1.33.0", - "lightningcss-darwin-x64": "1.33.0", - "lightningcss-freebsd-x64": "1.33.0", - "lightningcss-linux-arm-gnueabihf": "1.33.0", - "lightningcss-linux-arm64-gnu": "1.33.0", - "lightningcss-linux-arm64-musl": "1.33.0", - "lightningcss-linux-x64-gnu": "1.33.0", - "lightningcss-linux-x64-musl": "1.33.0", - "lightningcss-win32-arm64-msvc": "1.33.0", - "lightningcss-win32-x64-msvc": "1.33.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", - "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", - "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", - "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", - "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", - "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", - "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", - "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", - "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", - "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", - "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", - "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/minimatch": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", - "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.8" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.18", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", - "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/node-releases": { - "version": "2.0.53", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", - "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", - "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", - "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.17", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/react": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", - "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", - "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.8" - } - }, - "node_modules/react-icons": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.7.0.tgz", - "integrity": "sha512-LBLy340Rzqy6+/yVhZKT3B/QpP1BZaesGqasf09HPOBzRarcDIFH0WwXlXQfE7q7ipxK4MSiC5DIBWURCny6fw==", - "license": "MIT", - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-router": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.2.tgz", - "integrity": "sha512-aUVMjFm3GAPTTZL7oYr5E7ETiqfQCHRLH+B+5afnICvf0r7kkK4eR6SMuwbSTJw/7t+12khT/Kahij49fqOCIg==", - "license": "MIT", - "dependencies": { - "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/react-router-dom": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.2.tgz", - "integrity": "sha512-AIKJ/jgGlFb3EbfCXk5Gzshiwt+l3mqbCrNjmEWMMjqQxNJ3svBa6bgzFyCC2Sw3RA0VWF1kg3uQf2OFhxb8hw==", - "license": "MIT", - "dependencies": { - "react-router": "7.18.2" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - } - }, - "node_modules/readdirp": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", - "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/rolldown": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.6.tgz", - "integrity": "sha512-vMM4q3aixf46GiF1Kok8jDPFsEpXgFWGjUHXNkNHNm+Y2adXAG2dbX91jkti3i0ZRsOlcmbuzAz1poObSHCmUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "=0.147.0", - "@rolldown/pluginutils": "^1.0.0" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm-eabi": "1.2.6", - "@rolldown/binding-android-arm64": "1.2.6", - "@rolldown/binding-darwin-arm64": "1.2.6", - "@rolldown/binding-darwin-x64": "1.2.6", - "@rolldown/binding-freebsd-x64": "1.2.6", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.6", - "@rolldown/binding-linux-arm64-gnu": "1.2.6", - "@rolldown/binding-linux-arm64-musl": "1.2.6", - "@rolldown/binding-linux-ppc64-gnu": "1.2.6", - "@rolldown/binding-linux-s390x-gnu": "1.2.6", - "@rolldown/binding-linux-x64-gnu": "1.2.6", - "@rolldown/binding-linux-x64-musl": "1.2.6", - "@rolldown/binding-openharmony-arm64": "1.2.6", - "@rolldown/binding-win32-arm64-msvc": "1.2.6", - "@rolldown/binding-win32-x64-msvc": "1.2.6" - } - }, - "node_modules/sass": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.103.1.tgz", - "integrity": "sha512-9icZURbP51S6S0QGoyaeqk9uB06GNWxsFYWfH5RgpFgqK5FA8tJcM3AdVxrZEVJ7dz+L87nG95gBKf4VuaMHGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^5.0.0", - "immutable": "^5.1.5", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=20.19.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" - } - }, - "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/set-cookie-parser": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", - "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", - "license": "MIT" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz", - "integrity": "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/vite": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", - "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "lightningcss": "^1.33.0", - "picomatch": "^4.0.5", - "postcss": "^8.5.26", - "rolldown": "~1.2.4", - "tinyglobby": "^0.2.17" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.4.0 || ^0.5.0", - "esbuild": "^0.27.0 || ^0.28.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", - "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-validation-error": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", - "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "zod": "^3.25.0 || ^4.0.0" - } - } - } -} diff --git a/05_react/projects/js-react-product-configurator-template/package.json b/05_react/projects/js-react-product-configurator-template/package.json deleted file mode 100644 index 0d07a69..0000000 --- a/05_react/projects/js-react-product-configurator-template/package.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "react-spa", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "lint": "eslint .", - "preview": "vite preview" - }, - "dependencies": { - "bootstrap": "^5.3.8", - "react": "^19.2.8", - "react-dom": "^19.2.8", - "react-icons": "^5.7.0", - "react-router-dom": "^7.18.2" - }, - "devDependencies": { - "@eslint/js": "^10.0.1", - "@types/react": "^19.2.18", - "@types/react-dom": "^19.2.5", - "@vitejs/plugin-react": "^6.1.0", - "eslint": "^10.9.1", - "eslint-plugin-react-hooks": "^7.1.1", - "eslint-plugin-react-refresh": "^0.5.5", - "globals": "^17.11.0", - "sass": "^1.103.1", - "vite": "^8.2.2" - } -} diff --git a/05_react/projects/js-react-product-configurator-template/public/img/configurator/product-floor-lamp-1.png b/05_react/projects/js-react-product-configurator-template/public/img/configurator/product-floor-lamp-1.png deleted file mode 100644 index 79f414d..0000000 Binary files a/05_react/projects/js-react-product-configurator-template/public/img/configurator/product-floor-lamp-1.png and /dev/null differ diff --git a/05_react/projects/js-react-product-configurator-template/public/img/configurator/product-pendant-lamp-1.png b/05_react/projects/js-react-product-configurator-template/public/img/configurator/product-pendant-lamp-1.png deleted file mode 100644 index 7a8c844..0000000 Binary files a/05_react/projects/js-react-product-configurator-template/public/img/configurator/product-pendant-lamp-1.png and /dev/null differ diff --git a/05_react/projects/js-react-product-configurator-template/public/img/configurator/product-pendant-lamp-2.png b/05_react/projects/js-react-product-configurator-template/public/img/configurator/product-pendant-lamp-2.png deleted file mode 100644 index a2558b9..0000000 Binary files a/05_react/projects/js-react-product-configurator-template/public/img/configurator/product-pendant-lamp-2.png and /dev/null differ diff --git a/05_react/projects/js-react-product-configurator-template/public/img/configurator/product-pendant-lamp-3.png b/05_react/projects/js-react-product-configurator-template/public/img/configurator/product-pendant-lamp-3.png deleted file mode 100644 index 6ae0841..0000000 Binary files a/05_react/projects/js-react-product-configurator-template/public/img/configurator/product-pendant-lamp-3.png and /dev/null differ diff --git a/05_react/projects/js-react-product-configurator-template/public/img/header-bg-1.jpg b/05_react/projects/js-react-product-configurator-template/public/img/header-bg-1.jpg deleted file mode 100644 index 3046319..0000000 Binary files a/05_react/projects/js-react-product-configurator-template/public/img/header-bg-1.jpg and /dev/null differ diff --git a/05_react/projects/js-react-product-configurator-template/public/img/header-bg.jpg b/05_react/projects/js-react-product-configurator-template/public/img/header-bg.jpg deleted file mode 100644 index 7113677..0000000 Binary files a/05_react/projects/js-react-product-configurator-template/public/img/header-bg.jpg and /dev/null differ diff --git a/05_react/projects/js-react-product-configurator-template/public/logo-react.min.svg b/05_react/projects/js-react-product-configurator-template/public/logo-react.min.svg deleted file mode 100644 index fff0b61..0000000 --- a/05_react/projects/js-react-product-configurator-template/public/logo-react.min.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/05_react/projects/js-react-product-configurator-template/public/vite.svg b/05_react/projects/js-react-product-configurator-template/public/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/05_react/projects/js-react-product-configurator-template/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/05_react/projects/js-react-product-configurator-template/src/App.jsx b/05_react/projects/js-react-product-configurator-template/src/App.jsx deleted file mode 100644 index b56ac03..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/App.jsx +++ /dev/null @@ -1,24 +0,0 @@ -import HeaderMain from './components/headers/HeaderMain'; -import FooterMain from './components/footers/FooterMain'; -import NavMain from './components/navs/NavMain'; -import Router from './routes/Router'; - -import { useLocation } from 'react-router-dom'; - -function App() { - const location = useLocation(); - return ( - <> - {location.pathname !== '/configurator' && } - - -
      - -
      - - - - ); -} - -export default App; diff --git a/05_react/projects/js-react-product-configurator-template/src/assets/img/logo-react.min.svg b/05_react/projects/js-react-product-configurator-template/src/assets/img/logo-react.min.svg deleted file mode 100644 index 5fb5f94..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/assets/img/logo-react.min.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/05_react/projects/js-react-product-configurator-template/src/assets/img/logo-react.svg b/05_react/projects/js-react-product-configurator-template/src/assets/img/logo-react.svg deleted file mode 100644 index 08c4248..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/assets/img/logo-react.svg +++ /dev/null @@ -1,1923 +0,0 @@ - - \ No newline at end of file diff --git a/05_react/projects/js-react-product-configurator-template/src/assets/react.svg b/05_react/projects/js-react-product-configurator-template/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/05_react/projects/js-react-product-configurator-template/src/components/configurator/ButtonAddToCart.jsx b/05_react/projects/js-react-product-configurator-template/src/components/configurator/ButtonAddToCart.jsx deleted file mode 100644 index caa6ebe..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/components/configurator/ButtonAddToCart.jsx +++ /dev/null @@ -1,10 +0,0 @@ -// ButtonAddToCart.jsx -const ButtonAddToCart = () => { - return ( - - ); -}; - -export default ButtonAddToCart; diff --git a/05_react/projects/js-react-product-configurator-template/src/components/configurator/Configurator.jsx b/05_react/projects/js-react-product-configurator-template/src/components/configurator/Configurator.jsx deleted file mode 100644 index 97fc558..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/components/configurator/Configurator.jsx +++ /dev/null @@ -1,87 +0,0 @@ -import { useReducer } from 'react'; -import { createContext } from 'react'; -import ProductFloorLamp from './ProductFloorLamp'; -// import ProductPendantLamp from './ProductPendantLamp'; -import configReducer from './configReducer'; -import { initialConfiguratorState } from './state'; -import ProductImage from './ProductImage'; -import ProductInfo from './ProductInfo'; -import Summary from './Summary'; -import ButtonAddToCart from './ButtonAddToCart'; - -export const ConfigContext = createContext(); - -// Configurator.jsx -const Configurator = () => { - const [config, dispatch] = useReducer(configReducer, initialConfiguratorState); - - console.log(config); - - return ( - - {/* Stelle den Context bereit */} -
      -
      - -
      -
      - - -
      -
        -
      • - -
      • - {/*
      • - -
      • */} -
      -
      -
      - -
      - {/*
      - -
      */} -
      - {/* ... */} -
      - - -
      -
      -
      - ); -}; - -export default Configurator; diff --git a/05_react/projects/js-react-product-configurator-template/src/components/configurator/ProductFloorLamp.jsx b/05_react/projects/js-react-product-configurator-template/src/components/configurator/ProductFloorLamp.jsx deleted file mode 100644 index 4115bab..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/components/configurator/ProductFloorLamp.jsx +++ /dev/null @@ -1,258 +0,0 @@ -import { useContext } from 'react'; -import { ConfigContext } from './Configurator'; - -const ProductFloorLamp = (props) => { - const { config, dispatch } = useContext(ConfigContext); - - const cableColorLabels = { - 'black-cotton': 'Black (cotton)', - 'beige-cotton': 'Beige (cotton)', - 'white-cotton': 'White (cotton)', - }; - - const lampstandColorLabels = { - 'black-aluminum': 'Black (aluminum)', - 'white-aluminum': 'White (aluminum)', - }; - - const handleChangeAmount = (event) => { - dispatch({ - type: 'UPDATE_AMOUNT', - payload: parseInt(event.target.value, 10), - }); - }; - - const handleChangeSize = (event) => { - dispatch({ type: 'UPDATE_SIZE', payload: event.target.value }); - }; - - const handleChangeCableColor = (event) => { - dispatch({ type: 'UPDATE_CABLE_COLOR', payload: event.target.value }); - }; - - const handleChangeLampstandColor = (event) => { - dispatch({ type: 'UPDATE_LAMPSTAND_COLOR', payload: event.target.value }); - }; - - return ( - <> -

      Floor Lamp

      - -
      - {/* Amount & size */} -
      -

      - -

      -
      -
      -

      Choose Amount

      -
      - - -
      - -

      Choose the size:

      -
      - - - - - -
      -
      -
      -
      - {/* Material & Color: Cable */} -
      -

      - -

      -
      -
      -

      Material & Color: Cable

      -
      - - - - - - -
      -
      -
      -
      - {/* Material & Color: Lampstand */} -
      -

      - -

      -
      -
      -

      Material & Color: Lampstand

      -
      - - - - -
      -
      -
      -
      -
      - - ); -}; -export default ProductFloorLamp; diff --git a/05_react/projects/js-react-product-configurator-template/src/components/configurator/ProductImage.jsx b/05_react/projects/js-react-product-configurator-template/src/components/configurator/ProductImage.jsx deleted file mode 100644 index a1a9c12..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/components/configurator/ProductImage.jsx +++ /dev/null @@ -1,12 +0,0 @@ -// ProductImage.jsx -const ProductImage = () => { - return ( - Product Name - ); -}; - -export default ProductImage; diff --git a/05_react/projects/js-react-product-configurator-template/src/components/configurator/ProductInfo.jsx b/05_react/projects/js-react-product-configurator-template/src/components/configurator/ProductInfo.jsx deleted file mode 100644 index a7f2126..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/components/configurator/ProductInfo.jsx +++ /dev/null @@ -1,22 +0,0 @@ -// ProductInfo.jsx -const ProductInfo = () => { - return ( -
      -

      Polygon Lamp

      -
      - {/* Stars for the rating */} - - - - - - 5.0 -
      -

      Customize your lamp

      - {/* Further product information */} - {/* ... */} -
      - ); -}; - -export default ProductInfo; diff --git a/05_react/projects/js-react-product-configurator-template/src/components/configurator/ProductPendantLamp.jsx b/05_react/projects/js-react-product-configurator-template/src/components/configurator/ProductPendantLamp.jsx deleted file mode 100644 index d15aa7e..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/components/configurator/ProductPendantLamp.jsx +++ /dev/null @@ -1,6 +0,0 @@ -const ProductPendantLamp = (props) => { - // const { } = props; - - return

      Pendant Lamp

      ; -}; -export default ProductPendantLamp; diff --git a/05_react/projects/js-react-product-configurator-template/src/components/configurator/Summary.jsx b/05_react/projects/js-react-product-configurator-template/src/components/configurator/Summary.jsx deleted file mode 100644 index 7d5cbd4..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/components/configurator/Summary.jsx +++ /dev/null @@ -1,35 +0,0 @@ -// Summary.jsx -import { useContext } from 'react'; -import { ConfigContext } from './Configurator'; - -const Summary = () => { - const { config } = useContext(ConfigContext); - const cableColorLabels = { - 'black-cotton': 'Black (cotton)', - 'beige-cotton': 'Beige (cotton)', - 'white-cotton': 'White (cotton)', - }; - - const lampstandColorLabels = { - 'black-aluminum': 'Black (aluminum)', - 'white-aluminum': 'White (aluminum)', - }; - - console.log(config); - return ( -
      -

      Your selection

      -
        -
      • - Amount & size: {config.amount} Planet ({config.size}) -
      • -
      • Material & color cable: {cableColorLabels[config.cableColor]}
      • - - {/* ... further selected options... */} -
      - {/* ... */} -
      - ); -}; - -export default Summary; diff --git a/05_react/projects/js-react-product-configurator-template/src/components/configurator/configReducer.js b/05_react/projects/js-react-product-configurator-template/src/components/configurator/configReducer.js deleted file mode 100644 index 8f736ff..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/components/configurator/configReducer.js +++ /dev/null @@ -1,20 +0,0 @@ -// configReducer.js -import { initialConfiguratorState } from './state'; - -const configReducer = (state = initialConfiguratorState, action) => { - switch (action.type) { - case 'UPDATE_AMOUNT': - return { ...state, amount: action.payload }; - case 'UPDATE_SIZE': - console.log('UPDATE_SIZE', action.payload); - return { ...state, size: action.payload }; - case 'UPDATE_CABLE_COLOR': - return { ...state, cableColor: action.payload }; - case 'UPDATE_LAMPSTAND_COLOR': - return { ...state, lampstandColor: action.payload }; - default: - return state; - } -}; - -export default configReducer; diff --git a/05_react/projects/js-react-product-configurator-template/src/components/configurator/state.js b/05_react/projects/js-react-product-configurator-template/src/components/configurator/state.js deleted file mode 100644 index 9e43d35..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/components/configurator/state.js +++ /dev/null @@ -1,9 +0,0 @@ -// state.js -export const initialConfiguratorState = { - amount: 1, - size: 'normal', - cableColor: 'black-cotton', - lampstandColor: 'black-aluminum', -}; - -// ... further initial states for other areas of application ... diff --git a/05_react/projects/js-react-product-configurator-template/src/components/footers/FooterMain.jsx b/05_react/projects/js-react-product-configurator-template/src/components/footers/FooterMain.jsx deleted file mode 100644 index c84f337..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/components/footers/FooterMain.jsx +++ /dev/null @@ -1,16 +0,0 @@ -const FooterMain = (props) => { - // const { } = props; - - return ( -
      -
      -
      -
      -
      -
      -
      -
      -
      - ); -}; -export default FooterMain; diff --git a/05_react/projects/js-react-product-configurator-template/src/components/headers/HeaderMain.jsx b/05_react/projects/js-react-product-configurator-template/src/components/headers/HeaderMain.jsx deleted file mode 100644 index 39da699..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/components/headers/HeaderMain.jsx +++ /dev/null @@ -1,14 +0,0 @@ -import LogoMain from '../logos/LogoMain'; - -const HeaderMain = (props) => { - // const { } = props; - - return ( -
      -
      - -
      -
      - ); -}; -export default HeaderMain; diff --git a/05_react/projects/js-react-product-configurator-template/src/components/logos/LogoMain.jsx b/05_react/projects/js-react-product-configurator-template/src/components/logos/LogoMain.jsx deleted file mode 100644 index e33f1d3..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/components/logos/LogoMain.jsx +++ /dev/null @@ -1,12 +0,0 @@ -import Logo from '../../assets/img/logo-react.min.svg'; - -const LogoMain = (props) => { - // const { } = props; - - return ( -
      - React -
      - ); -}; -export default LogoMain; diff --git a/05_react/projects/js-react-product-configurator-template/src/components/navs/NavMain.jsx b/05_react/projects/js-react-product-configurator-template/src/components/navs/NavMain.jsx deleted file mode 100644 index e1f4dc0..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/components/navs/NavMain.jsx +++ /dev/null @@ -1,30 +0,0 @@ -import { NavLink } from 'react-router-dom'; - -const NavMain = () => { - return ( - - ); -}; - -export default NavMain; diff --git a/05_react/projects/js-react-product-configurator-template/src/main.jsx b/05_react/projects/js-react-product-configurator-template/src/main.jsx deleted file mode 100644 index a968c8a..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/main.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import { BrowserRouter } from 'react-router-dom'; -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; - -import App from './App.jsx'; -import './styles/main.scss'; -import 'bootstrap/dist/js/bootstrap.bundle.min'; - -createRoot(document.getElementById('root')).render( - - - -); diff --git a/05_react/projects/js-react-product-configurator-template/src/pages/ConfiguratorPage.jsx b/05_react/projects/js-react-product-configurator-template/src/pages/ConfiguratorPage.jsx deleted file mode 100644 index 25bac2f..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/pages/ConfiguratorPage.jsx +++ /dev/null @@ -1,12 +0,0 @@ -// ConfiguratorPage.jsx -import Configurator from '../components/configurator/Configurator'; - -const ConfiguratorPage = () => { - return ( -
      - -
      - ); -}; - -export default ConfiguratorPage; diff --git a/05_react/projects/js-react-product-configurator-template/src/pages/HomePage.jsx b/05_react/projects/js-react-product-configurator-template/src/pages/HomePage.jsx deleted file mode 100644 index 77d6c22..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/pages/HomePage.jsx +++ /dev/null @@ -1,13 +0,0 @@ -const HomePage = () => { - return ( -
      -

      Hello, Spa!

      -

      - Welcome to the Single-Page-Application (SPA) with React. This is the - Home page. -

      -
      - ); -}; - -export default HomePage; diff --git a/05_react/projects/js-react-product-configurator-template/src/routes/Router.jsx b/05_react/projects/js-react-product-configurator-template/src/routes/Router.jsx deleted file mode 100644 index b7fe51d..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/routes/Router.jsx +++ /dev/null @@ -1,14 +0,0 @@ -import { Routes, Route } from 'react-router-dom'; -import HomePage from '../pages/HomePage'; -import ConfiguratorPage from '../pages/ConfiguratorPage'; - -const Router = () => { - return ( - - } /> - } /> - - ); -}; - -export default Router; diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/abstracts/_colors.scss b/05_react/projects/js-react-product-configurator-template/src/styles/abstracts/_colors.scss deleted file mode 100644 index 692b829..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/abstracts/_colors.scss +++ /dev/null @@ -1,9 +0,0 @@ -/* Color Theme Swatches in Hex */ -$color-1: #3d5b81; -$color-2: #9bc0d9; -$color-3: #dffbfc; -$color-4: #ee6b4d; -$color-5: #293241; - -$color-orange: $color-4; -$color-blue: $color-1; diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/abstracts/_index.scss b/05_react/projects/js-react-product-configurator-template/src/styles/abstracts/_index.scss deleted file mode 100644 index 2201c9a..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/abstracts/_index.scss +++ /dev/null @@ -1,3 +0,0 @@ -@forward 'colors'; -@forward 'typography'; -@forward 'variables'; diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/abstracts/_typography.scss b/05_react/projects/js-react-product-configurator-template/src/styles/abstracts/_typography.scss deleted file mode 100644 index a49a636..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/abstracts/_typography.scss +++ /dev/null @@ -1,7 +0,0 @@ -$font-family-headline: 'Merriweather', Georgia, 'Times New Roman', Times, serif; -$font-family-subclaim: $font-family-headline; - -$font-family-copy: 'Open Sans', Verdana, Geneva, Tahoma, sans-serif; -$font-family-quote: 'Open Sans', Verdana, Geneva, Tahoma, sans-serif; -$font-family-menu: 'Open Sans', Verdana, Geneva, Tahoma, sans-serif; -$font-family-code: 'Courier New', Courier, monospace; diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/abstracts/_variables.scss b/05_react/projects/js-react-product-configurator-template/src/styles/abstracts/_variables.scss deleted file mode 100644 index e69de29..0000000 diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/base/_index.scss b/05_react/projects/js-react-product-configurator-template/src/styles/base/_index.scss deleted file mode 100644 index 26fa81a..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/base/_index.scss +++ /dev/null @@ -1,2 +0,0 @@ -@forward 'theme'; -@forward 'utils'; diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/base/_theme.scss b/05_react/projects/js-react-product-configurator-template/src/styles/base/_theme.scss deleted file mode 100644 index 20a053a..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/base/_theme.scss +++ /dev/null @@ -1,134 +0,0 @@ -@use '../abstracts/' as *; -*, -html { - box-sizing: border-box; -} - -html, -body, -#root { - height: 100%; -} - -body { - background-color: #fff; - font-family: $font-family-copy; -} - -// STICKY FOOTER ==== -// https://css-tricks.com/couple-takes-sticky-footer/ -body, -#root { - display: flex; - flex-direction: column; -} - -main { - flex: 1 0 auto; -} - -body > footer, -.footer-main { - flex-shrink: 0; -} -// ================= - -h1, -h2, -h3, -h4, -h5, -h6 { - font-family: $font-family-headline; - font-weight: 700; -} - -h1 { - color: #2a2a2a; - padding: 2rem 0; - margin: 1rem 0 3rem; - border-bottom: 10px solid #efefef; -} - -h2, -h3 { - font-weight: 500; - letter-spacing: 0; - line-height: 1.5em; - padding: 1rem 0; - position: relative; -} - -h2 { - font-size: 1.75rem; -} - -h3 { - font-size: 1.25rem; -} - -/* buttons */ - -.button { - border: none; - background-color: transparent; - padding: 0.5rem; - transform: scale(1); - transition: background-color, color, transform 0.4s ease-out; -} - -.button-delete { - visibility: hidden; - width: 2rem; - position: relative; - - &:hover, - &:focus { - color: #c00; - } - - &::before { - content: '\f057'; - visibility: visible; - font-family: 'Font Awesome 6 Free'; - font-weight: 900; - font-size: 1.5rem; - line-height: 1.5; - height: 100%; - } -} - -.button-add { - background-color: $color-4; - color: white; - border-radius: 1rem; - padding: 0.5rem 1rem; - &:hover, - &:focus { - transform: scale(1.05); - background-color: darken($color-4, 20%); - } -} -.button-clean { - background-color: $color-5; - color: white; - border-radius: 1rem; - padding: 0.5rem 1rem; - &:hover, - &:focus { - transform: scale(1.05); - background-color: darken($color-5, 20%); - } -} - -.button-save { - background-color: $color-1; - color: white; - border-radius: 1rem; - padding: 0.5rem 1rem; - &:hover, - &:focus { - transform: scale(1.05); - background-color: darken($color-1, 20%); - } -} diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/base/_utils.scss b/05_react/projects/js-react-product-configurator-template/src/styles/base/_utils.scss deleted file mode 100644 index 363cd9e..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/base/_utils.scss +++ /dev/null @@ -1,30 +0,0 @@ -// Shadow Effects ========================== -// https://codepen.io/sdthornton/pen/wBZdXq -.drop-shadow-curved { - position: relative; - float: left; - width: 40%; - padding: 1em; - margin: 2em 10px 4em; - background: #fff; - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3), 0 0 40px rgba(0, 0, 0, 0.1) inset; - - &:before, - &:after { - content: ''; - width: 3px; - position: absolute; - z-index: -1; - - top: 10px; - bottom: 10px; - box-shadow: 0 0 15px rgba(0, 0, 0, 0.6); - border-radius: 10px / 100px; - } - &:before { - left: 0; - } - &:after { - right: 0; - } -} diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/components/_footer-main.scss b/05_react/projects/js-react-product-configurator-template/src/styles/components/_footer-main.scss deleted file mode 100644 index ac893f1..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/components/_footer-main.scss +++ /dev/null @@ -1,18 +0,0 @@ -@use '../abstracts/' as *; - -.m-footer-main { - padding: 2rem 0; - background-color: $color-5; - color: white; - - a { - color: white; - } - - // for mobile view - padding: 2rem 2rem; - // for desktop view - @media (min-width: 768px) { - padding: 2rem 0; - } -} diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/components/_header-main.scss b/05_react/projects/js-react-product-configurator-template/src/styles/components/_header-main.scss deleted file mode 100644 index 7f57d9e..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/components/_header-main.scss +++ /dev/null @@ -1,36 +0,0 @@ -.m-header-main { - display: flex; - position: relative; - justify-content: center; - align-items: center; - height: 400px; - max-height: 400px; - - background-image: url('/img/header-bg.jpg'); - background-position: center; - background-repeat: no-repeat; - background-origin: border-box; - background-size: cover; - - .content-box { - position: absolute; - z-index: 2; - } - - // radial gradient overlay - &::after { - content: ''; - position: absolute; - z-index: 1; - left: 0; - top: 0; - width: 100%; - height: 100%; - - background: radial-gradient( - circle, - rgba(0, 0, 0, 0) 0%, - rgba(0, 0, 0, 0.7) 100% - ); - } -} diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/components/_index.scss b/05_react/projects/js-react-product-configurator-template/src/styles/components/_index.scss deleted file mode 100644 index cb43ed6..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/components/_index.scss +++ /dev/null @@ -1,4 +0,0 @@ -@forward 'footer-main'; -@forward 'header-main'; -@forward 'logo-main'; -@forward 'product-info'; diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/components/_logo-main.scss b/05_react/projects/js-react-product-configurator-template/src/styles/components/_logo-main.scss deleted file mode 100644 index bd3bd09..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/components/_logo-main.scss +++ /dev/null @@ -1,8 +0,0 @@ -.m-logo-main { - width: 320px; - img, - svg { - width: 100%; - height: auto; - } -} diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/components/_product-accordeon.scss b/05_react/projects/js-react-product-configurator-template/src/styles/components/_product-accordeon.scss deleted file mode 100644 index 5139ee3..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/components/_product-accordeon.scss +++ /dev/null @@ -1,20 +0,0 @@ -.m-product-accordion { - .accordion-button { - > span { - font-size: 1.1rem; - font-weight: 700; - line-height: 1.1; - span { - font-size: 0.9rem; - color: #ccc; - } - } - &:focus { - box-shadow: none; - } - } - .accordion-button:not(.collapsed) { - background-color: #f8f9fa; - border-color: #f8f9fa; - } -} diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/components/_product-image.scss b/05_react/projects/js-react-product-configurator-template/src/styles/components/_product-image.scss deleted file mode 100644 index 48c24a0..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/components/_product-image.scss +++ /dev/null @@ -1,20 +0,0 @@ -.m-product-image { - // radial gradient overlay - position: relative; - &::after { - content: ''; - position: absolute; - z-index: -1; - left: 0; - top: 0; - width: 100%; - height: 100%; - - background: rgb(215, 215, 215); - background: linear-gradient( - 320deg, - rgba(235, 235, 235, 1) 0%, - rgba(255, 255, 255, 1) 100% - ); - } -} diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/components/_product-info.scss b/05_react/projects/js-react-product-configurator-template/src/styles/components/_product-info.scss deleted file mode 100644 index d016457..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/components/_product-info.scss +++ /dev/null @@ -1,7 +0,0 @@ -@use '../abstracts' as *; - -.m-product-info { - .star { - color: $color-4; - } -} diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/components/_product-manager.scss b/05_react/projects/js-react-product-configurator-template/src/styles/components/_product-manager.scss deleted file mode 100644 index ec452c8..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/components/_product-manager.scss +++ /dev/null @@ -1,15 +0,0 @@ -.m-product-manager { - table tr .td-price, - table tr .th-price, - table tr .th-actions { - text-align: right; - } - - table tr .td-actions { - width: 180px; - text-align: right; - button { - margin: 0 3px; - } - } -} diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/components/_summary.scss b/05_react/projects/js-react-product-configurator-template/src/styles/components/_summary.scss deleted file mode 100644 index f03aee0..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/components/_summary.scss +++ /dev/null @@ -1,38 +0,0 @@ -@use '../abstracts' as *; - -.m-summary { - border-radius: 12px; - - h3 { - font-size: 1.25rem; - margin-bottom: 0; - color: $color-4; - } - - // for mobile view - left: inherit; - position: relative; - - background-color: transparent; - // for desktop view - @media (min-width: 768px) { - position: absolute; - left: 2rem; - padding: 1rem; - background-color: rgba(#000, 0.025); - backdrop-filter: blur(10px); - } - - .list { - list-style-type: none; - padding: 0; - li { - line-height: 2; - border-bottom: 1px solid #ccc; - font-size: 0.9rem; - &:last-child { - border-bottom: none; - } - } - } -} diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/fonts/_index.scss b/05_react/projects/js-react-product-configurator-template/src/styles/fonts/_index.scss deleted file mode 100644 index 3cc034a..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/fonts/_index.scss +++ /dev/null @@ -1,4 +0,0 @@ -// @forward 'source-sans-pro-v21-latin'; -@forward 'merriweather-v30-latin'; -@forward 'open-sans-v40-latin'; -// @forward 'source-sans-pro-v21-latin'; diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/fonts/_merriweather-v30-latin.scss b/05_react/projects/js-react-product-configurator-template/src/styles/fonts/_merriweather-v30-latin.scss deleted file mode 100644 index aaa4536..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/fonts/_merriweather-v30-latin.scss +++ /dev/null @@ -1,64 +0,0 @@ -/* merriweather-300 - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Merriweather'; - font-style: normal; - font-weight: 300; - src: url('./fonts/merriweather-v30-latin/merriweather-v30-latin-300.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ -} -/* merriweather-300italic - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Merriweather'; - font-style: italic; - font-weight: 300; - src: url('./fonts/merriweather-v30-latin/merriweather-v30-latin-300italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ -} -/* merriweather-regular - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Merriweather'; - font-style: normal; - font-weight: 400; - src: url('./fonts/merriweather-v30-latin/merriweather-v30-latin-regular.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ -} -/* merriweather-italic - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Merriweather'; - font-style: italic; - font-weight: 400; - src: url('./fonts/merriweather-v30-latin/merriweather-v30-latin-italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ -} -/* merriweather-700 - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Merriweather'; - font-style: normal; - font-weight: 700; - src: url('./fonts/merriweather-v30-latin/merriweather-v30-latin-700.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ -} -/* merriweather-700italic - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Merriweather'; - font-style: italic; - font-weight: 700; - src: url('./fonts/merriweather-v30-latin/merriweather-v30-latin-700italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ -} -/* merriweather-900 - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Merriweather'; - font-style: normal; - font-weight: 900; - src: url('./fonts/merriweather-v30-latin/merriweather-v30-latin-900.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ -} -/* merriweather-900italic - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Merriweather'; - font-style: italic; - font-weight: 900; - src: url('./fonts/merriweather-v30-latin/merriweather-v30-latin-900italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ -} diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/fonts/_open-sans-v40-latin.scss b/05_react/projects/js-react-product-configurator-template/src/styles/fonts/_open-sans-v40-latin.scss deleted file mode 100644 index c0731b1..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/fonts/_open-sans-v40-latin.scss +++ /dev/null @@ -1,96 +0,0 @@ -/* open-sans-300 - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Open Sans'; - font-style: normal; - font-weight: 300; - src: url('/assets/fonts/open-sans-v40-latin/open-sans-v40-latin-300.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ -} -/* open-sans-300italic - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Open Sans'; - font-style: italic; - font-weight: 300; - src: url('/assets/fonts/open-sans-v40-latin/open-sans-v40-latin-300italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ -} -/* open-sans-regular - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Open Sans'; - font-style: normal; - font-weight: 400; - src: url('/assets/fonts/open-sans-v40-latin/open-sans-v40-latin-regular.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ -} -/* open-sans-italic - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Open Sans'; - font-style: italic; - font-weight: 400; - src: url('/assets/fonts/open-sans-v40-latin/open-sans-v40-latin-italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ -} -/* open-sans-500 - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Open Sans'; - font-style: normal; - font-weight: 500; - src: url('/assets/fonts/open-sans-v40-latin/open-sans-v40-latin-500.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ -} -/* open-sans-500italic - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Open Sans'; - font-style: italic; - font-weight: 500; - src: url('/assets/fonts/open-sans-v40-latin/open-sans-v40-latin-500italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ -} -/* open-sans-600 - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Open Sans'; - font-style: normal; - font-weight: 600; - src: url('/assets/fonts/open-sans-v40-latin/open-sans-v40-latin-600.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ -} -/* open-sans-600italic - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Open Sans'; - font-style: italic; - font-weight: 600; - src: url('/assets/fonts/open-sans-v40-latin/open-sans-v40-latin-600italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ -} -/* open-sans-700 - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Open Sans'; - font-style: normal; - font-weight: 700; - src: url('/assets/fonts/open-sans-v40-latin/open-sans-v40-latin-700.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ -} -/* open-sans-700italic - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Open Sans'; - font-style: italic; - font-weight: 700; - src: url('/assets/fonts/open-sans-v40-latin/open-sans-v40-latin-700italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ -} -/* open-sans-800 - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Open Sans'; - font-style: normal; - font-weight: 800; - src: url('/assets/fonts/open-sans-v40-latin/open-sans-v40-latin-800.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ -} -/* open-sans-800italic - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Open Sans'; - font-style: italic; - font-weight: 800; - src: url('/assets/fonts/open-sans-v40-latin/open-sans-v40-latin-800italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ -} diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/fonts/_source-sans-pro-v21-latin.scss b/05_react/projects/js-react-product-configurator-template/src/styles/fonts/_source-sans-pro-v21-latin.scss deleted file mode 100644 index 60a05b7..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/fonts/_source-sans-pro-v21-latin.scss +++ /dev/null @@ -1,120 +0,0 @@ -/* source-sans-pro-200 - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Source Sans Pro'; - font-style: normal; - font-weight: 200; - src: url('../fonts/source-sans-pro-v21-latin/source-sans-pro-v21-latin-200.woff2') format('woff2'), - /* Chrome 36+, Opera 23+, Firefox 39+ */ - url('../fonts/source-sans-pro-v21-latin/source-sans-pro-v21-latin-200.woff') format('woff'); /* Chrome 5+, Firefox 3.6+, IE 9+, Safari 5.1+ */ -} -/* source-sans-pro-200italic - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Source Sans Pro'; - font-style: italic; - font-weight: 200; - src: url('../fonts/source-sans-pro-v21-latin/source-sans-pro-v21-latin-200italic.woff2') format('woff2'), - /* Chrome 36+, Opera 23+, Firefox 39+ */ - url('../fonts/source-sans-pro-v21-latin/source-sans-pro-v21-latin-200italic.woff') format('woff'); /* Chrome 5+, Firefox 3.6+, IE 9+, Safari 5.1+ */ -} -/* source-sans-pro-300 - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Source Sans Pro'; - font-style: normal; - font-weight: 300; - src: url('../fonts/source-sans-pro-v21-latin/source-sans-pro-v21-latin-300.woff2') format('woff2'), - /* Chrome 36+, Opera 23+, Firefox 39+ */ - url('../fonts/source-sans-pro-v21-latin/source-sans-pro-v21-latin-300.woff') format('woff'); /* Chrome 5+, Firefox 3.6+, IE 9+, Safari 5.1+ */ -} -/* source-sans-pro-300italic - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Source Sans Pro'; - font-style: italic; - font-weight: 300; - src: url('../fonts/source-sans-pro-v21-latin/source-sans-pro-v21-latin-300italic.woff2') format('woff2'), - /* Chrome 36+, Opera 23+, Firefox 39+ */ - url('../fonts/source-sans-pro-v21-latin/source-sans-pro-v21-latin-300italic.woff') format('woff'); /* Chrome 5+, Firefox 3.6+, IE 9+, Safari 5.1+ */ -} -/* source-sans-pro-regular - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Source Sans Pro'; - font-style: normal; - font-weight: 400; - src: url('../fonts/source-sans-pro-v21-latin/source-sans-pro-v21-latin-regular.woff2') format('woff2'), - /* Chrome 36+, Opera 23+, Firefox 39+ */ - url('../fonts/source-sans-pro-v21-latin/source-sans-pro-v21-latin-regular.woff') format('woff'); /* Chrome 5+, Firefox 3.6+, IE 9+, Safari 5.1+ */ -} -/* source-sans-pro-italic - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Source Sans Pro'; - font-style: italic; - font-weight: 400; - src: url('../fonts/source-sans-pro-v21-latin/source-sans-pro-v21-latin-italic.woff2') format('woff2'), - /* Chrome 36+, Opera 23+, Firefox 39+ */ - url('../fonts/source-sans-pro-v21-latin/source-sans-pro-v21-latin-italic.woff') format('woff'); /* Chrome 5+, Firefox 3.6+, IE 9+, Safari 5.1+ */ -} -/* source-sans-pro-600 - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Source Sans Pro'; - font-style: normal; - font-weight: 600; - src: url('../fonts/source-sans-pro-v21-latin/source-sans-pro-v21-latin-600.woff2') format('woff2'), - /* Chrome 36+, Opera 23+, Firefox 39+ */ - url('../fonts/source-sans-pro-v21-latin/source-sans-pro-v21-latin-600.woff') format('woff'); /* Chrome 5+, Firefox 3.6+, IE 9+, Safari 5.1+ */ -} -/* source-sans-pro-600italic - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Source Sans Pro'; - font-style: italic; - font-weight: 600; - src: url('../fonts/source-sans-pro-v21-latin/source-sans-pro-v21-latin-600italic.woff2') format('woff2'), - /* Chrome 36+, Opera 23+, Firefox 39+ */ - url('../fonts/source-sans-pro-v21-latin/source-sans-pro-v21-latin-600italic.woff') format('woff'); /* Chrome 5+, Firefox 3.6+, IE 9+, Safari 5.1+ */ -} -/* source-sans-pro-700 - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Source Sans Pro'; - font-style: normal; - font-weight: 700; - src: url('../fonts/source-sans-pro-v21-latin/source-sans-pro-v21-latin-700.woff2') format('woff2'), - /* Chrome 36+, Opera 23+, Firefox 39+ */ - url('../fonts/source-sans-pro-v21-latin/source-sans-pro-v21-latin-700.woff') format('woff'); /* Chrome 5+, Firefox 3.6+, IE 9+, Safari 5.1+ */ -} -/* source-sans-pro-700italic - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Source Sans Pro'; - font-style: italic; - font-weight: 700; - src: url('../fonts/source-sans-pro-v21-latin/source-sans-pro-v21-latin-700italic.woff2') format('woff2'), - /* Chrome 36+, Opera 23+, Firefox 39+ */ - url('../fonts/source-sans-pro-v21-latin/source-sans-pro-v21-latin-700italic.woff') format('woff'); /* Chrome 5+, Firefox 3.6+, IE 9+, Safari 5.1+ */ -} -/* source-sans-pro-900 - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Source Sans Pro'; - font-style: normal; - font-weight: 900; - src: url('../fonts/source-sans-pro-v21-latin/source-sans-pro-v21-latin-900.woff2') format('woff2'), - /* Chrome 36+, Opera 23+, Firefox 39+ */ - url('../fonts/source-sans-pro-v21-latin/source-sans-pro-v21-latin-900.woff') format('woff'); /* Chrome 5+, Firefox 3.6+, IE 9+, Safari 5.1+ */ -} -/* source-sans-pro-900italic - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Source Sans Pro'; - font-style: italic; - font-weight: 900; - src: url('../fonts/source-sans-pro-v21-latin/source-sans-pro-v21-latin-900italic.woff2') format('woff2'), - /* Chrome 36+, Opera 23+, Firefox 39+ */ - url('../fonts/source-sans-pro-v21-latin/source-sans-pro-v21-latin-900italic.woff') format('woff'); /* Chrome 5+, Firefox 3.6+, IE 9+, Safari 5.1+ */ -} diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/icons/_index.scss b/05_react/projects/js-react-product-configurator-template/src/styles/icons/_index.scss deleted file mode 100644 index 3ea1742..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/icons/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@forward 'fontawesome-6.3.0/index.scss'; diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/icons/fontawesome-6.3.0/index.scss b/05_react/projects/js-react-product-configurator-template/src/styles/icons/fontawesome-6.3.0/index.scss deleted file mode 100644 index 95297e0..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/icons/fontawesome-6.3.0/index.scss +++ /dev/null @@ -1,2 +0,0 @@ -// TODO: replace CDN Link in downloaded fontawesome SCSS Files -@import 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css'; diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/libraries/_index.scss b/05_react/projects/js-react-product-configurator-template/src/styles/libraries/_index.scss deleted file mode 100644 index f16c001..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/libraries/_index.scss +++ /dev/null @@ -1,2 +0,0 @@ -// @forward 'bootstrap-5.3.3/bootstrap-grid'; -@forward 'bootstrap-5.3.3/bootstrap'; diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_accordion.scss b/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_accordion.scss deleted file mode 100644 index 17e5436..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_accordion.scss +++ /dev/null @@ -1,158 +0,0 @@ -// -// Base styles -// - -.accordion { - // scss-docs-start accordion-css-vars - --#{$prefix}accordion-color: #{$accordion-color}; - --#{$prefix}accordion-bg: #{$accordion-bg}; - --#{$prefix}accordion-transition: #{$accordion-transition}; - --#{$prefix}accordion-border-color: #{$accordion-border-color}; - --#{$prefix}accordion-border-width: #{$accordion-border-width}; - --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; - --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; - --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; - --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; - --#{$prefix}accordion-btn-color: #{$accordion-button-color}; - --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; - --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; - --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; - --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; - --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; - --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; - --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; - --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; - --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; - // scss-docs-end accordion-css-vars -} - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); - @include font-size($font-size-base); - color: var(--#{$prefix}accordion-btn-color); - text-align: left; // Reset button style - background-color: var(--#{$prefix}accordion-btn-bg); - border: 0; - @include border-radius(0); - overflow-anchor: none; - @include transition(var(--#{$prefix}accordion-transition)); - - &:not(.collapsed) { - color: var(--#{$prefix}accordion-active-color); - background-color: var(--#{$prefix}accordion-active-bg); - box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list - - &::after { - background-image: var(--#{$prefix}accordion-btn-active-icon); - transform: var(--#{$prefix}accordion-btn-icon-transform); - } - } - - // Accordion icon - &::after { - flex-shrink: 0; - width: var(--#{$prefix}accordion-btn-icon-width); - height: var(--#{$prefix}accordion-btn-icon-width); - margin-left: auto; - content: ""; - background-image: var(--#{$prefix}accordion-btn-icon); - background-repeat: no-repeat; - background-size: var(--#{$prefix}accordion-btn-icon-width); - @include transition(var(--#{$prefix}accordion-btn-icon-transition)); - } - - &:hover { - z-index: 2; - } - - &:focus { - z-index: 3; - outline: 0; - box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); - } -} - -.accordion-header { - margin-bottom: 0; -} - -.accordion-item { - color: var(--#{$prefix}accordion-color); - background-color: var(--#{$prefix}accordion-bg); - border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); - - &:first-of-type { - @include border-top-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - &:not(:first-of-type) { - border-top: 0; - } - - // Only set a border-radius on the last item if the accordion is collapsed - &:last-of-type { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - &.collapsed { - @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - > .accordion-collapse { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - } - } -} - -.accordion-body { - padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); -} - - -// Flush accordion items -// -// Remove borders and border-radius to keep accordion items edge-to-edge. - -.accordion-flush { - > .accordion-item { - border-right: 0; - border-left: 0; - @include border-radius(0); - - &:first-child { border-top: 0; } - &:last-child { border-bottom: 0; } - - // stylelint-disable selector-max-class - > .accordion-header .accordion-button { - &, - &.collapsed { - @include border-radius(0); - } - } - // stylelint-enable selector-max-class - - > .accordion-collapse { - @include border-radius(0); - } - } -} - -@if $enable-dark-mode { - @include color-mode(dark) { - .accordion-button::after { - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; - } - } -} diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_alert.scss b/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_alert.scss deleted file mode 100644 index b8cff9b..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_alert.scss +++ /dev/null @@ -1,68 +0,0 @@ -// -// Base styles -// - -.alert { - // scss-docs-start alert-css-vars - --#{$prefix}alert-bg: transparent; - --#{$prefix}alert-padding-x: #{$alert-padding-x}; - --#{$prefix}alert-padding-y: #{$alert-padding-y}; - --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; - --#{$prefix}alert-color: inherit; - --#{$prefix}alert-border-color: transparent; - --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); - --#{$prefix}alert-border-radius: #{$alert-border-radius}; - --#{$prefix}alert-link-color: inherit; - // scss-docs-end alert-css-vars - - position: relative; - padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); - margin-bottom: var(--#{$prefix}alert-margin-bottom); - color: var(--#{$prefix}alert-color); - background-color: var(--#{$prefix}alert-bg); - border: var(--#{$prefix}alert-border); - @include border-radius(var(--#{$prefix}alert-border-radius)); -} - -// Headings for larger alerts -.alert-heading { - // Specified to prevent conflicts of changing $headings-color - color: inherit; -} - -// Provide class for links that match alerts -.alert-link { - font-weight: $alert-link-font-weight; - color: var(--#{$prefix}alert-link-color); -} - - -// Dismissible alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissible { - padding-right: $alert-dismissible-padding-r; - - // Adjust close link position - .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: $stretched-link-z-index + 1; - padding: $alert-padding-y * 1.25 $alert-padding-x; - } -} - - -// scss-docs-start alert-modifiers -// Generate contextual modifier classes for colorizing the alert -@each $state in map-keys($theme-colors) { - .alert-#{$state} { - --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); - --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); - --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); - --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); - } -} -// scss-docs-end alert-modifiers diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_badge.scss b/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_badge.scss deleted file mode 100644 index cc3d269..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_badge.scss +++ /dev/null @@ -1,38 +0,0 @@ -// Base class -// -// Requires one of the contextual, color modifier classes for `color` and -// `background-color`. - -.badge { - // scss-docs-start badge-css-vars - --#{$prefix}badge-padding-x: #{$badge-padding-x}; - --#{$prefix}badge-padding-y: #{$badge-padding-y}; - @include rfs($badge-font-size, --#{$prefix}badge-font-size); - --#{$prefix}badge-font-weight: #{$badge-font-weight}; - --#{$prefix}badge-color: #{$badge-color}; - --#{$prefix}badge-border-radius: #{$badge-border-radius}; - // scss-docs-end badge-css-vars - - display: inline-block; - padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x); - @include font-size(var(--#{$prefix}badge-font-size)); - font-weight: var(--#{$prefix}badge-font-weight); - line-height: 1; - color: var(--#{$prefix}badge-color); - text-align: center; - white-space: nowrap; - vertical-align: baseline; - @include border-radius(var(--#{$prefix}badge-border-radius)); - @include gradient-bg(); - - // Empty badges collapse automatically - &:empty { - display: none; - } -} - -// Quick fix for badges in buttons -.btn .badge { - position: relative; - top: -1px; -} diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_breadcrumb.scss b/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_breadcrumb.scss deleted file mode 100644 index b8252ff..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_breadcrumb.scss +++ /dev/null @@ -1,40 +0,0 @@ -.breadcrumb { - // scss-docs-start breadcrumb-css-vars - --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x}; - --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y}; - --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom}; - @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size); - --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg}; - --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius}; - --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color}; - --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x}; - --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color}; - // scss-docs-end breadcrumb-css-vars - - display: flex; - flex-wrap: wrap; - padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x); - margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom); - @include font-size(var(--#{$prefix}breadcrumb-font-size)); - list-style: none; - background-color: var(--#{$prefix}breadcrumb-bg); - @include border-radius(var(--#{$prefix}breadcrumb-border-radius)); -} - -.breadcrumb-item { - // The separator between breadcrumbs (by default, a forward-slash: "/") - + .breadcrumb-item { - padding-left: var(--#{$prefix}breadcrumb-item-padding-x); - - &::before { - float: left; // Suppress inline spacings and underlining of the separator - padding-right: var(--#{$prefix}breadcrumb-item-padding-x); - color: var(--#{$prefix}breadcrumb-divider-color); - content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; - } - } - - &.active { - color: var(--#{$prefix}breadcrumb-item-active-color); - } -} diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_button-group.scss b/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_button-group.scss deleted file mode 100644 index 55ae3f6..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_button-group.scss +++ /dev/null @@ -1,142 +0,0 @@ -// Make the div behave like a button -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; // match .btn alignment given font-size hack above - - > .btn { - position: relative; - flex: 1 1 auto; - } - - // Bring the hover, focused, and "active" buttons to the front to overlay - // the borders properly - > .btn-check:checked + .btn, - > .btn-check:focus + .btn, - > .btn:hover, - > .btn:focus, - > .btn:active, - > .btn.active { - z-index: 1; - } -} - -// Optional: Group multiple button groups together for a toolbar -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; - - .input-group { - width: auto; - } -} - -.btn-group { - @include border-radius($btn-border-radius); - - // Prevent double borders when buttons are next to each other - > :not(.btn-check:first-child) + .btn, - > .btn-group:not(:first-child) { - margin-left: calc(#{$btn-border-width} * -1); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn.dropdown-toggle-split:first-child, - > .btn-group:not(:last-child) > .btn { - @include border-end-radius(0); - } - - // The left radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-start-radius(0); - } -} - -// Sizing -// -// Remix the default button sizing classes into new ones for easier manipulation. - -.btn-group-sm > .btn { @extend .btn-sm; } -.btn-group-lg > .btn { @extend .btn-lg; } - - -// -// Split button dropdowns -// - -.dropdown-toggle-split { - padding-right: $btn-padding-x * .75; - padding-left: $btn-padding-x * .75; - - &::after, - .dropup &::after, - .dropend &::after { - margin-left: 0; - } - - .dropstart &::before { - margin-right: 0; - } -} - -.btn-sm + .dropdown-toggle-split { - padding-right: $btn-padding-x-sm * .75; - padding-left: $btn-padding-x-sm * .75; -} - -.btn-lg + .dropdown-toggle-split { - padding-right: $btn-padding-x-lg * .75; - padding-left: $btn-padding-x-lg * .75; -} - - -// The clickable button for toggling the menu -// Set the same inset shadow as the :active state -.btn-group.show .dropdown-toggle { - @include box-shadow($btn-active-box-shadow); - - // Show no shadow for `.btn-link` since it has no other button styles. - &.btn-link { - @include box-shadow(none); - } -} - - -// -// Vertical button groups -// - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; - - > .btn, - > .btn-group { - width: 100%; - } - - > .btn:not(:first-child), - > .btn-group:not(:first-child) { - margin-top: calc(#{$btn-border-width} * -1); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn-group:not(:last-child) > .btn { - @include border-bottom-radius(0); - } - - > .btn ~ .btn, - > .btn-group:not(:first-child) > .btn { - @include border-top-radius(0); - } -} diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_buttons.scss b/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_buttons.scss deleted file mode 100644 index caa4518..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_buttons.scss +++ /dev/null @@ -1,216 +0,0 @@ -// -// Base styles -// - -.btn { - // scss-docs-start btn-css-vars - --#{$prefix}btn-padding-x: #{$btn-padding-x}; - --#{$prefix}btn-padding-y: #{$btn-padding-y}; - --#{$prefix}btn-font-family: #{$btn-font-family}; - @include rfs($btn-font-size, --#{$prefix}btn-font-size); - --#{$prefix}btn-font-weight: #{$btn-font-weight}; - --#{$prefix}btn-line-height: #{$btn-line-height}; - --#{$prefix}btn-color: #{$btn-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-width: #{$btn-border-width}; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-border-radius: #{$btn-border-radius}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-box-shadow: #{$btn-box-shadow}; - --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity}; - --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5); - // scss-docs-end btn-css-vars - - display: inline-block; - padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x); - font-family: var(--#{$prefix}btn-font-family); - @include font-size(var(--#{$prefix}btn-font-size)); - font-weight: var(--#{$prefix}btn-font-weight); - line-height: var(--#{$prefix}btn-line-height); - color: var(--#{$prefix}btn-color); - text-align: center; - text-decoration: if($link-decoration == none, null, none); - white-space: $btn-white-space; - vertical-align: middle; - cursor: if($enable-button-pointers, pointer, null); - user-select: none; - border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color); - @include border-radius(var(--#{$prefix}btn-border-radius)); - @include gradient-bg(var(--#{$prefix}btn-bg)); - @include box-shadow(var(--#{$prefix}btn-box-shadow)); - @include transition($btn-transition); - - &:hover { - color: var(--#{$prefix}btn-hover-color); - text-decoration: if($link-hover-decoration == underline, none, null); - background-color: var(--#{$prefix}btn-hover-bg); - border-color: var(--#{$prefix}btn-hover-border-color); - } - - .btn-check + &:hover { - // override for the checkbox/radio buttons - color: var(--#{$prefix}btn-color); - background-color: var(--#{$prefix}btn-bg); - border-color: var(--#{$prefix}btn-border-color); - } - - &:focus-visible { - color: var(--#{$prefix}btn-hover-color); - @include gradient-bg(var(--#{$prefix}btn-hover-bg)); - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:focus-visible + & { - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:checked + &, - :not(.btn-check) + &:active, - &:first-child:active, - &.active, - &.show { - color: var(--#{$prefix}btn-active-color); - background-color: var(--#{$prefix}btn-active-bg); - // Remove CSS gradients if they're enabled - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-active-border-color); - @include box-shadow(var(--#{$prefix}btn-active-shadow)); - - &:focus-visible { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - } - - .btn-check:checked:focus-visible + & { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - &:disabled, - &.disabled, - fieldset:disabled & { - color: var(--#{$prefix}btn-disabled-color); - pointer-events: none; - background-color: var(--#{$prefix}btn-disabled-bg); - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-disabled-border-color); - opacity: var(--#{$prefix}btn-disabled-opacity); - @include box-shadow(none); - } -} - - -// -// Alternate buttons -// - -// scss-docs-start btn-variant-loops -@each $color, $value in $theme-colors { - .btn-#{$color} { - @if $color == "light" { - @include button-variant( - $value, - $value, - $hover-background: shade-color($value, $btn-hover-bg-shade-amount), - $hover-border: shade-color($value, $btn-hover-border-shade-amount), - $active-background: shade-color($value, $btn-active-bg-shade-amount), - $active-border: shade-color($value, $btn-active-border-shade-amount) - ); - } @else if $color == "dark" { - @include button-variant( - $value, - $value, - $hover-background: tint-color($value, $btn-hover-bg-tint-amount), - $hover-border: tint-color($value, $btn-hover-border-tint-amount), - $active-background: tint-color($value, $btn-active-bg-tint-amount), - $active-border: tint-color($value, $btn-active-border-tint-amount) - ); - } @else { - @include button-variant($value, $value); - } - } -} - -@each $color, $value in $theme-colors { - .btn-outline-#{$color} { - @include button-outline-variant($value); - } -} -// scss-docs-end btn-variant-loops - - -// -// Link buttons -// - -// Make a button look and behave like a link -.btn-link { - --#{$prefix}btn-font-weight: #{$font-weight-normal}; - --#{$prefix}btn-color: #{$btn-link-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-hover-color: #{$btn-link-hover-color}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-active-color: #{$btn-link-hover-color}; - --#{$prefix}btn-active-border-color: transparent; - --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color}; - --#{$prefix}btn-disabled-border-color: transparent; - --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows - --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb}; - - text-decoration: $link-decoration; - @if $enable-gradients { - background-image: none; - } - - &:hover, - &:focus-visible { - text-decoration: $link-hover-decoration; - } - - &:focus-visible { - color: var(--#{$prefix}btn-color); - } - - &:hover { - color: var(--#{$prefix}btn-hover-color); - } - - // No need for an active state here -} - - -// -// Button Sizes -// - -.btn-lg { - @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); -} - -.btn-sm { - @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); -} diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_card.scss b/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_card.scss deleted file mode 100644 index d3535a9..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_card.scss +++ /dev/null @@ -1,239 +0,0 @@ -// -// Base styles -// - -.card { - // scss-docs-start card-css-vars - --#{$prefix}card-spacer-y: #{$card-spacer-y}; - --#{$prefix}card-spacer-x: #{$card-spacer-x}; - --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y}; - --#{$prefix}card-title-color: #{$card-title-color}; - --#{$prefix}card-subtitle-color: #{$card-subtitle-color}; - --#{$prefix}card-border-width: #{$card-border-width}; - --#{$prefix}card-border-color: #{$card-border-color}; - --#{$prefix}card-border-radius: #{$card-border-radius}; - --#{$prefix}card-box-shadow: #{$card-box-shadow}; - --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius}; - --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y}; - --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x}; - --#{$prefix}card-cap-bg: #{$card-cap-bg}; - --#{$prefix}card-cap-color: #{$card-cap-color}; - --#{$prefix}card-height: #{$card-height}; - --#{$prefix}card-color: #{$card-color}; - --#{$prefix}card-bg: #{$card-bg}; - --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding}; - --#{$prefix}card-group-margin: #{$card-group-margin}; - // scss-docs-end card-css-vars - - position: relative; - display: flex; - flex-direction: column; - min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 - height: var(--#{$prefix}card-height); - color: var(--#{$prefix}body-color); - word-wrap: break-word; - background-color: var(--#{$prefix}card-bg); - background-clip: border-box; - border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - @include border-radius(var(--#{$prefix}card-border-radius)); - @include box-shadow(var(--#{$prefix}card-box-shadow)); - - > hr { - margin-right: 0; - margin-left: 0; - } - - > .list-group { - border-top: inherit; - border-bottom: inherit; - - &:first-child { - border-top-width: 0; - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); - } - - &:last-child { - border-bottom-width: 0; - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); - } - } - - // Due to specificity of the above selector (`.card > .list-group`), we must - // use a child selector here to prevent double borders. - > .card-header + .list-group, - > .list-group + .card-footer { - border-top: 0; - } -} - -.card-body { - // Enable `flex-grow: 1` for decks and groups so that card blocks take up - // as much space as possible, ensuring footers are aligned to the bottom. - flex: 1 1 auto; - padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x); - color: var(--#{$prefix}card-color); -} - -.card-title { - margin-bottom: var(--#{$prefix}card-title-spacer-y); - color: var(--#{$prefix}card-title-color); -} - -.card-subtitle { - margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list - margin-bottom: 0; - color: var(--#{$prefix}card-subtitle-color); -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link { - &:hover { - text-decoration: if($link-hover-decoration == underline, none, null); - } - - + .card-link { - margin-left: var(--#{$prefix}card-spacer-x); - } -} - -// -// Optional textual caps -// - -.card-header { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - margin-bottom: 0; // Removes the default margin-bottom of - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:first-child { - @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0); - } -} - -.card-footer { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:last-child { - @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius)); - } -} - - -// -// Header navs -// - -.card-header-tabs { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - border-bottom: 0; - - .nav-link.active { - background-color: var(--#{$prefix}card-bg); - border-bottom-color: var(--#{$prefix}card-bg); - } -} - -.card-header-pills { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list -} - -// Card image -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: var(--#{$prefix}card-img-overlay-padding); - @include border-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch -} - -.card-img, -.card-img-top { - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-bottom { - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); -} - - -// -// Card groups -// - -.card-group { - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - margin-bottom: var(--#{$prefix}card-group-margin); - } - - @include media-breakpoint-up(sm) { - display: flex; - flex-flow: row wrap; - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4 - flex: 1 0 0%; - margin-bottom: 0; - - + .card { - margin-left: 0; - border-left: 0; - } - - // Handle rounded corners - @if $enable-rounded { - &:not(:last-child) { - @include border-end-radius(0); - - .card-img-top, - .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-right-radius: 0; - } - .card-img-bottom, - .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-right-radius: 0; - } - } - - &:not(:first-child) { - @include border-start-radius(0); - - .card-img-top, - .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-left-radius: 0; - } - .card-img-bottom, - .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-left-radius: 0; - } - } - } - } - } -} diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_carousel.scss b/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_carousel.scss deleted file mode 100644 index 3a13522..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_carousel.scss +++ /dev/null @@ -1,236 +0,0 @@ -// Notes on the classes: -// -// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) -// even when their scroll action started on a carousel, but for compatibility (with Firefox) -// we're preventing all actions instead -// 2. The .carousel-item-start and .carousel-item-end is used to indicate where -// the active slide is heading. -// 3. .active.carousel-item is the current slide. -// 4. .active.carousel-item-start and .active.carousel-item-end is the current -// slide in its in-transition state. Only one of these occurs at a time. -// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end -// is the upcoming slide in transition. - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; - @include clearfix(); -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - @include transition($carousel-transition); -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); -} - - -// -// Alternate transitions -// - -.carousel-fade { - .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; - } - - .carousel-item.active, - .carousel-item-next.carousel-item-start, - .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; - } - - .active.carousel-item-start, - .active.carousel-item-end { - z-index: 0; - opacity: 0; - @include transition(opacity 0s $carousel-transition-duration); - } -} - - -// -// Left/right controls for nav -// - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - // Use flex for alignment (1-3) - display: flex; // 1. allow flex styles - align-items: center; // 2. vertically center contents - justify-content: center; // 3. horizontally center contents - width: $carousel-control-width; - padding: 0; - color: $carousel-control-color; - text-align: center; - background: none; - border: 0; - opacity: $carousel-control-opacity; - @include transition($carousel-control-transition); - - // Hover/focus state - &:hover, - &:focus { - color: $carousel-control-color; - text-decoration: none; - outline: 0; - opacity: $carousel-control-hover-opacity; - } -} -.carousel-control-prev { - left: 0; - background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); -} -.carousel-control-next { - right: 0; - background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); -} - -// Icons for within -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: $carousel-control-icon-width; - height: $carousel-control-icon-width; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; -} - -.carousel-control-prev-icon { - background-image: escape-svg($carousel-control-prev-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-next-icon-bg) + "*/"}; -} -.carousel-control-next-icon { - background-image: escape-svg($carousel-control-next-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-prev-icon-bg) + "*/"}; -} - -// Optional indicator pips/controls -// -// Add a container (such as a list) with the following class and add an item (ideally a focusable control, -// like a button) with data-bs-target for each slide your carousel holds. - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - // Use the .carousel-control's width as margin so we don't overlay those - margin-right: $carousel-control-width; - margin-bottom: 1rem; - margin-left: $carousel-control-width; - - [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: $carousel-indicator-width; - height: $carousel-indicator-height; - padding: 0; - margin-right: $carousel-indicator-spacer; - margin-left: $carousel-indicator-spacer; - text-indent: -999px; - cursor: pointer; - background-color: $carousel-indicator-active-bg; - background-clip: padding-box; - border: 0; - // Use transparent borders to increase the hit area by 10px on top and bottom. - border-top: $carousel-indicator-hit-area-height solid transparent; - border-bottom: $carousel-indicator-hit-area-height solid transparent; - opacity: $carousel-indicator-opacity; - @include transition($carousel-indicator-transition); - } - - .active { - opacity: $carousel-indicator-active-opacity; - } -} - - -// Optional captions -// -// - -.carousel-caption { - position: absolute; - right: (100% - $carousel-caption-width) * .5; - bottom: $carousel-caption-spacer; - left: (100% - $carousel-caption-width) * .5; - padding-top: $carousel-caption-padding-y; - padding-bottom: $carousel-caption-padding-y; - color: $carousel-caption-color; - text-align: center; -} - -// Dark mode carousel - -@mixin carousel-dark() { - .carousel-control-prev-icon, - .carousel-control-next-icon { - filter: $carousel-dark-control-icon-filter; - } - - .carousel-indicators [data-bs-target] { - background-color: $carousel-dark-indicator-active-bg; - } - - .carousel-caption { - color: $carousel-dark-caption-color; - } -} - -.carousel-dark { - @include carousel-dark(); -} - -@if $enable-dark-mode { - @include color-mode(dark) { - @if $color-mode-type == "media-query" { - .carousel { - @include carousel-dark(); - } - } @else { - .carousel, - &.carousel { - @include carousel-dark(); - } - } - } -} diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_close.scss b/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_close.scss deleted file mode 100644 index 4d6e73c..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_close.scss +++ /dev/null @@ -1,63 +0,0 @@ -// Transparent background and border properties included for button version. -// iOS requires the button element instead of an anchor tag. -// If you want the anchor version, it requires `href="#"`. -// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile - -.btn-close { - // scss-docs-start close-css-vars - --#{$prefix}btn-close-color: #{$btn-close-color}; - --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) }; - --#{$prefix}btn-close-opacity: #{$btn-close-opacity}; - --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity}; - --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow}; - --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity}; - --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity}; - --#{$prefix}btn-close-white-filter: #{$btn-close-white-filter}; - // scss-docs-end close-css-vars - - box-sizing: content-box; - width: $btn-close-width; - height: $btn-close-height; - padding: $btn-close-padding-y $btn-close-padding-x; - color: var(--#{$prefix}btn-close-color); - background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements - border: 0; // for button elements - @include border-radius(); - opacity: var(--#{$prefix}btn-close-opacity); - - // Override 's hover style - &:hover { - color: var(--#{$prefix}btn-close-color); - text-decoration: none; - opacity: var(--#{$prefix}btn-close-hover-opacity); - } - - &:focus { - outline: 0; - box-shadow: var(--#{$prefix}btn-close-focus-shadow); - opacity: var(--#{$prefix}btn-close-focus-opacity); - } - - &:disabled, - &.disabled { - pointer-events: none; - user-select: none; - opacity: var(--#{$prefix}btn-close-disabled-opacity); - } -} - -@mixin btn-close-white() { - filter: var(--#{$prefix}btn-close-white-filter); -} - -.btn-close-white { - @include btn-close-white(); -} - -@if $enable-dark-mode { - @include color-mode(dark) { - .btn-close { - @include btn-close-white(); - } - } -} diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_containers.scss b/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_containers.scss deleted file mode 100644 index 83b3138..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_containers.scss +++ /dev/null @@ -1,41 +0,0 @@ -// Container widths -// -// Set the container width, and override it for fixed navbars in media queries. - -@if $enable-container-classes { - // Single container class with breakpoint max-widths - .container, - // 100% wide container at all breakpoints - .container-fluid { - @include make-container(); - } - - // Responsive containers that are 100% wide until a breakpoint - @each $breakpoint, $container-max-width in $container-max-widths { - .container-#{$breakpoint} { - @extend .container-fluid; - } - - @include media-breakpoint-up($breakpoint, $grid-breakpoints) { - %responsive-container-#{$breakpoint} { - max-width: $container-max-width; - } - - // Extend each breakpoint which is smaller or equal to the current breakpoint - $extend-breakpoint: true; - - @each $name, $width in $grid-breakpoints { - @if ($extend-breakpoint) { - .container#{breakpoint-infix($name, $grid-breakpoints)} { - @extend %responsive-container-#{$breakpoint}; - } - - // Once the current breakpoint is reached, stop extending - @if ($breakpoint == $name) { - $extend-breakpoint: false; - } - } - } - } - } -} diff --git a/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_dropdown.scss b/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_dropdown.scss deleted file mode 100644 index 587ebb4..0000000 --- a/05_react/projects/js-react-product-configurator-template/src/styles/libraries/bootstrap-5.3.3/_dropdown.scss +++ /dev/null @@ -1,250 +0,0 @@ -// The dropdown wrapper (`
      `) -.dropup, -.dropend, -.dropdown, -.dropstart, -.dropup-center, -.dropdown-center { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; - - // Generate the caret automatically - @include caret(); -} - -// The dropdown menu -.dropdown-menu { - // scss-docs-start dropdown-css-vars - --#{$prefix}dropdown-zindex: #{$zindex-dropdown}; - --#{$prefix}dropdown-min-width: #{$dropdown-min-width}; - --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x}; - --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y}; - --#{$prefix}dropdown-spacer: #{$dropdown-spacer}; - @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size); - --#{$prefix}dropdown-color: #{$dropdown-color}; - --#{$prefix}dropdown-bg: #{$dropdown-bg}; - --#{$prefix}dropdown-border-color: #{$dropdown-border-color}; - --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius}; - --#{$prefix}dropdown-border-width: #{$dropdown-border-width}; - --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius}; - --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg}; - --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y}; - --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow}; - --#{$prefix}dropdown-link-color: #{$dropdown-link-color}; - --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color}; - --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg}; - --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color}; - --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg}; - --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color}; - --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x}; - --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y}; - --#{$prefix}dropdown-header-color: #{$dropdown-header-color}; - --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x}; - --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y}; - // scss-docs-end dropdown-css-vars - - position: absolute; - z-index: var(--#{$prefix}dropdown-zindex); - display: none; // none by default, but block on "open" of the menu - min-width: var(--#{$prefix}dropdown-min-width); - padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x); - margin: 0; // Override default margin of ul - @include font-size(var(--#{$prefix}dropdown-font-size)); - color: var(--#{$prefix}dropdown-color); - text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) - list-style: none; - background-color: var(--#{$prefix}dropdown-bg); - background-clip: padding-box; - border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color); - @include border-radius(var(--#{$prefix}dropdown-border-radius)); - @include box-shadow(var(--#{$prefix}dropdown-box-shadow)); - - &[data-bs-popper] { - top: 100%; - left: 0; - margin-top: var(--#{$prefix}dropdown-spacer); - } - - @if $dropdown-padding-y == 0 { - > .dropdown-item:first-child, - > li:first-child .dropdown-item { - @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - > .dropdown-item:last-child, - > li:last-child .dropdown-item { - @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - - } -} - -// scss-docs-start responsive-breakpoints -// We deliberately hardcode the `bs-` prefix because we check -// this custom property in JS to determine Popper's positioning - -@each $breakpoint in map-keys($grid-breakpoints) { - @include media-breakpoint-up($breakpoint) { - $infix: breakpoint-infix($breakpoint, $grid-breakpoints); - - .dropdown-menu#{$infix}-start { - --bs-position: start; - - &[data-bs-popper] { - right: auto; - left: 0; - } - } - - .dropdown-menu#{$infix}-end { - --bs-position: end; - - &[data-bs-popper] { - right: 0; - left: auto; - } - } - } -} -// scss-docs-end responsive-breakpoints - -// Allow for dropdowns to go bottom up (aka, dropup-menu) -// Just add .dropup after the standard .dropdown class and you're set. -.dropup { - .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(up); - } -} - -.dropend { - .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(end); - &::after { - vertical-align: 0; - } - } -} - -.dropstart { - .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(start); - &::before { - vertical-align: 0; - } - } -} - - -// Dividers (basically an `
      `) within the dropdown -.dropdown-divider { - height: 0; - margin: var(--#{$prefix}dropdown-divider-margin-y) 0; - overflow: hidden; - border-top: 1px solid var(--#{$prefix}dropdown-divider-bg); - opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
      element -} - -// Links, buttons, and more within the dropdown menu -// -// `
      ` alignment by inheriting `text-align`. -// 3. Fix alignment for Safari - -th { - font-weight: $table-th-font-weight; // 1 - text-align: inherit; // 2 - text-align: -webkit-match-parent; // 3 -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - - -// Forms -// -// 1. Allow labels to use `margin` for spacing. - -label { - display: inline-block; // 1 -} - -// Remove the default `border-radius` that macOS Chrome adds. -// See https://github.com/twbs/bootstrap/issues/24093 - -button { - // stylelint-disable-next-line property-disallowed-list - border-radius: 0; -} - -// Explicitly remove focus outline in Chromium when it shouldn't be -// visible (e.g. as result of mouse click or touch tap). It already -// should be doing this automatically, but seems to currently be -// confused and applies its very visible two-tone outline anyway. - -button:focus:not(:focus-visible) { - outline: 0; -} - -// 1. Remove the margin in Firefox and Safari - -input, -button, -select, -optgroup, -textarea { - margin: 0; // 1 - font-family: inherit; - @include font-size(inherit); - line-height: inherit; -} - -// Remove the inheritance of text transform in Firefox -button, -select { - text-transform: none; -} -// Set the cursor for non-` - - - - - - - - ); -}; -export default InputAmount; diff --git a/05_react/uebungen/u09_react-icons/src/main.jsx b/05_react/uebungen/u09_react-icons/src/main.jsx deleted file mode 100644 index 489056a..0000000 --- a/05_react/uebungen/u09_react-icons/src/main.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; - -// import 'bootstrap/dist/css/bootstrap.min.css'; -import './styles/main.scss'; - -import App from './App.jsx'; - -createRoot(document.getElementById('root')).render( - - - , -); diff --git a/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/_index.scss b/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/_index.scss deleted file mode 100644 index dcefbc9..0000000 --- a/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/_index.scss +++ /dev/null @@ -1,3 +0,0 @@ -// @import 'bootstrap-5.3.8/bootstrap-grid'; -@import 'bootstrap-5.3.8/bootstrap'; -// @import 'bulma-1.04/index' diff --git a/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss b/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss deleted file mode 100644 index e9f267f..0000000 --- a/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss +++ /dev/null @@ -1,153 +0,0 @@ -// -// Base styles -// - -.accordion { - // scss-docs-start accordion-css-vars - --#{$prefix}accordion-color: #{$accordion-color}; - --#{$prefix}accordion-bg: #{$accordion-bg}; - --#{$prefix}accordion-transition: #{$accordion-transition}; - --#{$prefix}accordion-border-color: #{$accordion-border-color}; - --#{$prefix}accordion-border-width: #{$accordion-border-width}; - --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; - --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; - --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; - --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; - --#{$prefix}accordion-btn-color: #{$accordion-button-color}; - --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; - --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; - --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; - --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; - --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; - --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; - --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; - --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; - --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; - // scss-docs-end accordion-css-vars -} - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); - @include font-size($font-size-base); - color: var(--#{$prefix}accordion-btn-color); - text-align: left; // Reset button style - background-color: var(--#{$prefix}accordion-btn-bg); - border: 0; - @include border-radius(0); - overflow-anchor: none; - @include transition(var(--#{$prefix}accordion-transition)); - - &:not(.collapsed) { - color: var(--#{$prefix}accordion-active-color); - background-color: var(--#{$prefix}accordion-active-bg); - box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list - - &::after { - background-image: var(--#{$prefix}accordion-btn-active-icon); - transform: var(--#{$prefix}accordion-btn-icon-transform); - } - } - - // Accordion icon - &::after { - flex-shrink: 0; - width: var(--#{$prefix}accordion-btn-icon-width); - height: var(--#{$prefix}accordion-btn-icon-width); - margin-left: auto; - content: ""; - background-image: var(--#{$prefix}accordion-btn-icon); - background-repeat: no-repeat; - background-size: var(--#{$prefix}accordion-btn-icon-width); - @include transition(var(--#{$prefix}accordion-btn-icon-transition)); - } - - &:hover { - z-index: 2; - } - - &:focus { - z-index: 3; - outline: 0; - box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); - } -} - -.accordion-header { - margin-bottom: 0; -} - -.accordion-item { - color: var(--#{$prefix}accordion-color); - background-color: var(--#{$prefix}accordion-bg); - border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); - - &:first-of-type { - @include border-top-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - &:not(:first-of-type) { - border-top: 0; - } - - // Only set a border-radius on the last item if the accordion is collapsed - &:last-of-type { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - &.collapsed { - @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - > .accordion-collapse { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - } - } -} - -.accordion-body { - padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); -} - - -// Flush accordion items -// -// Remove borders and border-radius to keep accordion items edge-to-edge. - -.accordion-flush { - > .accordion-item { - border-right: 0; - border-left: 0; - @include border-radius(0); - - &:first-child { border-top: 0; } - &:last-child { border-bottom: 0; } - - // stylelint-disable selector-max-class - > .accordion-collapse, - > .accordion-header .accordion-button, - > .accordion-header .accordion-button.collapsed { - @include border-radius(0); - } - // stylelint-enable selector-max-class - } -} - -@if $enable-dark-mode { - @include color-mode(dark) { - .accordion-button::after { - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; - } - } -} diff --git a/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss b/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss deleted file mode 100644 index b8cff9b..0000000 --- a/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss +++ /dev/null @@ -1,68 +0,0 @@ -// -// Base styles -// - -.alert { - // scss-docs-start alert-css-vars - --#{$prefix}alert-bg: transparent; - --#{$prefix}alert-padding-x: #{$alert-padding-x}; - --#{$prefix}alert-padding-y: #{$alert-padding-y}; - --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; - --#{$prefix}alert-color: inherit; - --#{$prefix}alert-border-color: transparent; - --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); - --#{$prefix}alert-border-radius: #{$alert-border-radius}; - --#{$prefix}alert-link-color: inherit; - // scss-docs-end alert-css-vars - - position: relative; - padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); - margin-bottom: var(--#{$prefix}alert-margin-bottom); - color: var(--#{$prefix}alert-color); - background-color: var(--#{$prefix}alert-bg); - border: var(--#{$prefix}alert-border); - @include border-radius(var(--#{$prefix}alert-border-radius)); -} - -// Headings for larger alerts -.alert-heading { - // Specified to prevent conflicts of changing $headings-color - color: inherit; -} - -// Provide class for links that match alerts -.alert-link { - font-weight: $alert-link-font-weight; - color: var(--#{$prefix}alert-link-color); -} - - -// Dismissible alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissible { - padding-right: $alert-dismissible-padding-r; - - // Adjust close link position - .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: $stretched-link-z-index + 1; - padding: $alert-padding-y * 1.25 $alert-padding-x; - } -} - - -// scss-docs-start alert-modifiers -// Generate contextual modifier classes for colorizing the alert -@each $state in map-keys($theme-colors) { - .alert-#{$state} { - --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); - --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); - --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); - --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); - } -} -// scss-docs-end alert-modifiers diff --git a/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss b/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss deleted file mode 100644 index cc3d269..0000000 --- a/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss +++ /dev/null @@ -1,38 +0,0 @@ -// Base class -// -// Requires one of the contextual, color modifier classes for `color` and -// `background-color`. - -.badge { - // scss-docs-start badge-css-vars - --#{$prefix}badge-padding-x: #{$badge-padding-x}; - --#{$prefix}badge-padding-y: #{$badge-padding-y}; - @include rfs($badge-font-size, --#{$prefix}badge-font-size); - --#{$prefix}badge-font-weight: #{$badge-font-weight}; - --#{$prefix}badge-color: #{$badge-color}; - --#{$prefix}badge-border-radius: #{$badge-border-radius}; - // scss-docs-end badge-css-vars - - display: inline-block; - padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x); - @include font-size(var(--#{$prefix}badge-font-size)); - font-weight: var(--#{$prefix}badge-font-weight); - line-height: 1; - color: var(--#{$prefix}badge-color); - text-align: center; - white-space: nowrap; - vertical-align: baseline; - @include border-radius(var(--#{$prefix}badge-border-radius)); - @include gradient-bg(); - - // Empty badges collapse automatically - &:empty { - display: none; - } -} - -// Quick fix for badges in buttons -.btn .badge { - position: relative; - top: -1px; -} diff --git a/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss b/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss deleted file mode 100644 index b8252ff..0000000 --- a/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss +++ /dev/null @@ -1,40 +0,0 @@ -.breadcrumb { - // scss-docs-start breadcrumb-css-vars - --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x}; - --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y}; - --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom}; - @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size); - --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg}; - --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius}; - --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color}; - --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x}; - --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color}; - // scss-docs-end breadcrumb-css-vars - - display: flex; - flex-wrap: wrap; - padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x); - margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom); - @include font-size(var(--#{$prefix}breadcrumb-font-size)); - list-style: none; - background-color: var(--#{$prefix}breadcrumb-bg); - @include border-radius(var(--#{$prefix}breadcrumb-border-radius)); -} - -.breadcrumb-item { - // The separator between breadcrumbs (by default, a forward-slash: "/") - + .breadcrumb-item { - padding-left: var(--#{$prefix}breadcrumb-item-padding-x); - - &::before { - float: left; // Suppress inline spacings and underlining of the separator - padding-right: var(--#{$prefix}breadcrumb-item-padding-x); - color: var(--#{$prefix}breadcrumb-divider-color); - content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; - } - } - - &.active { - color: var(--#{$prefix}breadcrumb-item-active-color); - } -} diff --git a/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss b/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss deleted file mode 100644 index 78e1252..0000000 --- a/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss +++ /dev/null @@ -1,147 +0,0 @@ -// Make the div behave like a button -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; // match .btn alignment given font-size hack above - - > .btn { - position: relative; - flex: 1 1 auto; - } - - // Bring the hover, focused, and "active" buttons to the front to overlay - // the borders properly - > .btn-check:checked + .btn, - > .btn-check:focus + .btn, - > .btn:hover, - > .btn:focus, - > .btn:active, - > .btn.active { - z-index: 1; - } -} - -// Optional: Group multiple button groups together for a toolbar -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; - - .input-group { - width: auto; - } -} - -.btn-group { - @include border-radius($btn-border-radius); - - // Prevent double borders when buttons are next to each other - > :not(.btn-check:first-child) + .btn, - > .btn-group:not(:first-child) { - margin-left: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn.dropdown-toggle-split:first-child, - > .btn-group:not(:last-child) > .btn { - @include border-end-radius(0); - } - - // The left radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-start-radius(0); - } -} - -// Sizing -// -// Remix the default button sizing classes into new ones for easier manipulation. - -.btn-group-sm > .btn { @extend .btn-sm; } -.btn-group-lg > .btn { @extend .btn-lg; } - - -// -// Split button dropdowns -// - -.dropdown-toggle-split { - padding-right: $btn-padding-x * .75; - padding-left: $btn-padding-x * .75; - - &::after, - .dropup &::after, - .dropend &::after { - margin-left: 0; - } - - .dropstart &::before { - margin-right: 0; - } -} - -.btn-sm + .dropdown-toggle-split { - padding-right: $btn-padding-x-sm * .75; - padding-left: $btn-padding-x-sm * .75; -} - -.btn-lg + .dropdown-toggle-split { - padding-right: $btn-padding-x-lg * .75; - padding-left: $btn-padding-x-lg * .75; -} - - -// The clickable button for toggling the menu -// Set the same inset shadow as the :active state -.btn-group.show .dropdown-toggle { - @include box-shadow($btn-active-box-shadow); - - // Show no shadow for `.btn-link` since it has no other button styles. - &.btn-link { - @include box-shadow(none); - } -} - - -// -// Vertical button groups -// - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; - - > .btn, - > .btn-group { - width: 100%; - } - - > .btn:not(:first-child), - > .btn-group:not(:first-child) { - margin-top: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn-group:not(:last-child) > .btn { - @include border-bottom-radius(0); - } - - // The top radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-top-radius(0); - } -} diff --git a/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss b/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss deleted file mode 100644 index caa4518..0000000 --- a/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss +++ /dev/null @@ -1,216 +0,0 @@ -// -// Base styles -// - -.btn { - // scss-docs-start btn-css-vars - --#{$prefix}btn-padding-x: #{$btn-padding-x}; - --#{$prefix}btn-padding-y: #{$btn-padding-y}; - --#{$prefix}btn-font-family: #{$btn-font-family}; - @include rfs($btn-font-size, --#{$prefix}btn-font-size); - --#{$prefix}btn-font-weight: #{$btn-font-weight}; - --#{$prefix}btn-line-height: #{$btn-line-height}; - --#{$prefix}btn-color: #{$btn-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-width: #{$btn-border-width}; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-border-radius: #{$btn-border-radius}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-box-shadow: #{$btn-box-shadow}; - --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity}; - --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5); - // scss-docs-end btn-css-vars - - display: inline-block; - padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x); - font-family: var(--#{$prefix}btn-font-family); - @include font-size(var(--#{$prefix}btn-font-size)); - font-weight: var(--#{$prefix}btn-font-weight); - line-height: var(--#{$prefix}btn-line-height); - color: var(--#{$prefix}btn-color); - text-align: center; - text-decoration: if($link-decoration == none, null, none); - white-space: $btn-white-space; - vertical-align: middle; - cursor: if($enable-button-pointers, pointer, null); - user-select: none; - border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color); - @include border-radius(var(--#{$prefix}btn-border-radius)); - @include gradient-bg(var(--#{$prefix}btn-bg)); - @include box-shadow(var(--#{$prefix}btn-box-shadow)); - @include transition($btn-transition); - - &:hover { - color: var(--#{$prefix}btn-hover-color); - text-decoration: if($link-hover-decoration == underline, none, null); - background-color: var(--#{$prefix}btn-hover-bg); - border-color: var(--#{$prefix}btn-hover-border-color); - } - - .btn-check + &:hover { - // override for the checkbox/radio buttons - color: var(--#{$prefix}btn-color); - background-color: var(--#{$prefix}btn-bg); - border-color: var(--#{$prefix}btn-border-color); - } - - &:focus-visible { - color: var(--#{$prefix}btn-hover-color); - @include gradient-bg(var(--#{$prefix}btn-hover-bg)); - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:focus-visible + & { - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:checked + &, - :not(.btn-check) + &:active, - &:first-child:active, - &.active, - &.show { - color: var(--#{$prefix}btn-active-color); - background-color: var(--#{$prefix}btn-active-bg); - // Remove CSS gradients if they're enabled - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-active-border-color); - @include box-shadow(var(--#{$prefix}btn-active-shadow)); - - &:focus-visible { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - } - - .btn-check:checked:focus-visible + & { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - &:disabled, - &.disabled, - fieldset:disabled & { - color: var(--#{$prefix}btn-disabled-color); - pointer-events: none; - background-color: var(--#{$prefix}btn-disabled-bg); - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-disabled-border-color); - opacity: var(--#{$prefix}btn-disabled-opacity); - @include box-shadow(none); - } -} - - -// -// Alternate buttons -// - -// scss-docs-start btn-variant-loops -@each $color, $value in $theme-colors { - .btn-#{$color} { - @if $color == "light" { - @include button-variant( - $value, - $value, - $hover-background: shade-color($value, $btn-hover-bg-shade-amount), - $hover-border: shade-color($value, $btn-hover-border-shade-amount), - $active-background: shade-color($value, $btn-active-bg-shade-amount), - $active-border: shade-color($value, $btn-active-border-shade-amount) - ); - } @else if $color == "dark" { - @include button-variant( - $value, - $value, - $hover-background: tint-color($value, $btn-hover-bg-tint-amount), - $hover-border: tint-color($value, $btn-hover-border-tint-amount), - $active-background: tint-color($value, $btn-active-bg-tint-amount), - $active-border: tint-color($value, $btn-active-border-tint-amount) - ); - } @else { - @include button-variant($value, $value); - } - } -} - -@each $color, $value in $theme-colors { - .btn-outline-#{$color} { - @include button-outline-variant($value); - } -} -// scss-docs-end btn-variant-loops - - -// -// Link buttons -// - -// Make a button look and behave like a link -.btn-link { - --#{$prefix}btn-font-weight: #{$font-weight-normal}; - --#{$prefix}btn-color: #{$btn-link-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-hover-color: #{$btn-link-hover-color}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-active-color: #{$btn-link-hover-color}; - --#{$prefix}btn-active-border-color: transparent; - --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color}; - --#{$prefix}btn-disabled-border-color: transparent; - --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows - --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb}; - - text-decoration: $link-decoration; - @if $enable-gradients { - background-image: none; - } - - &:hover, - &:focus-visible { - text-decoration: $link-hover-decoration; - } - - &:focus-visible { - color: var(--#{$prefix}btn-color); - } - - &:hover { - color: var(--#{$prefix}btn-hover-color); - } - - // No need for an active state here -} - - -// -// Button Sizes -// - -.btn-lg { - @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); -} - -.btn-sm { - @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); -} diff --git a/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss b/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss deleted file mode 100644 index dcebe6a..0000000 --- a/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss +++ /dev/null @@ -1,238 +0,0 @@ -// -// Base styles -// - -.card { - // scss-docs-start card-css-vars - --#{$prefix}card-spacer-y: #{$card-spacer-y}; - --#{$prefix}card-spacer-x: #{$card-spacer-x}; - --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y}; - --#{$prefix}card-title-color: #{$card-title-color}; - --#{$prefix}card-subtitle-color: #{$card-subtitle-color}; - --#{$prefix}card-border-width: #{$card-border-width}; - --#{$prefix}card-border-color: #{$card-border-color}; - --#{$prefix}card-border-radius: #{$card-border-radius}; - --#{$prefix}card-box-shadow: #{$card-box-shadow}; - --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius}; - --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y}; - --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x}; - --#{$prefix}card-cap-bg: #{$card-cap-bg}; - --#{$prefix}card-cap-color: #{$card-cap-color}; - --#{$prefix}card-height: #{$card-height}; - --#{$prefix}card-color: #{$card-color}; - --#{$prefix}card-bg: #{$card-bg}; - --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding}; - --#{$prefix}card-group-margin: #{$card-group-margin}; - // scss-docs-end card-css-vars - - position: relative; - display: flex; - flex-direction: column; - min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 - height: var(--#{$prefix}card-height); - color: var(--#{$prefix}body-color); - word-wrap: break-word; - background-color: var(--#{$prefix}card-bg); - background-clip: border-box; - border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - @include border-radius(var(--#{$prefix}card-border-radius)); - @include box-shadow(var(--#{$prefix}card-box-shadow)); - - > hr { - margin-right: 0; - margin-left: 0; - } - - > .list-group { - border-top: inherit; - border-bottom: inherit; - - &:first-child { - border-top-width: 0; - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); - } - - &:last-child { - border-bottom-width: 0; - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); - } - } - - // Due to specificity of the above selector (`.card > .list-group`), we must - // use a child selector here to prevent double borders. - > .card-header + .list-group, - > .list-group + .card-footer { - border-top: 0; - } -} - -.card-body { - // Enable `flex-grow: 1` for decks and groups so that card blocks take up - // as much space as possible, ensuring footers are aligned to the bottom. - flex: 1 1 auto; - padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x); - color: var(--#{$prefix}card-color); -} - -.card-title { - margin-bottom: var(--#{$prefix}card-title-spacer-y); - color: var(--#{$prefix}card-title-color); -} - -.card-subtitle { - margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list - margin-bottom: 0; - color: var(--#{$prefix}card-subtitle-color); -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link { - &:hover { - text-decoration: if($link-hover-decoration == underline, none, null); - } - - + .card-link { - margin-left: var(--#{$prefix}card-spacer-x); - } -} - -// -// Optional textual caps -// - -.card-header { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - margin-bottom: 0; // Removes the default margin-bottom of - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:first-child { - @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0); - } -} - -.card-footer { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:last-child { - @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius)); - } -} - - -// -// Header navs -// - -.card-header-tabs { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - border-bottom: 0; - - .nav-link.active { - background-color: var(--#{$prefix}card-bg); - border-bottom-color: var(--#{$prefix}card-bg); - } -} - -.card-header-pills { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list -} - -// Card image -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: var(--#{$prefix}card-img-overlay-padding); - @include border-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch -} - -.card-img, -.card-img-top { - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-bottom { - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); -} - - -// -// Card groups -// - -.card-group { - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - margin-bottom: var(--#{$prefix}card-group-margin); - } - - @include media-breakpoint-up(sm) { - display: flex; - flex-flow: row wrap; - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - flex: 1 0 0; - margin-bottom: 0; - - + .card { - margin-left: 0; - border-left: 0; - } - - // Handle rounded corners - @if $enable-rounded { - &:not(:last-child) { - @include border-end-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-right-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-right-radius: 0; - } - } - - &:not(:first-child) { - @include border-start-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-left-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-left-radius: 0; - } - } - } - } - } -} diff --git a/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss b/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss deleted file mode 100644 index 5ebf6b1..0000000 --- a/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss +++ /dev/null @@ -1,226 +0,0 @@ -// Notes on the classes: -// -// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) -// even when their scroll action started on a carousel, but for compatibility (with Firefox) -// we're preventing all actions instead -// 2. The .carousel-item-start and .carousel-item-end is used to indicate where -// the active slide is heading. -// 3. .active.carousel-item is the current slide. -// 4. .active.carousel-item-start and .active.carousel-item-end is the current -// slide in its in-transition state. Only one of these occurs at a time. -// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end -// is the upcoming slide in transition. - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; - @include clearfix(); -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - @include transition($carousel-transition); -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); -} - - -// -// Alternate transitions -// - -.carousel-fade { - .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; - } - - .carousel-item.active, - .carousel-item-next.carousel-item-start, - .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; - } - - .active.carousel-item-start, - .active.carousel-item-end { - z-index: 0; - opacity: 0; - @include transition(opacity 0s $carousel-transition-duration); - } -} - - -// -// Left/right controls for nav -// - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - // Use flex for alignment (1-3) - display: flex; // 1. allow flex styles - align-items: center; // 2. vertically center contents - justify-content: center; // 3. horizontally center contents - width: $carousel-control-width; - padding: 0; - color: $carousel-control-color; - text-align: center; - background: none; - filter: var(--#{$prefix}carousel-control-icon-filter); - border: 0; - opacity: $carousel-control-opacity; - @include transition($carousel-control-transition); - - // Hover/focus state - &:hover, - &:focus { - color: $carousel-control-color; - text-decoration: none; - outline: 0; - opacity: $carousel-control-hover-opacity; - } -} -.carousel-control-prev { - left: 0; - background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); -} -.carousel-control-next { - right: 0; - background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); -} - -// Icons for within -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: $carousel-control-icon-width; - height: $carousel-control-icon-width; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; -} - -.carousel-control-prev-icon { - background-image: escape-svg($carousel-control-prev-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-next-icon-bg) + "*/"}; -} -.carousel-control-next-icon { - background-image: escape-svg($carousel-control-next-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-prev-icon-bg) + "*/"}; -} - -// Optional indicator pips/controls -// -// Add a container (such as a list) with the following class and add an item (ideally a focusable control, -// like a button) with data-bs-target for each slide your carousel holds. - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - // Use the .carousel-control's width as margin so we don't overlay those - margin-right: $carousel-control-width; - margin-bottom: 1rem; - margin-left: $carousel-control-width; - - [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: $carousel-indicator-width; - height: $carousel-indicator-height; - padding: 0; - margin-right: $carousel-indicator-spacer; - margin-left: $carousel-indicator-spacer; - text-indent: -999px; - cursor: pointer; - background-color: var(--#{$prefix}carousel-indicator-active-bg); - background-clip: padding-box; - border: 0; - // Use transparent borders to increase the hit area by 10px on top and bottom. - border-top: $carousel-indicator-hit-area-height solid transparent; - border-bottom: $carousel-indicator-hit-area-height solid transparent; - opacity: $carousel-indicator-opacity; - @include transition($carousel-indicator-transition); - } - - .active { - opacity: $carousel-indicator-active-opacity; - } -} - - -// Optional captions -// -// - -.carousel-caption { - position: absolute; - right: (100% - $carousel-caption-width) * .5; - bottom: $carousel-caption-spacer; - left: (100% - $carousel-caption-width) * .5; - padding-top: $carousel-caption-padding-y; - padding-bottom: $carousel-caption-padding-y; - color: var(--#{$prefix}carousel-caption-color); - text-align: center; -} - -// Dark mode carousel - -@mixin carousel-dark() { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg-dark}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color-dark}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter-dark}; -} - -.carousel-dark { - @include carousel-dark(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include carousel-dark(); - } -} diff --git a/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss b/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss deleted file mode 100644 index d53c96f..0000000 --- a/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss +++ /dev/null @@ -1,66 +0,0 @@ -// Transparent background and border properties included for button version. -// iOS requires the button element instead of an anchor tag. -// If you want the anchor version, it requires `href="#"`. -// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile - -.btn-close { - // scss-docs-start close-css-vars - --#{$prefix}btn-close-color: #{$btn-close-color}; - --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) }; - --#{$prefix}btn-close-opacity: #{$btn-close-opacity}; - --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity}; - --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow}; - --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity}; - --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity}; - // scss-docs-end close-css-vars - - box-sizing: content-box; - width: $btn-close-width; - height: $btn-close-height; - padding: $btn-close-padding-y $btn-close-padding-x; - color: var(--#{$prefix}btn-close-color); - background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements - filter: var(--#{$prefix}btn-close-filter); - border: 0; // for button elements - @include border-radius(); - opacity: var(--#{$prefix}btn-close-opacity); - - // Override 's hover style - &:hover { - color: var(--#{$prefix}btn-close-color); - text-decoration: none; - opacity: var(--#{$prefix}btn-close-hover-opacity); - } - - &:focus { - outline: 0; - box-shadow: var(--#{$prefix}btn-close-focus-shadow); - opacity: var(--#{$prefix}btn-close-focus-opacity); - } - - &:disabled, - &.disabled { - pointer-events: none; - user-select: none; - opacity: var(--#{$prefix}btn-close-disabled-opacity); - } -} - -@mixin btn-close-white() { - --#{$prefix}btn-close-filter: #{$btn-close-filter-dark}; -} - -.btn-close-white { - @include btn-close-white(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}btn-close-filter: #{$btn-close-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include btn-close-white(); - } -} diff --git a/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss b/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss deleted file mode 100644 index 83b3138..0000000 --- a/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss +++ /dev/null @@ -1,41 +0,0 @@ -// Container widths -// -// Set the container width, and override it for fixed navbars in media queries. - -@if $enable-container-classes { - // Single container class with breakpoint max-widths - .container, - // 100% wide container at all breakpoints - .container-fluid { - @include make-container(); - } - - // Responsive containers that are 100% wide until a breakpoint - @each $breakpoint, $container-max-width in $container-max-widths { - .container-#{$breakpoint} { - @extend .container-fluid; - } - - @include media-breakpoint-up($breakpoint, $grid-breakpoints) { - %responsive-container-#{$breakpoint} { - max-width: $container-max-width; - } - - // Extend each breakpoint which is smaller or equal to the current breakpoint - $extend-breakpoint: true; - - @each $name, $width in $grid-breakpoints { - @if ($extend-breakpoint) { - .container#{breakpoint-infix($name, $grid-breakpoints)} { - @extend %responsive-container-#{$breakpoint}; - } - - // Once the current breakpoint is reached, stop extending - @if ($breakpoint == $name) { - $extend-breakpoint: false; - } - } - } - } - } -} diff --git a/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss b/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss deleted file mode 100644 index 587ebb4..0000000 --- a/05_react/uebungen/u09_react-icons/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss +++ /dev/null @@ -1,250 +0,0 @@ -// The dropdown wrapper (`
      `) -.dropup, -.dropend, -.dropdown, -.dropstart, -.dropup-center, -.dropdown-center { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; - - // Generate the caret automatically - @include caret(); -} - -// The dropdown menu -.dropdown-menu { - // scss-docs-start dropdown-css-vars - --#{$prefix}dropdown-zindex: #{$zindex-dropdown}; - --#{$prefix}dropdown-min-width: #{$dropdown-min-width}; - --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x}; - --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y}; - --#{$prefix}dropdown-spacer: #{$dropdown-spacer}; - @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size); - --#{$prefix}dropdown-color: #{$dropdown-color}; - --#{$prefix}dropdown-bg: #{$dropdown-bg}; - --#{$prefix}dropdown-border-color: #{$dropdown-border-color}; - --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius}; - --#{$prefix}dropdown-border-width: #{$dropdown-border-width}; - --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius}; - --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg}; - --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y}; - --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow}; - --#{$prefix}dropdown-link-color: #{$dropdown-link-color}; - --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color}; - --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg}; - --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color}; - --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg}; - --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color}; - --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x}; - --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y}; - --#{$prefix}dropdown-header-color: #{$dropdown-header-color}; - --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x}; - --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y}; - // scss-docs-end dropdown-css-vars - - position: absolute; - z-index: var(--#{$prefix}dropdown-zindex); - display: none; // none by default, but block on "open" of the menu - min-width: var(--#{$prefix}dropdown-min-width); - padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x); - margin: 0; // Override default margin of ul - @include font-size(var(--#{$prefix}dropdown-font-size)); - color: var(--#{$prefix}dropdown-color); - text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) - list-style: none; - background-color: var(--#{$prefix}dropdown-bg); - background-clip: padding-box; - border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color); - @include border-radius(var(--#{$prefix}dropdown-border-radius)); - @include box-shadow(var(--#{$prefix}dropdown-box-shadow)); - - &[data-bs-popper] { - top: 100%; - left: 0; - margin-top: var(--#{$prefix}dropdown-spacer); - } - - @if $dropdown-padding-y == 0 { - > .dropdown-item:first-child, - > li:first-child .dropdown-item { - @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - > .dropdown-item:last-child, - > li:last-child .dropdown-item { - @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - - } -} - -// scss-docs-start responsive-breakpoints -// We deliberately hardcode the `bs-` prefix because we check -// this custom property in JS to determine Popper's positioning - -@each $breakpoint in map-keys($grid-breakpoints) { - @include media-breakpoint-up($breakpoint) { - $infix: breakpoint-infix($breakpoint, $grid-breakpoints); - - .dropdown-menu#{$infix}-start { - --bs-position: start; - - &[data-bs-popper] { - right: auto; - left: 0; - } - } - - .dropdown-menu#{$infix}-end { - --bs-position: end; - - &[data-bs-popper] { - right: 0; - left: auto; - } - } - } -} -// scss-docs-end responsive-breakpoints - -// Allow for dropdowns to go bottom up (aka, dropup-menu) -// Just add .dropup after the standard .dropdown class and you're set. -.dropup { - .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(up); - } -} - -.dropend { - .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(end); - &::after { - vertical-align: 0; - } - } -} - -.dropstart { - .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(start); - &::before { - vertical-align: 0; - } - } -} - - -// Dividers (basically an `
      `) within the dropdown -.dropdown-divider { - height: 0; - margin: var(--#{$prefix}dropdown-divider-margin-y) 0; - overflow: hidden; - border-top: 1px solid var(--#{$prefix}dropdown-divider-bg); - opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
      element -} - -// Links, buttons, and more within the dropdown menu -// -// `
      ` alignment by inheriting `text-align`. -// 3. Fix alignment for Safari - -th { - font-weight: $table-th-font-weight; // 1 - text-align: inherit; // 2 - text-align: -webkit-match-parent; // 3 -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - - -// Forms -// -// 1. Allow labels to use `margin` for spacing. - -label { - display: inline-block; // 1 -} - -// Remove the default `border-radius` that macOS Chrome adds. -// See https://github.com/twbs/bootstrap/issues/24093 - -button { - // stylelint-disable-next-line property-disallowed-list - border-radius: 0; -} - -// Explicitly remove focus outline in Chromium when it shouldn't be -// visible (e.g. as result of mouse click or touch tap). It already -// should be doing this automatically, but seems to currently be -// confused and applies its very visible two-tone outline anyway. - -button:focus:not(:focus-visible) { - outline: 0; -} - -// 1. Remove the margin in Firefox and Safari - -input, -button, -select, -optgroup, -textarea { - margin: 0; // 1 - font-family: inherit; - @include font-size(inherit); - line-height: inherit; -} - -// Remove the inheritance of text transform in Firefox -button, -select { - text-transform: none; -} -// Set the cursor for non-` - - - - - - - - ); -}; -export default InputAmount; diff --git a/05_react/uebungen/u10_input-price/src/components/inputs/InputPrice.jsx b/05_react/uebungen/u10_input-price/src/components/inputs/InputPrice.jsx deleted file mode 100644 index 8591343..0000000 --- a/05_react/uebungen/u10_input-price/src/components/inputs/InputPrice.jsx +++ /dev/null @@ -1,36 +0,0 @@ -import { FaDollarSign, FaEuroSign, FaYenSign } from 'react-icons/fa6'; - -const InputPrice = (props) => { - const { currency = '$' } = props; - - return ( -
      -
      - {currency === '$' && ( - - - - )} - - {currency === '€' && ( - - - - )} - {currency === '¥' && ( - - - - )} -
      -
      - ); -}; -export default InputPrice; diff --git a/05_react/uebungen/u10_input-price/src/main.jsx b/05_react/uebungen/u10_input-price/src/main.jsx deleted file mode 100644 index 489056a..0000000 --- a/05_react/uebungen/u10_input-price/src/main.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; - -// import 'bootstrap/dist/css/bootstrap.min.css'; -import './styles/main.scss'; - -import App from './App.jsx'; - -createRoot(document.getElementById('root')).render( - - - , -); diff --git a/05_react/uebungen/u10_input-price/src/styles/01_frameworks/_index.scss b/05_react/uebungen/u10_input-price/src/styles/01_frameworks/_index.scss deleted file mode 100644 index dcefbc9..0000000 --- a/05_react/uebungen/u10_input-price/src/styles/01_frameworks/_index.scss +++ /dev/null @@ -1,3 +0,0 @@ -// @import 'bootstrap-5.3.8/bootstrap-grid'; -@import 'bootstrap-5.3.8/bootstrap'; -// @import 'bulma-1.04/index' diff --git a/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss b/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss deleted file mode 100644 index e9f267f..0000000 --- a/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss +++ /dev/null @@ -1,153 +0,0 @@ -// -// Base styles -// - -.accordion { - // scss-docs-start accordion-css-vars - --#{$prefix}accordion-color: #{$accordion-color}; - --#{$prefix}accordion-bg: #{$accordion-bg}; - --#{$prefix}accordion-transition: #{$accordion-transition}; - --#{$prefix}accordion-border-color: #{$accordion-border-color}; - --#{$prefix}accordion-border-width: #{$accordion-border-width}; - --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; - --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; - --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; - --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; - --#{$prefix}accordion-btn-color: #{$accordion-button-color}; - --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; - --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; - --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; - --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; - --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; - --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; - --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; - --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; - --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; - // scss-docs-end accordion-css-vars -} - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); - @include font-size($font-size-base); - color: var(--#{$prefix}accordion-btn-color); - text-align: left; // Reset button style - background-color: var(--#{$prefix}accordion-btn-bg); - border: 0; - @include border-radius(0); - overflow-anchor: none; - @include transition(var(--#{$prefix}accordion-transition)); - - &:not(.collapsed) { - color: var(--#{$prefix}accordion-active-color); - background-color: var(--#{$prefix}accordion-active-bg); - box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list - - &::after { - background-image: var(--#{$prefix}accordion-btn-active-icon); - transform: var(--#{$prefix}accordion-btn-icon-transform); - } - } - - // Accordion icon - &::after { - flex-shrink: 0; - width: var(--#{$prefix}accordion-btn-icon-width); - height: var(--#{$prefix}accordion-btn-icon-width); - margin-left: auto; - content: ""; - background-image: var(--#{$prefix}accordion-btn-icon); - background-repeat: no-repeat; - background-size: var(--#{$prefix}accordion-btn-icon-width); - @include transition(var(--#{$prefix}accordion-btn-icon-transition)); - } - - &:hover { - z-index: 2; - } - - &:focus { - z-index: 3; - outline: 0; - box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); - } -} - -.accordion-header { - margin-bottom: 0; -} - -.accordion-item { - color: var(--#{$prefix}accordion-color); - background-color: var(--#{$prefix}accordion-bg); - border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); - - &:first-of-type { - @include border-top-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - &:not(:first-of-type) { - border-top: 0; - } - - // Only set a border-radius on the last item if the accordion is collapsed - &:last-of-type { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - &.collapsed { - @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - > .accordion-collapse { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - } - } -} - -.accordion-body { - padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); -} - - -// Flush accordion items -// -// Remove borders and border-radius to keep accordion items edge-to-edge. - -.accordion-flush { - > .accordion-item { - border-right: 0; - border-left: 0; - @include border-radius(0); - - &:first-child { border-top: 0; } - &:last-child { border-bottom: 0; } - - // stylelint-disable selector-max-class - > .accordion-collapse, - > .accordion-header .accordion-button, - > .accordion-header .accordion-button.collapsed { - @include border-radius(0); - } - // stylelint-enable selector-max-class - } -} - -@if $enable-dark-mode { - @include color-mode(dark) { - .accordion-button::after { - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; - } - } -} diff --git a/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss b/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss deleted file mode 100644 index b8cff9b..0000000 --- a/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss +++ /dev/null @@ -1,68 +0,0 @@ -// -// Base styles -// - -.alert { - // scss-docs-start alert-css-vars - --#{$prefix}alert-bg: transparent; - --#{$prefix}alert-padding-x: #{$alert-padding-x}; - --#{$prefix}alert-padding-y: #{$alert-padding-y}; - --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; - --#{$prefix}alert-color: inherit; - --#{$prefix}alert-border-color: transparent; - --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); - --#{$prefix}alert-border-radius: #{$alert-border-radius}; - --#{$prefix}alert-link-color: inherit; - // scss-docs-end alert-css-vars - - position: relative; - padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); - margin-bottom: var(--#{$prefix}alert-margin-bottom); - color: var(--#{$prefix}alert-color); - background-color: var(--#{$prefix}alert-bg); - border: var(--#{$prefix}alert-border); - @include border-radius(var(--#{$prefix}alert-border-radius)); -} - -// Headings for larger alerts -.alert-heading { - // Specified to prevent conflicts of changing $headings-color - color: inherit; -} - -// Provide class for links that match alerts -.alert-link { - font-weight: $alert-link-font-weight; - color: var(--#{$prefix}alert-link-color); -} - - -// Dismissible alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissible { - padding-right: $alert-dismissible-padding-r; - - // Adjust close link position - .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: $stretched-link-z-index + 1; - padding: $alert-padding-y * 1.25 $alert-padding-x; - } -} - - -// scss-docs-start alert-modifiers -// Generate contextual modifier classes for colorizing the alert -@each $state in map-keys($theme-colors) { - .alert-#{$state} { - --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); - --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); - --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); - --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); - } -} -// scss-docs-end alert-modifiers diff --git a/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss b/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss deleted file mode 100644 index cc3d269..0000000 --- a/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss +++ /dev/null @@ -1,38 +0,0 @@ -// Base class -// -// Requires one of the contextual, color modifier classes for `color` and -// `background-color`. - -.badge { - // scss-docs-start badge-css-vars - --#{$prefix}badge-padding-x: #{$badge-padding-x}; - --#{$prefix}badge-padding-y: #{$badge-padding-y}; - @include rfs($badge-font-size, --#{$prefix}badge-font-size); - --#{$prefix}badge-font-weight: #{$badge-font-weight}; - --#{$prefix}badge-color: #{$badge-color}; - --#{$prefix}badge-border-radius: #{$badge-border-radius}; - // scss-docs-end badge-css-vars - - display: inline-block; - padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x); - @include font-size(var(--#{$prefix}badge-font-size)); - font-weight: var(--#{$prefix}badge-font-weight); - line-height: 1; - color: var(--#{$prefix}badge-color); - text-align: center; - white-space: nowrap; - vertical-align: baseline; - @include border-radius(var(--#{$prefix}badge-border-radius)); - @include gradient-bg(); - - // Empty badges collapse automatically - &:empty { - display: none; - } -} - -// Quick fix for badges in buttons -.btn .badge { - position: relative; - top: -1px; -} diff --git a/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss b/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss deleted file mode 100644 index b8252ff..0000000 --- a/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss +++ /dev/null @@ -1,40 +0,0 @@ -.breadcrumb { - // scss-docs-start breadcrumb-css-vars - --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x}; - --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y}; - --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom}; - @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size); - --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg}; - --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius}; - --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color}; - --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x}; - --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color}; - // scss-docs-end breadcrumb-css-vars - - display: flex; - flex-wrap: wrap; - padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x); - margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom); - @include font-size(var(--#{$prefix}breadcrumb-font-size)); - list-style: none; - background-color: var(--#{$prefix}breadcrumb-bg); - @include border-radius(var(--#{$prefix}breadcrumb-border-radius)); -} - -.breadcrumb-item { - // The separator between breadcrumbs (by default, a forward-slash: "/") - + .breadcrumb-item { - padding-left: var(--#{$prefix}breadcrumb-item-padding-x); - - &::before { - float: left; // Suppress inline spacings and underlining of the separator - padding-right: var(--#{$prefix}breadcrumb-item-padding-x); - color: var(--#{$prefix}breadcrumb-divider-color); - content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; - } - } - - &.active { - color: var(--#{$prefix}breadcrumb-item-active-color); - } -} diff --git a/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss b/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss deleted file mode 100644 index 78e1252..0000000 --- a/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss +++ /dev/null @@ -1,147 +0,0 @@ -// Make the div behave like a button -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; // match .btn alignment given font-size hack above - - > .btn { - position: relative; - flex: 1 1 auto; - } - - // Bring the hover, focused, and "active" buttons to the front to overlay - // the borders properly - > .btn-check:checked + .btn, - > .btn-check:focus + .btn, - > .btn:hover, - > .btn:focus, - > .btn:active, - > .btn.active { - z-index: 1; - } -} - -// Optional: Group multiple button groups together for a toolbar -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; - - .input-group { - width: auto; - } -} - -.btn-group { - @include border-radius($btn-border-radius); - - // Prevent double borders when buttons are next to each other - > :not(.btn-check:first-child) + .btn, - > .btn-group:not(:first-child) { - margin-left: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn.dropdown-toggle-split:first-child, - > .btn-group:not(:last-child) > .btn { - @include border-end-radius(0); - } - - // The left radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-start-radius(0); - } -} - -// Sizing -// -// Remix the default button sizing classes into new ones for easier manipulation. - -.btn-group-sm > .btn { @extend .btn-sm; } -.btn-group-lg > .btn { @extend .btn-lg; } - - -// -// Split button dropdowns -// - -.dropdown-toggle-split { - padding-right: $btn-padding-x * .75; - padding-left: $btn-padding-x * .75; - - &::after, - .dropup &::after, - .dropend &::after { - margin-left: 0; - } - - .dropstart &::before { - margin-right: 0; - } -} - -.btn-sm + .dropdown-toggle-split { - padding-right: $btn-padding-x-sm * .75; - padding-left: $btn-padding-x-sm * .75; -} - -.btn-lg + .dropdown-toggle-split { - padding-right: $btn-padding-x-lg * .75; - padding-left: $btn-padding-x-lg * .75; -} - - -// The clickable button for toggling the menu -// Set the same inset shadow as the :active state -.btn-group.show .dropdown-toggle { - @include box-shadow($btn-active-box-shadow); - - // Show no shadow for `.btn-link` since it has no other button styles. - &.btn-link { - @include box-shadow(none); - } -} - - -// -// Vertical button groups -// - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; - - > .btn, - > .btn-group { - width: 100%; - } - - > .btn:not(:first-child), - > .btn-group:not(:first-child) { - margin-top: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn-group:not(:last-child) > .btn { - @include border-bottom-radius(0); - } - - // The top radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-top-radius(0); - } -} diff --git a/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss b/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss deleted file mode 100644 index caa4518..0000000 --- a/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss +++ /dev/null @@ -1,216 +0,0 @@ -// -// Base styles -// - -.btn { - // scss-docs-start btn-css-vars - --#{$prefix}btn-padding-x: #{$btn-padding-x}; - --#{$prefix}btn-padding-y: #{$btn-padding-y}; - --#{$prefix}btn-font-family: #{$btn-font-family}; - @include rfs($btn-font-size, --#{$prefix}btn-font-size); - --#{$prefix}btn-font-weight: #{$btn-font-weight}; - --#{$prefix}btn-line-height: #{$btn-line-height}; - --#{$prefix}btn-color: #{$btn-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-width: #{$btn-border-width}; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-border-radius: #{$btn-border-radius}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-box-shadow: #{$btn-box-shadow}; - --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity}; - --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5); - // scss-docs-end btn-css-vars - - display: inline-block; - padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x); - font-family: var(--#{$prefix}btn-font-family); - @include font-size(var(--#{$prefix}btn-font-size)); - font-weight: var(--#{$prefix}btn-font-weight); - line-height: var(--#{$prefix}btn-line-height); - color: var(--#{$prefix}btn-color); - text-align: center; - text-decoration: if($link-decoration == none, null, none); - white-space: $btn-white-space; - vertical-align: middle; - cursor: if($enable-button-pointers, pointer, null); - user-select: none; - border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color); - @include border-radius(var(--#{$prefix}btn-border-radius)); - @include gradient-bg(var(--#{$prefix}btn-bg)); - @include box-shadow(var(--#{$prefix}btn-box-shadow)); - @include transition($btn-transition); - - &:hover { - color: var(--#{$prefix}btn-hover-color); - text-decoration: if($link-hover-decoration == underline, none, null); - background-color: var(--#{$prefix}btn-hover-bg); - border-color: var(--#{$prefix}btn-hover-border-color); - } - - .btn-check + &:hover { - // override for the checkbox/radio buttons - color: var(--#{$prefix}btn-color); - background-color: var(--#{$prefix}btn-bg); - border-color: var(--#{$prefix}btn-border-color); - } - - &:focus-visible { - color: var(--#{$prefix}btn-hover-color); - @include gradient-bg(var(--#{$prefix}btn-hover-bg)); - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:focus-visible + & { - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:checked + &, - :not(.btn-check) + &:active, - &:first-child:active, - &.active, - &.show { - color: var(--#{$prefix}btn-active-color); - background-color: var(--#{$prefix}btn-active-bg); - // Remove CSS gradients if they're enabled - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-active-border-color); - @include box-shadow(var(--#{$prefix}btn-active-shadow)); - - &:focus-visible { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - } - - .btn-check:checked:focus-visible + & { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - &:disabled, - &.disabled, - fieldset:disabled & { - color: var(--#{$prefix}btn-disabled-color); - pointer-events: none; - background-color: var(--#{$prefix}btn-disabled-bg); - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-disabled-border-color); - opacity: var(--#{$prefix}btn-disabled-opacity); - @include box-shadow(none); - } -} - - -// -// Alternate buttons -// - -// scss-docs-start btn-variant-loops -@each $color, $value in $theme-colors { - .btn-#{$color} { - @if $color == "light" { - @include button-variant( - $value, - $value, - $hover-background: shade-color($value, $btn-hover-bg-shade-amount), - $hover-border: shade-color($value, $btn-hover-border-shade-amount), - $active-background: shade-color($value, $btn-active-bg-shade-amount), - $active-border: shade-color($value, $btn-active-border-shade-amount) - ); - } @else if $color == "dark" { - @include button-variant( - $value, - $value, - $hover-background: tint-color($value, $btn-hover-bg-tint-amount), - $hover-border: tint-color($value, $btn-hover-border-tint-amount), - $active-background: tint-color($value, $btn-active-bg-tint-amount), - $active-border: tint-color($value, $btn-active-border-tint-amount) - ); - } @else { - @include button-variant($value, $value); - } - } -} - -@each $color, $value in $theme-colors { - .btn-outline-#{$color} { - @include button-outline-variant($value); - } -} -// scss-docs-end btn-variant-loops - - -// -// Link buttons -// - -// Make a button look and behave like a link -.btn-link { - --#{$prefix}btn-font-weight: #{$font-weight-normal}; - --#{$prefix}btn-color: #{$btn-link-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-hover-color: #{$btn-link-hover-color}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-active-color: #{$btn-link-hover-color}; - --#{$prefix}btn-active-border-color: transparent; - --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color}; - --#{$prefix}btn-disabled-border-color: transparent; - --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows - --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb}; - - text-decoration: $link-decoration; - @if $enable-gradients { - background-image: none; - } - - &:hover, - &:focus-visible { - text-decoration: $link-hover-decoration; - } - - &:focus-visible { - color: var(--#{$prefix}btn-color); - } - - &:hover { - color: var(--#{$prefix}btn-hover-color); - } - - // No need for an active state here -} - - -// -// Button Sizes -// - -.btn-lg { - @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); -} - -.btn-sm { - @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); -} diff --git a/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss b/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss deleted file mode 100644 index dcebe6a..0000000 --- a/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss +++ /dev/null @@ -1,238 +0,0 @@ -// -// Base styles -// - -.card { - // scss-docs-start card-css-vars - --#{$prefix}card-spacer-y: #{$card-spacer-y}; - --#{$prefix}card-spacer-x: #{$card-spacer-x}; - --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y}; - --#{$prefix}card-title-color: #{$card-title-color}; - --#{$prefix}card-subtitle-color: #{$card-subtitle-color}; - --#{$prefix}card-border-width: #{$card-border-width}; - --#{$prefix}card-border-color: #{$card-border-color}; - --#{$prefix}card-border-radius: #{$card-border-radius}; - --#{$prefix}card-box-shadow: #{$card-box-shadow}; - --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius}; - --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y}; - --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x}; - --#{$prefix}card-cap-bg: #{$card-cap-bg}; - --#{$prefix}card-cap-color: #{$card-cap-color}; - --#{$prefix}card-height: #{$card-height}; - --#{$prefix}card-color: #{$card-color}; - --#{$prefix}card-bg: #{$card-bg}; - --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding}; - --#{$prefix}card-group-margin: #{$card-group-margin}; - // scss-docs-end card-css-vars - - position: relative; - display: flex; - flex-direction: column; - min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 - height: var(--#{$prefix}card-height); - color: var(--#{$prefix}body-color); - word-wrap: break-word; - background-color: var(--#{$prefix}card-bg); - background-clip: border-box; - border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - @include border-radius(var(--#{$prefix}card-border-radius)); - @include box-shadow(var(--#{$prefix}card-box-shadow)); - - > hr { - margin-right: 0; - margin-left: 0; - } - - > .list-group { - border-top: inherit; - border-bottom: inherit; - - &:first-child { - border-top-width: 0; - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); - } - - &:last-child { - border-bottom-width: 0; - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); - } - } - - // Due to specificity of the above selector (`.card > .list-group`), we must - // use a child selector here to prevent double borders. - > .card-header + .list-group, - > .list-group + .card-footer { - border-top: 0; - } -} - -.card-body { - // Enable `flex-grow: 1` for decks and groups so that card blocks take up - // as much space as possible, ensuring footers are aligned to the bottom. - flex: 1 1 auto; - padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x); - color: var(--#{$prefix}card-color); -} - -.card-title { - margin-bottom: var(--#{$prefix}card-title-spacer-y); - color: var(--#{$prefix}card-title-color); -} - -.card-subtitle { - margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list - margin-bottom: 0; - color: var(--#{$prefix}card-subtitle-color); -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link { - &:hover { - text-decoration: if($link-hover-decoration == underline, none, null); - } - - + .card-link { - margin-left: var(--#{$prefix}card-spacer-x); - } -} - -// -// Optional textual caps -// - -.card-header { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - margin-bottom: 0; // Removes the default margin-bottom of - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:first-child { - @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0); - } -} - -.card-footer { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:last-child { - @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius)); - } -} - - -// -// Header navs -// - -.card-header-tabs { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - border-bottom: 0; - - .nav-link.active { - background-color: var(--#{$prefix}card-bg); - border-bottom-color: var(--#{$prefix}card-bg); - } -} - -.card-header-pills { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list -} - -// Card image -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: var(--#{$prefix}card-img-overlay-padding); - @include border-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch -} - -.card-img, -.card-img-top { - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-bottom { - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); -} - - -// -// Card groups -// - -.card-group { - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - margin-bottom: var(--#{$prefix}card-group-margin); - } - - @include media-breakpoint-up(sm) { - display: flex; - flex-flow: row wrap; - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - flex: 1 0 0; - margin-bottom: 0; - - + .card { - margin-left: 0; - border-left: 0; - } - - // Handle rounded corners - @if $enable-rounded { - &:not(:last-child) { - @include border-end-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-right-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-right-radius: 0; - } - } - - &:not(:first-child) { - @include border-start-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-left-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-left-radius: 0; - } - } - } - } - } -} diff --git a/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss b/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss deleted file mode 100644 index 5ebf6b1..0000000 --- a/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss +++ /dev/null @@ -1,226 +0,0 @@ -// Notes on the classes: -// -// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) -// even when their scroll action started on a carousel, but for compatibility (with Firefox) -// we're preventing all actions instead -// 2. The .carousel-item-start and .carousel-item-end is used to indicate where -// the active slide is heading. -// 3. .active.carousel-item is the current slide. -// 4. .active.carousel-item-start and .active.carousel-item-end is the current -// slide in its in-transition state. Only one of these occurs at a time. -// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end -// is the upcoming slide in transition. - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; - @include clearfix(); -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - @include transition($carousel-transition); -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); -} - - -// -// Alternate transitions -// - -.carousel-fade { - .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; - } - - .carousel-item.active, - .carousel-item-next.carousel-item-start, - .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; - } - - .active.carousel-item-start, - .active.carousel-item-end { - z-index: 0; - opacity: 0; - @include transition(opacity 0s $carousel-transition-duration); - } -} - - -// -// Left/right controls for nav -// - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - // Use flex for alignment (1-3) - display: flex; // 1. allow flex styles - align-items: center; // 2. vertically center contents - justify-content: center; // 3. horizontally center contents - width: $carousel-control-width; - padding: 0; - color: $carousel-control-color; - text-align: center; - background: none; - filter: var(--#{$prefix}carousel-control-icon-filter); - border: 0; - opacity: $carousel-control-opacity; - @include transition($carousel-control-transition); - - // Hover/focus state - &:hover, - &:focus { - color: $carousel-control-color; - text-decoration: none; - outline: 0; - opacity: $carousel-control-hover-opacity; - } -} -.carousel-control-prev { - left: 0; - background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); -} -.carousel-control-next { - right: 0; - background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); -} - -// Icons for within -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: $carousel-control-icon-width; - height: $carousel-control-icon-width; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; -} - -.carousel-control-prev-icon { - background-image: escape-svg($carousel-control-prev-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-next-icon-bg) + "*/"}; -} -.carousel-control-next-icon { - background-image: escape-svg($carousel-control-next-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-prev-icon-bg) + "*/"}; -} - -// Optional indicator pips/controls -// -// Add a container (such as a list) with the following class and add an item (ideally a focusable control, -// like a button) with data-bs-target for each slide your carousel holds. - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - // Use the .carousel-control's width as margin so we don't overlay those - margin-right: $carousel-control-width; - margin-bottom: 1rem; - margin-left: $carousel-control-width; - - [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: $carousel-indicator-width; - height: $carousel-indicator-height; - padding: 0; - margin-right: $carousel-indicator-spacer; - margin-left: $carousel-indicator-spacer; - text-indent: -999px; - cursor: pointer; - background-color: var(--#{$prefix}carousel-indicator-active-bg); - background-clip: padding-box; - border: 0; - // Use transparent borders to increase the hit area by 10px on top and bottom. - border-top: $carousel-indicator-hit-area-height solid transparent; - border-bottom: $carousel-indicator-hit-area-height solid transparent; - opacity: $carousel-indicator-opacity; - @include transition($carousel-indicator-transition); - } - - .active { - opacity: $carousel-indicator-active-opacity; - } -} - - -// Optional captions -// -// - -.carousel-caption { - position: absolute; - right: (100% - $carousel-caption-width) * .5; - bottom: $carousel-caption-spacer; - left: (100% - $carousel-caption-width) * .5; - padding-top: $carousel-caption-padding-y; - padding-bottom: $carousel-caption-padding-y; - color: var(--#{$prefix}carousel-caption-color); - text-align: center; -} - -// Dark mode carousel - -@mixin carousel-dark() { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg-dark}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color-dark}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter-dark}; -} - -.carousel-dark { - @include carousel-dark(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include carousel-dark(); - } -} diff --git a/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss b/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss deleted file mode 100644 index d53c96f..0000000 --- a/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss +++ /dev/null @@ -1,66 +0,0 @@ -// Transparent background and border properties included for button version. -// iOS requires the button element instead of an anchor tag. -// If you want the anchor version, it requires `href="#"`. -// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile - -.btn-close { - // scss-docs-start close-css-vars - --#{$prefix}btn-close-color: #{$btn-close-color}; - --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) }; - --#{$prefix}btn-close-opacity: #{$btn-close-opacity}; - --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity}; - --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow}; - --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity}; - --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity}; - // scss-docs-end close-css-vars - - box-sizing: content-box; - width: $btn-close-width; - height: $btn-close-height; - padding: $btn-close-padding-y $btn-close-padding-x; - color: var(--#{$prefix}btn-close-color); - background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements - filter: var(--#{$prefix}btn-close-filter); - border: 0; // for button elements - @include border-radius(); - opacity: var(--#{$prefix}btn-close-opacity); - - // Override 's hover style - &:hover { - color: var(--#{$prefix}btn-close-color); - text-decoration: none; - opacity: var(--#{$prefix}btn-close-hover-opacity); - } - - &:focus { - outline: 0; - box-shadow: var(--#{$prefix}btn-close-focus-shadow); - opacity: var(--#{$prefix}btn-close-focus-opacity); - } - - &:disabled, - &.disabled { - pointer-events: none; - user-select: none; - opacity: var(--#{$prefix}btn-close-disabled-opacity); - } -} - -@mixin btn-close-white() { - --#{$prefix}btn-close-filter: #{$btn-close-filter-dark}; -} - -.btn-close-white { - @include btn-close-white(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}btn-close-filter: #{$btn-close-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include btn-close-white(); - } -} diff --git a/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss b/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss deleted file mode 100644 index 83b3138..0000000 --- a/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss +++ /dev/null @@ -1,41 +0,0 @@ -// Container widths -// -// Set the container width, and override it for fixed navbars in media queries. - -@if $enable-container-classes { - // Single container class with breakpoint max-widths - .container, - // 100% wide container at all breakpoints - .container-fluid { - @include make-container(); - } - - // Responsive containers that are 100% wide until a breakpoint - @each $breakpoint, $container-max-width in $container-max-widths { - .container-#{$breakpoint} { - @extend .container-fluid; - } - - @include media-breakpoint-up($breakpoint, $grid-breakpoints) { - %responsive-container-#{$breakpoint} { - max-width: $container-max-width; - } - - // Extend each breakpoint which is smaller or equal to the current breakpoint - $extend-breakpoint: true; - - @each $name, $width in $grid-breakpoints { - @if ($extend-breakpoint) { - .container#{breakpoint-infix($name, $grid-breakpoints)} { - @extend %responsive-container-#{$breakpoint}; - } - - // Once the current breakpoint is reached, stop extending - @if ($breakpoint == $name) { - $extend-breakpoint: false; - } - } - } - } - } -} diff --git a/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss b/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss deleted file mode 100644 index 587ebb4..0000000 --- a/05_react/uebungen/u10_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss +++ /dev/null @@ -1,250 +0,0 @@ -// The dropdown wrapper (`
      `) -.dropup, -.dropend, -.dropdown, -.dropstart, -.dropup-center, -.dropdown-center { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; - - // Generate the caret automatically - @include caret(); -} - -// The dropdown menu -.dropdown-menu { - // scss-docs-start dropdown-css-vars - --#{$prefix}dropdown-zindex: #{$zindex-dropdown}; - --#{$prefix}dropdown-min-width: #{$dropdown-min-width}; - --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x}; - --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y}; - --#{$prefix}dropdown-spacer: #{$dropdown-spacer}; - @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size); - --#{$prefix}dropdown-color: #{$dropdown-color}; - --#{$prefix}dropdown-bg: #{$dropdown-bg}; - --#{$prefix}dropdown-border-color: #{$dropdown-border-color}; - --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius}; - --#{$prefix}dropdown-border-width: #{$dropdown-border-width}; - --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius}; - --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg}; - --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y}; - --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow}; - --#{$prefix}dropdown-link-color: #{$dropdown-link-color}; - --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color}; - --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg}; - --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color}; - --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg}; - --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color}; - --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x}; - --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y}; - --#{$prefix}dropdown-header-color: #{$dropdown-header-color}; - --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x}; - --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y}; - // scss-docs-end dropdown-css-vars - - position: absolute; - z-index: var(--#{$prefix}dropdown-zindex); - display: none; // none by default, but block on "open" of the menu - min-width: var(--#{$prefix}dropdown-min-width); - padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x); - margin: 0; // Override default margin of ul - @include font-size(var(--#{$prefix}dropdown-font-size)); - color: var(--#{$prefix}dropdown-color); - text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) - list-style: none; - background-color: var(--#{$prefix}dropdown-bg); - background-clip: padding-box; - border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color); - @include border-radius(var(--#{$prefix}dropdown-border-radius)); - @include box-shadow(var(--#{$prefix}dropdown-box-shadow)); - - &[data-bs-popper] { - top: 100%; - left: 0; - margin-top: var(--#{$prefix}dropdown-spacer); - } - - @if $dropdown-padding-y == 0 { - > .dropdown-item:first-child, - > li:first-child .dropdown-item { - @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - > .dropdown-item:last-child, - > li:last-child .dropdown-item { - @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - - } -} - -// scss-docs-start responsive-breakpoints -// We deliberately hardcode the `bs-` prefix because we check -// this custom property in JS to determine Popper's positioning - -@each $breakpoint in map-keys($grid-breakpoints) { - @include media-breakpoint-up($breakpoint) { - $infix: breakpoint-infix($breakpoint, $grid-breakpoints); - - .dropdown-menu#{$infix}-start { - --bs-position: start; - - &[data-bs-popper] { - right: auto; - left: 0; - } - } - - .dropdown-menu#{$infix}-end { - --bs-position: end; - - &[data-bs-popper] { - right: 0; - left: auto; - } - } - } -} -// scss-docs-end responsive-breakpoints - -// Allow for dropdowns to go bottom up (aka, dropup-menu) -// Just add .dropup after the standard .dropdown class and you're set. -.dropup { - .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(up); - } -} - -.dropend { - .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(end); - &::after { - vertical-align: 0; - } - } -} - -.dropstart { - .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(start); - &::before { - vertical-align: 0; - } - } -} - - -// Dividers (basically an `
      `) within the dropdown -.dropdown-divider { - height: 0; - margin: var(--#{$prefix}dropdown-divider-margin-y) 0; - overflow: hidden; - border-top: 1px solid var(--#{$prefix}dropdown-divider-bg); - opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
      element -} - -// Links, buttons, and more within the dropdown menu -// -// `
      ` alignment by inheriting `text-align`. -// 3. Fix alignment for Safari - -th { - font-weight: $table-th-font-weight; // 1 - text-align: inherit; // 2 - text-align: -webkit-match-parent; // 3 -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - - -// Forms -// -// 1. Allow labels to use `margin` for spacing. - -label { - display: inline-block; // 1 -} - -// Remove the default `border-radius` that macOS Chrome adds. -// See https://github.com/twbs/bootstrap/issues/24093 - -button { - // stylelint-disable-next-line property-disallowed-list - border-radius: 0; -} - -// Explicitly remove focus outline in Chromium when it shouldn't be -// visible (e.g. as result of mouse click or touch tap). It already -// should be doing this automatically, but seems to currently be -// confused and applies its very visible two-tone outline anyway. - -button:focus:not(:focus-visible) { - outline: 0; -} - -// 1. Remove the margin in Firefox and Safari - -input, -button, -select, -optgroup, -textarea { - margin: 0; // 1 - font-family: inherit; - @include font-size(inherit); - line-height: inherit; -} - -// Remove the inheritance of text transform in Firefox -button, -select { - text-transform: none; -} -// Set the cursor for non-` - - - - - - - - ); -}; -export default InputAmount; diff --git a/05_react/uebungen/u11_footer-main/src/main.jsx b/05_react/uebungen/u11_footer-main/src/main.jsx deleted file mode 100644 index 489056a..0000000 --- a/05_react/uebungen/u11_footer-main/src/main.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; - -// import 'bootstrap/dist/css/bootstrap.min.css'; -import './styles/main.scss'; - -import App from './App.jsx'; - -createRoot(document.getElementById('root')).render( - - - , -); diff --git a/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/_index.scss b/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/_index.scss deleted file mode 100644 index dcefbc9..0000000 --- a/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/_index.scss +++ /dev/null @@ -1,3 +0,0 @@ -// @import 'bootstrap-5.3.8/bootstrap-grid'; -@import 'bootstrap-5.3.8/bootstrap'; -// @import 'bulma-1.04/index' diff --git a/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss b/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss deleted file mode 100644 index e9f267f..0000000 --- a/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss +++ /dev/null @@ -1,153 +0,0 @@ -// -// Base styles -// - -.accordion { - // scss-docs-start accordion-css-vars - --#{$prefix}accordion-color: #{$accordion-color}; - --#{$prefix}accordion-bg: #{$accordion-bg}; - --#{$prefix}accordion-transition: #{$accordion-transition}; - --#{$prefix}accordion-border-color: #{$accordion-border-color}; - --#{$prefix}accordion-border-width: #{$accordion-border-width}; - --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; - --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; - --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; - --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; - --#{$prefix}accordion-btn-color: #{$accordion-button-color}; - --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; - --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; - --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; - --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; - --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; - --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; - --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; - --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; - --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; - // scss-docs-end accordion-css-vars -} - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); - @include font-size($font-size-base); - color: var(--#{$prefix}accordion-btn-color); - text-align: left; // Reset button style - background-color: var(--#{$prefix}accordion-btn-bg); - border: 0; - @include border-radius(0); - overflow-anchor: none; - @include transition(var(--#{$prefix}accordion-transition)); - - &:not(.collapsed) { - color: var(--#{$prefix}accordion-active-color); - background-color: var(--#{$prefix}accordion-active-bg); - box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list - - &::after { - background-image: var(--#{$prefix}accordion-btn-active-icon); - transform: var(--#{$prefix}accordion-btn-icon-transform); - } - } - - // Accordion icon - &::after { - flex-shrink: 0; - width: var(--#{$prefix}accordion-btn-icon-width); - height: var(--#{$prefix}accordion-btn-icon-width); - margin-left: auto; - content: ""; - background-image: var(--#{$prefix}accordion-btn-icon); - background-repeat: no-repeat; - background-size: var(--#{$prefix}accordion-btn-icon-width); - @include transition(var(--#{$prefix}accordion-btn-icon-transition)); - } - - &:hover { - z-index: 2; - } - - &:focus { - z-index: 3; - outline: 0; - box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); - } -} - -.accordion-header { - margin-bottom: 0; -} - -.accordion-item { - color: var(--#{$prefix}accordion-color); - background-color: var(--#{$prefix}accordion-bg); - border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); - - &:first-of-type { - @include border-top-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - &:not(:first-of-type) { - border-top: 0; - } - - // Only set a border-radius on the last item if the accordion is collapsed - &:last-of-type { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - &.collapsed { - @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - > .accordion-collapse { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - } - } -} - -.accordion-body { - padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); -} - - -// Flush accordion items -// -// Remove borders and border-radius to keep accordion items edge-to-edge. - -.accordion-flush { - > .accordion-item { - border-right: 0; - border-left: 0; - @include border-radius(0); - - &:first-child { border-top: 0; } - &:last-child { border-bottom: 0; } - - // stylelint-disable selector-max-class - > .accordion-collapse, - > .accordion-header .accordion-button, - > .accordion-header .accordion-button.collapsed { - @include border-radius(0); - } - // stylelint-enable selector-max-class - } -} - -@if $enable-dark-mode { - @include color-mode(dark) { - .accordion-button::after { - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; - } - } -} diff --git a/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss b/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss deleted file mode 100644 index b8cff9b..0000000 --- a/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss +++ /dev/null @@ -1,68 +0,0 @@ -// -// Base styles -// - -.alert { - // scss-docs-start alert-css-vars - --#{$prefix}alert-bg: transparent; - --#{$prefix}alert-padding-x: #{$alert-padding-x}; - --#{$prefix}alert-padding-y: #{$alert-padding-y}; - --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; - --#{$prefix}alert-color: inherit; - --#{$prefix}alert-border-color: transparent; - --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); - --#{$prefix}alert-border-radius: #{$alert-border-radius}; - --#{$prefix}alert-link-color: inherit; - // scss-docs-end alert-css-vars - - position: relative; - padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); - margin-bottom: var(--#{$prefix}alert-margin-bottom); - color: var(--#{$prefix}alert-color); - background-color: var(--#{$prefix}alert-bg); - border: var(--#{$prefix}alert-border); - @include border-radius(var(--#{$prefix}alert-border-radius)); -} - -// Headings for larger alerts -.alert-heading { - // Specified to prevent conflicts of changing $headings-color - color: inherit; -} - -// Provide class for links that match alerts -.alert-link { - font-weight: $alert-link-font-weight; - color: var(--#{$prefix}alert-link-color); -} - - -// Dismissible alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissible { - padding-right: $alert-dismissible-padding-r; - - // Adjust close link position - .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: $stretched-link-z-index + 1; - padding: $alert-padding-y * 1.25 $alert-padding-x; - } -} - - -// scss-docs-start alert-modifiers -// Generate contextual modifier classes for colorizing the alert -@each $state in map-keys($theme-colors) { - .alert-#{$state} { - --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); - --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); - --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); - --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); - } -} -// scss-docs-end alert-modifiers diff --git a/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss b/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss deleted file mode 100644 index cc3d269..0000000 --- a/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss +++ /dev/null @@ -1,38 +0,0 @@ -// Base class -// -// Requires one of the contextual, color modifier classes for `color` and -// `background-color`. - -.badge { - // scss-docs-start badge-css-vars - --#{$prefix}badge-padding-x: #{$badge-padding-x}; - --#{$prefix}badge-padding-y: #{$badge-padding-y}; - @include rfs($badge-font-size, --#{$prefix}badge-font-size); - --#{$prefix}badge-font-weight: #{$badge-font-weight}; - --#{$prefix}badge-color: #{$badge-color}; - --#{$prefix}badge-border-radius: #{$badge-border-radius}; - // scss-docs-end badge-css-vars - - display: inline-block; - padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x); - @include font-size(var(--#{$prefix}badge-font-size)); - font-weight: var(--#{$prefix}badge-font-weight); - line-height: 1; - color: var(--#{$prefix}badge-color); - text-align: center; - white-space: nowrap; - vertical-align: baseline; - @include border-radius(var(--#{$prefix}badge-border-radius)); - @include gradient-bg(); - - // Empty badges collapse automatically - &:empty { - display: none; - } -} - -// Quick fix for badges in buttons -.btn .badge { - position: relative; - top: -1px; -} diff --git a/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss b/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss deleted file mode 100644 index b8252ff..0000000 --- a/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss +++ /dev/null @@ -1,40 +0,0 @@ -.breadcrumb { - // scss-docs-start breadcrumb-css-vars - --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x}; - --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y}; - --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom}; - @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size); - --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg}; - --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius}; - --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color}; - --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x}; - --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color}; - // scss-docs-end breadcrumb-css-vars - - display: flex; - flex-wrap: wrap; - padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x); - margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom); - @include font-size(var(--#{$prefix}breadcrumb-font-size)); - list-style: none; - background-color: var(--#{$prefix}breadcrumb-bg); - @include border-radius(var(--#{$prefix}breadcrumb-border-radius)); -} - -.breadcrumb-item { - // The separator between breadcrumbs (by default, a forward-slash: "/") - + .breadcrumb-item { - padding-left: var(--#{$prefix}breadcrumb-item-padding-x); - - &::before { - float: left; // Suppress inline spacings and underlining of the separator - padding-right: var(--#{$prefix}breadcrumb-item-padding-x); - color: var(--#{$prefix}breadcrumb-divider-color); - content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; - } - } - - &.active { - color: var(--#{$prefix}breadcrumb-item-active-color); - } -} diff --git a/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss b/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss deleted file mode 100644 index 78e1252..0000000 --- a/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss +++ /dev/null @@ -1,147 +0,0 @@ -// Make the div behave like a button -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; // match .btn alignment given font-size hack above - - > .btn { - position: relative; - flex: 1 1 auto; - } - - // Bring the hover, focused, and "active" buttons to the front to overlay - // the borders properly - > .btn-check:checked + .btn, - > .btn-check:focus + .btn, - > .btn:hover, - > .btn:focus, - > .btn:active, - > .btn.active { - z-index: 1; - } -} - -// Optional: Group multiple button groups together for a toolbar -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; - - .input-group { - width: auto; - } -} - -.btn-group { - @include border-radius($btn-border-radius); - - // Prevent double borders when buttons are next to each other - > :not(.btn-check:first-child) + .btn, - > .btn-group:not(:first-child) { - margin-left: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn.dropdown-toggle-split:first-child, - > .btn-group:not(:last-child) > .btn { - @include border-end-radius(0); - } - - // The left radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-start-radius(0); - } -} - -// Sizing -// -// Remix the default button sizing classes into new ones for easier manipulation. - -.btn-group-sm > .btn { @extend .btn-sm; } -.btn-group-lg > .btn { @extend .btn-lg; } - - -// -// Split button dropdowns -// - -.dropdown-toggle-split { - padding-right: $btn-padding-x * .75; - padding-left: $btn-padding-x * .75; - - &::after, - .dropup &::after, - .dropend &::after { - margin-left: 0; - } - - .dropstart &::before { - margin-right: 0; - } -} - -.btn-sm + .dropdown-toggle-split { - padding-right: $btn-padding-x-sm * .75; - padding-left: $btn-padding-x-sm * .75; -} - -.btn-lg + .dropdown-toggle-split { - padding-right: $btn-padding-x-lg * .75; - padding-left: $btn-padding-x-lg * .75; -} - - -// The clickable button for toggling the menu -// Set the same inset shadow as the :active state -.btn-group.show .dropdown-toggle { - @include box-shadow($btn-active-box-shadow); - - // Show no shadow for `.btn-link` since it has no other button styles. - &.btn-link { - @include box-shadow(none); - } -} - - -// -// Vertical button groups -// - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; - - > .btn, - > .btn-group { - width: 100%; - } - - > .btn:not(:first-child), - > .btn-group:not(:first-child) { - margin-top: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn-group:not(:last-child) > .btn { - @include border-bottom-radius(0); - } - - // The top radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-top-radius(0); - } -} diff --git a/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss b/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss deleted file mode 100644 index caa4518..0000000 --- a/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss +++ /dev/null @@ -1,216 +0,0 @@ -// -// Base styles -// - -.btn { - // scss-docs-start btn-css-vars - --#{$prefix}btn-padding-x: #{$btn-padding-x}; - --#{$prefix}btn-padding-y: #{$btn-padding-y}; - --#{$prefix}btn-font-family: #{$btn-font-family}; - @include rfs($btn-font-size, --#{$prefix}btn-font-size); - --#{$prefix}btn-font-weight: #{$btn-font-weight}; - --#{$prefix}btn-line-height: #{$btn-line-height}; - --#{$prefix}btn-color: #{$btn-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-width: #{$btn-border-width}; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-border-radius: #{$btn-border-radius}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-box-shadow: #{$btn-box-shadow}; - --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity}; - --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5); - // scss-docs-end btn-css-vars - - display: inline-block; - padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x); - font-family: var(--#{$prefix}btn-font-family); - @include font-size(var(--#{$prefix}btn-font-size)); - font-weight: var(--#{$prefix}btn-font-weight); - line-height: var(--#{$prefix}btn-line-height); - color: var(--#{$prefix}btn-color); - text-align: center; - text-decoration: if($link-decoration == none, null, none); - white-space: $btn-white-space; - vertical-align: middle; - cursor: if($enable-button-pointers, pointer, null); - user-select: none; - border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color); - @include border-radius(var(--#{$prefix}btn-border-radius)); - @include gradient-bg(var(--#{$prefix}btn-bg)); - @include box-shadow(var(--#{$prefix}btn-box-shadow)); - @include transition($btn-transition); - - &:hover { - color: var(--#{$prefix}btn-hover-color); - text-decoration: if($link-hover-decoration == underline, none, null); - background-color: var(--#{$prefix}btn-hover-bg); - border-color: var(--#{$prefix}btn-hover-border-color); - } - - .btn-check + &:hover { - // override for the checkbox/radio buttons - color: var(--#{$prefix}btn-color); - background-color: var(--#{$prefix}btn-bg); - border-color: var(--#{$prefix}btn-border-color); - } - - &:focus-visible { - color: var(--#{$prefix}btn-hover-color); - @include gradient-bg(var(--#{$prefix}btn-hover-bg)); - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:focus-visible + & { - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:checked + &, - :not(.btn-check) + &:active, - &:first-child:active, - &.active, - &.show { - color: var(--#{$prefix}btn-active-color); - background-color: var(--#{$prefix}btn-active-bg); - // Remove CSS gradients if they're enabled - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-active-border-color); - @include box-shadow(var(--#{$prefix}btn-active-shadow)); - - &:focus-visible { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - } - - .btn-check:checked:focus-visible + & { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - &:disabled, - &.disabled, - fieldset:disabled & { - color: var(--#{$prefix}btn-disabled-color); - pointer-events: none; - background-color: var(--#{$prefix}btn-disabled-bg); - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-disabled-border-color); - opacity: var(--#{$prefix}btn-disabled-opacity); - @include box-shadow(none); - } -} - - -// -// Alternate buttons -// - -// scss-docs-start btn-variant-loops -@each $color, $value in $theme-colors { - .btn-#{$color} { - @if $color == "light" { - @include button-variant( - $value, - $value, - $hover-background: shade-color($value, $btn-hover-bg-shade-amount), - $hover-border: shade-color($value, $btn-hover-border-shade-amount), - $active-background: shade-color($value, $btn-active-bg-shade-amount), - $active-border: shade-color($value, $btn-active-border-shade-amount) - ); - } @else if $color == "dark" { - @include button-variant( - $value, - $value, - $hover-background: tint-color($value, $btn-hover-bg-tint-amount), - $hover-border: tint-color($value, $btn-hover-border-tint-amount), - $active-background: tint-color($value, $btn-active-bg-tint-amount), - $active-border: tint-color($value, $btn-active-border-tint-amount) - ); - } @else { - @include button-variant($value, $value); - } - } -} - -@each $color, $value in $theme-colors { - .btn-outline-#{$color} { - @include button-outline-variant($value); - } -} -// scss-docs-end btn-variant-loops - - -// -// Link buttons -// - -// Make a button look and behave like a link -.btn-link { - --#{$prefix}btn-font-weight: #{$font-weight-normal}; - --#{$prefix}btn-color: #{$btn-link-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-hover-color: #{$btn-link-hover-color}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-active-color: #{$btn-link-hover-color}; - --#{$prefix}btn-active-border-color: transparent; - --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color}; - --#{$prefix}btn-disabled-border-color: transparent; - --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows - --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb}; - - text-decoration: $link-decoration; - @if $enable-gradients { - background-image: none; - } - - &:hover, - &:focus-visible { - text-decoration: $link-hover-decoration; - } - - &:focus-visible { - color: var(--#{$prefix}btn-color); - } - - &:hover { - color: var(--#{$prefix}btn-hover-color); - } - - // No need for an active state here -} - - -// -// Button Sizes -// - -.btn-lg { - @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); -} - -.btn-sm { - @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); -} diff --git a/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss b/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss deleted file mode 100644 index dcebe6a..0000000 --- a/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss +++ /dev/null @@ -1,238 +0,0 @@ -// -// Base styles -// - -.card { - // scss-docs-start card-css-vars - --#{$prefix}card-spacer-y: #{$card-spacer-y}; - --#{$prefix}card-spacer-x: #{$card-spacer-x}; - --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y}; - --#{$prefix}card-title-color: #{$card-title-color}; - --#{$prefix}card-subtitle-color: #{$card-subtitle-color}; - --#{$prefix}card-border-width: #{$card-border-width}; - --#{$prefix}card-border-color: #{$card-border-color}; - --#{$prefix}card-border-radius: #{$card-border-radius}; - --#{$prefix}card-box-shadow: #{$card-box-shadow}; - --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius}; - --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y}; - --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x}; - --#{$prefix}card-cap-bg: #{$card-cap-bg}; - --#{$prefix}card-cap-color: #{$card-cap-color}; - --#{$prefix}card-height: #{$card-height}; - --#{$prefix}card-color: #{$card-color}; - --#{$prefix}card-bg: #{$card-bg}; - --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding}; - --#{$prefix}card-group-margin: #{$card-group-margin}; - // scss-docs-end card-css-vars - - position: relative; - display: flex; - flex-direction: column; - min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 - height: var(--#{$prefix}card-height); - color: var(--#{$prefix}body-color); - word-wrap: break-word; - background-color: var(--#{$prefix}card-bg); - background-clip: border-box; - border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - @include border-radius(var(--#{$prefix}card-border-radius)); - @include box-shadow(var(--#{$prefix}card-box-shadow)); - - > hr { - margin-right: 0; - margin-left: 0; - } - - > .list-group { - border-top: inherit; - border-bottom: inherit; - - &:first-child { - border-top-width: 0; - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); - } - - &:last-child { - border-bottom-width: 0; - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); - } - } - - // Due to specificity of the above selector (`.card > .list-group`), we must - // use a child selector here to prevent double borders. - > .card-header + .list-group, - > .list-group + .card-footer { - border-top: 0; - } -} - -.card-body { - // Enable `flex-grow: 1` for decks and groups so that card blocks take up - // as much space as possible, ensuring footers are aligned to the bottom. - flex: 1 1 auto; - padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x); - color: var(--#{$prefix}card-color); -} - -.card-title { - margin-bottom: var(--#{$prefix}card-title-spacer-y); - color: var(--#{$prefix}card-title-color); -} - -.card-subtitle { - margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list - margin-bottom: 0; - color: var(--#{$prefix}card-subtitle-color); -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link { - &:hover { - text-decoration: if($link-hover-decoration == underline, none, null); - } - - + .card-link { - margin-left: var(--#{$prefix}card-spacer-x); - } -} - -// -// Optional textual caps -// - -.card-header { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - margin-bottom: 0; // Removes the default margin-bottom of - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:first-child { - @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0); - } -} - -.card-footer { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:last-child { - @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius)); - } -} - - -// -// Header navs -// - -.card-header-tabs { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - border-bottom: 0; - - .nav-link.active { - background-color: var(--#{$prefix}card-bg); - border-bottom-color: var(--#{$prefix}card-bg); - } -} - -.card-header-pills { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list -} - -// Card image -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: var(--#{$prefix}card-img-overlay-padding); - @include border-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch -} - -.card-img, -.card-img-top { - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-bottom { - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); -} - - -// -// Card groups -// - -.card-group { - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - margin-bottom: var(--#{$prefix}card-group-margin); - } - - @include media-breakpoint-up(sm) { - display: flex; - flex-flow: row wrap; - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - flex: 1 0 0; - margin-bottom: 0; - - + .card { - margin-left: 0; - border-left: 0; - } - - // Handle rounded corners - @if $enable-rounded { - &:not(:last-child) { - @include border-end-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-right-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-right-radius: 0; - } - } - - &:not(:first-child) { - @include border-start-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-left-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-left-radius: 0; - } - } - } - } - } -} diff --git a/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss b/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss deleted file mode 100644 index 5ebf6b1..0000000 --- a/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss +++ /dev/null @@ -1,226 +0,0 @@ -// Notes on the classes: -// -// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) -// even when their scroll action started on a carousel, but for compatibility (with Firefox) -// we're preventing all actions instead -// 2. The .carousel-item-start and .carousel-item-end is used to indicate where -// the active slide is heading. -// 3. .active.carousel-item is the current slide. -// 4. .active.carousel-item-start and .active.carousel-item-end is the current -// slide in its in-transition state. Only one of these occurs at a time. -// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end -// is the upcoming slide in transition. - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; - @include clearfix(); -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - @include transition($carousel-transition); -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); -} - - -// -// Alternate transitions -// - -.carousel-fade { - .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; - } - - .carousel-item.active, - .carousel-item-next.carousel-item-start, - .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; - } - - .active.carousel-item-start, - .active.carousel-item-end { - z-index: 0; - opacity: 0; - @include transition(opacity 0s $carousel-transition-duration); - } -} - - -// -// Left/right controls for nav -// - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - // Use flex for alignment (1-3) - display: flex; // 1. allow flex styles - align-items: center; // 2. vertically center contents - justify-content: center; // 3. horizontally center contents - width: $carousel-control-width; - padding: 0; - color: $carousel-control-color; - text-align: center; - background: none; - filter: var(--#{$prefix}carousel-control-icon-filter); - border: 0; - opacity: $carousel-control-opacity; - @include transition($carousel-control-transition); - - // Hover/focus state - &:hover, - &:focus { - color: $carousel-control-color; - text-decoration: none; - outline: 0; - opacity: $carousel-control-hover-opacity; - } -} -.carousel-control-prev { - left: 0; - background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); -} -.carousel-control-next { - right: 0; - background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); -} - -// Icons for within -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: $carousel-control-icon-width; - height: $carousel-control-icon-width; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; -} - -.carousel-control-prev-icon { - background-image: escape-svg($carousel-control-prev-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-next-icon-bg) + "*/"}; -} -.carousel-control-next-icon { - background-image: escape-svg($carousel-control-next-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-prev-icon-bg) + "*/"}; -} - -// Optional indicator pips/controls -// -// Add a container (such as a list) with the following class and add an item (ideally a focusable control, -// like a button) with data-bs-target for each slide your carousel holds. - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - // Use the .carousel-control's width as margin so we don't overlay those - margin-right: $carousel-control-width; - margin-bottom: 1rem; - margin-left: $carousel-control-width; - - [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: $carousel-indicator-width; - height: $carousel-indicator-height; - padding: 0; - margin-right: $carousel-indicator-spacer; - margin-left: $carousel-indicator-spacer; - text-indent: -999px; - cursor: pointer; - background-color: var(--#{$prefix}carousel-indicator-active-bg); - background-clip: padding-box; - border: 0; - // Use transparent borders to increase the hit area by 10px on top and bottom. - border-top: $carousel-indicator-hit-area-height solid transparent; - border-bottom: $carousel-indicator-hit-area-height solid transparent; - opacity: $carousel-indicator-opacity; - @include transition($carousel-indicator-transition); - } - - .active { - opacity: $carousel-indicator-active-opacity; - } -} - - -// Optional captions -// -// - -.carousel-caption { - position: absolute; - right: (100% - $carousel-caption-width) * .5; - bottom: $carousel-caption-spacer; - left: (100% - $carousel-caption-width) * .5; - padding-top: $carousel-caption-padding-y; - padding-bottom: $carousel-caption-padding-y; - color: var(--#{$prefix}carousel-caption-color); - text-align: center; -} - -// Dark mode carousel - -@mixin carousel-dark() { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg-dark}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color-dark}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter-dark}; -} - -.carousel-dark { - @include carousel-dark(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include carousel-dark(); - } -} diff --git a/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss b/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss deleted file mode 100644 index d53c96f..0000000 --- a/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss +++ /dev/null @@ -1,66 +0,0 @@ -// Transparent background and border properties included for button version. -// iOS requires the button element instead of an anchor tag. -// If you want the anchor version, it requires `href="#"`. -// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile - -.btn-close { - // scss-docs-start close-css-vars - --#{$prefix}btn-close-color: #{$btn-close-color}; - --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) }; - --#{$prefix}btn-close-opacity: #{$btn-close-opacity}; - --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity}; - --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow}; - --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity}; - --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity}; - // scss-docs-end close-css-vars - - box-sizing: content-box; - width: $btn-close-width; - height: $btn-close-height; - padding: $btn-close-padding-y $btn-close-padding-x; - color: var(--#{$prefix}btn-close-color); - background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements - filter: var(--#{$prefix}btn-close-filter); - border: 0; // for button elements - @include border-radius(); - opacity: var(--#{$prefix}btn-close-opacity); - - // Override 's hover style - &:hover { - color: var(--#{$prefix}btn-close-color); - text-decoration: none; - opacity: var(--#{$prefix}btn-close-hover-opacity); - } - - &:focus { - outline: 0; - box-shadow: var(--#{$prefix}btn-close-focus-shadow); - opacity: var(--#{$prefix}btn-close-focus-opacity); - } - - &:disabled, - &.disabled { - pointer-events: none; - user-select: none; - opacity: var(--#{$prefix}btn-close-disabled-opacity); - } -} - -@mixin btn-close-white() { - --#{$prefix}btn-close-filter: #{$btn-close-filter-dark}; -} - -.btn-close-white { - @include btn-close-white(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}btn-close-filter: #{$btn-close-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include btn-close-white(); - } -} diff --git a/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss b/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss deleted file mode 100644 index 83b3138..0000000 --- a/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss +++ /dev/null @@ -1,41 +0,0 @@ -// Container widths -// -// Set the container width, and override it for fixed navbars in media queries. - -@if $enable-container-classes { - // Single container class with breakpoint max-widths - .container, - // 100% wide container at all breakpoints - .container-fluid { - @include make-container(); - } - - // Responsive containers that are 100% wide until a breakpoint - @each $breakpoint, $container-max-width in $container-max-widths { - .container-#{$breakpoint} { - @extend .container-fluid; - } - - @include media-breakpoint-up($breakpoint, $grid-breakpoints) { - %responsive-container-#{$breakpoint} { - max-width: $container-max-width; - } - - // Extend each breakpoint which is smaller or equal to the current breakpoint - $extend-breakpoint: true; - - @each $name, $width in $grid-breakpoints { - @if ($extend-breakpoint) { - .container#{breakpoint-infix($name, $grid-breakpoints)} { - @extend %responsive-container-#{$breakpoint}; - } - - // Once the current breakpoint is reached, stop extending - @if ($breakpoint == $name) { - $extend-breakpoint: false; - } - } - } - } - } -} diff --git a/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss b/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss deleted file mode 100644 index 587ebb4..0000000 --- a/05_react/uebungen/u11_footer-main/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss +++ /dev/null @@ -1,250 +0,0 @@ -// The dropdown wrapper (`
      `) -.dropup, -.dropend, -.dropdown, -.dropstart, -.dropup-center, -.dropdown-center { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; - - // Generate the caret automatically - @include caret(); -} - -// The dropdown menu -.dropdown-menu { - // scss-docs-start dropdown-css-vars - --#{$prefix}dropdown-zindex: #{$zindex-dropdown}; - --#{$prefix}dropdown-min-width: #{$dropdown-min-width}; - --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x}; - --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y}; - --#{$prefix}dropdown-spacer: #{$dropdown-spacer}; - @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size); - --#{$prefix}dropdown-color: #{$dropdown-color}; - --#{$prefix}dropdown-bg: #{$dropdown-bg}; - --#{$prefix}dropdown-border-color: #{$dropdown-border-color}; - --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius}; - --#{$prefix}dropdown-border-width: #{$dropdown-border-width}; - --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius}; - --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg}; - --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y}; - --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow}; - --#{$prefix}dropdown-link-color: #{$dropdown-link-color}; - --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color}; - --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg}; - --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color}; - --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg}; - --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color}; - --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x}; - --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y}; - --#{$prefix}dropdown-header-color: #{$dropdown-header-color}; - --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x}; - --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y}; - // scss-docs-end dropdown-css-vars - - position: absolute; - z-index: var(--#{$prefix}dropdown-zindex); - display: none; // none by default, but block on "open" of the menu - min-width: var(--#{$prefix}dropdown-min-width); - padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x); - margin: 0; // Override default margin of ul - @include font-size(var(--#{$prefix}dropdown-font-size)); - color: var(--#{$prefix}dropdown-color); - text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) - list-style: none; - background-color: var(--#{$prefix}dropdown-bg); - background-clip: padding-box; - border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color); - @include border-radius(var(--#{$prefix}dropdown-border-radius)); - @include box-shadow(var(--#{$prefix}dropdown-box-shadow)); - - &[data-bs-popper] { - top: 100%; - left: 0; - margin-top: var(--#{$prefix}dropdown-spacer); - } - - @if $dropdown-padding-y == 0 { - > .dropdown-item:first-child, - > li:first-child .dropdown-item { - @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - > .dropdown-item:last-child, - > li:last-child .dropdown-item { - @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - - } -} - -// scss-docs-start responsive-breakpoints -// We deliberately hardcode the `bs-` prefix because we check -// this custom property in JS to determine Popper's positioning - -@each $breakpoint in map-keys($grid-breakpoints) { - @include media-breakpoint-up($breakpoint) { - $infix: breakpoint-infix($breakpoint, $grid-breakpoints); - - .dropdown-menu#{$infix}-start { - --bs-position: start; - - &[data-bs-popper] { - right: auto; - left: 0; - } - } - - .dropdown-menu#{$infix}-end { - --bs-position: end; - - &[data-bs-popper] { - right: 0; - left: auto; - } - } - } -} -// scss-docs-end responsive-breakpoints - -// Allow for dropdowns to go bottom up (aka, dropup-menu) -// Just add .dropup after the standard .dropdown class and you're set. -.dropup { - .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(up); - } -} - -.dropend { - .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(end); - &::after { - vertical-align: 0; - } - } -} - -.dropstart { - .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(start); - &::before { - vertical-align: 0; - } - } -} - - -// Dividers (basically an `
      `) within the dropdown -.dropdown-divider { - height: 0; - margin: var(--#{$prefix}dropdown-divider-margin-y) 0; - overflow: hidden; - border-top: 1px solid var(--#{$prefix}dropdown-divider-bg); - opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
      element -} - -// Links, buttons, and more within the dropdown menu -// -// `
      ` alignment by inheriting `text-align`. -// 3. Fix alignment for Safari - -th { - font-weight: $table-th-font-weight; // 1 - text-align: inherit; // 2 - text-align: -webkit-match-parent; // 3 -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - - -// Forms -// -// 1. Allow labels to use `margin` for spacing. - -label { - display: inline-block; // 1 -} - -// Remove the default `border-radius` that macOS Chrome adds. -// See https://github.com/twbs/bootstrap/issues/24093 - -button { - // stylelint-disable-next-line property-disallowed-list - border-radius: 0; -} - -// Explicitly remove focus outline in Chromium when it shouldn't be -// visible (e.g. as result of mouse click or touch tap). It already -// should be doing this automatically, but seems to currently be -// confused and applies its very visible two-tone outline anyway. - -button:focus:not(:focus-visible) { - outline: 0; -} - -// 1. Remove the margin in Firefox and Safari - -input, -button, -select, -optgroup, -textarea { - margin: 0; // 1 - font-family: inherit; - @include font-size(inherit); - line-height: inherit; -} - -// Remove the inheritance of text transform in Firefox -button, -select { - text-transform: none; -} -// Set the cursor for non-` - - - - - - - - ); -}; -export default InputAmount; diff --git a/05_react/uebungen/u12_input-price/src/components/inputs/InputPrice.jsx b/05_react/uebungen/u12_input-price/src/components/inputs/InputPrice.jsx deleted file mode 100644 index 5a8e171..0000000 --- a/05_react/uebungen/u12_input-price/src/components/inputs/InputPrice.jsx +++ /dev/null @@ -1,47 +0,0 @@ -import { useState } from 'react'; -import { FaDollarSign, FaEuroSign, FaYenSign } from 'react-icons/fa6'; - -const InputPrice = (props) => { - const { currency = '$' } = props; - - const [price, setPrice] = useState(0); - - //Evenhandler - const handleChange = (e) => { - console.log(`Preis: ${e.target.value}`); - setPrice(e.target.value); - }; - - return ( -
      -
      - {currency === '$' && ( - - - - )} - - {currency === '€' && ( - - - - )} - {currency === '¥' && ( - - - - )} -
      -
      - ); -}; -export default InputPrice; diff --git a/05_react/uebungen/u12_input-price/src/main.jsx b/05_react/uebungen/u12_input-price/src/main.jsx deleted file mode 100644 index 2034d11..0000000 --- a/05_react/uebungen/u12_input-price/src/main.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; - -// Einbindung der Haupt-SASS-Datei -import './styles/main.scss'; - -import App from './App.jsx'; - -createRoot(document.getElementById('root')).render( - - - , -); diff --git a/05_react/uebungen/u12_input-price/src/styles/01_frameworks/_index.scss b/05_react/uebungen/u12_input-price/src/styles/01_frameworks/_index.scss deleted file mode 100644 index dcefbc9..0000000 --- a/05_react/uebungen/u12_input-price/src/styles/01_frameworks/_index.scss +++ /dev/null @@ -1,3 +0,0 @@ -// @import 'bootstrap-5.3.8/bootstrap-grid'; -@import 'bootstrap-5.3.8/bootstrap'; -// @import 'bulma-1.04/index' diff --git a/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss b/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss deleted file mode 100644 index e9f267f..0000000 --- a/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss +++ /dev/null @@ -1,153 +0,0 @@ -// -// Base styles -// - -.accordion { - // scss-docs-start accordion-css-vars - --#{$prefix}accordion-color: #{$accordion-color}; - --#{$prefix}accordion-bg: #{$accordion-bg}; - --#{$prefix}accordion-transition: #{$accordion-transition}; - --#{$prefix}accordion-border-color: #{$accordion-border-color}; - --#{$prefix}accordion-border-width: #{$accordion-border-width}; - --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; - --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; - --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; - --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; - --#{$prefix}accordion-btn-color: #{$accordion-button-color}; - --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; - --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; - --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; - --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; - --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; - --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; - --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; - --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; - --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; - // scss-docs-end accordion-css-vars -} - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); - @include font-size($font-size-base); - color: var(--#{$prefix}accordion-btn-color); - text-align: left; // Reset button style - background-color: var(--#{$prefix}accordion-btn-bg); - border: 0; - @include border-radius(0); - overflow-anchor: none; - @include transition(var(--#{$prefix}accordion-transition)); - - &:not(.collapsed) { - color: var(--#{$prefix}accordion-active-color); - background-color: var(--#{$prefix}accordion-active-bg); - box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list - - &::after { - background-image: var(--#{$prefix}accordion-btn-active-icon); - transform: var(--#{$prefix}accordion-btn-icon-transform); - } - } - - // Accordion icon - &::after { - flex-shrink: 0; - width: var(--#{$prefix}accordion-btn-icon-width); - height: var(--#{$prefix}accordion-btn-icon-width); - margin-left: auto; - content: ""; - background-image: var(--#{$prefix}accordion-btn-icon); - background-repeat: no-repeat; - background-size: var(--#{$prefix}accordion-btn-icon-width); - @include transition(var(--#{$prefix}accordion-btn-icon-transition)); - } - - &:hover { - z-index: 2; - } - - &:focus { - z-index: 3; - outline: 0; - box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); - } -} - -.accordion-header { - margin-bottom: 0; -} - -.accordion-item { - color: var(--#{$prefix}accordion-color); - background-color: var(--#{$prefix}accordion-bg); - border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); - - &:first-of-type { - @include border-top-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - &:not(:first-of-type) { - border-top: 0; - } - - // Only set a border-radius on the last item if the accordion is collapsed - &:last-of-type { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - &.collapsed { - @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - > .accordion-collapse { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - } - } -} - -.accordion-body { - padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); -} - - -// Flush accordion items -// -// Remove borders and border-radius to keep accordion items edge-to-edge. - -.accordion-flush { - > .accordion-item { - border-right: 0; - border-left: 0; - @include border-radius(0); - - &:first-child { border-top: 0; } - &:last-child { border-bottom: 0; } - - // stylelint-disable selector-max-class - > .accordion-collapse, - > .accordion-header .accordion-button, - > .accordion-header .accordion-button.collapsed { - @include border-radius(0); - } - // stylelint-enable selector-max-class - } -} - -@if $enable-dark-mode { - @include color-mode(dark) { - .accordion-button::after { - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; - } - } -} diff --git a/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss b/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss deleted file mode 100644 index b8cff9b..0000000 --- a/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss +++ /dev/null @@ -1,68 +0,0 @@ -// -// Base styles -// - -.alert { - // scss-docs-start alert-css-vars - --#{$prefix}alert-bg: transparent; - --#{$prefix}alert-padding-x: #{$alert-padding-x}; - --#{$prefix}alert-padding-y: #{$alert-padding-y}; - --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; - --#{$prefix}alert-color: inherit; - --#{$prefix}alert-border-color: transparent; - --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); - --#{$prefix}alert-border-radius: #{$alert-border-radius}; - --#{$prefix}alert-link-color: inherit; - // scss-docs-end alert-css-vars - - position: relative; - padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); - margin-bottom: var(--#{$prefix}alert-margin-bottom); - color: var(--#{$prefix}alert-color); - background-color: var(--#{$prefix}alert-bg); - border: var(--#{$prefix}alert-border); - @include border-radius(var(--#{$prefix}alert-border-radius)); -} - -// Headings for larger alerts -.alert-heading { - // Specified to prevent conflicts of changing $headings-color - color: inherit; -} - -// Provide class for links that match alerts -.alert-link { - font-weight: $alert-link-font-weight; - color: var(--#{$prefix}alert-link-color); -} - - -// Dismissible alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissible { - padding-right: $alert-dismissible-padding-r; - - // Adjust close link position - .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: $stretched-link-z-index + 1; - padding: $alert-padding-y * 1.25 $alert-padding-x; - } -} - - -// scss-docs-start alert-modifiers -// Generate contextual modifier classes for colorizing the alert -@each $state in map-keys($theme-colors) { - .alert-#{$state} { - --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); - --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); - --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); - --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); - } -} -// scss-docs-end alert-modifiers diff --git a/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss b/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss deleted file mode 100644 index cc3d269..0000000 --- a/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss +++ /dev/null @@ -1,38 +0,0 @@ -// Base class -// -// Requires one of the contextual, color modifier classes for `color` and -// `background-color`. - -.badge { - // scss-docs-start badge-css-vars - --#{$prefix}badge-padding-x: #{$badge-padding-x}; - --#{$prefix}badge-padding-y: #{$badge-padding-y}; - @include rfs($badge-font-size, --#{$prefix}badge-font-size); - --#{$prefix}badge-font-weight: #{$badge-font-weight}; - --#{$prefix}badge-color: #{$badge-color}; - --#{$prefix}badge-border-radius: #{$badge-border-radius}; - // scss-docs-end badge-css-vars - - display: inline-block; - padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x); - @include font-size(var(--#{$prefix}badge-font-size)); - font-weight: var(--#{$prefix}badge-font-weight); - line-height: 1; - color: var(--#{$prefix}badge-color); - text-align: center; - white-space: nowrap; - vertical-align: baseline; - @include border-radius(var(--#{$prefix}badge-border-radius)); - @include gradient-bg(); - - // Empty badges collapse automatically - &:empty { - display: none; - } -} - -// Quick fix for badges in buttons -.btn .badge { - position: relative; - top: -1px; -} diff --git a/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss b/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss deleted file mode 100644 index b8252ff..0000000 --- a/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss +++ /dev/null @@ -1,40 +0,0 @@ -.breadcrumb { - // scss-docs-start breadcrumb-css-vars - --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x}; - --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y}; - --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom}; - @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size); - --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg}; - --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius}; - --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color}; - --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x}; - --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color}; - // scss-docs-end breadcrumb-css-vars - - display: flex; - flex-wrap: wrap; - padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x); - margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom); - @include font-size(var(--#{$prefix}breadcrumb-font-size)); - list-style: none; - background-color: var(--#{$prefix}breadcrumb-bg); - @include border-radius(var(--#{$prefix}breadcrumb-border-radius)); -} - -.breadcrumb-item { - // The separator between breadcrumbs (by default, a forward-slash: "/") - + .breadcrumb-item { - padding-left: var(--#{$prefix}breadcrumb-item-padding-x); - - &::before { - float: left; // Suppress inline spacings and underlining of the separator - padding-right: var(--#{$prefix}breadcrumb-item-padding-x); - color: var(--#{$prefix}breadcrumb-divider-color); - content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; - } - } - - &.active { - color: var(--#{$prefix}breadcrumb-item-active-color); - } -} diff --git a/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss b/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss deleted file mode 100644 index 78e1252..0000000 --- a/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss +++ /dev/null @@ -1,147 +0,0 @@ -// Make the div behave like a button -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; // match .btn alignment given font-size hack above - - > .btn { - position: relative; - flex: 1 1 auto; - } - - // Bring the hover, focused, and "active" buttons to the front to overlay - // the borders properly - > .btn-check:checked + .btn, - > .btn-check:focus + .btn, - > .btn:hover, - > .btn:focus, - > .btn:active, - > .btn.active { - z-index: 1; - } -} - -// Optional: Group multiple button groups together for a toolbar -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; - - .input-group { - width: auto; - } -} - -.btn-group { - @include border-radius($btn-border-radius); - - // Prevent double borders when buttons are next to each other - > :not(.btn-check:first-child) + .btn, - > .btn-group:not(:first-child) { - margin-left: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn.dropdown-toggle-split:first-child, - > .btn-group:not(:last-child) > .btn { - @include border-end-radius(0); - } - - // The left radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-start-radius(0); - } -} - -// Sizing -// -// Remix the default button sizing classes into new ones for easier manipulation. - -.btn-group-sm > .btn { @extend .btn-sm; } -.btn-group-lg > .btn { @extend .btn-lg; } - - -// -// Split button dropdowns -// - -.dropdown-toggle-split { - padding-right: $btn-padding-x * .75; - padding-left: $btn-padding-x * .75; - - &::after, - .dropup &::after, - .dropend &::after { - margin-left: 0; - } - - .dropstart &::before { - margin-right: 0; - } -} - -.btn-sm + .dropdown-toggle-split { - padding-right: $btn-padding-x-sm * .75; - padding-left: $btn-padding-x-sm * .75; -} - -.btn-lg + .dropdown-toggle-split { - padding-right: $btn-padding-x-lg * .75; - padding-left: $btn-padding-x-lg * .75; -} - - -// The clickable button for toggling the menu -// Set the same inset shadow as the :active state -.btn-group.show .dropdown-toggle { - @include box-shadow($btn-active-box-shadow); - - // Show no shadow for `.btn-link` since it has no other button styles. - &.btn-link { - @include box-shadow(none); - } -} - - -// -// Vertical button groups -// - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; - - > .btn, - > .btn-group { - width: 100%; - } - - > .btn:not(:first-child), - > .btn-group:not(:first-child) { - margin-top: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn-group:not(:last-child) > .btn { - @include border-bottom-radius(0); - } - - // The top radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-top-radius(0); - } -} diff --git a/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss b/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss deleted file mode 100644 index caa4518..0000000 --- a/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss +++ /dev/null @@ -1,216 +0,0 @@ -// -// Base styles -// - -.btn { - // scss-docs-start btn-css-vars - --#{$prefix}btn-padding-x: #{$btn-padding-x}; - --#{$prefix}btn-padding-y: #{$btn-padding-y}; - --#{$prefix}btn-font-family: #{$btn-font-family}; - @include rfs($btn-font-size, --#{$prefix}btn-font-size); - --#{$prefix}btn-font-weight: #{$btn-font-weight}; - --#{$prefix}btn-line-height: #{$btn-line-height}; - --#{$prefix}btn-color: #{$btn-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-width: #{$btn-border-width}; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-border-radius: #{$btn-border-radius}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-box-shadow: #{$btn-box-shadow}; - --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity}; - --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5); - // scss-docs-end btn-css-vars - - display: inline-block; - padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x); - font-family: var(--#{$prefix}btn-font-family); - @include font-size(var(--#{$prefix}btn-font-size)); - font-weight: var(--#{$prefix}btn-font-weight); - line-height: var(--#{$prefix}btn-line-height); - color: var(--#{$prefix}btn-color); - text-align: center; - text-decoration: if($link-decoration == none, null, none); - white-space: $btn-white-space; - vertical-align: middle; - cursor: if($enable-button-pointers, pointer, null); - user-select: none; - border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color); - @include border-radius(var(--#{$prefix}btn-border-radius)); - @include gradient-bg(var(--#{$prefix}btn-bg)); - @include box-shadow(var(--#{$prefix}btn-box-shadow)); - @include transition($btn-transition); - - &:hover { - color: var(--#{$prefix}btn-hover-color); - text-decoration: if($link-hover-decoration == underline, none, null); - background-color: var(--#{$prefix}btn-hover-bg); - border-color: var(--#{$prefix}btn-hover-border-color); - } - - .btn-check + &:hover { - // override for the checkbox/radio buttons - color: var(--#{$prefix}btn-color); - background-color: var(--#{$prefix}btn-bg); - border-color: var(--#{$prefix}btn-border-color); - } - - &:focus-visible { - color: var(--#{$prefix}btn-hover-color); - @include gradient-bg(var(--#{$prefix}btn-hover-bg)); - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:focus-visible + & { - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:checked + &, - :not(.btn-check) + &:active, - &:first-child:active, - &.active, - &.show { - color: var(--#{$prefix}btn-active-color); - background-color: var(--#{$prefix}btn-active-bg); - // Remove CSS gradients if they're enabled - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-active-border-color); - @include box-shadow(var(--#{$prefix}btn-active-shadow)); - - &:focus-visible { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - } - - .btn-check:checked:focus-visible + & { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - &:disabled, - &.disabled, - fieldset:disabled & { - color: var(--#{$prefix}btn-disabled-color); - pointer-events: none; - background-color: var(--#{$prefix}btn-disabled-bg); - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-disabled-border-color); - opacity: var(--#{$prefix}btn-disabled-opacity); - @include box-shadow(none); - } -} - - -// -// Alternate buttons -// - -// scss-docs-start btn-variant-loops -@each $color, $value in $theme-colors { - .btn-#{$color} { - @if $color == "light" { - @include button-variant( - $value, - $value, - $hover-background: shade-color($value, $btn-hover-bg-shade-amount), - $hover-border: shade-color($value, $btn-hover-border-shade-amount), - $active-background: shade-color($value, $btn-active-bg-shade-amount), - $active-border: shade-color($value, $btn-active-border-shade-amount) - ); - } @else if $color == "dark" { - @include button-variant( - $value, - $value, - $hover-background: tint-color($value, $btn-hover-bg-tint-amount), - $hover-border: tint-color($value, $btn-hover-border-tint-amount), - $active-background: tint-color($value, $btn-active-bg-tint-amount), - $active-border: tint-color($value, $btn-active-border-tint-amount) - ); - } @else { - @include button-variant($value, $value); - } - } -} - -@each $color, $value in $theme-colors { - .btn-outline-#{$color} { - @include button-outline-variant($value); - } -} -// scss-docs-end btn-variant-loops - - -// -// Link buttons -// - -// Make a button look and behave like a link -.btn-link { - --#{$prefix}btn-font-weight: #{$font-weight-normal}; - --#{$prefix}btn-color: #{$btn-link-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-hover-color: #{$btn-link-hover-color}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-active-color: #{$btn-link-hover-color}; - --#{$prefix}btn-active-border-color: transparent; - --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color}; - --#{$prefix}btn-disabled-border-color: transparent; - --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows - --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb}; - - text-decoration: $link-decoration; - @if $enable-gradients { - background-image: none; - } - - &:hover, - &:focus-visible { - text-decoration: $link-hover-decoration; - } - - &:focus-visible { - color: var(--#{$prefix}btn-color); - } - - &:hover { - color: var(--#{$prefix}btn-hover-color); - } - - // No need for an active state here -} - - -// -// Button Sizes -// - -.btn-lg { - @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); -} - -.btn-sm { - @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); -} diff --git a/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss b/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss deleted file mode 100644 index dcebe6a..0000000 --- a/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss +++ /dev/null @@ -1,238 +0,0 @@ -// -// Base styles -// - -.card { - // scss-docs-start card-css-vars - --#{$prefix}card-spacer-y: #{$card-spacer-y}; - --#{$prefix}card-spacer-x: #{$card-spacer-x}; - --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y}; - --#{$prefix}card-title-color: #{$card-title-color}; - --#{$prefix}card-subtitle-color: #{$card-subtitle-color}; - --#{$prefix}card-border-width: #{$card-border-width}; - --#{$prefix}card-border-color: #{$card-border-color}; - --#{$prefix}card-border-radius: #{$card-border-radius}; - --#{$prefix}card-box-shadow: #{$card-box-shadow}; - --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius}; - --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y}; - --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x}; - --#{$prefix}card-cap-bg: #{$card-cap-bg}; - --#{$prefix}card-cap-color: #{$card-cap-color}; - --#{$prefix}card-height: #{$card-height}; - --#{$prefix}card-color: #{$card-color}; - --#{$prefix}card-bg: #{$card-bg}; - --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding}; - --#{$prefix}card-group-margin: #{$card-group-margin}; - // scss-docs-end card-css-vars - - position: relative; - display: flex; - flex-direction: column; - min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 - height: var(--#{$prefix}card-height); - color: var(--#{$prefix}body-color); - word-wrap: break-word; - background-color: var(--#{$prefix}card-bg); - background-clip: border-box; - border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - @include border-radius(var(--#{$prefix}card-border-radius)); - @include box-shadow(var(--#{$prefix}card-box-shadow)); - - > hr { - margin-right: 0; - margin-left: 0; - } - - > .list-group { - border-top: inherit; - border-bottom: inherit; - - &:first-child { - border-top-width: 0; - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); - } - - &:last-child { - border-bottom-width: 0; - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); - } - } - - // Due to specificity of the above selector (`.card > .list-group`), we must - // use a child selector here to prevent double borders. - > .card-header + .list-group, - > .list-group + .card-footer { - border-top: 0; - } -} - -.card-body { - // Enable `flex-grow: 1` for decks and groups so that card blocks take up - // as much space as possible, ensuring footers are aligned to the bottom. - flex: 1 1 auto; - padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x); - color: var(--#{$prefix}card-color); -} - -.card-title { - margin-bottom: var(--#{$prefix}card-title-spacer-y); - color: var(--#{$prefix}card-title-color); -} - -.card-subtitle { - margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list - margin-bottom: 0; - color: var(--#{$prefix}card-subtitle-color); -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link { - &:hover { - text-decoration: if($link-hover-decoration == underline, none, null); - } - - + .card-link { - margin-left: var(--#{$prefix}card-spacer-x); - } -} - -// -// Optional textual caps -// - -.card-header { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - margin-bottom: 0; // Removes the default margin-bottom of - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:first-child { - @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0); - } -} - -.card-footer { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:last-child { - @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius)); - } -} - - -// -// Header navs -// - -.card-header-tabs { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - border-bottom: 0; - - .nav-link.active { - background-color: var(--#{$prefix}card-bg); - border-bottom-color: var(--#{$prefix}card-bg); - } -} - -.card-header-pills { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list -} - -// Card image -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: var(--#{$prefix}card-img-overlay-padding); - @include border-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch -} - -.card-img, -.card-img-top { - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-bottom { - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); -} - - -// -// Card groups -// - -.card-group { - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - margin-bottom: var(--#{$prefix}card-group-margin); - } - - @include media-breakpoint-up(sm) { - display: flex; - flex-flow: row wrap; - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - flex: 1 0 0; - margin-bottom: 0; - - + .card { - margin-left: 0; - border-left: 0; - } - - // Handle rounded corners - @if $enable-rounded { - &:not(:last-child) { - @include border-end-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-right-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-right-radius: 0; - } - } - - &:not(:first-child) { - @include border-start-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-left-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-left-radius: 0; - } - } - } - } - } -} diff --git a/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss b/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss deleted file mode 100644 index 5ebf6b1..0000000 --- a/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss +++ /dev/null @@ -1,226 +0,0 @@ -// Notes on the classes: -// -// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) -// even when their scroll action started on a carousel, but for compatibility (with Firefox) -// we're preventing all actions instead -// 2. The .carousel-item-start and .carousel-item-end is used to indicate where -// the active slide is heading. -// 3. .active.carousel-item is the current slide. -// 4. .active.carousel-item-start and .active.carousel-item-end is the current -// slide in its in-transition state. Only one of these occurs at a time. -// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end -// is the upcoming slide in transition. - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; - @include clearfix(); -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - @include transition($carousel-transition); -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); -} - - -// -// Alternate transitions -// - -.carousel-fade { - .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; - } - - .carousel-item.active, - .carousel-item-next.carousel-item-start, - .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; - } - - .active.carousel-item-start, - .active.carousel-item-end { - z-index: 0; - opacity: 0; - @include transition(opacity 0s $carousel-transition-duration); - } -} - - -// -// Left/right controls for nav -// - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - // Use flex for alignment (1-3) - display: flex; // 1. allow flex styles - align-items: center; // 2. vertically center contents - justify-content: center; // 3. horizontally center contents - width: $carousel-control-width; - padding: 0; - color: $carousel-control-color; - text-align: center; - background: none; - filter: var(--#{$prefix}carousel-control-icon-filter); - border: 0; - opacity: $carousel-control-opacity; - @include transition($carousel-control-transition); - - // Hover/focus state - &:hover, - &:focus { - color: $carousel-control-color; - text-decoration: none; - outline: 0; - opacity: $carousel-control-hover-opacity; - } -} -.carousel-control-prev { - left: 0; - background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); -} -.carousel-control-next { - right: 0; - background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); -} - -// Icons for within -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: $carousel-control-icon-width; - height: $carousel-control-icon-width; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; -} - -.carousel-control-prev-icon { - background-image: escape-svg($carousel-control-prev-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-next-icon-bg) + "*/"}; -} -.carousel-control-next-icon { - background-image: escape-svg($carousel-control-next-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-prev-icon-bg) + "*/"}; -} - -// Optional indicator pips/controls -// -// Add a container (such as a list) with the following class and add an item (ideally a focusable control, -// like a button) with data-bs-target for each slide your carousel holds. - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - // Use the .carousel-control's width as margin so we don't overlay those - margin-right: $carousel-control-width; - margin-bottom: 1rem; - margin-left: $carousel-control-width; - - [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: $carousel-indicator-width; - height: $carousel-indicator-height; - padding: 0; - margin-right: $carousel-indicator-spacer; - margin-left: $carousel-indicator-spacer; - text-indent: -999px; - cursor: pointer; - background-color: var(--#{$prefix}carousel-indicator-active-bg); - background-clip: padding-box; - border: 0; - // Use transparent borders to increase the hit area by 10px on top and bottom. - border-top: $carousel-indicator-hit-area-height solid transparent; - border-bottom: $carousel-indicator-hit-area-height solid transparent; - opacity: $carousel-indicator-opacity; - @include transition($carousel-indicator-transition); - } - - .active { - opacity: $carousel-indicator-active-opacity; - } -} - - -// Optional captions -// -// - -.carousel-caption { - position: absolute; - right: (100% - $carousel-caption-width) * .5; - bottom: $carousel-caption-spacer; - left: (100% - $carousel-caption-width) * .5; - padding-top: $carousel-caption-padding-y; - padding-bottom: $carousel-caption-padding-y; - color: var(--#{$prefix}carousel-caption-color); - text-align: center; -} - -// Dark mode carousel - -@mixin carousel-dark() { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg-dark}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color-dark}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter-dark}; -} - -.carousel-dark { - @include carousel-dark(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include carousel-dark(); - } -} diff --git a/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss b/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss deleted file mode 100644 index d53c96f..0000000 --- a/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss +++ /dev/null @@ -1,66 +0,0 @@ -// Transparent background and border properties included for button version. -// iOS requires the button element instead of an anchor tag. -// If you want the anchor version, it requires `href="#"`. -// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile - -.btn-close { - // scss-docs-start close-css-vars - --#{$prefix}btn-close-color: #{$btn-close-color}; - --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) }; - --#{$prefix}btn-close-opacity: #{$btn-close-opacity}; - --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity}; - --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow}; - --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity}; - --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity}; - // scss-docs-end close-css-vars - - box-sizing: content-box; - width: $btn-close-width; - height: $btn-close-height; - padding: $btn-close-padding-y $btn-close-padding-x; - color: var(--#{$prefix}btn-close-color); - background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements - filter: var(--#{$prefix}btn-close-filter); - border: 0; // for button elements - @include border-radius(); - opacity: var(--#{$prefix}btn-close-opacity); - - // Override 's hover style - &:hover { - color: var(--#{$prefix}btn-close-color); - text-decoration: none; - opacity: var(--#{$prefix}btn-close-hover-opacity); - } - - &:focus { - outline: 0; - box-shadow: var(--#{$prefix}btn-close-focus-shadow); - opacity: var(--#{$prefix}btn-close-focus-opacity); - } - - &:disabled, - &.disabled { - pointer-events: none; - user-select: none; - opacity: var(--#{$prefix}btn-close-disabled-opacity); - } -} - -@mixin btn-close-white() { - --#{$prefix}btn-close-filter: #{$btn-close-filter-dark}; -} - -.btn-close-white { - @include btn-close-white(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}btn-close-filter: #{$btn-close-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include btn-close-white(); - } -} diff --git a/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss b/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss deleted file mode 100644 index 83b3138..0000000 --- a/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss +++ /dev/null @@ -1,41 +0,0 @@ -// Container widths -// -// Set the container width, and override it for fixed navbars in media queries. - -@if $enable-container-classes { - // Single container class with breakpoint max-widths - .container, - // 100% wide container at all breakpoints - .container-fluid { - @include make-container(); - } - - // Responsive containers that are 100% wide until a breakpoint - @each $breakpoint, $container-max-width in $container-max-widths { - .container-#{$breakpoint} { - @extend .container-fluid; - } - - @include media-breakpoint-up($breakpoint, $grid-breakpoints) { - %responsive-container-#{$breakpoint} { - max-width: $container-max-width; - } - - // Extend each breakpoint which is smaller or equal to the current breakpoint - $extend-breakpoint: true; - - @each $name, $width in $grid-breakpoints { - @if ($extend-breakpoint) { - .container#{breakpoint-infix($name, $grid-breakpoints)} { - @extend %responsive-container-#{$breakpoint}; - } - - // Once the current breakpoint is reached, stop extending - @if ($breakpoint == $name) { - $extend-breakpoint: false; - } - } - } - } - } -} diff --git a/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss b/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss deleted file mode 100644 index 587ebb4..0000000 --- a/05_react/uebungen/u12_input-price/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss +++ /dev/null @@ -1,250 +0,0 @@ -// The dropdown wrapper (`
      `) -.dropup, -.dropend, -.dropdown, -.dropstart, -.dropup-center, -.dropdown-center { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; - - // Generate the caret automatically - @include caret(); -} - -// The dropdown menu -.dropdown-menu { - // scss-docs-start dropdown-css-vars - --#{$prefix}dropdown-zindex: #{$zindex-dropdown}; - --#{$prefix}dropdown-min-width: #{$dropdown-min-width}; - --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x}; - --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y}; - --#{$prefix}dropdown-spacer: #{$dropdown-spacer}; - @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size); - --#{$prefix}dropdown-color: #{$dropdown-color}; - --#{$prefix}dropdown-bg: #{$dropdown-bg}; - --#{$prefix}dropdown-border-color: #{$dropdown-border-color}; - --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius}; - --#{$prefix}dropdown-border-width: #{$dropdown-border-width}; - --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius}; - --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg}; - --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y}; - --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow}; - --#{$prefix}dropdown-link-color: #{$dropdown-link-color}; - --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color}; - --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg}; - --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color}; - --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg}; - --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color}; - --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x}; - --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y}; - --#{$prefix}dropdown-header-color: #{$dropdown-header-color}; - --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x}; - --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y}; - // scss-docs-end dropdown-css-vars - - position: absolute; - z-index: var(--#{$prefix}dropdown-zindex); - display: none; // none by default, but block on "open" of the menu - min-width: var(--#{$prefix}dropdown-min-width); - padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x); - margin: 0; // Override default margin of ul - @include font-size(var(--#{$prefix}dropdown-font-size)); - color: var(--#{$prefix}dropdown-color); - text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) - list-style: none; - background-color: var(--#{$prefix}dropdown-bg); - background-clip: padding-box; - border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color); - @include border-radius(var(--#{$prefix}dropdown-border-radius)); - @include box-shadow(var(--#{$prefix}dropdown-box-shadow)); - - &[data-bs-popper] { - top: 100%; - left: 0; - margin-top: var(--#{$prefix}dropdown-spacer); - } - - @if $dropdown-padding-y == 0 { - > .dropdown-item:first-child, - > li:first-child .dropdown-item { - @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - > .dropdown-item:last-child, - > li:last-child .dropdown-item { - @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - - } -} - -// scss-docs-start responsive-breakpoints -// We deliberately hardcode the `bs-` prefix because we check -// this custom property in JS to determine Popper's positioning - -@each $breakpoint in map-keys($grid-breakpoints) { - @include media-breakpoint-up($breakpoint) { - $infix: breakpoint-infix($breakpoint, $grid-breakpoints); - - .dropdown-menu#{$infix}-start { - --bs-position: start; - - &[data-bs-popper] { - right: auto; - left: 0; - } - } - - .dropdown-menu#{$infix}-end { - --bs-position: end; - - &[data-bs-popper] { - right: 0; - left: auto; - } - } - } -} -// scss-docs-end responsive-breakpoints - -// Allow for dropdowns to go bottom up (aka, dropup-menu) -// Just add .dropup after the standard .dropdown class and you're set. -.dropup { - .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(up); - } -} - -.dropend { - .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(end); - &::after { - vertical-align: 0; - } - } -} - -.dropstart { - .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(start); - &::before { - vertical-align: 0; - } - } -} - - -// Dividers (basically an `
      `) within the dropdown -.dropdown-divider { - height: 0; - margin: var(--#{$prefix}dropdown-divider-margin-y) 0; - overflow: hidden; - border-top: 1px solid var(--#{$prefix}dropdown-divider-bg); - opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
      element -} - -// Links, buttons, and more within the dropdown menu -// -// `
      ` alignment by inheriting `text-align`. -// 3. Fix alignment for Safari - -th { - font-weight: $table-th-font-weight; // 1 - text-align: inherit; // 2 - text-align: -webkit-match-parent; // 3 -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - - -// Forms -// -// 1. Allow labels to use `margin` for spacing. - -label { - display: inline-block; // 1 -} - -// Remove the default `border-radius` that macOS Chrome adds. -// See https://github.com/twbs/bootstrap/issues/24093 - -button { - // stylelint-disable-next-line property-disallowed-list - border-radius: 0; -} - -// Explicitly remove focus outline in Chromium when it shouldn't be -// visible (e.g. as result of mouse click or touch tap). It already -// should be doing this automatically, but seems to currently be -// confused and applies its very visible two-tone outline anyway. - -button:focus:not(:focus-visible) { - outline: 0; -} - -// 1. Remove the margin in Firefox and Safari - -input, -button, -select, -optgroup, -textarea { - margin: 0; // 1 - font-family: inherit; - @include font-size(inherit); - line-height: inherit; -} - -// Remove the inheritance of text transform in Firefox -button, -select { - text-transform: none; -} -// Set the cursor for non-` - - - - - - - - ); -}; -export default InputAmount; diff --git a/05_react/uebungen/u13_input-amount/src/components/inputs/InputPrice.jsx b/05_react/uebungen/u13_input-amount/src/components/inputs/InputPrice.jsx deleted file mode 100644 index 5a8e171..0000000 --- a/05_react/uebungen/u13_input-amount/src/components/inputs/InputPrice.jsx +++ /dev/null @@ -1,47 +0,0 @@ -import { useState } from 'react'; -import { FaDollarSign, FaEuroSign, FaYenSign } from 'react-icons/fa6'; - -const InputPrice = (props) => { - const { currency = '$' } = props; - - const [price, setPrice] = useState(0); - - //Evenhandler - const handleChange = (e) => { - console.log(`Preis: ${e.target.value}`); - setPrice(e.target.value); - }; - - return ( -
      -
      - {currency === '$' && ( - - - - )} - - {currency === '€' && ( - - - - )} - {currency === '¥' && ( - - - - )} -
      -
      - ); -}; -export default InputPrice; diff --git a/05_react/uebungen/u13_input-amount/src/main.jsx b/05_react/uebungen/u13_input-amount/src/main.jsx deleted file mode 100644 index 2034d11..0000000 --- a/05_react/uebungen/u13_input-amount/src/main.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; - -// Einbindung der Haupt-SASS-Datei -import './styles/main.scss'; - -import App from './App.jsx'; - -createRoot(document.getElementById('root')).render( - - - , -); diff --git a/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/_index.scss b/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/_index.scss deleted file mode 100644 index dcefbc9..0000000 --- a/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/_index.scss +++ /dev/null @@ -1,3 +0,0 @@ -// @import 'bootstrap-5.3.8/bootstrap-grid'; -@import 'bootstrap-5.3.8/bootstrap'; -// @import 'bulma-1.04/index' diff --git a/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss b/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss deleted file mode 100644 index e9f267f..0000000 --- a/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss +++ /dev/null @@ -1,153 +0,0 @@ -// -// Base styles -// - -.accordion { - // scss-docs-start accordion-css-vars - --#{$prefix}accordion-color: #{$accordion-color}; - --#{$prefix}accordion-bg: #{$accordion-bg}; - --#{$prefix}accordion-transition: #{$accordion-transition}; - --#{$prefix}accordion-border-color: #{$accordion-border-color}; - --#{$prefix}accordion-border-width: #{$accordion-border-width}; - --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; - --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; - --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; - --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; - --#{$prefix}accordion-btn-color: #{$accordion-button-color}; - --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; - --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; - --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; - --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; - --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; - --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; - --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; - --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; - --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; - // scss-docs-end accordion-css-vars -} - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); - @include font-size($font-size-base); - color: var(--#{$prefix}accordion-btn-color); - text-align: left; // Reset button style - background-color: var(--#{$prefix}accordion-btn-bg); - border: 0; - @include border-radius(0); - overflow-anchor: none; - @include transition(var(--#{$prefix}accordion-transition)); - - &:not(.collapsed) { - color: var(--#{$prefix}accordion-active-color); - background-color: var(--#{$prefix}accordion-active-bg); - box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list - - &::after { - background-image: var(--#{$prefix}accordion-btn-active-icon); - transform: var(--#{$prefix}accordion-btn-icon-transform); - } - } - - // Accordion icon - &::after { - flex-shrink: 0; - width: var(--#{$prefix}accordion-btn-icon-width); - height: var(--#{$prefix}accordion-btn-icon-width); - margin-left: auto; - content: ""; - background-image: var(--#{$prefix}accordion-btn-icon); - background-repeat: no-repeat; - background-size: var(--#{$prefix}accordion-btn-icon-width); - @include transition(var(--#{$prefix}accordion-btn-icon-transition)); - } - - &:hover { - z-index: 2; - } - - &:focus { - z-index: 3; - outline: 0; - box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); - } -} - -.accordion-header { - margin-bottom: 0; -} - -.accordion-item { - color: var(--#{$prefix}accordion-color); - background-color: var(--#{$prefix}accordion-bg); - border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); - - &:first-of-type { - @include border-top-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - &:not(:first-of-type) { - border-top: 0; - } - - // Only set a border-radius on the last item if the accordion is collapsed - &:last-of-type { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - &.collapsed { - @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - > .accordion-collapse { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - } - } -} - -.accordion-body { - padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); -} - - -// Flush accordion items -// -// Remove borders and border-radius to keep accordion items edge-to-edge. - -.accordion-flush { - > .accordion-item { - border-right: 0; - border-left: 0; - @include border-radius(0); - - &:first-child { border-top: 0; } - &:last-child { border-bottom: 0; } - - // stylelint-disable selector-max-class - > .accordion-collapse, - > .accordion-header .accordion-button, - > .accordion-header .accordion-button.collapsed { - @include border-radius(0); - } - // stylelint-enable selector-max-class - } -} - -@if $enable-dark-mode { - @include color-mode(dark) { - .accordion-button::after { - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; - } - } -} diff --git a/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss b/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss deleted file mode 100644 index b8cff9b..0000000 --- a/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss +++ /dev/null @@ -1,68 +0,0 @@ -// -// Base styles -// - -.alert { - // scss-docs-start alert-css-vars - --#{$prefix}alert-bg: transparent; - --#{$prefix}alert-padding-x: #{$alert-padding-x}; - --#{$prefix}alert-padding-y: #{$alert-padding-y}; - --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; - --#{$prefix}alert-color: inherit; - --#{$prefix}alert-border-color: transparent; - --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); - --#{$prefix}alert-border-radius: #{$alert-border-radius}; - --#{$prefix}alert-link-color: inherit; - // scss-docs-end alert-css-vars - - position: relative; - padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); - margin-bottom: var(--#{$prefix}alert-margin-bottom); - color: var(--#{$prefix}alert-color); - background-color: var(--#{$prefix}alert-bg); - border: var(--#{$prefix}alert-border); - @include border-radius(var(--#{$prefix}alert-border-radius)); -} - -// Headings for larger alerts -.alert-heading { - // Specified to prevent conflicts of changing $headings-color - color: inherit; -} - -// Provide class for links that match alerts -.alert-link { - font-weight: $alert-link-font-weight; - color: var(--#{$prefix}alert-link-color); -} - - -// Dismissible alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissible { - padding-right: $alert-dismissible-padding-r; - - // Adjust close link position - .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: $stretched-link-z-index + 1; - padding: $alert-padding-y * 1.25 $alert-padding-x; - } -} - - -// scss-docs-start alert-modifiers -// Generate contextual modifier classes for colorizing the alert -@each $state in map-keys($theme-colors) { - .alert-#{$state} { - --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); - --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); - --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); - --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); - } -} -// scss-docs-end alert-modifiers diff --git a/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss b/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss deleted file mode 100644 index cc3d269..0000000 --- a/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss +++ /dev/null @@ -1,38 +0,0 @@ -// Base class -// -// Requires one of the contextual, color modifier classes for `color` and -// `background-color`. - -.badge { - // scss-docs-start badge-css-vars - --#{$prefix}badge-padding-x: #{$badge-padding-x}; - --#{$prefix}badge-padding-y: #{$badge-padding-y}; - @include rfs($badge-font-size, --#{$prefix}badge-font-size); - --#{$prefix}badge-font-weight: #{$badge-font-weight}; - --#{$prefix}badge-color: #{$badge-color}; - --#{$prefix}badge-border-radius: #{$badge-border-radius}; - // scss-docs-end badge-css-vars - - display: inline-block; - padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x); - @include font-size(var(--#{$prefix}badge-font-size)); - font-weight: var(--#{$prefix}badge-font-weight); - line-height: 1; - color: var(--#{$prefix}badge-color); - text-align: center; - white-space: nowrap; - vertical-align: baseline; - @include border-radius(var(--#{$prefix}badge-border-radius)); - @include gradient-bg(); - - // Empty badges collapse automatically - &:empty { - display: none; - } -} - -// Quick fix for badges in buttons -.btn .badge { - position: relative; - top: -1px; -} diff --git a/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss b/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss deleted file mode 100644 index b8252ff..0000000 --- a/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss +++ /dev/null @@ -1,40 +0,0 @@ -.breadcrumb { - // scss-docs-start breadcrumb-css-vars - --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x}; - --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y}; - --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom}; - @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size); - --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg}; - --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius}; - --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color}; - --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x}; - --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color}; - // scss-docs-end breadcrumb-css-vars - - display: flex; - flex-wrap: wrap; - padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x); - margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom); - @include font-size(var(--#{$prefix}breadcrumb-font-size)); - list-style: none; - background-color: var(--#{$prefix}breadcrumb-bg); - @include border-radius(var(--#{$prefix}breadcrumb-border-radius)); -} - -.breadcrumb-item { - // The separator between breadcrumbs (by default, a forward-slash: "/") - + .breadcrumb-item { - padding-left: var(--#{$prefix}breadcrumb-item-padding-x); - - &::before { - float: left; // Suppress inline spacings and underlining of the separator - padding-right: var(--#{$prefix}breadcrumb-item-padding-x); - color: var(--#{$prefix}breadcrumb-divider-color); - content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; - } - } - - &.active { - color: var(--#{$prefix}breadcrumb-item-active-color); - } -} diff --git a/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss b/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss deleted file mode 100644 index 78e1252..0000000 --- a/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss +++ /dev/null @@ -1,147 +0,0 @@ -// Make the div behave like a button -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; // match .btn alignment given font-size hack above - - > .btn { - position: relative; - flex: 1 1 auto; - } - - // Bring the hover, focused, and "active" buttons to the front to overlay - // the borders properly - > .btn-check:checked + .btn, - > .btn-check:focus + .btn, - > .btn:hover, - > .btn:focus, - > .btn:active, - > .btn.active { - z-index: 1; - } -} - -// Optional: Group multiple button groups together for a toolbar -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; - - .input-group { - width: auto; - } -} - -.btn-group { - @include border-radius($btn-border-radius); - - // Prevent double borders when buttons are next to each other - > :not(.btn-check:first-child) + .btn, - > .btn-group:not(:first-child) { - margin-left: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn.dropdown-toggle-split:first-child, - > .btn-group:not(:last-child) > .btn { - @include border-end-radius(0); - } - - // The left radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-start-radius(0); - } -} - -// Sizing -// -// Remix the default button sizing classes into new ones for easier manipulation. - -.btn-group-sm > .btn { @extend .btn-sm; } -.btn-group-lg > .btn { @extend .btn-lg; } - - -// -// Split button dropdowns -// - -.dropdown-toggle-split { - padding-right: $btn-padding-x * .75; - padding-left: $btn-padding-x * .75; - - &::after, - .dropup &::after, - .dropend &::after { - margin-left: 0; - } - - .dropstart &::before { - margin-right: 0; - } -} - -.btn-sm + .dropdown-toggle-split { - padding-right: $btn-padding-x-sm * .75; - padding-left: $btn-padding-x-sm * .75; -} - -.btn-lg + .dropdown-toggle-split { - padding-right: $btn-padding-x-lg * .75; - padding-left: $btn-padding-x-lg * .75; -} - - -// The clickable button for toggling the menu -// Set the same inset shadow as the :active state -.btn-group.show .dropdown-toggle { - @include box-shadow($btn-active-box-shadow); - - // Show no shadow for `.btn-link` since it has no other button styles. - &.btn-link { - @include box-shadow(none); - } -} - - -// -// Vertical button groups -// - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; - - > .btn, - > .btn-group { - width: 100%; - } - - > .btn:not(:first-child), - > .btn-group:not(:first-child) { - margin-top: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn-group:not(:last-child) > .btn { - @include border-bottom-radius(0); - } - - // The top radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-top-radius(0); - } -} diff --git a/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss b/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss deleted file mode 100644 index caa4518..0000000 --- a/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss +++ /dev/null @@ -1,216 +0,0 @@ -// -// Base styles -// - -.btn { - // scss-docs-start btn-css-vars - --#{$prefix}btn-padding-x: #{$btn-padding-x}; - --#{$prefix}btn-padding-y: #{$btn-padding-y}; - --#{$prefix}btn-font-family: #{$btn-font-family}; - @include rfs($btn-font-size, --#{$prefix}btn-font-size); - --#{$prefix}btn-font-weight: #{$btn-font-weight}; - --#{$prefix}btn-line-height: #{$btn-line-height}; - --#{$prefix}btn-color: #{$btn-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-width: #{$btn-border-width}; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-border-radius: #{$btn-border-radius}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-box-shadow: #{$btn-box-shadow}; - --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity}; - --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5); - // scss-docs-end btn-css-vars - - display: inline-block; - padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x); - font-family: var(--#{$prefix}btn-font-family); - @include font-size(var(--#{$prefix}btn-font-size)); - font-weight: var(--#{$prefix}btn-font-weight); - line-height: var(--#{$prefix}btn-line-height); - color: var(--#{$prefix}btn-color); - text-align: center; - text-decoration: if($link-decoration == none, null, none); - white-space: $btn-white-space; - vertical-align: middle; - cursor: if($enable-button-pointers, pointer, null); - user-select: none; - border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color); - @include border-radius(var(--#{$prefix}btn-border-radius)); - @include gradient-bg(var(--#{$prefix}btn-bg)); - @include box-shadow(var(--#{$prefix}btn-box-shadow)); - @include transition($btn-transition); - - &:hover { - color: var(--#{$prefix}btn-hover-color); - text-decoration: if($link-hover-decoration == underline, none, null); - background-color: var(--#{$prefix}btn-hover-bg); - border-color: var(--#{$prefix}btn-hover-border-color); - } - - .btn-check + &:hover { - // override for the checkbox/radio buttons - color: var(--#{$prefix}btn-color); - background-color: var(--#{$prefix}btn-bg); - border-color: var(--#{$prefix}btn-border-color); - } - - &:focus-visible { - color: var(--#{$prefix}btn-hover-color); - @include gradient-bg(var(--#{$prefix}btn-hover-bg)); - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:focus-visible + & { - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:checked + &, - :not(.btn-check) + &:active, - &:first-child:active, - &.active, - &.show { - color: var(--#{$prefix}btn-active-color); - background-color: var(--#{$prefix}btn-active-bg); - // Remove CSS gradients if they're enabled - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-active-border-color); - @include box-shadow(var(--#{$prefix}btn-active-shadow)); - - &:focus-visible { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - } - - .btn-check:checked:focus-visible + & { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - &:disabled, - &.disabled, - fieldset:disabled & { - color: var(--#{$prefix}btn-disabled-color); - pointer-events: none; - background-color: var(--#{$prefix}btn-disabled-bg); - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-disabled-border-color); - opacity: var(--#{$prefix}btn-disabled-opacity); - @include box-shadow(none); - } -} - - -// -// Alternate buttons -// - -// scss-docs-start btn-variant-loops -@each $color, $value in $theme-colors { - .btn-#{$color} { - @if $color == "light" { - @include button-variant( - $value, - $value, - $hover-background: shade-color($value, $btn-hover-bg-shade-amount), - $hover-border: shade-color($value, $btn-hover-border-shade-amount), - $active-background: shade-color($value, $btn-active-bg-shade-amount), - $active-border: shade-color($value, $btn-active-border-shade-amount) - ); - } @else if $color == "dark" { - @include button-variant( - $value, - $value, - $hover-background: tint-color($value, $btn-hover-bg-tint-amount), - $hover-border: tint-color($value, $btn-hover-border-tint-amount), - $active-background: tint-color($value, $btn-active-bg-tint-amount), - $active-border: tint-color($value, $btn-active-border-tint-amount) - ); - } @else { - @include button-variant($value, $value); - } - } -} - -@each $color, $value in $theme-colors { - .btn-outline-#{$color} { - @include button-outline-variant($value); - } -} -// scss-docs-end btn-variant-loops - - -// -// Link buttons -// - -// Make a button look and behave like a link -.btn-link { - --#{$prefix}btn-font-weight: #{$font-weight-normal}; - --#{$prefix}btn-color: #{$btn-link-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-hover-color: #{$btn-link-hover-color}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-active-color: #{$btn-link-hover-color}; - --#{$prefix}btn-active-border-color: transparent; - --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color}; - --#{$prefix}btn-disabled-border-color: transparent; - --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows - --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb}; - - text-decoration: $link-decoration; - @if $enable-gradients { - background-image: none; - } - - &:hover, - &:focus-visible { - text-decoration: $link-hover-decoration; - } - - &:focus-visible { - color: var(--#{$prefix}btn-color); - } - - &:hover { - color: var(--#{$prefix}btn-hover-color); - } - - // No need for an active state here -} - - -// -// Button Sizes -// - -.btn-lg { - @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); -} - -.btn-sm { - @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); -} diff --git a/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss b/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss deleted file mode 100644 index dcebe6a..0000000 --- a/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss +++ /dev/null @@ -1,238 +0,0 @@ -// -// Base styles -// - -.card { - // scss-docs-start card-css-vars - --#{$prefix}card-spacer-y: #{$card-spacer-y}; - --#{$prefix}card-spacer-x: #{$card-spacer-x}; - --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y}; - --#{$prefix}card-title-color: #{$card-title-color}; - --#{$prefix}card-subtitle-color: #{$card-subtitle-color}; - --#{$prefix}card-border-width: #{$card-border-width}; - --#{$prefix}card-border-color: #{$card-border-color}; - --#{$prefix}card-border-radius: #{$card-border-radius}; - --#{$prefix}card-box-shadow: #{$card-box-shadow}; - --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius}; - --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y}; - --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x}; - --#{$prefix}card-cap-bg: #{$card-cap-bg}; - --#{$prefix}card-cap-color: #{$card-cap-color}; - --#{$prefix}card-height: #{$card-height}; - --#{$prefix}card-color: #{$card-color}; - --#{$prefix}card-bg: #{$card-bg}; - --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding}; - --#{$prefix}card-group-margin: #{$card-group-margin}; - // scss-docs-end card-css-vars - - position: relative; - display: flex; - flex-direction: column; - min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 - height: var(--#{$prefix}card-height); - color: var(--#{$prefix}body-color); - word-wrap: break-word; - background-color: var(--#{$prefix}card-bg); - background-clip: border-box; - border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - @include border-radius(var(--#{$prefix}card-border-radius)); - @include box-shadow(var(--#{$prefix}card-box-shadow)); - - > hr { - margin-right: 0; - margin-left: 0; - } - - > .list-group { - border-top: inherit; - border-bottom: inherit; - - &:first-child { - border-top-width: 0; - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); - } - - &:last-child { - border-bottom-width: 0; - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); - } - } - - // Due to specificity of the above selector (`.card > .list-group`), we must - // use a child selector here to prevent double borders. - > .card-header + .list-group, - > .list-group + .card-footer { - border-top: 0; - } -} - -.card-body { - // Enable `flex-grow: 1` for decks and groups so that card blocks take up - // as much space as possible, ensuring footers are aligned to the bottom. - flex: 1 1 auto; - padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x); - color: var(--#{$prefix}card-color); -} - -.card-title { - margin-bottom: var(--#{$prefix}card-title-spacer-y); - color: var(--#{$prefix}card-title-color); -} - -.card-subtitle { - margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list - margin-bottom: 0; - color: var(--#{$prefix}card-subtitle-color); -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link { - &:hover { - text-decoration: if($link-hover-decoration == underline, none, null); - } - - + .card-link { - margin-left: var(--#{$prefix}card-spacer-x); - } -} - -// -// Optional textual caps -// - -.card-header { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - margin-bottom: 0; // Removes the default margin-bottom of - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:first-child { - @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0); - } -} - -.card-footer { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:last-child { - @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius)); - } -} - - -// -// Header navs -// - -.card-header-tabs { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - border-bottom: 0; - - .nav-link.active { - background-color: var(--#{$prefix}card-bg); - border-bottom-color: var(--#{$prefix}card-bg); - } -} - -.card-header-pills { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list -} - -// Card image -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: var(--#{$prefix}card-img-overlay-padding); - @include border-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch -} - -.card-img, -.card-img-top { - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-bottom { - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); -} - - -// -// Card groups -// - -.card-group { - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - margin-bottom: var(--#{$prefix}card-group-margin); - } - - @include media-breakpoint-up(sm) { - display: flex; - flex-flow: row wrap; - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - flex: 1 0 0; - margin-bottom: 0; - - + .card { - margin-left: 0; - border-left: 0; - } - - // Handle rounded corners - @if $enable-rounded { - &:not(:last-child) { - @include border-end-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-right-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-right-radius: 0; - } - } - - &:not(:first-child) { - @include border-start-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-left-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-left-radius: 0; - } - } - } - } - } -} diff --git a/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss b/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss deleted file mode 100644 index 5ebf6b1..0000000 --- a/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss +++ /dev/null @@ -1,226 +0,0 @@ -// Notes on the classes: -// -// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) -// even when their scroll action started on a carousel, but for compatibility (with Firefox) -// we're preventing all actions instead -// 2. The .carousel-item-start and .carousel-item-end is used to indicate where -// the active slide is heading. -// 3. .active.carousel-item is the current slide. -// 4. .active.carousel-item-start and .active.carousel-item-end is the current -// slide in its in-transition state. Only one of these occurs at a time. -// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end -// is the upcoming slide in transition. - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; - @include clearfix(); -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - @include transition($carousel-transition); -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); -} - - -// -// Alternate transitions -// - -.carousel-fade { - .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; - } - - .carousel-item.active, - .carousel-item-next.carousel-item-start, - .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; - } - - .active.carousel-item-start, - .active.carousel-item-end { - z-index: 0; - opacity: 0; - @include transition(opacity 0s $carousel-transition-duration); - } -} - - -// -// Left/right controls for nav -// - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - // Use flex for alignment (1-3) - display: flex; // 1. allow flex styles - align-items: center; // 2. vertically center contents - justify-content: center; // 3. horizontally center contents - width: $carousel-control-width; - padding: 0; - color: $carousel-control-color; - text-align: center; - background: none; - filter: var(--#{$prefix}carousel-control-icon-filter); - border: 0; - opacity: $carousel-control-opacity; - @include transition($carousel-control-transition); - - // Hover/focus state - &:hover, - &:focus { - color: $carousel-control-color; - text-decoration: none; - outline: 0; - opacity: $carousel-control-hover-opacity; - } -} -.carousel-control-prev { - left: 0; - background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); -} -.carousel-control-next { - right: 0; - background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); -} - -// Icons for within -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: $carousel-control-icon-width; - height: $carousel-control-icon-width; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; -} - -.carousel-control-prev-icon { - background-image: escape-svg($carousel-control-prev-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-next-icon-bg) + "*/"}; -} -.carousel-control-next-icon { - background-image: escape-svg($carousel-control-next-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-prev-icon-bg) + "*/"}; -} - -// Optional indicator pips/controls -// -// Add a container (such as a list) with the following class and add an item (ideally a focusable control, -// like a button) with data-bs-target for each slide your carousel holds. - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - // Use the .carousel-control's width as margin so we don't overlay those - margin-right: $carousel-control-width; - margin-bottom: 1rem; - margin-left: $carousel-control-width; - - [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: $carousel-indicator-width; - height: $carousel-indicator-height; - padding: 0; - margin-right: $carousel-indicator-spacer; - margin-left: $carousel-indicator-spacer; - text-indent: -999px; - cursor: pointer; - background-color: var(--#{$prefix}carousel-indicator-active-bg); - background-clip: padding-box; - border: 0; - // Use transparent borders to increase the hit area by 10px on top and bottom. - border-top: $carousel-indicator-hit-area-height solid transparent; - border-bottom: $carousel-indicator-hit-area-height solid transparent; - opacity: $carousel-indicator-opacity; - @include transition($carousel-indicator-transition); - } - - .active { - opacity: $carousel-indicator-active-opacity; - } -} - - -// Optional captions -// -// - -.carousel-caption { - position: absolute; - right: (100% - $carousel-caption-width) * .5; - bottom: $carousel-caption-spacer; - left: (100% - $carousel-caption-width) * .5; - padding-top: $carousel-caption-padding-y; - padding-bottom: $carousel-caption-padding-y; - color: var(--#{$prefix}carousel-caption-color); - text-align: center; -} - -// Dark mode carousel - -@mixin carousel-dark() { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg-dark}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color-dark}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter-dark}; -} - -.carousel-dark { - @include carousel-dark(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include carousel-dark(); - } -} diff --git a/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss b/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss deleted file mode 100644 index d53c96f..0000000 --- a/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss +++ /dev/null @@ -1,66 +0,0 @@ -// Transparent background and border properties included for button version. -// iOS requires the button element instead of an anchor tag. -// If you want the anchor version, it requires `href="#"`. -// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile - -.btn-close { - // scss-docs-start close-css-vars - --#{$prefix}btn-close-color: #{$btn-close-color}; - --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) }; - --#{$prefix}btn-close-opacity: #{$btn-close-opacity}; - --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity}; - --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow}; - --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity}; - --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity}; - // scss-docs-end close-css-vars - - box-sizing: content-box; - width: $btn-close-width; - height: $btn-close-height; - padding: $btn-close-padding-y $btn-close-padding-x; - color: var(--#{$prefix}btn-close-color); - background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements - filter: var(--#{$prefix}btn-close-filter); - border: 0; // for button elements - @include border-radius(); - opacity: var(--#{$prefix}btn-close-opacity); - - // Override 's hover style - &:hover { - color: var(--#{$prefix}btn-close-color); - text-decoration: none; - opacity: var(--#{$prefix}btn-close-hover-opacity); - } - - &:focus { - outline: 0; - box-shadow: var(--#{$prefix}btn-close-focus-shadow); - opacity: var(--#{$prefix}btn-close-focus-opacity); - } - - &:disabled, - &.disabled { - pointer-events: none; - user-select: none; - opacity: var(--#{$prefix}btn-close-disabled-opacity); - } -} - -@mixin btn-close-white() { - --#{$prefix}btn-close-filter: #{$btn-close-filter-dark}; -} - -.btn-close-white { - @include btn-close-white(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}btn-close-filter: #{$btn-close-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include btn-close-white(); - } -} diff --git a/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss b/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss deleted file mode 100644 index 83b3138..0000000 --- a/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss +++ /dev/null @@ -1,41 +0,0 @@ -// Container widths -// -// Set the container width, and override it for fixed navbars in media queries. - -@if $enable-container-classes { - // Single container class with breakpoint max-widths - .container, - // 100% wide container at all breakpoints - .container-fluid { - @include make-container(); - } - - // Responsive containers that are 100% wide until a breakpoint - @each $breakpoint, $container-max-width in $container-max-widths { - .container-#{$breakpoint} { - @extend .container-fluid; - } - - @include media-breakpoint-up($breakpoint, $grid-breakpoints) { - %responsive-container-#{$breakpoint} { - max-width: $container-max-width; - } - - // Extend each breakpoint which is smaller or equal to the current breakpoint - $extend-breakpoint: true; - - @each $name, $width in $grid-breakpoints { - @if ($extend-breakpoint) { - .container#{breakpoint-infix($name, $grid-breakpoints)} { - @extend %responsive-container-#{$breakpoint}; - } - - // Once the current breakpoint is reached, stop extending - @if ($breakpoint == $name) { - $extend-breakpoint: false; - } - } - } - } - } -} diff --git a/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss b/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss deleted file mode 100644 index 587ebb4..0000000 --- a/05_react/uebungen/u13_input-amount/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss +++ /dev/null @@ -1,250 +0,0 @@ -// The dropdown wrapper (`
      `) -.dropup, -.dropend, -.dropdown, -.dropstart, -.dropup-center, -.dropdown-center { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; - - // Generate the caret automatically - @include caret(); -} - -// The dropdown menu -.dropdown-menu { - // scss-docs-start dropdown-css-vars - --#{$prefix}dropdown-zindex: #{$zindex-dropdown}; - --#{$prefix}dropdown-min-width: #{$dropdown-min-width}; - --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x}; - --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y}; - --#{$prefix}dropdown-spacer: #{$dropdown-spacer}; - @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size); - --#{$prefix}dropdown-color: #{$dropdown-color}; - --#{$prefix}dropdown-bg: #{$dropdown-bg}; - --#{$prefix}dropdown-border-color: #{$dropdown-border-color}; - --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius}; - --#{$prefix}dropdown-border-width: #{$dropdown-border-width}; - --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius}; - --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg}; - --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y}; - --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow}; - --#{$prefix}dropdown-link-color: #{$dropdown-link-color}; - --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color}; - --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg}; - --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color}; - --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg}; - --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color}; - --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x}; - --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y}; - --#{$prefix}dropdown-header-color: #{$dropdown-header-color}; - --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x}; - --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y}; - // scss-docs-end dropdown-css-vars - - position: absolute; - z-index: var(--#{$prefix}dropdown-zindex); - display: none; // none by default, but block on "open" of the menu - min-width: var(--#{$prefix}dropdown-min-width); - padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x); - margin: 0; // Override default margin of ul - @include font-size(var(--#{$prefix}dropdown-font-size)); - color: var(--#{$prefix}dropdown-color); - text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) - list-style: none; - background-color: var(--#{$prefix}dropdown-bg); - background-clip: padding-box; - border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color); - @include border-radius(var(--#{$prefix}dropdown-border-radius)); - @include box-shadow(var(--#{$prefix}dropdown-box-shadow)); - - &[data-bs-popper] { - top: 100%; - left: 0; - margin-top: var(--#{$prefix}dropdown-spacer); - } - - @if $dropdown-padding-y == 0 { - > .dropdown-item:first-child, - > li:first-child .dropdown-item { - @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - > .dropdown-item:last-child, - > li:last-child .dropdown-item { - @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - - } -} - -// scss-docs-start responsive-breakpoints -// We deliberately hardcode the `bs-` prefix because we check -// this custom property in JS to determine Popper's positioning - -@each $breakpoint in map-keys($grid-breakpoints) { - @include media-breakpoint-up($breakpoint) { - $infix: breakpoint-infix($breakpoint, $grid-breakpoints); - - .dropdown-menu#{$infix}-start { - --bs-position: start; - - &[data-bs-popper] { - right: auto; - left: 0; - } - } - - .dropdown-menu#{$infix}-end { - --bs-position: end; - - &[data-bs-popper] { - right: 0; - left: auto; - } - } - } -} -// scss-docs-end responsive-breakpoints - -// Allow for dropdowns to go bottom up (aka, dropup-menu) -// Just add .dropup after the standard .dropdown class and you're set. -.dropup { - .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(up); - } -} - -.dropend { - .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(end); - &::after { - vertical-align: 0; - } - } -} - -.dropstart { - .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(start); - &::before { - vertical-align: 0; - } - } -} - - -// Dividers (basically an `
      `) within the dropdown -.dropdown-divider { - height: 0; - margin: var(--#{$prefix}dropdown-divider-margin-y) 0; - overflow: hidden; - border-top: 1px solid var(--#{$prefix}dropdown-divider-bg); - opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
      element -} - -// Links, buttons, and more within the dropdown menu -// -// `
      ` alignment by inheriting `text-align`. -// 3. Fix alignment for Safari - -th { - font-weight: $table-th-font-weight; // 1 - text-align: inherit; // 2 - text-align: -webkit-match-parent; // 3 -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - - -// Forms -// -// 1. Allow labels to use `margin` for spacing. - -label { - display: inline-block; // 1 -} - -// Remove the default `border-radius` that macOS Chrome adds. -// See https://github.com/twbs/bootstrap/issues/24093 - -button { - // stylelint-disable-next-line property-disallowed-list - border-radius: 0; -} - -// Explicitly remove focus outline in Chromium when it shouldn't be -// visible (e.g. as result of mouse click or touch tap). It already -// should be doing this automatically, but seems to currently be -// confused and applies its very visible two-tone outline anyway. - -button:focus:not(:focus-visible) { - outline: 0; -} - -// 1. Remove the margin in Firefox and Safari - -input, -button, -select, -optgroup, -textarea { - margin: 0; // 1 - font-family: inherit; - @include font-size(inherit); - line-height: inherit; -} - -// Remove the inheritance of text transform in Firefox -button, -select { - text-transform: none; -} -// Set the cursor for non-`` alignment by inheriting `text-align`. -// 3. Fix alignment for Safari - -th { - font-weight: $table-th-font-weight; // 1 - text-align: inherit; // 2 - text-align: -webkit-match-parent; // 3 -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - - -// Forms -// -// 1. Allow labels to use `margin` for spacing. - -label { - display: inline-block; // 1 -} - -// Remove the default `border-radius` that macOS Chrome adds. -// See https://github.com/twbs/bootstrap/issues/24093 - -button { - // stylelint-disable-next-line property-disallowed-list - border-radius: 0; -} - -// Explicitly remove focus outline in Chromium when it shouldn't be -// visible (e.g. as result of mouse click or touch tap). It already -// should be doing this automatically, but seems to currently be -// confused and applies its very visible two-tone outline anyway. - -button:focus:not(:focus-visible) { - outline: 0; -} - -// 1. Remove the margin in Firefox and Safari - -input, -button, -select, -optgroup, -textarea { - margin: 0; // 1 - font-family: inherit; - @include font-size(inherit); - line-height: inherit; -} - -// Remove the inheritance of text transform in Firefox -button, -select { - text-transform: none; -} -// Set the cursor for non-` - - - - ); -}; - -export default Navbar; diff --git a/05_react/uebungen/u15_routing/src/main.jsx b/05_react/uebungen/u15_routing/src/main.jsx deleted file mode 100644 index 8cacd1a..0000000 --- a/05_react/uebungen/u15_routing/src/main.jsx +++ /dev/null @@ -1,19 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; - -import { BrowserRouter } from 'react-router-dom'; - -import App from './App.jsx'; - -import 'bootstrap/dist/css/bootstrap.min.css'; -// import './styles/main.scss'; - -const root = createRoot(document.getElementById('root')); - -root.render( - - - - - , -); diff --git a/05_react/uebungen/u15_routing/src/pages/AboutPage.jsx b/05_react/uebungen/u15_routing/src/pages/AboutPage.jsx deleted file mode 100644 index 0fbfc09..0000000 --- a/05_react/uebungen/u15_routing/src/pages/AboutPage.jsx +++ /dev/null @@ -1,34 +0,0 @@ -const AboutPage = (props) => { - return ( -
      -

      About

      -

      - Lorem ipsum dolor sit amet consectetur adipisicing elit. Minima, voluptatibus nobis molestiae, dignissimos id - dolores minus iste quisquam harum vitae rem dolorem debitis natus asperiores amet rerum ratione laboriosam quam. - Sit corporis voluptate laboriosam doloribus incidunt voluptatibus repellat. Excepturi vitae perferendis odit - enim, iusto, consequuntur assumenda corrupti autem eius minus explicabo tempore amet? Facere repudiandae, culpa - autem quae sint accusantium! Recusandae dicta itaque pariatur, veritatis voluptatem reprehenderit? Error facilis - fugit veritatis quam harum tempore dignissimos laboriosam commodi quod. Quas magnam modi saepe quae ab ipsam - amet veritatis molestias facilis odit? Quos nihil minus suscipit vel unde ipsa non quia ex quis obcaecati fugiat - animi nobis sit ducimus libero dolorem voluptates numquam, assumenda autem? Excepturi reprehenderit hic - aspernatur tempora, maiores nihil. Itaque quisquam expedita repellat voluptate, rem delectus sed, laborum dolor - minima nam ipsum possimus odit asperiores molestiae ex fugit sequi cupiditate doloremque tempora inventore - praesentium quo! Minima minus numquam aspernatur! Laudantium quisquam perspiciatis consectetur eos, nobis - doloribus reiciendis accusamus dolor quos cum cumque voluptatibus vero harum sapiente consequuntur eaque in quas - obcaecati. Et mollitia ex esse sint facilis fuga perferendis! Saepe ipsa voluptatum, nam labore corrupti, - laboriosam, sit ex explicabo facere laborum sunt natus eaque! Accusamus culpa harum repellendus iure, quasi, cum - architecto fugit ut est voluptatem cumque nisi recusandae? Cumque culpa sequi quis dolores nostrum omnis facilis - beatae quam similique, reiciendis nam modi hic libero natus blanditiis voluptatibus, magnam quos ea voluptate - odit commodi sapiente iusto dolor molestias! Blanditiis? Accusamus itaque nulla exercitationem. Maiores vitae at - dicta ipsam. Ullam eum excepturi eius, facere cumque nulla alias ab natus distinctio officia placeat possimus - optio commodi molestias repellendus voluptatem dicta delectus? Maxime aliquid numquam qui vitae doloribus - consectetur temporibus doloremque, perspiciatis sint quia obcaecati, nemo saepe velit odio nobis laborum. Natus - iure id nostrum quidem doloribus quae explicabo deserunt et quia? Labore dicta unde eum est esse reiciendis - maiores dignissimos temporibus ullam magnam, amet exercitationem praesentium voluptas, impedit sed alias, - eveniet voluptates nisi nulla dolore sequi similique fugit? Reiciendis, animi quibusdam? Pariatur sequi cum -

      -
      - ); -}; - -export default AboutPage; diff --git a/05_react/uebungen/u15_routing/src/pages/HomePage.jsx b/05_react/uebungen/u15_routing/src/pages/HomePage.jsx deleted file mode 100644 index dbe58d5..0000000 --- a/05_react/uebungen/u15_routing/src/pages/HomePage.jsx +++ /dev/null @@ -1,10 +0,0 @@ -const HomePage = (props) => { - return ( -
      -

      Home

      -

      Lorem, ipsum dolor sit amet consectetur adipisicing elit. Ad, voluptatibus.

      -
      - ); -}; - -export default HomePage; diff --git a/05_react/uebungen/u15_routing/src/routes/Router.jsx b/05_react/uebungen/u15_routing/src/routes/Router.jsx deleted file mode 100644 index 01695be..0000000 --- a/05_react/uebungen/u15_routing/src/routes/Router.jsx +++ /dev/null @@ -1,17 +0,0 @@ -import { Routes, Route } from 'react-router-dom'; - -import AboutPage from '../pages/AboutPage'; -import HomePage from '../pages/HomePage'; - -const Router = (props) => { - // const { } = props; - - return ( - - } /> - } /> - - ); -}; - -export default Router; diff --git a/05_react/uebungen/u15_routing/vite.config.js b/05_react/uebungen/u15_routing/vite.config.js deleted file mode 100644 index 8b0f57b..0000000 --- a/05_react/uebungen/u15_routing/vite.config.js +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' - -// https://vite.dev/config/ -export default defineConfig({ - plugins: [react()], -}) diff --git a/05_react/uebungen/u17_validator.zip b/05_react/uebungen/u17_validator.zip deleted file mode 100644 index 6f4c494..0000000 Binary files a/05_react/uebungen/u17_validator.zip and /dev/null differ diff --git a/05_react/uebungen/u17_validator/.gitignore b/05_react/uebungen/u17_validator/.gitignore deleted file mode 100644 index a547bf3..0000000 --- a/05_react/uebungen/u17_validator/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/05_react/uebungen/u17_validator/.oxlintrc.json b/05_react/uebungen/u17_validator/.oxlintrc.json deleted file mode 100644 index 1255078..0000000 --- a/05_react/uebungen/u17_validator/.oxlintrc.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$schema": "./node_modules/oxlint/configuration_schema.json", - "plugins": ["react", "oxc"], - "rules": { - "react/rules-of-hooks": "error", - "react/only-export-components": ["warn", { "allowConstantExport": true }] - } -} diff --git a/05_react/uebungen/u17_validator/README.md b/05_react/uebungen/u17_validator/README.md deleted file mode 100644 index d937833..0000000 --- a/05_react/uebungen/u17_validator/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# React + Vite - -This template provides a minimal setup to get React working in Vite with HMR and some Oxlint rules. - -Currently, two official plugins are available: - -- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs) -- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) - -## React Compiler - -The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). - -## Expanding the Oxlint configuration - -If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and Oxlint's TypeScript related rules in your project. diff --git a/05_react/uebungen/u17_validator/index.html b/05_react/uebungen/u17_validator/index.html deleted file mode 100644 index 3c74f77..0000000 --- a/05_react/uebungen/u17_validator/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - u17_validator - - -
      - - - diff --git a/05_react/uebungen/u17_validator/package-lock.json b/05_react/uebungen/u17_validator/package-lock.json deleted file mode 100644 index 94c1f11..0000000 --- a/05_react/uebungen/u17_validator/package-lock.json +++ /dev/null @@ -1,2237 +0,0 @@ -{ - "name": "02_react-with-forms", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "02_react-with-forms", - "version": "0.0.0", - "dependencies": { - "bootstrap": "^5.3.8", - "react": "^19.2.8", - "react-dom": "^19.2.8", - "react-icons": "^5.7.0", - "react-router-dom": "^7.18.2" - }, - "devDependencies": { - "@types/react": "^19.2.18", - "@types/react-dom": "^19.2.4", - "@vitejs/plugin-react": "^6.0.5", - "oxlint": "^1.78.0", - "sass-embedded": "^1.100.0", - "vite": "^8.2.1" - } - }, - "node_modules/@bufbuild/protobuf": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.13.0.tgz", - "integrity": "sha512-acq7c49vxfm1ggJ95P70TX7ABDM0vxr1SYD3BB0o0jnBLB4OAqeHyKuN+cD3w80gXEDQ2zxHpR6CUeA+O/aU9g==", - "dev": true, - "license": "(Apache-2.0 AND BSD-3-Clause)" - }, - "node_modules/@oxc-project/types": { - "version": "0.143.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.143.0.tgz", - "integrity": "sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@oxlint/binding-android-arm-eabi": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.78.0.tgz", - "integrity": "sha512-Bu819lmAfZMUHErrpe0cEWj3iaefuUODHSU8+UbXy67V/r7/7f4K3FL0NmbD85E+wiFLDYuhP8Zlv0XnVeXshw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-android-arm64": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.78.0.tgz", - "integrity": "sha512-CDfxZgB61B7buRdY2FJoAYYPPXCZ1EoC1LKscnC5dg3kjobdxiconvAvvN1BmHyW4PyFT3jRLDag/BY/roSNBQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-darwin-arm64": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.78.0.tgz", - "integrity": "sha512-2Y2U9Ahrz+OO0Ej88f9SJYq51/jUBp1Mc7iZu0ukrbeeZ3gpRGfzIFnoqfHDY96xr0GEfNrPUBFEy0nN5aD7HA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-darwin-x64": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.78.0.tgz", - "integrity": "sha512-rpych6eJq6m9jDRypTEaPD1xysaEW5h9+xuxhGK/QhOg+/xaqPZrCrTNoIl/f3nEjuJeCEmstNDlrE9rJi/3/g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-freebsd-x64": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.78.0.tgz", - "integrity": "sha512-IcMGrQT3QizkOESUJd5et+rOhVqSkNDfNik1cvrKDqIbzqx9KMtRswpFgkCuNTSwylCFLKhGUu8KmqY1ZnC0Dg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm-gnueabihf": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.78.0.tgz", - "integrity": "sha512-/uLdoJ0IXE6vo/0f0LKjinQAp+re+VMaCWaNT8ENIv2EOCkSsc8SGaflXAuW0Jua2dq5+GLVWm1NQK7P3UFSNQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm-musleabihf": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.78.0.tgz", - "integrity": "sha512-7xi4Wb/O8NRJhLoUXmDJMUVpNYvB5kefdhFU1Jb8rtae4QoXlTiLwI14X4YvAXVZLNZChP8m5qO9SQAlWQTbkQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm64-gnu": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.78.0.tgz", - "integrity": "sha512-4hFW0+fVXa3OIh1Y4A5SPkmvI4wuuBSrCVKzOyE7PTjhc7yEqZ1pmvEEeS5Lj/MaqvegFxXyF33N+6jkehxdyg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm64-musl": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.78.0.tgz", - "integrity": "sha512-oC0mvsgBJjlMijSDEhx9KuvR9zYeHXceA9MjbuXB1F8NSR78Yj2unOBrstEvTVaq+pko+kuue6DajC00eqvTdg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-ppc64-gnu": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.78.0.tgz", - "integrity": "sha512-XAllT5SUZS+ohjuZ3/5S0cwe0r7eboiuigeStCZ5DXRYx/2KVM2UvQXvAfyzXEimtQjAB7cDQ2YxDe2Zl2WNQQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-riscv64-gnu": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.78.0.tgz", - "integrity": "sha512-trucMER/0QtecoXvc1y/UVqE3kwJipDwrx4oHfj+nNm3dq2zjP44WT0CfHNDPM3G1DXIkx/gY6lAD21NSCZVhA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-riscv64-musl": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.78.0.tgz", - "integrity": "sha512-cm3O4F/HQbdzOUX5mKHqG5KDL6E5w0pnlZ+fbBy2rmLryPOowkuLagFHTopQsEIpjcaZoPOrL+BmmAytAG9HFg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-s390x-gnu": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.78.0.tgz", - "integrity": "sha512-33wRf6HqGNsybJ3qX4cGaQN2ODPxNmc1rMa0mrTmx3eFq1VzOnvQooi9bIGVYakW8a/wmqVx1mgsUm8R2xfTiw==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-x64-gnu": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.78.0.tgz", - "integrity": "sha512-rRdISSYegj6VganMZ9tjRjijowfHJ09IZU01i0toBAqr6n5LEtwHq2IeS4FjW2RoskOHlb6efB26H5izYb3GEQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-x64-musl": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.78.0.tgz", - "integrity": "sha512-GmsP4rW0xTL6u5CVdcDsaN5Fbc7hBc382Wmar1kttbnwSEviM+rSINKOMQ+UQ6iH+AGwC+8gaAiwu134Tgh6Lg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-openharmony-arm64": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.78.0.tgz", - "integrity": "sha512-sy9yeYuADc8a+n4TLBayzMCZiHPW78DcIFVpOXTmdKHWQeM9xe5uzkqIIZmi326D5hY9XVwacipEB1p7tQjPAg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-arm64-msvc": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.78.0.tgz", - "integrity": "sha512-rjc2hF1KfMi8fZj1X/m3AmnHbdsF3rL0v6KQg0Uc880Yb2khjz+3U14sfdZ7jWTpRnN1m1NQa/TT7uU9lJWPrA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-ia32-msvc": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.78.0.tgz", - "integrity": "sha512-zcuXFVrEFHIafRfkCQT8w/Xe41o07ozl/vwHq7p94vB29xVzsB0sZGYORU1jhcYKv3Lr0J3HbJ2T4fHH5rWmvA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-x64-msvc": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.78.0.tgz", - "integrity": "sha512-Sb5ocmLSuYeOuXd+CFOToGKp/gjXUEWDnvIGwhnh8aq8wY4TMmEnKnvbogSW7RdMZv77JSARduS7/gv+khYEjA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz", - "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.3", - "is-glob": "^4.0.3", - "node-addon-api": "^7.0.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.6.0", - "@parcel/watcher-darwin-arm64": "2.6.0", - "@parcel/watcher-darwin-x64": "2.6.0", - "@parcel/watcher-freebsd-x64": "2.6.0", - "@parcel/watcher-linux-arm-glibc": "2.6.0", - "@parcel/watcher-linux-arm-musl": "2.6.0", - "@parcel/watcher-linux-arm64-glibc": "2.6.0", - "@parcel/watcher-linux-arm64-musl": "2.6.0", - "@parcel/watcher-linux-x64-glibc": "2.6.0", - "@parcel/watcher-linux-x64-musl": "2.6.0", - "@parcel/watcher-win32-arm64": "2.6.0", - "@parcel/watcher-win32-x64": "2.6.0" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz", - "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz", - "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz", - "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz", - "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz", - "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz", - "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz", - "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz", - "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz", - "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz", - "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz", - "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz", - "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "license": "MIT", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.3.tgz", - "integrity": "sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.3.tgz", - "integrity": "sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.3.tgz", - "integrity": "sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.3.tgz", - "integrity": "sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.3.tgz", - "integrity": "sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.3.tgz", - "integrity": "sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.3.tgz", - "integrity": "sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.3.tgz", - "integrity": "sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.3.tgz", - "integrity": "sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.3.tgz", - "integrity": "sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.3.tgz", - "integrity": "sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.3.tgz", - "integrity": "sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.3.tgz", - "integrity": "sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.3.tgz", - "integrity": "sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.2.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", - "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.5.tgz", - "integrity": "sha512-BOVzne/NL162sMdResB25mUv+vWMF5NoAjNf09TeGlE7ZpszZWSD3winycicLJw72yeVsoCn/2kOhEuCvEShMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rolldown/pluginutils": "^1.0.1" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", - "babel-plugin-react-compiler": "^1.0.0", - "vite": "^8.0.0" - }, - "peerDependenciesMeta": { - "@rolldown/plugin-babel": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true - } - } - }, - "node_modules/bootstrap": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz", - "integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/twbs" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - } - ], - "license": "MIT", - "peerDependencies": { - "@popperjs/core": "^2.11.8" - } - }, - "node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/colorjs.io": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", - "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", - "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/immutable": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", - "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lightningcss": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", - "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.33.0", - "lightningcss-darwin-arm64": "1.33.0", - "lightningcss-darwin-x64": "1.33.0", - "lightningcss-freebsd-x64": "1.33.0", - "lightningcss-linux-arm-gnueabihf": "1.33.0", - "lightningcss-linux-arm64-gnu": "1.33.0", - "lightningcss-linux-arm64-musl": "1.33.0", - "lightningcss-linux-x64-gnu": "1.33.0", - "lightningcss-linux-x64-musl": "1.33.0", - "lightningcss-win32-arm64-msvc": "1.33.0", - "lightningcss-win32-x64-msvc": "1.33.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", - "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", - "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", - "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", - "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", - "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", - "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", - "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", - "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", - "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", - "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", - "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/nanoid": { - "version": "3.3.18", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", - "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/oxlint": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.78.0.tgz", - "integrity": "sha512-QgQePuxIqKOzo1KSjG2EnITEeWvWnKAm77eq8nrMtf6AGoA+zyGc4PFYtDNJSD25g/ibOwfQ851hZ4/SPkMVoA==", - "dev": true, - "license": "MIT", - "bin": { - "oxlint": "bin/oxlint" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/Boshen" - }, - "optionalDependencies": { - "@oxlint/binding-android-arm-eabi": "1.78.0", - "@oxlint/binding-android-arm64": "1.78.0", - "@oxlint/binding-darwin-arm64": "1.78.0", - "@oxlint/binding-darwin-x64": "1.78.0", - "@oxlint/binding-freebsd-x64": "1.78.0", - "@oxlint/binding-linux-arm-gnueabihf": "1.78.0", - "@oxlint/binding-linux-arm-musleabihf": "1.78.0", - "@oxlint/binding-linux-arm64-gnu": "1.78.0", - "@oxlint/binding-linux-arm64-musl": "1.78.0", - "@oxlint/binding-linux-ppc64-gnu": "1.78.0", - "@oxlint/binding-linux-riscv64-gnu": "1.78.0", - "@oxlint/binding-linux-riscv64-musl": "1.78.0", - "@oxlint/binding-linux-s390x-gnu": "1.78.0", - "@oxlint/binding-linux-x64-gnu": "1.78.0", - "@oxlint/binding-linux-x64-musl": "1.78.0", - "@oxlint/binding-openharmony-arm64": "1.78.0", - "@oxlint/binding-win32-arm64-msvc": "1.78.0", - "@oxlint/binding-win32-ia32-msvc": "1.78.0", - "@oxlint/binding-win32-x64-msvc": "1.78.0" - }, - "peerDependencies": { - "oxlint-tsgolint": ">=7.0.2001", - "vite-plus": "*" - }, - "peerDependenciesMeta": { - "oxlint-tsgolint": { - "optional": true - }, - "vite-plus": { - "optional": true - } - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", - "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.17", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/react": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", - "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", - "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.8" - } - }, - "node_modules/react-icons": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.7.0.tgz", - "integrity": "sha512-LBLy340Rzqy6+/yVhZKT3B/QpP1BZaesGqasf09HPOBzRarcDIFH0WwXlXQfE7q7ipxK4MSiC5DIBWURCny6fw==", - "license": "MIT", - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-router": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.2.tgz", - "integrity": "sha512-aUVMjFm3GAPTTZL7oYr5E7ETiqfQCHRLH+B+5afnICvf0r7kkK4eR6SMuwbSTJw/7t+12khT/Kahij49fqOCIg==", - "license": "MIT", - "dependencies": { - "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/react-router-dom": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.2.tgz", - "integrity": "sha512-AIKJ/jgGlFb3EbfCXk5Gzshiwt+l3mqbCrNjmEWMMjqQxNJ3svBa6bgzFyCC2Sw3RA0VWF1kg3uQf2OFhxb8hw==", - "license": "MIT", - "dependencies": { - "react-router": "7.18.2" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - } - }, - "node_modules/readdirp": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", - "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/rolldown": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.3.tgz", - "integrity": "sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "=0.143.0", - "@rolldown/pluginutils": "^1.0.0" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.2.3", - "@rolldown/binding-darwin-arm64": "1.2.3", - "@rolldown/binding-darwin-x64": "1.2.3", - "@rolldown/binding-freebsd-x64": "1.2.3", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.3", - "@rolldown/binding-linux-arm64-gnu": "1.2.3", - "@rolldown/binding-linux-arm64-musl": "1.2.3", - "@rolldown/binding-linux-ppc64-gnu": "1.2.3", - "@rolldown/binding-linux-s390x-gnu": "1.2.3", - "@rolldown/binding-linux-x64-gnu": "1.2.3", - "@rolldown/binding-linux-x64-musl": "1.2.3", - "@rolldown/binding-openharmony-arm64": "1.2.3", - "@rolldown/binding-win32-arm64-msvc": "1.2.3", - "@rolldown/binding-win32-x64-msvc": "1.2.3" - } - }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/sass": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.100.0.tgz", - "integrity": "sha512-B5j0rYMlinhhOo9tjQebMVVn0TfyXAF+wB3b2ggZUuJ/is/Y+7+JGjirAMxHZ9Z3hIP98NPfamlAkBHa1lAaXQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "chokidar": "^5.0.0", - "immutable": "^5.1.5", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=20.19.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" - } - }, - "node_modules/sass-embedded": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.100.0.tgz", - "integrity": "sha512-Ut8wlQSk19tm7jMK6mz6cF1+e+E7tUnW2tM02zQDPnOTcVbV8qCQG8UWxZkkNlY50+hV3hqP24OOkUlMz8xBpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@bufbuild/protobuf": "^2.5.0", - "colorjs.io": "^0.5.0", - "immutable": "^5.1.5", - "rxjs": "^7.4.0", - "supports-color": "^8.1.1", - "sync-child-process": "^1.0.2", - "varint": "^6.0.0" - }, - "bin": { - "sass": "dist/bin/sass.js" - }, - "engines": { - "node": ">=16.0.0" - }, - "optionalDependencies": { - "sass-embedded-all-unknown": "1.100.0", - "sass-embedded-android-arm": "1.100.0", - "sass-embedded-android-arm64": "1.100.0", - "sass-embedded-android-riscv64": "1.100.0", - "sass-embedded-android-x64": "1.100.0", - "sass-embedded-darwin-arm64": "1.100.0", - "sass-embedded-darwin-x64": "1.100.0", - "sass-embedded-linux-arm": "1.100.0", - "sass-embedded-linux-arm64": "1.100.0", - "sass-embedded-linux-musl-arm": "1.100.0", - "sass-embedded-linux-musl-arm64": "1.100.0", - "sass-embedded-linux-musl-riscv64": "1.100.0", - "sass-embedded-linux-musl-x64": "1.100.0", - "sass-embedded-linux-riscv64": "1.100.0", - "sass-embedded-linux-x64": "1.100.0", - "sass-embedded-unknown-all": "1.100.0", - "sass-embedded-win32-arm64": "1.100.0", - "sass-embedded-win32-x64": "1.100.0" - } - }, - "node_modules/sass-embedded-all-unknown": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.100.0.tgz", - "integrity": "sha512-auFtXY/kwYILmSVjtBDwyj0axcLbYYiffOKWoaXHnI5bsYwiRbBh3EneR1rpbX2ZIZCrwX93i5pxKLTZF/662Q==", - "cpu": [ - "!arm", - "!arm64", - "!riscv64", - "!x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "sass": "1.100.0" - } - }, - "node_modules/sass-embedded-android-arm": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.100.0.tgz", - "integrity": "sha512-70f3HgX2pFNmzpGQ86n5e6QfWn2fP4QUQGfFQK0P1XH73ZLIzLo2YqygrGKGKeeqtc5eU2Wl1/xQzhzuKnO4kw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-arm64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.100.0.tgz", - "integrity": "sha512-W+Ru9JwTnfU0UX3jSZcbqFdtKFMcYdfFwytc57h2DgnqCOIiAqI2E06mABZBZC+r3LwXCBuS5GbXAGeVgvVDkA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-riscv64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.100.0.tgz", - "integrity": "sha512-icU3o0V/uCSytSpf+tX5Lf51BvyQEbLzDUJfUi9etSauYBGHpPKkdtdZH0si4v98phq11Kl8rSV1SggksxF1Hg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-x64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.100.0.tgz", - "integrity": "sha512-mevF9VQk6gEYByy8+jusaHGmd7Usb2ytX/DsEOd0JtOGCtcf1kh575xJ6OUBDIcJ15uLnbau/0iy1eP6WVBvWA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-darwin-arm64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.100.0.tgz", - "integrity": "sha512-1PVlYi61POo93IT/FfrG1mc1tAHxeSTyUALF2aOFmXGWjVXr3bQzEQiBGCOvQbj/ix+5hNyXFXcEMEyKvtUJJA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-darwin-x64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.100.0.tgz", - "integrity": "sha512-x97o3JnGyImZNCIVs9wQHJUE5QCvmVIKaH1cwrz/5dK7OT1FpeNiW+u9TUomP9hG6Ekjd8EL8NBHpxTfIhdjmg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-arm": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.100.0.tgz", - "integrity": "sha512-9Ul7O1eKrc5YlhwWjkp8tZPSe3UEwSZ1uwUZOQom1HL0pRlBA6F/IlGZYFTLwnHMIP1fc77MMNaBRfc05mKMpw==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-arm64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.100.0.tgz", - "integrity": "sha512-Dwjmj8Z6VRy7rAi53JAdEwIyUjpfl7PhpSc2/LpQPQx+aO5Dp7Spaipkax0ufJl1SoDUdchCsM4y/88YaluorQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-arm": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.100.0.tgz", - "integrity": "sha512-sl0JgbGloPyJg66XXx5UDSDScZ0oU85DpMQU4JU/sCUCFj1Z8zZ69SJWKTCNE4/jwnce7WI2zPCV5AG+RHOZJw==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-arm64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.100.0.tgz", - "integrity": "sha512-XpACJB2KjSLjf2e9uuvGVdOURsoNrFqgRiihhXyUHK9W0t3LIHb7z5MA/7XGPIT9bWSOO2zyw+rH/FHtDV/Yrg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-riscv64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.100.0.tgz", - "integrity": "sha512-ShvI0Kx04mwoCARwZ0UjiT97isQvzO80tAt91zmFyHLN9kelc/IrQi940farSm2xQVPCKdeVyeG0ekBsokSpYQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-x64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.100.0.tgz", - "integrity": "sha512-TDBCRWNuS4RDLQXvRc1gjZlWiWTWaWGp0Bwu/IKwJxov81lsvrCs3TihTyNXtW7V5aoN4Ky3r0QOkNb3mwmBnA==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-riscv64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.100.0.tgz", - "integrity": "sha512-j4ENJGOheO+fm3j/yorLxCjBP6/XskrZx7dTLlT+lXYwN/qqCqoA/gsNLI0McS3DFM6GBwPiffzWsdWS8t6sEQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-x64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.100.0.tgz", - "integrity": "sha512-0vUSN8j0WGtCJIOPh//EmUvYGHW0QOe5iul8qyhPk50MAcw49MA0r34AhftjDdx94ILPF6vApFs0gwHPQRlpVA==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-unknown-all": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.100.0.tgz", - "integrity": "sha512-c+naBgWId4MIpToXcI0DgqetjdAkwTTAxFAuOaBz7HUXLdyG1oZRrEvSsbe41nEdQOKH0vgofVFCeSQgoXOG9A==", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "!android", - "!darwin", - "!linux", - "!win32" - ], - "dependencies": { - "sass": "1.100.0" - } - }, - "node_modules/sass-embedded-win32-arm64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.100.0.tgz", - "integrity": "sha512-iE+yxj+hUXwwbqpHkXxgAWTzeRfcWxJ7SSTQEPMk48lwq3oCrWLlz5sQuWHbuTK/i0GKQfROdP+hOmPi89yjUg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-win32-x64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.100.0.tgz", - "integrity": "sha512-qI4F8MI7/KYoy9NdjJfhSspG42WPkADSNDvwEV7qWvCSFC83koJssRsKO2/PfY+niZz6BG65Ic/D+A11h959hw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" - }, - "node_modules/set-cookie-parser": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", - "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", - "license": "MIT" - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/sync-child-process": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz", - "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "sync-message-port": "^1.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/sync-message-port": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.2.0.tgz", - "integrity": "sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/varint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", - "dev": true, - "license": "MIT" - }, - "node_modules/vite": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.1.tgz", - "integrity": "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==", - "dev": true, - "license": "MIT", - "dependencies": { - "lightningcss": "^1.33.0", - "picomatch": "^4.0.5", - "postcss": "^8.5.25", - "rolldown": "~1.2.1", - "tinyglobby": "^0.2.17" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.4.0", - "esbuild": "^0.27.0 || ^0.28.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - } - } -} diff --git a/05_react/uebungen/u17_validator/package.json b/05_react/uebungen/u17_validator/package.json deleted file mode 100644 index 1d599bd..0000000 --- a/05_react/uebungen/u17_validator/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "u17_validator", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "lint": "oxlint", - "preview": "vite preview" - }, - "dependencies": { - "bootstrap": "^5.3.8", - "react": "^19.2.8", - "react-dom": "^19.2.8", - "react-icons": "^5.7.0", - "react-router-dom": "^7.18.2" - }, - "devDependencies": { - "@types/react": "^19.2.18", - "@types/react-dom": "^19.2.4", - "@vitejs/plugin-react": "^6.0.5", - "oxlint": "^1.78.0", - "sass-embedded": "^1.100.0", - "vite": "^8.2.1" - } -} diff --git a/05_react/uebungen/u17_validator/public/favicon.svg b/05_react/uebungen/u17_validator/public/favicon.svg deleted file mode 100644 index 6893eb1..0000000 --- a/05_react/uebungen/u17_validator/public/favicon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/05_react/uebungen/u17_validator/public/icons.svg b/05_react/uebungen/u17_validator/public/icons.svg deleted file mode 100644 index e952219..0000000 --- a/05_react/uebungen/u17_validator/public/icons.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/05_react/uebungen/u17_validator/src/App.jsx b/05_react/uebungen/u17_validator/src/App.jsx deleted file mode 100644 index 665428c..0000000 --- a/05_react/uebungen/u17_validator/src/App.jsx +++ /dev/null @@ -1,19 +0,0 @@ -import { Navigate } from 'react-router-dom'; -import Router from './routes/Router'; - -// components -import Navbar from './components/navs/Navbar'; - -function App() { - return ( - <> - - -
      - -
      - - ); -} - -export default App; diff --git a/05_react/uebungen/u17_validator/src/assets/hero.png b/05_react/uebungen/u17_validator/src/assets/hero.png deleted file mode 100644 index 02251f4..0000000 Binary files a/05_react/uebungen/u17_validator/src/assets/hero.png and /dev/null differ diff --git a/05_react/uebungen/u17_validator/src/assets/react.svg b/05_react/uebungen/u17_validator/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/05_react/uebungen/u17_validator/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/05_react/uebungen/u17_validator/src/assets/vite.svg b/05_react/uebungen/u17_validator/src/assets/vite.svg deleted file mode 100644 index 5101b67..0000000 --- a/05_react/uebungen/u17_validator/src/assets/vite.svg +++ /dev/null @@ -1 +0,0 @@ -Vite diff --git a/05_react/uebungen/u17_validator/src/components/common/Badge.jsx b/05_react/uebungen/u17_validator/src/components/common/Badge.jsx deleted file mode 100644 index 23cedae..0000000 --- a/05_react/uebungen/u17_validator/src/components/common/Badge.jsx +++ /dev/null @@ -1,11 +0,0 @@ -const Badge = (props) => { - const { text = '', variant = 'secondary', color = '' } = props; - - return ( - - {text} - - ); - // {text}; -}; -export default Badge; diff --git a/05_react/uebungen/u17_validator/src/components/forms/FormContact.jsx b/05_react/uebungen/u17_validator/src/components/forms/FormContact.jsx deleted file mode 100644 index 0e4caa8..0000000 --- a/05_react/uebungen/u17_validator/src/components/forms/FormContact.jsx +++ /dev/null @@ -1,141 +0,0 @@ -import { useState } from 'react'; -import validate from '../../utils/validators/validate'; - -const FormContact = (props) => { - // const { } = props; - - const [formData, setFormData] = useState({ - firstname: '', // - lastname: '', - email: '', - message: '', - }); - - const [errors, setErrors] = useState({}); - - // EventHandlers ======= - const handleSubmit = (e) => { - e.preventDefault(); // Standardverhalten (Versenden vom Formular) unterbinden. - - const form = e.currentTarget; - - const errors = validate(formData); - - if (Object.keys(errors).length === 0) { - console.log('Form submitted ....'); - // TODO: send over AJAX/Fetch - form.reset(); - setFormData({ - firstname: '', // - lastname: '', - email: '', - message: '', - }); - setErrors({}); - } else { - console.warn('Form submit error'); - setErrors(errors); - } - }; - - const handleChange = (e) => { - const { name, value } = e.target; - - setFormData((state) => ({ ...state, [name]: value })); - - // console.log({ [e.target.name]: e.target.value }); - // console.log('Formdata', formData); - }; - - return ( -
      -
      -
      -
      - - -
      OK
      -
      {errors?.firstname}
      -
      -
      -
      -
      - - -
      OK
      -
      {errors?.lastname}
      -
      -
      -
      - -
      -
      -
      - - -
      OK
      -
      {errors?.email}
      -
      -
      -
      - -
      -
      -
      - - -
      OK
      -
      {errors?.message}
      -
      -
      -
      - -
      -
      -
      - -
      -
      -
      -
      - ); -}; -export default FormContact; diff --git a/05_react/uebungen/u17_validator/src/components/navs/Navbar.jsx b/05_react/uebungen/u17_validator/src/components/navs/Navbar.jsx deleted file mode 100644 index bc70c62..0000000 --- a/05_react/uebungen/u17_validator/src/components/navs/Navbar.jsx +++ /dev/null @@ -1,44 +0,0 @@ -import { NavLink } from 'react-router-dom'; - -const Navbar = (props) => { - return ( - - ); -}; - -export default Navbar; diff --git a/05_react/uebungen/u17_validator/src/main.jsx b/05_react/uebungen/u17_validator/src/main.jsx deleted file mode 100644 index 1f95cf7..0000000 --- a/05_react/uebungen/u17_validator/src/main.jsx +++ /dev/null @@ -1,21 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; - -import { BrowserRouter } from 'react-router-dom'; - -import App from './App.jsx'; - -// JS import -import 'bootstrap'; -// import 'bootstrap/dist/css/bootstrap.min.css'; -import './styles/main.scss'; - -const root = createRoot(document.getElementById('root')); - -root.render( - - - - - , -); diff --git a/05_react/uebungen/u17_validator/src/pages/AboutPage.jsx b/05_react/uebungen/u17_validator/src/pages/AboutPage.jsx deleted file mode 100644 index 0fbfc09..0000000 --- a/05_react/uebungen/u17_validator/src/pages/AboutPage.jsx +++ /dev/null @@ -1,34 +0,0 @@ -const AboutPage = (props) => { - return ( -
      -

      About

      -

      - Lorem ipsum dolor sit amet consectetur adipisicing elit. Minima, voluptatibus nobis molestiae, dignissimos id - dolores minus iste quisquam harum vitae rem dolorem debitis natus asperiores amet rerum ratione laboriosam quam. - Sit corporis voluptate laboriosam doloribus incidunt voluptatibus repellat. Excepturi vitae perferendis odit - enim, iusto, consequuntur assumenda corrupti autem eius minus explicabo tempore amet? Facere repudiandae, culpa - autem quae sint accusantium! Recusandae dicta itaque pariatur, veritatis voluptatem reprehenderit? Error facilis - fugit veritatis quam harum tempore dignissimos laboriosam commodi quod. Quas magnam modi saepe quae ab ipsam - amet veritatis molestias facilis odit? Quos nihil minus suscipit vel unde ipsa non quia ex quis obcaecati fugiat - animi nobis sit ducimus libero dolorem voluptates numquam, assumenda autem? Excepturi reprehenderit hic - aspernatur tempora, maiores nihil. Itaque quisquam expedita repellat voluptate, rem delectus sed, laborum dolor - minima nam ipsum possimus odit asperiores molestiae ex fugit sequi cupiditate doloremque tempora inventore - praesentium quo! Minima minus numquam aspernatur! Laudantium quisquam perspiciatis consectetur eos, nobis - doloribus reiciendis accusamus dolor quos cum cumque voluptatibus vero harum sapiente consequuntur eaque in quas - obcaecati. Et mollitia ex esse sint facilis fuga perferendis! Saepe ipsa voluptatum, nam labore corrupti, - laboriosam, sit ex explicabo facere laborum sunt natus eaque! Accusamus culpa harum repellendus iure, quasi, cum - architecto fugit ut est voluptatem cumque nisi recusandae? Cumque culpa sequi quis dolores nostrum omnis facilis - beatae quam similique, reiciendis nam modi hic libero natus blanditiis voluptatibus, magnam quos ea voluptate - odit commodi sapiente iusto dolor molestias! Blanditiis? Accusamus itaque nulla exercitationem. Maiores vitae at - dicta ipsam. Ullam eum excepturi eius, facere cumque nulla alias ab natus distinctio officia placeat possimus - optio commodi molestias repellendus voluptatem dicta delectus? Maxime aliquid numquam qui vitae doloribus - consectetur temporibus doloremque, perspiciatis sint quia obcaecati, nemo saepe velit odio nobis laborum. Natus - iure id nostrum quidem doloribus quae explicabo deserunt et quia? Labore dicta unde eum est esse reiciendis - maiores dignissimos temporibus ullam magnam, amet exercitationem praesentium voluptas, impedit sed alias, - eveniet voluptates nisi nulla dolore sequi similique fugit? Reiciendis, animi quibusdam? Pariatur sequi cum -

      -
      - ); -}; - -export default AboutPage; diff --git a/05_react/uebungen/u17_validator/src/pages/ContactPage.jsx b/05_react/uebungen/u17_validator/src/pages/ContactPage.jsx deleted file mode 100644 index a1a78e7..0000000 --- a/05_react/uebungen/u17_validator/src/pages/ContactPage.jsx +++ /dev/null @@ -1,32 +0,0 @@ -import FormContact from '../components/forms/FormContact'; - -const ContactPage = (props) => { - // const { } = props; - - return ( -
      -

      Contact

      -

      - Lorem ipsum dolor sit amet consectetur, adipisicing elit. Magnam alias dolor eveniet amet veniam, possimus qui -

      - - -
      -
      -

      Übung 17: Formularvalidierung über validator

      -

      - Erweitere das Kontaktformular, um die Eingaben des Benutzers mit der validator-Bibliothek zu validieren. Die - validator-Bibliothek bietet eine Vielzahl von Funktionen zur Validierung von Eingaben, z.B. für - E-Mail-Adressen, URLs, Zahlen usw. -

      -
        -
      • Installiere die validator-Bibliothek.
      • -
      • Verwende die isEmail-Funktion, um die E-Mail-Adresse des Benutzers zu validieren.
      • -
      • Überprüfe die Länge der Eingaben für firstname, lastname und message.
      • -
      • Zeige entsprechende Fehlermeldungen an, wenn die Eingaben ungültig sind.
      • -
      -
      -
      - ); -}; -export default ContactPage; diff --git a/05_react/uebungen/u17_validator/src/pages/HomePage.jsx b/05_react/uebungen/u17_validator/src/pages/HomePage.jsx deleted file mode 100644 index dbe58d5..0000000 --- a/05_react/uebungen/u17_validator/src/pages/HomePage.jsx +++ /dev/null @@ -1,10 +0,0 @@ -const HomePage = (props) => { - return ( -
      -

      Home

      -

      Lorem, ipsum dolor sit amet consectetur adipisicing elit. Ad, voluptatibus.

      -
      - ); -}; - -export default HomePage; diff --git a/05_react/uebungen/u17_validator/src/pages/UserPage.jsx b/05_react/uebungen/u17_validator/src/pages/UserPage.jsx deleted file mode 100644 index 7e837b9..0000000 --- a/05_react/uebungen/u17_validator/src/pages/UserPage.jsx +++ /dev/null @@ -1,25 +0,0 @@ -import { Outlet } from 'react-router-dom'; - -const UserPage = (props) => { - // const { } = props; - - return ( -
      -
      -
      -

      User

      -

      The nestes user site:

      -
      -
      -
      - -
      -
      -
      -

      © 2026 IA Donkey Fabric

      -
      -
      -
      - ); -}; -export default UserPage; diff --git a/05_react/uebungen/u17_validator/src/pages/UserProfilePage.jsx b/05_react/uebungen/u17_validator/src/pages/UserProfilePage.jsx deleted file mode 100644 index 48c2d60..0000000 --- a/05_react/uebungen/u17_validator/src/pages/UserProfilePage.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import { useParams } from 'react-router-dom'; -import Badge from '../components/common/Badge'; - -const UserProfilePage = (props) => { - // const { } = props; - - const { userId } = useParams(); - - return ( -
      -

      - User Profile -

      -

      Lorem ipsum dolor

      -
      - ); -}; -export default UserProfilePage; diff --git a/05_react/uebungen/u17_validator/src/routes/Router.jsx b/05_react/uebungen/u17_validator/src/routes/Router.jsx deleted file mode 100644 index e9472b9..0000000 --- a/05_react/uebungen/u17_validator/src/routes/Router.jsx +++ /dev/null @@ -1,61 +0,0 @@ -import { Routes, Route, Navigate } from 'react-router-dom'; - -import About from '../pages/AboutPage'; -import Home from '../pages/HomePage'; -import Contact from '../pages/ContactPage'; -import UserProfilePage from '../pages/UserProfilePage'; -import UserPage from '../pages/UserPage'; - -// Prinzip einer geschützen Route-Komponente - -const checkAuth = () => { - // localStorage.setItem('token', 'secret-token'); - const token = localStorage.getItem('token'); - return token && token === 'secret-token' ? true : false; -}; - -const ProtectedRoute = (props) => { - const { redirectTo = '/', children } = props; - - const isAuthenticated = checkAuth(); // true | false // Authentication -Prüfung - - return isAuthenticated ? <>{children} : ; -}; - -const Router = (props) => { - // const { } = props; - - return ( - - {/* Static Routes */} - } /> - } /> - } /> - - {/* Dynamic Routes */} - Flights} /> - } /> - - {/* Nested Routes | Verschachtelte Routen */} - }> - Index} /> - Profile} /> - Dashboard} /> - - - {/* Protected Routes | Geschützte Routen */} - -
      -

      Admin Dashboard Page

      -

      Lorem ipsum, dolor sit amet consectetur adipisicing elit. Ad, ex?

      -
      - - }>
      -
      - ); -}; - -export default Router; diff --git a/05_react/uebungen/u17_validator/src/styles/01_frameworks/_index.scss b/05_react/uebungen/u17_validator/src/styles/01_frameworks/_index.scss deleted file mode 100644 index dcefbc9..0000000 --- a/05_react/uebungen/u17_validator/src/styles/01_frameworks/_index.scss +++ /dev/null @@ -1,3 +0,0 @@ -// @import 'bootstrap-5.3.8/bootstrap-grid'; -@import 'bootstrap-5.3.8/bootstrap'; -// @import 'bulma-1.04/index' diff --git a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss deleted file mode 100644 index e9f267f..0000000 --- a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss +++ /dev/null @@ -1,153 +0,0 @@ -// -// Base styles -// - -.accordion { - // scss-docs-start accordion-css-vars - --#{$prefix}accordion-color: #{$accordion-color}; - --#{$prefix}accordion-bg: #{$accordion-bg}; - --#{$prefix}accordion-transition: #{$accordion-transition}; - --#{$prefix}accordion-border-color: #{$accordion-border-color}; - --#{$prefix}accordion-border-width: #{$accordion-border-width}; - --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; - --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; - --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; - --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; - --#{$prefix}accordion-btn-color: #{$accordion-button-color}; - --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; - --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; - --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; - --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; - --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; - --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; - --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; - --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; - --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; - // scss-docs-end accordion-css-vars -} - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); - @include font-size($font-size-base); - color: var(--#{$prefix}accordion-btn-color); - text-align: left; // Reset button style - background-color: var(--#{$prefix}accordion-btn-bg); - border: 0; - @include border-radius(0); - overflow-anchor: none; - @include transition(var(--#{$prefix}accordion-transition)); - - &:not(.collapsed) { - color: var(--#{$prefix}accordion-active-color); - background-color: var(--#{$prefix}accordion-active-bg); - box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list - - &::after { - background-image: var(--#{$prefix}accordion-btn-active-icon); - transform: var(--#{$prefix}accordion-btn-icon-transform); - } - } - - // Accordion icon - &::after { - flex-shrink: 0; - width: var(--#{$prefix}accordion-btn-icon-width); - height: var(--#{$prefix}accordion-btn-icon-width); - margin-left: auto; - content: ""; - background-image: var(--#{$prefix}accordion-btn-icon); - background-repeat: no-repeat; - background-size: var(--#{$prefix}accordion-btn-icon-width); - @include transition(var(--#{$prefix}accordion-btn-icon-transition)); - } - - &:hover { - z-index: 2; - } - - &:focus { - z-index: 3; - outline: 0; - box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); - } -} - -.accordion-header { - margin-bottom: 0; -} - -.accordion-item { - color: var(--#{$prefix}accordion-color); - background-color: var(--#{$prefix}accordion-bg); - border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); - - &:first-of-type { - @include border-top-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - &:not(:first-of-type) { - border-top: 0; - } - - // Only set a border-radius on the last item if the accordion is collapsed - &:last-of-type { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - &.collapsed { - @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - > .accordion-collapse { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - } - } -} - -.accordion-body { - padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); -} - - -// Flush accordion items -// -// Remove borders and border-radius to keep accordion items edge-to-edge. - -.accordion-flush { - > .accordion-item { - border-right: 0; - border-left: 0; - @include border-radius(0); - - &:first-child { border-top: 0; } - &:last-child { border-bottom: 0; } - - // stylelint-disable selector-max-class - > .accordion-collapse, - > .accordion-header .accordion-button, - > .accordion-header .accordion-button.collapsed { - @include border-radius(0); - } - // stylelint-enable selector-max-class - } -} - -@if $enable-dark-mode { - @include color-mode(dark) { - .accordion-button::after { - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; - } - } -} diff --git a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss deleted file mode 100644 index b8cff9b..0000000 --- a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss +++ /dev/null @@ -1,68 +0,0 @@ -// -// Base styles -// - -.alert { - // scss-docs-start alert-css-vars - --#{$prefix}alert-bg: transparent; - --#{$prefix}alert-padding-x: #{$alert-padding-x}; - --#{$prefix}alert-padding-y: #{$alert-padding-y}; - --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; - --#{$prefix}alert-color: inherit; - --#{$prefix}alert-border-color: transparent; - --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); - --#{$prefix}alert-border-radius: #{$alert-border-radius}; - --#{$prefix}alert-link-color: inherit; - // scss-docs-end alert-css-vars - - position: relative; - padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); - margin-bottom: var(--#{$prefix}alert-margin-bottom); - color: var(--#{$prefix}alert-color); - background-color: var(--#{$prefix}alert-bg); - border: var(--#{$prefix}alert-border); - @include border-radius(var(--#{$prefix}alert-border-radius)); -} - -// Headings for larger alerts -.alert-heading { - // Specified to prevent conflicts of changing $headings-color - color: inherit; -} - -// Provide class for links that match alerts -.alert-link { - font-weight: $alert-link-font-weight; - color: var(--#{$prefix}alert-link-color); -} - - -// Dismissible alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissible { - padding-right: $alert-dismissible-padding-r; - - // Adjust close link position - .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: $stretched-link-z-index + 1; - padding: $alert-padding-y * 1.25 $alert-padding-x; - } -} - - -// scss-docs-start alert-modifiers -// Generate contextual modifier classes for colorizing the alert -@each $state in map-keys($theme-colors) { - .alert-#{$state} { - --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); - --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); - --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); - --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); - } -} -// scss-docs-end alert-modifiers diff --git a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss deleted file mode 100644 index cc3d269..0000000 --- a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss +++ /dev/null @@ -1,38 +0,0 @@ -// Base class -// -// Requires one of the contextual, color modifier classes for `color` and -// `background-color`. - -.badge { - // scss-docs-start badge-css-vars - --#{$prefix}badge-padding-x: #{$badge-padding-x}; - --#{$prefix}badge-padding-y: #{$badge-padding-y}; - @include rfs($badge-font-size, --#{$prefix}badge-font-size); - --#{$prefix}badge-font-weight: #{$badge-font-weight}; - --#{$prefix}badge-color: #{$badge-color}; - --#{$prefix}badge-border-radius: #{$badge-border-radius}; - // scss-docs-end badge-css-vars - - display: inline-block; - padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x); - @include font-size(var(--#{$prefix}badge-font-size)); - font-weight: var(--#{$prefix}badge-font-weight); - line-height: 1; - color: var(--#{$prefix}badge-color); - text-align: center; - white-space: nowrap; - vertical-align: baseline; - @include border-radius(var(--#{$prefix}badge-border-radius)); - @include gradient-bg(); - - // Empty badges collapse automatically - &:empty { - display: none; - } -} - -// Quick fix for badges in buttons -.btn .badge { - position: relative; - top: -1px; -} diff --git a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss deleted file mode 100644 index b8252ff..0000000 --- a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss +++ /dev/null @@ -1,40 +0,0 @@ -.breadcrumb { - // scss-docs-start breadcrumb-css-vars - --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x}; - --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y}; - --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom}; - @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size); - --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg}; - --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius}; - --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color}; - --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x}; - --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color}; - // scss-docs-end breadcrumb-css-vars - - display: flex; - flex-wrap: wrap; - padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x); - margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom); - @include font-size(var(--#{$prefix}breadcrumb-font-size)); - list-style: none; - background-color: var(--#{$prefix}breadcrumb-bg); - @include border-radius(var(--#{$prefix}breadcrumb-border-radius)); -} - -.breadcrumb-item { - // The separator between breadcrumbs (by default, a forward-slash: "/") - + .breadcrumb-item { - padding-left: var(--#{$prefix}breadcrumb-item-padding-x); - - &::before { - float: left; // Suppress inline spacings and underlining of the separator - padding-right: var(--#{$prefix}breadcrumb-item-padding-x); - color: var(--#{$prefix}breadcrumb-divider-color); - content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; - } - } - - &.active { - color: var(--#{$prefix}breadcrumb-item-active-color); - } -} diff --git a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss deleted file mode 100644 index 78e1252..0000000 --- a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss +++ /dev/null @@ -1,147 +0,0 @@ -// Make the div behave like a button -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; // match .btn alignment given font-size hack above - - > .btn { - position: relative; - flex: 1 1 auto; - } - - // Bring the hover, focused, and "active" buttons to the front to overlay - // the borders properly - > .btn-check:checked + .btn, - > .btn-check:focus + .btn, - > .btn:hover, - > .btn:focus, - > .btn:active, - > .btn.active { - z-index: 1; - } -} - -// Optional: Group multiple button groups together for a toolbar -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; - - .input-group { - width: auto; - } -} - -.btn-group { - @include border-radius($btn-border-radius); - - // Prevent double borders when buttons are next to each other - > :not(.btn-check:first-child) + .btn, - > .btn-group:not(:first-child) { - margin-left: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn.dropdown-toggle-split:first-child, - > .btn-group:not(:last-child) > .btn { - @include border-end-radius(0); - } - - // The left radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-start-radius(0); - } -} - -// Sizing -// -// Remix the default button sizing classes into new ones for easier manipulation. - -.btn-group-sm > .btn { @extend .btn-sm; } -.btn-group-lg > .btn { @extend .btn-lg; } - - -// -// Split button dropdowns -// - -.dropdown-toggle-split { - padding-right: $btn-padding-x * .75; - padding-left: $btn-padding-x * .75; - - &::after, - .dropup &::after, - .dropend &::after { - margin-left: 0; - } - - .dropstart &::before { - margin-right: 0; - } -} - -.btn-sm + .dropdown-toggle-split { - padding-right: $btn-padding-x-sm * .75; - padding-left: $btn-padding-x-sm * .75; -} - -.btn-lg + .dropdown-toggle-split { - padding-right: $btn-padding-x-lg * .75; - padding-left: $btn-padding-x-lg * .75; -} - - -// The clickable button for toggling the menu -// Set the same inset shadow as the :active state -.btn-group.show .dropdown-toggle { - @include box-shadow($btn-active-box-shadow); - - // Show no shadow for `.btn-link` since it has no other button styles. - &.btn-link { - @include box-shadow(none); - } -} - - -// -// Vertical button groups -// - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; - - > .btn, - > .btn-group { - width: 100%; - } - - > .btn:not(:first-child), - > .btn-group:not(:first-child) { - margin-top: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn-group:not(:last-child) > .btn { - @include border-bottom-radius(0); - } - - // The top radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-top-radius(0); - } -} diff --git a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss deleted file mode 100644 index caa4518..0000000 --- a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss +++ /dev/null @@ -1,216 +0,0 @@ -// -// Base styles -// - -.btn { - // scss-docs-start btn-css-vars - --#{$prefix}btn-padding-x: #{$btn-padding-x}; - --#{$prefix}btn-padding-y: #{$btn-padding-y}; - --#{$prefix}btn-font-family: #{$btn-font-family}; - @include rfs($btn-font-size, --#{$prefix}btn-font-size); - --#{$prefix}btn-font-weight: #{$btn-font-weight}; - --#{$prefix}btn-line-height: #{$btn-line-height}; - --#{$prefix}btn-color: #{$btn-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-width: #{$btn-border-width}; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-border-radius: #{$btn-border-radius}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-box-shadow: #{$btn-box-shadow}; - --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity}; - --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5); - // scss-docs-end btn-css-vars - - display: inline-block; - padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x); - font-family: var(--#{$prefix}btn-font-family); - @include font-size(var(--#{$prefix}btn-font-size)); - font-weight: var(--#{$prefix}btn-font-weight); - line-height: var(--#{$prefix}btn-line-height); - color: var(--#{$prefix}btn-color); - text-align: center; - text-decoration: if($link-decoration == none, null, none); - white-space: $btn-white-space; - vertical-align: middle; - cursor: if($enable-button-pointers, pointer, null); - user-select: none; - border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color); - @include border-radius(var(--#{$prefix}btn-border-radius)); - @include gradient-bg(var(--#{$prefix}btn-bg)); - @include box-shadow(var(--#{$prefix}btn-box-shadow)); - @include transition($btn-transition); - - &:hover { - color: var(--#{$prefix}btn-hover-color); - text-decoration: if($link-hover-decoration == underline, none, null); - background-color: var(--#{$prefix}btn-hover-bg); - border-color: var(--#{$prefix}btn-hover-border-color); - } - - .btn-check + &:hover { - // override for the checkbox/radio buttons - color: var(--#{$prefix}btn-color); - background-color: var(--#{$prefix}btn-bg); - border-color: var(--#{$prefix}btn-border-color); - } - - &:focus-visible { - color: var(--#{$prefix}btn-hover-color); - @include gradient-bg(var(--#{$prefix}btn-hover-bg)); - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:focus-visible + & { - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:checked + &, - :not(.btn-check) + &:active, - &:first-child:active, - &.active, - &.show { - color: var(--#{$prefix}btn-active-color); - background-color: var(--#{$prefix}btn-active-bg); - // Remove CSS gradients if they're enabled - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-active-border-color); - @include box-shadow(var(--#{$prefix}btn-active-shadow)); - - &:focus-visible { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - } - - .btn-check:checked:focus-visible + & { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - &:disabled, - &.disabled, - fieldset:disabled & { - color: var(--#{$prefix}btn-disabled-color); - pointer-events: none; - background-color: var(--#{$prefix}btn-disabled-bg); - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-disabled-border-color); - opacity: var(--#{$prefix}btn-disabled-opacity); - @include box-shadow(none); - } -} - - -// -// Alternate buttons -// - -// scss-docs-start btn-variant-loops -@each $color, $value in $theme-colors { - .btn-#{$color} { - @if $color == "light" { - @include button-variant( - $value, - $value, - $hover-background: shade-color($value, $btn-hover-bg-shade-amount), - $hover-border: shade-color($value, $btn-hover-border-shade-amount), - $active-background: shade-color($value, $btn-active-bg-shade-amount), - $active-border: shade-color($value, $btn-active-border-shade-amount) - ); - } @else if $color == "dark" { - @include button-variant( - $value, - $value, - $hover-background: tint-color($value, $btn-hover-bg-tint-amount), - $hover-border: tint-color($value, $btn-hover-border-tint-amount), - $active-background: tint-color($value, $btn-active-bg-tint-amount), - $active-border: tint-color($value, $btn-active-border-tint-amount) - ); - } @else { - @include button-variant($value, $value); - } - } -} - -@each $color, $value in $theme-colors { - .btn-outline-#{$color} { - @include button-outline-variant($value); - } -} -// scss-docs-end btn-variant-loops - - -// -// Link buttons -// - -// Make a button look and behave like a link -.btn-link { - --#{$prefix}btn-font-weight: #{$font-weight-normal}; - --#{$prefix}btn-color: #{$btn-link-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-hover-color: #{$btn-link-hover-color}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-active-color: #{$btn-link-hover-color}; - --#{$prefix}btn-active-border-color: transparent; - --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color}; - --#{$prefix}btn-disabled-border-color: transparent; - --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows - --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb}; - - text-decoration: $link-decoration; - @if $enable-gradients { - background-image: none; - } - - &:hover, - &:focus-visible { - text-decoration: $link-hover-decoration; - } - - &:focus-visible { - color: var(--#{$prefix}btn-color); - } - - &:hover { - color: var(--#{$prefix}btn-hover-color); - } - - // No need for an active state here -} - - -// -// Button Sizes -// - -.btn-lg { - @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); -} - -.btn-sm { - @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); -} diff --git a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss deleted file mode 100644 index dcebe6a..0000000 --- a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss +++ /dev/null @@ -1,238 +0,0 @@ -// -// Base styles -// - -.card { - // scss-docs-start card-css-vars - --#{$prefix}card-spacer-y: #{$card-spacer-y}; - --#{$prefix}card-spacer-x: #{$card-spacer-x}; - --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y}; - --#{$prefix}card-title-color: #{$card-title-color}; - --#{$prefix}card-subtitle-color: #{$card-subtitle-color}; - --#{$prefix}card-border-width: #{$card-border-width}; - --#{$prefix}card-border-color: #{$card-border-color}; - --#{$prefix}card-border-radius: #{$card-border-radius}; - --#{$prefix}card-box-shadow: #{$card-box-shadow}; - --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius}; - --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y}; - --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x}; - --#{$prefix}card-cap-bg: #{$card-cap-bg}; - --#{$prefix}card-cap-color: #{$card-cap-color}; - --#{$prefix}card-height: #{$card-height}; - --#{$prefix}card-color: #{$card-color}; - --#{$prefix}card-bg: #{$card-bg}; - --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding}; - --#{$prefix}card-group-margin: #{$card-group-margin}; - // scss-docs-end card-css-vars - - position: relative; - display: flex; - flex-direction: column; - min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 - height: var(--#{$prefix}card-height); - color: var(--#{$prefix}body-color); - word-wrap: break-word; - background-color: var(--#{$prefix}card-bg); - background-clip: border-box; - border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - @include border-radius(var(--#{$prefix}card-border-radius)); - @include box-shadow(var(--#{$prefix}card-box-shadow)); - - > hr { - margin-right: 0; - margin-left: 0; - } - - > .list-group { - border-top: inherit; - border-bottom: inherit; - - &:first-child { - border-top-width: 0; - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); - } - - &:last-child { - border-bottom-width: 0; - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); - } - } - - // Due to specificity of the above selector (`.card > .list-group`), we must - // use a child selector here to prevent double borders. - > .card-header + .list-group, - > .list-group + .card-footer { - border-top: 0; - } -} - -.card-body { - // Enable `flex-grow: 1` for decks and groups so that card blocks take up - // as much space as possible, ensuring footers are aligned to the bottom. - flex: 1 1 auto; - padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x); - color: var(--#{$prefix}card-color); -} - -.card-title { - margin-bottom: var(--#{$prefix}card-title-spacer-y); - color: var(--#{$prefix}card-title-color); -} - -.card-subtitle { - margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list - margin-bottom: 0; - color: var(--#{$prefix}card-subtitle-color); -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link { - &:hover { - text-decoration: if($link-hover-decoration == underline, none, null); - } - - + .card-link { - margin-left: var(--#{$prefix}card-spacer-x); - } -} - -// -// Optional textual caps -// - -.card-header { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - margin-bottom: 0; // Removes the default margin-bottom of - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:first-child { - @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0); - } -} - -.card-footer { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:last-child { - @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius)); - } -} - - -// -// Header navs -// - -.card-header-tabs { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - border-bottom: 0; - - .nav-link.active { - background-color: var(--#{$prefix}card-bg); - border-bottom-color: var(--#{$prefix}card-bg); - } -} - -.card-header-pills { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list -} - -// Card image -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: var(--#{$prefix}card-img-overlay-padding); - @include border-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch -} - -.card-img, -.card-img-top { - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-bottom { - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); -} - - -// -// Card groups -// - -.card-group { - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - margin-bottom: var(--#{$prefix}card-group-margin); - } - - @include media-breakpoint-up(sm) { - display: flex; - flex-flow: row wrap; - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - flex: 1 0 0; - margin-bottom: 0; - - + .card { - margin-left: 0; - border-left: 0; - } - - // Handle rounded corners - @if $enable-rounded { - &:not(:last-child) { - @include border-end-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-right-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-right-radius: 0; - } - } - - &:not(:first-child) { - @include border-start-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-left-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-left-radius: 0; - } - } - } - } - } -} diff --git a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss deleted file mode 100644 index 5ebf6b1..0000000 --- a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss +++ /dev/null @@ -1,226 +0,0 @@ -// Notes on the classes: -// -// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) -// even when their scroll action started on a carousel, but for compatibility (with Firefox) -// we're preventing all actions instead -// 2. The .carousel-item-start and .carousel-item-end is used to indicate where -// the active slide is heading. -// 3. .active.carousel-item is the current slide. -// 4. .active.carousel-item-start and .active.carousel-item-end is the current -// slide in its in-transition state. Only one of these occurs at a time. -// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end -// is the upcoming slide in transition. - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; - @include clearfix(); -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - @include transition($carousel-transition); -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); -} - - -// -// Alternate transitions -// - -.carousel-fade { - .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; - } - - .carousel-item.active, - .carousel-item-next.carousel-item-start, - .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; - } - - .active.carousel-item-start, - .active.carousel-item-end { - z-index: 0; - opacity: 0; - @include transition(opacity 0s $carousel-transition-duration); - } -} - - -// -// Left/right controls for nav -// - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - // Use flex for alignment (1-3) - display: flex; // 1. allow flex styles - align-items: center; // 2. vertically center contents - justify-content: center; // 3. horizontally center contents - width: $carousel-control-width; - padding: 0; - color: $carousel-control-color; - text-align: center; - background: none; - filter: var(--#{$prefix}carousel-control-icon-filter); - border: 0; - opacity: $carousel-control-opacity; - @include transition($carousel-control-transition); - - // Hover/focus state - &:hover, - &:focus { - color: $carousel-control-color; - text-decoration: none; - outline: 0; - opacity: $carousel-control-hover-opacity; - } -} -.carousel-control-prev { - left: 0; - background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); -} -.carousel-control-next { - right: 0; - background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); -} - -// Icons for within -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: $carousel-control-icon-width; - height: $carousel-control-icon-width; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; -} - -.carousel-control-prev-icon { - background-image: escape-svg($carousel-control-prev-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-next-icon-bg) + "*/"}; -} -.carousel-control-next-icon { - background-image: escape-svg($carousel-control-next-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-prev-icon-bg) + "*/"}; -} - -// Optional indicator pips/controls -// -// Add a container (such as a list) with the following class and add an item (ideally a focusable control, -// like a button) with data-bs-target for each slide your carousel holds. - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - // Use the .carousel-control's width as margin so we don't overlay those - margin-right: $carousel-control-width; - margin-bottom: 1rem; - margin-left: $carousel-control-width; - - [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: $carousel-indicator-width; - height: $carousel-indicator-height; - padding: 0; - margin-right: $carousel-indicator-spacer; - margin-left: $carousel-indicator-spacer; - text-indent: -999px; - cursor: pointer; - background-color: var(--#{$prefix}carousel-indicator-active-bg); - background-clip: padding-box; - border: 0; - // Use transparent borders to increase the hit area by 10px on top and bottom. - border-top: $carousel-indicator-hit-area-height solid transparent; - border-bottom: $carousel-indicator-hit-area-height solid transparent; - opacity: $carousel-indicator-opacity; - @include transition($carousel-indicator-transition); - } - - .active { - opacity: $carousel-indicator-active-opacity; - } -} - - -// Optional captions -// -// - -.carousel-caption { - position: absolute; - right: (100% - $carousel-caption-width) * .5; - bottom: $carousel-caption-spacer; - left: (100% - $carousel-caption-width) * .5; - padding-top: $carousel-caption-padding-y; - padding-bottom: $carousel-caption-padding-y; - color: var(--#{$prefix}carousel-caption-color); - text-align: center; -} - -// Dark mode carousel - -@mixin carousel-dark() { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg-dark}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color-dark}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter-dark}; -} - -.carousel-dark { - @include carousel-dark(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include carousel-dark(); - } -} diff --git a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss deleted file mode 100644 index d53c96f..0000000 --- a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss +++ /dev/null @@ -1,66 +0,0 @@ -// Transparent background and border properties included for button version. -// iOS requires the button element instead of an anchor tag. -// If you want the anchor version, it requires `href="#"`. -// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile - -.btn-close { - // scss-docs-start close-css-vars - --#{$prefix}btn-close-color: #{$btn-close-color}; - --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) }; - --#{$prefix}btn-close-opacity: #{$btn-close-opacity}; - --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity}; - --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow}; - --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity}; - --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity}; - // scss-docs-end close-css-vars - - box-sizing: content-box; - width: $btn-close-width; - height: $btn-close-height; - padding: $btn-close-padding-y $btn-close-padding-x; - color: var(--#{$prefix}btn-close-color); - background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements - filter: var(--#{$prefix}btn-close-filter); - border: 0; // for button elements - @include border-radius(); - opacity: var(--#{$prefix}btn-close-opacity); - - // Override 's hover style - &:hover { - color: var(--#{$prefix}btn-close-color); - text-decoration: none; - opacity: var(--#{$prefix}btn-close-hover-opacity); - } - - &:focus { - outline: 0; - box-shadow: var(--#{$prefix}btn-close-focus-shadow); - opacity: var(--#{$prefix}btn-close-focus-opacity); - } - - &:disabled, - &.disabled { - pointer-events: none; - user-select: none; - opacity: var(--#{$prefix}btn-close-disabled-opacity); - } -} - -@mixin btn-close-white() { - --#{$prefix}btn-close-filter: #{$btn-close-filter-dark}; -} - -.btn-close-white { - @include btn-close-white(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}btn-close-filter: #{$btn-close-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include btn-close-white(); - } -} diff --git a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss deleted file mode 100644 index 83b3138..0000000 --- a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss +++ /dev/null @@ -1,41 +0,0 @@ -// Container widths -// -// Set the container width, and override it for fixed navbars in media queries. - -@if $enable-container-classes { - // Single container class with breakpoint max-widths - .container, - // 100% wide container at all breakpoints - .container-fluid { - @include make-container(); - } - - // Responsive containers that are 100% wide until a breakpoint - @each $breakpoint, $container-max-width in $container-max-widths { - .container-#{$breakpoint} { - @extend .container-fluid; - } - - @include media-breakpoint-up($breakpoint, $grid-breakpoints) { - %responsive-container-#{$breakpoint} { - max-width: $container-max-width; - } - - // Extend each breakpoint which is smaller or equal to the current breakpoint - $extend-breakpoint: true; - - @each $name, $width in $grid-breakpoints { - @if ($extend-breakpoint) { - .container#{breakpoint-infix($name, $grid-breakpoints)} { - @extend %responsive-container-#{$breakpoint}; - } - - // Once the current breakpoint is reached, stop extending - @if ($breakpoint == $name) { - $extend-breakpoint: false; - } - } - } - } - } -} diff --git a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss b/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss deleted file mode 100644 index 587ebb4..0000000 --- a/05_react/uebungen/u17_validator/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss +++ /dev/null @@ -1,250 +0,0 @@ -// The dropdown wrapper (`
      `) -.dropup, -.dropend, -.dropdown, -.dropstart, -.dropup-center, -.dropdown-center { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; - - // Generate the caret automatically - @include caret(); -} - -// The dropdown menu -.dropdown-menu { - // scss-docs-start dropdown-css-vars - --#{$prefix}dropdown-zindex: #{$zindex-dropdown}; - --#{$prefix}dropdown-min-width: #{$dropdown-min-width}; - --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x}; - --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y}; - --#{$prefix}dropdown-spacer: #{$dropdown-spacer}; - @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size); - --#{$prefix}dropdown-color: #{$dropdown-color}; - --#{$prefix}dropdown-bg: #{$dropdown-bg}; - --#{$prefix}dropdown-border-color: #{$dropdown-border-color}; - --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius}; - --#{$prefix}dropdown-border-width: #{$dropdown-border-width}; - --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius}; - --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg}; - --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y}; - --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow}; - --#{$prefix}dropdown-link-color: #{$dropdown-link-color}; - --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color}; - --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg}; - --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color}; - --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg}; - --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color}; - --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x}; - --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y}; - --#{$prefix}dropdown-header-color: #{$dropdown-header-color}; - --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x}; - --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y}; - // scss-docs-end dropdown-css-vars - - position: absolute; - z-index: var(--#{$prefix}dropdown-zindex); - display: none; // none by default, but block on "open" of the menu - min-width: var(--#{$prefix}dropdown-min-width); - padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x); - margin: 0; // Override default margin of ul - @include font-size(var(--#{$prefix}dropdown-font-size)); - color: var(--#{$prefix}dropdown-color); - text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) - list-style: none; - background-color: var(--#{$prefix}dropdown-bg); - background-clip: padding-box; - border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color); - @include border-radius(var(--#{$prefix}dropdown-border-radius)); - @include box-shadow(var(--#{$prefix}dropdown-box-shadow)); - - &[data-bs-popper] { - top: 100%; - left: 0; - margin-top: var(--#{$prefix}dropdown-spacer); - } - - @if $dropdown-padding-y == 0 { - > .dropdown-item:first-child, - > li:first-child .dropdown-item { - @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - > .dropdown-item:last-child, - > li:last-child .dropdown-item { - @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - - } -} - -// scss-docs-start responsive-breakpoints -// We deliberately hardcode the `bs-` prefix because we check -// this custom property in JS to determine Popper's positioning - -@each $breakpoint in map-keys($grid-breakpoints) { - @include media-breakpoint-up($breakpoint) { - $infix: breakpoint-infix($breakpoint, $grid-breakpoints); - - .dropdown-menu#{$infix}-start { - --bs-position: start; - - &[data-bs-popper] { - right: auto; - left: 0; - } - } - - .dropdown-menu#{$infix}-end { - --bs-position: end; - - &[data-bs-popper] { - right: 0; - left: auto; - } - } - } -} -// scss-docs-end responsive-breakpoints - -// Allow for dropdowns to go bottom up (aka, dropup-menu) -// Just add .dropup after the standard .dropdown class and you're set. -.dropup { - .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(up); - } -} - -.dropend { - .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(end); - &::after { - vertical-align: 0; - } - } -} - -.dropstart { - .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(start); - &::before { - vertical-align: 0; - } - } -} - - -// Dividers (basically an `
      `) within the dropdown -.dropdown-divider { - height: 0; - margin: var(--#{$prefix}dropdown-divider-margin-y) 0; - overflow: hidden; - border-top: 1px solid var(--#{$prefix}dropdown-divider-bg); - opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
      element -} - -// Links, buttons, and more within the dropdown menu -// -// `
      ` alignment by inheriting `text-align`. -// 3. Fix alignment for Safari - -th { - font-weight: $table-th-font-weight; // 1 - text-align: inherit; // 2 - text-align: -webkit-match-parent; // 3 -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - - -// Forms -// -// 1. Allow labels to use `margin` for spacing. - -label { - display: inline-block; // 1 -} - -// Remove the default `border-radius` that macOS Chrome adds. -// See https://github.com/twbs/bootstrap/issues/24093 - -button { - // stylelint-disable-next-line property-disallowed-list - border-radius: 0; -} - -// Explicitly remove focus outline in Chromium when it shouldn't be -// visible (e.g. as result of mouse click or touch tap). It already -// should be doing this automatically, but seems to currently be -// confused and applies its very visible two-tone outline anyway. - -button:focus:not(:focus-visible) { - outline: 0; -} - -// 1. Remove the margin in Firefox and Safari - -input, -button, -select, -optgroup, -textarea { - margin: 0; // 1 - font-family: inherit; - @include font-size(inherit); - line-height: inherit; -} - -// Remove the inheritance of text transform in Firefox -button, -select { - text-transform: none; -} -// Set the cursor for non-` - - ); -}`, - angular: `import { Component, signal } from '@angular/core'; - -@Component({ - selector: 'app-counter', - standalone: true, - template: \` -
      -

      Anzahl: {{ count() }}

      - -
      - \` -}) -export class CounterComponent { - count = signal(0); - - increment() { - this.count.update(n => n + 1); - } -}`, - vue: ` - -`, - svelte: ` - -
      -

      Anzahl: {count}

      - -
      ` - }, - fetch: { - title: '2. API Fetching', - react: `import React, { useState, useEffect } from 'react'; - -export default function UserList() { - const [users, setUsers] = useState([]); - - useEffect(() => { - fetch('/api/users') - .then(res => res.json()) - .then(data => setUsers(data)); - }, []); - - return ( -
        - {users.map(u =>
      • {u.name}
      • )} -
      - ); -}`, - angular: `import { Component, inject, OnInit } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; - -@Component({ - selector: 'app-users', - template: \` -
        - @for (user of users; track user.id) { -
      • {{ user.name }}
      • - } -
      - \` -}) -export class UsersComponent implements OnInit { - private http = inject(HttpClient); - users: any[] = []; - - ngOnInit() { - this.http.get('/api/users').subscribe(data => this.users = data); - } -}`, - vue: ` - -`, - svelte: ` - -
        - {#each users as user} -
      • {user.name}
      • - {/each} -
      ` - } -}; - -export default function App() { - const [searchQuery, setSearchQuery] = useState(''); - const [selectedFramework, setSelectedFramework] = useState('all'); - const [activeCodeExample, setActiveCodeExample] = useState('counter'); - const [activeCodeFw, setActiveCodeFw] = useState('react'); - const [copied, setCopied] = useState(false); - const [quizChoice, setQuizChoice] = useState(null); - - // Canvas Refs for Rendering Charts & Downloading - const radarCanvasRef = useRef(null); - const barCanvasRef = useRef(null); - - const scrollToSection = (id) => { - const el = document.getElementById(id); - if (el) { - const headerOffset = 70; - const elementPosition = el.getBoundingClientRect().top; - const offsetPosition = elementPosition + window.pageYOffset - headerOffset; - window.scrollTo({ - top: offsetPosition, - behavior: 'smooth' - }); - } - }; - - useEffect(() => { - // 1. Draw Radar Chart - const radarCtx = radarCanvasRef.current?.getContext('2d'); - if (radarCtx && radarCanvasRef.current) { - const canvas = radarCanvasRef.current; - const width = canvas.width; - const height = canvas.height; - const centerX = width / 2; - const centerY = height / 2; - const radius = Math.min(centerX, centerY) - 40; - - radarCtx.clearRect(0, 0, width, height); - - const labels = ['Performance', 'Ökosystem', 'Lernkurve', 'Enterprise', 'DX', 'Jobmarkt']; - const numAxes = labels.length; - - // Draw Grid Rings - for (let level = 1; level <= 5; level++) { - const r = (radius / 5) * level; - radarCtx.beginPath(); - for (let i = 0; i < numAxes; i++) { - const angle = (Math.PI * 2 / numAxes) * i - Math.PI / 2; - const x = centerX + r * Math.cos(angle); - const y = centerY + r * Math.sin(angle); - if (i === 0) radarCtx.moveTo(x, y); - else radarCtx.lineTo(x, y); - } - radarCtx.closePath(); - radarCtx.strokeStyle = 'rgba(255, 255, 255, 0.1)'; - radarCtx.lineWidth = 1; - radarCtx.stroke(); - } - - // Draw Axis Lines & Labels - radarCtx.font = '11px Inter, sans-serif'; - radarCtx.fillStyle = '#94a3b8'; - radarCtx.textAlign = 'center'; - radarCtx.textBaseline = 'middle'; - - for (let i = 0; i < numAxes; i++) { - const angle = (Math.PI * 2 / numAxes) * i - Math.PI / 2; - const x = centerX + radius * Math.cos(angle); - const y = centerY + radius * Math.sin(angle); - - radarCtx.beginPath(); - radarCtx.moveTo(centerX, centerY); - radarCtx.lineTo(x, y); - radarCtx.strokeStyle = 'rgba(255, 255, 255, 0.15)'; - radarCtx.stroke(); - - // Label Position - const lx = centerX + (radius + 20) * Math.cos(angle); - const ly = centerY + (radius + 18) * Math.sin(angle); - radarCtx.fillText(labels[i], lx, ly); - } - - // Draw Framework Datasets - const fwDataList = [ - { key: 'react', color: 'rgba(97, 218, 251, 1)', fill: 'rgba(97, 218, 251, 0.2)', vals: [85, 98, 65, 92, 85, 99] }, - { key: 'angular', color: 'rgba(221, 0, 49, 1)', fill: 'rgba(221, 0, 49, 0.2)', vals: [82, 88, 45, 98, 80, 85] }, - { key: 'vue', color: 'rgba(66, 184, 131, 1)', fill: 'rgba(66, 184, 131, 0.2)', vals: [90, 85, 90, 85, 92, 75] }, - { key: 'svelte', color: 'rgba(255, 62, 0, 1)', fill: 'rgba(255, 62, 0, 0.2)', vals: [98, 70, 95, 72, 96, 50] } - ]; - - fwDataList.forEach(fw => { - radarCtx.beginPath(); - fw.vals.forEach((val, i) => { - const r = (radius * val) / 100; - const angle = (Math.PI * 2 / numAxes) * i - Math.PI / 2; - const x = centerX + r * Math.cos(angle); - const y = centerY + r * Math.sin(angle); - if (i === 0) radarCtx.moveTo(x, y); - else radarCtx.lineTo(x, y); - }); - radarCtx.closePath(); - radarCtx.fillStyle = fw.fill; - radarCtx.fill(); - radarCtx.strokeStyle = fw.color; - radarCtx.lineWidth = 2; - radarCtx.stroke(); - }); - } - - // 2. Draw Bar Chart (Bundle Sizes) - const barCtx = barCanvasRef.current?.getContext('2d'); - if (barCtx && barCanvasRef.current) { - const canvas = barCanvasRef.current; - const width = canvas.width; - const height = canvas.height; - barCtx.clearRect(0, 0, width, height); - - const paddingLeft = 60; - const paddingBottom = 40; - const paddingTop = 20; - const paddingRight = 20; - const graphWidth = width - paddingLeft - paddingRight; - const graphHeight = height - paddingTop - paddingBottom; - - const items = [ - { name: 'React', val: 42, color: '#61dafb' }, - { name: 'Angular', val: 120, color: '#dd0031' }, - { name: 'Vue.js', val: 34, color: '#42b883' }, - { name: 'Svelte', val: 2.5, color: '#ff3e00' } - ]; - - const maxVal = 140; - - // Y Axis Grid - barCtx.strokeStyle = 'rgba(255,255,255,0.1)'; - barCtx.lineWidth = 1; - barCtx.font = '10px Inter, sans-serif'; - barCtx.fillStyle = '#64748b'; - - for (let yVal = 0; yVal <= maxVal; yVal += 35) { - const y = paddingTop + graphHeight - (yVal / maxVal) * graphHeight; - barCtx.beginPath(); - barCtx.moveTo(paddingLeft, y); - barCtx.lineTo(width - paddingRight, y); - barCtx.stroke(); - barCtx.fillText(`${yVal} kB`, 15, y + 3); - } - - // Draw Bars - const barWidth = graphWidth / items.length - 25; - items.forEach((item, idx) => { - const barH = (item.val / maxVal) * graphHeight; - const x = paddingLeft + idx * (barWidth + 25) + 12; - const y = paddingTop + graphHeight - barH; - - // Rounded Top Bar - barCtx.fillStyle = item.color; - barCtx.beginPath(); - if (typeof barCtx.roundRect === 'function') { - barCtx.roundRect(x, y, barWidth, barH, [6, 6, 0, 0]); - } else { - barCtx.rect(x, y, barWidth, barH); - } - barCtx.fill(); - - // Label Value above Bar - barCtx.fillStyle = '#ffffff'; - barCtx.font = 'bold 11px Inter, sans-serif'; - barCtx.textAlign = 'center'; - barCtx.fillText(`${item.val} kB`, x + barWidth / 2, y - 6); - - // Label Name below Bar - barCtx.fillStyle = '#94a3b8'; - barCtx.font = '11px Inter, sans-serif'; - barCtx.fillText(item.name, x + barWidth / 2, height - 12); - }); - } - }, []); - - const filteredProjects = useMemo(() => { - return REFERENCE_PROJECTS.filter(p => { - const matchesFw = selectedFramework === 'all' || p.framework === selectedFramework; - const matchesQuery = p.name.toLowerCase().includes(searchQuery.toLowerCase()) || - p.description.toLowerCase().includes(searchQuery.toLowerCase()) || - p.tags.some(t => t.toLowerCase().includes(searchQuery.toLowerCase())); - return matchesFw && matchesQuery; - }); - }, [searchQuery, selectedFramework]); - - const handleCopyCode = () => { - const snippet = CODE_EXAMPLES[activeCodeExample][activeCodeFw]; - navigator.clipboard.writeText(snippet); - setCopied(true); - setTimeout(() => setCopied(false), 2000); - }; - - const downloadChartImage = () => { - const exportCanvas = document.createElement('canvas'); - const width = 1100; - const height = 600; - exportCanvas.width = width; - exportCanvas.height = height; - const ctx = exportCanvas.getContext('2d'); - - // Background - ctx.fillStyle = '#0f172a'; - ctx.fillRect(0, 0, width, height); - - // Title - ctx.fillStyle = '#ffffff'; - ctx.font = 'bold 24px Inter, sans-serif'; - ctx.fillText('Frontend Framework Radar & Performance 2026', 40, 45); - - ctx.fillStyle = '#94a3b8'; - ctx.font = '14px Inter, sans-serif'; - ctx.fillText('Vergleich: React, Angular, Vue.js & Svelte', 40, 70); - - // Render Canvas Charts onto export canvas - if (radarCanvasRef.current && barCanvasRef.current) { - ctx.drawImage(radarCanvasRef.current, 40, 100, 480, 440); - ctx.drawImage(barCanvasRef.current, 560, 100, 500, 440); - } - - ctx.fillStyle = '#64748b'; - ctx.font = '12px Inter, sans-serif'; - ctx.fillText('Framework Radar SPA 2026', 40, 575); - - const imageURL = exportCanvas.toDataURL('image/png'); - const downloadLink = document.createElement('a'); - downloadLink.href = imageURL; - downloadLink.download = 'framework-vergleich-chart-2026.png'; - document.body.appendChild(downloadLink); - downloadLink.click(); - document.body.removeChild(downloadLink); - }; - - const downloadCSV = () => { - const headers = ["Kriterium", "React", "Angular", "Vue.js", "Svelte"]; - const rows = [ - ["Typus", ...FRAMEWORKS.map(f => f.type)], - ["Erstveröffentlichung", ...FRAMEWORKS.map(f => f.year)], - ["DOM-Modell", ...FRAMEWORKS.map(f => f.dom)], - ["Lernkurve", ...FRAMEWORKS.map(f => f.learningCurve)], - ["Bundle Size (kB)", ...FRAMEWORKS.map(f => f.bundleSize)], - ["Performance Score", ...FRAMEWORKS.map(f => f.perfScore.toString())], - ["Enterprise Readiness", ...FRAMEWORKS.map(f => f.enterprise)], - ["Bekannte Meta-Frameworks", ...FRAMEWORKS.map(f => f.metaFrameworks)] - ]; - - const csvContent = "data:text/csv;charset=utf-8," - + [headers.join(","), ...rows.map(e => e.map(x => `"${x}"`).join(","))].join("\n"); - - const encodedUri = encodeURI(csvContent); - const link = document.createElement("a"); - link.setAttribute("href", encodedUri); - link.setAttribute("download", "framework_komparator_2026.csv"); - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - }; - - return ( -
      - - {/* Navigation Bar */} -
      -
      -
      scrollToSection('hero')}> -
      - -
      -
      - - Framework Radar - - - React Edition - -
      -
      - - - -
      - -
      -
      -
      - - {/* Main Content Area */} -
      - - {} -
      -
      -
      - -
      -
      - React SPA Komparator -
      -

      - React vs. Angular vs. Vue vs. Svelte -

      -

      - Welches Frontend-Framework eignet sich am besten für deine nächste Anwendung? Vergleiche Systemarchitekturen, Performance, Ökosysteme und entdecke reale Referenzprojekte führender Tech-Unternehmen. -

      -
      - - -
      -
      - - {/* Quick Framework Cards */} -
      - {FRAMEWORKS.map(fw => ( -
      { - setSelectedFramework(fw.id); - scrollToSection('showcase'); - }} - className={`bg-slate-900/70 p-4 rounded-2xl border-t-2 ${fw.borderColor} border-x border-b border-slate-800/80 hover:border-slate-700 transition-all cursor-pointer hover:scale-[1.02] shadow-xl group`} - > -
      - - {fw.creator} - - -
      -

      {fw.name}

      -

      {fw.description}

      -
      - ))} -
      -
      - - {} -
      -
      -
      -

      - Vergleichsmatrix -

      -

      Gegenüberstellung architektonischer Eigenschaften & Metriken.

      -
      - -
      - -
      - - - - - {FRAMEWORKS.map(fw => ( - - ))} - - - - - - {FRAMEWORKS.map(fw => )} - - - - {FRAMEWORKS.map(fw => )} - - - - {FRAMEWORKS.map(fw => )} - - - - {FRAMEWORKS.map(fw => )} - - - - {FRAMEWORKS.map(fw => ( - - ))} - - - - {FRAMEWORKS.map(fw => ( - - ))} - - - - {FRAMEWORKS.map(fw => )} - - - - {FRAMEWORKS.map(fw => ( - - ))} - - - - {FRAMEWORKS.map(fw => )} - - -
      Kriterium - {fw.name} -
      Typus / Art{fw.type}
      Erstveröffentlichung{fw.year}
      DOM-Modell{fw.dom}
      Lernkurve{fw.learningCurve}
      Bundle Size (Minimal) - - {fw.bundleSize} - -
      Performance Rating - - {fw.perfScore} / 10 -
      Enterprise Readiness{fw.enterprise}
      Meta-Frameworks - - {fw.metaFrameworks} - -
      Hauptstärken{fw.strengths}
      -
      -
      - - {} -
      -
      -
      -

      - Visualisierter Benchmark -

      -

      Radar-Vergleich und Paketgrößen-Analysen im Canvas.

      -
      - -
      - -
      - {/* Canvas Radar Chart */} -
      -
      -

      - Stärken-Radar -

      -

      Direkter Vergleich von Performance, DX, Jobchancen und Lernkurve.

      -
      -
      - -
      -
      - {FRAMEWORKS.map(fw => ( -
      - - {fw.name} -
      - ))} -
      -
      - - {/* Canvas Bar Chart */} -
      -
      -

      - Paketgröße (Gzipped in kB) -

      -

      Minimales Initial-Bundle der Core-Laufzeitumgebung.

      -
      -
      - -
      -

      Geringeres Paketgewicht führt zu schnellerer Initialisierung auf mobilen Endgeräten.

      -
      -
      -
      - - {} -
      -
      -
      -

      - Bekannte Referenzprojekte -

      -

      Namhafte Plattformen und Apps, die diese Frameworks im Einsatz haben.

      -
      - - {/* Filter Controls */} -
      -
      - - setSearchQuery(e.target.value)} - placeholder="Projekt oder Tag suchen..." - className="bg-slate-900 border border-slate-700 text-xs rounded-xl pl-9 pr-4 py-2.5 text-slate-200 focus:outline-none focus:border-indigo-500 w-48 sm:w-64" - /> -
      - -
      -
      - - {/* Grid */} -
      - {filteredProjects.map((p) => { - const fwMeta = FRAMEWORKS.find(f => f.id === p.framework) || FRAMEWORKS[0]; - return ( -
      -
      -
      - - {p.fwName} - - -
      -

      {p.name}

      -

      {p.description}

      -
      -
      -
      - - {p.metric} -
      -
      - {p.tags.map((t, i) => ( - - #{t} - - ))} -
      - - Website besuchen - -
      -
      - ); - })} -
      -
      - - {} -
      -
      -

      - Live Syntax-Vergleich -

      -

      Direkte Gegenüberstellung typischer Code-Muster.

      -
      - -
      - {/* Example Selection Tabs */} -
      - {Object.keys(CODE_EXAMPLES).map(key => ( - - ))} -
      - - {/* Framework Code Tabs */} -
      - {FRAMEWORKS.map(fw => ( - - ))} -
      - - {/* Code Display */} -
      - -
      -                {CODE_EXAMPLES[activeCodeExample][activeCodeFw]}
      -              
      -
      -
      -
      - - {} -
      -
      -
      - - Entscheidungs-Assistent - -

      Welches Framework passt zu deinem Projekt?

      -

      Wähle dein Hauptziel für eine präzise Empfehlung.

      -
      - -
      - - - - - -
      - - {/* Result Display */} - {quizChoice && ( -
      - {quizChoice === 'enterprise' && ( - <> -
      - Empfehlung: Angular -
      -

      - Für skalierbare Großprojekte mit vielen Entwicklern bietet Angular durch Out-of-the-Box Dependency Injection, erzwungenes TypeScript und klare Modulstrukturen die höchste Wartbarkeit. -

      - - )} - {quizChoice === 'mvp' && ( - <> -
      - Empfehlung: React oder Vue.js -
      -

      - Für maximale Entwicklungsgeschwindigkeit profitieren Sie bei React vom weltweit größten Bibliotheks-Ökosystem und Entwickler-Pool. Vue.js bietet eine unvergleichlich sanfte Einarbeitung. -

      - - )} - {quizChoice === 'perf' && ( - <> -
      - Empfehlung: Svelte -
      -

      - Da Svelte keinen Virtual DOM benötigt und den Code zur Buildzeit compiliert, ist es in puncto Ladezeit, Speicherverbrauch und minimalem JS-Footprint der Spitzenreiter. -

      - - )} - -
      - )} -
      -
      - -
      - - {} -
      -
      -
      - - Frontend Framework Komparator SPA 2026 -
      -
      - Entwickelt mit React & Tailwind CSS. -
      -
      -
      - -
      - ); -} \ No newline at end of file diff --git a/05_react/unterricht/tag37/02_gemini-spa-vergleich/index.html b/05_react/unterricht/tag37/02_gemini-spa-vergleich/index.html deleted file mode 100644 index e5c020b..0000000 --- a/05_react/unterricht/tag37/02_gemini-spa-vergleich/index.html +++ /dev/null @@ -1,1121 +0,0 @@ - - - - - - Frontend Framework Komparator 2026 | React, Angular, Vue & Svelte - - - - - - - - - - - - -
      -
      -
      -
      - -
      -
      - Framework Radar - 2026 Edition -
      -
      - - - -
      - -
      -
      -
      - -
      - - -
      -
      -
      - -
      -
      - Interaktive Frontend-Entscheidungshilfe -
      -

      - React vs. Angular vs. Vue vs. Svelte -

      -

      - Welches JavaScript-Framework passt am besten zu deinem nächsten Projekt? Vergleiche Systemarchitekturen, Performancewerte, Ökosysteme und entdecke reale Referenzprojekte weltbekannter Unternehmen. -

      -
      - - -
      -
      - - -
      - -
      -
      - - Meta -
      -

      React

      -

      Komponentenbasierte UI-Bibliothek mit JSX & riesigem Ökosystem.

      -
      - - -
      -
      - - Google -
      -

      Angular

      -

      Vollständiges Batterien-inklusive Application Framework mit TypeScript.

      -
      - - -
      -
      - - Community -
      -

      Vue.js

      -

      Progressives Framework mit sehr flacher Lernkurve & flexibler Syntax.

      -
      - - -
      -
      - - Compiler -
      -

      Svelte

      -

      Kein Virtual DOM. Compiliert direkt in hochoptimierten Vanillacode.

      -
      -
      -
      - - -
      -
      -
      -

      - Vergleichsmatrix -

      -

      Detaillierter Gegenüberstellung relevanter Kennzahlen & Eigenschaften.

      -
      -
      - -
      -
      - -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Kriterium React Angular Vue.js Svelte
      Typus / ArtUI BibliothekFull Application FrameworkProgressives FrameworkCompiler Framework
      Erstveröffentlichung2013 (Meta)2016 (Google)2014 (Evan You)2016 (Rich Harris)
      Arbeitsweise / DOMVirtual DOMIncremental DOM / Signal-DrivenVirtual DOM (Reactivity Engine)Kein vDOM (Direct DOM Updates)
      LernkurveMittel (JSX, State)Steil (DI, RxJS, TS)Einfach (HTML/CSS/JS)Sehr Einfach
      Bundle Size (Minimal gzip)~42 kB (React + DOM)~120 kB (Core + Runtime)~34 kB~2 kB (No Runtime)
      Performance Score 8.8 / 10 8.2 / 10 9.0 / 10 9.8 / 10
      Enterprise ReadinessSehr HochBranchenstandardHochStetig Wachsend
      Bekannteste Meta-FrameworksNext.js, RemixAnalog, Angular SSRNuxt.jsSvelteKit
      StärkenRiesiger Arbeitsmarkt, unendliche Bibliotheken, flexibelKlare Architekturmuster, hervorragend für GroßteamsHervorragende Dokumentation, sanfte UmstellungExtrem schnell, minimaler Code, kein Boilerplate
      -
      -
      - - -
      -
      -
      -

      - Benchmark & Visualisierung -

      -

      Visuelle Gegenüberstellung in Radar- und Balkendiagrammen.

      -
      - - -
      - - -
      - -
      -
      -
      -

      - Stärken-Radar -

      - Metriken 0-100 -
      -

      Vergleich bezüglich Performance, Ökosystem, Lernkurve, DX (Developer Experience) und Skalierbarkeit.

      -
      -
      - -
      -
      - - -
      -
      -
      -

      - Paketgröße (Minimal Bundle in kB) -

      - Gzipped (kleiner ist besser) -
      -

      Typisches initiales Hello-World/Core Bundle-Gewicht für Web-Apps.

      -
      -
      - -
      -
      -
      -
      - - -
      -
      -
      -

      - Bekannte Referenzprojekte -

      -

      Welche namhaften Unternehmen und Plattformen setzen auf welches Framework?

      -
      - - -
      -
      - - -
      - -
      -
      - - -
      - -
      -
      - - -
      -
      -

      - Syntax-Vergleich -

      -

      Erlebe den Unterschied in der Syntax bei typischen Anwendungsfällen.

      -
      - -
      - -
      - - -
      - - -
      - - - - -
      - - -
      - -
      // Dynamic Code will load here
      -
      -
      -
      - - -
      -
      -
      - Entscheidungshilfe -

      Welches Framework passt zu deinem Projekt?

      -

      Beantworte 3 kurze Fragen und erhalte eine Empfehlung für dein Vorhaben.

      -
      - -
      - -
      -

      1. Was für eine Art von Projekt entwickelst du?

      -
      - - - -
      -
      -
      - - - -
      -
      - -
      - - -
      -
      -
      - - Frontend Framework Komparator 2026 -
      -
      - Erstellt für Entwickler, Architekten & Entscheidungsträger. -
      -
      -
      - - - -`, - svelte: ` - -
      -

      Anzahl: {count}

      - -
      ` - }, - fetch: { - react: `import React, { useState, useEffect } from 'react'; - -export default function UserList() { - const [users, setUsers] = useState([]); - - useEffect(() => { - fetch('/api/users') - .then(res => res.json()) - .then(data => setUsers(data)); - }, []); - - return ( -
        - {users.map(u =>
      • {u.name}
      • )} -
      - ); -}`, - angular: `import { Component, inject, OnInit } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; - -@Component({ - selector: 'app-users', - template: \` -
        - @for (user of users; track user.id) { -
      • {{ user.name }}
      • - } -
      - \` -}) -export class UsersComponent implements OnInit { - private http = inject(HttpClient); - users: any[] = []; - - ngOnInit() { - this.http.get('/api/users').subscribe(data => this.users = data); - } -}`, - vue: ` - -`, - svelte: ` - -
        - {#each users as user} -
      • {user.name}
      • - {/each} -
      ` - } - }; - - let radarChartInstance, barChartInstance; - let currentSnippetType = 'counter'; - let currentSnippetFw = 'react'; - - window.onload = function() { - renderProjects(); - initCharts(); - updateCodeViewer(); - }; - - function initCharts() { - // Radar Chart Configuration - const radarCtx = document.getElementById('radarChart').getContext('2d'); - radarChartInstance = new Chart(radarCtx, { - type: 'radar', - data: { - labels: ['Performance', 'Ökosystem', 'Lernkurve (Einfachheit)', 'Enterprise Readiness', 'DX (Developer Experience)', 'Jobmarkt'], - datasets: [ - { - label: 'React', - data: [85, 98, 65, 92, 85, 99], - borderColor: '#61dafb', - backgroundColor: 'rgba(97, 218, 251, 0.15)', - borderWidth: 2, - pointBackgroundColor: '#61dafb' - }, - { - label: 'Angular', - data: [82, 88, 45, 98, 80, 85], - borderColor: '#dd0031', - backgroundColor: 'rgba(221, 0, 49, 0.15)', - borderWidth: 2, - pointBackgroundColor: '#dd0031' - }, - { - label: 'Vue.js', - data: [90, 85, 90, 85, 92, 75], - borderColor: '#42b883', - backgroundColor: 'rgba(66, 184, 131, 0.15)', - borderWidth: 2, - pointBackgroundColor: '#42b883' - }, - { - label: 'Svelte', - data: [98, 70, 95, 72, 96, 50], - borderColor: '#ff3e00', - backgroundColor: 'rgba(255, 62, 0, 0.15)', - borderWidth: 2, - pointBackgroundColor: '#ff3e00' - } - ] - }, - options: { - responsive: true, - maintainAspectRatio: false, - scales: { - r: { - angleLines: { color: 'rgba(255, 255, 255, 0.1)' }, - grid: { color: 'rgba(255, 255, 255, 0.1)' }, - pointLabels: { - color: '#94a3b8', - font: { size: 11, family: 'Inter' } - }, - ticks: { - color: '#64748b', - backdropColor: 'transparent', - min: 0, - max: 100 - } - } - }, - plugins: { - legend: { - labels: { color: '#f8fafc', font: { family: 'Inter' } } - } - } - } - }); - - // Bar Chart Configuration (Bundle Size) - const barCtx = document.getElementById('barChart').getContext('2d'); - barChartInstance = new Chart(barCtx, { - type: 'bar', - data: { - labels: ['React (Core + DOM)', 'Angular (Core Runtime)', 'Vue.js (Minified)', 'Svelte (Compiled Code)'], - datasets: [{ - label: 'Bundle Größe in kB (gzipped)', - data: [42, 120, 34, 2.5], - backgroundColor: [ - 'rgba(97, 218, 251, 0.8)', - 'rgba(221, 0, 49, 0.8)', - 'rgba(66, 184, 131, 0.8)', - 'rgba(255, 62, 0, 0.8)' - ], - borderColor: [ - '#61dafb', - '#dd0031', - '#42b883', - '#ff3e00' - ], - borderWidth: 1, - borderRadius: 8 - }] - }, - options: { - responsive: true, - maintainAspectRatio: false, - scales: { - y: { - beginAtZero: true, - grid: { color: 'rgba(255, 255, 255, 0.08)' }, - ticks: { color: '#94a3b8' } - }, - x: { - grid: { display: false }, - ticks: { color: '#94a3b8' } - } - }, - plugins: { - legend: { - labels: { color: '#f8fafc', font: { family: 'Inter' } } - } - } - } - }); - } - - function renderProjects() { - const grid = document.getElementById('projectsGrid'); - const fwFilter = document.getElementById('frameworkFilter').value; - const searchQuery = document.getElementById('projectSearch').value.toLowerCase(); - - grid.innerHTML = ''; - - const filtered = projectsData.filter(p => { - const matchesFw = (fwFilter === 'all' || p.framework === fwFilter); - const matchesSearch = p.name.toLowerCase().includes(searchQuery) || - p.description.toLowerCase().includes(searchQuery) || - p.tags.some(t => t.toLowerCase().includes(searchQuery)); - return matchesFw && matchesSearch; - }); - - if (filtered.length === 0) { - grid.innerHTML = ` -
      - -

      Keine passenden Referenzprojekte gefunden.

      -
      - `; - return; - } - - filtered.forEach(p => { - const card = document.createElement('div'); - card.className = "glass-card p-6 rounded-2xl border border-slate-800 hover:border-slate-700 transition-all flex flex-col justify-between group"; - card.innerHTML = ` -
      -
      - - ${p.fwName} - - -
      -

      ${p.name}

      -

      ${p.description}

      -
      -
      -
      - - ${p.metric} -
      -
      - ${p.tags.map(t => `#${t}`).join('')} -
      - - Website besuchen - -
      - `; - grid.appendChild(card); - }); - } - - function filterProjects() { - renderProjects(); - } - - function filterByFramework(fw) { - document.getElementById('frameworkFilter').value = fw; - renderProjects(); - scrollToSection('showcase'); - } - - function scrollToSection(id) { - document.getElementById(id)?.scrollIntoView({ behavior: 'smooth' }); - } - - // Code Viewer Controls - function switchSnippetExample(type) { - currentSnippetType = type; - document.querySelectorAll('.snippet-tab-btn').forEach(b => { - b.classList.remove('bg-indigo-600', 'text-white'); - b.classList.add('bg-slate-800', 'text-slate-300'); - }); - const activeBtn = document.getElementById(`btn-${type}`); - activeBtn.classList.remove('bg-slate-800', 'text-slate-300'); - activeBtn.classList.add('bg-indigo-600', 'text-white'); - updateCodeViewer(); - } - - function switchCodeFramework(fw) { - currentSnippetFw = fw; - document.querySelectorAll('.code-fw-btn').forEach(b => { - b.classList.remove('border-[#61dafb]', 'border-[#dd0031]', 'border-[#42b883]', 'border-[#ff3e00]', 'text-white'); - b.classList.add('border-transparent', 'text-slate-400'); - }); - const activeTab = document.getElementById(`code-tab-${fw}`); - activeTab.classList.remove('border-transparent', 'text-slate-400'); - activeTab.classList.add('text-white'); - - const colors = { react: 'border-[#61dafb]', angular: 'border-[#dd0031]', vue: 'border-[#42b883]', svelte: 'border-[#ff3e00]' }; - activeTab.classList.add(colors[fw]); - - updateCodeViewer(); - } - - function updateCodeViewer() { - const viewer = document.getElementById('codeViewer'); - const code = codeExamples[currentSnippetType][currentSnippetFw]; - viewer.textContent = code; - } - - function copyCode() { - const code = document.getElementById('codeViewer').textContent; - navigator.clipboard.writeText(code).then(() => { - const btn = event.currentTarget; - const orig = btn.innerHTML; - btn.innerHTML = ` Kopiert!`; - setTimeout(() => btn.innerHTML = orig, 2000); - }); - } - - // Quiz Logic - function selectQuizAnswer(step, choice) { - const resContainer = document.getElementById('quizResult'); - resContainer.classList.remove('hidden'); - - let title = ""; - let fw = ""; - let desc = ""; - let color = ""; - - if (choice === 'enterprise') { - title = "Empfehlung: Angular"; - fw = "Angular"; - color = "text-[#dd0031]"; - desc = "Für große Enterprise-Anwendungen und strukturierte Teams ist Angular ideal. Es bietet Out-of-the-box Depedency Injection, Typsicherheit durch TypeScript und klare Architekturvorgaben."; - } else if (choice === 'mvp') { - title = "Empfehlung: React oder Vue.js"; - fw = "React / Vue.js"; - color = "text-[#61dafb]"; - desc = "Für schnelle Markteinführungen und flexible Prototypen profitieren Sie bei React von einem gewaltigen Arbeitsmarkt & Ecosystem oder bei Vue.js von extrem rascher Einarbeitung."; - } else { - title = "Empfehlung: Svelte"; - fw = "Svelte"; - color = "text-[#ff3e00]"; - desc = "Für maximale Lade-Performance, Daten-Visualisierungen und minimalste Paketgrößen ist Svelte unschlagbar. Da es ohne Virtual DOM auskommt, compiliert es direkt in extrem schlanken JS-Code."; - } - - resContainer.innerHTML = ` -
      - -

      ${title}

      -
      -

      ${desc}

      -
      - -
      - `; - resContainer.scrollIntoView({ behavior: 'smooth' }); - } - - // Download Radar & Bar Chart as Combined Image - function downloadChartImage() { - // Create offscreen canvas for rendering high-res export image - const exportCanvas = document.createElement('canvas'); - const width = 1200; - const height = 750; - exportCanvas.width = width; - exportCanvas.height = height; - const ctx = exportCanvas.getContext('2d'); - - // Draw Background - ctx.fillStyle = '#0f172a'; - ctx.fillRect(0, 0, width, height); - - // Draw Header Title - ctx.fillStyle = '#ffffff'; - ctx.font = 'bold 28px Inter, sans-serif'; - ctx.fillText('Frontend Framework Vergleich 2026', 50, 50); - - ctx.fillStyle = '#94a3b8'; - ctx.font = '14px Inter, sans-serif'; - ctx.fillText('React vs. Angular vs. Vue.js vs. Svelte — Radar & Paketgrößen Benchmark', 50, 75); - - // Draw Charts onto export canvas - const radarCanvas = document.getElementById('radarChart'); - const barCanvas = document.getElementById('barChart'); - - // Draw Radar Chart Image - ctx.drawImage(radarCanvas, 50, 110, 520, 550); - - // Draw Bar Chart Image - ctx.drawImage(barCanvas, 630, 110, 520, 550); - - // Footer / Watermark - ctx.fillStyle = '#64748b'; - ctx.font = '12px Inter, sans-serif'; - ctx.fillText('Generiert mit Framework Radar 2026', 50, 710); - - // Trigger Download - const imageURL = exportCanvas.toDataURL('image/png'); - const downloadLink = document.createElement('a'); - downloadLink.href = imageURL; - downloadLink.download = 'framework-vergleich-chart-2026.png'; - document.body.appendChild(downloadLink); - downloadLink.click(); - document.body.removeChild(downloadLink); - } - - // Download CSV Function - function downloadCSV() { - const csvData = [ - ["Kriterium", "React", "Angular", "Vue.js", "Svelte"], - ["Typus", "UI Bibliothek", "Full Framework", "Progressives Framework", "Compiler Framework"], - ["Erstveroeffentlichung", "2013 (Meta)", "2016 (Google)", "2014 (Community)", "2016 (Rich Harris)"], - ["DOM Typ", "Virtual DOM", "Incremental / Signals", "Virtual DOM", "Direct DOM (No vDOM)"], - ["Lernkurve", "Mittel", "Steil", "Einfach", "Sehr Einfach"], - ["Bundle Size (kB)", "42", "120", "34", "2.5"], - ["Performance Score", "8.8", "8.2", "9.0", "9.8"], - ["Enterprise Readiness", "Sehr Hoch", "Branchenstandard", "Hoch", "Wachsend"] - ]; - - let csvContent = "data:text/csv;charset=utf-8,"; - csvData.forEach(row => { - csvContent += row.map(e => `"${e}"`).join(",") + "\n"; - }); - - const encodedUri = encodeURI(csvContent); - const link = document.createElement("a"); - link.setAttribute("href", encodedUri); - link.setAttribute("download", "framework_vergleich_matrix.csv"); - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - } - - - \ No newline at end of file diff --git a/05_react/unterricht/tag37/03_import-es6/assets/img/defer_async.png b/05_react/unterricht/tag37/03_import-es6/assets/img/defer_async.png deleted file mode 100644 index d7bf779..0000000 Binary files a/05_react/unterricht/tag37/03_import-es6/assets/img/defer_async.png and /dev/null differ diff --git a/05_react/unterricht/tag37/03_import-es6/assets/js/main.js b/05_react/unterricht/tag37/03_import-es6/assets/js/main.js deleted file mode 100644 index 5a04c5a..0000000 --- a/05_react/unterricht/tag37/03_import-es6/assets/js/main.js +++ /dev/null @@ -1,19 +0,0 @@ -import math from './math.js'; // ohne bundler kompletter pfad - -// import '../../node_modules/jquery/dist/jquery.js'; -import '../../node_modules/lodash/lodash.js'; -// identisch zu - -// https://esm.sh/ -import $ from 'https://esm.sh/jquery@4.0.0'; - -import { add, subtract } from './math.js'; - -console.log(math.add(1, 2)); //=> 3 -console.log(math.subtract(1, 2)); //=> -1 - -console.log(add(1, 2)); //=> 3 -console.log(subtract(1, 2)); //=> -1 - -$('h1').css({ color: 'tomato' }); -console.log(_.shuffle(_.range(1, 50)).slice(0, 6)); diff --git a/05_react/unterricht/tag37/03_import-es6/assets/js/math.js b/05_react/unterricht/tag37/03_import-es6/assets/js/math.js deleted file mode 100644 index 365790e..0000000 --- a/05_react/unterricht/tag37/03_import-es6/assets/js/math.js +++ /dev/null @@ -1,8 +0,0 @@ -// explizite Freigabe von Einheiten -export const add = (a, b) => a + b; -export const subtract = (a, b) => a - b; - -export default { - add, - subtract, -}; diff --git a/05_react/unterricht/tag37/03_import-es6/index.html b/05_react/unterricht/tag37/03_import-es6/index.html deleted file mode 100644 index 205d3ee..0000000 --- a/05_react/unterricht/tag37/03_import-es6/index.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - Module in JS mit Bundler - - - - - -
      -
      -

      Verwendung und Import von Modulen in JS (ES6) OHNE BUNDLER

      -
      -

      Um die Modul-Schreibweise in JS zu verwenden, müssen folgende Punkte berücksichtigt werden:

      -
        -
      • Script-Tag benötigt die Modulangabe mit "type=module"
      • -
      • Kommunikation läuft über das HTTP-Protokoll (HTTP-Kommunikation lokal über Server)
      • -
      • Eingebundene Module müssen mit Dateiendung (.js) angegeben werden.
      • -
      -

      Ergebnis

      -

      Die einzelnen Komponenten werden zur Laufzeit (Runtime) einzeln per HTTP-Request eingebunden

      - script Attribute -
      -
      - - diff --git a/05_react/unterricht/tag37/03_import-es6/package-lock.json b/05_react/unterricht/tag37/03_import-es6/package-lock.json deleted file mode 100644 index cc05949..0000000 --- a/05_react/unterricht/tag37/03_import-es6/package-lock.json +++ /dev/null @@ -1,660 +0,0 @@ -{ - "name": "03_import-es6", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "03_import-es6", - "version": "1.0.0", - "dependencies": { - "jquery": "^4.0.0", - "lodash": "^4.18.1" - }, - "devDependencies": { - "http-server": "^14.1.1" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true, - "license": "MIT" - }, - "node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/corser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", - "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", - "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true, - "license": "MIT" - }, - "node_modules/follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", - "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-server": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", - "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "basic-auth": "^2.0.1", - "chalk": "^4.1.2", - "corser": "^2.0.1", - "he": "^1.2.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy": "^1.18.1", - "mime": "^1.6.0", - "minimist": "^1.2.6", - "opener": "^1.5.1", - "portfinder": "^1.0.28", - "secure-compare": "3.0.1", - "union": "~0.5.0", - "url-join": "^4.0.1" - }, - "bin": { - "http-server": "bin/http-server" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jquery": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-4.0.0.tgz", - "integrity": "sha512-TXCHVR3Lb6TZdtw1l3RTLf8RBWVGexdxL6AC8/e0xZKEpBflBsjh9/8LXw+dkNFuOyW9B7iB3O1sP7hS0Kiacg==", - "license": "MIT" - }, - "node_modules/lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "license": "MIT" - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true, - "license": "(WTFPL OR MIT)", - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/portfinder": { - "version": "1.0.38", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.38.tgz", - "integrity": "sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==", - "dev": true, - "license": "MIT", - "dependencies": { - "async": "^3.2.6", - "debug": "^4.3.6" - }, - "engines": { - "node": ">= 10.12" - } - }, - "node_modules/qs": { - "version": "6.15.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", - "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "es-define-property": "^1.0.1", - "side-channel": "^1.1.1" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/secure-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", - "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", - "dev": true, - "license": "MIT" - }, - "node_modules/side-channel": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", - "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4", - "side-channel-list": "^1.0.1", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", - "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/union": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", - "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", - "dev": true, - "dependencies": { - "qs": "^6.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true, - "license": "MIT" - }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - } - } -} diff --git a/05_react/unterricht/tag37/03_import-es6/package.json b/05_react/unterricht/tag37/03_import-es6/package.json deleted file mode 100644 index 2eb9828..0000000 --- a/05_react/unterricht/tag37/03_import-es6/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "03_import-es6", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "start": "npx http-server -p 3000 -c-1" - }, - "keywords": [], - "type": "commonjs", - "devDependencies": { - "http-server": "^14.1.1" - }, - "dependencies": { - "jquery": "^4.0.0", - "lodash": "^4.18.1" - } -} diff --git a/05_react/unterricht/tag37/04_import-mit-bundler/assets/js/main.js b/05_react/unterricht/tag37/04_import-mit-bundler/assets/js/main.js deleted file mode 100644 index 26de4be..0000000 --- a/05_react/unterricht/tag37/04_import-mit-bundler/assets/js/main.js +++ /dev/null @@ -1,15 +0,0 @@ -import math from './math'; // mit bundler keine dateiendung notwendig - -import $ from 'jquery'; // suche im node_modules und zusammenführen nur mit bundler -import _ from 'lodash'; - -import { add, subtract } from './math'; - -console.log(math.add(1, 2)); //=> 3 -console.log(math.subtract(1, 2)); //=> -1 - -console.log(add(1, 2)); //=> 3 -console.log(subtract(1, 2)); //=> -1 - -$('h1').css({ color: 'tomato' }); -console.log(_.shuffle(_.range(1, 50)).slice(0, 6)); diff --git a/05_react/unterricht/tag37/04_import-mit-bundler/assets/js/math.js b/05_react/unterricht/tag37/04_import-mit-bundler/assets/js/math.js deleted file mode 100644 index 365790e..0000000 --- a/05_react/unterricht/tag37/04_import-mit-bundler/assets/js/math.js +++ /dev/null @@ -1,8 +0,0 @@ -// explizite Freigabe von Einheiten -export const add = (a, b) => a + b; -export const subtract = (a, b) => a - b; - -export default { - add, - subtract, -}; diff --git a/05_react/unterricht/tag37/04_import-mit-bundler/index.html b/05_react/unterricht/tag37/04_import-mit-bundler/index.html deleted file mode 100644 index 9760c55..0000000 --- a/05_react/unterricht/tag37/04_import-mit-bundler/index.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - Module in JS mit Bundler - - - - - -
      -
      -

      Verwendung und Import von Modulen in JS MIT BUNDLER

      -
      -

      Um die Modul-Schreibweise in JS zu verwenden, müssen folgende Punkte berücksichtigt werden:

      -
        -
      • Eingebundene Module können ohne Dateiendung eingebunden werden.
      • -
      -

      Ergebnis

      -

      Die einzelnen Komponenten werden zur Kompilierzeit zu einer Datei zusammengefasst

      -
      -
      - - diff --git a/05_react/unterricht/tag37/04_import-mit-bundler/package-lock.json b/05_react/unterricht/tag37/04_import-mit-bundler/package-lock.json deleted file mode 100644 index 27b7b82..0000000 --- a/05_react/unterricht/tag37/04_import-mit-bundler/package-lock.json +++ /dev/null @@ -1,2600 +0,0 @@ -{ - "name": "04_import-mit-bundler", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "04_import-mit-bundler", - "version": "1.0.0", - "dependencies": { - "jquery": "^4.0.0", - "lodash": "^4.18.1" - }, - "devDependencies": { - "esbuild": "^0.28.1", - "npm-run-all": "^4.1.5" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", - "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", - "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", - "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", - "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", - "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", - "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", - "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", - "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", - "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", - "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", - "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", - "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", - "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", - "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", - "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", - "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", - "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", - "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", - "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", - "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", - "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", - "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", - "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", - "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", - "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", - "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/call-bind": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", - "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "get-intrinsic": "^1.3.0", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", - "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", - "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-abstract-get": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-abstract-get/-/es-abstract-get-1.0.0.tgz", - "integrity": "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.2", - "is-callable": "^1.2.7", - "object-inspect": "^1.13.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", - "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz", - "integrity": "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-abstract-get": "^1.0.0", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "is-callable": "^1.2.7", - "is-date-object": "^1.1.0", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/esbuild": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", - "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.28.1", - "@esbuild/android-arm": "0.28.1", - "@esbuild/android-arm64": "0.28.1", - "@esbuild/android-x64": "0.28.1", - "@esbuild/darwin-arm64": "0.28.1", - "@esbuild/darwin-x64": "0.28.1", - "@esbuild/freebsd-arm64": "0.28.1", - "@esbuild/freebsd-x64": "0.28.1", - "@esbuild/linux-arm": "0.28.1", - "@esbuild/linux-arm64": "0.28.1", - "@esbuild/linux-ia32": "0.28.1", - "@esbuild/linux-loong64": "0.28.1", - "@esbuild/linux-mips64el": "0.28.1", - "@esbuild/linux-ppc64": "0.28.1", - "@esbuild/linux-riscv64": "0.28.1", - "@esbuild/linux-s390x": "0.28.1", - "@esbuild/linux-x64": "0.28.1", - "@esbuild/netbsd-arm64": "0.28.1", - "@esbuild/netbsd-x64": "0.28.1", - "@esbuild/openbsd-arm64": "0.28.1", - "@esbuild/openbsd-x64": "0.28.1", - "@esbuild/openharmony-arm64": "0.28.1", - "@esbuild/sunos-x64": "0.28.1", - "@esbuild/win32-arm64": "0.28.1", - "@esbuild/win32-ia32": "0.28.1", - "@esbuild/win32-x64": "0.28.1" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz", - "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2", - "hasown": "^2.0.4", - "is-callable": "^1.2.7", - "is-document.all": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/generator-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", - "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true, - "license": "ISC" - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", - "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-document.all": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz", - "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.4", - "generator-function": "^2.0.0", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/jquery": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-4.0.0.tgz", - "integrity": "sha512-TXCHVR3Lb6TZdtw1l3RTLf8RBWVGexdxL6AC8/e0xZKEpBflBsjh9/8LXw+dkNFuOyW9B7iB3O1sP7hS0Kiacg==", - "license": "MIT" - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true, - "license": "MIT" - }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "license": "MIT" - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "dev": true, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/npm-run-all": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", - "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "memorystream": "^0.3.1", - "minimatch": "^3.0.4", - "pidtree": "^0.3.0", - "read-pkg": "^3.0.0", - "shell-quote": "^1.6.1", - "string.prototype.padend": "^3.0.0" - }, - "bin": { - "npm-run-all": "bin/npm-run-all/index.js", - "run-p": "bin/run-p/index.js", - "run-s": "bin/run-s/index.js" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/own-keys": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.2.tgz", - "integrity": "sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.4", - "get-intrinsic": "^1.3.0", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "license": "MIT", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pidtree": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", - "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", - "dev": true, - "license": "MIT", - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve": { - "version": "1.22.12", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", - "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", - "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "get-intrinsic": "^1.3.0", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shell-quote": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.10.0.tgz", - "integrity": "sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", - "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4", - "side-channel-list": "^1.0.1", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", - "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.23", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", - "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/string.prototype.padend": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz", - "integrity": "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", - "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.2", - "es-object-atoms": "^1.1.2", - "has-property-descriptors": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", - "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", - "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "for-each": "^0.3.5", - "gopd": "^1.2.0", - "is-typed-array": "^1.1.15", - "possible-typed-array-names": "^1.1.0", - "reflect.getprototypeof": "^1.0.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.22", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", - "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - } - } -} diff --git a/05_react/unterricht/tag37/04_import-mit-bundler/package.json b/05_react/unterricht/tag37/04_import-mit-bundler/package.json deleted file mode 100644 index b326e51..0000000 --- a/05_react/unterricht/tag37/04_import-mit-bundler/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "04_import-mit-bundler", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "js": "npx esbuild assets/js/main.js --bundle --watch --outfile=dist/bundle.js", - "server": "npx http-server -c-1 -p 3000", - "start": "run-p server js" - }, - "keywords": [], - "type": "commonjs", - "devDependencies": { - "esbuild": "^0.28.1", - "npm-run-all": "^4.1.5" - }, - "dependencies": { - "jquery": "^4.0.0", - "lodash": "^4.18.1" - } -} diff --git a/05_react/unterricht/tag38/01_react-cra/.gitignore b/05_react/unterricht/tag38/01_react-cra/.gitignore deleted file mode 100644 index 4d29575..0000000 --- a/05_react/unterricht/tag38/01_react-cra/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# production -/build - -# misc -.DS_Store -.env.local -.env.development.local -.env.test.local -.env.production.local - -npm-debug.log* -yarn-debug.log* -yarn-error.log* diff --git a/05_react/unterricht/tag38/01_react-cra/README.md b/05_react/unterricht/tag38/01_react-cra/README.md deleted file mode 100644 index 58beeac..0000000 --- a/05_react/unterricht/tag38/01_react-cra/README.md +++ /dev/null @@ -1,70 +0,0 @@ -# Getting Started with Create React App - -This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). - -## Available Scripts - -In the project directory, you can run: - -### `npm start` - -Runs the app in the development mode.\ -Open [http://localhost:3000](http://localhost:3000) to view it in your browser. - -The page will reload when you make changes.\ -You may also see any lint errors in the console. - -### `npm test` - -Launches the test runner in the interactive watch mode.\ -See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. - -### `npm run build` - -Builds the app for production to the `build` folder.\ -It correctly bundles React in production mode and optimizes the build for the best performance. - -The build is minified and the filenames include the hashes.\ -Your app is ready to be deployed! - -See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. - -### `npm run eject` - -**Note: this is a one-way operation. Once you `eject`, you can't go back!** - -If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. - -Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own. - -You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it. - -## Learn More - -You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). - -To learn React, check out the [React documentation](https://reactjs.org/). - -### Code Splitting - -This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting) - -### Analyzing the Bundle Size - -This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size) - -### Making a Progressive Web App - -This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app) - -### Advanced Configuration - -This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration) - -### Deployment - -This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment) - -### `npm run build` fails to minify - -This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify) diff --git a/05_react/unterricht/tag38/01_react-cra/config/env.js b/05_react/unterricht/tag38/01_react-cra/config/env.js deleted file mode 100644 index ffa7e49..0000000 --- a/05_react/unterricht/tag38/01_react-cra/config/env.js +++ /dev/null @@ -1,104 +0,0 @@ -'use strict'; - -const fs = require('fs'); -const path = require('path'); -const paths = require('./paths'); - -// Make sure that including paths.js after env.js will read .env variables. -delete require.cache[require.resolve('./paths')]; - -const NODE_ENV = process.env.NODE_ENV; -if (!NODE_ENV) { - throw new Error( - 'The NODE_ENV environment variable is required but was not specified.' - ); -} - -// https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use -const dotenvFiles = [ - `${paths.dotenv}.${NODE_ENV}.local`, - // Don't include `.env.local` for `test` environment - // since normally you expect tests to produce the same - // results for everyone - NODE_ENV !== 'test' && `${paths.dotenv}.local`, - `${paths.dotenv}.${NODE_ENV}`, - paths.dotenv, -].filter(Boolean); - -// Load environment variables from .env* files. Suppress warnings using silent -// if this file is missing. dotenv will never modify any environment variables -// that have already been set. Variable expansion is supported in .env files. -// https://github.com/motdotla/dotenv -// https://github.com/motdotla/dotenv-expand -dotenvFiles.forEach(dotenvFile => { - if (fs.existsSync(dotenvFile)) { - require('dotenv-expand')( - require('dotenv').config({ - path: dotenvFile, - }) - ); - } -}); - -// We support resolving modules according to `NODE_PATH`. -// This lets you use absolute paths in imports inside large monorepos: -// https://github.com/facebook/create-react-app/issues/253. -// It works similar to `NODE_PATH` in Node itself: -// https://nodejs.org/api/modules.html#modules_loading_from_the_global_folders -// Note that unlike in Node, only *relative* paths from `NODE_PATH` are honored. -// Otherwise, we risk importing Node.js core modules into an app instead of webpack shims. -// https://github.com/facebook/create-react-app/issues/1023#issuecomment-265344421 -// We also resolve them to make sure all tools using them work consistently. -const appDirectory = fs.realpathSync(process.cwd()); -process.env.NODE_PATH = (process.env.NODE_PATH || '') - .split(path.delimiter) - .filter(folder => folder && !path.isAbsolute(folder)) - .map(folder => path.resolve(appDirectory, folder)) - .join(path.delimiter); - -// Grab NODE_ENV and REACT_APP_* environment variables and prepare them to be -// injected into the application via DefinePlugin in webpack configuration. -const REACT_APP = /^REACT_APP_/i; - -function getClientEnvironment(publicUrl) { - const raw = Object.keys(process.env) - .filter(key => REACT_APP.test(key)) - .reduce( - (env, key) => { - env[key] = process.env[key]; - return env; - }, - { - // Useful for determining whether we’re running in production mode. - // Most importantly, it switches React into the correct mode. - NODE_ENV: process.env.NODE_ENV || 'development', - // Useful for resolving the correct path to static assets in `public`. - // For example, . - // This should only be used as an escape hatch. Normally you would put - // images into the `src` and `import` them in code to get their paths. - PUBLIC_URL: publicUrl, - // We support configuring the sockjs pathname during development. - // These settings let a developer run multiple simultaneous projects. - // They are used as the connection `hostname`, `pathname` and `port` - // in webpackHotDevClient. They are used as the `sockHost`, `sockPath` - // and `sockPort` options in webpack-dev-server. - WDS_SOCKET_HOST: process.env.WDS_SOCKET_HOST, - WDS_SOCKET_PATH: process.env.WDS_SOCKET_PATH, - WDS_SOCKET_PORT: process.env.WDS_SOCKET_PORT, - // Whether or not react-refresh is enabled. - // It is defined here so it is available in the webpackHotDevClient. - FAST_REFRESH: process.env.FAST_REFRESH !== 'false', - } - ); - // Stringify all values so we can feed into webpack DefinePlugin - const stringified = { - 'process.env': Object.keys(raw).reduce((env, key) => { - env[key] = JSON.stringify(raw[key]); - return env; - }, {}), - }; - - return { raw, stringified }; -} - -module.exports = getClientEnvironment; diff --git a/05_react/unterricht/tag38/01_react-cra/config/getHttpsConfig.js b/05_react/unterricht/tag38/01_react-cra/config/getHttpsConfig.js deleted file mode 100644 index 013d493..0000000 --- a/05_react/unterricht/tag38/01_react-cra/config/getHttpsConfig.js +++ /dev/null @@ -1,66 +0,0 @@ -'use strict'; - -const fs = require('fs'); -const path = require('path'); -const crypto = require('crypto'); -const chalk = require('react-dev-utils/chalk'); -const paths = require('./paths'); - -// Ensure the certificate and key provided are valid and if not -// throw an easy to debug error -function validateKeyAndCerts({ cert, key, keyFile, crtFile }) { - let encrypted; - try { - // publicEncrypt will throw an error with an invalid cert - encrypted = crypto.publicEncrypt(cert, Buffer.from('test')); - } catch (err) { - throw new Error( - `The certificate "${chalk.yellow(crtFile)}" is invalid.\n${err.message}` - ); - } - - try { - // privateDecrypt will throw an error with an invalid key - crypto.privateDecrypt(key, encrypted); - } catch (err) { - throw new Error( - `The certificate key "${chalk.yellow(keyFile)}" is invalid.\n${ - err.message - }` - ); - } -} - -// Read file and throw an error if it doesn't exist -function readEnvFile(file, type) { - if (!fs.existsSync(file)) { - throw new Error( - `You specified ${chalk.cyan( - type - )} in your env, but the file "${chalk.yellow(file)}" can't be found.` - ); - } - return fs.readFileSync(file); -} - -// Get the https config -// Return cert files if provided in env, otherwise just true or false -function getHttpsConfig() { - const { SSL_CRT_FILE, SSL_KEY_FILE, HTTPS } = process.env; - const isHttps = HTTPS === 'true'; - - if (isHttps && SSL_CRT_FILE && SSL_KEY_FILE) { - const crtFile = path.resolve(paths.appPath, SSL_CRT_FILE); - const keyFile = path.resolve(paths.appPath, SSL_KEY_FILE); - const config = { - cert: readEnvFile(crtFile, 'SSL_CRT_FILE'), - key: readEnvFile(keyFile, 'SSL_KEY_FILE'), - }; - - validateKeyAndCerts({ ...config, keyFile, crtFile }); - return config; - } - return isHttps; -} - -module.exports = getHttpsConfig; diff --git a/05_react/unterricht/tag38/01_react-cra/config/jest/babelTransform.js b/05_react/unterricht/tag38/01_react-cra/config/jest/babelTransform.js deleted file mode 100644 index 5b391e4..0000000 --- a/05_react/unterricht/tag38/01_react-cra/config/jest/babelTransform.js +++ /dev/null @@ -1,29 +0,0 @@ -'use strict'; - -const babelJest = require('babel-jest').default; - -const hasJsxRuntime = (() => { - if (process.env.DISABLE_NEW_JSX_TRANSFORM === 'true') { - return false; - } - - try { - require.resolve('react/jsx-runtime'); - return true; - } catch (e) { - return false; - } -})(); - -module.exports = babelJest.createTransformer({ - presets: [ - [ - require.resolve('babel-preset-react-app'), - { - runtime: hasJsxRuntime ? 'automatic' : 'classic', - }, - ], - ], - babelrc: false, - configFile: false, -}); diff --git a/05_react/unterricht/tag38/01_react-cra/config/jest/cssTransform.js b/05_react/unterricht/tag38/01_react-cra/config/jest/cssTransform.js deleted file mode 100644 index 8f65114..0000000 --- a/05_react/unterricht/tag38/01_react-cra/config/jest/cssTransform.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -// This is a custom Jest transformer turning style imports into empty objects. -// http://facebook.github.io/jest/docs/en/webpack.html - -module.exports = { - process() { - return 'module.exports = {};'; - }, - getCacheKey() { - // The output is always the same. - return 'cssTransform'; - }, -}; diff --git a/05_react/unterricht/tag38/01_react-cra/config/jest/fileTransform.js b/05_react/unterricht/tag38/01_react-cra/config/jest/fileTransform.js deleted file mode 100644 index aab6761..0000000 --- a/05_react/unterricht/tag38/01_react-cra/config/jest/fileTransform.js +++ /dev/null @@ -1,40 +0,0 @@ -'use strict'; - -const path = require('path'); -const camelcase = require('camelcase'); - -// This is a custom Jest transformer turning file imports into filenames. -// http://facebook.github.io/jest/docs/en/webpack.html - -module.exports = { - process(src, filename) { - const assetFilename = JSON.stringify(path.basename(filename)); - - if (filename.match(/\.svg$/)) { - // Based on how SVGR generates a component name: - // https://github.com/smooth-code/svgr/blob/01b194cf967347d43d4cbe6b434404731b87cf27/packages/core/src/state.js#L6 - const pascalCaseFilename = camelcase(path.parse(filename).name, { - pascalCase: true, - }); - const componentName = `Svg${pascalCaseFilename}`; - return `const React = require('react'); - module.exports = { - __esModule: true, - default: ${assetFilename}, - ReactComponent: React.forwardRef(function ${componentName}(props, ref) { - return { - $$typeof: Symbol.for('react.element'), - type: 'svg', - ref: ref, - key: null, - props: Object.assign({}, props, { - children: ${assetFilename} - }) - }; - }), - };`; - } - - return `module.exports = ${assetFilename};`; - }, -}; diff --git a/05_react/unterricht/tag38/01_react-cra/config/modules.js b/05_react/unterricht/tag38/01_react-cra/config/modules.js deleted file mode 100644 index d63e41d..0000000 --- a/05_react/unterricht/tag38/01_react-cra/config/modules.js +++ /dev/null @@ -1,134 +0,0 @@ -'use strict'; - -const fs = require('fs'); -const path = require('path'); -const paths = require('./paths'); -const chalk = require('react-dev-utils/chalk'); -const resolve = require('resolve'); - -/** - * Get additional module paths based on the baseUrl of a compilerOptions object. - * - * @param {Object} options - */ -function getAdditionalModulePaths(options = {}) { - const baseUrl = options.baseUrl; - - if (!baseUrl) { - return ''; - } - - const baseUrlResolved = path.resolve(paths.appPath, baseUrl); - - // We don't need to do anything if `baseUrl` is set to `node_modules`. This is - // the default behavior. - if (path.relative(paths.appNodeModules, baseUrlResolved) === '') { - return null; - } - - // Allow the user set the `baseUrl` to `appSrc`. - if (path.relative(paths.appSrc, baseUrlResolved) === '') { - return [paths.appSrc]; - } - - // If the path is equal to the root directory we ignore it here. - // We don't want to allow importing from the root directly as source files are - // not transpiled outside of `src`. We do allow importing them with the - // absolute path (e.g. `src/Components/Button.js`) but we set that up with - // an alias. - if (path.relative(paths.appPath, baseUrlResolved) === '') { - return null; - } - - // Otherwise, throw an error. - throw new Error( - chalk.red.bold( - "Your project's `baseUrl` can only be set to `src` or `node_modules`." + - ' Create React App does not support other values at this time.' - ) - ); -} - -/** - * Get webpack aliases based on the baseUrl of a compilerOptions object. - * - * @param {*} options - */ -function getWebpackAliases(options = {}) { - const baseUrl = options.baseUrl; - - if (!baseUrl) { - return {}; - } - - const baseUrlResolved = path.resolve(paths.appPath, baseUrl); - - if (path.relative(paths.appPath, baseUrlResolved) === '') { - return { - src: paths.appSrc, - }; - } -} - -/** - * Get jest aliases based on the baseUrl of a compilerOptions object. - * - * @param {*} options - */ -function getJestAliases(options = {}) { - const baseUrl = options.baseUrl; - - if (!baseUrl) { - return {}; - } - - const baseUrlResolved = path.resolve(paths.appPath, baseUrl); - - if (path.relative(paths.appPath, baseUrlResolved) === '') { - return { - '^src/(.*)$': '/src/$1', - }; - } -} - -function getModules() { - // Check if TypeScript is setup - const hasTsConfig = fs.existsSync(paths.appTsConfig); - const hasJsConfig = fs.existsSync(paths.appJsConfig); - - if (hasTsConfig && hasJsConfig) { - throw new Error( - 'You have both a tsconfig.json and a jsconfig.json. If you are using TypeScript please remove your jsconfig.json file.' - ); - } - - let config; - - // If there's a tsconfig.json we assume it's a - // TypeScript project and set up the config - // based on tsconfig.json - if (hasTsConfig) { - const ts = require(resolve.sync('typescript', { - basedir: paths.appNodeModules, - })); - config = ts.readConfigFile(paths.appTsConfig, ts.sys.readFile).config; - // Otherwise we'll check if there is jsconfig.json - // for non TS projects. - } else if (hasJsConfig) { - config = require(paths.appJsConfig); - } - - config = config || {}; - const options = config.compilerOptions || {}; - - const additionalModulePaths = getAdditionalModulePaths(options); - - return { - additionalModulePaths: additionalModulePaths, - webpackAliases: getWebpackAliases(options), - jestAliases: getJestAliases(options), - hasTsConfig, - }; -} - -module.exports = getModules(); diff --git a/05_react/unterricht/tag38/01_react-cra/config/paths.js b/05_react/unterricht/tag38/01_react-cra/config/paths.js deleted file mode 100644 index f0a6cd9..0000000 --- a/05_react/unterricht/tag38/01_react-cra/config/paths.js +++ /dev/null @@ -1,77 +0,0 @@ -'use strict'; - -const path = require('path'); -const fs = require('fs'); -const getPublicUrlOrPath = require('react-dev-utils/getPublicUrlOrPath'); - -// Make sure any symlinks in the project folder are resolved: -// https://github.com/facebook/create-react-app/issues/637 -const appDirectory = fs.realpathSync(process.cwd()); -const resolveApp = relativePath => path.resolve(appDirectory, relativePath); - -// We use `PUBLIC_URL` environment variable or "homepage" field to infer -// "public path" at which the app is served. -// webpack needs to know it to put the right - - diff --git a/05_react/unterricht/tag38/02_vite-app/package-lock.json b/05_react/unterricht/tag38/02_vite-app/package-lock.json deleted file mode 100644 index c5ac4fc..0000000 --- a/05_react/unterricht/tag38/02_vite-app/package-lock.json +++ /dev/null @@ -1,1294 +0,0 @@ -{ - "name": "02_vite-app", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "02_vite-app", - "version": "0.0.0", - "dependencies": { - "react": "^19.2.8", - "react-dom": "^19.2.8" - }, - "devDependencies": { - "@types/react": "^19.2.17", - "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "^6.0.4", - "oxlint": "^1.75.0", - "vite": "^8.2.0" - } - }, - "node_modules/@oxc-project/types": { - "version": "0.142.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.142.0.tgz", - "integrity": "sha512-7W+2q5AKQVU36fkaryontrHn3YDt1RyUYXatw9i5H8ocYe2sPKSFB6eS8WNPeRKiN1qAWWZUPm7gwFzJGrccqQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@oxlint/binding-android-arm-eabi": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.77.0.tgz", - "integrity": "sha512-E06sKWS6PiI6HRxS1wyQg22HvApt01hI7fV+T3wUk3OSbaaP4a3hYGY/MIQDmASqCiRjBdpRQYkgMkqH82cWmQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-android-arm64": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.77.0.tgz", - "integrity": "sha512-NvsKz0KZxTp9cYWPLf+FXaSZwB3oO3peAjtukpOMBgse2vhQSoIIVqeO1yR0lEo/UcdZIDL18uq+kL0LzQ0ytA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-darwin-arm64": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.77.0.tgz", - "integrity": "sha512-bgjTn6nW4bQCFBvSvuHCpDD+sONvmpo4lGI4PxzMt1quBA+xYxhczk6RiCn3GZ9gY8uhaBbwhj9MdKGfu6T9DA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-darwin-x64": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.77.0.tgz", - "integrity": "sha512-aotaIttH1R6j1Rwhx0M0htgeZyGtVQqYNTVEYMN/UcgHPquGA6kmk9OyuDc3a2GKUQBC+3C3GVQCcrRPMYqAFA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-freebsd-x64": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.77.0.tgz", - "integrity": "sha512-nNx/wta7ksRAdYvq+l4AWjXkLxEXHALhENxjj2cYbQAIR4ybaA5L+hCbE63HOmft5czQ6ks+hb8vmEAnn7YGPg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm-gnueabihf": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.77.0.tgz", - "integrity": "sha512-tMLLjM7xXtzXisVCzkOTXNCy9bZVId2wteNwjohlFDR/jY6WagpEDA1c1wu4xRc20Hojaxj+V6DSR7gbKxijWA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm-musleabihf": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.77.0.tgz", - "integrity": "sha512-MiAFDFaqR0tmHTAyo0YDcZ5hyLREdYw/RQhc2R3cbT+8O3tB+zqPM2th9TTQ+Uo3jn/embS+DO+HyX9ztCPkOQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm64-gnu": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.77.0.tgz", - "integrity": "sha512-/xqQ3B16i1T4cyt/9Mn+4CpzhUXoBXp7kVpIwzOXNFLj5JmK1bIjsbSnX296Gg8A/o7oDtKWikFgBx0SLwztkw==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm64-musl": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.77.0.tgz", - "integrity": "sha512-LSbwuRKiNCenPDcbARqAZ5RfBy7gmj7vOvfJRLeCDU3gFtSxWbhv/+VTlaUqzUhNj1gFLHB8h7ALnxa/Az6z6g==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-ppc64-gnu": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.77.0.tgz", - "integrity": "sha512-QWdcH31mXEUe5Nq1s0CfCpceaKjIo9uZtwDjAuL681g1axf+5x8xrg/eXWaw//4NCxYZ4V4e5Hu5tvdR+pTBlg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-riscv64-gnu": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.77.0.tgz", - "integrity": "sha512-GnOfYgJxbcElOiPZaDFDl406ONddwvOWk2jvAAAEjwAl4GofNoHF+/HHUIBYa6bFCArlcGPi0XjC4cU1pkgF/Q==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-riscv64-musl": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.77.0.tgz", - "integrity": "sha512-AyEMTUCf0xY+hHF+IxqXFQIX0yQOIR8ykpY0lJNOw9xYqOzUX8dyZfRvlG0RfXwuQn2eonf/8NrMmDSZJjdqsA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-s390x-gnu": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.77.0.tgz", - "integrity": "sha512-sPLzEcNvxd/oyVQ5oZo92CiHkFkpBeRop13E/P3TPY+hZfXHKCOWKI70TE2RYwMKFJDc20EMjH16L7NZICtKTw==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-x64-gnu": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.77.0.tgz", - "integrity": "sha512-1Oh2ssH2L7lwyvkdSqaMUfsGfwU2Wfvew+obBUYjRVqhpBcUpwnsPSEr1IzVi9XqkuY10geiLsNKecqaZC34Dw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-x64-musl": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.77.0.tgz", - "integrity": "sha512-0j/2wRgNGO+Qj/M1uu/p57h/hFTTWWcfie0ufkbabeus2s5+/QqkCflnMOwLLN5m2GsNeWp4xdl4cPa4n7QCOQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-openharmony-arm64": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.77.0.tgz", - "integrity": "sha512-BJ/j54qS0usEnyDkLYURMj2iiD9h5Cyy+ppzeMSXBGRXaGRNWnj1Mw14NqWMR5E/PzdgB30OOCCzLzbRoduafw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-arm64-msvc": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.77.0.tgz", - "integrity": "sha512-Yh8w+g2Lpx7StrvtYkoz9JJvXjB9wxgFChFNb85nrXm/wj/XTwGWS1hve9+900HL7llrntYB3YP+y32E3tRqzA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-ia32-msvc": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.77.0.tgz", - "integrity": "sha512-zja5b7+6a7UsRFgAQSrnax5vrzliEyNPLCjfXONu/vTWswaIVZGFajJZptaeRvPE4LghtFdAzVFlexTm7MVTGA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-x64-msvc": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.77.0.tgz", - "integrity": "sha512-+teyvPDZ2RjUvo+SuCqS/UhaJl1QtdW5fWT5NJTV61V5MIuIS90Db9LixmtEGvXixyttiK62P96MSu3UlpviBw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.2.tgz", - "integrity": "sha512-l7x215OGvo1s52JWmR8U/DAVzEDWBCIbTm28aeJV/WDTSHgcKXaZTuBT0hJMs5NggilfJTW3clZVvd24yfKJxA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.2.tgz", - "integrity": "sha512-9u9Xv6c1AJZT0FfwH5vrMG5Jjcwhc1MlyrPu0XfTqkzsmqfks2M6W/o5XwAJgVVN/jHpqqngC1WevHKKTIUtIA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.2.tgz", - "integrity": "sha512-9W1mbGZAfW3oqd85bhBkmpyHCCzL1TeG/zFFP3vg7b0rlly8cxOcre5nXwz+LHazCwac2MNWgPdPCHndABjpWQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.2.tgz", - "integrity": "sha512-0p1lhiCSCyaerFwtrdZQUx7NqGk6LQnaRKWX7tFQqwQgvX0rjM15cIkm3pax1UpEakK14C4mOxx/jSqCBdBRqQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.2.tgz", - "integrity": "sha512-e+cOJXrJ2L3zx6YzqPg+f6Wbk3V1cKB8bOhbaYdVYN3DdquzNdRAmrbETz1qnt5yp/c7JNlNjmITiA2cVneQ7w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.2.tgz", - "integrity": "sha512-JsSMsj6sNat/MuhG5fnBD7QgbtpHKVe30x5/bAVirDHdhoQRXJkF6xc0Jqk8O4fiCUQAzMOoH9wZi3m60c8wtg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.2.tgz", - "integrity": "sha512-B5G/zJdHaoJn9vD50eGHWkiWfmq8Uhi3IiLPJTzmZTrAalk1bztUikSXo0qga18ibE0IXboyeMUnhPjhAJ45wQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.2.tgz", - "integrity": "sha512-6mC/awzKka8W6EoekjegpfGkjz8jXWDX63pqu/HYVpyKtZfu65Jsh4QAH3Kej3CAv/c1oGX7psTmFEbr0mDxLA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.2.tgz", - "integrity": "sha512-412MX9fJLdA1IK28EZnc8jYv2HRTleOZgfLQumJ5zy7OeJLZlg/CETwFaXjNmGVxG51cFHpKLqb5LKvBC+HsHA==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.2.tgz", - "integrity": "sha512-Q/+HI/ToJafZ1iCqGgVQXUEkIjufHCTF0gBQ2a5o3cg7GJ2h0qyq3nvvSmU+bGda2/7ygXpTY4TM6gO9OhQ0ZA==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.2.tgz", - "integrity": "sha512-ZKp/w41n6wCvxzxQHtQSbuphfX3Y4cCvbjkKHusrLx4lh+JWLTU7StSltO/DKARISzbj368d+qUaCjI8K2wzXw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.2.tgz", - "integrity": "sha512-pxE6xD4KS3eAROkKK5yrhB9/3+vhlhVGMvlQLbdpzrBGDbKrnzx3RLwPaHvasLo6jgaiBLn7e04Df9C4tYhjmA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.2.tgz", - "integrity": "sha512-4MqEue5re+xIZzAWsB8sj0P1kqZySWqIuN4t6QaIO/YA6SFwySOLruvWQFzfmqk8LBK2P30KCSJwf6mJCZZ5/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.2.tgz", - "integrity": "sha512-NweNxxD0Nf9t8v7kodun45Ijp3EIwYY+uydPP6qBEYvfBqhIjN6dZMzlQja3tqX/aLs3F3Uz+AxDpKgRhpOZQg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.2.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", - "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.5.tgz", - "integrity": "sha512-BOVzne/NL162sMdResB25mUv+vWMF5NoAjNf09TeGlE7ZpszZWSD3winycicLJw72yeVsoCn/2kOhEuCvEShMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rolldown/pluginutils": "^1.0.1" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", - "babel-plugin-react-compiler": "^1.0.0", - "vite": "^8.0.0" - }, - "peerDependenciesMeta": { - "@rolldown/plugin-babel": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true - } - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/lightningcss": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", - "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.33.0", - "lightningcss-darwin-arm64": "1.33.0", - "lightningcss-darwin-x64": "1.33.0", - "lightningcss-freebsd-x64": "1.33.0", - "lightningcss-linux-arm-gnueabihf": "1.33.0", - "lightningcss-linux-arm64-gnu": "1.33.0", - "lightningcss-linux-arm64-musl": "1.33.0", - "lightningcss-linux-x64-gnu": "1.33.0", - "lightningcss-linux-x64-musl": "1.33.0", - "lightningcss-win32-arm64-msvc": "1.33.0", - "lightningcss-win32-x64-msvc": "1.33.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", - "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", - "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", - "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", - "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", - "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", - "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", - "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", - "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", - "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", - "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", - "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/nanoid": { - "version": "3.3.17", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.17.tgz", - "integrity": "sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/oxlint": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.77.0.tgz", - "integrity": "sha512-qnGh8XJHaQ0dprrDXNQZgS0FgjI6v+V3+X8DwmaV++5Aamy6jGKfDdQ1TUvhUxtmKFAbEf4/WeO5QZX+5WSngg==", - "dev": true, - "license": "MIT", - "bin": { - "oxlint": "bin/oxlint" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/Boshen" - }, - "optionalDependencies": { - "@oxlint/binding-android-arm-eabi": "1.77.0", - "@oxlint/binding-android-arm64": "1.77.0", - "@oxlint/binding-darwin-arm64": "1.77.0", - "@oxlint/binding-darwin-x64": "1.77.0", - "@oxlint/binding-freebsd-x64": "1.77.0", - "@oxlint/binding-linux-arm-gnueabihf": "1.77.0", - "@oxlint/binding-linux-arm-musleabihf": "1.77.0", - "@oxlint/binding-linux-arm64-gnu": "1.77.0", - "@oxlint/binding-linux-arm64-musl": "1.77.0", - "@oxlint/binding-linux-ppc64-gnu": "1.77.0", - "@oxlint/binding-linux-riscv64-gnu": "1.77.0", - "@oxlint/binding-linux-riscv64-musl": "1.77.0", - "@oxlint/binding-linux-s390x-gnu": "1.77.0", - "@oxlint/binding-linux-x64-gnu": "1.77.0", - "@oxlint/binding-linux-x64-musl": "1.77.0", - "@oxlint/binding-openharmony-arm64": "1.77.0", - "@oxlint/binding-win32-arm64-msvc": "1.77.0", - "@oxlint/binding-win32-ia32-msvc": "1.77.0", - "@oxlint/binding-win32-x64-msvc": "1.77.0" - }, - "peerDependencies": { - "oxlint-tsgolint": ">=7.0.2001", - "vite-plus": "*" - }, - "peerDependenciesMeta": { - "oxlint-tsgolint": { - "optional": true - }, - "vite-plus": { - "optional": true - } - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.25", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.25.tgz", - "integrity": "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.16", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/react": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", - "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", - "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.8" - } - }, - "node_modules/rolldown": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.2.tgz", - "integrity": "sha512-opwpo1tQBAcpSUJDt94B7hhLNGOKjCdE//XXjeLrnx9b83bjnw45tXdg1b09yEw/VLFBJGZpwRULMmOZo7ol+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "=0.142.0", - "@rolldown/pluginutils": "^1.0.0" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.2.2", - "@rolldown/binding-darwin-arm64": "1.2.2", - "@rolldown/binding-darwin-x64": "1.2.2", - "@rolldown/binding-freebsd-x64": "1.2.2", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.2", - "@rolldown/binding-linux-arm64-gnu": "1.2.2", - "@rolldown/binding-linux-arm64-musl": "1.2.2", - "@rolldown/binding-linux-ppc64-gnu": "1.2.2", - "@rolldown/binding-linux-s390x-gnu": "1.2.2", - "@rolldown/binding-linux-x64-gnu": "1.2.2", - "@rolldown/binding-linux-x64-musl": "1.2.2", - "@rolldown/binding-openharmony-arm64": "1.2.2", - "@rolldown/binding-win32-arm64-msvc": "1.2.2", - "@rolldown/binding-win32-x64-msvc": "1.2.2" - } - }, - "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/vite": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.0.tgz", - "integrity": "sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "lightningcss": "^1.33.0", - "picomatch": "^4.0.5", - "postcss": "^8.5.23", - "rolldown": "~1.2.0", - "tinyglobby": "^0.2.17" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.4.0", - "esbuild": "^0.27.0 || ^0.28.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - } - } -} diff --git a/05_react/unterricht/tag38/02_vite-app/package.json b/05_react/unterricht/tag38/02_vite-app/package.json deleted file mode 100644 index a7081d3..0000000 --- a/05_react/unterricht/tag38/02_vite-app/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "02_vite-app", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "lint": "oxlint", - "preview": "vite preview" - }, - "dependencies": { - "react": "^19.2.8", - "react-dom": "^19.2.8" - }, - "devDependencies": { - "@types/react": "^19.2.17", - "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "^6.0.4", - "oxlint": "^1.75.0", - "vite": "^8.2.0" - } -} diff --git a/05_react/unterricht/tag38/02_vite-app/public/favicon.svg b/05_react/unterricht/tag38/02_vite-app/public/favicon.svg deleted file mode 100644 index 6893eb1..0000000 --- a/05_react/unterricht/tag38/02_vite-app/public/favicon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/05_react/unterricht/tag38/02_vite-app/public/icons.svg b/05_react/unterricht/tag38/02_vite-app/public/icons.svg deleted file mode 100644 index e952219..0000000 --- a/05_react/unterricht/tag38/02_vite-app/public/icons.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/05_react/unterricht/tag38/02_vite-app/src/App.css b/05_react/unterricht/tag38/02_vite-app/src/App.css deleted file mode 100644 index f90339d..0000000 --- a/05_react/unterricht/tag38/02_vite-app/src/App.css +++ /dev/null @@ -1,184 +0,0 @@ -.counter { - font-size: 16px; - padding: 5px 10px; - border-radius: 5px; - color: var(--accent); - background: var(--accent-bg); - border: 2px solid transparent; - transition: border-color 0.3s; - margin-bottom: 24px; - - &:hover { - border-color: var(--accent-border); - } - &:focus-visible { - outline: 2px solid var(--accent); - outline-offset: 2px; - } -} - -.hero { - position: relative; - - .base, - .framework, - .vite { - inset-inline: 0; - margin: 0 auto; - } - - .base { - width: 170px; - position: relative; - z-index: 0; - } - - .framework, - .vite { - position: absolute; - } - - .framework { - z-index: 1; - top: 34px; - height: 28px; - transform: perspective(2000px) rotateZ(300deg) rotateX(44deg) rotateY(39deg) - scale(1.4); - } - - .vite { - z-index: 0; - top: 107px; - height: 26px; - width: auto; - transform: perspective(2000px) rotateZ(300deg) rotateX(40deg) rotateY(39deg) - scale(0.8); - } -} - -#center { - display: flex; - flex-direction: column; - gap: 25px; - place-content: center; - place-items: center; - flex-grow: 1; - - @media (max-width: 1024px) { - padding: 32px 20px 24px; - gap: 18px; - } -} - -#next-steps { - display: flex; - border-top: 1px solid var(--border); - text-align: left; - - & > div { - flex: 1 1 0; - padding: 32px; - @media (max-width: 1024px) { - padding: 24px 20px; - } - } - - .icon { - margin-bottom: 16px; - width: 22px; - height: 22px; - } - - @media (max-width: 1024px) { - flex-direction: column; - text-align: center; - } -} - -#docs { - border-right: 1px solid var(--border); - - @media (max-width: 1024px) { - border-right: none; - border-bottom: 1px solid var(--border); - } -} - -#next-steps ul { - list-style: none; - padding: 0; - display: flex; - gap: 8px; - margin: 32px 0 0; - - .logo { - height: 18px; - } - - a { - color: var(--text-h); - font-size: 16px; - border-radius: 6px; - background: var(--social-bg); - display: flex; - padding: 6px 12px; - align-items: center; - gap: 8px; - text-decoration: none; - transition: box-shadow 0.3s; - - &:hover { - box-shadow: var(--shadow); - } - .button-icon { - height: 18px; - width: 18px; - } - } - - @media (max-width: 1024px) { - margin-top: 20px; - flex-wrap: wrap; - justify-content: center; - - li { - flex: 1 1 calc(50% - 8px); - } - - a { - width: 100%; - justify-content: center; - box-sizing: border-box; - } - } -} - -#spacer { - height: 88px; - border-top: 1px solid var(--border); - @media (max-width: 1024px) { - height: 48px; - } -} - -.ticks { - position: relative; - width: 100%; - - &::before, - &::after { - content: ''; - position: absolute; - top: -4.5px; - border: 5px solid transparent; - } - - &::before { - left: 0; - border-left-color: var(--border); - } - &::after { - right: 0; - border-right-color: var(--border); - } -} diff --git a/05_react/unterricht/tag38/02_vite-app/src/App.jsx b/05_react/unterricht/tag38/02_vite-app/src/App.jsx deleted file mode 100644 index d2542ca..0000000 --- a/05_react/unterricht/tag38/02_vite-app/src/App.jsx +++ /dev/null @@ -1,102 +0,0 @@ -import { useState } from 'react'; -import reactLogo from './assets/react.svg'; -import viteLogo from './assets/vite.svg'; -import heroImg from './assets/hero.png'; -import './App.css'; - -function App() { - const [count, setCount] = useState(0); - - return ( - <> -
      -
      - - React logo - Vite logo -
      -
      -

      Get started

      -

      - Edit src/App.jsx and save to test HMR -

      -
      - -
      - -
      - -
      -
      - -

      Documentation

      -

      Your questions, answered

      - -
      -
      - -

      Connect with us

      -

      Join the Vite community

      - -
      -
      - -
      -
      - - ); -} - -export default App; diff --git a/05_react/unterricht/tag38/02_vite-app/src/assets/hero.png b/05_react/unterricht/tag38/02_vite-app/src/assets/hero.png deleted file mode 100644 index 02251f4..0000000 Binary files a/05_react/unterricht/tag38/02_vite-app/src/assets/hero.png and /dev/null differ diff --git a/05_react/unterricht/tag38/02_vite-app/src/assets/react.svg b/05_react/unterricht/tag38/02_vite-app/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/05_react/unterricht/tag38/02_vite-app/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/05_react/unterricht/tag38/02_vite-app/src/assets/vite.svg b/05_react/unterricht/tag38/02_vite-app/src/assets/vite.svg deleted file mode 100644 index 5101b67..0000000 --- a/05_react/unterricht/tag38/02_vite-app/src/assets/vite.svg +++ /dev/null @@ -1 +0,0 @@ -Vite diff --git a/05_react/unterricht/tag38/02_vite-app/src/index.css b/05_react/unterricht/tag38/02_vite-app/src/index.css deleted file mode 100644 index 2c84af0..0000000 --- a/05_react/unterricht/tag38/02_vite-app/src/index.css +++ /dev/null @@ -1,111 +0,0 @@ -:root { - --text: #6b6375; - --text-h: #08060d; - --bg: #fff; - --border: #e5e4e7; - --code-bg: #f4f3ec; - --accent: #aa3bff; - --accent-bg: rgba(170, 59, 255, 0.1); - --accent-border: rgba(170, 59, 255, 0.5); - --social-bg: rgba(244, 243, 236, 0.5); - --shadow: - rgba(0, 0, 0, 0.1) 0 10px 15px -3px, rgba(0, 0, 0, 0.05) 0 4px 6px -2px; - - --sans: system-ui, 'Segoe UI', Roboto, sans-serif; - --heading: system-ui, 'Segoe UI', Roboto, sans-serif; - --mono: ui-monospace, Consolas, monospace; - - font: 18px/145% var(--sans); - letter-spacing: 0.18px; - color-scheme: light dark; - color: var(--text); - background: var(--bg); - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - - @media (max-width: 1024px) { - font-size: 16px; - } -} - -@media (prefers-color-scheme: dark) { - :root { - --text: #9ca3af; - --text-h: #f3f4f6; - --bg: #16171d; - --border: #2e303a; - --code-bg: #1f2028; - --accent: #c084fc; - --accent-bg: rgba(192, 132, 252, 0.15); - --accent-border: rgba(192, 132, 252, 0.5); - --social-bg: rgba(47, 48, 58, 0.5); - --shadow: - rgba(0, 0, 0, 0.4) 0 10px 15px -3px, rgba(0, 0, 0, 0.25) 0 4px 6px -2px; - } - - #social .button-icon { - filter: invert(1) brightness(2); - } -} - -body { - margin: 0; -} - -#root { - width: 1126px; - max-width: 100%; - margin: 0 auto; - text-align: center; - border-inline: 1px solid var(--border); - min-height: 100svh; - display: flex; - flex-direction: column; - box-sizing: border-box; -} - -h1, -h2 { - font-family: var(--heading); - font-weight: 500; - color: var(--text-h); -} - -h1 { - font-size: 56px; - letter-spacing: -1.68px; - margin: 32px 0; - @media (max-width: 1024px) { - font-size: 36px; - margin: 20px 0; - } -} -h2 { - font-size: 24px; - line-height: 118%; - letter-spacing: -0.24px; - margin: 0 0 8px; - @media (max-width: 1024px) { - font-size: 20px; - } -} -p { - margin: 0; -} - -code, -.counter { - font-family: var(--mono); - display: inline-flex; - border-radius: 4px; - color: var(--text-h); -} - -code { - font-size: 15px; - line-height: 135%; - padding: 4px 8px; - background: var(--code-bg); -} diff --git a/05_react/unterricht/tag38/02_vite-app/src/main.jsx b/05_react/unterricht/tag38/02_vite-app/src/main.jsx deleted file mode 100644 index c358781..0000000 --- a/05_react/unterricht/tag38/02_vite-app/src/main.jsx +++ /dev/null @@ -1,10 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; -import './index.css'; -import App from './App.jsx'; - -createRoot(document.getElementById('root')).render( - - - , -); diff --git a/05_react/unterricht/tag38/02_vite-app/vite.config.js b/05_react/unterricht/tag38/02_vite-app/vite.config.js deleted file mode 100644 index 8b0f57b..0000000 --- a/05_react/unterricht/tag38/02_vite-app/vite.config.js +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' - -// https://vite.dev/config/ -export default defineConfig({ - plugins: [react()], -}) diff --git a/05_react/unterricht/tag38/03_product-list/.gitignore b/05_react/unterricht/tag38/03_product-list/.gitignore deleted file mode 100644 index a547bf3..0000000 --- a/05_react/unterricht/tag38/03_product-list/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/05_react/unterricht/tag38/03_product-list/.oxlintrc.json b/05_react/unterricht/tag38/03_product-list/.oxlintrc.json deleted file mode 100644 index 1255078..0000000 --- a/05_react/unterricht/tag38/03_product-list/.oxlintrc.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$schema": "./node_modules/oxlint/configuration_schema.json", - "plugins": ["react", "oxc"], - "rules": { - "react/rules-of-hooks": "error", - "react/only-export-components": ["warn", { "allowConstantExport": true }] - } -} diff --git a/05_react/unterricht/tag38/03_product-list/README.md b/05_react/unterricht/tag38/03_product-list/README.md deleted file mode 100644 index d937833..0000000 --- a/05_react/unterricht/tag38/03_product-list/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# React + Vite - -This template provides a minimal setup to get React working in Vite with HMR and some Oxlint rules. - -Currently, two official plugins are available: - -- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs) -- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) - -## React Compiler - -The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). - -## Expanding the Oxlint configuration - -If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and Oxlint's TypeScript related rules in your project. diff --git a/05_react/unterricht/tag38/03_product-list/index.html b/05_react/unterricht/tag38/03_product-list/index.html deleted file mode 100644 index 40cef6a..0000000 --- a/05_react/unterricht/tag38/03_product-list/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - 03_product-list - - -
      - - - diff --git a/05_react/unterricht/tag38/03_product-list/package-lock.json b/05_react/unterricht/tag38/03_product-list/package-lock.json deleted file mode 100644 index 302ad81..0000000 --- a/05_react/unterricht/tag38/03_product-list/package-lock.json +++ /dev/null @@ -1,1325 +0,0 @@ -{ - "name": "03_product-list", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "03_product-list", - "version": "0.0.0", - "dependencies": { - "bootstrap": "^5.3.8", - "react": "^19.2.8", - "react-dom": "^19.2.8" - }, - "devDependencies": { - "@types/react": "^19.2.17", - "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "^6.0.4", - "oxlint": "^1.75.0", - "vite": "^8.2.0" - } - }, - "node_modules/@oxc-project/types": { - "version": "0.142.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.142.0.tgz", - "integrity": "sha512-7W+2q5AKQVU36fkaryontrHn3YDt1RyUYXatw9i5H8ocYe2sPKSFB6eS8WNPeRKiN1qAWWZUPm7gwFzJGrccqQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@oxlint/binding-android-arm-eabi": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.77.0.tgz", - "integrity": "sha512-E06sKWS6PiI6HRxS1wyQg22HvApt01hI7fV+T3wUk3OSbaaP4a3hYGY/MIQDmASqCiRjBdpRQYkgMkqH82cWmQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-android-arm64": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.77.0.tgz", - "integrity": "sha512-NvsKz0KZxTp9cYWPLf+FXaSZwB3oO3peAjtukpOMBgse2vhQSoIIVqeO1yR0lEo/UcdZIDL18uq+kL0LzQ0ytA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-darwin-arm64": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.77.0.tgz", - "integrity": "sha512-bgjTn6nW4bQCFBvSvuHCpDD+sONvmpo4lGI4PxzMt1quBA+xYxhczk6RiCn3GZ9gY8uhaBbwhj9MdKGfu6T9DA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-darwin-x64": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.77.0.tgz", - "integrity": "sha512-aotaIttH1R6j1Rwhx0M0htgeZyGtVQqYNTVEYMN/UcgHPquGA6kmk9OyuDc3a2GKUQBC+3C3GVQCcrRPMYqAFA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-freebsd-x64": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.77.0.tgz", - "integrity": "sha512-nNx/wta7ksRAdYvq+l4AWjXkLxEXHALhENxjj2cYbQAIR4ybaA5L+hCbE63HOmft5czQ6ks+hb8vmEAnn7YGPg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm-gnueabihf": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.77.0.tgz", - "integrity": "sha512-tMLLjM7xXtzXisVCzkOTXNCy9bZVId2wteNwjohlFDR/jY6WagpEDA1c1wu4xRc20Hojaxj+V6DSR7gbKxijWA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm-musleabihf": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.77.0.tgz", - "integrity": "sha512-MiAFDFaqR0tmHTAyo0YDcZ5hyLREdYw/RQhc2R3cbT+8O3tB+zqPM2th9TTQ+Uo3jn/embS+DO+HyX9ztCPkOQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm64-gnu": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.77.0.tgz", - "integrity": "sha512-/xqQ3B16i1T4cyt/9Mn+4CpzhUXoBXp7kVpIwzOXNFLj5JmK1bIjsbSnX296Gg8A/o7oDtKWikFgBx0SLwztkw==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm64-musl": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.77.0.tgz", - "integrity": "sha512-LSbwuRKiNCenPDcbARqAZ5RfBy7gmj7vOvfJRLeCDU3gFtSxWbhv/+VTlaUqzUhNj1gFLHB8h7ALnxa/Az6z6g==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-ppc64-gnu": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.77.0.tgz", - "integrity": "sha512-QWdcH31mXEUe5Nq1s0CfCpceaKjIo9uZtwDjAuL681g1axf+5x8xrg/eXWaw//4NCxYZ4V4e5Hu5tvdR+pTBlg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-riscv64-gnu": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.77.0.tgz", - "integrity": "sha512-GnOfYgJxbcElOiPZaDFDl406ONddwvOWk2jvAAAEjwAl4GofNoHF+/HHUIBYa6bFCArlcGPi0XjC4cU1pkgF/Q==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-riscv64-musl": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.77.0.tgz", - "integrity": "sha512-AyEMTUCf0xY+hHF+IxqXFQIX0yQOIR8ykpY0lJNOw9xYqOzUX8dyZfRvlG0RfXwuQn2eonf/8NrMmDSZJjdqsA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-s390x-gnu": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.77.0.tgz", - "integrity": "sha512-sPLzEcNvxd/oyVQ5oZo92CiHkFkpBeRop13E/P3TPY+hZfXHKCOWKI70TE2RYwMKFJDc20EMjH16L7NZICtKTw==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-x64-gnu": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.77.0.tgz", - "integrity": "sha512-1Oh2ssH2L7lwyvkdSqaMUfsGfwU2Wfvew+obBUYjRVqhpBcUpwnsPSEr1IzVi9XqkuY10geiLsNKecqaZC34Dw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-x64-musl": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.77.0.tgz", - "integrity": "sha512-0j/2wRgNGO+Qj/M1uu/p57h/hFTTWWcfie0ufkbabeus2s5+/QqkCflnMOwLLN5m2GsNeWp4xdl4cPa4n7QCOQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-openharmony-arm64": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.77.0.tgz", - "integrity": "sha512-BJ/j54qS0usEnyDkLYURMj2iiD9h5Cyy+ppzeMSXBGRXaGRNWnj1Mw14NqWMR5E/PzdgB30OOCCzLzbRoduafw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-arm64-msvc": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.77.0.tgz", - "integrity": "sha512-Yh8w+g2Lpx7StrvtYkoz9JJvXjB9wxgFChFNb85nrXm/wj/XTwGWS1hve9+900HL7llrntYB3YP+y32E3tRqzA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-ia32-msvc": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.77.0.tgz", - "integrity": "sha512-zja5b7+6a7UsRFgAQSrnax5vrzliEyNPLCjfXONu/vTWswaIVZGFajJZptaeRvPE4LghtFdAzVFlexTm7MVTGA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-x64-msvc": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.77.0.tgz", - "integrity": "sha512-+teyvPDZ2RjUvo+SuCqS/UhaJl1QtdW5fWT5NJTV61V5MIuIS90Db9LixmtEGvXixyttiK62P96MSu3UlpviBw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "license": "MIT", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.2.tgz", - "integrity": "sha512-l7x215OGvo1s52JWmR8U/DAVzEDWBCIbTm28aeJV/WDTSHgcKXaZTuBT0hJMs5NggilfJTW3clZVvd24yfKJxA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.2.tgz", - "integrity": "sha512-9u9Xv6c1AJZT0FfwH5vrMG5Jjcwhc1MlyrPu0XfTqkzsmqfks2M6W/o5XwAJgVVN/jHpqqngC1WevHKKTIUtIA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.2.tgz", - "integrity": "sha512-9W1mbGZAfW3oqd85bhBkmpyHCCzL1TeG/zFFP3vg7b0rlly8cxOcre5nXwz+LHazCwac2MNWgPdPCHndABjpWQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.2.tgz", - "integrity": "sha512-0p1lhiCSCyaerFwtrdZQUx7NqGk6LQnaRKWX7tFQqwQgvX0rjM15cIkm3pax1UpEakK14C4mOxx/jSqCBdBRqQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.2.tgz", - "integrity": "sha512-e+cOJXrJ2L3zx6YzqPg+f6Wbk3V1cKB8bOhbaYdVYN3DdquzNdRAmrbETz1qnt5yp/c7JNlNjmITiA2cVneQ7w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.2.tgz", - "integrity": "sha512-JsSMsj6sNat/MuhG5fnBD7QgbtpHKVe30x5/bAVirDHdhoQRXJkF6xc0Jqk8O4fiCUQAzMOoH9wZi3m60c8wtg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.2.tgz", - "integrity": "sha512-B5G/zJdHaoJn9vD50eGHWkiWfmq8Uhi3IiLPJTzmZTrAalk1bztUikSXo0qga18ibE0IXboyeMUnhPjhAJ45wQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.2.tgz", - "integrity": "sha512-6mC/awzKka8W6EoekjegpfGkjz8jXWDX63pqu/HYVpyKtZfu65Jsh4QAH3Kej3CAv/c1oGX7psTmFEbr0mDxLA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.2.tgz", - "integrity": "sha512-412MX9fJLdA1IK28EZnc8jYv2HRTleOZgfLQumJ5zy7OeJLZlg/CETwFaXjNmGVxG51cFHpKLqb5LKvBC+HsHA==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.2.tgz", - "integrity": "sha512-Q/+HI/ToJafZ1iCqGgVQXUEkIjufHCTF0gBQ2a5o3cg7GJ2h0qyq3nvvSmU+bGda2/7ygXpTY4TM6gO9OhQ0ZA==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.2.tgz", - "integrity": "sha512-ZKp/w41n6wCvxzxQHtQSbuphfX3Y4cCvbjkKHusrLx4lh+JWLTU7StSltO/DKARISzbj368d+qUaCjI8K2wzXw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.2.tgz", - "integrity": "sha512-pxE6xD4KS3eAROkKK5yrhB9/3+vhlhVGMvlQLbdpzrBGDbKrnzx3RLwPaHvasLo6jgaiBLn7e04Df9C4tYhjmA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.2.tgz", - "integrity": "sha512-4MqEue5re+xIZzAWsB8sj0P1kqZySWqIuN4t6QaIO/YA6SFwySOLruvWQFzfmqk8LBK2P30KCSJwf6mJCZZ5/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.2.tgz", - "integrity": "sha512-NweNxxD0Nf9t8v7kodun45Ijp3EIwYY+uydPP6qBEYvfBqhIjN6dZMzlQja3tqX/aLs3F3Uz+AxDpKgRhpOZQg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.2.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", - "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.5.tgz", - "integrity": "sha512-BOVzne/NL162sMdResB25mUv+vWMF5NoAjNf09TeGlE7ZpszZWSD3winycicLJw72yeVsoCn/2kOhEuCvEShMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rolldown/pluginutils": "^1.0.1" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", - "babel-plugin-react-compiler": "^1.0.0", - "vite": "^8.0.0" - }, - "peerDependenciesMeta": { - "@rolldown/plugin-babel": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true - } - } - }, - "node_modules/bootstrap": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz", - "integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/twbs" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - } - ], - "license": "MIT", - "peerDependencies": { - "@popperjs/core": "^2.11.8" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/lightningcss": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", - "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.33.0", - "lightningcss-darwin-arm64": "1.33.0", - "lightningcss-darwin-x64": "1.33.0", - "lightningcss-freebsd-x64": "1.33.0", - "lightningcss-linux-arm-gnueabihf": "1.33.0", - "lightningcss-linux-arm64-gnu": "1.33.0", - "lightningcss-linux-arm64-musl": "1.33.0", - "lightningcss-linux-x64-gnu": "1.33.0", - "lightningcss-linux-x64-musl": "1.33.0", - "lightningcss-win32-arm64-msvc": "1.33.0", - "lightningcss-win32-x64-msvc": "1.33.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", - "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", - "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", - "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", - "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", - "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", - "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", - "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", - "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", - "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", - "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", - "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/nanoid": { - "version": "3.3.17", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.17.tgz", - "integrity": "sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/oxlint": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.77.0.tgz", - "integrity": "sha512-qnGh8XJHaQ0dprrDXNQZgS0FgjI6v+V3+X8DwmaV++5Aamy6jGKfDdQ1TUvhUxtmKFAbEf4/WeO5QZX+5WSngg==", - "dev": true, - "license": "MIT", - "bin": { - "oxlint": "bin/oxlint" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/Boshen" - }, - "optionalDependencies": { - "@oxlint/binding-android-arm-eabi": "1.77.0", - "@oxlint/binding-android-arm64": "1.77.0", - "@oxlint/binding-darwin-arm64": "1.77.0", - "@oxlint/binding-darwin-x64": "1.77.0", - "@oxlint/binding-freebsd-x64": "1.77.0", - "@oxlint/binding-linux-arm-gnueabihf": "1.77.0", - "@oxlint/binding-linux-arm-musleabihf": "1.77.0", - "@oxlint/binding-linux-arm64-gnu": "1.77.0", - "@oxlint/binding-linux-arm64-musl": "1.77.0", - "@oxlint/binding-linux-ppc64-gnu": "1.77.0", - "@oxlint/binding-linux-riscv64-gnu": "1.77.0", - "@oxlint/binding-linux-riscv64-musl": "1.77.0", - "@oxlint/binding-linux-s390x-gnu": "1.77.0", - "@oxlint/binding-linux-x64-gnu": "1.77.0", - "@oxlint/binding-linux-x64-musl": "1.77.0", - "@oxlint/binding-openharmony-arm64": "1.77.0", - "@oxlint/binding-win32-arm64-msvc": "1.77.0", - "@oxlint/binding-win32-ia32-msvc": "1.77.0", - "@oxlint/binding-win32-x64-msvc": "1.77.0" - }, - "peerDependencies": { - "oxlint-tsgolint": ">=7.0.2001", - "vite-plus": "*" - }, - "peerDependenciesMeta": { - "oxlint-tsgolint": { - "optional": true - }, - "vite-plus": { - "optional": true - } - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.25", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.25.tgz", - "integrity": "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.16", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/react": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", - "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", - "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.8" - } - }, - "node_modules/rolldown": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.2.tgz", - "integrity": "sha512-opwpo1tQBAcpSUJDt94B7hhLNGOKjCdE//XXjeLrnx9b83bjnw45tXdg1b09yEw/VLFBJGZpwRULMmOZo7ol+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "=0.142.0", - "@rolldown/pluginutils": "^1.0.0" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.2.2", - "@rolldown/binding-darwin-arm64": "1.2.2", - "@rolldown/binding-darwin-x64": "1.2.2", - "@rolldown/binding-freebsd-x64": "1.2.2", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.2", - "@rolldown/binding-linux-arm64-gnu": "1.2.2", - "@rolldown/binding-linux-arm64-musl": "1.2.2", - "@rolldown/binding-linux-ppc64-gnu": "1.2.2", - "@rolldown/binding-linux-s390x-gnu": "1.2.2", - "@rolldown/binding-linux-x64-gnu": "1.2.2", - "@rolldown/binding-linux-x64-musl": "1.2.2", - "@rolldown/binding-openharmony-arm64": "1.2.2", - "@rolldown/binding-win32-arm64-msvc": "1.2.2", - "@rolldown/binding-win32-x64-msvc": "1.2.2" - } - }, - "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/vite": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.0.tgz", - "integrity": "sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "lightningcss": "^1.33.0", - "picomatch": "^4.0.5", - "postcss": "^8.5.23", - "rolldown": "~1.2.0", - "tinyglobby": "^0.2.17" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.4.0", - "esbuild": "^0.27.0 || ^0.28.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - } - } -} diff --git a/05_react/unterricht/tag38/03_product-list/package.json b/05_react/unterricht/tag38/03_product-list/package.json deleted file mode 100644 index 445a1d6..0000000 --- a/05_react/unterricht/tag38/03_product-list/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "03_product-list", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "lint": "oxlint", - "preview": "vite preview" - }, - "dependencies": { - "bootstrap": "^5.3.8", - "react": "^19.2.8", - "react-dom": "^19.2.8" - }, - "devDependencies": { - "@types/react": "^19.2.17", - "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "^6.0.4", - "oxlint": "^1.75.0", - "vite": "^8.2.0" - } -} diff --git a/05_react/unterricht/tag38/03_product-list/public/favicon.svg b/05_react/unterricht/tag38/03_product-list/public/favicon.svg deleted file mode 100644 index 6893eb1..0000000 --- a/05_react/unterricht/tag38/03_product-list/public/favicon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/05_react/unterricht/tag38/03_product-list/public/icons.svg b/05_react/unterricht/tag38/03_product-list/public/icons.svg deleted file mode 100644 index e952219..0000000 --- a/05_react/unterricht/tag38/03_product-list/public/icons.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/05_react/unterricht/tag38/03_product-list/src/App.jsx b/05_react/unterricht/tag38/03_product-list/src/App.jsx deleted file mode 100644 index 639653c..0000000 --- a/05_react/unterricht/tag38/03_product-list/src/App.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import ProductList from './components/ProductList'; - -function App() { - return ( -
      -

      Product list

      -
      - -
      - ); -} - -export default App; diff --git a/05_react/unterricht/tag38/03_product-list/src/assets/react.svg b/05_react/unterricht/tag38/03_product-list/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/05_react/unterricht/tag38/03_product-list/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/05_react/unterricht/tag38/03_product-list/src/assets/vite.svg b/05_react/unterricht/tag38/03_product-list/src/assets/vite.svg deleted file mode 100644 index 5101b67..0000000 --- a/05_react/unterricht/tag38/03_product-list/src/assets/vite.svg +++ /dev/null @@ -1 +0,0 @@ -Vite diff --git a/05_react/unterricht/tag38/03_product-list/src/components/ProductList.jsx b/05_react/unterricht/tag38/03_product-list/src/components/ProductList.jsx deleted file mode 100644 index af44786..0000000 --- a/05_react/unterricht/tag38/03_product-list/src/components/ProductList.jsx +++ /dev/null @@ -1,26 +0,0 @@ -import ProductListItem from './ProductListItem'; - -const ProductList = (props) => { - // const { } = props; - - return ( -
        - {/* li.list-group-item*2>h2{Product $}+p{lorem} */} - - -

        - Lorem ipsum, dolor sit amet consectetur adipisicing elit. Nemo quas eius quasi consequatur, tempora autem rem - nulla, deleniti recusandae alias, perferendis laudantium officia placeat doloribus? Iste voluptate - reprehenderit repellendus id. -

        -
        - -

        - Lorem ipsum dolor sit, amet consectetur adipisicing elit. Voluptate voluptates pariatur labore ea consectetur - distinctio tempore reiciendis cumque quisquam iure? -

        -
        -
      - ); -}; -export default ProductList; diff --git a/05_react/unterricht/tag38/03_product-list/src/components/ProductListItem.jsx b/05_react/unterricht/tag38/03_product-list/src/components/ProductListItem.jsx deleted file mode 100644 index 728751a..0000000 --- a/05_react/unterricht/tag38/03_product-list/src/components/ProductListItem.jsx +++ /dev/null @@ -1,11 +0,0 @@ -const ProductListItem = (props) => { - const { title, children, description = '' } = props; - - return ( -
    • -

      {title}

      - {children ||

      {description}

      } -
    • - ); // View -}; -export default ProductListItem; diff --git a/05_react/unterricht/tag38/03_product-list/src/main.jsx b/05_react/unterricht/tag38/03_product-list/src/main.jsx deleted file mode 100644 index 96bbaea..0000000 --- a/05_react/unterricht/tag38/03_product-list/src/main.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; - -// CSS Einbindung (funktioniert wegen Bundler) -import 'bootstrap/dist/css/bootstrap.min.css'; - -import App from './App.jsx'; - -createRoot(document.getElementById('root')).render( - - - , -); diff --git a/05_react/unterricht/tag38/03_product-list/vite.config.js b/05_react/unterricht/tag38/03_product-list/vite.config.js deleted file mode 100644 index 8b0f57b..0000000 --- a/05_react/unterricht/tag38/03_product-list/vite.config.js +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' - -// https://vite.dev/config/ -export default defineConfig({ - plugins: [react()], -}) diff --git a/05_react/unterricht/tag38/04_product-list-ar/.gitignore b/05_react/unterricht/tag38/04_product-list-ar/.gitignore deleted file mode 100644 index a547bf3..0000000 --- a/05_react/unterricht/tag38/04_product-list-ar/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/05_react/unterricht/tag38/04_product-list-ar/.oxlintrc.json b/05_react/unterricht/tag38/04_product-list-ar/.oxlintrc.json deleted file mode 100644 index 1255078..0000000 --- a/05_react/unterricht/tag38/04_product-list-ar/.oxlintrc.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$schema": "./node_modules/oxlint/configuration_schema.json", - "plugins": ["react", "oxc"], - "rules": { - "react/rules-of-hooks": "error", - "react/only-export-components": ["warn", { "allowConstantExport": true }] - } -} diff --git a/05_react/unterricht/tag38/04_product-list-ar/README.md b/05_react/unterricht/tag38/04_product-list-ar/README.md deleted file mode 100644 index d937833..0000000 --- a/05_react/unterricht/tag38/04_product-list-ar/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# React + Vite - -This template provides a minimal setup to get React working in Vite with HMR and some Oxlint rules. - -Currently, two official plugins are available: - -- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs) -- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) - -## React Compiler - -The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). - -## Expanding the Oxlint configuration - -If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and Oxlint's TypeScript related rules in your project. diff --git a/05_react/unterricht/tag38/04_product-list-ar/index.html b/05_react/unterricht/tag38/04_product-list-ar/index.html deleted file mode 100644 index 785d35e..0000000 --- a/05_react/unterricht/tag38/04_product-list-ar/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - 04_product-list-ar - - -
      - - - diff --git a/05_react/unterricht/tag38/04_product-list-ar/package-lock.json b/05_react/unterricht/tag38/04_product-list-ar/package-lock.json deleted file mode 100644 index 967bf6c..0000000 --- a/05_react/unterricht/tag38/04_product-list-ar/package-lock.json +++ /dev/null @@ -1,1325 +0,0 @@ -{ - "name": "04_product-list-ar", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "04_product-list-ar", - "version": "0.0.0", - "dependencies": { - "bootstrap": "^5.3.8", - "react": "^19.2.8", - "react-dom": "^19.2.8" - }, - "devDependencies": { - "@types/react": "^19.2.17", - "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "^6.0.4", - "oxlint": "^1.75.0", - "vite": "^8.2.0" - } - }, - "node_modules/@oxc-project/types": { - "version": "0.143.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.143.0.tgz", - "integrity": "sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@oxlint/binding-android-arm-eabi": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.77.0.tgz", - "integrity": "sha512-E06sKWS6PiI6HRxS1wyQg22HvApt01hI7fV+T3wUk3OSbaaP4a3hYGY/MIQDmASqCiRjBdpRQYkgMkqH82cWmQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-android-arm64": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.77.0.tgz", - "integrity": "sha512-NvsKz0KZxTp9cYWPLf+FXaSZwB3oO3peAjtukpOMBgse2vhQSoIIVqeO1yR0lEo/UcdZIDL18uq+kL0LzQ0ytA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-darwin-arm64": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.77.0.tgz", - "integrity": "sha512-bgjTn6nW4bQCFBvSvuHCpDD+sONvmpo4lGI4PxzMt1quBA+xYxhczk6RiCn3GZ9gY8uhaBbwhj9MdKGfu6T9DA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-darwin-x64": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.77.0.tgz", - "integrity": "sha512-aotaIttH1R6j1Rwhx0M0htgeZyGtVQqYNTVEYMN/UcgHPquGA6kmk9OyuDc3a2GKUQBC+3C3GVQCcrRPMYqAFA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-freebsd-x64": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.77.0.tgz", - "integrity": "sha512-nNx/wta7ksRAdYvq+l4AWjXkLxEXHALhENxjj2cYbQAIR4ybaA5L+hCbE63HOmft5czQ6ks+hb8vmEAnn7YGPg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm-gnueabihf": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.77.0.tgz", - "integrity": "sha512-tMLLjM7xXtzXisVCzkOTXNCy9bZVId2wteNwjohlFDR/jY6WagpEDA1c1wu4xRc20Hojaxj+V6DSR7gbKxijWA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm-musleabihf": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.77.0.tgz", - "integrity": "sha512-MiAFDFaqR0tmHTAyo0YDcZ5hyLREdYw/RQhc2R3cbT+8O3tB+zqPM2th9TTQ+Uo3jn/embS+DO+HyX9ztCPkOQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm64-gnu": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.77.0.tgz", - "integrity": "sha512-/xqQ3B16i1T4cyt/9Mn+4CpzhUXoBXp7kVpIwzOXNFLj5JmK1bIjsbSnX296Gg8A/o7oDtKWikFgBx0SLwztkw==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm64-musl": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.77.0.tgz", - "integrity": "sha512-LSbwuRKiNCenPDcbARqAZ5RfBy7gmj7vOvfJRLeCDU3gFtSxWbhv/+VTlaUqzUhNj1gFLHB8h7ALnxa/Az6z6g==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-ppc64-gnu": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.77.0.tgz", - "integrity": "sha512-QWdcH31mXEUe5Nq1s0CfCpceaKjIo9uZtwDjAuL681g1axf+5x8xrg/eXWaw//4NCxYZ4V4e5Hu5tvdR+pTBlg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-riscv64-gnu": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.77.0.tgz", - "integrity": "sha512-GnOfYgJxbcElOiPZaDFDl406ONddwvOWk2jvAAAEjwAl4GofNoHF+/HHUIBYa6bFCArlcGPi0XjC4cU1pkgF/Q==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-riscv64-musl": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.77.0.tgz", - "integrity": "sha512-AyEMTUCf0xY+hHF+IxqXFQIX0yQOIR8ykpY0lJNOw9xYqOzUX8dyZfRvlG0RfXwuQn2eonf/8NrMmDSZJjdqsA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-s390x-gnu": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.77.0.tgz", - "integrity": "sha512-sPLzEcNvxd/oyVQ5oZo92CiHkFkpBeRop13E/P3TPY+hZfXHKCOWKI70TE2RYwMKFJDc20EMjH16L7NZICtKTw==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-x64-gnu": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.77.0.tgz", - "integrity": "sha512-1Oh2ssH2L7lwyvkdSqaMUfsGfwU2Wfvew+obBUYjRVqhpBcUpwnsPSEr1IzVi9XqkuY10geiLsNKecqaZC34Dw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-x64-musl": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.77.0.tgz", - "integrity": "sha512-0j/2wRgNGO+Qj/M1uu/p57h/hFTTWWcfie0ufkbabeus2s5+/QqkCflnMOwLLN5m2GsNeWp4xdl4cPa4n7QCOQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-openharmony-arm64": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.77.0.tgz", - "integrity": "sha512-BJ/j54qS0usEnyDkLYURMj2iiD9h5Cyy+ppzeMSXBGRXaGRNWnj1Mw14NqWMR5E/PzdgB30OOCCzLzbRoduafw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-arm64-msvc": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.77.0.tgz", - "integrity": "sha512-Yh8w+g2Lpx7StrvtYkoz9JJvXjB9wxgFChFNb85nrXm/wj/XTwGWS1hve9+900HL7llrntYB3YP+y32E3tRqzA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-ia32-msvc": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.77.0.tgz", - "integrity": "sha512-zja5b7+6a7UsRFgAQSrnax5vrzliEyNPLCjfXONu/vTWswaIVZGFajJZptaeRvPE4LghtFdAzVFlexTm7MVTGA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-x64-msvc": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.77.0.tgz", - "integrity": "sha512-+teyvPDZ2RjUvo+SuCqS/UhaJl1QtdW5fWT5NJTV61V5MIuIS90Db9LixmtEGvXixyttiK62P96MSu3UlpviBw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "license": "MIT", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.3.tgz", - "integrity": "sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.3.tgz", - "integrity": "sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.3.tgz", - "integrity": "sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.3.tgz", - "integrity": "sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.3.tgz", - "integrity": "sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.3.tgz", - "integrity": "sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.3.tgz", - "integrity": "sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.3.tgz", - "integrity": "sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.3.tgz", - "integrity": "sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.3.tgz", - "integrity": "sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.3.tgz", - "integrity": "sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.3.tgz", - "integrity": "sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.3.tgz", - "integrity": "sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.3.tgz", - "integrity": "sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.2.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", - "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.5.tgz", - "integrity": "sha512-BOVzne/NL162sMdResB25mUv+vWMF5NoAjNf09TeGlE7ZpszZWSD3winycicLJw72yeVsoCn/2kOhEuCvEShMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rolldown/pluginutils": "^1.0.1" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", - "babel-plugin-react-compiler": "^1.0.0", - "vite": "^8.0.0" - }, - "peerDependenciesMeta": { - "@rolldown/plugin-babel": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true - } - } - }, - "node_modules/bootstrap": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz", - "integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/twbs" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - } - ], - "license": "MIT", - "peerDependencies": { - "@popperjs/core": "^2.11.8" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/lightningcss": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", - "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.33.0", - "lightningcss-darwin-arm64": "1.33.0", - "lightningcss-darwin-x64": "1.33.0", - "lightningcss-freebsd-x64": "1.33.0", - "lightningcss-linux-arm-gnueabihf": "1.33.0", - "lightningcss-linux-arm64-gnu": "1.33.0", - "lightningcss-linux-arm64-musl": "1.33.0", - "lightningcss-linux-x64-gnu": "1.33.0", - "lightningcss-linux-x64-musl": "1.33.0", - "lightningcss-win32-arm64-msvc": "1.33.0", - "lightningcss-win32-x64-msvc": "1.33.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", - "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", - "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", - "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", - "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", - "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", - "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", - "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", - "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", - "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", - "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", - "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/nanoid": { - "version": "3.3.17", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.17.tgz", - "integrity": "sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/oxlint": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.77.0.tgz", - "integrity": "sha512-qnGh8XJHaQ0dprrDXNQZgS0FgjI6v+V3+X8DwmaV++5Aamy6jGKfDdQ1TUvhUxtmKFAbEf4/WeO5QZX+5WSngg==", - "dev": true, - "license": "MIT", - "bin": { - "oxlint": "bin/oxlint" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/Boshen" - }, - "optionalDependencies": { - "@oxlint/binding-android-arm-eabi": "1.77.0", - "@oxlint/binding-android-arm64": "1.77.0", - "@oxlint/binding-darwin-arm64": "1.77.0", - "@oxlint/binding-darwin-x64": "1.77.0", - "@oxlint/binding-freebsd-x64": "1.77.0", - "@oxlint/binding-linux-arm-gnueabihf": "1.77.0", - "@oxlint/binding-linux-arm-musleabihf": "1.77.0", - "@oxlint/binding-linux-arm64-gnu": "1.77.0", - "@oxlint/binding-linux-arm64-musl": "1.77.0", - "@oxlint/binding-linux-ppc64-gnu": "1.77.0", - "@oxlint/binding-linux-riscv64-gnu": "1.77.0", - "@oxlint/binding-linux-riscv64-musl": "1.77.0", - "@oxlint/binding-linux-s390x-gnu": "1.77.0", - "@oxlint/binding-linux-x64-gnu": "1.77.0", - "@oxlint/binding-linux-x64-musl": "1.77.0", - "@oxlint/binding-openharmony-arm64": "1.77.0", - "@oxlint/binding-win32-arm64-msvc": "1.77.0", - "@oxlint/binding-win32-ia32-msvc": "1.77.0", - "@oxlint/binding-win32-x64-msvc": "1.77.0" - }, - "peerDependencies": { - "oxlint-tsgolint": ">=7.0.2001", - "vite-plus": "*" - }, - "peerDependenciesMeta": { - "oxlint-tsgolint": { - "optional": true - }, - "vite-plus": { - "optional": true - } - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.25", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.25.tgz", - "integrity": "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.16", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/react": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", - "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", - "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.8" - } - }, - "node_modules/rolldown": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.3.tgz", - "integrity": "sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "=0.143.0", - "@rolldown/pluginutils": "^1.0.0" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.2.3", - "@rolldown/binding-darwin-arm64": "1.2.3", - "@rolldown/binding-darwin-x64": "1.2.3", - "@rolldown/binding-freebsd-x64": "1.2.3", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.3", - "@rolldown/binding-linux-arm64-gnu": "1.2.3", - "@rolldown/binding-linux-arm64-musl": "1.2.3", - "@rolldown/binding-linux-ppc64-gnu": "1.2.3", - "@rolldown/binding-linux-s390x-gnu": "1.2.3", - "@rolldown/binding-linux-x64-gnu": "1.2.3", - "@rolldown/binding-linux-x64-musl": "1.2.3", - "@rolldown/binding-openharmony-arm64": "1.2.3", - "@rolldown/binding-win32-arm64-msvc": "1.2.3", - "@rolldown/binding-win32-x64-msvc": "1.2.3" - } - }, - "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/vite": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.0.tgz", - "integrity": "sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "lightningcss": "^1.33.0", - "picomatch": "^4.0.5", - "postcss": "^8.5.23", - "rolldown": "~1.2.0", - "tinyglobby": "^0.2.17" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.4.0", - "esbuild": "^0.27.0 || ^0.28.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - } - } -} diff --git a/05_react/unterricht/tag38/04_product-list-ar/package.json b/05_react/unterricht/tag38/04_product-list-ar/package.json deleted file mode 100644 index 76e189f..0000000 --- a/05_react/unterricht/tag38/04_product-list-ar/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "04_product-list-ar", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "lint": "oxlint", - "preview": "vite preview" - }, - "dependencies": { - "bootstrap": "^5.3.8", - "react": "^19.2.8", - "react-dom": "^19.2.8" - }, - "devDependencies": { - "@types/react": "^19.2.17", - "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "^6.0.4", - "oxlint": "^1.75.0", - "vite": "^8.2.0" - } -} diff --git a/05_react/unterricht/tag38/04_product-list-ar/public/favicon.svg b/05_react/unterricht/tag38/04_product-list-ar/public/favicon.svg deleted file mode 100644 index 6893eb1..0000000 --- a/05_react/unterricht/tag38/04_product-list-ar/public/favicon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/05_react/unterricht/tag38/04_product-list-ar/public/icons.svg b/05_react/unterricht/tag38/04_product-list-ar/public/icons.svg deleted file mode 100644 index e952219..0000000 --- a/05_react/unterricht/tag38/04_product-list-ar/public/icons.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/05_react/unterricht/tag38/04_product-list-ar/src/App.jsx b/05_react/unterricht/tag38/04_product-list-ar/src/App.jsx deleted file mode 100644 index d2a7c22..0000000 --- a/05_react/unterricht/tag38/04_product-list-ar/src/App.jsx +++ /dev/null @@ -1,37 +0,0 @@ -import ProductList from './components/ProductList'; - -function App() { - // const { } = props; - - const products = [ - { - id: 1, - title: 'Hot Binary Heat Changing Mug', - description: 'Heat Changing Mug', - price: 12.99, - }, - { - id: 2, - title: '3D Printing Pen', - description: 'For 3D Drawing', - price: 9.99, - }, - { - id: 3, - title: 'Klingon Letter Opener', - description: 'Star Trek Fan Article', - price: 24.99, - }, - ]; - - return ( - <> -
      -
      - -
      -
      - - ); -} -export default App; diff --git a/05_react/unterricht/tag38/04_product-list-ar/src/assets/react.svg b/05_react/unterricht/tag38/04_product-list-ar/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/05_react/unterricht/tag38/04_product-list-ar/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/05_react/unterricht/tag38/04_product-list-ar/src/assets/vite.svg b/05_react/unterricht/tag38/04_product-list-ar/src/assets/vite.svg deleted file mode 100644 index 5101b67..0000000 --- a/05_react/unterricht/tag38/04_product-list-ar/src/assets/vite.svg +++ /dev/null @@ -1 +0,0 @@ -Vite diff --git a/05_react/unterricht/tag38/04_product-list-ar/src/components/ProductList.jsx b/05_react/unterricht/tag38/04_product-list-ar/src/components/ProductList.jsx deleted file mode 100644 index 836f5f3..0000000 --- a/05_react/unterricht/tag38/04_product-list-ar/src/components/ProductList.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import ProductListItem from './ProductListItem'; - -const ProductList = (props) => { - const { title, products } = props; - - return ( - <> - {title &&

      {title}

      } -
        - {products.map((product, idx) => { - return ; - // return ; - })} -
      - - ); -}; -export default ProductList; diff --git a/05_react/unterricht/tag38/04_product-list-ar/src/components/ProductListItem.jsx b/05_react/unterricht/tag38/04_product-list-ar/src/components/ProductListItem.jsx deleted file mode 100644 index f59555c..0000000 --- a/05_react/unterricht/tag38/04_product-list-ar/src/components/ProductListItem.jsx +++ /dev/null @@ -1,11 +0,0 @@ -const ProductListItem = (props) => { - const { title, description, price } = props; - - return ( -
    • -

      {title}

      - {props.children ||

      {description}

      } -
    • - ); -}; -export default ProductListItem; diff --git a/05_react/unterricht/tag38/04_product-list-ar/src/main.jsx b/05_react/unterricht/tag38/04_product-list-ar/src/main.jsx deleted file mode 100644 index 36e5193..0000000 --- a/05_react/unterricht/tag38/04_product-list-ar/src/main.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; - -// CSS Einbindung von Bootstrap -import 'bootstrap/dist/css/bootstrap.min.css'; - -import App from './App.jsx'; - -createRoot(document.getElementById('root')).render( - - - , -); diff --git a/05_react/unterricht/tag38/04_product-list-ar/vite.config.js b/05_react/unterricht/tag38/04_product-list-ar/vite.config.js deleted file mode 100644 index 8b0f57b..0000000 --- a/05_react/unterricht/tag38/04_product-list-ar/vite.config.js +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' - -// https://vite.dev/config/ -export default defineConfig({ - plugins: [react()], -}) diff --git a/05_react/unterricht/tag39/01_styling-components/.gitignore b/05_react/unterricht/tag39/01_styling-components/.gitignore deleted file mode 100644 index a547bf3..0000000 --- a/05_react/unterricht/tag39/01_styling-components/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/05_react/unterricht/tag39/01_styling-components/.oxlintrc.json b/05_react/unterricht/tag39/01_styling-components/.oxlintrc.json deleted file mode 100644 index 1255078..0000000 --- a/05_react/unterricht/tag39/01_styling-components/.oxlintrc.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$schema": "./node_modules/oxlint/configuration_schema.json", - "plugins": ["react", "oxc"], - "rules": { - "react/rules-of-hooks": "error", - "react/only-export-components": ["warn", { "allowConstantExport": true }] - } -} diff --git a/05_react/unterricht/tag39/01_styling-components/README.md b/05_react/unterricht/tag39/01_styling-components/README.md deleted file mode 100644 index d937833..0000000 --- a/05_react/unterricht/tag39/01_styling-components/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# React + Vite - -This template provides a minimal setup to get React working in Vite with HMR and some Oxlint rules. - -Currently, two official plugins are available: - -- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs) -- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) - -## React Compiler - -The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). - -## Expanding the Oxlint configuration - -If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and Oxlint's TypeScript related rules in your project. diff --git a/05_react/unterricht/tag39/01_styling-components/index.html b/05_react/unterricht/tag39/01_styling-components/index.html deleted file mode 100644 index 7f6ec36..0000000 --- a/05_react/unterricht/tag39/01_styling-components/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - 01_styling-components - - -
      - - - diff --git a/05_react/unterricht/tag39/01_styling-components/package-lock.json b/05_react/unterricht/tag39/01_styling-components/package-lock.json deleted file mode 100644 index d3adddb..0000000 --- a/05_react/unterricht/tag39/01_styling-components/package-lock.json +++ /dev/null @@ -1,1325 +0,0 @@ -{ - "name": "01_styling-components", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "01_styling-components", - "version": "0.0.0", - "dependencies": { - "bootstrap": "^5.3.8", - "react": "^19.2.8", - "react-dom": "^19.2.8" - }, - "devDependencies": { - "@types/react": "^19.2.17", - "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "^6.0.4", - "oxlint": "^1.75.0", - "vite": "^8.2.0" - } - }, - "node_modules/@oxc-project/types": { - "version": "0.143.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.143.0.tgz", - "integrity": "sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@oxlint/binding-android-arm-eabi": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.77.0.tgz", - "integrity": "sha512-E06sKWS6PiI6HRxS1wyQg22HvApt01hI7fV+T3wUk3OSbaaP4a3hYGY/MIQDmASqCiRjBdpRQYkgMkqH82cWmQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-android-arm64": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.77.0.tgz", - "integrity": "sha512-NvsKz0KZxTp9cYWPLf+FXaSZwB3oO3peAjtukpOMBgse2vhQSoIIVqeO1yR0lEo/UcdZIDL18uq+kL0LzQ0ytA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-darwin-arm64": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.77.0.tgz", - "integrity": "sha512-bgjTn6nW4bQCFBvSvuHCpDD+sONvmpo4lGI4PxzMt1quBA+xYxhczk6RiCn3GZ9gY8uhaBbwhj9MdKGfu6T9DA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-darwin-x64": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.77.0.tgz", - "integrity": "sha512-aotaIttH1R6j1Rwhx0M0htgeZyGtVQqYNTVEYMN/UcgHPquGA6kmk9OyuDc3a2GKUQBC+3C3GVQCcrRPMYqAFA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-freebsd-x64": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.77.0.tgz", - "integrity": "sha512-nNx/wta7ksRAdYvq+l4AWjXkLxEXHALhENxjj2cYbQAIR4ybaA5L+hCbE63HOmft5czQ6ks+hb8vmEAnn7YGPg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm-gnueabihf": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.77.0.tgz", - "integrity": "sha512-tMLLjM7xXtzXisVCzkOTXNCy9bZVId2wteNwjohlFDR/jY6WagpEDA1c1wu4xRc20Hojaxj+V6DSR7gbKxijWA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm-musleabihf": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.77.0.tgz", - "integrity": "sha512-MiAFDFaqR0tmHTAyo0YDcZ5hyLREdYw/RQhc2R3cbT+8O3tB+zqPM2th9TTQ+Uo3jn/embS+DO+HyX9ztCPkOQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm64-gnu": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.77.0.tgz", - "integrity": "sha512-/xqQ3B16i1T4cyt/9Mn+4CpzhUXoBXp7kVpIwzOXNFLj5JmK1bIjsbSnX296Gg8A/o7oDtKWikFgBx0SLwztkw==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm64-musl": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.77.0.tgz", - "integrity": "sha512-LSbwuRKiNCenPDcbARqAZ5RfBy7gmj7vOvfJRLeCDU3gFtSxWbhv/+VTlaUqzUhNj1gFLHB8h7ALnxa/Az6z6g==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-ppc64-gnu": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.77.0.tgz", - "integrity": "sha512-QWdcH31mXEUe5Nq1s0CfCpceaKjIo9uZtwDjAuL681g1axf+5x8xrg/eXWaw//4NCxYZ4V4e5Hu5tvdR+pTBlg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-riscv64-gnu": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.77.0.tgz", - "integrity": "sha512-GnOfYgJxbcElOiPZaDFDl406ONddwvOWk2jvAAAEjwAl4GofNoHF+/HHUIBYa6bFCArlcGPi0XjC4cU1pkgF/Q==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-riscv64-musl": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.77.0.tgz", - "integrity": "sha512-AyEMTUCf0xY+hHF+IxqXFQIX0yQOIR8ykpY0lJNOw9xYqOzUX8dyZfRvlG0RfXwuQn2eonf/8NrMmDSZJjdqsA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-s390x-gnu": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.77.0.tgz", - "integrity": "sha512-sPLzEcNvxd/oyVQ5oZo92CiHkFkpBeRop13E/P3TPY+hZfXHKCOWKI70TE2RYwMKFJDc20EMjH16L7NZICtKTw==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-x64-gnu": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.77.0.tgz", - "integrity": "sha512-1Oh2ssH2L7lwyvkdSqaMUfsGfwU2Wfvew+obBUYjRVqhpBcUpwnsPSEr1IzVi9XqkuY10geiLsNKecqaZC34Dw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-x64-musl": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.77.0.tgz", - "integrity": "sha512-0j/2wRgNGO+Qj/M1uu/p57h/hFTTWWcfie0ufkbabeus2s5+/QqkCflnMOwLLN5m2GsNeWp4xdl4cPa4n7QCOQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-openharmony-arm64": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.77.0.tgz", - "integrity": "sha512-BJ/j54qS0usEnyDkLYURMj2iiD9h5Cyy+ppzeMSXBGRXaGRNWnj1Mw14NqWMR5E/PzdgB30OOCCzLzbRoduafw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-arm64-msvc": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.77.0.tgz", - "integrity": "sha512-Yh8w+g2Lpx7StrvtYkoz9JJvXjB9wxgFChFNb85nrXm/wj/XTwGWS1hve9+900HL7llrntYB3YP+y32E3tRqzA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-ia32-msvc": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.77.0.tgz", - "integrity": "sha512-zja5b7+6a7UsRFgAQSrnax5vrzliEyNPLCjfXONu/vTWswaIVZGFajJZptaeRvPE4LghtFdAzVFlexTm7MVTGA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-x64-msvc": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.77.0.tgz", - "integrity": "sha512-+teyvPDZ2RjUvo+SuCqS/UhaJl1QtdW5fWT5NJTV61V5MIuIS90Db9LixmtEGvXixyttiK62P96MSu3UlpviBw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "license": "MIT", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.3.tgz", - "integrity": "sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.3.tgz", - "integrity": "sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.3.tgz", - "integrity": "sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.3.tgz", - "integrity": "sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.3.tgz", - "integrity": "sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.3.tgz", - "integrity": "sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.3.tgz", - "integrity": "sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.3.tgz", - "integrity": "sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.3.tgz", - "integrity": "sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.3.tgz", - "integrity": "sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.3.tgz", - "integrity": "sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.3.tgz", - "integrity": "sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.3.tgz", - "integrity": "sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.3.tgz", - "integrity": "sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.2.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", - "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.5.tgz", - "integrity": "sha512-BOVzne/NL162sMdResB25mUv+vWMF5NoAjNf09TeGlE7ZpszZWSD3winycicLJw72yeVsoCn/2kOhEuCvEShMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rolldown/pluginutils": "^1.0.1" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", - "babel-plugin-react-compiler": "^1.0.0", - "vite": "^8.0.0" - }, - "peerDependenciesMeta": { - "@rolldown/plugin-babel": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true - } - } - }, - "node_modules/bootstrap": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz", - "integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/twbs" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - } - ], - "license": "MIT", - "peerDependencies": { - "@popperjs/core": "^2.11.8" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/lightningcss": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", - "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.33.0", - "lightningcss-darwin-arm64": "1.33.0", - "lightningcss-darwin-x64": "1.33.0", - "lightningcss-freebsd-x64": "1.33.0", - "lightningcss-linux-arm-gnueabihf": "1.33.0", - "lightningcss-linux-arm64-gnu": "1.33.0", - "lightningcss-linux-arm64-musl": "1.33.0", - "lightningcss-linux-x64-gnu": "1.33.0", - "lightningcss-linux-x64-musl": "1.33.0", - "lightningcss-win32-arm64-msvc": "1.33.0", - "lightningcss-win32-x64-msvc": "1.33.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", - "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", - "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", - "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", - "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", - "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", - "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", - "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", - "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", - "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", - "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", - "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/nanoid": { - "version": "3.3.17", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.17.tgz", - "integrity": "sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/oxlint": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.77.0.tgz", - "integrity": "sha512-qnGh8XJHaQ0dprrDXNQZgS0FgjI6v+V3+X8DwmaV++5Aamy6jGKfDdQ1TUvhUxtmKFAbEf4/WeO5QZX+5WSngg==", - "dev": true, - "license": "MIT", - "bin": { - "oxlint": "bin/oxlint" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/Boshen" - }, - "optionalDependencies": { - "@oxlint/binding-android-arm-eabi": "1.77.0", - "@oxlint/binding-android-arm64": "1.77.0", - "@oxlint/binding-darwin-arm64": "1.77.0", - "@oxlint/binding-darwin-x64": "1.77.0", - "@oxlint/binding-freebsd-x64": "1.77.0", - "@oxlint/binding-linux-arm-gnueabihf": "1.77.0", - "@oxlint/binding-linux-arm-musleabihf": "1.77.0", - "@oxlint/binding-linux-arm64-gnu": "1.77.0", - "@oxlint/binding-linux-arm64-musl": "1.77.0", - "@oxlint/binding-linux-ppc64-gnu": "1.77.0", - "@oxlint/binding-linux-riscv64-gnu": "1.77.0", - "@oxlint/binding-linux-riscv64-musl": "1.77.0", - "@oxlint/binding-linux-s390x-gnu": "1.77.0", - "@oxlint/binding-linux-x64-gnu": "1.77.0", - "@oxlint/binding-linux-x64-musl": "1.77.0", - "@oxlint/binding-openharmony-arm64": "1.77.0", - "@oxlint/binding-win32-arm64-msvc": "1.77.0", - "@oxlint/binding-win32-ia32-msvc": "1.77.0", - "@oxlint/binding-win32-x64-msvc": "1.77.0" - }, - "peerDependencies": { - "oxlint-tsgolint": ">=7.0.2001", - "vite-plus": "*" - }, - "peerDependenciesMeta": { - "oxlint-tsgolint": { - "optional": true - }, - "vite-plus": { - "optional": true - } - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", - "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.17", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/react": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", - "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", - "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.8" - } - }, - "node_modules/rolldown": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.3.tgz", - "integrity": "sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "=0.143.0", - "@rolldown/pluginutils": "^1.0.0" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.2.3", - "@rolldown/binding-darwin-arm64": "1.2.3", - "@rolldown/binding-darwin-x64": "1.2.3", - "@rolldown/binding-freebsd-x64": "1.2.3", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.3", - "@rolldown/binding-linux-arm64-gnu": "1.2.3", - "@rolldown/binding-linux-arm64-musl": "1.2.3", - "@rolldown/binding-linux-ppc64-gnu": "1.2.3", - "@rolldown/binding-linux-s390x-gnu": "1.2.3", - "@rolldown/binding-linux-x64-gnu": "1.2.3", - "@rolldown/binding-linux-x64-musl": "1.2.3", - "@rolldown/binding-openharmony-arm64": "1.2.3", - "@rolldown/binding-win32-arm64-msvc": "1.2.3", - "@rolldown/binding-win32-x64-msvc": "1.2.3" - } - }, - "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/vite": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.0.tgz", - "integrity": "sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "lightningcss": "^1.33.0", - "picomatch": "^4.0.5", - "postcss": "^8.5.23", - "rolldown": "~1.2.0", - "tinyglobby": "^0.2.17" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.4.0", - "esbuild": "^0.27.0 || ^0.28.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - } - } -} diff --git a/05_react/unterricht/tag39/01_styling-components/package.json b/05_react/unterricht/tag39/01_styling-components/package.json deleted file mode 100644 index 0d321c1..0000000 --- a/05_react/unterricht/tag39/01_styling-components/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "01_styling-components", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "lint": "oxlint", - "preview": "vite preview" - }, - "dependencies": { - "bootstrap": "^5.3.8", - "react": "^19.2.8", - "react-dom": "^19.2.8" - }, - "devDependencies": { - "@types/react": "^19.2.17", - "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "^6.0.4", - "oxlint": "^1.75.0", - "vite": "^8.2.0" - } -} diff --git a/05_react/unterricht/tag39/01_styling-components/public/favicon.svg b/05_react/unterricht/tag39/01_styling-components/public/favicon.svg deleted file mode 100644 index 6893eb1..0000000 --- a/05_react/unterricht/tag39/01_styling-components/public/favicon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/05_react/unterricht/tag39/01_styling-components/public/icons.svg b/05_react/unterricht/tag39/01_styling-components/public/icons.svg deleted file mode 100644 index e952219..0000000 --- a/05_react/unterricht/tag39/01_styling-components/public/icons.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/05_react/unterricht/tag39/01_styling-components/src/App.jsx b/05_react/unterricht/tag39/01_styling-components/src/App.jsx deleted file mode 100644 index 5bf6328..0000000 --- a/05_react/unterricht/tag39/01_styling-components/src/App.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import MyStyleComponent from './components/MyStyleComponent'; - -// function statement for hoisting -function App(props) { - // const { } = props; - - return ( -
      - -
      - ); -} -export default App; diff --git a/05_react/unterricht/tag39/01_styling-components/src/assets/react.svg b/05_react/unterricht/tag39/01_styling-components/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/05_react/unterricht/tag39/01_styling-components/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/05_react/unterricht/tag39/01_styling-components/src/assets/vite.svg b/05_react/unterricht/tag39/01_styling-components/src/assets/vite.svg deleted file mode 100644 index 5101b67..0000000 --- a/05_react/unterricht/tag39/01_styling-components/src/assets/vite.svg +++ /dev/null @@ -1 +0,0 @@ -Vite diff --git a/05_react/unterricht/tag39/01_styling-components/src/components/MyStyleComponent.css b/05_react/unterricht/tag39/01_styling-components/src/components/MyStyleComponent.css deleted file mode 100644 index d3ceaf5..0000000 --- a/05_react/unterricht/tag39/01_styling-components/src/components/MyStyleComponent.css +++ /dev/null @@ -1,4 +0,0 @@ -.headline { - background-color: orange !important; - padding: 1rem; -} diff --git a/05_react/unterricht/tag39/01_styling-components/src/components/MyStyleComponent.jsx b/05_react/unterricht/tag39/01_styling-components/src/components/MyStyleComponent.jsx deleted file mode 100644 index 739c902..0000000 --- a/05_react/unterricht/tag39/01_styling-components/src/components/MyStyleComponent.jsx +++ /dev/null @@ -1,24 +0,0 @@ -import './MyStyleComponent.css'; - -const MyStyleComponent = (props) => { - // const { } = props; - const css = { backgroundColor: '#2a2a2a', color: '#efefef', padding: '2rem', 'border-radius': '1rem' }; - - return ( - <> -

      - Hallo React with Style! -

      -

      - Lorem ipsum dolor sit amet consectetur adipisicing elit. Quaerat minus a quam officia laboriosam itaque nisi - harum aliquam totam, GFN neque fugiat rerum numquam magni qui sint at eos doloribus beatae - obcaecati, cupiditate laborum voluptatem tempora sit labore. Architecto rerum rem perferendis tenetur aspernatur - dolorem repudiandae nobis molestiae, velit officia, voluptate perspiciatis asperiores tempora culpa labore, - earum placeat blanditiis unde numquam voluptatem hic cumque est. Nobis harum assumenda minima excepturi ipsum - facilis laudantium reprehenderit quia. Officia tenetur esse quisquam commodi unde, sit quaerat iure at tempora - aut nemo ex quo consectetur natus aliquam ratione dignissimos, excepturi enim, aperiam repudiandae odit quam. -

      - - ); -}; -export default MyStyleComponent; diff --git a/05_react/unterricht/tag39/01_styling-components/src/main.jsx b/05_react/unterricht/tag39/01_styling-components/src/main.jsx deleted file mode 100644 index b05c70f..0000000 --- a/05_react/unterricht/tag39/01_styling-components/src/main.jsx +++ /dev/null @@ -1,12 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; - -import 'bootstrap/dist/css/bootstrap.min.css'; - -import App from './App.jsx'; - -createRoot(document.getElementById('root')).render( - - - , -); diff --git a/05_react/unterricht/tag39/01_styling-components/vite.config.js b/05_react/unterricht/tag39/01_styling-components/vite.config.js deleted file mode 100644 index 8b0f57b..0000000 --- a/05_react/unterricht/tag39/01_styling-components/vite.config.js +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' - -// https://vite.dev/config/ -export default defineConfig({ - plugins: [react()], -}) diff --git a/05_react/unterricht/tag39/02_reusable-components/.gitignore b/05_react/unterricht/tag39/02_reusable-components/.gitignore deleted file mode 100644 index a547bf3..0000000 --- a/05_react/unterricht/tag39/02_reusable-components/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/05_react/unterricht/tag39/02_reusable-components/.oxlintrc.json b/05_react/unterricht/tag39/02_reusable-components/.oxlintrc.json deleted file mode 100644 index 1255078..0000000 --- a/05_react/unterricht/tag39/02_reusable-components/.oxlintrc.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$schema": "./node_modules/oxlint/configuration_schema.json", - "plugins": ["react", "oxc"], - "rules": { - "react/rules-of-hooks": "error", - "react/only-export-components": ["warn", { "allowConstantExport": true }] - } -} diff --git a/05_react/unterricht/tag39/02_reusable-components/README.md b/05_react/unterricht/tag39/02_reusable-components/README.md deleted file mode 100644 index d937833..0000000 --- a/05_react/unterricht/tag39/02_reusable-components/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# React + Vite - -This template provides a minimal setup to get React working in Vite with HMR and some Oxlint rules. - -Currently, two official plugins are available: - -- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs) -- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) - -## React Compiler - -The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). - -## Expanding the Oxlint configuration - -If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and Oxlint's TypeScript related rules in your project. diff --git a/05_react/unterricht/tag39/02_reusable-components/index.html b/05_react/unterricht/tag39/02_reusable-components/index.html deleted file mode 100644 index 2d1adbd..0000000 --- a/05_react/unterricht/tag39/02_reusable-components/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - 02_reusable-components - - -
      - - - diff --git a/05_react/unterricht/tag39/02_reusable-components/package-lock.json b/05_react/unterricht/tag39/02_reusable-components/package-lock.json deleted file mode 100644 index b21b523..0000000 --- a/05_react/unterricht/tag39/02_reusable-components/package-lock.json +++ /dev/null @@ -1,2270 +0,0 @@ -{ - "name": "02_reusable-components", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "02_reusable-components", - "version": "0.0.0", - "dependencies": { - "bootstrap": "^5.3.8", - "react": "^19.2.8", - "react-dom": "^19.2.8" - }, - "devDependencies": { - "@types/react": "^19.2.17", - "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "^6.0.4", - "oxlint": "^1.75.0", - "sass-embedded": "^1.100.0", - "styled-components": "^6.5.0", - "vite": "^8.2.0" - } - }, - "node_modules/@bufbuild/protobuf": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.13.0.tgz", - "integrity": "sha512-acq7c49vxfm1ggJ95P70TX7ABDM0vxr1SYD3BB0o0jnBLB4OAqeHyKuN+cD3w80gXEDQ2zxHpR6CUeA+O/aU9g==", - "dev": true, - "license": "(Apache-2.0 AND BSD-3-Clause)" - }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", - "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@emotion/memoize": "^0.9.0" - } - }, - "node_modules/@emotion/memoize": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", - "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@oxc-project/types": { - "version": "0.143.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.143.0.tgz", - "integrity": "sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@oxlint/binding-android-arm-eabi": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.77.0.tgz", - "integrity": "sha512-E06sKWS6PiI6HRxS1wyQg22HvApt01hI7fV+T3wUk3OSbaaP4a3hYGY/MIQDmASqCiRjBdpRQYkgMkqH82cWmQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-android-arm64": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.77.0.tgz", - "integrity": "sha512-NvsKz0KZxTp9cYWPLf+FXaSZwB3oO3peAjtukpOMBgse2vhQSoIIVqeO1yR0lEo/UcdZIDL18uq+kL0LzQ0ytA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-darwin-arm64": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.77.0.tgz", - "integrity": "sha512-bgjTn6nW4bQCFBvSvuHCpDD+sONvmpo4lGI4PxzMt1quBA+xYxhczk6RiCn3GZ9gY8uhaBbwhj9MdKGfu6T9DA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-darwin-x64": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.77.0.tgz", - "integrity": "sha512-aotaIttH1R6j1Rwhx0M0htgeZyGtVQqYNTVEYMN/UcgHPquGA6kmk9OyuDc3a2GKUQBC+3C3GVQCcrRPMYqAFA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-freebsd-x64": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.77.0.tgz", - "integrity": "sha512-nNx/wta7ksRAdYvq+l4AWjXkLxEXHALhENxjj2cYbQAIR4ybaA5L+hCbE63HOmft5czQ6ks+hb8vmEAnn7YGPg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm-gnueabihf": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.77.0.tgz", - "integrity": "sha512-tMLLjM7xXtzXisVCzkOTXNCy9bZVId2wteNwjohlFDR/jY6WagpEDA1c1wu4xRc20Hojaxj+V6DSR7gbKxijWA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm-musleabihf": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.77.0.tgz", - "integrity": "sha512-MiAFDFaqR0tmHTAyo0YDcZ5hyLREdYw/RQhc2R3cbT+8O3tB+zqPM2th9TTQ+Uo3jn/embS+DO+HyX9ztCPkOQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm64-gnu": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.77.0.tgz", - "integrity": "sha512-/xqQ3B16i1T4cyt/9Mn+4CpzhUXoBXp7kVpIwzOXNFLj5JmK1bIjsbSnX296Gg8A/o7oDtKWikFgBx0SLwztkw==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm64-musl": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.77.0.tgz", - "integrity": "sha512-LSbwuRKiNCenPDcbARqAZ5RfBy7gmj7vOvfJRLeCDU3gFtSxWbhv/+VTlaUqzUhNj1gFLHB8h7ALnxa/Az6z6g==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-ppc64-gnu": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.77.0.tgz", - "integrity": "sha512-QWdcH31mXEUe5Nq1s0CfCpceaKjIo9uZtwDjAuL681g1axf+5x8xrg/eXWaw//4NCxYZ4V4e5Hu5tvdR+pTBlg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-riscv64-gnu": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.77.0.tgz", - "integrity": "sha512-GnOfYgJxbcElOiPZaDFDl406ONddwvOWk2jvAAAEjwAl4GofNoHF+/HHUIBYa6bFCArlcGPi0XjC4cU1pkgF/Q==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-riscv64-musl": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.77.0.tgz", - "integrity": "sha512-AyEMTUCf0xY+hHF+IxqXFQIX0yQOIR8ykpY0lJNOw9xYqOzUX8dyZfRvlG0RfXwuQn2eonf/8NrMmDSZJjdqsA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-s390x-gnu": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.77.0.tgz", - "integrity": "sha512-sPLzEcNvxd/oyVQ5oZo92CiHkFkpBeRop13E/P3TPY+hZfXHKCOWKI70TE2RYwMKFJDc20EMjH16L7NZICtKTw==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-x64-gnu": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.77.0.tgz", - "integrity": "sha512-1Oh2ssH2L7lwyvkdSqaMUfsGfwU2Wfvew+obBUYjRVqhpBcUpwnsPSEr1IzVi9XqkuY10geiLsNKecqaZC34Dw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-x64-musl": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.77.0.tgz", - "integrity": "sha512-0j/2wRgNGO+Qj/M1uu/p57h/hFTTWWcfie0ufkbabeus2s5+/QqkCflnMOwLLN5m2GsNeWp4xdl4cPa4n7QCOQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-openharmony-arm64": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.77.0.tgz", - "integrity": "sha512-BJ/j54qS0usEnyDkLYURMj2iiD9h5Cyy+ppzeMSXBGRXaGRNWnj1Mw14NqWMR5E/PzdgB30OOCCzLzbRoduafw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-arm64-msvc": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.77.0.tgz", - "integrity": "sha512-Yh8w+g2Lpx7StrvtYkoz9JJvXjB9wxgFChFNb85nrXm/wj/XTwGWS1hve9+900HL7llrntYB3YP+y32E3tRqzA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-ia32-msvc": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.77.0.tgz", - "integrity": "sha512-zja5b7+6a7UsRFgAQSrnax5vrzliEyNPLCjfXONu/vTWswaIVZGFajJZptaeRvPE4LghtFdAzVFlexTm7MVTGA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-x64-msvc": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.77.0.tgz", - "integrity": "sha512-+teyvPDZ2RjUvo+SuCqS/UhaJl1QtdW5fWT5NJTV61V5MIuIS90Db9LixmtEGvXixyttiK62P96MSu3UlpviBw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz", - "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.3", - "is-glob": "^4.0.3", - "node-addon-api": "^7.0.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.6.0", - "@parcel/watcher-darwin-arm64": "2.6.0", - "@parcel/watcher-darwin-x64": "2.6.0", - "@parcel/watcher-freebsd-x64": "2.6.0", - "@parcel/watcher-linux-arm-glibc": "2.6.0", - "@parcel/watcher-linux-arm-musl": "2.6.0", - "@parcel/watcher-linux-arm64-glibc": "2.6.0", - "@parcel/watcher-linux-arm64-musl": "2.6.0", - "@parcel/watcher-linux-x64-glibc": "2.6.0", - "@parcel/watcher-linux-x64-musl": "2.6.0", - "@parcel/watcher-win32-arm64": "2.6.0", - "@parcel/watcher-win32-x64": "2.6.0" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz", - "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz", - "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz", - "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz", - "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz", - "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz", - "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz", - "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz", - "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz", - "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz", - "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz", - "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz", - "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "license": "MIT", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.3.tgz", - "integrity": "sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.3.tgz", - "integrity": "sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.3.tgz", - "integrity": "sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.3.tgz", - "integrity": "sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.3.tgz", - "integrity": "sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.3.tgz", - "integrity": "sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.3.tgz", - "integrity": "sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.3.tgz", - "integrity": "sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.3.tgz", - "integrity": "sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.3.tgz", - "integrity": "sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.3.tgz", - "integrity": "sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.3.tgz", - "integrity": "sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.3.tgz", - "integrity": "sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.3.tgz", - "integrity": "sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.2.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", - "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.5.tgz", - "integrity": "sha512-BOVzne/NL162sMdResB25mUv+vWMF5NoAjNf09TeGlE7ZpszZWSD3winycicLJw72yeVsoCn/2kOhEuCvEShMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rolldown/pluginutils": "^1.0.1" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", - "babel-plugin-react-compiler": "^1.0.0", - "vite": "^8.0.0" - }, - "peerDependenciesMeta": { - "@rolldown/plugin-babel": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true - } - } - }, - "node_modules/bootstrap": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz", - "integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/twbs" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - } - ], - "license": "MIT", - "peerDependencies": { - "@popperjs/core": "^2.11.8" - } - }, - "node_modules/camelize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", - "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/colorjs.io": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", - "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", - "dev": true, - "license": "MIT" - }, - "node_modules/css-color-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=4" - } - }, - "node_modules/css-to-react-native": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", - "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^4.0.2" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/immutable": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", - "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lightningcss": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", - "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.33.0", - "lightningcss-darwin-arm64": "1.33.0", - "lightningcss-darwin-x64": "1.33.0", - "lightningcss-freebsd-x64": "1.33.0", - "lightningcss-linux-arm-gnueabihf": "1.33.0", - "lightningcss-linux-arm64-gnu": "1.33.0", - "lightningcss-linux-arm64-musl": "1.33.0", - "lightningcss-linux-x64-gnu": "1.33.0", - "lightningcss-linux-x64-musl": "1.33.0", - "lightningcss-win32-arm64-msvc": "1.33.0", - "lightningcss-win32-x64-msvc": "1.33.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", - "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", - "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", - "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", - "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", - "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", - "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", - "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", - "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", - "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", - "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", - "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/nanoid": { - "version": "3.3.17", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.17.tgz", - "integrity": "sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/oxlint": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.77.0.tgz", - "integrity": "sha512-qnGh8XJHaQ0dprrDXNQZgS0FgjI6v+V3+X8DwmaV++5Aamy6jGKfDdQ1TUvhUxtmKFAbEf4/WeO5QZX+5WSngg==", - "dev": true, - "license": "MIT", - "bin": { - "oxlint": "bin/oxlint" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/Boshen" - }, - "optionalDependencies": { - "@oxlint/binding-android-arm-eabi": "1.77.0", - "@oxlint/binding-android-arm64": "1.77.0", - "@oxlint/binding-darwin-arm64": "1.77.0", - "@oxlint/binding-darwin-x64": "1.77.0", - "@oxlint/binding-freebsd-x64": "1.77.0", - "@oxlint/binding-linux-arm-gnueabihf": "1.77.0", - "@oxlint/binding-linux-arm-musleabihf": "1.77.0", - "@oxlint/binding-linux-arm64-gnu": "1.77.0", - "@oxlint/binding-linux-arm64-musl": "1.77.0", - "@oxlint/binding-linux-ppc64-gnu": "1.77.0", - "@oxlint/binding-linux-riscv64-gnu": "1.77.0", - "@oxlint/binding-linux-riscv64-musl": "1.77.0", - "@oxlint/binding-linux-s390x-gnu": "1.77.0", - "@oxlint/binding-linux-x64-gnu": "1.77.0", - "@oxlint/binding-linux-x64-musl": "1.77.0", - "@oxlint/binding-openharmony-arm64": "1.77.0", - "@oxlint/binding-win32-arm64-msvc": "1.77.0", - "@oxlint/binding-win32-ia32-msvc": "1.77.0", - "@oxlint/binding-win32-x64-msvc": "1.77.0" - }, - "peerDependencies": { - "oxlint-tsgolint": ">=7.0.2001", - "vite-plus": "*" - }, - "peerDependenciesMeta": { - "oxlint-tsgolint": { - "optional": true - }, - "vite-plus": { - "optional": true - } - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", - "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.17", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/react": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", - "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", - "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.8" - } - }, - "node_modules/readdirp": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", - "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/rolldown": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.3.tgz", - "integrity": "sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "=0.143.0", - "@rolldown/pluginutils": "^1.0.0" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.2.3", - "@rolldown/binding-darwin-arm64": "1.2.3", - "@rolldown/binding-darwin-x64": "1.2.3", - "@rolldown/binding-freebsd-x64": "1.2.3", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.3", - "@rolldown/binding-linux-arm64-gnu": "1.2.3", - "@rolldown/binding-linux-arm64-musl": "1.2.3", - "@rolldown/binding-linux-ppc64-gnu": "1.2.3", - "@rolldown/binding-linux-s390x-gnu": "1.2.3", - "@rolldown/binding-linux-x64-gnu": "1.2.3", - "@rolldown/binding-linux-x64-musl": "1.2.3", - "@rolldown/binding-openharmony-arm64": "1.2.3", - "@rolldown/binding-win32-arm64-msvc": "1.2.3", - "@rolldown/binding-win32-x64-msvc": "1.2.3" - } - }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/sass": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.100.0.tgz", - "integrity": "sha512-B5j0rYMlinhhOo9tjQebMVVn0TfyXAF+wB3b2ggZUuJ/is/Y+7+JGjirAMxHZ9Z3hIP98NPfamlAkBHa1lAaXQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "chokidar": "^5.0.0", - "immutable": "^5.1.5", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=20.19.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" - } - }, - "node_modules/sass-embedded": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.100.0.tgz", - "integrity": "sha512-Ut8wlQSk19tm7jMK6mz6cF1+e+E7tUnW2tM02zQDPnOTcVbV8qCQG8UWxZkkNlY50+hV3hqP24OOkUlMz8xBpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@bufbuild/protobuf": "^2.5.0", - "colorjs.io": "^0.5.0", - "immutable": "^5.1.5", - "rxjs": "^7.4.0", - "supports-color": "^8.1.1", - "sync-child-process": "^1.0.2", - "varint": "^6.0.0" - }, - "bin": { - "sass": "dist/bin/sass.js" - }, - "engines": { - "node": ">=16.0.0" - }, - "optionalDependencies": { - "sass-embedded-all-unknown": "1.100.0", - "sass-embedded-android-arm": "1.100.0", - "sass-embedded-android-arm64": "1.100.0", - "sass-embedded-android-riscv64": "1.100.0", - "sass-embedded-android-x64": "1.100.0", - "sass-embedded-darwin-arm64": "1.100.0", - "sass-embedded-darwin-x64": "1.100.0", - "sass-embedded-linux-arm": "1.100.0", - "sass-embedded-linux-arm64": "1.100.0", - "sass-embedded-linux-musl-arm": "1.100.0", - "sass-embedded-linux-musl-arm64": "1.100.0", - "sass-embedded-linux-musl-riscv64": "1.100.0", - "sass-embedded-linux-musl-x64": "1.100.0", - "sass-embedded-linux-riscv64": "1.100.0", - "sass-embedded-linux-x64": "1.100.0", - "sass-embedded-unknown-all": "1.100.0", - "sass-embedded-win32-arm64": "1.100.0", - "sass-embedded-win32-x64": "1.100.0" - } - }, - "node_modules/sass-embedded-all-unknown": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.100.0.tgz", - "integrity": "sha512-auFtXY/kwYILmSVjtBDwyj0axcLbYYiffOKWoaXHnI5bsYwiRbBh3EneR1rpbX2ZIZCrwX93i5pxKLTZF/662Q==", - "cpu": [ - "!arm", - "!arm64", - "!riscv64", - "!x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "sass": "1.100.0" - } - }, - "node_modules/sass-embedded-android-arm": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.100.0.tgz", - "integrity": "sha512-70f3HgX2pFNmzpGQ86n5e6QfWn2fP4QUQGfFQK0P1XH73ZLIzLo2YqygrGKGKeeqtc5eU2Wl1/xQzhzuKnO4kw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-arm64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.100.0.tgz", - "integrity": "sha512-W+Ru9JwTnfU0UX3jSZcbqFdtKFMcYdfFwytc57h2DgnqCOIiAqI2E06mABZBZC+r3LwXCBuS5GbXAGeVgvVDkA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-riscv64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.100.0.tgz", - "integrity": "sha512-icU3o0V/uCSytSpf+tX5Lf51BvyQEbLzDUJfUi9etSauYBGHpPKkdtdZH0si4v98phq11Kl8rSV1SggksxF1Hg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-x64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.100.0.tgz", - "integrity": "sha512-mevF9VQk6gEYByy8+jusaHGmd7Usb2ytX/DsEOd0JtOGCtcf1kh575xJ6OUBDIcJ15uLnbau/0iy1eP6WVBvWA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-darwin-arm64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.100.0.tgz", - "integrity": "sha512-1PVlYi61POo93IT/FfrG1mc1tAHxeSTyUALF2aOFmXGWjVXr3bQzEQiBGCOvQbj/ix+5hNyXFXcEMEyKvtUJJA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-darwin-x64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.100.0.tgz", - "integrity": "sha512-x97o3JnGyImZNCIVs9wQHJUE5QCvmVIKaH1cwrz/5dK7OT1FpeNiW+u9TUomP9hG6Ekjd8EL8NBHpxTfIhdjmg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-arm": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.100.0.tgz", - "integrity": "sha512-9Ul7O1eKrc5YlhwWjkp8tZPSe3UEwSZ1uwUZOQom1HL0pRlBA6F/IlGZYFTLwnHMIP1fc77MMNaBRfc05mKMpw==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-arm64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.100.0.tgz", - "integrity": "sha512-Dwjmj8Z6VRy7rAi53JAdEwIyUjpfl7PhpSc2/LpQPQx+aO5Dp7Spaipkax0ufJl1SoDUdchCsM4y/88YaluorQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-arm": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.100.0.tgz", - "integrity": "sha512-sl0JgbGloPyJg66XXx5UDSDScZ0oU85DpMQU4JU/sCUCFj1Z8zZ69SJWKTCNE4/jwnce7WI2zPCV5AG+RHOZJw==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-arm64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.100.0.tgz", - "integrity": "sha512-XpACJB2KjSLjf2e9uuvGVdOURsoNrFqgRiihhXyUHK9W0t3LIHb7z5MA/7XGPIT9bWSOO2zyw+rH/FHtDV/Yrg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-riscv64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.100.0.tgz", - "integrity": "sha512-ShvI0Kx04mwoCARwZ0UjiT97isQvzO80tAt91zmFyHLN9kelc/IrQi940farSm2xQVPCKdeVyeG0ekBsokSpYQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-x64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.100.0.tgz", - "integrity": "sha512-TDBCRWNuS4RDLQXvRc1gjZlWiWTWaWGp0Bwu/IKwJxov81lsvrCs3TihTyNXtW7V5aoN4Ky3r0QOkNb3mwmBnA==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-riscv64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.100.0.tgz", - "integrity": "sha512-j4ENJGOheO+fm3j/yorLxCjBP6/XskrZx7dTLlT+lXYwN/qqCqoA/gsNLI0McS3DFM6GBwPiffzWsdWS8t6sEQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-x64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.100.0.tgz", - "integrity": "sha512-0vUSN8j0WGtCJIOPh//EmUvYGHW0QOe5iul8qyhPk50MAcw49MA0r34AhftjDdx94ILPF6vApFs0gwHPQRlpVA==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-unknown-all": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.100.0.tgz", - "integrity": "sha512-c+naBgWId4MIpToXcI0DgqetjdAkwTTAxFAuOaBz7HUXLdyG1oZRrEvSsbe41nEdQOKH0vgofVFCeSQgoXOG9A==", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "!android", - "!darwin", - "!linux", - "!win32" - ], - "dependencies": { - "sass": "1.100.0" - } - }, - "node_modules/sass-embedded-win32-arm64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.100.0.tgz", - "integrity": "sha512-iE+yxj+hUXwwbqpHkXxgAWTzeRfcWxJ7SSTQEPMk48lwq3oCrWLlz5sQuWHbuTK/i0GKQfROdP+hOmPi89yjUg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-win32-x64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.100.0.tgz", - "integrity": "sha512-qI4F8MI7/KYoy9NdjJfhSspG42WPkADSNDvwEV7qWvCSFC83koJssRsKO2/PfY+niZz6BG65Ic/D+A11h959hw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/styled-components": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.5.0.tgz", - "integrity": "sha512-WLnTRAIRJsmCQfPXoEDDd1YMML+ImxQ8YGVVg60FALxsn/rpWiQWSJCZDNfu/buAcBFnTUr8ev6CBR8rb7xLiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@emotion/is-prop-valid": "1.4.0", - "css-to-react-native": "3.2.0", - "csstype": "3.2.3", - "stylis": "4.3.6" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/styled-components" - }, - "peerDependencies": { - "css-to-react-native": ">= 3.2.0", - "react": ">= 16.8.0", - "react-dom": ">= 16.8.0", - "react-native": ">= 0.68.0" - }, - "peerDependenciesMeta": { - "css-to-react-native": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/stylis": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", - "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/sync-child-process": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz", - "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "sync-message-port": "^1.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/sync-message-port": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.2.0.tgz", - "integrity": "sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/varint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", - "dev": true, - "license": "MIT" - }, - "node_modules/vite": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.0.tgz", - "integrity": "sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "lightningcss": "^1.33.0", - "picomatch": "^4.0.5", - "postcss": "^8.5.23", - "rolldown": "~1.2.0", - "tinyglobby": "^0.2.17" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.4.0", - "esbuild": "^0.27.0 || ^0.28.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - } - } -} diff --git a/05_react/unterricht/tag39/02_reusable-components/package.json b/05_react/unterricht/tag39/02_reusable-components/package.json deleted file mode 100644 index 2febb53..0000000 --- a/05_react/unterricht/tag39/02_reusable-components/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "02_reusable-components", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "lint": "oxlint", - "preview": "vite preview" - }, - "dependencies": { - "bootstrap": "^5.3.8", - "react": "^19.2.8", - "react-dom": "^19.2.8" - }, - "devDependencies": { - "@types/react": "^19.2.17", - "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "^6.0.4", - "oxlint": "^1.75.0", - "sass-embedded": "^1.100.0", - "styled-components": "^6.5.0", - "vite": "^8.2.0" - } -} diff --git a/05_react/unterricht/tag39/02_reusable-components/public/favicon.svg b/05_react/unterricht/tag39/02_reusable-components/public/favicon.svg deleted file mode 100644 index 6893eb1..0000000 --- a/05_react/unterricht/tag39/02_reusable-components/public/favicon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/05_react/unterricht/tag39/02_reusable-components/public/icons.svg b/05_react/unterricht/tag39/02_reusable-components/public/icons.svg deleted file mode 100644 index e952219..0000000 --- a/05_react/unterricht/tag39/02_reusable-components/public/icons.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/05_react/unterricht/tag39/02_reusable-components/src/App.jsx b/05_react/unterricht/tag39/02_reusable-components/src/App.jsx deleted file mode 100644 index ed95d4b..0000000 --- a/05_react/unterricht/tag39/02_reusable-components/src/App.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import Button from './components/buttons/Button'; -import InputAmount from './components/inputs/InputAmount'; - -function App(props) { - // const { } = props; - - return ( -
      - {/* */} - - - - -
      - ); -} - -export default App; diff --git a/05_react/unterricht/tag39/02_reusable-components/src/assets/react.svg b/05_react/unterricht/tag39/02_reusable-components/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/05_react/unterricht/tag39/02_reusable-components/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/05_react/unterricht/tag39/02_reusable-components/src/assets/vite.svg b/05_react/unterricht/tag39/02_reusable-components/src/assets/vite.svg deleted file mode 100644 index 5101b67..0000000 --- a/05_react/unterricht/tag39/02_reusable-components/src/assets/vite.svg +++ /dev/null @@ -1 +0,0 @@ -Vite diff --git a/05_react/unterricht/tag39/02_reusable-components/src/components/buttons/Button.css b/05_react/unterricht/tag39/02_reusable-components/src/components/buttons/Button.css deleted file mode 100644 index 902ea84..0000000 --- a/05_react/unterricht/tag39/02_reusable-components/src/components/buttons/Button.css +++ /dev/null @@ -1,14 +0,0 @@ -.btn-custom { - background-color: #f0f0f0; - color: #333; - border: 1px solid #ccc; - padding: 8px 16px; - border-radius: 0px; -} - -.btn-custom:hover, -.btn-custom:focus { - background-color: #e0e0e0; - color: #333; - border: 1px solid #ccc; -} diff --git a/05_react/unterricht/tag39/02_reusable-components/src/components/buttons/Button.jsx b/05_react/unterricht/tag39/02_reusable-components/src/components/buttons/Button.jsx deleted file mode 100644 index 1cab98d..0000000 --- a/05_react/unterricht/tag39/02_reusable-components/src/components/buttons/Button.jsx +++ /dev/null @@ -1,55 +0,0 @@ -// css import -// import './Button.css'; - -// CSS Module import -// import styles from './Button.module.css'; - -// SASS Import - benötigt sass compiler (npm install sass -D oder npm install sass-embedded -D) -// import './Button.scss'; - -// import von Modul, welches SFC (Single File Component) ermöglicht -import styled from 'styled-components'; - -// styled-components, JSS, Emotion - ermöglichen CSS in JS und somit SFC (Single File Components) -const StyledButton = styled.button` - background-color: #f0f0f0; - color: #333; - border: 1px solid #ccc; - padding: 8px 16px; - border-radius: 0px; - background-color: ${(props) => props.bgcolor || '#f0f0f0'}; - &:hover, - &:focus { - background-color: #e0e0e0; - color: #333; - border: 1px solid #ccc; - } -`; - -const Button = (props) => { - const { variant = 'custom' } = props; - - return ; - - // style-components - Komponente - // return ( - // - // {props.children || 'Click Me'} - // - // ); - - // CSS Module - // return ( - // - // ); - - // CSS Klassenzuweisung (classic) - // return ( - // - // ); -}; -export default Button; diff --git a/05_react/unterricht/tag39/02_reusable-components/src/components/buttons/Button.module.css b/05_react/unterricht/tag39/02_reusable-components/src/components/buttons/Button.module.css deleted file mode 100644 index 23e8c9b..0000000 --- a/05_react/unterricht/tag39/02_reusable-components/src/components/buttons/Button.module.css +++ /dev/null @@ -1,14 +0,0 @@ -.btn-custom { - background-color: salmon; - color: #333; - border: 1px solid #ccc; - padding: 8px 16px; - border-radius: 0px; -} - -.btn-custom:hover, -.btn-custom:focus { - background-color: #e0e0e0; - color: #333; - border: 1px solid #ccc; -} diff --git a/05_react/unterricht/tag39/02_reusable-components/src/components/buttons/Button.scss b/05_react/unterricht/tag39/02_reusable-components/src/components/buttons/Button.scss deleted file mode 100644 index eeafcc9..0000000 --- a/05_react/unterricht/tag39/02_reusable-components/src/components/buttons/Button.scss +++ /dev/null @@ -1,14 +0,0 @@ -// Kommentar nur in SASS vorhanden -.btn-custom { - &:hover, - &:focus { - background-color: #e0e0e0; - color: #333; - border: 1px solid #ccc; - } - background-color: tomato; - color: white; - border: 1px solid #ccc; - padding: 8px 16px; - border-radius: 0px; -} diff --git a/05_react/unterricht/tag39/02_reusable-components/src/components/inputs/InputAmount.jsx b/05_react/unterricht/tag39/02_reusable-components/src/components/inputs/InputAmount.jsx deleted file mode 100644 index d18889e..0000000 --- a/05_react/unterricht/tag39/02_reusable-components/src/components/inputs/InputAmount.jsx +++ /dev/null @@ -1,22 +0,0 @@ -const InputAmount = (props) => { - // const { } = props; - - return ( -
      -
      - - - - - - - -
      -
      - ); -}; -export default InputAmount; diff --git a/05_react/unterricht/tag39/02_reusable-components/src/main.jsx b/05_react/unterricht/tag39/02_reusable-components/src/main.jsx deleted file mode 100644 index 489056a..0000000 --- a/05_react/unterricht/tag39/02_reusable-components/src/main.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; - -// import 'bootstrap/dist/css/bootstrap.min.css'; -import './styles/main.scss'; - -import App from './App.jsx'; - -createRoot(document.getElementById('root')).render( - - - , -); diff --git a/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/_index.scss b/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/_index.scss deleted file mode 100644 index dcefbc9..0000000 --- a/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/_index.scss +++ /dev/null @@ -1,3 +0,0 @@ -// @import 'bootstrap-5.3.8/bootstrap-grid'; -@import 'bootstrap-5.3.8/bootstrap'; -// @import 'bulma-1.04/index' diff --git a/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss b/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss deleted file mode 100644 index e9f267f..0000000 --- a/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss +++ /dev/null @@ -1,153 +0,0 @@ -// -// Base styles -// - -.accordion { - // scss-docs-start accordion-css-vars - --#{$prefix}accordion-color: #{$accordion-color}; - --#{$prefix}accordion-bg: #{$accordion-bg}; - --#{$prefix}accordion-transition: #{$accordion-transition}; - --#{$prefix}accordion-border-color: #{$accordion-border-color}; - --#{$prefix}accordion-border-width: #{$accordion-border-width}; - --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; - --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; - --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; - --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; - --#{$prefix}accordion-btn-color: #{$accordion-button-color}; - --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; - --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; - --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; - --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; - --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; - --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; - --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; - --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; - --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; - // scss-docs-end accordion-css-vars -} - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); - @include font-size($font-size-base); - color: var(--#{$prefix}accordion-btn-color); - text-align: left; // Reset button style - background-color: var(--#{$prefix}accordion-btn-bg); - border: 0; - @include border-radius(0); - overflow-anchor: none; - @include transition(var(--#{$prefix}accordion-transition)); - - &:not(.collapsed) { - color: var(--#{$prefix}accordion-active-color); - background-color: var(--#{$prefix}accordion-active-bg); - box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list - - &::after { - background-image: var(--#{$prefix}accordion-btn-active-icon); - transform: var(--#{$prefix}accordion-btn-icon-transform); - } - } - - // Accordion icon - &::after { - flex-shrink: 0; - width: var(--#{$prefix}accordion-btn-icon-width); - height: var(--#{$prefix}accordion-btn-icon-width); - margin-left: auto; - content: ""; - background-image: var(--#{$prefix}accordion-btn-icon); - background-repeat: no-repeat; - background-size: var(--#{$prefix}accordion-btn-icon-width); - @include transition(var(--#{$prefix}accordion-btn-icon-transition)); - } - - &:hover { - z-index: 2; - } - - &:focus { - z-index: 3; - outline: 0; - box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); - } -} - -.accordion-header { - margin-bottom: 0; -} - -.accordion-item { - color: var(--#{$prefix}accordion-color); - background-color: var(--#{$prefix}accordion-bg); - border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); - - &:first-of-type { - @include border-top-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - &:not(:first-of-type) { - border-top: 0; - } - - // Only set a border-radius on the last item if the accordion is collapsed - &:last-of-type { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - &.collapsed { - @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - > .accordion-collapse { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - } - } -} - -.accordion-body { - padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); -} - - -// Flush accordion items -// -// Remove borders and border-radius to keep accordion items edge-to-edge. - -.accordion-flush { - > .accordion-item { - border-right: 0; - border-left: 0; - @include border-radius(0); - - &:first-child { border-top: 0; } - &:last-child { border-bottom: 0; } - - // stylelint-disable selector-max-class - > .accordion-collapse, - > .accordion-header .accordion-button, - > .accordion-header .accordion-button.collapsed { - @include border-radius(0); - } - // stylelint-enable selector-max-class - } -} - -@if $enable-dark-mode { - @include color-mode(dark) { - .accordion-button::after { - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; - } - } -} diff --git a/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss b/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss deleted file mode 100644 index b8cff9b..0000000 --- a/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss +++ /dev/null @@ -1,68 +0,0 @@ -// -// Base styles -// - -.alert { - // scss-docs-start alert-css-vars - --#{$prefix}alert-bg: transparent; - --#{$prefix}alert-padding-x: #{$alert-padding-x}; - --#{$prefix}alert-padding-y: #{$alert-padding-y}; - --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; - --#{$prefix}alert-color: inherit; - --#{$prefix}alert-border-color: transparent; - --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); - --#{$prefix}alert-border-radius: #{$alert-border-radius}; - --#{$prefix}alert-link-color: inherit; - // scss-docs-end alert-css-vars - - position: relative; - padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); - margin-bottom: var(--#{$prefix}alert-margin-bottom); - color: var(--#{$prefix}alert-color); - background-color: var(--#{$prefix}alert-bg); - border: var(--#{$prefix}alert-border); - @include border-radius(var(--#{$prefix}alert-border-radius)); -} - -// Headings for larger alerts -.alert-heading { - // Specified to prevent conflicts of changing $headings-color - color: inherit; -} - -// Provide class for links that match alerts -.alert-link { - font-weight: $alert-link-font-weight; - color: var(--#{$prefix}alert-link-color); -} - - -// Dismissible alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissible { - padding-right: $alert-dismissible-padding-r; - - // Adjust close link position - .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: $stretched-link-z-index + 1; - padding: $alert-padding-y * 1.25 $alert-padding-x; - } -} - - -// scss-docs-start alert-modifiers -// Generate contextual modifier classes for colorizing the alert -@each $state in map-keys($theme-colors) { - .alert-#{$state} { - --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); - --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); - --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); - --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); - } -} -// scss-docs-end alert-modifiers diff --git a/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss b/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss deleted file mode 100644 index cc3d269..0000000 --- a/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss +++ /dev/null @@ -1,38 +0,0 @@ -// Base class -// -// Requires one of the contextual, color modifier classes for `color` and -// `background-color`. - -.badge { - // scss-docs-start badge-css-vars - --#{$prefix}badge-padding-x: #{$badge-padding-x}; - --#{$prefix}badge-padding-y: #{$badge-padding-y}; - @include rfs($badge-font-size, --#{$prefix}badge-font-size); - --#{$prefix}badge-font-weight: #{$badge-font-weight}; - --#{$prefix}badge-color: #{$badge-color}; - --#{$prefix}badge-border-radius: #{$badge-border-radius}; - // scss-docs-end badge-css-vars - - display: inline-block; - padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x); - @include font-size(var(--#{$prefix}badge-font-size)); - font-weight: var(--#{$prefix}badge-font-weight); - line-height: 1; - color: var(--#{$prefix}badge-color); - text-align: center; - white-space: nowrap; - vertical-align: baseline; - @include border-radius(var(--#{$prefix}badge-border-radius)); - @include gradient-bg(); - - // Empty badges collapse automatically - &:empty { - display: none; - } -} - -// Quick fix for badges in buttons -.btn .badge { - position: relative; - top: -1px; -} diff --git a/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss b/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss deleted file mode 100644 index b8252ff..0000000 --- a/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss +++ /dev/null @@ -1,40 +0,0 @@ -.breadcrumb { - // scss-docs-start breadcrumb-css-vars - --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x}; - --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y}; - --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom}; - @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size); - --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg}; - --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius}; - --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color}; - --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x}; - --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color}; - // scss-docs-end breadcrumb-css-vars - - display: flex; - flex-wrap: wrap; - padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x); - margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom); - @include font-size(var(--#{$prefix}breadcrumb-font-size)); - list-style: none; - background-color: var(--#{$prefix}breadcrumb-bg); - @include border-radius(var(--#{$prefix}breadcrumb-border-radius)); -} - -.breadcrumb-item { - // The separator between breadcrumbs (by default, a forward-slash: "/") - + .breadcrumb-item { - padding-left: var(--#{$prefix}breadcrumb-item-padding-x); - - &::before { - float: left; // Suppress inline spacings and underlining of the separator - padding-right: var(--#{$prefix}breadcrumb-item-padding-x); - color: var(--#{$prefix}breadcrumb-divider-color); - content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; - } - } - - &.active { - color: var(--#{$prefix}breadcrumb-item-active-color); - } -} diff --git a/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss b/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss deleted file mode 100644 index 78e1252..0000000 --- a/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss +++ /dev/null @@ -1,147 +0,0 @@ -// Make the div behave like a button -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; // match .btn alignment given font-size hack above - - > .btn { - position: relative; - flex: 1 1 auto; - } - - // Bring the hover, focused, and "active" buttons to the front to overlay - // the borders properly - > .btn-check:checked + .btn, - > .btn-check:focus + .btn, - > .btn:hover, - > .btn:focus, - > .btn:active, - > .btn.active { - z-index: 1; - } -} - -// Optional: Group multiple button groups together for a toolbar -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; - - .input-group { - width: auto; - } -} - -.btn-group { - @include border-radius($btn-border-radius); - - // Prevent double borders when buttons are next to each other - > :not(.btn-check:first-child) + .btn, - > .btn-group:not(:first-child) { - margin-left: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn.dropdown-toggle-split:first-child, - > .btn-group:not(:last-child) > .btn { - @include border-end-radius(0); - } - - // The left radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-start-radius(0); - } -} - -// Sizing -// -// Remix the default button sizing classes into new ones for easier manipulation. - -.btn-group-sm > .btn { @extend .btn-sm; } -.btn-group-lg > .btn { @extend .btn-lg; } - - -// -// Split button dropdowns -// - -.dropdown-toggle-split { - padding-right: $btn-padding-x * .75; - padding-left: $btn-padding-x * .75; - - &::after, - .dropup &::after, - .dropend &::after { - margin-left: 0; - } - - .dropstart &::before { - margin-right: 0; - } -} - -.btn-sm + .dropdown-toggle-split { - padding-right: $btn-padding-x-sm * .75; - padding-left: $btn-padding-x-sm * .75; -} - -.btn-lg + .dropdown-toggle-split { - padding-right: $btn-padding-x-lg * .75; - padding-left: $btn-padding-x-lg * .75; -} - - -// The clickable button for toggling the menu -// Set the same inset shadow as the :active state -.btn-group.show .dropdown-toggle { - @include box-shadow($btn-active-box-shadow); - - // Show no shadow for `.btn-link` since it has no other button styles. - &.btn-link { - @include box-shadow(none); - } -} - - -// -// Vertical button groups -// - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; - - > .btn, - > .btn-group { - width: 100%; - } - - > .btn:not(:first-child), - > .btn-group:not(:first-child) { - margin-top: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn-group:not(:last-child) > .btn { - @include border-bottom-radius(0); - } - - // The top radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-top-radius(0); - } -} diff --git a/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss b/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss deleted file mode 100644 index caa4518..0000000 --- a/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss +++ /dev/null @@ -1,216 +0,0 @@ -// -// Base styles -// - -.btn { - // scss-docs-start btn-css-vars - --#{$prefix}btn-padding-x: #{$btn-padding-x}; - --#{$prefix}btn-padding-y: #{$btn-padding-y}; - --#{$prefix}btn-font-family: #{$btn-font-family}; - @include rfs($btn-font-size, --#{$prefix}btn-font-size); - --#{$prefix}btn-font-weight: #{$btn-font-weight}; - --#{$prefix}btn-line-height: #{$btn-line-height}; - --#{$prefix}btn-color: #{$btn-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-width: #{$btn-border-width}; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-border-radius: #{$btn-border-radius}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-box-shadow: #{$btn-box-shadow}; - --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity}; - --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5); - // scss-docs-end btn-css-vars - - display: inline-block; - padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x); - font-family: var(--#{$prefix}btn-font-family); - @include font-size(var(--#{$prefix}btn-font-size)); - font-weight: var(--#{$prefix}btn-font-weight); - line-height: var(--#{$prefix}btn-line-height); - color: var(--#{$prefix}btn-color); - text-align: center; - text-decoration: if($link-decoration == none, null, none); - white-space: $btn-white-space; - vertical-align: middle; - cursor: if($enable-button-pointers, pointer, null); - user-select: none; - border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color); - @include border-radius(var(--#{$prefix}btn-border-radius)); - @include gradient-bg(var(--#{$prefix}btn-bg)); - @include box-shadow(var(--#{$prefix}btn-box-shadow)); - @include transition($btn-transition); - - &:hover { - color: var(--#{$prefix}btn-hover-color); - text-decoration: if($link-hover-decoration == underline, none, null); - background-color: var(--#{$prefix}btn-hover-bg); - border-color: var(--#{$prefix}btn-hover-border-color); - } - - .btn-check + &:hover { - // override for the checkbox/radio buttons - color: var(--#{$prefix}btn-color); - background-color: var(--#{$prefix}btn-bg); - border-color: var(--#{$prefix}btn-border-color); - } - - &:focus-visible { - color: var(--#{$prefix}btn-hover-color); - @include gradient-bg(var(--#{$prefix}btn-hover-bg)); - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:focus-visible + & { - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:checked + &, - :not(.btn-check) + &:active, - &:first-child:active, - &.active, - &.show { - color: var(--#{$prefix}btn-active-color); - background-color: var(--#{$prefix}btn-active-bg); - // Remove CSS gradients if they're enabled - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-active-border-color); - @include box-shadow(var(--#{$prefix}btn-active-shadow)); - - &:focus-visible { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - } - - .btn-check:checked:focus-visible + & { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - &:disabled, - &.disabled, - fieldset:disabled & { - color: var(--#{$prefix}btn-disabled-color); - pointer-events: none; - background-color: var(--#{$prefix}btn-disabled-bg); - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-disabled-border-color); - opacity: var(--#{$prefix}btn-disabled-opacity); - @include box-shadow(none); - } -} - - -// -// Alternate buttons -// - -// scss-docs-start btn-variant-loops -@each $color, $value in $theme-colors { - .btn-#{$color} { - @if $color == "light" { - @include button-variant( - $value, - $value, - $hover-background: shade-color($value, $btn-hover-bg-shade-amount), - $hover-border: shade-color($value, $btn-hover-border-shade-amount), - $active-background: shade-color($value, $btn-active-bg-shade-amount), - $active-border: shade-color($value, $btn-active-border-shade-amount) - ); - } @else if $color == "dark" { - @include button-variant( - $value, - $value, - $hover-background: tint-color($value, $btn-hover-bg-tint-amount), - $hover-border: tint-color($value, $btn-hover-border-tint-amount), - $active-background: tint-color($value, $btn-active-bg-tint-amount), - $active-border: tint-color($value, $btn-active-border-tint-amount) - ); - } @else { - @include button-variant($value, $value); - } - } -} - -@each $color, $value in $theme-colors { - .btn-outline-#{$color} { - @include button-outline-variant($value); - } -} -// scss-docs-end btn-variant-loops - - -// -// Link buttons -// - -// Make a button look and behave like a link -.btn-link { - --#{$prefix}btn-font-weight: #{$font-weight-normal}; - --#{$prefix}btn-color: #{$btn-link-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-hover-color: #{$btn-link-hover-color}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-active-color: #{$btn-link-hover-color}; - --#{$prefix}btn-active-border-color: transparent; - --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color}; - --#{$prefix}btn-disabled-border-color: transparent; - --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows - --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb}; - - text-decoration: $link-decoration; - @if $enable-gradients { - background-image: none; - } - - &:hover, - &:focus-visible { - text-decoration: $link-hover-decoration; - } - - &:focus-visible { - color: var(--#{$prefix}btn-color); - } - - &:hover { - color: var(--#{$prefix}btn-hover-color); - } - - // No need for an active state here -} - - -// -// Button Sizes -// - -.btn-lg { - @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); -} - -.btn-sm { - @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); -} diff --git a/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss b/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss deleted file mode 100644 index dcebe6a..0000000 --- a/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss +++ /dev/null @@ -1,238 +0,0 @@ -// -// Base styles -// - -.card { - // scss-docs-start card-css-vars - --#{$prefix}card-spacer-y: #{$card-spacer-y}; - --#{$prefix}card-spacer-x: #{$card-spacer-x}; - --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y}; - --#{$prefix}card-title-color: #{$card-title-color}; - --#{$prefix}card-subtitle-color: #{$card-subtitle-color}; - --#{$prefix}card-border-width: #{$card-border-width}; - --#{$prefix}card-border-color: #{$card-border-color}; - --#{$prefix}card-border-radius: #{$card-border-radius}; - --#{$prefix}card-box-shadow: #{$card-box-shadow}; - --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius}; - --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y}; - --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x}; - --#{$prefix}card-cap-bg: #{$card-cap-bg}; - --#{$prefix}card-cap-color: #{$card-cap-color}; - --#{$prefix}card-height: #{$card-height}; - --#{$prefix}card-color: #{$card-color}; - --#{$prefix}card-bg: #{$card-bg}; - --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding}; - --#{$prefix}card-group-margin: #{$card-group-margin}; - // scss-docs-end card-css-vars - - position: relative; - display: flex; - flex-direction: column; - min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 - height: var(--#{$prefix}card-height); - color: var(--#{$prefix}body-color); - word-wrap: break-word; - background-color: var(--#{$prefix}card-bg); - background-clip: border-box; - border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - @include border-radius(var(--#{$prefix}card-border-radius)); - @include box-shadow(var(--#{$prefix}card-box-shadow)); - - > hr { - margin-right: 0; - margin-left: 0; - } - - > .list-group { - border-top: inherit; - border-bottom: inherit; - - &:first-child { - border-top-width: 0; - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); - } - - &:last-child { - border-bottom-width: 0; - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); - } - } - - // Due to specificity of the above selector (`.card > .list-group`), we must - // use a child selector here to prevent double borders. - > .card-header + .list-group, - > .list-group + .card-footer { - border-top: 0; - } -} - -.card-body { - // Enable `flex-grow: 1` for decks and groups so that card blocks take up - // as much space as possible, ensuring footers are aligned to the bottom. - flex: 1 1 auto; - padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x); - color: var(--#{$prefix}card-color); -} - -.card-title { - margin-bottom: var(--#{$prefix}card-title-spacer-y); - color: var(--#{$prefix}card-title-color); -} - -.card-subtitle { - margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list - margin-bottom: 0; - color: var(--#{$prefix}card-subtitle-color); -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link { - &:hover { - text-decoration: if($link-hover-decoration == underline, none, null); - } - - + .card-link { - margin-left: var(--#{$prefix}card-spacer-x); - } -} - -// -// Optional textual caps -// - -.card-header { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - margin-bottom: 0; // Removes the default margin-bottom of - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:first-child { - @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0); - } -} - -.card-footer { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:last-child { - @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius)); - } -} - - -// -// Header navs -// - -.card-header-tabs { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - border-bottom: 0; - - .nav-link.active { - background-color: var(--#{$prefix}card-bg); - border-bottom-color: var(--#{$prefix}card-bg); - } -} - -.card-header-pills { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list -} - -// Card image -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: var(--#{$prefix}card-img-overlay-padding); - @include border-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch -} - -.card-img, -.card-img-top { - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-bottom { - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); -} - - -// -// Card groups -// - -.card-group { - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - margin-bottom: var(--#{$prefix}card-group-margin); - } - - @include media-breakpoint-up(sm) { - display: flex; - flex-flow: row wrap; - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - flex: 1 0 0; - margin-bottom: 0; - - + .card { - margin-left: 0; - border-left: 0; - } - - // Handle rounded corners - @if $enable-rounded { - &:not(:last-child) { - @include border-end-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-right-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-right-radius: 0; - } - } - - &:not(:first-child) { - @include border-start-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-left-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-left-radius: 0; - } - } - } - } - } -} diff --git a/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss b/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss deleted file mode 100644 index 5ebf6b1..0000000 --- a/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss +++ /dev/null @@ -1,226 +0,0 @@ -// Notes on the classes: -// -// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) -// even when their scroll action started on a carousel, but for compatibility (with Firefox) -// we're preventing all actions instead -// 2. The .carousel-item-start and .carousel-item-end is used to indicate where -// the active slide is heading. -// 3. .active.carousel-item is the current slide. -// 4. .active.carousel-item-start and .active.carousel-item-end is the current -// slide in its in-transition state. Only one of these occurs at a time. -// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end -// is the upcoming slide in transition. - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; - @include clearfix(); -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - @include transition($carousel-transition); -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); -} - - -// -// Alternate transitions -// - -.carousel-fade { - .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; - } - - .carousel-item.active, - .carousel-item-next.carousel-item-start, - .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; - } - - .active.carousel-item-start, - .active.carousel-item-end { - z-index: 0; - opacity: 0; - @include transition(opacity 0s $carousel-transition-duration); - } -} - - -// -// Left/right controls for nav -// - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - // Use flex for alignment (1-3) - display: flex; // 1. allow flex styles - align-items: center; // 2. vertically center contents - justify-content: center; // 3. horizontally center contents - width: $carousel-control-width; - padding: 0; - color: $carousel-control-color; - text-align: center; - background: none; - filter: var(--#{$prefix}carousel-control-icon-filter); - border: 0; - opacity: $carousel-control-opacity; - @include transition($carousel-control-transition); - - // Hover/focus state - &:hover, - &:focus { - color: $carousel-control-color; - text-decoration: none; - outline: 0; - opacity: $carousel-control-hover-opacity; - } -} -.carousel-control-prev { - left: 0; - background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); -} -.carousel-control-next { - right: 0; - background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); -} - -// Icons for within -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: $carousel-control-icon-width; - height: $carousel-control-icon-width; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; -} - -.carousel-control-prev-icon { - background-image: escape-svg($carousel-control-prev-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-next-icon-bg) + "*/"}; -} -.carousel-control-next-icon { - background-image: escape-svg($carousel-control-next-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-prev-icon-bg) + "*/"}; -} - -// Optional indicator pips/controls -// -// Add a container (such as a list) with the following class and add an item (ideally a focusable control, -// like a button) with data-bs-target for each slide your carousel holds. - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - // Use the .carousel-control's width as margin so we don't overlay those - margin-right: $carousel-control-width; - margin-bottom: 1rem; - margin-left: $carousel-control-width; - - [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: $carousel-indicator-width; - height: $carousel-indicator-height; - padding: 0; - margin-right: $carousel-indicator-spacer; - margin-left: $carousel-indicator-spacer; - text-indent: -999px; - cursor: pointer; - background-color: var(--#{$prefix}carousel-indicator-active-bg); - background-clip: padding-box; - border: 0; - // Use transparent borders to increase the hit area by 10px on top and bottom. - border-top: $carousel-indicator-hit-area-height solid transparent; - border-bottom: $carousel-indicator-hit-area-height solid transparent; - opacity: $carousel-indicator-opacity; - @include transition($carousel-indicator-transition); - } - - .active { - opacity: $carousel-indicator-active-opacity; - } -} - - -// Optional captions -// -// - -.carousel-caption { - position: absolute; - right: (100% - $carousel-caption-width) * .5; - bottom: $carousel-caption-spacer; - left: (100% - $carousel-caption-width) * .5; - padding-top: $carousel-caption-padding-y; - padding-bottom: $carousel-caption-padding-y; - color: var(--#{$prefix}carousel-caption-color); - text-align: center; -} - -// Dark mode carousel - -@mixin carousel-dark() { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg-dark}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color-dark}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter-dark}; -} - -.carousel-dark { - @include carousel-dark(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include carousel-dark(); - } -} diff --git a/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss b/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss deleted file mode 100644 index d53c96f..0000000 --- a/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss +++ /dev/null @@ -1,66 +0,0 @@ -// Transparent background and border properties included for button version. -// iOS requires the button element instead of an anchor tag. -// If you want the anchor version, it requires `href="#"`. -// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile - -.btn-close { - // scss-docs-start close-css-vars - --#{$prefix}btn-close-color: #{$btn-close-color}; - --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) }; - --#{$prefix}btn-close-opacity: #{$btn-close-opacity}; - --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity}; - --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow}; - --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity}; - --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity}; - // scss-docs-end close-css-vars - - box-sizing: content-box; - width: $btn-close-width; - height: $btn-close-height; - padding: $btn-close-padding-y $btn-close-padding-x; - color: var(--#{$prefix}btn-close-color); - background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements - filter: var(--#{$prefix}btn-close-filter); - border: 0; // for button elements - @include border-radius(); - opacity: var(--#{$prefix}btn-close-opacity); - - // Override 's hover style - &:hover { - color: var(--#{$prefix}btn-close-color); - text-decoration: none; - opacity: var(--#{$prefix}btn-close-hover-opacity); - } - - &:focus { - outline: 0; - box-shadow: var(--#{$prefix}btn-close-focus-shadow); - opacity: var(--#{$prefix}btn-close-focus-opacity); - } - - &:disabled, - &.disabled { - pointer-events: none; - user-select: none; - opacity: var(--#{$prefix}btn-close-disabled-opacity); - } -} - -@mixin btn-close-white() { - --#{$prefix}btn-close-filter: #{$btn-close-filter-dark}; -} - -.btn-close-white { - @include btn-close-white(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}btn-close-filter: #{$btn-close-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include btn-close-white(); - } -} diff --git a/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss b/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss deleted file mode 100644 index 83b3138..0000000 --- a/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss +++ /dev/null @@ -1,41 +0,0 @@ -// Container widths -// -// Set the container width, and override it for fixed navbars in media queries. - -@if $enable-container-classes { - // Single container class with breakpoint max-widths - .container, - // 100% wide container at all breakpoints - .container-fluid { - @include make-container(); - } - - // Responsive containers that are 100% wide until a breakpoint - @each $breakpoint, $container-max-width in $container-max-widths { - .container-#{$breakpoint} { - @extend .container-fluid; - } - - @include media-breakpoint-up($breakpoint, $grid-breakpoints) { - %responsive-container-#{$breakpoint} { - max-width: $container-max-width; - } - - // Extend each breakpoint which is smaller or equal to the current breakpoint - $extend-breakpoint: true; - - @each $name, $width in $grid-breakpoints { - @if ($extend-breakpoint) { - .container#{breakpoint-infix($name, $grid-breakpoints)} { - @extend %responsive-container-#{$breakpoint}; - } - - // Once the current breakpoint is reached, stop extending - @if ($breakpoint == $name) { - $extend-breakpoint: false; - } - } - } - } - } -} diff --git a/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss b/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss deleted file mode 100644 index 587ebb4..0000000 --- a/05_react/unterricht/tag39/02_reusable-components/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss +++ /dev/null @@ -1,250 +0,0 @@ -// The dropdown wrapper (`
      `) -.dropup, -.dropend, -.dropdown, -.dropstart, -.dropup-center, -.dropdown-center { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; - - // Generate the caret automatically - @include caret(); -} - -// The dropdown menu -.dropdown-menu { - // scss-docs-start dropdown-css-vars - --#{$prefix}dropdown-zindex: #{$zindex-dropdown}; - --#{$prefix}dropdown-min-width: #{$dropdown-min-width}; - --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x}; - --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y}; - --#{$prefix}dropdown-spacer: #{$dropdown-spacer}; - @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size); - --#{$prefix}dropdown-color: #{$dropdown-color}; - --#{$prefix}dropdown-bg: #{$dropdown-bg}; - --#{$prefix}dropdown-border-color: #{$dropdown-border-color}; - --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius}; - --#{$prefix}dropdown-border-width: #{$dropdown-border-width}; - --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius}; - --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg}; - --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y}; - --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow}; - --#{$prefix}dropdown-link-color: #{$dropdown-link-color}; - --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color}; - --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg}; - --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color}; - --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg}; - --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color}; - --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x}; - --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y}; - --#{$prefix}dropdown-header-color: #{$dropdown-header-color}; - --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x}; - --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y}; - // scss-docs-end dropdown-css-vars - - position: absolute; - z-index: var(--#{$prefix}dropdown-zindex); - display: none; // none by default, but block on "open" of the menu - min-width: var(--#{$prefix}dropdown-min-width); - padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x); - margin: 0; // Override default margin of ul - @include font-size(var(--#{$prefix}dropdown-font-size)); - color: var(--#{$prefix}dropdown-color); - text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) - list-style: none; - background-color: var(--#{$prefix}dropdown-bg); - background-clip: padding-box; - border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color); - @include border-radius(var(--#{$prefix}dropdown-border-radius)); - @include box-shadow(var(--#{$prefix}dropdown-box-shadow)); - - &[data-bs-popper] { - top: 100%; - left: 0; - margin-top: var(--#{$prefix}dropdown-spacer); - } - - @if $dropdown-padding-y == 0 { - > .dropdown-item:first-child, - > li:first-child .dropdown-item { - @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - > .dropdown-item:last-child, - > li:last-child .dropdown-item { - @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - - } -} - -// scss-docs-start responsive-breakpoints -// We deliberately hardcode the `bs-` prefix because we check -// this custom property in JS to determine Popper's positioning - -@each $breakpoint in map-keys($grid-breakpoints) { - @include media-breakpoint-up($breakpoint) { - $infix: breakpoint-infix($breakpoint, $grid-breakpoints); - - .dropdown-menu#{$infix}-start { - --bs-position: start; - - &[data-bs-popper] { - right: auto; - left: 0; - } - } - - .dropdown-menu#{$infix}-end { - --bs-position: end; - - &[data-bs-popper] { - right: 0; - left: auto; - } - } - } -} -// scss-docs-end responsive-breakpoints - -// Allow for dropdowns to go bottom up (aka, dropup-menu) -// Just add .dropup after the standard .dropdown class and you're set. -.dropup { - .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(up); - } -} - -.dropend { - .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(end); - &::after { - vertical-align: 0; - } - } -} - -.dropstart { - .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(start); - &::before { - vertical-align: 0; - } - } -} - - -// Dividers (basically an `
      `) within the dropdown -.dropdown-divider { - height: 0; - margin: var(--#{$prefix}dropdown-divider-margin-y) 0; - overflow: hidden; - border-top: 1px solid var(--#{$prefix}dropdown-divider-bg); - opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
      element -} - -// Links, buttons, and more within the dropdown menu -// -// `
      ` alignment by inheriting `text-align`. -// 3. Fix alignment for Safari - -th { - font-weight: $table-th-font-weight; // 1 - text-align: inherit; // 2 - text-align: -webkit-match-parent; // 3 -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - - -// Forms -// -// 1. Allow labels to use `margin` for spacing. - -label { - display: inline-block; // 1 -} - -// Remove the default `border-radius` that macOS Chrome adds. -// See https://github.com/twbs/bootstrap/issues/24093 - -button { - // stylelint-disable-next-line property-disallowed-list - border-radius: 0; -} - -// Explicitly remove focus outline in Chromium when it shouldn't be -// visible (e.g. as result of mouse click or touch tap). It already -// should be doing this automatically, but seems to currently be -// confused and applies its very visible two-tone outline anyway. - -button:focus:not(:focus-visible) { - outline: 0; -} - -// 1. Remove the margin in Firefox and Safari - -input, -button, -select, -optgroup, -textarea { - margin: 0; // 1 - font-family: inherit; - @include font-size(inherit); - line-height: inherit; -} - -// Remove the inheritance of text transform in Firefox -button, -select { - text-transform: none; -} -// Set the cursor for non-`` alignment by inheriting `text-align`. -// 3. Fix alignment for Safari - -th { - font-weight: $table-th-font-weight; // 1 - text-align: inherit; // 2 - text-align: -webkit-match-parent; // 3 -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - - -// Forms -// -// 1. Allow labels to use `margin` for spacing. - -label { - display: inline-block; // 1 -} - -// Remove the default `border-radius` that macOS Chrome adds. -// See https://github.com/twbs/bootstrap/issues/24093 - -button { - // stylelint-disable-next-line property-disallowed-list - border-radius: 0; -} - -// Explicitly remove focus outline in Chromium when it shouldn't be -// visible (e.g. as result of mouse click or touch tap). It already -// should be doing this automatically, but seems to currently be -// confused and applies its very visible two-tone outline anyway. - -button:focus:not(:focus-visible) { - outline: 0; -} - -// 1. Remove the margin in Firefox and Safari - -input, -button, -select, -optgroup, -textarea { - margin: 0; // 1 - font-family: inherit; - @include font-size(inherit); - line-height: inherit; -} - -// Remove the inheritance of text transform in Firefox -button, -select { - text-transform: none; -} -// Set the cursor for non-` - -
      - -
      - - - - - - diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/.gitignore b/05_react/unterricht/tag40/03_components-with-event-handler/.gitignore deleted file mode 100644 index a547bf3..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/.oxlintrc.json b/05_react/unterricht/tag40/03_components-with-event-handler/.oxlintrc.json deleted file mode 100644 index 1255078..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/.oxlintrc.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$schema": "./node_modules/oxlint/configuration_schema.json", - "plugins": ["react", "oxc"], - "rules": { - "react/rules-of-hooks": "error", - "react/only-export-components": ["warn", { "allowConstantExport": true }] - } -} diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/README.md b/05_react/unterricht/tag40/03_components-with-event-handler/README.md deleted file mode 100644 index d937833..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# React + Vite - -This template provides a minimal setup to get React working in Vite with HMR and some Oxlint rules. - -Currently, two official plugins are available: - -- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs) -- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) - -## React Compiler - -The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). - -## Expanding the Oxlint configuration - -If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and Oxlint's TypeScript related rules in your project. diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/index.html b/05_react/unterricht/tag40/03_components-with-event-handler/index.html deleted file mode 100644 index 27629f1..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - 03_components-with-event-handler - - -
      - - - diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/package-lock.json b/05_react/unterricht/tag40/03_components-with-event-handler/package-lock.json deleted file mode 100644 index 001345f..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/package-lock.json +++ /dev/null @@ -1,2148 +0,0 @@ -{ - "name": "03_components-with-event-handler", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "03_components-with-event-handler", - "version": "0.0.0", - "dependencies": { - "react": "^19.2.8", - "react-dom": "^19.2.8", - "react-icons": "^5.7.0" - }, - "devDependencies": { - "@types/react": "^19.2.17", - "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "^6.0.4", - "oxlint": "^1.75.0", - "sass-embedded": "^1.100.0", - "vite": "^8.2.0" - } - }, - "node_modules/@bufbuild/protobuf": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.13.0.tgz", - "integrity": "sha512-acq7c49vxfm1ggJ95P70TX7ABDM0vxr1SYD3BB0o0jnBLB4OAqeHyKuN+cD3w80gXEDQ2zxHpR6CUeA+O/aU9g==", - "dev": true, - "license": "(Apache-2.0 AND BSD-3-Clause)" - }, - "node_modules/@oxc-project/types": { - "version": "0.143.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.143.0.tgz", - "integrity": "sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@oxlint/binding-android-arm-eabi": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.77.0.tgz", - "integrity": "sha512-E06sKWS6PiI6HRxS1wyQg22HvApt01hI7fV+T3wUk3OSbaaP4a3hYGY/MIQDmASqCiRjBdpRQYkgMkqH82cWmQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-android-arm64": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.77.0.tgz", - "integrity": "sha512-NvsKz0KZxTp9cYWPLf+FXaSZwB3oO3peAjtukpOMBgse2vhQSoIIVqeO1yR0lEo/UcdZIDL18uq+kL0LzQ0ytA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-darwin-arm64": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.77.0.tgz", - "integrity": "sha512-bgjTn6nW4bQCFBvSvuHCpDD+sONvmpo4lGI4PxzMt1quBA+xYxhczk6RiCn3GZ9gY8uhaBbwhj9MdKGfu6T9DA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-darwin-x64": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.77.0.tgz", - "integrity": "sha512-aotaIttH1R6j1Rwhx0M0htgeZyGtVQqYNTVEYMN/UcgHPquGA6kmk9OyuDc3a2GKUQBC+3C3GVQCcrRPMYqAFA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-freebsd-x64": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.77.0.tgz", - "integrity": "sha512-nNx/wta7ksRAdYvq+l4AWjXkLxEXHALhENxjj2cYbQAIR4ybaA5L+hCbE63HOmft5czQ6ks+hb8vmEAnn7YGPg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm-gnueabihf": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.77.0.tgz", - "integrity": "sha512-tMLLjM7xXtzXisVCzkOTXNCy9bZVId2wteNwjohlFDR/jY6WagpEDA1c1wu4xRc20Hojaxj+V6DSR7gbKxijWA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm-musleabihf": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.77.0.tgz", - "integrity": "sha512-MiAFDFaqR0tmHTAyo0YDcZ5hyLREdYw/RQhc2R3cbT+8O3tB+zqPM2th9TTQ+Uo3jn/embS+DO+HyX9ztCPkOQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm64-gnu": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.77.0.tgz", - "integrity": "sha512-/xqQ3B16i1T4cyt/9Mn+4CpzhUXoBXp7kVpIwzOXNFLj5JmK1bIjsbSnX296Gg8A/o7oDtKWikFgBx0SLwztkw==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm64-musl": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.77.0.tgz", - "integrity": "sha512-LSbwuRKiNCenPDcbARqAZ5RfBy7gmj7vOvfJRLeCDU3gFtSxWbhv/+VTlaUqzUhNj1gFLHB8h7ALnxa/Az6z6g==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-ppc64-gnu": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.77.0.tgz", - "integrity": "sha512-QWdcH31mXEUe5Nq1s0CfCpceaKjIo9uZtwDjAuL681g1axf+5x8xrg/eXWaw//4NCxYZ4V4e5Hu5tvdR+pTBlg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-riscv64-gnu": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.77.0.tgz", - "integrity": "sha512-GnOfYgJxbcElOiPZaDFDl406ONddwvOWk2jvAAAEjwAl4GofNoHF+/HHUIBYa6bFCArlcGPi0XjC4cU1pkgF/Q==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-riscv64-musl": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.77.0.tgz", - "integrity": "sha512-AyEMTUCf0xY+hHF+IxqXFQIX0yQOIR8ykpY0lJNOw9xYqOzUX8dyZfRvlG0RfXwuQn2eonf/8NrMmDSZJjdqsA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-s390x-gnu": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.77.0.tgz", - "integrity": "sha512-sPLzEcNvxd/oyVQ5oZo92CiHkFkpBeRop13E/P3TPY+hZfXHKCOWKI70TE2RYwMKFJDc20EMjH16L7NZICtKTw==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-x64-gnu": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.77.0.tgz", - "integrity": "sha512-1Oh2ssH2L7lwyvkdSqaMUfsGfwU2Wfvew+obBUYjRVqhpBcUpwnsPSEr1IzVi9XqkuY10geiLsNKecqaZC34Dw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-x64-musl": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.77.0.tgz", - "integrity": "sha512-0j/2wRgNGO+Qj/M1uu/p57h/hFTTWWcfie0ufkbabeus2s5+/QqkCflnMOwLLN5m2GsNeWp4xdl4cPa4n7QCOQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-openharmony-arm64": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.77.0.tgz", - "integrity": "sha512-BJ/j54qS0usEnyDkLYURMj2iiD9h5Cyy+ppzeMSXBGRXaGRNWnj1Mw14NqWMR5E/PzdgB30OOCCzLzbRoduafw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-arm64-msvc": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.77.0.tgz", - "integrity": "sha512-Yh8w+g2Lpx7StrvtYkoz9JJvXjB9wxgFChFNb85nrXm/wj/XTwGWS1hve9+900HL7llrntYB3YP+y32E3tRqzA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-ia32-msvc": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.77.0.tgz", - "integrity": "sha512-zja5b7+6a7UsRFgAQSrnax5vrzliEyNPLCjfXONu/vTWswaIVZGFajJZptaeRvPE4LghtFdAzVFlexTm7MVTGA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-x64-msvc": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.77.0.tgz", - "integrity": "sha512-+teyvPDZ2RjUvo+SuCqS/UhaJl1QtdW5fWT5NJTV61V5MIuIS90Db9LixmtEGvXixyttiK62P96MSu3UlpviBw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz", - "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.3", - "is-glob": "^4.0.3", - "node-addon-api": "^7.0.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.6.0", - "@parcel/watcher-darwin-arm64": "2.6.0", - "@parcel/watcher-darwin-x64": "2.6.0", - "@parcel/watcher-freebsd-x64": "2.6.0", - "@parcel/watcher-linux-arm-glibc": "2.6.0", - "@parcel/watcher-linux-arm-musl": "2.6.0", - "@parcel/watcher-linux-arm64-glibc": "2.6.0", - "@parcel/watcher-linux-arm64-musl": "2.6.0", - "@parcel/watcher-linux-x64-glibc": "2.6.0", - "@parcel/watcher-linux-x64-musl": "2.6.0", - "@parcel/watcher-win32-arm64": "2.6.0", - "@parcel/watcher-win32-x64": "2.6.0" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz", - "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz", - "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz", - "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz", - "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz", - "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz", - "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz", - "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz", - "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz", - "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz", - "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz", - "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz", - "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.3.tgz", - "integrity": "sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.3.tgz", - "integrity": "sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.3.tgz", - "integrity": "sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.3.tgz", - "integrity": "sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.3.tgz", - "integrity": "sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.3.tgz", - "integrity": "sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.3.tgz", - "integrity": "sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.3.tgz", - "integrity": "sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.3.tgz", - "integrity": "sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.3.tgz", - "integrity": "sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.3.tgz", - "integrity": "sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.3.tgz", - "integrity": "sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.3.tgz", - "integrity": "sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.3.tgz", - "integrity": "sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.2.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", - "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.5.tgz", - "integrity": "sha512-BOVzne/NL162sMdResB25mUv+vWMF5NoAjNf09TeGlE7ZpszZWSD3winycicLJw72yeVsoCn/2kOhEuCvEShMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rolldown/pluginutils": "^1.0.1" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", - "babel-plugin-react-compiler": "^1.0.0", - "vite": "^8.0.0" - }, - "peerDependenciesMeta": { - "@rolldown/plugin-babel": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true - } - } - }, - "node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/colorjs.io": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", - "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", - "dev": true, - "license": "MIT" - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/immutable": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", - "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lightningcss": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", - "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.33.0", - "lightningcss-darwin-arm64": "1.33.0", - "lightningcss-darwin-x64": "1.33.0", - "lightningcss-freebsd-x64": "1.33.0", - "lightningcss-linux-arm-gnueabihf": "1.33.0", - "lightningcss-linux-arm64-gnu": "1.33.0", - "lightningcss-linux-arm64-musl": "1.33.0", - "lightningcss-linux-x64-gnu": "1.33.0", - "lightningcss-linux-x64-musl": "1.33.0", - "lightningcss-win32-arm64-msvc": "1.33.0", - "lightningcss-win32-x64-msvc": "1.33.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", - "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", - "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", - "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", - "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", - "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", - "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", - "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", - "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", - "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", - "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", - "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/nanoid": { - "version": "3.3.17", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.17.tgz", - "integrity": "sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/oxlint": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.77.0.tgz", - "integrity": "sha512-qnGh8XJHaQ0dprrDXNQZgS0FgjI6v+V3+X8DwmaV++5Aamy6jGKfDdQ1TUvhUxtmKFAbEf4/WeO5QZX+5WSngg==", - "dev": true, - "license": "MIT", - "bin": { - "oxlint": "bin/oxlint" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/Boshen" - }, - "optionalDependencies": { - "@oxlint/binding-android-arm-eabi": "1.77.0", - "@oxlint/binding-android-arm64": "1.77.0", - "@oxlint/binding-darwin-arm64": "1.77.0", - "@oxlint/binding-darwin-x64": "1.77.0", - "@oxlint/binding-freebsd-x64": "1.77.0", - "@oxlint/binding-linux-arm-gnueabihf": "1.77.0", - "@oxlint/binding-linux-arm-musleabihf": "1.77.0", - "@oxlint/binding-linux-arm64-gnu": "1.77.0", - "@oxlint/binding-linux-arm64-musl": "1.77.0", - "@oxlint/binding-linux-ppc64-gnu": "1.77.0", - "@oxlint/binding-linux-riscv64-gnu": "1.77.0", - "@oxlint/binding-linux-riscv64-musl": "1.77.0", - "@oxlint/binding-linux-s390x-gnu": "1.77.0", - "@oxlint/binding-linux-x64-gnu": "1.77.0", - "@oxlint/binding-linux-x64-musl": "1.77.0", - "@oxlint/binding-openharmony-arm64": "1.77.0", - "@oxlint/binding-win32-arm64-msvc": "1.77.0", - "@oxlint/binding-win32-ia32-msvc": "1.77.0", - "@oxlint/binding-win32-x64-msvc": "1.77.0" - }, - "peerDependencies": { - "oxlint-tsgolint": ">=7.0.2001", - "vite-plus": "*" - }, - "peerDependenciesMeta": { - "oxlint-tsgolint": { - "optional": true - }, - "vite-plus": { - "optional": true - } - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", - "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.17", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/react": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", - "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", - "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.8" - } - }, - "node_modules/react-icons": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.7.0.tgz", - "integrity": "sha512-LBLy340Rzqy6+/yVhZKT3B/QpP1BZaesGqasf09HPOBzRarcDIFH0WwXlXQfE7q7ipxK4MSiC5DIBWURCny6fw==", - "license": "MIT", - "peerDependencies": { - "react": "*" - } - }, - "node_modules/readdirp": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", - "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/rolldown": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.3.tgz", - "integrity": "sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "=0.143.0", - "@rolldown/pluginutils": "^1.0.0" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.2.3", - "@rolldown/binding-darwin-arm64": "1.2.3", - "@rolldown/binding-darwin-x64": "1.2.3", - "@rolldown/binding-freebsd-x64": "1.2.3", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.3", - "@rolldown/binding-linux-arm64-gnu": "1.2.3", - "@rolldown/binding-linux-arm64-musl": "1.2.3", - "@rolldown/binding-linux-ppc64-gnu": "1.2.3", - "@rolldown/binding-linux-s390x-gnu": "1.2.3", - "@rolldown/binding-linux-x64-gnu": "1.2.3", - "@rolldown/binding-linux-x64-musl": "1.2.3", - "@rolldown/binding-openharmony-arm64": "1.2.3", - "@rolldown/binding-win32-arm64-msvc": "1.2.3", - "@rolldown/binding-win32-x64-msvc": "1.2.3" - } - }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/sass": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.100.0.tgz", - "integrity": "sha512-B5j0rYMlinhhOo9tjQebMVVn0TfyXAF+wB3b2ggZUuJ/is/Y+7+JGjirAMxHZ9Z3hIP98NPfamlAkBHa1lAaXQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "chokidar": "^5.0.0", - "immutable": "^5.1.5", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=20.19.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" - } - }, - "node_modules/sass-embedded": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.100.0.tgz", - "integrity": "sha512-Ut8wlQSk19tm7jMK6mz6cF1+e+E7tUnW2tM02zQDPnOTcVbV8qCQG8UWxZkkNlY50+hV3hqP24OOkUlMz8xBpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@bufbuild/protobuf": "^2.5.0", - "colorjs.io": "^0.5.0", - "immutable": "^5.1.5", - "rxjs": "^7.4.0", - "supports-color": "^8.1.1", - "sync-child-process": "^1.0.2", - "varint": "^6.0.0" - }, - "bin": { - "sass": "dist/bin/sass.js" - }, - "engines": { - "node": ">=16.0.0" - }, - "optionalDependencies": { - "sass-embedded-all-unknown": "1.100.0", - "sass-embedded-android-arm": "1.100.0", - "sass-embedded-android-arm64": "1.100.0", - "sass-embedded-android-riscv64": "1.100.0", - "sass-embedded-android-x64": "1.100.0", - "sass-embedded-darwin-arm64": "1.100.0", - "sass-embedded-darwin-x64": "1.100.0", - "sass-embedded-linux-arm": "1.100.0", - "sass-embedded-linux-arm64": "1.100.0", - "sass-embedded-linux-musl-arm": "1.100.0", - "sass-embedded-linux-musl-arm64": "1.100.0", - "sass-embedded-linux-musl-riscv64": "1.100.0", - "sass-embedded-linux-musl-x64": "1.100.0", - "sass-embedded-linux-riscv64": "1.100.0", - "sass-embedded-linux-x64": "1.100.0", - "sass-embedded-unknown-all": "1.100.0", - "sass-embedded-win32-arm64": "1.100.0", - "sass-embedded-win32-x64": "1.100.0" - } - }, - "node_modules/sass-embedded-all-unknown": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.100.0.tgz", - "integrity": "sha512-auFtXY/kwYILmSVjtBDwyj0axcLbYYiffOKWoaXHnI5bsYwiRbBh3EneR1rpbX2ZIZCrwX93i5pxKLTZF/662Q==", - "cpu": [ - "!arm", - "!arm64", - "!riscv64", - "!x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "sass": "1.100.0" - } - }, - "node_modules/sass-embedded-android-arm": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.100.0.tgz", - "integrity": "sha512-70f3HgX2pFNmzpGQ86n5e6QfWn2fP4QUQGfFQK0P1XH73ZLIzLo2YqygrGKGKeeqtc5eU2Wl1/xQzhzuKnO4kw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-arm64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.100.0.tgz", - "integrity": "sha512-W+Ru9JwTnfU0UX3jSZcbqFdtKFMcYdfFwytc57h2DgnqCOIiAqI2E06mABZBZC+r3LwXCBuS5GbXAGeVgvVDkA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-riscv64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.100.0.tgz", - "integrity": "sha512-icU3o0V/uCSytSpf+tX5Lf51BvyQEbLzDUJfUi9etSauYBGHpPKkdtdZH0si4v98phq11Kl8rSV1SggksxF1Hg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-x64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.100.0.tgz", - "integrity": "sha512-mevF9VQk6gEYByy8+jusaHGmd7Usb2ytX/DsEOd0JtOGCtcf1kh575xJ6OUBDIcJ15uLnbau/0iy1eP6WVBvWA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-darwin-arm64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.100.0.tgz", - "integrity": "sha512-1PVlYi61POo93IT/FfrG1mc1tAHxeSTyUALF2aOFmXGWjVXr3bQzEQiBGCOvQbj/ix+5hNyXFXcEMEyKvtUJJA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-darwin-x64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.100.0.tgz", - "integrity": "sha512-x97o3JnGyImZNCIVs9wQHJUE5QCvmVIKaH1cwrz/5dK7OT1FpeNiW+u9TUomP9hG6Ekjd8EL8NBHpxTfIhdjmg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-arm": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.100.0.tgz", - "integrity": "sha512-9Ul7O1eKrc5YlhwWjkp8tZPSe3UEwSZ1uwUZOQom1HL0pRlBA6F/IlGZYFTLwnHMIP1fc77MMNaBRfc05mKMpw==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-arm64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.100.0.tgz", - "integrity": "sha512-Dwjmj8Z6VRy7rAi53JAdEwIyUjpfl7PhpSc2/LpQPQx+aO5Dp7Spaipkax0ufJl1SoDUdchCsM4y/88YaluorQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-arm": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.100.0.tgz", - "integrity": "sha512-sl0JgbGloPyJg66XXx5UDSDScZ0oU85DpMQU4JU/sCUCFj1Z8zZ69SJWKTCNE4/jwnce7WI2zPCV5AG+RHOZJw==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-arm64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.100.0.tgz", - "integrity": "sha512-XpACJB2KjSLjf2e9uuvGVdOURsoNrFqgRiihhXyUHK9W0t3LIHb7z5MA/7XGPIT9bWSOO2zyw+rH/FHtDV/Yrg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-riscv64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.100.0.tgz", - "integrity": "sha512-ShvI0Kx04mwoCARwZ0UjiT97isQvzO80tAt91zmFyHLN9kelc/IrQi940farSm2xQVPCKdeVyeG0ekBsokSpYQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-x64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.100.0.tgz", - "integrity": "sha512-TDBCRWNuS4RDLQXvRc1gjZlWiWTWaWGp0Bwu/IKwJxov81lsvrCs3TihTyNXtW7V5aoN4Ky3r0QOkNb3mwmBnA==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-riscv64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.100.0.tgz", - "integrity": "sha512-j4ENJGOheO+fm3j/yorLxCjBP6/XskrZx7dTLlT+lXYwN/qqCqoA/gsNLI0McS3DFM6GBwPiffzWsdWS8t6sEQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-x64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.100.0.tgz", - "integrity": "sha512-0vUSN8j0WGtCJIOPh//EmUvYGHW0QOe5iul8qyhPk50MAcw49MA0r34AhftjDdx94ILPF6vApFs0gwHPQRlpVA==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-unknown-all": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.100.0.tgz", - "integrity": "sha512-c+naBgWId4MIpToXcI0DgqetjdAkwTTAxFAuOaBz7HUXLdyG1oZRrEvSsbe41nEdQOKH0vgofVFCeSQgoXOG9A==", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "!android", - "!darwin", - "!linux", - "!win32" - ], - "dependencies": { - "sass": "1.100.0" - } - }, - "node_modules/sass-embedded-win32-arm64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.100.0.tgz", - "integrity": "sha512-iE+yxj+hUXwwbqpHkXxgAWTzeRfcWxJ7SSTQEPMk48lwq3oCrWLlz5sQuWHbuTK/i0GKQfROdP+hOmPi89yjUg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-win32-x64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.100.0.tgz", - "integrity": "sha512-qI4F8MI7/KYoy9NdjJfhSspG42WPkADSNDvwEV7qWvCSFC83koJssRsKO2/PfY+niZz6BG65Ic/D+A11h959hw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/sync-child-process": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz", - "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "sync-message-port": "^1.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/sync-message-port": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.2.0.tgz", - "integrity": "sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/varint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", - "dev": true, - "license": "MIT" - }, - "node_modules/vite": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.1.tgz", - "integrity": "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==", - "dev": true, - "license": "MIT", - "dependencies": { - "lightningcss": "^1.33.0", - "picomatch": "^4.0.5", - "postcss": "^8.5.25", - "rolldown": "~1.2.1", - "tinyglobby": "^0.2.17" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.4.0", - "esbuild": "^0.27.0 || ^0.28.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - } - } -} diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/package.json b/05_react/unterricht/tag40/03_components-with-event-handler/package.json deleted file mode 100644 index 6e1113e..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/package.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "03_components-with-event-handler", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "lint": "oxlint", - "preview": "vite preview" - }, - "dependencies": { - "react": "^19.2.8", - "react-dom": "^19.2.8", - "react-icons": "^5.7.0" - }, - "devDependencies": { - "@types/react": "^19.2.17", - "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "^6.0.4", - "oxlint": "^1.75.0", - "sass-embedded": "^1.100.0", - "vite": "^8.2.0" - } -} diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/public/favicon.svg b/05_react/unterricht/tag40/03_components-with-event-handler/public/favicon.svg deleted file mode 100644 index 6893eb1..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/public/favicon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/public/icons.svg b/05_react/unterricht/tag40/03_components-with-event-handler/public/icons.svg deleted file mode 100644 index e952219..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/public/icons.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/src/App.jsx b/05_react/unterricht/tag40/03_components-with-event-handler/src/App.jsx deleted file mode 100644 index 49bf653..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/src/App.jsx +++ /dev/null @@ -1,28 +0,0 @@ -import HeaderMain from './components/headers/HeaderMain'; -import FooterMain from './components/footers/FooterMain'; -import Button from './components/buttons/Button'; -import InputAmount from './components/inputs/InputAmount'; -import FormNewsletter from './components/forms/FormNewsletter'; - -function App(props) { - // const { } = props; - - return ( - <> - -
      -
      -

      Components with EventHandler

      -
      - -
      - -
      - -
      -
      - - - ); -} -export default App; diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/src/assets/react.svg b/05_react/unterricht/tag40/03_components-with-event-handler/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/src/assets/vite.svg b/05_react/unterricht/tag40/03_components-with-event-handler/src/assets/vite.svg deleted file mode 100644 index 5101b67..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/src/assets/vite.svg +++ /dev/null @@ -1 +0,0 @@ -Vite diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/src/components/buttons/Button.jsx b/05_react/unterricht/tag40/03_components-with-event-handler/src/components/buttons/Button.jsx deleted file mode 100644 index 557c493..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/src/components/buttons/Button.jsx +++ /dev/null @@ -1,15 +0,0 @@ -const Button = (props) => { - // const { } = props; - - // EventHandlers =========== - const handleClick = (e) => { - alert('button clicked'); - }; - - return ( - - ); -}; -export default Button; diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/src/components/footers/FooterMain.jsx b/05_react/unterricht/tag40/03_components-with-event-handler/src/components/footers/FooterMain.jsx deleted file mode 100644 index 6c746be..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/src/components/footers/FooterMain.jsx +++ /dev/null @@ -1,38 +0,0 @@ -const FooterMain = (props) => { - // const { } = props; - - return ( -
      -
      -
      -
      -
      -

      Address

      -
      -
      -
      -
      -

      Links

      - -
      -
      -
      -
      -

      Socials

      -
      -
      -
      -
      -
      - ); -}; -export default FooterMain; diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/src/components/forms/FormNewsletter.jsx b/05_react/unterricht/tag40/03_components-with-event-handler/src/components/forms/FormNewsletter.jsx deleted file mode 100644 index 04e039d..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/src/components/forms/FormNewsletter.jsx +++ /dev/null @@ -1,29 +0,0 @@ -const FormNewsletter = (props) => { - // const { } = props; - - // EventHandlers ========= - const handleSubmit = (e) => { - e.preventDefault(); - console.log('Form data submit over Fetch/Xhr'); - }; - - return ( -
      -
      -
      -
      - -
      -
      -
      -
      - -
      -
      -
      -
      - ); -}; -export default FormNewsletter; diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/src/components/headers/HeaderMain.jsx b/05_react/unterricht/tag40/03_components-with-event-handler/src/components/headers/HeaderMain.jsx deleted file mode 100644 index cacc690..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/src/components/headers/HeaderMain.jsx +++ /dev/null @@ -1,14 +0,0 @@ -import LogoMain from '../logos/LogoMain'; - -const HeaderMain = (props) => { - // const { } = props; - - return ( -
      -
      - -
      -
      - ); // VIEW -}; -export default HeaderMain; diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/src/components/icons/LogoDonkey.jsx b/05_react/unterricht/tag40/03_components-with-event-handler/src/components/icons/LogoDonkey.jsx deleted file mode 100644 index 958a172..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/src/components/icons/LogoDonkey.jsx +++ /dev/null @@ -1,80 +0,0 @@ -import React from 'react'; - -const LogoDonkey = (props) => { - // const { } = props; - - return ( - - - - - - - - - - - - - - - ); -}; -export default LogoDonkey; diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/src/components/inputs/InputAmount.jsx b/05_react/unterricht/tag40/03_components-with-event-handler/src/components/inputs/InputAmount.jsx deleted file mode 100644 index 516b77a..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/src/components/inputs/InputAmount.jsx +++ /dev/null @@ -1,37 +0,0 @@ -import { FaMinus, FaPlus } from 'react-icons/fa6'; -// npm install react-icons | Auf der npm Seite mit --save, ist nicht mehr nötig -const InputAmount = (props) => { - // const { } = props; - - // EventHandlers ================ - const handleChange = (e) => { - console.log(e); // Event-Objekte wurden um React Methoden und Eigenschaften erweitert. (SyntheticBaseEvent anstatt InputEvent) - console.log(e.target.value); - }; - - return ( -
      -
      - - - - - - - -
      -
      - ); -}; -export default InputAmount; diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/src/components/logos/LogoMain.jsx b/05_react/unterricht/tag40/03_components-with-event-handler/src/components/logos/LogoMain.jsx deleted file mode 100644 index d74f500..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/src/components/logos/LogoMain.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import LogoDonkey from '../icons/LogoDonkey'; - -const LogoMain = (props) => { - // const { } = props; - - return ( -
      - -
      IA - JS Course
      -
      - ); -}; -export default LogoMain; diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/src/main.jsx b/05_react/unterricht/tag40/03_components-with-event-handler/src/main.jsx deleted file mode 100644 index 4f28fd8..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/src/main.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; - -// import von 'main'-Datei -import './styles/main.scss'; - -import App from './App.jsx'; - -createRoot(document.getElementById('root')).render( - - - , -); diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/_index.scss b/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/_index.scss deleted file mode 100644 index dcefbc9..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/_index.scss +++ /dev/null @@ -1,3 +0,0 @@ -// @import 'bootstrap-5.3.8/bootstrap-grid'; -@import 'bootstrap-5.3.8/bootstrap'; -// @import 'bulma-1.04/index' diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss b/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss deleted file mode 100644 index e9f267f..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss +++ /dev/null @@ -1,153 +0,0 @@ -// -// Base styles -// - -.accordion { - // scss-docs-start accordion-css-vars - --#{$prefix}accordion-color: #{$accordion-color}; - --#{$prefix}accordion-bg: #{$accordion-bg}; - --#{$prefix}accordion-transition: #{$accordion-transition}; - --#{$prefix}accordion-border-color: #{$accordion-border-color}; - --#{$prefix}accordion-border-width: #{$accordion-border-width}; - --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; - --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; - --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; - --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; - --#{$prefix}accordion-btn-color: #{$accordion-button-color}; - --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; - --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; - --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; - --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; - --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; - --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; - --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; - --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; - --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; - // scss-docs-end accordion-css-vars -} - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); - @include font-size($font-size-base); - color: var(--#{$prefix}accordion-btn-color); - text-align: left; // Reset button style - background-color: var(--#{$prefix}accordion-btn-bg); - border: 0; - @include border-radius(0); - overflow-anchor: none; - @include transition(var(--#{$prefix}accordion-transition)); - - &:not(.collapsed) { - color: var(--#{$prefix}accordion-active-color); - background-color: var(--#{$prefix}accordion-active-bg); - box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list - - &::after { - background-image: var(--#{$prefix}accordion-btn-active-icon); - transform: var(--#{$prefix}accordion-btn-icon-transform); - } - } - - // Accordion icon - &::after { - flex-shrink: 0; - width: var(--#{$prefix}accordion-btn-icon-width); - height: var(--#{$prefix}accordion-btn-icon-width); - margin-left: auto; - content: ""; - background-image: var(--#{$prefix}accordion-btn-icon); - background-repeat: no-repeat; - background-size: var(--#{$prefix}accordion-btn-icon-width); - @include transition(var(--#{$prefix}accordion-btn-icon-transition)); - } - - &:hover { - z-index: 2; - } - - &:focus { - z-index: 3; - outline: 0; - box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); - } -} - -.accordion-header { - margin-bottom: 0; -} - -.accordion-item { - color: var(--#{$prefix}accordion-color); - background-color: var(--#{$prefix}accordion-bg); - border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); - - &:first-of-type { - @include border-top-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - &:not(:first-of-type) { - border-top: 0; - } - - // Only set a border-radius on the last item if the accordion is collapsed - &:last-of-type { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - &.collapsed { - @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - > .accordion-collapse { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - } - } -} - -.accordion-body { - padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); -} - - -// Flush accordion items -// -// Remove borders and border-radius to keep accordion items edge-to-edge. - -.accordion-flush { - > .accordion-item { - border-right: 0; - border-left: 0; - @include border-radius(0); - - &:first-child { border-top: 0; } - &:last-child { border-bottom: 0; } - - // stylelint-disable selector-max-class - > .accordion-collapse, - > .accordion-header .accordion-button, - > .accordion-header .accordion-button.collapsed { - @include border-radius(0); - } - // stylelint-enable selector-max-class - } -} - -@if $enable-dark-mode { - @include color-mode(dark) { - .accordion-button::after { - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; - } - } -} diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss b/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss deleted file mode 100644 index b8cff9b..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss +++ /dev/null @@ -1,68 +0,0 @@ -// -// Base styles -// - -.alert { - // scss-docs-start alert-css-vars - --#{$prefix}alert-bg: transparent; - --#{$prefix}alert-padding-x: #{$alert-padding-x}; - --#{$prefix}alert-padding-y: #{$alert-padding-y}; - --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; - --#{$prefix}alert-color: inherit; - --#{$prefix}alert-border-color: transparent; - --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); - --#{$prefix}alert-border-radius: #{$alert-border-radius}; - --#{$prefix}alert-link-color: inherit; - // scss-docs-end alert-css-vars - - position: relative; - padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); - margin-bottom: var(--#{$prefix}alert-margin-bottom); - color: var(--#{$prefix}alert-color); - background-color: var(--#{$prefix}alert-bg); - border: var(--#{$prefix}alert-border); - @include border-radius(var(--#{$prefix}alert-border-radius)); -} - -// Headings for larger alerts -.alert-heading { - // Specified to prevent conflicts of changing $headings-color - color: inherit; -} - -// Provide class for links that match alerts -.alert-link { - font-weight: $alert-link-font-weight; - color: var(--#{$prefix}alert-link-color); -} - - -// Dismissible alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissible { - padding-right: $alert-dismissible-padding-r; - - // Adjust close link position - .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: $stretched-link-z-index + 1; - padding: $alert-padding-y * 1.25 $alert-padding-x; - } -} - - -// scss-docs-start alert-modifiers -// Generate contextual modifier classes for colorizing the alert -@each $state in map-keys($theme-colors) { - .alert-#{$state} { - --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); - --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); - --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); - --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); - } -} -// scss-docs-end alert-modifiers diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss b/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss deleted file mode 100644 index cc3d269..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss +++ /dev/null @@ -1,38 +0,0 @@ -// Base class -// -// Requires one of the contextual, color modifier classes for `color` and -// `background-color`. - -.badge { - // scss-docs-start badge-css-vars - --#{$prefix}badge-padding-x: #{$badge-padding-x}; - --#{$prefix}badge-padding-y: #{$badge-padding-y}; - @include rfs($badge-font-size, --#{$prefix}badge-font-size); - --#{$prefix}badge-font-weight: #{$badge-font-weight}; - --#{$prefix}badge-color: #{$badge-color}; - --#{$prefix}badge-border-radius: #{$badge-border-radius}; - // scss-docs-end badge-css-vars - - display: inline-block; - padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x); - @include font-size(var(--#{$prefix}badge-font-size)); - font-weight: var(--#{$prefix}badge-font-weight); - line-height: 1; - color: var(--#{$prefix}badge-color); - text-align: center; - white-space: nowrap; - vertical-align: baseline; - @include border-radius(var(--#{$prefix}badge-border-radius)); - @include gradient-bg(); - - // Empty badges collapse automatically - &:empty { - display: none; - } -} - -// Quick fix for badges in buttons -.btn .badge { - position: relative; - top: -1px; -} diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss b/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss deleted file mode 100644 index b8252ff..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss +++ /dev/null @@ -1,40 +0,0 @@ -.breadcrumb { - // scss-docs-start breadcrumb-css-vars - --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x}; - --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y}; - --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom}; - @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size); - --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg}; - --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius}; - --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color}; - --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x}; - --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color}; - // scss-docs-end breadcrumb-css-vars - - display: flex; - flex-wrap: wrap; - padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x); - margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom); - @include font-size(var(--#{$prefix}breadcrumb-font-size)); - list-style: none; - background-color: var(--#{$prefix}breadcrumb-bg); - @include border-radius(var(--#{$prefix}breadcrumb-border-radius)); -} - -.breadcrumb-item { - // The separator between breadcrumbs (by default, a forward-slash: "/") - + .breadcrumb-item { - padding-left: var(--#{$prefix}breadcrumb-item-padding-x); - - &::before { - float: left; // Suppress inline spacings and underlining of the separator - padding-right: var(--#{$prefix}breadcrumb-item-padding-x); - color: var(--#{$prefix}breadcrumb-divider-color); - content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; - } - } - - &.active { - color: var(--#{$prefix}breadcrumb-item-active-color); - } -} diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss b/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss deleted file mode 100644 index 78e1252..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss +++ /dev/null @@ -1,147 +0,0 @@ -// Make the div behave like a button -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; // match .btn alignment given font-size hack above - - > .btn { - position: relative; - flex: 1 1 auto; - } - - // Bring the hover, focused, and "active" buttons to the front to overlay - // the borders properly - > .btn-check:checked + .btn, - > .btn-check:focus + .btn, - > .btn:hover, - > .btn:focus, - > .btn:active, - > .btn.active { - z-index: 1; - } -} - -// Optional: Group multiple button groups together for a toolbar -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; - - .input-group { - width: auto; - } -} - -.btn-group { - @include border-radius($btn-border-radius); - - // Prevent double borders when buttons are next to each other - > :not(.btn-check:first-child) + .btn, - > .btn-group:not(:first-child) { - margin-left: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn.dropdown-toggle-split:first-child, - > .btn-group:not(:last-child) > .btn { - @include border-end-radius(0); - } - - // The left radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-start-radius(0); - } -} - -// Sizing -// -// Remix the default button sizing classes into new ones for easier manipulation. - -.btn-group-sm > .btn { @extend .btn-sm; } -.btn-group-lg > .btn { @extend .btn-lg; } - - -// -// Split button dropdowns -// - -.dropdown-toggle-split { - padding-right: $btn-padding-x * .75; - padding-left: $btn-padding-x * .75; - - &::after, - .dropup &::after, - .dropend &::after { - margin-left: 0; - } - - .dropstart &::before { - margin-right: 0; - } -} - -.btn-sm + .dropdown-toggle-split { - padding-right: $btn-padding-x-sm * .75; - padding-left: $btn-padding-x-sm * .75; -} - -.btn-lg + .dropdown-toggle-split { - padding-right: $btn-padding-x-lg * .75; - padding-left: $btn-padding-x-lg * .75; -} - - -// The clickable button for toggling the menu -// Set the same inset shadow as the :active state -.btn-group.show .dropdown-toggle { - @include box-shadow($btn-active-box-shadow); - - // Show no shadow for `.btn-link` since it has no other button styles. - &.btn-link { - @include box-shadow(none); - } -} - - -// -// Vertical button groups -// - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; - - > .btn, - > .btn-group { - width: 100%; - } - - > .btn:not(:first-child), - > .btn-group:not(:first-child) { - margin-top: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn-group:not(:last-child) > .btn { - @include border-bottom-radius(0); - } - - // The top radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-top-radius(0); - } -} diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss b/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss deleted file mode 100644 index caa4518..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss +++ /dev/null @@ -1,216 +0,0 @@ -// -// Base styles -// - -.btn { - // scss-docs-start btn-css-vars - --#{$prefix}btn-padding-x: #{$btn-padding-x}; - --#{$prefix}btn-padding-y: #{$btn-padding-y}; - --#{$prefix}btn-font-family: #{$btn-font-family}; - @include rfs($btn-font-size, --#{$prefix}btn-font-size); - --#{$prefix}btn-font-weight: #{$btn-font-weight}; - --#{$prefix}btn-line-height: #{$btn-line-height}; - --#{$prefix}btn-color: #{$btn-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-width: #{$btn-border-width}; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-border-radius: #{$btn-border-radius}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-box-shadow: #{$btn-box-shadow}; - --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity}; - --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5); - // scss-docs-end btn-css-vars - - display: inline-block; - padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x); - font-family: var(--#{$prefix}btn-font-family); - @include font-size(var(--#{$prefix}btn-font-size)); - font-weight: var(--#{$prefix}btn-font-weight); - line-height: var(--#{$prefix}btn-line-height); - color: var(--#{$prefix}btn-color); - text-align: center; - text-decoration: if($link-decoration == none, null, none); - white-space: $btn-white-space; - vertical-align: middle; - cursor: if($enable-button-pointers, pointer, null); - user-select: none; - border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color); - @include border-radius(var(--#{$prefix}btn-border-radius)); - @include gradient-bg(var(--#{$prefix}btn-bg)); - @include box-shadow(var(--#{$prefix}btn-box-shadow)); - @include transition($btn-transition); - - &:hover { - color: var(--#{$prefix}btn-hover-color); - text-decoration: if($link-hover-decoration == underline, none, null); - background-color: var(--#{$prefix}btn-hover-bg); - border-color: var(--#{$prefix}btn-hover-border-color); - } - - .btn-check + &:hover { - // override for the checkbox/radio buttons - color: var(--#{$prefix}btn-color); - background-color: var(--#{$prefix}btn-bg); - border-color: var(--#{$prefix}btn-border-color); - } - - &:focus-visible { - color: var(--#{$prefix}btn-hover-color); - @include gradient-bg(var(--#{$prefix}btn-hover-bg)); - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:focus-visible + & { - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:checked + &, - :not(.btn-check) + &:active, - &:first-child:active, - &.active, - &.show { - color: var(--#{$prefix}btn-active-color); - background-color: var(--#{$prefix}btn-active-bg); - // Remove CSS gradients if they're enabled - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-active-border-color); - @include box-shadow(var(--#{$prefix}btn-active-shadow)); - - &:focus-visible { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - } - - .btn-check:checked:focus-visible + & { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - &:disabled, - &.disabled, - fieldset:disabled & { - color: var(--#{$prefix}btn-disabled-color); - pointer-events: none; - background-color: var(--#{$prefix}btn-disabled-bg); - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-disabled-border-color); - opacity: var(--#{$prefix}btn-disabled-opacity); - @include box-shadow(none); - } -} - - -// -// Alternate buttons -// - -// scss-docs-start btn-variant-loops -@each $color, $value in $theme-colors { - .btn-#{$color} { - @if $color == "light" { - @include button-variant( - $value, - $value, - $hover-background: shade-color($value, $btn-hover-bg-shade-amount), - $hover-border: shade-color($value, $btn-hover-border-shade-amount), - $active-background: shade-color($value, $btn-active-bg-shade-amount), - $active-border: shade-color($value, $btn-active-border-shade-amount) - ); - } @else if $color == "dark" { - @include button-variant( - $value, - $value, - $hover-background: tint-color($value, $btn-hover-bg-tint-amount), - $hover-border: tint-color($value, $btn-hover-border-tint-amount), - $active-background: tint-color($value, $btn-active-bg-tint-amount), - $active-border: tint-color($value, $btn-active-border-tint-amount) - ); - } @else { - @include button-variant($value, $value); - } - } -} - -@each $color, $value in $theme-colors { - .btn-outline-#{$color} { - @include button-outline-variant($value); - } -} -// scss-docs-end btn-variant-loops - - -// -// Link buttons -// - -// Make a button look and behave like a link -.btn-link { - --#{$prefix}btn-font-weight: #{$font-weight-normal}; - --#{$prefix}btn-color: #{$btn-link-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-hover-color: #{$btn-link-hover-color}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-active-color: #{$btn-link-hover-color}; - --#{$prefix}btn-active-border-color: transparent; - --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color}; - --#{$prefix}btn-disabled-border-color: transparent; - --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows - --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb}; - - text-decoration: $link-decoration; - @if $enable-gradients { - background-image: none; - } - - &:hover, - &:focus-visible { - text-decoration: $link-hover-decoration; - } - - &:focus-visible { - color: var(--#{$prefix}btn-color); - } - - &:hover { - color: var(--#{$prefix}btn-hover-color); - } - - // No need for an active state here -} - - -// -// Button Sizes -// - -.btn-lg { - @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); -} - -.btn-sm { - @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); -} diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss b/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss deleted file mode 100644 index dcebe6a..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss +++ /dev/null @@ -1,238 +0,0 @@ -// -// Base styles -// - -.card { - // scss-docs-start card-css-vars - --#{$prefix}card-spacer-y: #{$card-spacer-y}; - --#{$prefix}card-spacer-x: #{$card-spacer-x}; - --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y}; - --#{$prefix}card-title-color: #{$card-title-color}; - --#{$prefix}card-subtitle-color: #{$card-subtitle-color}; - --#{$prefix}card-border-width: #{$card-border-width}; - --#{$prefix}card-border-color: #{$card-border-color}; - --#{$prefix}card-border-radius: #{$card-border-radius}; - --#{$prefix}card-box-shadow: #{$card-box-shadow}; - --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius}; - --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y}; - --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x}; - --#{$prefix}card-cap-bg: #{$card-cap-bg}; - --#{$prefix}card-cap-color: #{$card-cap-color}; - --#{$prefix}card-height: #{$card-height}; - --#{$prefix}card-color: #{$card-color}; - --#{$prefix}card-bg: #{$card-bg}; - --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding}; - --#{$prefix}card-group-margin: #{$card-group-margin}; - // scss-docs-end card-css-vars - - position: relative; - display: flex; - flex-direction: column; - min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 - height: var(--#{$prefix}card-height); - color: var(--#{$prefix}body-color); - word-wrap: break-word; - background-color: var(--#{$prefix}card-bg); - background-clip: border-box; - border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - @include border-radius(var(--#{$prefix}card-border-radius)); - @include box-shadow(var(--#{$prefix}card-box-shadow)); - - > hr { - margin-right: 0; - margin-left: 0; - } - - > .list-group { - border-top: inherit; - border-bottom: inherit; - - &:first-child { - border-top-width: 0; - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); - } - - &:last-child { - border-bottom-width: 0; - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); - } - } - - // Due to specificity of the above selector (`.card > .list-group`), we must - // use a child selector here to prevent double borders. - > .card-header + .list-group, - > .list-group + .card-footer { - border-top: 0; - } -} - -.card-body { - // Enable `flex-grow: 1` for decks and groups so that card blocks take up - // as much space as possible, ensuring footers are aligned to the bottom. - flex: 1 1 auto; - padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x); - color: var(--#{$prefix}card-color); -} - -.card-title { - margin-bottom: var(--#{$prefix}card-title-spacer-y); - color: var(--#{$prefix}card-title-color); -} - -.card-subtitle { - margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list - margin-bottom: 0; - color: var(--#{$prefix}card-subtitle-color); -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link { - &:hover { - text-decoration: if($link-hover-decoration == underline, none, null); - } - - + .card-link { - margin-left: var(--#{$prefix}card-spacer-x); - } -} - -// -// Optional textual caps -// - -.card-header { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - margin-bottom: 0; // Removes the default margin-bottom of - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:first-child { - @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0); - } -} - -.card-footer { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:last-child { - @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius)); - } -} - - -// -// Header navs -// - -.card-header-tabs { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - border-bottom: 0; - - .nav-link.active { - background-color: var(--#{$prefix}card-bg); - border-bottom-color: var(--#{$prefix}card-bg); - } -} - -.card-header-pills { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list -} - -// Card image -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: var(--#{$prefix}card-img-overlay-padding); - @include border-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch -} - -.card-img, -.card-img-top { - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-bottom { - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); -} - - -// -// Card groups -// - -.card-group { - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - margin-bottom: var(--#{$prefix}card-group-margin); - } - - @include media-breakpoint-up(sm) { - display: flex; - flex-flow: row wrap; - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - flex: 1 0 0; - margin-bottom: 0; - - + .card { - margin-left: 0; - border-left: 0; - } - - // Handle rounded corners - @if $enable-rounded { - &:not(:last-child) { - @include border-end-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-right-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-right-radius: 0; - } - } - - &:not(:first-child) { - @include border-start-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-left-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-left-radius: 0; - } - } - } - } - } -} diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss b/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss deleted file mode 100644 index 5ebf6b1..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss +++ /dev/null @@ -1,226 +0,0 @@ -// Notes on the classes: -// -// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) -// even when their scroll action started on a carousel, but for compatibility (with Firefox) -// we're preventing all actions instead -// 2. The .carousel-item-start and .carousel-item-end is used to indicate where -// the active slide is heading. -// 3. .active.carousel-item is the current slide. -// 4. .active.carousel-item-start and .active.carousel-item-end is the current -// slide in its in-transition state. Only one of these occurs at a time. -// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end -// is the upcoming slide in transition. - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; - @include clearfix(); -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - @include transition($carousel-transition); -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); -} - - -// -// Alternate transitions -// - -.carousel-fade { - .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; - } - - .carousel-item.active, - .carousel-item-next.carousel-item-start, - .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; - } - - .active.carousel-item-start, - .active.carousel-item-end { - z-index: 0; - opacity: 0; - @include transition(opacity 0s $carousel-transition-duration); - } -} - - -// -// Left/right controls for nav -// - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - // Use flex for alignment (1-3) - display: flex; // 1. allow flex styles - align-items: center; // 2. vertically center contents - justify-content: center; // 3. horizontally center contents - width: $carousel-control-width; - padding: 0; - color: $carousel-control-color; - text-align: center; - background: none; - filter: var(--#{$prefix}carousel-control-icon-filter); - border: 0; - opacity: $carousel-control-opacity; - @include transition($carousel-control-transition); - - // Hover/focus state - &:hover, - &:focus { - color: $carousel-control-color; - text-decoration: none; - outline: 0; - opacity: $carousel-control-hover-opacity; - } -} -.carousel-control-prev { - left: 0; - background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); -} -.carousel-control-next { - right: 0; - background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); -} - -// Icons for within -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: $carousel-control-icon-width; - height: $carousel-control-icon-width; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; -} - -.carousel-control-prev-icon { - background-image: escape-svg($carousel-control-prev-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-next-icon-bg) + "*/"}; -} -.carousel-control-next-icon { - background-image: escape-svg($carousel-control-next-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-prev-icon-bg) + "*/"}; -} - -// Optional indicator pips/controls -// -// Add a container (such as a list) with the following class and add an item (ideally a focusable control, -// like a button) with data-bs-target for each slide your carousel holds. - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - // Use the .carousel-control's width as margin so we don't overlay those - margin-right: $carousel-control-width; - margin-bottom: 1rem; - margin-left: $carousel-control-width; - - [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: $carousel-indicator-width; - height: $carousel-indicator-height; - padding: 0; - margin-right: $carousel-indicator-spacer; - margin-left: $carousel-indicator-spacer; - text-indent: -999px; - cursor: pointer; - background-color: var(--#{$prefix}carousel-indicator-active-bg); - background-clip: padding-box; - border: 0; - // Use transparent borders to increase the hit area by 10px on top and bottom. - border-top: $carousel-indicator-hit-area-height solid transparent; - border-bottom: $carousel-indicator-hit-area-height solid transparent; - opacity: $carousel-indicator-opacity; - @include transition($carousel-indicator-transition); - } - - .active { - opacity: $carousel-indicator-active-opacity; - } -} - - -// Optional captions -// -// - -.carousel-caption { - position: absolute; - right: (100% - $carousel-caption-width) * .5; - bottom: $carousel-caption-spacer; - left: (100% - $carousel-caption-width) * .5; - padding-top: $carousel-caption-padding-y; - padding-bottom: $carousel-caption-padding-y; - color: var(--#{$prefix}carousel-caption-color); - text-align: center; -} - -// Dark mode carousel - -@mixin carousel-dark() { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg-dark}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color-dark}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter-dark}; -} - -.carousel-dark { - @include carousel-dark(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include carousel-dark(); - } -} diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss b/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss deleted file mode 100644 index d53c96f..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss +++ /dev/null @@ -1,66 +0,0 @@ -// Transparent background and border properties included for button version. -// iOS requires the button element instead of an anchor tag. -// If you want the anchor version, it requires `href="#"`. -// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile - -.btn-close { - // scss-docs-start close-css-vars - --#{$prefix}btn-close-color: #{$btn-close-color}; - --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) }; - --#{$prefix}btn-close-opacity: #{$btn-close-opacity}; - --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity}; - --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow}; - --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity}; - --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity}; - // scss-docs-end close-css-vars - - box-sizing: content-box; - width: $btn-close-width; - height: $btn-close-height; - padding: $btn-close-padding-y $btn-close-padding-x; - color: var(--#{$prefix}btn-close-color); - background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements - filter: var(--#{$prefix}btn-close-filter); - border: 0; // for button elements - @include border-radius(); - opacity: var(--#{$prefix}btn-close-opacity); - - // Override 's hover style - &:hover { - color: var(--#{$prefix}btn-close-color); - text-decoration: none; - opacity: var(--#{$prefix}btn-close-hover-opacity); - } - - &:focus { - outline: 0; - box-shadow: var(--#{$prefix}btn-close-focus-shadow); - opacity: var(--#{$prefix}btn-close-focus-opacity); - } - - &:disabled, - &.disabled { - pointer-events: none; - user-select: none; - opacity: var(--#{$prefix}btn-close-disabled-opacity); - } -} - -@mixin btn-close-white() { - --#{$prefix}btn-close-filter: #{$btn-close-filter-dark}; -} - -.btn-close-white { - @include btn-close-white(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}btn-close-filter: #{$btn-close-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include btn-close-white(); - } -} diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss b/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss deleted file mode 100644 index 83b3138..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss +++ /dev/null @@ -1,41 +0,0 @@ -// Container widths -// -// Set the container width, and override it for fixed navbars in media queries. - -@if $enable-container-classes { - // Single container class with breakpoint max-widths - .container, - // 100% wide container at all breakpoints - .container-fluid { - @include make-container(); - } - - // Responsive containers that are 100% wide until a breakpoint - @each $breakpoint, $container-max-width in $container-max-widths { - .container-#{$breakpoint} { - @extend .container-fluid; - } - - @include media-breakpoint-up($breakpoint, $grid-breakpoints) { - %responsive-container-#{$breakpoint} { - max-width: $container-max-width; - } - - // Extend each breakpoint which is smaller or equal to the current breakpoint - $extend-breakpoint: true; - - @each $name, $width in $grid-breakpoints { - @if ($extend-breakpoint) { - .container#{breakpoint-infix($name, $grid-breakpoints)} { - @extend %responsive-container-#{$breakpoint}; - } - - // Once the current breakpoint is reached, stop extending - @if ($breakpoint == $name) { - $extend-breakpoint: false; - } - } - } - } - } -} diff --git a/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss b/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss deleted file mode 100644 index 587ebb4..0000000 --- a/05_react/unterricht/tag40/03_components-with-event-handler/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss +++ /dev/null @@ -1,250 +0,0 @@ -// The dropdown wrapper (`
      `) -.dropup, -.dropend, -.dropdown, -.dropstart, -.dropup-center, -.dropdown-center { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; - - // Generate the caret automatically - @include caret(); -} - -// The dropdown menu -.dropdown-menu { - // scss-docs-start dropdown-css-vars - --#{$prefix}dropdown-zindex: #{$zindex-dropdown}; - --#{$prefix}dropdown-min-width: #{$dropdown-min-width}; - --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x}; - --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y}; - --#{$prefix}dropdown-spacer: #{$dropdown-spacer}; - @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size); - --#{$prefix}dropdown-color: #{$dropdown-color}; - --#{$prefix}dropdown-bg: #{$dropdown-bg}; - --#{$prefix}dropdown-border-color: #{$dropdown-border-color}; - --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius}; - --#{$prefix}dropdown-border-width: #{$dropdown-border-width}; - --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius}; - --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg}; - --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y}; - --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow}; - --#{$prefix}dropdown-link-color: #{$dropdown-link-color}; - --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color}; - --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg}; - --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color}; - --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg}; - --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color}; - --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x}; - --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y}; - --#{$prefix}dropdown-header-color: #{$dropdown-header-color}; - --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x}; - --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y}; - // scss-docs-end dropdown-css-vars - - position: absolute; - z-index: var(--#{$prefix}dropdown-zindex); - display: none; // none by default, but block on "open" of the menu - min-width: var(--#{$prefix}dropdown-min-width); - padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x); - margin: 0; // Override default margin of ul - @include font-size(var(--#{$prefix}dropdown-font-size)); - color: var(--#{$prefix}dropdown-color); - text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) - list-style: none; - background-color: var(--#{$prefix}dropdown-bg); - background-clip: padding-box; - border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color); - @include border-radius(var(--#{$prefix}dropdown-border-radius)); - @include box-shadow(var(--#{$prefix}dropdown-box-shadow)); - - &[data-bs-popper] { - top: 100%; - left: 0; - margin-top: var(--#{$prefix}dropdown-spacer); - } - - @if $dropdown-padding-y == 0 { - > .dropdown-item:first-child, - > li:first-child .dropdown-item { - @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - > .dropdown-item:last-child, - > li:last-child .dropdown-item { - @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - - } -} - -// scss-docs-start responsive-breakpoints -// We deliberately hardcode the `bs-` prefix because we check -// this custom property in JS to determine Popper's positioning - -@each $breakpoint in map-keys($grid-breakpoints) { - @include media-breakpoint-up($breakpoint) { - $infix: breakpoint-infix($breakpoint, $grid-breakpoints); - - .dropdown-menu#{$infix}-start { - --bs-position: start; - - &[data-bs-popper] { - right: auto; - left: 0; - } - } - - .dropdown-menu#{$infix}-end { - --bs-position: end; - - &[data-bs-popper] { - right: 0; - left: auto; - } - } - } -} -// scss-docs-end responsive-breakpoints - -// Allow for dropdowns to go bottom up (aka, dropup-menu) -// Just add .dropup after the standard .dropdown class and you're set. -.dropup { - .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(up); - } -} - -.dropend { - .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(end); - &::after { - vertical-align: 0; - } - } -} - -.dropstart { - .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(start); - &::before { - vertical-align: 0; - } - } -} - - -// Dividers (basically an `
      `) within the dropdown -.dropdown-divider { - height: 0; - margin: var(--#{$prefix}dropdown-divider-margin-y) 0; - overflow: hidden; - border-top: 1px solid var(--#{$prefix}dropdown-divider-bg); - opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
      element -} - -// Links, buttons, and more within the dropdown menu -// -// `
      ` alignment by inheriting `text-align`. -// 3. Fix alignment for Safari - -th { - font-weight: $table-th-font-weight; // 1 - text-align: inherit; // 2 - text-align: -webkit-match-parent; // 3 -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - - -// Forms -// -// 1. Allow labels to use `margin` for spacing. - -label { - display: inline-block; // 1 -} - -// Remove the default `border-radius` that macOS Chrome adds. -// See https://github.com/twbs/bootstrap/issues/24093 - -button { - // stylelint-disable-next-line property-disallowed-list - border-radius: 0; -} - -// Explicitly remove focus outline in Chromium when it shouldn't be -// visible (e.g. as result of mouse click or touch tap). It already -// should be doing this automatically, but seems to currently be -// confused and applies its very visible two-tone outline anyway. - -button:focus:not(:focus-visible) { - outline: 0; -} - -// 1. Remove the margin in Firefox and Safari - -input, -button, -select, -optgroup, -textarea { - margin: 0; // 1 - font-family: inherit; - @include font-size(inherit); - line-height: inherit; -} - -// Remove the inheritance of text transform in Firefox -button, -select { - text-transform: none; -} -// Set the cursor for non-` - ); -}; -export default Button; diff --git a/05_react/unterricht/tag40/04_components-with-hooks/src/components/examples/ExampleUseState.jsx b/05_react/unterricht/tag40/04_components-with-hooks/src/components/examples/ExampleUseState.jsx deleted file mode 100644 index 8a9487b..0000000 --- a/05_react/unterricht/tag40/04_components-with-hooks/src/components/examples/ExampleUseState.jsx +++ /dev/null @@ -1,41 +0,0 @@ -import { useState } from 'react'; - -import { FaPlus, FaMinus } from 'react-icons/fa6'; - -const ExampleUseState = (props) => { - // const { } = props; - - const [counter, setCounter] = useState(0); - - // let counter = 0; - - // EventHandler ======= - const handleClick = (e) => { - console.log('click'); - const btn = e.currentTarget; - const label = btn.ariaLabel; - - switch (label) { - case 'Increase': - // setCounter(counter + 1); // setter(value) - setCounter((prevState) => prevState + 1); // setter(fn(prevValue) => newValue ) - break; - case 'Decrease': - setCounter(counter - 1); - break; - } - }; - - return ( -
      - Counter: {counter} - - -
      - ); -}; -export default ExampleUseState; diff --git a/05_react/unterricht/tag40/04_components-with-hooks/src/components/footers/FooterMain.jsx b/05_react/unterricht/tag40/04_components-with-hooks/src/components/footers/FooterMain.jsx deleted file mode 100644 index 6c746be..0000000 --- a/05_react/unterricht/tag40/04_components-with-hooks/src/components/footers/FooterMain.jsx +++ /dev/null @@ -1,38 +0,0 @@ -const FooterMain = (props) => { - // const { } = props; - - return ( -
      -
      -
      -
      -
      -

      Address

      -
      -
      -
      -
      -

      Links

      - -
      -
      -
      -
      -

      Socials

      -
      -
      -
      -
      -
      - ); -}; -export default FooterMain; diff --git a/05_react/unterricht/tag40/04_components-with-hooks/src/components/forms/FormNewsletter.jsx b/05_react/unterricht/tag40/04_components-with-hooks/src/components/forms/FormNewsletter.jsx deleted file mode 100644 index 04e039d..0000000 --- a/05_react/unterricht/tag40/04_components-with-hooks/src/components/forms/FormNewsletter.jsx +++ /dev/null @@ -1,29 +0,0 @@ -const FormNewsletter = (props) => { - // const { } = props; - - // EventHandlers ========= - const handleSubmit = (e) => { - e.preventDefault(); - console.log('Form data submit over Fetch/Xhr'); - }; - - return ( -
      -
      -
      -
      - -
      -
      -
      -
      - -
      -
      -
      -
      - ); -}; -export default FormNewsletter; diff --git a/05_react/unterricht/tag40/04_components-with-hooks/src/components/headers/HeaderMain.jsx b/05_react/unterricht/tag40/04_components-with-hooks/src/components/headers/HeaderMain.jsx deleted file mode 100644 index cacc690..0000000 --- a/05_react/unterricht/tag40/04_components-with-hooks/src/components/headers/HeaderMain.jsx +++ /dev/null @@ -1,14 +0,0 @@ -import LogoMain from '../logos/LogoMain'; - -const HeaderMain = (props) => { - // const { } = props; - - return ( -
      -
      - -
      -
      - ); // VIEW -}; -export default HeaderMain; diff --git a/05_react/unterricht/tag40/04_components-with-hooks/src/components/icons/LogoDonkey.jsx b/05_react/unterricht/tag40/04_components-with-hooks/src/components/icons/LogoDonkey.jsx deleted file mode 100644 index 958a172..0000000 --- a/05_react/unterricht/tag40/04_components-with-hooks/src/components/icons/LogoDonkey.jsx +++ /dev/null @@ -1,80 +0,0 @@ -import React from 'react'; - -const LogoDonkey = (props) => { - // const { } = props; - - return ( - - - - - - - - - - - - - - - ); -}; -export default LogoDonkey; diff --git a/05_react/unterricht/tag40/04_components-with-hooks/src/components/inputs/InputAmount.jsx b/05_react/unterricht/tag40/04_components-with-hooks/src/components/inputs/InputAmount.jsx deleted file mode 100644 index 516b77a..0000000 --- a/05_react/unterricht/tag40/04_components-with-hooks/src/components/inputs/InputAmount.jsx +++ /dev/null @@ -1,37 +0,0 @@ -import { FaMinus, FaPlus } from 'react-icons/fa6'; -// npm install react-icons | Auf der npm Seite mit --save, ist nicht mehr nötig -const InputAmount = (props) => { - // const { } = props; - - // EventHandlers ================ - const handleChange = (e) => { - console.log(e); // Event-Objekte wurden um React Methoden und Eigenschaften erweitert. (SyntheticBaseEvent anstatt InputEvent) - console.log(e.target.value); - }; - - return ( -
      -
      - - - - - - - -
      -
      - ); -}; -export default InputAmount; diff --git a/05_react/unterricht/tag40/04_components-with-hooks/src/components/logos/LogoMain.jsx b/05_react/unterricht/tag40/04_components-with-hooks/src/components/logos/LogoMain.jsx deleted file mode 100644 index d74f500..0000000 --- a/05_react/unterricht/tag40/04_components-with-hooks/src/components/logos/LogoMain.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import LogoDonkey from '../icons/LogoDonkey'; - -const LogoMain = (props) => { - // const { } = props; - - return ( -
      - -
      IA - JS Course
      -
      - ); -}; -export default LogoMain; diff --git a/05_react/unterricht/tag40/04_components-with-hooks/src/main.jsx b/05_react/unterricht/tag40/04_components-with-hooks/src/main.jsx deleted file mode 100644 index 4f28fd8..0000000 --- a/05_react/unterricht/tag40/04_components-with-hooks/src/main.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; - -// import von 'main'-Datei -import './styles/main.scss'; - -import App from './App.jsx'; - -createRoot(document.getElementById('root')).render( - - - , -); diff --git a/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/_index.scss b/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/_index.scss deleted file mode 100644 index dcefbc9..0000000 --- a/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/_index.scss +++ /dev/null @@ -1,3 +0,0 @@ -// @import 'bootstrap-5.3.8/bootstrap-grid'; -@import 'bootstrap-5.3.8/bootstrap'; -// @import 'bulma-1.04/index' diff --git a/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss b/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss deleted file mode 100644 index e9f267f..0000000 --- a/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss +++ /dev/null @@ -1,153 +0,0 @@ -// -// Base styles -// - -.accordion { - // scss-docs-start accordion-css-vars - --#{$prefix}accordion-color: #{$accordion-color}; - --#{$prefix}accordion-bg: #{$accordion-bg}; - --#{$prefix}accordion-transition: #{$accordion-transition}; - --#{$prefix}accordion-border-color: #{$accordion-border-color}; - --#{$prefix}accordion-border-width: #{$accordion-border-width}; - --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; - --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; - --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; - --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; - --#{$prefix}accordion-btn-color: #{$accordion-button-color}; - --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; - --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; - --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; - --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; - --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; - --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; - --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; - --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; - --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; - // scss-docs-end accordion-css-vars -} - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); - @include font-size($font-size-base); - color: var(--#{$prefix}accordion-btn-color); - text-align: left; // Reset button style - background-color: var(--#{$prefix}accordion-btn-bg); - border: 0; - @include border-radius(0); - overflow-anchor: none; - @include transition(var(--#{$prefix}accordion-transition)); - - &:not(.collapsed) { - color: var(--#{$prefix}accordion-active-color); - background-color: var(--#{$prefix}accordion-active-bg); - box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list - - &::after { - background-image: var(--#{$prefix}accordion-btn-active-icon); - transform: var(--#{$prefix}accordion-btn-icon-transform); - } - } - - // Accordion icon - &::after { - flex-shrink: 0; - width: var(--#{$prefix}accordion-btn-icon-width); - height: var(--#{$prefix}accordion-btn-icon-width); - margin-left: auto; - content: ""; - background-image: var(--#{$prefix}accordion-btn-icon); - background-repeat: no-repeat; - background-size: var(--#{$prefix}accordion-btn-icon-width); - @include transition(var(--#{$prefix}accordion-btn-icon-transition)); - } - - &:hover { - z-index: 2; - } - - &:focus { - z-index: 3; - outline: 0; - box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); - } -} - -.accordion-header { - margin-bottom: 0; -} - -.accordion-item { - color: var(--#{$prefix}accordion-color); - background-color: var(--#{$prefix}accordion-bg); - border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); - - &:first-of-type { - @include border-top-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - &:not(:first-of-type) { - border-top: 0; - } - - // Only set a border-radius on the last item if the accordion is collapsed - &:last-of-type { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - &.collapsed { - @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - > .accordion-collapse { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - } - } -} - -.accordion-body { - padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); -} - - -// Flush accordion items -// -// Remove borders and border-radius to keep accordion items edge-to-edge. - -.accordion-flush { - > .accordion-item { - border-right: 0; - border-left: 0; - @include border-radius(0); - - &:first-child { border-top: 0; } - &:last-child { border-bottom: 0; } - - // stylelint-disable selector-max-class - > .accordion-collapse, - > .accordion-header .accordion-button, - > .accordion-header .accordion-button.collapsed { - @include border-radius(0); - } - // stylelint-enable selector-max-class - } -} - -@if $enable-dark-mode { - @include color-mode(dark) { - .accordion-button::after { - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; - } - } -} diff --git a/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss b/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss deleted file mode 100644 index b8cff9b..0000000 --- a/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss +++ /dev/null @@ -1,68 +0,0 @@ -// -// Base styles -// - -.alert { - // scss-docs-start alert-css-vars - --#{$prefix}alert-bg: transparent; - --#{$prefix}alert-padding-x: #{$alert-padding-x}; - --#{$prefix}alert-padding-y: #{$alert-padding-y}; - --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; - --#{$prefix}alert-color: inherit; - --#{$prefix}alert-border-color: transparent; - --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); - --#{$prefix}alert-border-radius: #{$alert-border-radius}; - --#{$prefix}alert-link-color: inherit; - // scss-docs-end alert-css-vars - - position: relative; - padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); - margin-bottom: var(--#{$prefix}alert-margin-bottom); - color: var(--#{$prefix}alert-color); - background-color: var(--#{$prefix}alert-bg); - border: var(--#{$prefix}alert-border); - @include border-radius(var(--#{$prefix}alert-border-radius)); -} - -// Headings for larger alerts -.alert-heading { - // Specified to prevent conflicts of changing $headings-color - color: inherit; -} - -// Provide class for links that match alerts -.alert-link { - font-weight: $alert-link-font-weight; - color: var(--#{$prefix}alert-link-color); -} - - -// Dismissible alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissible { - padding-right: $alert-dismissible-padding-r; - - // Adjust close link position - .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: $stretched-link-z-index + 1; - padding: $alert-padding-y * 1.25 $alert-padding-x; - } -} - - -// scss-docs-start alert-modifiers -// Generate contextual modifier classes for colorizing the alert -@each $state in map-keys($theme-colors) { - .alert-#{$state} { - --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); - --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); - --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); - --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); - } -} -// scss-docs-end alert-modifiers diff --git a/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss b/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss deleted file mode 100644 index cc3d269..0000000 --- a/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss +++ /dev/null @@ -1,38 +0,0 @@ -// Base class -// -// Requires one of the contextual, color modifier classes for `color` and -// `background-color`. - -.badge { - // scss-docs-start badge-css-vars - --#{$prefix}badge-padding-x: #{$badge-padding-x}; - --#{$prefix}badge-padding-y: #{$badge-padding-y}; - @include rfs($badge-font-size, --#{$prefix}badge-font-size); - --#{$prefix}badge-font-weight: #{$badge-font-weight}; - --#{$prefix}badge-color: #{$badge-color}; - --#{$prefix}badge-border-radius: #{$badge-border-radius}; - // scss-docs-end badge-css-vars - - display: inline-block; - padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x); - @include font-size(var(--#{$prefix}badge-font-size)); - font-weight: var(--#{$prefix}badge-font-weight); - line-height: 1; - color: var(--#{$prefix}badge-color); - text-align: center; - white-space: nowrap; - vertical-align: baseline; - @include border-radius(var(--#{$prefix}badge-border-radius)); - @include gradient-bg(); - - // Empty badges collapse automatically - &:empty { - display: none; - } -} - -// Quick fix for badges in buttons -.btn .badge { - position: relative; - top: -1px; -} diff --git a/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss b/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss deleted file mode 100644 index b8252ff..0000000 --- a/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss +++ /dev/null @@ -1,40 +0,0 @@ -.breadcrumb { - // scss-docs-start breadcrumb-css-vars - --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x}; - --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y}; - --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom}; - @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size); - --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg}; - --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius}; - --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color}; - --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x}; - --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color}; - // scss-docs-end breadcrumb-css-vars - - display: flex; - flex-wrap: wrap; - padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x); - margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom); - @include font-size(var(--#{$prefix}breadcrumb-font-size)); - list-style: none; - background-color: var(--#{$prefix}breadcrumb-bg); - @include border-radius(var(--#{$prefix}breadcrumb-border-radius)); -} - -.breadcrumb-item { - // The separator between breadcrumbs (by default, a forward-slash: "/") - + .breadcrumb-item { - padding-left: var(--#{$prefix}breadcrumb-item-padding-x); - - &::before { - float: left; // Suppress inline spacings and underlining of the separator - padding-right: var(--#{$prefix}breadcrumb-item-padding-x); - color: var(--#{$prefix}breadcrumb-divider-color); - content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; - } - } - - &.active { - color: var(--#{$prefix}breadcrumb-item-active-color); - } -} diff --git a/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss b/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss deleted file mode 100644 index 78e1252..0000000 --- a/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss +++ /dev/null @@ -1,147 +0,0 @@ -// Make the div behave like a button -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; // match .btn alignment given font-size hack above - - > .btn { - position: relative; - flex: 1 1 auto; - } - - // Bring the hover, focused, and "active" buttons to the front to overlay - // the borders properly - > .btn-check:checked + .btn, - > .btn-check:focus + .btn, - > .btn:hover, - > .btn:focus, - > .btn:active, - > .btn.active { - z-index: 1; - } -} - -// Optional: Group multiple button groups together for a toolbar -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; - - .input-group { - width: auto; - } -} - -.btn-group { - @include border-radius($btn-border-radius); - - // Prevent double borders when buttons are next to each other - > :not(.btn-check:first-child) + .btn, - > .btn-group:not(:first-child) { - margin-left: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn.dropdown-toggle-split:first-child, - > .btn-group:not(:last-child) > .btn { - @include border-end-radius(0); - } - - // The left radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-start-radius(0); - } -} - -// Sizing -// -// Remix the default button sizing classes into new ones for easier manipulation. - -.btn-group-sm > .btn { @extend .btn-sm; } -.btn-group-lg > .btn { @extend .btn-lg; } - - -// -// Split button dropdowns -// - -.dropdown-toggle-split { - padding-right: $btn-padding-x * .75; - padding-left: $btn-padding-x * .75; - - &::after, - .dropup &::after, - .dropend &::after { - margin-left: 0; - } - - .dropstart &::before { - margin-right: 0; - } -} - -.btn-sm + .dropdown-toggle-split { - padding-right: $btn-padding-x-sm * .75; - padding-left: $btn-padding-x-sm * .75; -} - -.btn-lg + .dropdown-toggle-split { - padding-right: $btn-padding-x-lg * .75; - padding-left: $btn-padding-x-lg * .75; -} - - -// The clickable button for toggling the menu -// Set the same inset shadow as the :active state -.btn-group.show .dropdown-toggle { - @include box-shadow($btn-active-box-shadow); - - // Show no shadow for `.btn-link` since it has no other button styles. - &.btn-link { - @include box-shadow(none); - } -} - - -// -// Vertical button groups -// - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; - - > .btn, - > .btn-group { - width: 100%; - } - - > .btn:not(:first-child), - > .btn-group:not(:first-child) { - margin-top: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn-group:not(:last-child) > .btn { - @include border-bottom-radius(0); - } - - // The top radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-top-radius(0); - } -} diff --git a/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss b/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss deleted file mode 100644 index caa4518..0000000 --- a/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss +++ /dev/null @@ -1,216 +0,0 @@ -// -// Base styles -// - -.btn { - // scss-docs-start btn-css-vars - --#{$prefix}btn-padding-x: #{$btn-padding-x}; - --#{$prefix}btn-padding-y: #{$btn-padding-y}; - --#{$prefix}btn-font-family: #{$btn-font-family}; - @include rfs($btn-font-size, --#{$prefix}btn-font-size); - --#{$prefix}btn-font-weight: #{$btn-font-weight}; - --#{$prefix}btn-line-height: #{$btn-line-height}; - --#{$prefix}btn-color: #{$btn-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-width: #{$btn-border-width}; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-border-radius: #{$btn-border-radius}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-box-shadow: #{$btn-box-shadow}; - --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity}; - --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5); - // scss-docs-end btn-css-vars - - display: inline-block; - padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x); - font-family: var(--#{$prefix}btn-font-family); - @include font-size(var(--#{$prefix}btn-font-size)); - font-weight: var(--#{$prefix}btn-font-weight); - line-height: var(--#{$prefix}btn-line-height); - color: var(--#{$prefix}btn-color); - text-align: center; - text-decoration: if($link-decoration == none, null, none); - white-space: $btn-white-space; - vertical-align: middle; - cursor: if($enable-button-pointers, pointer, null); - user-select: none; - border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color); - @include border-radius(var(--#{$prefix}btn-border-radius)); - @include gradient-bg(var(--#{$prefix}btn-bg)); - @include box-shadow(var(--#{$prefix}btn-box-shadow)); - @include transition($btn-transition); - - &:hover { - color: var(--#{$prefix}btn-hover-color); - text-decoration: if($link-hover-decoration == underline, none, null); - background-color: var(--#{$prefix}btn-hover-bg); - border-color: var(--#{$prefix}btn-hover-border-color); - } - - .btn-check + &:hover { - // override for the checkbox/radio buttons - color: var(--#{$prefix}btn-color); - background-color: var(--#{$prefix}btn-bg); - border-color: var(--#{$prefix}btn-border-color); - } - - &:focus-visible { - color: var(--#{$prefix}btn-hover-color); - @include gradient-bg(var(--#{$prefix}btn-hover-bg)); - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:focus-visible + & { - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:checked + &, - :not(.btn-check) + &:active, - &:first-child:active, - &.active, - &.show { - color: var(--#{$prefix}btn-active-color); - background-color: var(--#{$prefix}btn-active-bg); - // Remove CSS gradients if they're enabled - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-active-border-color); - @include box-shadow(var(--#{$prefix}btn-active-shadow)); - - &:focus-visible { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - } - - .btn-check:checked:focus-visible + & { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - &:disabled, - &.disabled, - fieldset:disabled & { - color: var(--#{$prefix}btn-disabled-color); - pointer-events: none; - background-color: var(--#{$prefix}btn-disabled-bg); - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-disabled-border-color); - opacity: var(--#{$prefix}btn-disabled-opacity); - @include box-shadow(none); - } -} - - -// -// Alternate buttons -// - -// scss-docs-start btn-variant-loops -@each $color, $value in $theme-colors { - .btn-#{$color} { - @if $color == "light" { - @include button-variant( - $value, - $value, - $hover-background: shade-color($value, $btn-hover-bg-shade-amount), - $hover-border: shade-color($value, $btn-hover-border-shade-amount), - $active-background: shade-color($value, $btn-active-bg-shade-amount), - $active-border: shade-color($value, $btn-active-border-shade-amount) - ); - } @else if $color == "dark" { - @include button-variant( - $value, - $value, - $hover-background: tint-color($value, $btn-hover-bg-tint-amount), - $hover-border: tint-color($value, $btn-hover-border-tint-amount), - $active-background: tint-color($value, $btn-active-bg-tint-amount), - $active-border: tint-color($value, $btn-active-border-tint-amount) - ); - } @else { - @include button-variant($value, $value); - } - } -} - -@each $color, $value in $theme-colors { - .btn-outline-#{$color} { - @include button-outline-variant($value); - } -} -// scss-docs-end btn-variant-loops - - -// -// Link buttons -// - -// Make a button look and behave like a link -.btn-link { - --#{$prefix}btn-font-weight: #{$font-weight-normal}; - --#{$prefix}btn-color: #{$btn-link-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-hover-color: #{$btn-link-hover-color}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-active-color: #{$btn-link-hover-color}; - --#{$prefix}btn-active-border-color: transparent; - --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color}; - --#{$prefix}btn-disabled-border-color: transparent; - --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows - --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb}; - - text-decoration: $link-decoration; - @if $enable-gradients { - background-image: none; - } - - &:hover, - &:focus-visible { - text-decoration: $link-hover-decoration; - } - - &:focus-visible { - color: var(--#{$prefix}btn-color); - } - - &:hover { - color: var(--#{$prefix}btn-hover-color); - } - - // No need for an active state here -} - - -// -// Button Sizes -// - -.btn-lg { - @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); -} - -.btn-sm { - @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); -} diff --git a/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss b/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss deleted file mode 100644 index dcebe6a..0000000 --- a/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss +++ /dev/null @@ -1,238 +0,0 @@ -// -// Base styles -// - -.card { - // scss-docs-start card-css-vars - --#{$prefix}card-spacer-y: #{$card-spacer-y}; - --#{$prefix}card-spacer-x: #{$card-spacer-x}; - --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y}; - --#{$prefix}card-title-color: #{$card-title-color}; - --#{$prefix}card-subtitle-color: #{$card-subtitle-color}; - --#{$prefix}card-border-width: #{$card-border-width}; - --#{$prefix}card-border-color: #{$card-border-color}; - --#{$prefix}card-border-radius: #{$card-border-radius}; - --#{$prefix}card-box-shadow: #{$card-box-shadow}; - --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius}; - --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y}; - --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x}; - --#{$prefix}card-cap-bg: #{$card-cap-bg}; - --#{$prefix}card-cap-color: #{$card-cap-color}; - --#{$prefix}card-height: #{$card-height}; - --#{$prefix}card-color: #{$card-color}; - --#{$prefix}card-bg: #{$card-bg}; - --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding}; - --#{$prefix}card-group-margin: #{$card-group-margin}; - // scss-docs-end card-css-vars - - position: relative; - display: flex; - flex-direction: column; - min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 - height: var(--#{$prefix}card-height); - color: var(--#{$prefix}body-color); - word-wrap: break-word; - background-color: var(--#{$prefix}card-bg); - background-clip: border-box; - border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - @include border-radius(var(--#{$prefix}card-border-radius)); - @include box-shadow(var(--#{$prefix}card-box-shadow)); - - > hr { - margin-right: 0; - margin-left: 0; - } - - > .list-group { - border-top: inherit; - border-bottom: inherit; - - &:first-child { - border-top-width: 0; - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); - } - - &:last-child { - border-bottom-width: 0; - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); - } - } - - // Due to specificity of the above selector (`.card > .list-group`), we must - // use a child selector here to prevent double borders. - > .card-header + .list-group, - > .list-group + .card-footer { - border-top: 0; - } -} - -.card-body { - // Enable `flex-grow: 1` for decks and groups so that card blocks take up - // as much space as possible, ensuring footers are aligned to the bottom. - flex: 1 1 auto; - padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x); - color: var(--#{$prefix}card-color); -} - -.card-title { - margin-bottom: var(--#{$prefix}card-title-spacer-y); - color: var(--#{$prefix}card-title-color); -} - -.card-subtitle { - margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list - margin-bottom: 0; - color: var(--#{$prefix}card-subtitle-color); -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link { - &:hover { - text-decoration: if($link-hover-decoration == underline, none, null); - } - - + .card-link { - margin-left: var(--#{$prefix}card-spacer-x); - } -} - -// -// Optional textual caps -// - -.card-header { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - margin-bottom: 0; // Removes the default margin-bottom of - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:first-child { - @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0); - } -} - -.card-footer { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:last-child { - @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius)); - } -} - - -// -// Header navs -// - -.card-header-tabs { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - border-bottom: 0; - - .nav-link.active { - background-color: var(--#{$prefix}card-bg); - border-bottom-color: var(--#{$prefix}card-bg); - } -} - -.card-header-pills { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list -} - -// Card image -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: var(--#{$prefix}card-img-overlay-padding); - @include border-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch -} - -.card-img, -.card-img-top { - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-bottom { - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); -} - - -// -// Card groups -// - -.card-group { - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - margin-bottom: var(--#{$prefix}card-group-margin); - } - - @include media-breakpoint-up(sm) { - display: flex; - flex-flow: row wrap; - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - flex: 1 0 0; - margin-bottom: 0; - - + .card { - margin-left: 0; - border-left: 0; - } - - // Handle rounded corners - @if $enable-rounded { - &:not(:last-child) { - @include border-end-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-right-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-right-radius: 0; - } - } - - &:not(:first-child) { - @include border-start-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-left-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-left-radius: 0; - } - } - } - } - } -} diff --git a/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss b/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss deleted file mode 100644 index 5ebf6b1..0000000 --- a/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss +++ /dev/null @@ -1,226 +0,0 @@ -// Notes on the classes: -// -// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) -// even when their scroll action started on a carousel, but for compatibility (with Firefox) -// we're preventing all actions instead -// 2. The .carousel-item-start and .carousel-item-end is used to indicate where -// the active slide is heading. -// 3. .active.carousel-item is the current slide. -// 4. .active.carousel-item-start and .active.carousel-item-end is the current -// slide in its in-transition state. Only one of these occurs at a time. -// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end -// is the upcoming slide in transition. - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; - @include clearfix(); -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - @include transition($carousel-transition); -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); -} - - -// -// Alternate transitions -// - -.carousel-fade { - .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; - } - - .carousel-item.active, - .carousel-item-next.carousel-item-start, - .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; - } - - .active.carousel-item-start, - .active.carousel-item-end { - z-index: 0; - opacity: 0; - @include transition(opacity 0s $carousel-transition-duration); - } -} - - -// -// Left/right controls for nav -// - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - // Use flex for alignment (1-3) - display: flex; // 1. allow flex styles - align-items: center; // 2. vertically center contents - justify-content: center; // 3. horizontally center contents - width: $carousel-control-width; - padding: 0; - color: $carousel-control-color; - text-align: center; - background: none; - filter: var(--#{$prefix}carousel-control-icon-filter); - border: 0; - opacity: $carousel-control-opacity; - @include transition($carousel-control-transition); - - // Hover/focus state - &:hover, - &:focus { - color: $carousel-control-color; - text-decoration: none; - outline: 0; - opacity: $carousel-control-hover-opacity; - } -} -.carousel-control-prev { - left: 0; - background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); -} -.carousel-control-next { - right: 0; - background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); -} - -// Icons for within -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: $carousel-control-icon-width; - height: $carousel-control-icon-width; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; -} - -.carousel-control-prev-icon { - background-image: escape-svg($carousel-control-prev-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-next-icon-bg) + "*/"}; -} -.carousel-control-next-icon { - background-image: escape-svg($carousel-control-next-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-prev-icon-bg) + "*/"}; -} - -// Optional indicator pips/controls -// -// Add a container (such as a list) with the following class and add an item (ideally a focusable control, -// like a button) with data-bs-target for each slide your carousel holds. - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - // Use the .carousel-control's width as margin so we don't overlay those - margin-right: $carousel-control-width; - margin-bottom: 1rem; - margin-left: $carousel-control-width; - - [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: $carousel-indicator-width; - height: $carousel-indicator-height; - padding: 0; - margin-right: $carousel-indicator-spacer; - margin-left: $carousel-indicator-spacer; - text-indent: -999px; - cursor: pointer; - background-color: var(--#{$prefix}carousel-indicator-active-bg); - background-clip: padding-box; - border: 0; - // Use transparent borders to increase the hit area by 10px on top and bottom. - border-top: $carousel-indicator-hit-area-height solid transparent; - border-bottom: $carousel-indicator-hit-area-height solid transparent; - opacity: $carousel-indicator-opacity; - @include transition($carousel-indicator-transition); - } - - .active { - opacity: $carousel-indicator-active-opacity; - } -} - - -// Optional captions -// -// - -.carousel-caption { - position: absolute; - right: (100% - $carousel-caption-width) * .5; - bottom: $carousel-caption-spacer; - left: (100% - $carousel-caption-width) * .5; - padding-top: $carousel-caption-padding-y; - padding-bottom: $carousel-caption-padding-y; - color: var(--#{$prefix}carousel-caption-color); - text-align: center; -} - -// Dark mode carousel - -@mixin carousel-dark() { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg-dark}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color-dark}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter-dark}; -} - -.carousel-dark { - @include carousel-dark(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include carousel-dark(); - } -} diff --git a/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss b/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss deleted file mode 100644 index d53c96f..0000000 --- a/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss +++ /dev/null @@ -1,66 +0,0 @@ -// Transparent background and border properties included for button version. -// iOS requires the button element instead of an anchor tag. -// If you want the anchor version, it requires `href="#"`. -// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile - -.btn-close { - // scss-docs-start close-css-vars - --#{$prefix}btn-close-color: #{$btn-close-color}; - --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) }; - --#{$prefix}btn-close-opacity: #{$btn-close-opacity}; - --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity}; - --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow}; - --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity}; - --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity}; - // scss-docs-end close-css-vars - - box-sizing: content-box; - width: $btn-close-width; - height: $btn-close-height; - padding: $btn-close-padding-y $btn-close-padding-x; - color: var(--#{$prefix}btn-close-color); - background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements - filter: var(--#{$prefix}btn-close-filter); - border: 0; // for button elements - @include border-radius(); - opacity: var(--#{$prefix}btn-close-opacity); - - // Override 's hover style - &:hover { - color: var(--#{$prefix}btn-close-color); - text-decoration: none; - opacity: var(--#{$prefix}btn-close-hover-opacity); - } - - &:focus { - outline: 0; - box-shadow: var(--#{$prefix}btn-close-focus-shadow); - opacity: var(--#{$prefix}btn-close-focus-opacity); - } - - &:disabled, - &.disabled { - pointer-events: none; - user-select: none; - opacity: var(--#{$prefix}btn-close-disabled-opacity); - } -} - -@mixin btn-close-white() { - --#{$prefix}btn-close-filter: #{$btn-close-filter-dark}; -} - -.btn-close-white { - @include btn-close-white(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}btn-close-filter: #{$btn-close-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include btn-close-white(); - } -} diff --git a/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss b/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss deleted file mode 100644 index 83b3138..0000000 --- a/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss +++ /dev/null @@ -1,41 +0,0 @@ -// Container widths -// -// Set the container width, and override it for fixed navbars in media queries. - -@if $enable-container-classes { - // Single container class with breakpoint max-widths - .container, - // 100% wide container at all breakpoints - .container-fluid { - @include make-container(); - } - - // Responsive containers that are 100% wide until a breakpoint - @each $breakpoint, $container-max-width in $container-max-widths { - .container-#{$breakpoint} { - @extend .container-fluid; - } - - @include media-breakpoint-up($breakpoint, $grid-breakpoints) { - %responsive-container-#{$breakpoint} { - max-width: $container-max-width; - } - - // Extend each breakpoint which is smaller or equal to the current breakpoint - $extend-breakpoint: true; - - @each $name, $width in $grid-breakpoints { - @if ($extend-breakpoint) { - .container#{breakpoint-infix($name, $grid-breakpoints)} { - @extend %responsive-container-#{$breakpoint}; - } - - // Once the current breakpoint is reached, stop extending - @if ($breakpoint == $name) { - $extend-breakpoint: false; - } - } - } - } - } -} diff --git a/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss b/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss deleted file mode 100644 index 587ebb4..0000000 --- a/05_react/unterricht/tag40/04_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss +++ /dev/null @@ -1,250 +0,0 @@ -// The dropdown wrapper (`
      `) -.dropup, -.dropend, -.dropdown, -.dropstart, -.dropup-center, -.dropdown-center { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; - - // Generate the caret automatically - @include caret(); -} - -// The dropdown menu -.dropdown-menu { - // scss-docs-start dropdown-css-vars - --#{$prefix}dropdown-zindex: #{$zindex-dropdown}; - --#{$prefix}dropdown-min-width: #{$dropdown-min-width}; - --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x}; - --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y}; - --#{$prefix}dropdown-spacer: #{$dropdown-spacer}; - @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size); - --#{$prefix}dropdown-color: #{$dropdown-color}; - --#{$prefix}dropdown-bg: #{$dropdown-bg}; - --#{$prefix}dropdown-border-color: #{$dropdown-border-color}; - --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius}; - --#{$prefix}dropdown-border-width: #{$dropdown-border-width}; - --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius}; - --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg}; - --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y}; - --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow}; - --#{$prefix}dropdown-link-color: #{$dropdown-link-color}; - --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color}; - --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg}; - --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color}; - --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg}; - --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color}; - --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x}; - --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y}; - --#{$prefix}dropdown-header-color: #{$dropdown-header-color}; - --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x}; - --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y}; - // scss-docs-end dropdown-css-vars - - position: absolute; - z-index: var(--#{$prefix}dropdown-zindex); - display: none; // none by default, but block on "open" of the menu - min-width: var(--#{$prefix}dropdown-min-width); - padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x); - margin: 0; // Override default margin of ul - @include font-size(var(--#{$prefix}dropdown-font-size)); - color: var(--#{$prefix}dropdown-color); - text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) - list-style: none; - background-color: var(--#{$prefix}dropdown-bg); - background-clip: padding-box; - border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color); - @include border-radius(var(--#{$prefix}dropdown-border-radius)); - @include box-shadow(var(--#{$prefix}dropdown-box-shadow)); - - &[data-bs-popper] { - top: 100%; - left: 0; - margin-top: var(--#{$prefix}dropdown-spacer); - } - - @if $dropdown-padding-y == 0 { - > .dropdown-item:first-child, - > li:first-child .dropdown-item { - @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - > .dropdown-item:last-child, - > li:last-child .dropdown-item { - @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - - } -} - -// scss-docs-start responsive-breakpoints -// We deliberately hardcode the `bs-` prefix because we check -// this custom property in JS to determine Popper's positioning - -@each $breakpoint in map-keys($grid-breakpoints) { - @include media-breakpoint-up($breakpoint) { - $infix: breakpoint-infix($breakpoint, $grid-breakpoints); - - .dropdown-menu#{$infix}-start { - --bs-position: start; - - &[data-bs-popper] { - right: auto; - left: 0; - } - } - - .dropdown-menu#{$infix}-end { - --bs-position: end; - - &[data-bs-popper] { - right: 0; - left: auto; - } - } - } -} -// scss-docs-end responsive-breakpoints - -// Allow for dropdowns to go bottom up (aka, dropup-menu) -// Just add .dropup after the standard .dropdown class and you're set. -.dropup { - .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(up); - } -} - -.dropend { - .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(end); - &::after { - vertical-align: 0; - } - } -} - -.dropstart { - .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(start); - &::before { - vertical-align: 0; - } - } -} - - -// Dividers (basically an `
      `) within the dropdown -.dropdown-divider { - height: 0; - margin: var(--#{$prefix}dropdown-divider-margin-y) 0; - overflow: hidden; - border-top: 1px solid var(--#{$prefix}dropdown-divider-bg); - opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
      element -} - -// Links, buttons, and more within the dropdown menu -// -// `
      ` alignment by inheriting `text-align`. -// 3. Fix alignment for Safari - -th { - font-weight: $table-th-font-weight; // 1 - text-align: inherit; // 2 - text-align: -webkit-match-parent; // 3 -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - - -// Forms -// -// 1. Allow labels to use `margin` for spacing. - -label { - display: inline-block; // 1 -} - -// Remove the default `border-radius` that macOS Chrome adds. -// See https://github.com/twbs/bootstrap/issues/24093 - -button { - // stylelint-disable-next-line property-disallowed-list - border-radius: 0; -} - -// Explicitly remove focus outline in Chromium when it shouldn't be -// visible (e.g. as result of mouse click or touch tap). It already -// should be doing this automatically, but seems to currently be -// confused and applies its very visible two-tone outline anyway. - -button:focus:not(:focus-visible) { - outline: 0; -} - -// 1. Remove the margin in Firefox and Safari - -input, -button, -select, -optgroup, -textarea { - margin: 0; // 1 - font-family: inherit; - @include font-size(inherit); - line-height: inherit; -} - -// Remove the inheritance of text transform in Firefox -button, -select { - text-transform: none; -} -// Set the cursor for non-` - ); -}; -export default Button; diff --git a/05_react/unterricht/tag41/01_components-with-hooks/src/components/examples/ExampleUseContext.jsx b/05_react/unterricht/tag41/01_components-with-hooks/src/components/examples/ExampleUseContext.jsx deleted file mode 100644 index 665f3f4..0000000 --- a/05_react/unterricht/tag41/01_components-with-hooks/src/components/examples/ExampleUseContext.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import { useContext } from 'react'; -import ThemeContext from './theme-switcher/ThemeContext'; - -const ExampleUseContext = (props) => { - // const { } = props; - - const theme = useContext(ThemeContext); - - return ( -
      -

      useContext

      -

      - The theme of this component is: {theme} -

      -
      - ); -}; -export default ExampleUseContext; diff --git a/05_react/unterricht/tag41/01_components-with-hooks/src/components/examples/ExampleUseId.jsx b/05_react/unterricht/tag41/01_components-with-hooks/src/components/examples/ExampleUseId.jsx deleted file mode 100644 index a486d4f..0000000 --- a/05_react/unterricht/tag41/01_components-with-hooks/src/components/examples/ExampleUseId.jsx +++ /dev/null @@ -1,24 +0,0 @@ -import { useId } from 'react'; -// import { v4 as uuidv4 } from 'uuid'; - -const ExampleUseId = (props) => { - // const { } = props; - const id = useId().replaceAll(/[_r.]/g, ''); - // const id2 = uuidv4(); // -> 'b18794e8-5d0d-417c-b361-ba38e78411b4' - - return ( -
      -

      - ID: {id} -

      - -
      - - -
      -
      - ); -}; -export default ExampleUseId; diff --git a/05_react/unterricht/tag41/01_components-with-hooks/src/components/examples/ExampleUseReducer.jsx b/05_react/unterricht/tag41/01_components-with-hooks/src/components/examples/ExampleUseReducer.jsx deleted file mode 100644 index 559f808..0000000 --- a/05_react/unterricht/tag41/01_components-with-hooks/src/components/examples/ExampleUseReducer.jsx +++ /dev/null @@ -1,77 +0,0 @@ -import { useReducer } from 'react'; -import { FaMinus, FaPlus } from 'react-icons/fa6'; - -const initialState = { - counter: 0, - //more props... -}; - -// Reducer Funktion verwaltet das state Objekt. Über die Funktion lässt sich das state-Objekt gezielt verändern -function reducer(state, action) { - // action Objekt hat immer folgende Eigenschaften: {type: 'ACTION_NAME', payload: changeValue} - const { type, payload = 1 } = action; - switch (type) { - case 'INCREASE': - return { ...state, counter: state.counter + 1 }; - case 'DECREASE': - return { ...state, counter: state.counter - 1 }; - case 'DOUBLE': - return { ...state, counter: state.counter * 2 }; - case 'INC_VALUE': - return { ...state, counter: state.counter + payload }; - - default: - console.warn('Action Type not found'); - return state; - } -} - -const ExampleUseReducer = (props) => { - // const { } = props; - - // Hook - Toplevel - // const [counter, setCounter] = useState(0); - - const [state, dispatch] = useReducer(reducer, initialState); - - // EventHandler ============ - const handeClickInc = (e) => { - //setCounter(counter + 1); - dispatch({ type: 'INCREASE' }); - }; - const handeClickDec = (e) => { - // setCounter(counter - 1); - - // dispatch(action_object) - dispatch({ type: 'DECREASE' }); - }; - - const handleClickDouble = (e) => { - // dispatch(action_object) - dispatch({ type: 'DOUBLE' }); - }; - - const handleClickIncValue = (e) => { - dispatch({ type: 'INC_VALUE', payload: 5 }); - }; - - return ( -
      - Counter: {state.counter} - - - - -
      - ); -}; -export default ExampleUseReducer; diff --git a/05_react/unterricht/tag41/01_components-with-hooks/src/components/examples/ExampleUseState.jsx b/05_react/unterricht/tag41/01_components-with-hooks/src/components/examples/ExampleUseState.jsx deleted file mode 100644 index 8a9487b..0000000 --- a/05_react/unterricht/tag41/01_components-with-hooks/src/components/examples/ExampleUseState.jsx +++ /dev/null @@ -1,41 +0,0 @@ -import { useState } from 'react'; - -import { FaPlus, FaMinus } from 'react-icons/fa6'; - -const ExampleUseState = (props) => { - // const { } = props; - - const [counter, setCounter] = useState(0); - - // let counter = 0; - - // EventHandler ======= - const handleClick = (e) => { - console.log('click'); - const btn = e.currentTarget; - const label = btn.ariaLabel; - - switch (label) { - case 'Increase': - // setCounter(counter + 1); // setter(value) - setCounter((prevState) => prevState + 1); // setter(fn(prevValue) => newValue ) - break; - case 'Decrease': - setCounter(counter - 1); - break; - } - }; - - return ( -
      - Counter: {counter} - - -
      - ); -}; -export default ExampleUseState; diff --git a/05_react/unterricht/tag41/01_components-with-hooks/src/components/examples/theme-switcher/ThemeContext.jsx b/05_react/unterricht/tag41/01_components-with-hooks/src/components/examples/theme-switcher/ThemeContext.jsx deleted file mode 100644 index ee75ac4..0000000 --- a/05_react/unterricht/tag41/01_components-with-hooks/src/components/examples/theme-switcher/ThemeContext.jsx +++ /dev/null @@ -1,8 +0,0 @@ -import { createContext } from 'react'; - -export const THEME_DEFAULT_VALUE = 'light'; - -const ThemeContext = createContext(THEME_DEFAULT_VALUE); // standard theme is light; -// ThemeContext wird durch createContext() zu einem JSX-Element - -export default ThemeContext; diff --git a/05_react/unterricht/tag41/01_components-with-hooks/src/components/examples/theme-switcher/ThemeProvider.jsx b/05_react/unterricht/tag41/01_components-with-hooks/src/components/examples/theme-switcher/ThemeProvider.jsx deleted file mode 100644 index f21ff57..0000000 --- a/05_react/unterricht/tag41/01_components-with-hooks/src/components/examples/theme-switcher/ThemeProvider.jsx +++ /dev/null @@ -1,26 +0,0 @@ -import { useState } from 'react'; -import ThemeContext, { THEME_DEFAULT_VALUE } from './ThemeContext'; - -const ThemeProvider = (props) => { - const { children } = props; - - console.log(ThemeContext._currentValue); // 'light' <- _currentValue beinhaltet initialWert. Soll aber in production Umgebung nicht verwendet werden, da kein offizieller Standard. - - const [theme, setTheme] = useState(THEME_DEFAULT_VALUE); - - // EventHandler ============== - const handleToggleTheme = () => { - console.log('click'); - setTheme((prevState) => (prevState === 'light' ? 'dark' : 'light')); - }; - - return ( - - - {children} - - ); -}; -export default ThemeProvider; diff --git a/05_react/unterricht/tag41/01_components-with-hooks/src/components/footers/FooterMain.jsx b/05_react/unterricht/tag41/01_components-with-hooks/src/components/footers/FooterMain.jsx deleted file mode 100644 index 6c746be..0000000 --- a/05_react/unterricht/tag41/01_components-with-hooks/src/components/footers/FooterMain.jsx +++ /dev/null @@ -1,38 +0,0 @@ -const FooterMain = (props) => { - // const { } = props; - - return ( -
      -
      -
      -
      -
      -

      Address

      -
      -
      -
      -
      -

      Links

      - -
      -
      -
      -
      -

      Socials

      -
      -
      -
      -
      -
      - ); -}; -export default FooterMain; diff --git a/05_react/unterricht/tag41/01_components-with-hooks/src/components/forms/FormNewsletter.jsx b/05_react/unterricht/tag41/01_components-with-hooks/src/components/forms/FormNewsletter.jsx deleted file mode 100644 index 04e039d..0000000 --- a/05_react/unterricht/tag41/01_components-with-hooks/src/components/forms/FormNewsletter.jsx +++ /dev/null @@ -1,29 +0,0 @@ -const FormNewsletter = (props) => { - // const { } = props; - - // EventHandlers ========= - const handleSubmit = (e) => { - e.preventDefault(); - console.log('Form data submit over Fetch/Xhr'); - }; - - return ( -
      -
      -
      -
      - -
      -
      -
      -
      - -
      -
      -
      -
      - ); -}; -export default FormNewsletter; diff --git a/05_react/unterricht/tag41/01_components-with-hooks/src/components/headers/HeaderMain.jsx b/05_react/unterricht/tag41/01_components-with-hooks/src/components/headers/HeaderMain.jsx deleted file mode 100644 index cacc690..0000000 --- a/05_react/unterricht/tag41/01_components-with-hooks/src/components/headers/HeaderMain.jsx +++ /dev/null @@ -1,14 +0,0 @@ -import LogoMain from '../logos/LogoMain'; - -const HeaderMain = (props) => { - // const { } = props; - - return ( -
      -
      - -
      -
      - ); // VIEW -}; -export default HeaderMain; diff --git a/05_react/unterricht/tag41/01_components-with-hooks/src/components/icons/LogoDonkey.jsx b/05_react/unterricht/tag41/01_components-with-hooks/src/components/icons/LogoDonkey.jsx deleted file mode 100644 index 958a172..0000000 --- a/05_react/unterricht/tag41/01_components-with-hooks/src/components/icons/LogoDonkey.jsx +++ /dev/null @@ -1,80 +0,0 @@ -import React from 'react'; - -const LogoDonkey = (props) => { - // const { } = props; - - return ( - - - - - - - - - - - - - - - ); -}; -export default LogoDonkey; diff --git a/05_react/unterricht/tag41/01_components-with-hooks/src/components/inputs/InputAmount.jsx b/05_react/unterricht/tag41/01_components-with-hooks/src/components/inputs/InputAmount.jsx deleted file mode 100644 index 516b77a..0000000 --- a/05_react/unterricht/tag41/01_components-with-hooks/src/components/inputs/InputAmount.jsx +++ /dev/null @@ -1,37 +0,0 @@ -import { FaMinus, FaPlus } from 'react-icons/fa6'; -// npm install react-icons | Auf der npm Seite mit --save, ist nicht mehr nötig -const InputAmount = (props) => { - // const { } = props; - - // EventHandlers ================ - const handleChange = (e) => { - console.log(e); // Event-Objekte wurden um React Methoden und Eigenschaften erweitert. (SyntheticBaseEvent anstatt InputEvent) - console.log(e.target.value); - }; - - return ( -
      -
      - - - - - - - -
      -
      - ); -}; -export default InputAmount; diff --git a/05_react/unterricht/tag41/01_components-with-hooks/src/components/logos/LogoMain.jsx b/05_react/unterricht/tag41/01_components-with-hooks/src/components/logos/LogoMain.jsx deleted file mode 100644 index d74f500..0000000 --- a/05_react/unterricht/tag41/01_components-with-hooks/src/components/logos/LogoMain.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import LogoDonkey from '../icons/LogoDonkey'; - -const LogoMain = (props) => { - // const { } = props; - - return ( -
      - -
      IA - JS Course
      -
      - ); -}; -export default LogoMain; diff --git a/05_react/unterricht/tag41/01_components-with-hooks/src/main.jsx b/05_react/unterricht/tag41/01_components-with-hooks/src/main.jsx deleted file mode 100644 index 4f28fd8..0000000 --- a/05_react/unterricht/tag41/01_components-with-hooks/src/main.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; - -// import von 'main'-Datei -import './styles/main.scss'; - -import App from './App.jsx'; - -createRoot(document.getElementById('root')).render( - - - , -); diff --git a/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/_index.scss b/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/_index.scss deleted file mode 100644 index dcefbc9..0000000 --- a/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/_index.scss +++ /dev/null @@ -1,3 +0,0 @@ -// @import 'bootstrap-5.3.8/bootstrap-grid'; -@import 'bootstrap-5.3.8/bootstrap'; -// @import 'bulma-1.04/index' diff --git a/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss b/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss deleted file mode 100644 index e9f267f..0000000 --- a/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss +++ /dev/null @@ -1,153 +0,0 @@ -// -// Base styles -// - -.accordion { - // scss-docs-start accordion-css-vars - --#{$prefix}accordion-color: #{$accordion-color}; - --#{$prefix}accordion-bg: #{$accordion-bg}; - --#{$prefix}accordion-transition: #{$accordion-transition}; - --#{$prefix}accordion-border-color: #{$accordion-border-color}; - --#{$prefix}accordion-border-width: #{$accordion-border-width}; - --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; - --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; - --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; - --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; - --#{$prefix}accordion-btn-color: #{$accordion-button-color}; - --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; - --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; - --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; - --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; - --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; - --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; - --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; - --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; - --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; - // scss-docs-end accordion-css-vars -} - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); - @include font-size($font-size-base); - color: var(--#{$prefix}accordion-btn-color); - text-align: left; // Reset button style - background-color: var(--#{$prefix}accordion-btn-bg); - border: 0; - @include border-radius(0); - overflow-anchor: none; - @include transition(var(--#{$prefix}accordion-transition)); - - &:not(.collapsed) { - color: var(--#{$prefix}accordion-active-color); - background-color: var(--#{$prefix}accordion-active-bg); - box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list - - &::after { - background-image: var(--#{$prefix}accordion-btn-active-icon); - transform: var(--#{$prefix}accordion-btn-icon-transform); - } - } - - // Accordion icon - &::after { - flex-shrink: 0; - width: var(--#{$prefix}accordion-btn-icon-width); - height: var(--#{$prefix}accordion-btn-icon-width); - margin-left: auto; - content: ""; - background-image: var(--#{$prefix}accordion-btn-icon); - background-repeat: no-repeat; - background-size: var(--#{$prefix}accordion-btn-icon-width); - @include transition(var(--#{$prefix}accordion-btn-icon-transition)); - } - - &:hover { - z-index: 2; - } - - &:focus { - z-index: 3; - outline: 0; - box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); - } -} - -.accordion-header { - margin-bottom: 0; -} - -.accordion-item { - color: var(--#{$prefix}accordion-color); - background-color: var(--#{$prefix}accordion-bg); - border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); - - &:first-of-type { - @include border-top-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - &:not(:first-of-type) { - border-top: 0; - } - - // Only set a border-radius on the last item if the accordion is collapsed - &:last-of-type { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - &.collapsed { - @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - > .accordion-collapse { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - } - } -} - -.accordion-body { - padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); -} - - -// Flush accordion items -// -// Remove borders and border-radius to keep accordion items edge-to-edge. - -.accordion-flush { - > .accordion-item { - border-right: 0; - border-left: 0; - @include border-radius(0); - - &:first-child { border-top: 0; } - &:last-child { border-bottom: 0; } - - // stylelint-disable selector-max-class - > .accordion-collapse, - > .accordion-header .accordion-button, - > .accordion-header .accordion-button.collapsed { - @include border-radius(0); - } - // stylelint-enable selector-max-class - } -} - -@if $enable-dark-mode { - @include color-mode(dark) { - .accordion-button::after { - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; - } - } -} diff --git a/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss b/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss deleted file mode 100644 index b8cff9b..0000000 --- a/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss +++ /dev/null @@ -1,68 +0,0 @@ -// -// Base styles -// - -.alert { - // scss-docs-start alert-css-vars - --#{$prefix}alert-bg: transparent; - --#{$prefix}alert-padding-x: #{$alert-padding-x}; - --#{$prefix}alert-padding-y: #{$alert-padding-y}; - --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; - --#{$prefix}alert-color: inherit; - --#{$prefix}alert-border-color: transparent; - --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); - --#{$prefix}alert-border-radius: #{$alert-border-radius}; - --#{$prefix}alert-link-color: inherit; - // scss-docs-end alert-css-vars - - position: relative; - padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); - margin-bottom: var(--#{$prefix}alert-margin-bottom); - color: var(--#{$prefix}alert-color); - background-color: var(--#{$prefix}alert-bg); - border: var(--#{$prefix}alert-border); - @include border-radius(var(--#{$prefix}alert-border-radius)); -} - -// Headings for larger alerts -.alert-heading { - // Specified to prevent conflicts of changing $headings-color - color: inherit; -} - -// Provide class for links that match alerts -.alert-link { - font-weight: $alert-link-font-weight; - color: var(--#{$prefix}alert-link-color); -} - - -// Dismissible alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissible { - padding-right: $alert-dismissible-padding-r; - - // Adjust close link position - .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: $stretched-link-z-index + 1; - padding: $alert-padding-y * 1.25 $alert-padding-x; - } -} - - -// scss-docs-start alert-modifiers -// Generate contextual modifier classes for colorizing the alert -@each $state in map-keys($theme-colors) { - .alert-#{$state} { - --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); - --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); - --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); - --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); - } -} -// scss-docs-end alert-modifiers diff --git a/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss b/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss deleted file mode 100644 index cc3d269..0000000 --- a/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss +++ /dev/null @@ -1,38 +0,0 @@ -// Base class -// -// Requires one of the contextual, color modifier classes for `color` and -// `background-color`. - -.badge { - // scss-docs-start badge-css-vars - --#{$prefix}badge-padding-x: #{$badge-padding-x}; - --#{$prefix}badge-padding-y: #{$badge-padding-y}; - @include rfs($badge-font-size, --#{$prefix}badge-font-size); - --#{$prefix}badge-font-weight: #{$badge-font-weight}; - --#{$prefix}badge-color: #{$badge-color}; - --#{$prefix}badge-border-radius: #{$badge-border-radius}; - // scss-docs-end badge-css-vars - - display: inline-block; - padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x); - @include font-size(var(--#{$prefix}badge-font-size)); - font-weight: var(--#{$prefix}badge-font-weight); - line-height: 1; - color: var(--#{$prefix}badge-color); - text-align: center; - white-space: nowrap; - vertical-align: baseline; - @include border-radius(var(--#{$prefix}badge-border-radius)); - @include gradient-bg(); - - // Empty badges collapse automatically - &:empty { - display: none; - } -} - -// Quick fix for badges in buttons -.btn .badge { - position: relative; - top: -1px; -} diff --git a/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss b/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss deleted file mode 100644 index b8252ff..0000000 --- a/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss +++ /dev/null @@ -1,40 +0,0 @@ -.breadcrumb { - // scss-docs-start breadcrumb-css-vars - --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x}; - --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y}; - --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom}; - @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size); - --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg}; - --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius}; - --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color}; - --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x}; - --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color}; - // scss-docs-end breadcrumb-css-vars - - display: flex; - flex-wrap: wrap; - padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x); - margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom); - @include font-size(var(--#{$prefix}breadcrumb-font-size)); - list-style: none; - background-color: var(--#{$prefix}breadcrumb-bg); - @include border-radius(var(--#{$prefix}breadcrumb-border-radius)); -} - -.breadcrumb-item { - // The separator between breadcrumbs (by default, a forward-slash: "/") - + .breadcrumb-item { - padding-left: var(--#{$prefix}breadcrumb-item-padding-x); - - &::before { - float: left; // Suppress inline spacings and underlining of the separator - padding-right: var(--#{$prefix}breadcrumb-item-padding-x); - color: var(--#{$prefix}breadcrumb-divider-color); - content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; - } - } - - &.active { - color: var(--#{$prefix}breadcrumb-item-active-color); - } -} diff --git a/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss b/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss deleted file mode 100644 index 78e1252..0000000 --- a/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss +++ /dev/null @@ -1,147 +0,0 @@ -// Make the div behave like a button -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; // match .btn alignment given font-size hack above - - > .btn { - position: relative; - flex: 1 1 auto; - } - - // Bring the hover, focused, and "active" buttons to the front to overlay - // the borders properly - > .btn-check:checked + .btn, - > .btn-check:focus + .btn, - > .btn:hover, - > .btn:focus, - > .btn:active, - > .btn.active { - z-index: 1; - } -} - -// Optional: Group multiple button groups together for a toolbar -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; - - .input-group { - width: auto; - } -} - -.btn-group { - @include border-radius($btn-border-radius); - - // Prevent double borders when buttons are next to each other - > :not(.btn-check:first-child) + .btn, - > .btn-group:not(:first-child) { - margin-left: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn.dropdown-toggle-split:first-child, - > .btn-group:not(:last-child) > .btn { - @include border-end-radius(0); - } - - // The left radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-start-radius(0); - } -} - -// Sizing -// -// Remix the default button sizing classes into new ones for easier manipulation. - -.btn-group-sm > .btn { @extend .btn-sm; } -.btn-group-lg > .btn { @extend .btn-lg; } - - -// -// Split button dropdowns -// - -.dropdown-toggle-split { - padding-right: $btn-padding-x * .75; - padding-left: $btn-padding-x * .75; - - &::after, - .dropup &::after, - .dropend &::after { - margin-left: 0; - } - - .dropstart &::before { - margin-right: 0; - } -} - -.btn-sm + .dropdown-toggle-split { - padding-right: $btn-padding-x-sm * .75; - padding-left: $btn-padding-x-sm * .75; -} - -.btn-lg + .dropdown-toggle-split { - padding-right: $btn-padding-x-lg * .75; - padding-left: $btn-padding-x-lg * .75; -} - - -// The clickable button for toggling the menu -// Set the same inset shadow as the :active state -.btn-group.show .dropdown-toggle { - @include box-shadow($btn-active-box-shadow); - - // Show no shadow for `.btn-link` since it has no other button styles. - &.btn-link { - @include box-shadow(none); - } -} - - -// -// Vertical button groups -// - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; - - > .btn, - > .btn-group { - width: 100%; - } - - > .btn:not(:first-child), - > .btn-group:not(:first-child) { - margin-top: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn-group:not(:last-child) > .btn { - @include border-bottom-radius(0); - } - - // The top radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-top-radius(0); - } -} diff --git a/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss b/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss deleted file mode 100644 index caa4518..0000000 --- a/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss +++ /dev/null @@ -1,216 +0,0 @@ -// -// Base styles -// - -.btn { - // scss-docs-start btn-css-vars - --#{$prefix}btn-padding-x: #{$btn-padding-x}; - --#{$prefix}btn-padding-y: #{$btn-padding-y}; - --#{$prefix}btn-font-family: #{$btn-font-family}; - @include rfs($btn-font-size, --#{$prefix}btn-font-size); - --#{$prefix}btn-font-weight: #{$btn-font-weight}; - --#{$prefix}btn-line-height: #{$btn-line-height}; - --#{$prefix}btn-color: #{$btn-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-width: #{$btn-border-width}; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-border-radius: #{$btn-border-radius}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-box-shadow: #{$btn-box-shadow}; - --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity}; - --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5); - // scss-docs-end btn-css-vars - - display: inline-block; - padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x); - font-family: var(--#{$prefix}btn-font-family); - @include font-size(var(--#{$prefix}btn-font-size)); - font-weight: var(--#{$prefix}btn-font-weight); - line-height: var(--#{$prefix}btn-line-height); - color: var(--#{$prefix}btn-color); - text-align: center; - text-decoration: if($link-decoration == none, null, none); - white-space: $btn-white-space; - vertical-align: middle; - cursor: if($enable-button-pointers, pointer, null); - user-select: none; - border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color); - @include border-radius(var(--#{$prefix}btn-border-radius)); - @include gradient-bg(var(--#{$prefix}btn-bg)); - @include box-shadow(var(--#{$prefix}btn-box-shadow)); - @include transition($btn-transition); - - &:hover { - color: var(--#{$prefix}btn-hover-color); - text-decoration: if($link-hover-decoration == underline, none, null); - background-color: var(--#{$prefix}btn-hover-bg); - border-color: var(--#{$prefix}btn-hover-border-color); - } - - .btn-check + &:hover { - // override for the checkbox/radio buttons - color: var(--#{$prefix}btn-color); - background-color: var(--#{$prefix}btn-bg); - border-color: var(--#{$prefix}btn-border-color); - } - - &:focus-visible { - color: var(--#{$prefix}btn-hover-color); - @include gradient-bg(var(--#{$prefix}btn-hover-bg)); - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:focus-visible + & { - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:checked + &, - :not(.btn-check) + &:active, - &:first-child:active, - &.active, - &.show { - color: var(--#{$prefix}btn-active-color); - background-color: var(--#{$prefix}btn-active-bg); - // Remove CSS gradients if they're enabled - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-active-border-color); - @include box-shadow(var(--#{$prefix}btn-active-shadow)); - - &:focus-visible { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - } - - .btn-check:checked:focus-visible + & { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - &:disabled, - &.disabled, - fieldset:disabled & { - color: var(--#{$prefix}btn-disabled-color); - pointer-events: none; - background-color: var(--#{$prefix}btn-disabled-bg); - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-disabled-border-color); - opacity: var(--#{$prefix}btn-disabled-opacity); - @include box-shadow(none); - } -} - - -// -// Alternate buttons -// - -// scss-docs-start btn-variant-loops -@each $color, $value in $theme-colors { - .btn-#{$color} { - @if $color == "light" { - @include button-variant( - $value, - $value, - $hover-background: shade-color($value, $btn-hover-bg-shade-amount), - $hover-border: shade-color($value, $btn-hover-border-shade-amount), - $active-background: shade-color($value, $btn-active-bg-shade-amount), - $active-border: shade-color($value, $btn-active-border-shade-amount) - ); - } @else if $color == "dark" { - @include button-variant( - $value, - $value, - $hover-background: tint-color($value, $btn-hover-bg-tint-amount), - $hover-border: tint-color($value, $btn-hover-border-tint-amount), - $active-background: tint-color($value, $btn-active-bg-tint-amount), - $active-border: tint-color($value, $btn-active-border-tint-amount) - ); - } @else { - @include button-variant($value, $value); - } - } -} - -@each $color, $value in $theme-colors { - .btn-outline-#{$color} { - @include button-outline-variant($value); - } -} -// scss-docs-end btn-variant-loops - - -// -// Link buttons -// - -// Make a button look and behave like a link -.btn-link { - --#{$prefix}btn-font-weight: #{$font-weight-normal}; - --#{$prefix}btn-color: #{$btn-link-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-hover-color: #{$btn-link-hover-color}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-active-color: #{$btn-link-hover-color}; - --#{$prefix}btn-active-border-color: transparent; - --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color}; - --#{$prefix}btn-disabled-border-color: transparent; - --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows - --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb}; - - text-decoration: $link-decoration; - @if $enable-gradients { - background-image: none; - } - - &:hover, - &:focus-visible { - text-decoration: $link-hover-decoration; - } - - &:focus-visible { - color: var(--#{$prefix}btn-color); - } - - &:hover { - color: var(--#{$prefix}btn-hover-color); - } - - // No need for an active state here -} - - -// -// Button Sizes -// - -.btn-lg { - @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); -} - -.btn-sm { - @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); -} diff --git a/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss b/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss deleted file mode 100644 index dcebe6a..0000000 --- a/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss +++ /dev/null @@ -1,238 +0,0 @@ -// -// Base styles -// - -.card { - // scss-docs-start card-css-vars - --#{$prefix}card-spacer-y: #{$card-spacer-y}; - --#{$prefix}card-spacer-x: #{$card-spacer-x}; - --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y}; - --#{$prefix}card-title-color: #{$card-title-color}; - --#{$prefix}card-subtitle-color: #{$card-subtitle-color}; - --#{$prefix}card-border-width: #{$card-border-width}; - --#{$prefix}card-border-color: #{$card-border-color}; - --#{$prefix}card-border-radius: #{$card-border-radius}; - --#{$prefix}card-box-shadow: #{$card-box-shadow}; - --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius}; - --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y}; - --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x}; - --#{$prefix}card-cap-bg: #{$card-cap-bg}; - --#{$prefix}card-cap-color: #{$card-cap-color}; - --#{$prefix}card-height: #{$card-height}; - --#{$prefix}card-color: #{$card-color}; - --#{$prefix}card-bg: #{$card-bg}; - --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding}; - --#{$prefix}card-group-margin: #{$card-group-margin}; - // scss-docs-end card-css-vars - - position: relative; - display: flex; - flex-direction: column; - min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 - height: var(--#{$prefix}card-height); - color: var(--#{$prefix}body-color); - word-wrap: break-word; - background-color: var(--#{$prefix}card-bg); - background-clip: border-box; - border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - @include border-radius(var(--#{$prefix}card-border-radius)); - @include box-shadow(var(--#{$prefix}card-box-shadow)); - - > hr { - margin-right: 0; - margin-left: 0; - } - - > .list-group { - border-top: inherit; - border-bottom: inherit; - - &:first-child { - border-top-width: 0; - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); - } - - &:last-child { - border-bottom-width: 0; - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); - } - } - - // Due to specificity of the above selector (`.card > .list-group`), we must - // use a child selector here to prevent double borders. - > .card-header + .list-group, - > .list-group + .card-footer { - border-top: 0; - } -} - -.card-body { - // Enable `flex-grow: 1` for decks and groups so that card blocks take up - // as much space as possible, ensuring footers are aligned to the bottom. - flex: 1 1 auto; - padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x); - color: var(--#{$prefix}card-color); -} - -.card-title { - margin-bottom: var(--#{$prefix}card-title-spacer-y); - color: var(--#{$prefix}card-title-color); -} - -.card-subtitle { - margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list - margin-bottom: 0; - color: var(--#{$prefix}card-subtitle-color); -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link { - &:hover { - text-decoration: if($link-hover-decoration == underline, none, null); - } - - + .card-link { - margin-left: var(--#{$prefix}card-spacer-x); - } -} - -// -// Optional textual caps -// - -.card-header { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - margin-bottom: 0; // Removes the default margin-bottom of - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:first-child { - @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0); - } -} - -.card-footer { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:last-child { - @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius)); - } -} - - -// -// Header navs -// - -.card-header-tabs { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - border-bottom: 0; - - .nav-link.active { - background-color: var(--#{$prefix}card-bg); - border-bottom-color: var(--#{$prefix}card-bg); - } -} - -.card-header-pills { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list -} - -// Card image -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: var(--#{$prefix}card-img-overlay-padding); - @include border-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch -} - -.card-img, -.card-img-top { - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-bottom { - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); -} - - -// -// Card groups -// - -.card-group { - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - margin-bottom: var(--#{$prefix}card-group-margin); - } - - @include media-breakpoint-up(sm) { - display: flex; - flex-flow: row wrap; - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - flex: 1 0 0; - margin-bottom: 0; - - + .card { - margin-left: 0; - border-left: 0; - } - - // Handle rounded corners - @if $enable-rounded { - &:not(:last-child) { - @include border-end-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-right-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-right-radius: 0; - } - } - - &:not(:first-child) { - @include border-start-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-left-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-left-radius: 0; - } - } - } - } - } -} diff --git a/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss b/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss deleted file mode 100644 index 5ebf6b1..0000000 --- a/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss +++ /dev/null @@ -1,226 +0,0 @@ -// Notes on the classes: -// -// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) -// even when their scroll action started on a carousel, but for compatibility (with Firefox) -// we're preventing all actions instead -// 2. The .carousel-item-start and .carousel-item-end is used to indicate where -// the active slide is heading. -// 3. .active.carousel-item is the current slide. -// 4. .active.carousel-item-start and .active.carousel-item-end is the current -// slide in its in-transition state. Only one of these occurs at a time. -// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end -// is the upcoming slide in transition. - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; - @include clearfix(); -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - @include transition($carousel-transition); -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); -} - - -// -// Alternate transitions -// - -.carousel-fade { - .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; - } - - .carousel-item.active, - .carousel-item-next.carousel-item-start, - .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; - } - - .active.carousel-item-start, - .active.carousel-item-end { - z-index: 0; - opacity: 0; - @include transition(opacity 0s $carousel-transition-duration); - } -} - - -// -// Left/right controls for nav -// - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - // Use flex for alignment (1-3) - display: flex; // 1. allow flex styles - align-items: center; // 2. vertically center contents - justify-content: center; // 3. horizontally center contents - width: $carousel-control-width; - padding: 0; - color: $carousel-control-color; - text-align: center; - background: none; - filter: var(--#{$prefix}carousel-control-icon-filter); - border: 0; - opacity: $carousel-control-opacity; - @include transition($carousel-control-transition); - - // Hover/focus state - &:hover, - &:focus { - color: $carousel-control-color; - text-decoration: none; - outline: 0; - opacity: $carousel-control-hover-opacity; - } -} -.carousel-control-prev { - left: 0; - background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); -} -.carousel-control-next { - right: 0; - background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); -} - -// Icons for within -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: $carousel-control-icon-width; - height: $carousel-control-icon-width; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; -} - -.carousel-control-prev-icon { - background-image: escape-svg($carousel-control-prev-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-next-icon-bg) + "*/"}; -} -.carousel-control-next-icon { - background-image: escape-svg($carousel-control-next-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-prev-icon-bg) + "*/"}; -} - -// Optional indicator pips/controls -// -// Add a container (such as a list) with the following class and add an item (ideally a focusable control, -// like a button) with data-bs-target for each slide your carousel holds. - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - // Use the .carousel-control's width as margin so we don't overlay those - margin-right: $carousel-control-width; - margin-bottom: 1rem; - margin-left: $carousel-control-width; - - [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: $carousel-indicator-width; - height: $carousel-indicator-height; - padding: 0; - margin-right: $carousel-indicator-spacer; - margin-left: $carousel-indicator-spacer; - text-indent: -999px; - cursor: pointer; - background-color: var(--#{$prefix}carousel-indicator-active-bg); - background-clip: padding-box; - border: 0; - // Use transparent borders to increase the hit area by 10px on top and bottom. - border-top: $carousel-indicator-hit-area-height solid transparent; - border-bottom: $carousel-indicator-hit-area-height solid transparent; - opacity: $carousel-indicator-opacity; - @include transition($carousel-indicator-transition); - } - - .active { - opacity: $carousel-indicator-active-opacity; - } -} - - -// Optional captions -// -// - -.carousel-caption { - position: absolute; - right: (100% - $carousel-caption-width) * .5; - bottom: $carousel-caption-spacer; - left: (100% - $carousel-caption-width) * .5; - padding-top: $carousel-caption-padding-y; - padding-bottom: $carousel-caption-padding-y; - color: var(--#{$prefix}carousel-caption-color); - text-align: center; -} - -// Dark mode carousel - -@mixin carousel-dark() { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg-dark}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color-dark}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter-dark}; -} - -.carousel-dark { - @include carousel-dark(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include carousel-dark(); - } -} diff --git a/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss b/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss deleted file mode 100644 index d53c96f..0000000 --- a/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss +++ /dev/null @@ -1,66 +0,0 @@ -// Transparent background and border properties included for button version. -// iOS requires the button element instead of an anchor tag. -// If you want the anchor version, it requires `href="#"`. -// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile - -.btn-close { - // scss-docs-start close-css-vars - --#{$prefix}btn-close-color: #{$btn-close-color}; - --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) }; - --#{$prefix}btn-close-opacity: #{$btn-close-opacity}; - --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity}; - --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow}; - --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity}; - --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity}; - // scss-docs-end close-css-vars - - box-sizing: content-box; - width: $btn-close-width; - height: $btn-close-height; - padding: $btn-close-padding-y $btn-close-padding-x; - color: var(--#{$prefix}btn-close-color); - background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements - filter: var(--#{$prefix}btn-close-filter); - border: 0; // for button elements - @include border-radius(); - opacity: var(--#{$prefix}btn-close-opacity); - - // Override 's hover style - &:hover { - color: var(--#{$prefix}btn-close-color); - text-decoration: none; - opacity: var(--#{$prefix}btn-close-hover-opacity); - } - - &:focus { - outline: 0; - box-shadow: var(--#{$prefix}btn-close-focus-shadow); - opacity: var(--#{$prefix}btn-close-focus-opacity); - } - - &:disabled, - &.disabled { - pointer-events: none; - user-select: none; - opacity: var(--#{$prefix}btn-close-disabled-opacity); - } -} - -@mixin btn-close-white() { - --#{$prefix}btn-close-filter: #{$btn-close-filter-dark}; -} - -.btn-close-white { - @include btn-close-white(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}btn-close-filter: #{$btn-close-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include btn-close-white(); - } -} diff --git a/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss b/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss deleted file mode 100644 index 83b3138..0000000 --- a/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss +++ /dev/null @@ -1,41 +0,0 @@ -// Container widths -// -// Set the container width, and override it for fixed navbars in media queries. - -@if $enable-container-classes { - // Single container class with breakpoint max-widths - .container, - // 100% wide container at all breakpoints - .container-fluid { - @include make-container(); - } - - // Responsive containers that are 100% wide until a breakpoint - @each $breakpoint, $container-max-width in $container-max-widths { - .container-#{$breakpoint} { - @extend .container-fluid; - } - - @include media-breakpoint-up($breakpoint, $grid-breakpoints) { - %responsive-container-#{$breakpoint} { - max-width: $container-max-width; - } - - // Extend each breakpoint which is smaller or equal to the current breakpoint - $extend-breakpoint: true; - - @each $name, $width in $grid-breakpoints { - @if ($extend-breakpoint) { - .container#{breakpoint-infix($name, $grid-breakpoints)} { - @extend %responsive-container-#{$breakpoint}; - } - - // Once the current breakpoint is reached, stop extending - @if ($breakpoint == $name) { - $extend-breakpoint: false; - } - } - } - } - } -} diff --git a/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss b/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss deleted file mode 100644 index 587ebb4..0000000 --- a/05_react/unterricht/tag41/01_components-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss +++ /dev/null @@ -1,250 +0,0 @@ -// The dropdown wrapper (`
      `) -.dropup, -.dropend, -.dropdown, -.dropstart, -.dropup-center, -.dropdown-center { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; - - // Generate the caret automatically - @include caret(); -} - -// The dropdown menu -.dropdown-menu { - // scss-docs-start dropdown-css-vars - --#{$prefix}dropdown-zindex: #{$zindex-dropdown}; - --#{$prefix}dropdown-min-width: #{$dropdown-min-width}; - --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x}; - --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y}; - --#{$prefix}dropdown-spacer: #{$dropdown-spacer}; - @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size); - --#{$prefix}dropdown-color: #{$dropdown-color}; - --#{$prefix}dropdown-bg: #{$dropdown-bg}; - --#{$prefix}dropdown-border-color: #{$dropdown-border-color}; - --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius}; - --#{$prefix}dropdown-border-width: #{$dropdown-border-width}; - --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius}; - --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg}; - --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y}; - --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow}; - --#{$prefix}dropdown-link-color: #{$dropdown-link-color}; - --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color}; - --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg}; - --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color}; - --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg}; - --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color}; - --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x}; - --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y}; - --#{$prefix}dropdown-header-color: #{$dropdown-header-color}; - --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x}; - --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y}; - // scss-docs-end dropdown-css-vars - - position: absolute; - z-index: var(--#{$prefix}dropdown-zindex); - display: none; // none by default, but block on "open" of the menu - min-width: var(--#{$prefix}dropdown-min-width); - padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x); - margin: 0; // Override default margin of ul - @include font-size(var(--#{$prefix}dropdown-font-size)); - color: var(--#{$prefix}dropdown-color); - text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) - list-style: none; - background-color: var(--#{$prefix}dropdown-bg); - background-clip: padding-box; - border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color); - @include border-radius(var(--#{$prefix}dropdown-border-radius)); - @include box-shadow(var(--#{$prefix}dropdown-box-shadow)); - - &[data-bs-popper] { - top: 100%; - left: 0; - margin-top: var(--#{$prefix}dropdown-spacer); - } - - @if $dropdown-padding-y == 0 { - > .dropdown-item:first-child, - > li:first-child .dropdown-item { - @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - > .dropdown-item:last-child, - > li:last-child .dropdown-item { - @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - - } -} - -// scss-docs-start responsive-breakpoints -// We deliberately hardcode the `bs-` prefix because we check -// this custom property in JS to determine Popper's positioning - -@each $breakpoint in map-keys($grid-breakpoints) { - @include media-breakpoint-up($breakpoint) { - $infix: breakpoint-infix($breakpoint, $grid-breakpoints); - - .dropdown-menu#{$infix}-start { - --bs-position: start; - - &[data-bs-popper] { - right: auto; - left: 0; - } - } - - .dropdown-menu#{$infix}-end { - --bs-position: end; - - &[data-bs-popper] { - right: 0; - left: auto; - } - } - } -} -// scss-docs-end responsive-breakpoints - -// Allow for dropdowns to go bottom up (aka, dropup-menu) -// Just add .dropup after the standard .dropdown class and you're set. -.dropup { - .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(up); - } -} - -.dropend { - .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(end); - &::after { - vertical-align: 0; - } - } -} - -.dropstart { - .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(start); - &::before { - vertical-align: 0; - } - } -} - - -// Dividers (basically an `
      `) within the dropdown -.dropdown-divider { - height: 0; - margin: var(--#{$prefix}dropdown-divider-margin-y) 0; - overflow: hidden; - border-top: 1px solid var(--#{$prefix}dropdown-divider-bg); - opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
      element -} - -// Links, buttons, and more within the dropdown menu -// -// `
      ` alignment by inheriting `text-align`. -// 3. Fix alignment for Safari - -th { - font-weight: $table-th-font-weight; // 1 - text-align: inherit; // 2 - text-align: -webkit-match-parent; // 3 -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - - -// Forms -// -// 1. Allow labels to use `margin` for spacing. - -label { - display: inline-block; // 1 -} - -// Remove the default `border-radius` that macOS Chrome adds. -// See https://github.com/twbs/bootstrap/issues/24093 - -button { - // stylelint-disable-next-line property-disallowed-list - border-radius: 0; -} - -// Explicitly remove focus outline in Chromium when it shouldn't be -// visible (e.g. as result of mouse click or touch tap). It already -// should be doing this automatically, but seems to currently be -// confused and applies its very visible two-tone outline anyway. - -button:focus:not(:focus-visible) { - outline: 0; -} - -// 1. Remove the margin in Firefox and Safari - -input, -button, -select, -optgroup, -textarea { - margin: 0; // 1 - font-family: inherit; - @include font-size(inherit); - line-height: inherit; -} - -// Remove the inheritance of text transform in Firefox -button, -select { - text-transform: none; -} -// Set the cursor for non-` - - - - ); -}; - -// Page Komponenten -const HomePage = () => { - return ( -
      -

      Home

      -

      - Lorem, ipsum dolor sit amet consectetur adipisicing elit. Nam debitis autem cupiditate, unde ad, eveniet - adipisci recusandae molestias architecto deserunt quae, aut sunt alias repellendus cumque asperiores facere - animi? Pariatur dolores, voluptatibus earum at nihil quo accusamus debi -

      -
      - ); -}; - -const AboutPage = () => { - return ( -
      -

      About

      -

      - Lorem, ipsum dolor sit amet consectetur adipisicing elit. Nam debitis autem cupiditate, unde ad, eveniet - adipisci recusandae molestias architecto deserunt quae, aut sunt alias repellendus cumque asperiores facere - animi? Pariatur dolores, voluptatibus earum at nihil quo accusamus debi -

      -
      - ); -}; - -function App(props) { - // const { } = props; - - return ( - - -
      - - } /> - } /> - -
      -
      - ); -} -export default App; diff --git a/05_react/unterricht/tag41/02_react-router-simple/src/assets/hero.png b/05_react/unterricht/tag41/02_react-router-simple/src/assets/hero.png deleted file mode 100644 index 02251f4..0000000 Binary files a/05_react/unterricht/tag41/02_react-router-simple/src/assets/hero.png and /dev/null differ diff --git a/05_react/unterricht/tag41/02_react-router-simple/src/assets/react.svg b/05_react/unterricht/tag41/02_react-router-simple/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/05_react/unterricht/tag41/02_react-router-simple/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/05_react/unterricht/tag41/02_react-router-simple/src/assets/vite.svg b/05_react/unterricht/tag41/02_react-router-simple/src/assets/vite.svg deleted file mode 100644 index 5101b67..0000000 --- a/05_react/unterricht/tag41/02_react-router-simple/src/assets/vite.svg +++ /dev/null @@ -1 +0,0 @@ -Vite diff --git a/05_react/unterricht/tag41/02_react-router-simple/src/main.jsx b/05_react/unterricht/tag41/02_react-router-simple/src/main.jsx deleted file mode 100644 index 8a8657a..0000000 --- a/05_react/unterricht/tag41/02_react-router-simple/src/main.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; - -// import und bundle from node_modules/bootstrap/dist/css/bootstrap.min.cs -import 'bootstrap/dist/css/bootstrap.min.css'; - -import App from './App.jsx'; - -createRoot(document.getElementById('root')).render( - - - , -); diff --git a/05_react/unterricht/tag41/02_react-router-simple/vite.config.js b/05_react/unterricht/tag41/02_react-router-simple/vite.config.js deleted file mode 100644 index 8b0f57b..0000000 --- a/05_react/unterricht/tag41/02_react-router-simple/vite.config.js +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' - -// https://vite.dev/config/ -export default defineConfig({ - plugins: [react()], -}) diff --git a/05_react/unterricht/tag42/01_react-with-routes/.gitignore b/05_react/unterricht/tag42/01_react-with-routes/.gitignore deleted file mode 100644 index a547bf3..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/05_react/unterricht/tag42/01_react-with-routes/.oxlintrc.json b/05_react/unterricht/tag42/01_react-with-routes/.oxlintrc.json deleted file mode 100644 index 1255078..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/.oxlintrc.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$schema": "./node_modules/oxlint/configuration_schema.json", - "plugins": ["react", "oxc"], - "rules": { - "react/rules-of-hooks": "error", - "react/only-export-components": ["warn", { "allowConstantExport": true }] - } -} diff --git a/05_react/unterricht/tag42/01_react-with-routes/README.md b/05_react/unterricht/tag42/01_react-with-routes/README.md deleted file mode 100644 index d937833..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# React + Vite - -This template provides a minimal setup to get React working in Vite with HMR and some Oxlint rules. - -Currently, two official plugins are available: - -- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs) -- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) - -## React Compiler - -The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). - -## Expanding the Oxlint configuration - -If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and Oxlint's TypeScript related rules in your project. diff --git a/05_react/unterricht/tag42/01_react-with-routes/index.html b/05_react/unterricht/tag42/01_react-with-routes/index.html deleted file mode 100644 index 4136e5b..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - 01_react-with-routes - - -
      - - - diff --git a/05_react/unterricht/tag42/01_react-with-routes/package-lock.json b/05_react/unterricht/tag42/01_react-with-routes/package-lock.json deleted file mode 100644 index 094b7f4..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/package-lock.json +++ /dev/null @@ -1,2237 +0,0 @@ -{ - "name": "01_react-with-routes", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "01_react-with-routes", - "version": "0.0.0", - "dependencies": { - "bootstrap": "^5.3.8", - "react": "^19.2.8", - "react-dom": "^19.2.8", - "react-icons": "^5.7.0", - "react-router-dom": "^7.18.2" - }, - "devDependencies": { - "@types/react": "^19.2.18", - "@types/react-dom": "^19.2.4", - "@vitejs/plugin-react": "^6.0.5", - "oxlint": "^1.78.0", - "sass-embedded": "^1.100.0", - "vite": "^8.2.1" - } - }, - "node_modules/@bufbuild/protobuf": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.13.0.tgz", - "integrity": "sha512-acq7c49vxfm1ggJ95P70TX7ABDM0vxr1SYD3BB0o0jnBLB4OAqeHyKuN+cD3w80gXEDQ2zxHpR6CUeA+O/aU9g==", - "dev": true, - "license": "(Apache-2.0 AND BSD-3-Clause)" - }, - "node_modules/@oxc-project/types": { - "version": "0.143.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.143.0.tgz", - "integrity": "sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@oxlint/binding-android-arm-eabi": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.78.0.tgz", - "integrity": "sha512-Bu819lmAfZMUHErrpe0cEWj3iaefuUODHSU8+UbXy67V/r7/7f4K3FL0NmbD85E+wiFLDYuhP8Zlv0XnVeXshw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-android-arm64": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.78.0.tgz", - "integrity": "sha512-CDfxZgB61B7buRdY2FJoAYYPPXCZ1EoC1LKscnC5dg3kjobdxiconvAvvN1BmHyW4PyFT3jRLDag/BY/roSNBQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-darwin-arm64": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.78.0.tgz", - "integrity": "sha512-2Y2U9Ahrz+OO0Ej88f9SJYq51/jUBp1Mc7iZu0ukrbeeZ3gpRGfzIFnoqfHDY96xr0GEfNrPUBFEy0nN5aD7HA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-darwin-x64": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.78.0.tgz", - "integrity": "sha512-rpych6eJq6m9jDRypTEaPD1xysaEW5h9+xuxhGK/QhOg+/xaqPZrCrTNoIl/f3nEjuJeCEmstNDlrE9rJi/3/g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-freebsd-x64": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.78.0.tgz", - "integrity": "sha512-IcMGrQT3QizkOESUJd5et+rOhVqSkNDfNik1cvrKDqIbzqx9KMtRswpFgkCuNTSwylCFLKhGUu8KmqY1ZnC0Dg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm-gnueabihf": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.78.0.tgz", - "integrity": "sha512-/uLdoJ0IXE6vo/0f0LKjinQAp+re+VMaCWaNT8ENIv2EOCkSsc8SGaflXAuW0Jua2dq5+GLVWm1NQK7P3UFSNQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm-musleabihf": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.78.0.tgz", - "integrity": "sha512-7xi4Wb/O8NRJhLoUXmDJMUVpNYvB5kefdhFU1Jb8rtae4QoXlTiLwI14X4YvAXVZLNZChP8m5qO9SQAlWQTbkQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm64-gnu": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.78.0.tgz", - "integrity": "sha512-4hFW0+fVXa3OIh1Y4A5SPkmvI4wuuBSrCVKzOyE7PTjhc7yEqZ1pmvEEeS5Lj/MaqvegFxXyF33N+6jkehxdyg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm64-musl": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.78.0.tgz", - "integrity": "sha512-oC0mvsgBJjlMijSDEhx9KuvR9zYeHXceA9MjbuXB1F8NSR78Yj2unOBrstEvTVaq+pko+kuue6DajC00eqvTdg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-ppc64-gnu": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.78.0.tgz", - "integrity": "sha512-XAllT5SUZS+ohjuZ3/5S0cwe0r7eboiuigeStCZ5DXRYx/2KVM2UvQXvAfyzXEimtQjAB7cDQ2YxDe2Zl2WNQQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-riscv64-gnu": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.78.0.tgz", - "integrity": "sha512-trucMER/0QtecoXvc1y/UVqE3kwJipDwrx4oHfj+nNm3dq2zjP44WT0CfHNDPM3G1DXIkx/gY6lAD21NSCZVhA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-riscv64-musl": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.78.0.tgz", - "integrity": "sha512-cm3O4F/HQbdzOUX5mKHqG5KDL6E5w0pnlZ+fbBy2rmLryPOowkuLagFHTopQsEIpjcaZoPOrL+BmmAytAG9HFg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-s390x-gnu": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.78.0.tgz", - "integrity": "sha512-33wRf6HqGNsybJ3qX4cGaQN2ODPxNmc1rMa0mrTmx3eFq1VzOnvQooi9bIGVYakW8a/wmqVx1mgsUm8R2xfTiw==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-x64-gnu": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.78.0.tgz", - "integrity": "sha512-rRdISSYegj6VganMZ9tjRjijowfHJ09IZU01i0toBAqr6n5LEtwHq2IeS4FjW2RoskOHlb6efB26H5izYb3GEQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-x64-musl": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.78.0.tgz", - "integrity": "sha512-GmsP4rW0xTL6u5CVdcDsaN5Fbc7hBc382Wmar1kttbnwSEviM+rSINKOMQ+UQ6iH+AGwC+8gaAiwu134Tgh6Lg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-openharmony-arm64": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.78.0.tgz", - "integrity": "sha512-sy9yeYuADc8a+n4TLBayzMCZiHPW78DcIFVpOXTmdKHWQeM9xe5uzkqIIZmi326D5hY9XVwacipEB1p7tQjPAg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-arm64-msvc": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.78.0.tgz", - "integrity": "sha512-rjc2hF1KfMi8fZj1X/m3AmnHbdsF3rL0v6KQg0Uc880Yb2khjz+3U14sfdZ7jWTpRnN1m1NQa/TT7uU9lJWPrA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-ia32-msvc": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.78.0.tgz", - "integrity": "sha512-zcuXFVrEFHIafRfkCQT8w/Xe41o07ozl/vwHq7p94vB29xVzsB0sZGYORU1jhcYKv3Lr0J3HbJ2T4fHH5rWmvA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-x64-msvc": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.78.0.tgz", - "integrity": "sha512-Sb5ocmLSuYeOuXd+CFOToGKp/gjXUEWDnvIGwhnh8aq8wY4TMmEnKnvbogSW7RdMZv77JSARduS7/gv+khYEjA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz", - "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.3", - "is-glob": "^4.0.3", - "node-addon-api": "^7.0.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.6.0", - "@parcel/watcher-darwin-arm64": "2.6.0", - "@parcel/watcher-darwin-x64": "2.6.0", - "@parcel/watcher-freebsd-x64": "2.6.0", - "@parcel/watcher-linux-arm-glibc": "2.6.0", - "@parcel/watcher-linux-arm-musl": "2.6.0", - "@parcel/watcher-linux-arm64-glibc": "2.6.0", - "@parcel/watcher-linux-arm64-musl": "2.6.0", - "@parcel/watcher-linux-x64-glibc": "2.6.0", - "@parcel/watcher-linux-x64-musl": "2.6.0", - "@parcel/watcher-win32-arm64": "2.6.0", - "@parcel/watcher-win32-x64": "2.6.0" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz", - "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz", - "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz", - "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz", - "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz", - "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz", - "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz", - "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz", - "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz", - "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz", - "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz", - "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz", - "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "license": "MIT", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.3.tgz", - "integrity": "sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.3.tgz", - "integrity": "sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.3.tgz", - "integrity": "sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.3.tgz", - "integrity": "sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.3.tgz", - "integrity": "sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.3.tgz", - "integrity": "sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.3.tgz", - "integrity": "sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.3.tgz", - "integrity": "sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.3.tgz", - "integrity": "sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.3.tgz", - "integrity": "sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.3.tgz", - "integrity": "sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.3.tgz", - "integrity": "sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.3.tgz", - "integrity": "sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.3.tgz", - "integrity": "sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.2.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", - "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.5.tgz", - "integrity": "sha512-BOVzne/NL162sMdResB25mUv+vWMF5NoAjNf09TeGlE7ZpszZWSD3winycicLJw72yeVsoCn/2kOhEuCvEShMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rolldown/pluginutils": "^1.0.1" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", - "babel-plugin-react-compiler": "^1.0.0", - "vite": "^8.0.0" - }, - "peerDependenciesMeta": { - "@rolldown/plugin-babel": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true - } - } - }, - "node_modules/bootstrap": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz", - "integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/twbs" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - } - ], - "license": "MIT", - "peerDependencies": { - "@popperjs/core": "^2.11.8" - } - }, - "node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/colorjs.io": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", - "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", - "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/immutable": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", - "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lightningcss": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", - "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.33.0", - "lightningcss-darwin-arm64": "1.33.0", - "lightningcss-darwin-x64": "1.33.0", - "lightningcss-freebsd-x64": "1.33.0", - "lightningcss-linux-arm-gnueabihf": "1.33.0", - "lightningcss-linux-arm64-gnu": "1.33.0", - "lightningcss-linux-arm64-musl": "1.33.0", - "lightningcss-linux-x64-gnu": "1.33.0", - "lightningcss-linux-x64-musl": "1.33.0", - "lightningcss-win32-arm64-msvc": "1.33.0", - "lightningcss-win32-x64-msvc": "1.33.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", - "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", - "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", - "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", - "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", - "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", - "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", - "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", - "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", - "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", - "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", - "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/nanoid": { - "version": "3.3.18", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", - "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/oxlint": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.78.0.tgz", - "integrity": "sha512-QgQePuxIqKOzo1KSjG2EnITEeWvWnKAm77eq8nrMtf6AGoA+zyGc4PFYtDNJSD25g/ibOwfQ851hZ4/SPkMVoA==", - "dev": true, - "license": "MIT", - "bin": { - "oxlint": "bin/oxlint" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/Boshen" - }, - "optionalDependencies": { - "@oxlint/binding-android-arm-eabi": "1.78.0", - "@oxlint/binding-android-arm64": "1.78.0", - "@oxlint/binding-darwin-arm64": "1.78.0", - "@oxlint/binding-darwin-x64": "1.78.0", - "@oxlint/binding-freebsd-x64": "1.78.0", - "@oxlint/binding-linux-arm-gnueabihf": "1.78.0", - "@oxlint/binding-linux-arm-musleabihf": "1.78.0", - "@oxlint/binding-linux-arm64-gnu": "1.78.0", - "@oxlint/binding-linux-arm64-musl": "1.78.0", - "@oxlint/binding-linux-ppc64-gnu": "1.78.0", - "@oxlint/binding-linux-riscv64-gnu": "1.78.0", - "@oxlint/binding-linux-riscv64-musl": "1.78.0", - "@oxlint/binding-linux-s390x-gnu": "1.78.0", - "@oxlint/binding-linux-x64-gnu": "1.78.0", - "@oxlint/binding-linux-x64-musl": "1.78.0", - "@oxlint/binding-openharmony-arm64": "1.78.0", - "@oxlint/binding-win32-arm64-msvc": "1.78.0", - "@oxlint/binding-win32-ia32-msvc": "1.78.0", - "@oxlint/binding-win32-x64-msvc": "1.78.0" - }, - "peerDependencies": { - "oxlint-tsgolint": ">=7.0.2001", - "vite-plus": "*" - }, - "peerDependenciesMeta": { - "oxlint-tsgolint": { - "optional": true - }, - "vite-plus": { - "optional": true - } - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", - "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.17", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/react": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", - "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", - "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.8" - } - }, - "node_modules/react-icons": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.7.0.tgz", - "integrity": "sha512-LBLy340Rzqy6+/yVhZKT3B/QpP1BZaesGqasf09HPOBzRarcDIFH0WwXlXQfE7q7ipxK4MSiC5DIBWURCny6fw==", - "license": "MIT", - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-router": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.2.tgz", - "integrity": "sha512-aUVMjFm3GAPTTZL7oYr5E7ETiqfQCHRLH+B+5afnICvf0r7kkK4eR6SMuwbSTJw/7t+12khT/Kahij49fqOCIg==", - "license": "MIT", - "dependencies": { - "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/react-router-dom": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.2.tgz", - "integrity": "sha512-AIKJ/jgGlFb3EbfCXk5Gzshiwt+l3mqbCrNjmEWMMjqQxNJ3svBa6bgzFyCC2Sw3RA0VWF1kg3uQf2OFhxb8hw==", - "license": "MIT", - "dependencies": { - "react-router": "7.18.2" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - } - }, - "node_modules/readdirp": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", - "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/rolldown": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.3.tgz", - "integrity": "sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "=0.143.0", - "@rolldown/pluginutils": "^1.0.0" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.2.3", - "@rolldown/binding-darwin-arm64": "1.2.3", - "@rolldown/binding-darwin-x64": "1.2.3", - "@rolldown/binding-freebsd-x64": "1.2.3", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.3", - "@rolldown/binding-linux-arm64-gnu": "1.2.3", - "@rolldown/binding-linux-arm64-musl": "1.2.3", - "@rolldown/binding-linux-ppc64-gnu": "1.2.3", - "@rolldown/binding-linux-s390x-gnu": "1.2.3", - "@rolldown/binding-linux-x64-gnu": "1.2.3", - "@rolldown/binding-linux-x64-musl": "1.2.3", - "@rolldown/binding-openharmony-arm64": "1.2.3", - "@rolldown/binding-win32-arm64-msvc": "1.2.3", - "@rolldown/binding-win32-x64-msvc": "1.2.3" - } - }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/sass": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.100.0.tgz", - "integrity": "sha512-B5j0rYMlinhhOo9tjQebMVVn0TfyXAF+wB3b2ggZUuJ/is/Y+7+JGjirAMxHZ9Z3hIP98NPfamlAkBHa1lAaXQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "chokidar": "^5.0.0", - "immutable": "^5.1.5", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=20.19.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" - } - }, - "node_modules/sass-embedded": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.100.0.tgz", - "integrity": "sha512-Ut8wlQSk19tm7jMK6mz6cF1+e+E7tUnW2tM02zQDPnOTcVbV8qCQG8UWxZkkNlY50+hV3hqP24OOkUlMz8xBpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@bufbuild/protobuf": "^2.5.0", - "colorjs.io": "^0.5.0", - "immutable": "^5.1.5", - "rxjs": "^7.4.0", - "supports-color": "^8.1.1", - "sync-child-process": "^1.0.2", - "varint": "^6.0.0" - }, - "bin": { - "sass": "dist/bin/sass.js" - }, - "engines": { - "node": ">=16.0.0" - }, - "optionalDependencies": { - "sass-embedded-all-unknown": "1.100.0", - "sass-embedded-android-arm": "1.100.0", - "sass-embedded-android-arm64": "1.100.0", - "sass-embedded-android-riscv64": "1.100.0", - "sass-embedded-android-x64": "1.100.0", - "sass-embedded-darwin-arm64": "1.100.0", - "sass-embedded-darwin-x64": "1.100.0", - "sass-embedded-linux-arm": "1.100.0", - "sass-embedded-linux-arm64": "1.100.0", - "sass-embedded-linux-musl-arm": "1.100.0", - "sass-embedded-linux-musl-arm64": "1.100.0", - "sass-embedded-linux-musl-riscv64": "1.100.0", - "sass-embedded-linux-musl-x64": "1.100.0", - "sass-embedded-linux-riscv64": "1.100.0", - "sass-embedded-linux-x64": "1.100.0", - "sass-embedded-unknown-all": "1.100.0", - "sass-embedded-win32-arm64": "1.100.0", - "sass-embedded-win32-x64": "1.100.0" - } - }, - "node_modules/sass-embedded-all-unknown": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.100.0.tgz", - "integrity": "sha512-auFtXY/kwYILmSVjtBDwyj0axcLbYYiffOKWoaXHnI5bsYwiRbBh3EneR1rpbX2ZIZCrwX93i5pxKLTZF/662Q==", - "cpu": [ - "!arm", - "!arm64", - "!riscv64", - "!x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "sass": "1.100.0" - } - }, - "node_modules/sass-embedded-android-arm": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.100.0.tgz", - "integrity": "sha512-70f3HgX2pFNmzpGQ86n5e6QfWn2fP4QUQGfFQK0P1XH73ZLIzLo2YqygrGKGKeeqtc5eU2Wl1/xQzhzuKnO4kw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-arm64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.100.0.tgz", - "integrity": "sha512-W+Ru9JwTnfU0UX3jSZcbqFdtKFMcYdfFwytc57h2DgnqCOIiAqI2E06mABZBZC+r3LwXCBuS5GbXAGeVgvVDkA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-riscv64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.100.0.tgz", - "integrity": "sha512-icU3o0V/uCSytSpf+tX5Lf51BvyQEbLzDUJfUi9etSauYBGHpPKkdtdZH0si4v98phq11Kl8rSV1SggksxF1Hg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-x64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.100.0.tgz", - "integrity": "sha512-mevF9VQk6gEYByy8+jusaHGmd7Usb2ytX/DsEOd0JtOGCtcf1kh575xJ6OUBDIcJ15uLnbau/0iy1eP6WVBvWA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-darwin-arm64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.100.0.tgz", - "integrity": "sha512-1PVlYi61POo93IT/FfrG1mc1tAHxeSTyUALF2aOFmXGWjVXr3bQzEQiBGCOvQbj/ix+5hNyXFXcEMEyKvtUJJA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-darwin-x64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.100.0.tgz", - "integrity": "sha512-x97o3JnGyImZNCIVs9wQHJUE5QCvmVIKaH1cwrz/5dK7OT1FpeNiW+u9TUomP9hG6Ekjd8EL8NBHpxTfIhdjmg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-arm": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.100.0.tgz", - "integrity": "sha512-9Ul7O1eKrc5YlhwWjkp8tZPSe3UEwSZ1uwUZOQom1HL0pRlBA6F/IlGZYFTLwnHMIP1fc77MMNaBRfc05mKMpw==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-arm64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.100.0.tgz", - "integrity": "sha512-Dwjmj8Z6VRy7rAi53JAdEwIyUjpfl7PhpSc2/LpQPQx+aO5Dp7Spaipkax0ufJl1SoDUdchCsM4y/88YaluorQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-arm": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.100.0.tgz", - "integrity": "sha512-sl0JgbGloPyJg66XXx5UDSDScZ0oU85DpMQU4JU/sCUCFj1Z8zZ69SJWKTCNE4/jwnce7WI2zPCV5AG+RHOZJw==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-arm64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.100.0.tgz", - "integrity": "sha512-XpACJB2KjSLjf2e9uuvGVdOURsoNrFqgRiihhXyUHK9W0t3LIHb7z5MA/7XGPIT9bWSOO2zyw+rH/FHtDV/Yrg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-riscv64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.100.0.tgz", - "integrity": "sha512-ShvI0Kx04mwoCARwZ0UjiT97isQvzO80tAt91zmFyHLN9kelc/IrQi940farSm2xQVPCKdeVyeG0ekBsokSpYQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-x64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.100.0.tgz", - "integrity": "sha512-TDBCRWNuS4RDLQXvRc1gjZlWiWTWaWGp0Bwu/IKwJxov81lsvrCs3TihTyNXtW7V5aoN4Ky3r0QOkNb3mwmBnA==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-riscv64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.100.0.tgz", - "integrity": "sha512-j4ENJGOheO+fm3j/yorLxCjBP6/XskrZx7dTLlT+lXYwN/qqCqoA/gsNLI0McS3DFM6GBwPiffzWsdWS8t6sEQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-x64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.100.0.tgz", - "integrity": "sha512-0vUSN8j0WGtCJIOPh//EmUvYGHW0QOe5iul8qyhPk50MAcw49MA0r34AhftjDdx94ILPF6vApFs0gwHPQRlpVA==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-unknown-all": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.100.0.tgz", - "integrity": "sha512-c+naBgWId4MIpToXcI0DgqetjdAkwTTAxFAuOaBz7HUXLdyG1oZRrEvSsbe41nEdQOKH0vgofVFCeSQgoXOG9A==", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "!android", - "!darwin", - "!linux", - "!win32" - ], - "dependencies": { - "sass": "1.100.0" - } - }, - "node_modules/sass-embedded-win32-arm64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.100.0.tgz", - "integrity": "sha512-iE+yxj+hUXwwbqpHkXxgAWTzeRfcWxJ7SSTQEPMk48lwq3oCrWLlz5sQuWHbuTK/i0GKQfROdP+hOmPi89yjUg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-win32-x64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.100.0.tgz", - "integrity": "sha512-qI4F8MI7/KYoy9NdjJfhSspG42WPkADSNDvwEV7qWvCSFC83koJssRsKO2/PfY+niZz6BG65Ic/D+A11h959hw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" - }, - "node_modules/set-cookie-parser": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", - "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", - "license": "MIT" - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/sync-child-process": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz", - "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "sync-message-port": "^1.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/sync-message-port": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.2.0.tgz", - "integrity": "sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/varint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", - "dev": true, - "license": "MIT" - }, - "node_modules/vite": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.1.tgz", - "integrity": "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==", - "dev": true, - "license": "MIT", - "dependencies": { - "lightningcss": "^1.33.0", - "picomatch": "^4.0.5", - "postcss": "^8.5.25", - "rolldown": "~1.2.1", - "tinyglobby": "^0.2.17" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.4.0", - "esbuild": "^0.27.0 || ^0.28.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - } - } -} diff --git a/05_react/unterricht/tag42/01_react-with-routes/package.json b/05_react/unterricht/tag42/01_react-with-routes/package.json deleted file mode 100644 index e64cf28..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "01_react-with-routes", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "lint": "oxlint", - "preview": "vite preview" - }, - "dependencies": { - "bootstrap": "^5.3.8", - "react": "^19.2.8", - "react-dom": "^19.2.8", - "react-icons": "^5.7.0", - "react-router-dom": "^7.18.2" - }, - "devDependencies": { - "@types/react": "^19.2.18", - "@types/react-dom": "^19.2.4", - "@vitejs/plugin-react": "^6.0.5", - "oxlint": "^1.78.0", - "sass-embedded": "^1.100.0", - "vite": "^8.2.1" - } -} diff --git a/05_react/unterricht/tag42/01_react-with-routes/public/favicon.svg b/05_react/unterricht/tag42/01_react-with-routes/public/favicon.svg deleted file mode 100644 index 6893eb1..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/public/favicon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/05_react/unterricht/tag42/01_react-with-routes/public/icons.svg b/05_react/unterricht/tag42/01_react-with-routes/public/icons.svg deleted file mode 100644 index e952219..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/public/icons.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/05_react/unterricht/tag42/01_react-with-routes/src/App.jsx b/05_react/unterricht/tag42/01_react-with-routes/src/App.jsx deleted file mode 100644 index fe5d1e9..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/src/App.jsx +++ /dev/null @@ -1,17 +0,0 @@ -import Router from './routes/Router'; - -// components -import Navbar from './components/navs/Navbar'; - -function App() { - return ( - <> - -
      - -
      - - ); -} - -export default App; diff --git a/05_react/unterricht/tag42/01_react-with-routes/src/assets/hero.png b/05_react/unterricht/tag42/01_react-with-routes/src/assets/hero.png deleted file mode 100644 index 02251f4..0000000 Binary files a/05_react/unterricht/tag42/01_react-with-routes/src/assets/hero.png and /dev/null differ diff --git a/05_react/unterricht/tag42/01_react-with-routes/src/assets/react.svg b/05_react/unterricht/tag42/01_react-with-routes/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/05_react/unterricht/tag42/01_react-with-routes/src/assets/vite.svg b/05_react/unterricht/tag42/01_react-with-routes/src/assets/vite.svg deleted file mode 100644 index 5101b67..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/src/assets/vite.svg +++ /dev/null @@ -1 +0,0 @@ -Vite diff --git a/05_react/unterricht/tag42/01_react-with-routes/src/components/common/Badge.jsx b/05_react/unterricht/tag42/01_react-with-routes/src/components/common/Badge.jsx deleted file mode 100644 index 23cedae..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/src/components/common/Badge.jsx +++ /dev/null @@ -1,11 +0,0 @@ -const Badge = (props) => { - const { text = '', variant = 'secondary', color = '' } = props; - - return ( - - {text} - - ); - // {text}; -}; -export default Badge; diff --git a/05_react/unterricht/tag42/01_react-with-routes/src/components/navs/Navbar.jsx b/05_react/unterricht/tag42/01_react-with-routes/src/components/navs/Navbar.jsx deleted file mode 100644 index bc70c62..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/src/components/navs/Navbar.jsx +++ /dev/null @@ -1,44 +0,0 @@ -import { NavLink } from 'react-router-dom'; - -const Navbar = (props) => { - return ( - - ); -}; - -export default Navbar; diff --git a/05_react/unterricht/tag42/01_react-with-routes/src/main.jsx b/05_react/unterricht/tag42/01_react-with-routes/src/main.jsx deleted file mode 100644 index 1f95cf7..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/src/main.jsx +++ /dev/null @@ -1,21 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; - -import { BrowserRouter } from 'react-router-dom'; - -import App from './App.jsx'; - -// JS import -import 'bootstrap'; -// import 'bootstrap/dist/css/bootstrap.min.css'; -import './styles/main.scss'; - -const root = createRoot(document.getElementById('root')); - -root.render( - - - - - , -); diff --git a/05_react/unterricht/tag42/01_react-with-routes/src/pages/AboutPage.jsx b/05_react/unterricht/tag42/01_react-with-routes/src/pages/AboutPage.jsx deleted file mode 100644 index 0fbfc09..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/src/pages/AboutPage.jsx +++ /dev/null @@ -1,34 +0,0 @@ -const AboutPage = (props) => { - return ( -
      -

      About

      -

      - Lorem ipsum dolor sit amet consectetur adipisicing elit. Minima, voluptatibus nobis molestiae, dignissimos id - dolores minus iste quisquam harum vitae rem dolorem debitis natus asperiores amet rerum ratione laboriosam quam. - Sit corporis voluptate laboriosam doloribus incidunt voluptatibus repellat. Excepturi vitae perferendis odit - enim, iusto, consequuntur assumenda corrupti autem eius minus explicabo tempore amet? Facere repudiandae, culpa - autem quae sint accusantium! Recusandae dicta itaque pariatur, veritatis voluptatem reprehenderit? Error facilis - fugit veritatis quam harum tempore dignissimos laboriosam commodi quod. Quas magnam modi saepe quae ab ipsam - amet veritatis molestias facilis odit? Quos nihil minus suscipit vel unde ipsa non quia ex quis obcaecati fugiat - animi nobis sit ducimus libero dolorem voluptates numquam, assumenda autem? Excepturi reprehenderit hic - aspernatur tempora, maiores nihil. Itaque quisquam expedita repellat voluptate, rem delectus sed, laborum dolor - minima nam ipsum possimus odit asperiores molestiae ex fugit sequi cupiditate doloremque tempora inventore - praesentium quo! Minima minus numquam aspernatur! Laudantium quisquam perspiciatis consectetur eos, nobis - doloribus reiciendis accusamus dolor quos cum cumque voluptatibus vero harum sapiente consequuntur eaque in quas - obcaecati. Et mollitia ex esse sint facilis fuga perferendis! Saepe ipsa voluptatum, nam labore corrupti, - laboriosam, sit ex explicabo facere laborum sunt natus eaque! Accusamus culpa harum repellendus iure, quasi, cum - architecto fugit ut est voluptatem cumque nisi recusandae? Cumque culpa sequi quis dolores nostrum omnis facilis - beatae quam similique, reiciendis nam modi hic libero natus blanditiis voluptatibus, magnam quos ea voluptate - odit commodi sapiente iusto dolor molestias! Blanditiis? Accusamus itaque nulla exercitationem. Maiores vitae at - dicta ipsam. Ullam eum excepturi eius, facere cumque nulla alias ab natus distinctio officia placeat possimus - optio commodi molestias repellendus voluptatem dicta delectus? Maxime aliquid numquam qui vitae doloribus - consectetur temporibus doloremque, perspiciatis sint quia obcaecati, nemo saepe velit odio nobis laborum. Natus - iure id nostrum quidem doloribus quae explicabo deserunt et quia? Labore dicta unde eum est esse reiciendis - maiores dignissimos temporibus ullam magnam, amet exercitationem praesentium voluptas, impedit sed alias, - eveniet voluptates nisi nulla dolore sequi similique fugit? Reiciendis, animi quibusdam? Pariatur sequi cum -

      -
      - ); -}; - -export default AboutPage; diff --git a/05_react/unterricht/tag42/01_react-with-routes/src/pages/ContactPage.jsx b/05_react/unterricht/tag42/01_react-with-routes/src/pages/ContactPage.jsx deleted file mode 100644 index 277924f..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/src/pages/ContactPage.jsx +++ /dev/null @@ -1,14 +0,0 @@ -const ContactPage = (props) => { - // const { } = props; - - return ( -
      -

      Contact

      -

      - Lorem ipsum dolor sit amet consectetur, adipisicing elit. Magnam alias dolor eveniet amet veniam, possimus qui - facilis! Officia eaque nihil sunt mollitia nulla debitis! Eaque fugiat est dolores nemo? Odit. -

      -
      - ); -}; -export default ContactPage; diff --git a/05_react/unterricht/tag42/01_react-with-routes/src/pages/HomePage.jsx b/05_react/unterricht/tag42/01_react-with-routes/src/pages/HomePage.jsx deleted file mode 100644 index dbe58d5..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/src/pages/HomePage.jsx +++ /dev/null @@ -1,10 +0,0 @@ -const HomePage = (props) => { - return ( -
      -

      Home

      -

      Lorem, ipsum dolor sit amet consectetur adipisicing elit. Ad, voluptatibus.

      -
      - ); -}; - -export default HomePage; diff --git a/05_react/unterricht/tag42/01_react-with-routes/src/pages/UserPage.jsx b/05_react/unterricht/tag42/01_react-with-routes/src/pages/UserPage.jsx deleted file mode 100644 index 7e837b9..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/src/pages/UserPage.jsx +++ /dev/null @@ -1,25 +0,0 @@ -import { Outlet } from 'react-router-dom'; - -const UserPage = (props) => { - // const { } = props; - - return ( -
      -
      -
      -

      User

      -

      The nestes user site:

      -
      -
      -
      - -
      -
      -
      -

      © 2026 IA Donkey Fabric

      -
      -
      -
      - ); -}; -export default UserPage; diff --git a/05_react/unterricht/tag42/01_react-with-routes/src/pages/UserProfilePage.jsx b/05_react/unterricht/tag42/01_react-with-routes/src/pages/UserProfilePage.jsx deleted file mode 100644 index 48c2d60..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/src/pages/UserProfilePage.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import { useParams } from 'react-router-dom'; -import Badge from '../components/common/Badge'; - -const UserProfilePage = (props) => { - // const { } = props; - - const { userId } = useParams(); - - return ( -
      -

      - User Profile -

      -

      Lorem ipsum dolor

      -
      - ); -}; -export default UserProfilePage; diff --git a/05_react/unterricht/tag42/01_react-with-routes/src/routes/Router.jsx b/05_react/unterricht/tag42/01_react-with-routes/src/routes/Router.jsx deleted file mode 100644 index 3aa05a1..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/src/routes/Router.jsx +++ /dev/null @@ -1,68 +0,0 @@ -import { Routes, Route, Navigate } from 'react-router-dom'; - -import About from '../pages/AboutPage'; -import Home from '../pages/HomePage'; -import Contact from '../pages/ContactPage'; -import UserProfilePage from '../pages/UserProfilePage'; -import UserPage from '../pages/UserPage'; - -// Prinzip einer geschützen Route-Komponente - -const checkAuth = () => { - // localStorage.setItem('token', 'secret-token'); - const token = localStorage.getItem('token'); - return token && token === 'secret-token' ? true : false; -}; - -const ProtectedRoute = (props) => { - const { redirectTo = '/', children } = props; - - const isAuthenticated = checkAuth(); // true | false // Authentication -Prüfung - - return isAuthenticated ? <>{children} : ; -}; - -const Router = (props) => { - // const { } = props; - - return ( - - {/* Static Routes */} - } /> - } /> - } /> - - {/* Dynamic Routes */} - Flights} /> - } /> - - {/* Nested Routes | Verschachtelte Routen */} - - {/* }> - Index} /> - About} /> - Contact} /> - */} - - }> - Index} /> - Profile} /> - Dashboard} /> - - - {/* Protected Routes | Geschützte Routen */} - -
      -

      Admin Dashboard Page

      -

      Lorem ipsum, dolor sit amet consectetur adipisicing elit. Ad, ex?

      -
      - - }>
      -
      - ); -}; - -export default Router; diff --git a/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/_index.scss b/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/_index.scss deleted file mode 100644 index dcefbc9..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/_index.scss +++ /dev/null @@ -1,3 +0,0 @@ -// @import 'bootstrap-5.3.8/bootstrap-grid'; -@import 'bootstrap-5.3.8/bootstrap'; -// @import 'bulma-1.04/index' diff --git a/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss b/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss deleted file mode 100644 index e9f267f..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss +++ /dev/null @@ -1,153 +0,0 @@ -// -// Base styles -// - -.accordion { - // scss-docs-start accordion-css-vars - --#{$prefix}accordion-color: #{$accordion-color}; - --#{$prefix}accordion-bg: #{$accordion-bg}; - --#{$prefix}accordion-transition: #{$accordion-transition}; - --#{$prefix}accordion-border-color: #{$accordion-border-color}; - --#{$prefix}accordion-border-width: #{$accordion-border-width}; - --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; - --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; - --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; - --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; - --#{$prefix}accordion-btn-color: #{$accordion-button-color}; - --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; - --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; - --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; - --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; - --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; - --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; - --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; - --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; - --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; - // scss-docs-end accordion-css-vars -} - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); - @include font-size($font-size-base); - color: var(--#{$prefix}accordion-btn-color); - text-align: left; // Reset button style - background-color: var(--#{$prefix}accordion-btn-bg); - border: 0; - @include border-radius(0); - overflow-anchor: none; - @include transition(var(--#{$prefix}accordion-transition)); - - &:not(.collapsed) { - color: var(--#{$prefix}accordion-active-color); - background-color: var(--#{$prefix}accordion-active-bg); - box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list - - &::after { - background-image: var(--#{$prefix}accordion-btn-active-icon); - transform: var(--#{$prefix}accordion-btn-icon-transform); - } - } - - // Accordion icon - &::after { - flex-shrink: 0; - width: var(--#{$prefix}accordion-btn-icon-width); - height: var(--#{$prefix}accordion-btn-icon-width); - margin-left: auto; - content: ""; - background-image: var(--#{$prefix}accordion-btn-icon); - background-repeat: no-repeat; - background-size: var(--#{$prefix}accordion-btn-icon-width); - @include transition(var(--#{$prefix}accordion-btn-icon-transition)); - } - - &:hover { - z-index: 2; - } - - &:focus { - z-index: 3; - outline: 0; - box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); - } -} - -.accordion-header { - margin-bottom: 0; -} - -.accordion-item { - color: var(--#{$prefix}accordion-color); - background-color: var(--#{$prefix}accordion-bg); - border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); - - &:first-of-type { - @include border-top-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - &:not(:first-of-type) { - border-top: 0; - } - - // Only set a border-radius on the last item if the accordion is collapsed - &:last-of-type { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - &.collapsed { - @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - > .accordion-collapse { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - } - } -} - -.accordion-body { - padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); -} - - -// Flush accordion items -// -// Remove borders and border-radius to keep accordion items edge-to-edge. - -.accordion-flush { - > .accordion-item { - border-right: 0; - border-left: 0; - @include border-radius(0); - - &:first-child { border-top: 0; } - &:last-child { border-bottom: 0; } - - // stylelint-disable selector-max-class - > .accordion-collapse, - > .accordion-header .accordion-button, - > .accordion-header .accordion-button.collapsed { - @include border-radius(0); - } - // stylelint-enable selector-max-class - } -} - -@if $enable-dark-mode { - @include color-mode(dark) { - .accordion-button::after { - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; - } - } -} diff --git a/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss b/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss deleted file mode 100644 index b8cff9b..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss +++ /dev/null @@ -1,68 +0,0 @@ -// -// Base styles -// - -.alert { - // scss-docs-start alert-css-vars - --#{$prefix}alert-bg: transparent; - --#{$prefix}alert-padding-x: #{$alert-padding-x}; - --#{$prefix}alert-padding-y: #{$alert-padding-y}; - --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; - --#{$prefix}alert-color: inherit; - --#{$prefix}alert-border-color: transparent; - --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); - --#{$prefix}alert-border-radius: #{$alert-border-radius}; - --#{$prefix}alert-link-color: inherit; - // scss-docs-end alert-css-vars - - position: relative; - padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); - margin-bottom: var(--#{$prefix}alert-margin-bottom); - color: var(--#{$prefix}alert-color); - background-color: var(--#{$prefix}alert-bg); - border: var(--#{$prefix}alert-border); - @include border-radius(var(--#{$prefix}alert-border-radius)); -} - -// Headings for larger alerts -.alert-heading { - // Specified to prevent conflicts of changing $headings-color - color: inherit; -} - -// Provide class for links that match alerts -.alert-link { - font-weight: $alert-link-font-weight; - color: var(--#{$prefix}alert-link-color); -} - - -// Dismissible alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissible { - padding-right: $alert-dismissible-padding-r; - - // Adjust close link position - .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: $stretched-link-z-index + 1; - padding: $alert-padding-y * 1.25 $alert-padding-x; - } -} - - -// scss-docs-start alert-modifiers -// Generate contextual modifier classes for colorizing the alert -@each $state in map-keys($theme-colors) { - .alert-#{$state} { - --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); - --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); - --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); - --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); - } -} -// scss-docs-end alert-modifiers diff --git a/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss b/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss deleted file mode 100644 index cc3d269..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss +++ /dev/null @@ -1,38 +0,0 @@ -// Base class -// -// Requires one of the contextual, color modifier classes for `color` and -// `background-color`. - -.badge { - // scss-docs-start badge-css-vars - --#{$prefix}badge-padding-x: #{$badge-padding-x}; - --#{$prefix}badge-padding-y: #{$badge-padding-y}; - @include rfs($badge-font-size, --#{$prefix}badge-font-size); - --#{$prefix}badge-font-weight: #{$badge-font-weight}; - --#{$prefix}badge-color: #{$badge-color}; - --#{$prefix}badge-border-radius: #{$badge-border-radius}; - // scss-docs-end badge-css-vars - - display: inline-block; - padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x); - @include font-size(var(--#{$prefix}badge-font-size)); - font-weight: var(--#{$prefix}badge-font-weight); - line-height: 1; - color: var(--#{$prefix}badge-color); - text-align: center; - white-space: nowrap; - vertical-align: baseline; - @include border-radius(var(--#{$prefix}badge-border-radius)); - @include gradient-bg(); - - // Empty badges collapse automatically - &:empty { - display: none; - } -} - -// Quick fix for badges in buttons -.btn .badge { - position: relative; - top: -1px; -} diff --git a/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss b/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss deleted file mode 100644 index b8252ff..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss +++ /dev/null @@ -1,40 +0,0 @@ -.breadcrumb { - // scss-docs-start breadcrumb-css-vars - --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x}; - --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y}; - --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom}; - @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size); - --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg}; - --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius}; - --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color}; - --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x}; - --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color}; - // scss-docs-end breadcrumb-css-vars - - display: flex; - flex-wrap: wrap; - padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x); - margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom); - @include font-size(var(--#{$prefix}breadcrumb-font-size)); - list-style: none; - background-color: var(--#{$prefix}breadcrumb-bg); - @include border-radius(var(--#{$prefix}breadcrumb-border-radius)); -} - -.breadcrumb-item { - // The separator between breadcrumbs (by default, a forward-slash: "/") - + .breadcrumb-item { - padding-left: var(--#{$prefix}breadcrumb-item-padding-x); - - &::before { - float: left; // Suppress inline spacings and underlining of the separator - padding-right: var(--#{$prefix}breadcrumb-item-padding-x); - color: var(--#{$prefix}breadcrumb-divider-color); - content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; - } - } - - &.active { - color: var(--#{$prefix}breadcrumb-item-active-color); - } -} diff --git a/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss b/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss deleted file mode 100644 index 78e1252..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss +++ /dev/null @@ -1,147 +0,0 @@ -// Make the div behave like a button -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; // match .btn alignment given font-size hack above - - > .btn { - position: relative; - flex: 1 1 auto; - } - - // Bring the hover, focused, and "active" buttons to the front to overlay - // the borders properly - > .btn-check:checked + .btn, - > .btn-check:focus + .btn, - > .btn:hover, - > .btn:focus, - > .btn:active, - > .btn.active { - z-index: 1; - } -} - -// Optional: Group multiple button groups together for a toolbar -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; - - .input-group { - width: auto; - } -} - -.btn-group { - @include border-radius($btn-border-radius); - - // Prevent double borders when buttons are next to each other - > :not(.btn-check:first-child) + .btn, - > .btn-group:not(:first-child) { - margin-left: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn.dropdown-toggle-split:first-child, - > .btn-group:not(:last-child) > .btn { - @include border-end-radius(0); - } - - // The left radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-start-radius(0); - } -} - -// Sizing -// -// Remix the default button sizing classes into new ones for easier manipulation. - -.btn-group-sm > .btn { @extend .btn-sm; } -.btn-group-lg > .btn { @extend .btn-lg; } - - -// -// Split button dropdowns -// - -.dropdown-toggle-split { - padding-right: $btn-padding-x * .75; - padding-left: $btn-padding-x * .75; - - &::after, - .dropup &::after, - .dropend &::after { - margin-left: 0; - } - - .dropstart &::before { - margin-right: 0; - } -} - -.btn-sm + .dropdown-toggle-split { - padding-right: $btn-padding-x-sm * .75; - padding-left: $btn-padding-x-sm * .75; -} - -.btn-lg + .dropdown-toggle-split { - padding-right: $btn-padding-x-lg * .75; - padding-left: $btn-padding-x-lg * .75; -} - - -// The clickable button for toggling the menu -// Set the same inset shadow as the :active state -.btn-group.show .dropdown-toggle { - @include box-shadow($btn-active-box-shadow); - - // Show no shadow for `.btn-link` since it has no other button styles. - &.btn-link { - @include box-shadow(none); - } -} - - -// -// Vertical button groups -// - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; - - > .btn, - > .btn-group { - width: 100%; - } - - > .btn:not(:first-child), - > .btn-group:not(:first-child) { - margin-top: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn-group:not(:last-child) > .btn { - @include border-bottom-radius(0); - } - - // The top radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-top-radius(0); - } -} diff --git a/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss b/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss deleted file mode 100644 index caa4518..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss +++ /dev/null @@ -1,216 +0,0 @@ -// -// Base styles -// - -.btn { - // scss-docs-start btn-css-vars - --#{$prefix}btn-padding-x: #{$btn-padding-x}; - --#{$prefix}btn-padding-y: #{$btn-padding-y}; - --#{$prefix}btn-font-family: #{$btn-font-family}; - @include rfs($btn-font-size, --#{$prefix}btn-font-size); - --#{$prefix}btn-font-weight: #{$btn-font-weight}; - --#{$prefix}btn-line-height: #{$btn-line-height}; - --#{$prefix}btn-color: #{$btn-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-width: #{$btn-border-width}; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-border-radius: #{$btn-border-radius}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-box-shadow: #{$btn-box-shadow}; - --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity}; - --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5); - // scss-docs-end btn-css-vars - - display: inline-block; - padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x); - font-family: var(--#{$prefix}btn-font-family); - @include font-size(var(--#{$prefix}btn-font-size)); - font-weight: var(--#{$prefix}btn-font-weight); - line-height: var(--#{$prefix}btn-line-height); - color: var(--#{$prefix}btn-color); - text-align: center; - text-decoration: if($link-decoration == none, null, none); - white-space: $btn-white-space; - vertical-align: middle; - cursor: if($enable-button-pointers, pointer, null); - user-select: none; - border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color); - @include border-radius(var(--#{$prefix}btn-border-radius)); - @include gradient-bg(var(--#{$prefix}btn-bg)); - @include box-shadow(var(--#{$prefix}btn-box-shadow)); - @include transition($btn-transition); - - &:hover { - color: var(--#{$prefix}btn-hover-color); - text-decoration: if($link-hover-decoration == underline, none, null); - background-color: var(--#{$prefix}btn-hover-bg); - border-color: var(--#{$prefix}btn-hover-border-color); - } - - .btn-check + &:hover { - // override for the checkbox/radio buttons - color: var(--#{$prefix}btn-color); - background-color: var(--#{$prefix}btn-bg); - border-color: var(--#{$prefix}btn-border-color); - } - - &:focus-visible { - color: var(--#{$prefix}btn-hover-color); - @include gradient-bg(var(--#{$prefix}btn-hover-bg)); - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:focus-visible + & { - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:checked + &, - :not(.btn-check) + &:active, - &:first-child:active, - &.active, - &.show { - color: var(--#{$prefix}btn-active-color); - background-color: var(--#{$prefix}btn-active-bg); - // Remove CSS gradients if they're enabled - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-active-border-color); - @include box-shadow(var(--#{$prefix}btn-active-shadow)); - - &:focus-visible { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - } - - .btn-check:checked:focus-visible + & { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - &:disabled, - &.disabled, - fieldset:disabled & { - color: var(--#{$prefix}btn-disabled-color); - pointer-events: none; - background-color: var(--#{$prefix}btn-disabled-bg); - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-disabled-border-color); - opacity: var(--#{$prefix}btn-disabled-opacity); - @include box-shadow(none); - } -} - - -// -// Alternate buttons -// - -// scss-docs-start btn-variant-loops -@each $color, $value in $theme-colors { - .btn-#{$color} { - @if $color == "light" { - @include button-variant( - $value, - $value, - $hover-background: shade-color($value, $btn-hover-bg-shade-amount), - $hover-border: shade-color($value, $btn-hover-border-shade-amount), - $active-background: shade-color($value, $btn-active-bg-shade-amount), - $active-border: shade-color($value, $btn-active-border-shade-amount) - ); - } @else if $color == "dark" { - @include button-variant( - $value, - $value, - $hover-background: tint-color($value, $btn-hover-bg-tint-amount), - $hover-border: tint-color($value, $btn-hover-border-tint-amount), - $active-background: tint-color($value, $btn-active-bg-tint-amount), - $active-border: tint-color($value, $btn-active-border-tint-amount) - ); - } @else { - @include button-variant($value, $value); - } - } -} - -@each $color, $value in $theme-colors { - .btn-outline-#{$color} { - @include button-outline-variant($value); - } -} -// scss-docs-end btn-variant-loops - - -// -// Link buttons -// - -// Make a button look and behave like a link -.btn-link { - --#{$prefix}btn-font-weight: #{$font-weight-normal}; - --#{$prefix}btn-color: #{$btn-link-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-hover-color: #{$btn-link-hover-color}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-active-color: #{$btn-link-hover-color}; - --#{$prefix}btn-active-border-color: transparent; - --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color}; - --#{$prefix}btn-disabled-border-color: transparent; - --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows - --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb}; - - text-decoration: $link-decoration; - @if $enable-gradients { - background-image: none; - } - - &:hover, - &:focus-visible { - text-decoration: $link-hover-decoration; - } - - &:focus-visible { - color: var(--#{$prefix}btn-color); - } - - &:hover { - color: var(--#{$prefix}btn-hover-color); - } - - // No need for an active state here -} - - -// -// Button Sizes -// - -.btn-lg { - @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); -} - -.btn-sm { - @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); -} diff --git a/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss b/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss deleted file mode 100644 index dcebe6a..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss +++ /dev/null @@ -1,238 +0,0 @@ -// -// Base styles -// - -.card { - // scss-docs-start card-css-vars - --#{$prefix}card-spacer-y: #{$card-spacer-y}; - --#{$prefix}card-spacer-x: #{$card-spacer-x}; - --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y}; - --#{$prefix}card-title-color: #{$card-title-color}; - --#{$prefix}card-subtitle-color: #{$card-subtitle-color}; - --#{$prefix}card-border-width: #{$card-border-width}; - --#{$prefix}card-border-color: #{$card-border-color}; - --#{$prefix}card-border-radius: #{$card-border-radius}; - --#{$prefix}card-box-shadow: #{$card-box-shadow}; - --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius}; - --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y}; - --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x}; - --#{$prefix}card-cap-bg: #{$card-cap-bg}; - --#{$prefix}card-cap-color: #{$card-cap-color}; - --#{$prefix}card-height: #{$card-height}; - --#{$prefix}card-color: #{$card-color}; - --#{$prefix}card-bg: #{$card-bg}; - --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding}; - --#{$prefix}card-group-margin: #{$card-group-margin}; - // scss-docs-end card-css-vars - - position: relative; - display: flex; - flex-direction: column; - min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 - height: var(--#{$prefix}card-height); - color: var(--#{$prefix}body-color); - word-wrap: break-word; - background-color: var(--#{$prefix}card-bg); - background-clip: border-box; - border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - @include border-radius(var(--#{$prefix}card-border-radius)); - @include box-shadow(var(--#{$prefix}card-box-shadow)); - - > hr { - margin-right: 0; - margin-left: 0; - } - - > .list-group { - border-top: inherit; - border-bottom: inherit; - - &:first-child { - border-top-width: 0; - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); - } - - &:last-child { - border-bottom-width: 0; - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); - } - } - - // Due to specificity of the above selector (`.card > .list-group`), we must - // use a child selector here to prevent double borders. - > .card-header + .list-group, - > .list-group + .card-footer { - border-top: 0; - } -} - -.card-body { - // Enable `flex-grow: 1` for decks and groups so that card blocks take up - // as much space as possible, ensuring footers are aligned to the bottom. - flex: 1 1 auto; - padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x); - color: var(--#{$prefix}card-color); -} - -.card-title { - margin-bottom: var(--#{$prefix}card-title-spacer-y); - color: var(--#{$prefix}card-title-color); -} - -.card-subtitle { - margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list - margin-bottom: 0; - color: var(--#{$prefix}card-subtitle-color); -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link { - &:hover { - text-decoration: if($link-hover-decoration == underline, none, null); - } - - + .card-link { - margin-left: var(--#{$prefix}card-spacer-x); - } -} - -// -// Optional textual caps -// - -.card-header { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - margin-bottom: 0; // Removes the default margin-bottom of - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:first-child { - @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0); - } -} - -.card-footer { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:last-child { - @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius)); - } -} - - -// -// Header navs -// - -.card-header-tabs { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - border-bottom: 0; - - .nav-link.active { - background-color: var(--#{$prefix}card-bg); - border-bottom-color: var(--#{$prefix}card-bg); - } -} - -.card-header-pills { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list -} - -// Card image -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: var(--#{$prefix}card-img-overlay-padding); - @include border-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch -} - -.card-img, -.card-img-top { - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-bottom { - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); -} - - -// -// Card groups -// - -.card-group { - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - margin-bottom: var(--#{$prefix}card-group-margin); - } - - @include media-breakpoint-up(sm) { - display: flex; - flex-flow: row wrap; - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - flex: 1 0 0; - margin-bottom: 0; - - + .card { - margin-left: 0; - border-left: 0; - } - - // Handle rounded corners - @if $enable-rounded { - &:not(:last-child) { - @include border-end-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-right-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-right-radius: 0; - } - } - - &:not(:first-child) { - @include border-start-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-left-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-left-radius: 0; - } - } - } - } - } -} diff --git a/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss b/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss deleted file mode 100644 index 5ebf6b1..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss +++ /dev/null @@ -1,226 +0,0 @@ -// Notes on the classes: -// -// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) -// even when their scroll action started on a carousel, but for compatibility (with Firefox) -// we're preventing all actions instead -// 2. The .carousel-item-start and .carousel-item-end is used to indicate where -// the active slide is heading. -// 3. .active.carousel-item is the current slide. -// 4. .active.carousel-item-start and .active.carousel-item-end is the current -// slide in its in-transition state. Only one of these occurs at a time. -// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end -// is the upcoming slide in transition. - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; - @include clearfix(); -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - @include transition($carousel-transition); -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); -} - - -// -// Alternate transitions -// - -.carousel-fade { - .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; - } - - .carousel-item.active, - .carousel-item-next.carousel-item-start, - .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; - } - - .active.carousel-item-start, - .active.carousel-item-end { - z-index: 0; - opacity: 0; - @include transition(opacity 0s $carousel-transition-duration); - } -} - - -// -// Left/right controls for nav -// - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - // Use flex for alignment (1-3) - display: flex; // 1. allow flex styles - align-items: center; // 2. vertically center contents - justify-content: center; // 3. horizontally center contents - width: $carousel-control-width; - padding: 0; - color: $carousel-control-color; - text-align: center; - background: none; - filter: var(--#{$prefix}carousel-control-icon-filter); - border: 0; - opacity: $carousel-control-opacity; - @include transition($carousel-control-transition); - - // Hover/focus state - &:hover, - &:focus { - color: $carousel-control-color; - text-decoration: none; - outline: 0; - opacity: $carousel-control-hover-opacity; - } -} -.carousel-control-prev { - left: 0; - background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); -} -.carousel-control-next { - right: 0; - background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); -} - -// Icons for within -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: $carousel-control-icon-width; - height: $carousel-control-icon-width; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; -} - -.carousel-control-prev-icon { - background-image: escape-svg($carousel-control-prev-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-next-icon-bg) + "*/"}; -} -.carousel-control-next-icon { - background-image: escape-svg($carousel-control-next-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-prev-icon-bg) + "*/"}; -} - -// Optional indicator pips/controls -// -// Add a container (such as a list) with the following class and add an item (ideally a focusable control, -// like a button) with data-bs-target for each slide your carousel holds. - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - // Use the .carousel-control's width as margin so we don't overlay those - margin-right: $carousel-control-width; - margin-bottom: 1rem; - margin-left: $carousel-control-width; - - [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: $carousel-indicator-width; - height: $carousel-indicator-height; - padding: 0; - margin-right: $carousel-indicator-spacer; - margin-left: $carousel-indicator-spacer; - text-indent: -999px; - cursor: pointer; - background-color: var(--#{$prefix}carousel-indicator-active-bg); - background-clip: padding-box; - border: 0; - // Use transparent borders to increase the hit area by 10px on top and bottom. - border-top: $carousel-indicator-hit-area-height solid transparent; - border-bottom: $carousel-indicator-hit-area-height solid transparent; - opacity: $carousel-indicator-opacity; - @include transition($carousel-indicator-transition); - } - - .active { - opacity: $carousel-indicator-active-opacity; - } -} - - -// Optional captions -// -// - -.carousel-caption { - position: absolute; - right: (100% - $carousel-caption-width) * .5; - bottom: $carousel-caption-spacer; - left: (100% - $carousel-caption-width) * .5; - padding-top: $carousel-caption-padding-y; - padding-bottom: $carousel-caption-padding-y; - color: var(--#{$prefix}carousel-caption-color); - text-align: center; -} - -// Dark mode carousel - -@mixin carousel-dark() { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg-dark}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color-dark}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter-dark}; -} - -.carousel-dark { - @include carousel-dark(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include carousel-dark(); - } -} diff --git a/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss b/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss deleted file mode 100644 index d53c96f..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss +++ /dev/null @@ -1,66 +0,0 @@ -// Transparent background and border properties included for button version. -// iOS requires the button element instead of an anchor tag. -// If you want the anchor version, it requires `href="#"`. -// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile - -.btn-close { - // scss-docs-start close-css-vars - --#{$prefix}btn-close-color: #{$btn-close-color}; - --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) }; - --#{$prefix}btn-close-opacity: #{$btn-close-opacity}; - --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity}; - --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow}; - --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity}; - --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity}; - // scss-docs-end close-css-vars - - box-sizing: content-box; - width: $btn-close-width; - height: $btn-close-height; - padding: $btn-close-padding-y $btn-close-padding-x; - color: var(--#{$prefix}btn-close-color); - background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements - filter: var(--#{$prefix}btn-close-filter); - border: 0; // for button elements - @include border-radius(); - opacity: var(--#{$prefix}btn-close-opacity); - - // Override 's hover style - &:hover { - color: var(--#{$prefix}btn-close-color); - text-decoration: none; - opacity: var(--#{$prefix}btn-close-hover-opacity); - } - - &:focus { - outline: 0; - box-shadow: var(--#{$prefix}btn-close-focus-shadow); - opacity: var(--#{$prefix}btn-close-focus-opacity); - } - - &:disabled, - &.disabled { - pointer-events: none; - user-select: none; - opacity: var(--#{$prefix}btn-close-disabled-opacity); - } -} - -@mixin btn-close-white() { - --#{$prefix}btn-close-filter: #{$btn-close-filter-dark}; -} - -.btn-close-white { - @include btn-close-white(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}btn-close-filter: #{$btn-close-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include btn-close-white(); - } -} diff --git a/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss b/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss deleted file mode 100644 index 83b3138..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss +++ /dev/null @@ -1,41 +0,0 @@ -// Container widths -// -// Set the container width, and override it for fixed navbars in media queries. - -@if $enable-container-classes { - // Single container class with breakpoint max-widths - .container, - // 100% wide container at all breakpoints - .container-fluid { - @include make-container(); - } - - // Responsive containers that are 100% wide until a breakpoint - @each $breakpoint, $container-max-width in $container-max-widths { - .container-#{$breakpoint} { - @extend .container-fluid; - } - - @include media-breakpoint-up($breakpoint, $grid-breakpoints) { - %responsive-container-#{$breakpoint} { - max-width: $container-max-width; - } - - // Extend each breakpoint which is smaller or equal to the current breakpoint - $extend-breakpoint: true; - - @each $name, $width in $grid-breakpoints { - @if ($extend-breakpoint) { - .container#{breakpoint-infix($name, $grid-breakpoints)} { - @extend %responsive-container-#{$breakpoint}; - } - - // Once the current breakpoint is reached, stop extending - @if ($breakpoint == $name) { - $extend-breakpoint: false; - } - } - } - } - } -} diff --git a/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss b/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss deleted file mode 100644 index 587ebb4..0000000 --- a/05_react/unterricht/tag42/01_react-with-routes/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss +++ /dev/null @@ -1,250 +0,0 @@ -// The dropdown wrapper (`
      `) -.dropup, -.dropend, -.dropdown, -.dropstart, -.dropup-center, -.dropdown-center { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; - - // Generate the caret automatically - @include caret(); -} - -// The dropdown menu -.dropdown-menu { - // scss-docs-start dropdown-css-vars - --#{$prefix}dropdown-zindex: #{$zindex-dropdown}; - --#{$prefix}dropdown-min-width: #{$dropdown-min-width}; - --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x}; - --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y}; - --#{$prefix}dropdown-spacer: #{$dropdown-spacer}; - @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size); - --#{$prefix}dropdown-color: #{$dropdown-color}; - --#{$prefix}dropdown-bg: #{$dropdown-bg}; - --#{$prefix}dropdown-border-color: #{$dropdown-border-color}; - --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius}; - --#{$prefix}dropdown-border-width: #{$dropdown-border-width}; - --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius}; - --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg}; - --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y}; - --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow}; - --#{$prefix}dropdown-link-color: #{$dropdown-link-color}; - --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color}; - --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg}; - --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color}; - --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg}; - --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color}; - --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x}; - --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y}; - --#{$prefix}dropdown-header-color: #{$dropdown-header-color}; - --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x}; - --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y}; - // scss-docs-end dropdown-css-vars - - position: absolute; - z-index: var(--#{$prefix}dropdown-zindex); - display: none; // none by default, but block on "open" of the menu - min-width: var(--#{$prefix}dropdown-min-width); - padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x); - margin: 0; // Override default margin of ul - @include font-size(var(--#{$prefix}dropdown-font-size)); - color: var(--#{$prefix}dropdown-color); - text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) - list-style: none; - background-color: var(--#{$prefix}dropdown-bg); - background-clip: padding-box; - border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color); - @include border-radius(var(--#{$prefix}dropdown-border-radius)); - @include box-shadow(var(--#{$prefix}dropdown-box-shadow)); - - &[data-bs-popper] { - top: 100%; - left: 0; - margin-top: var(--#{$prefix}dropdown-spacer); - } - - @if $dropdown-padding-y == 0 { - > .dropdown-item:first-child, - > li:first-child .dropdown-item { - @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - > .dropdown-item:last-child, - > li:last-child .dropdown-item { - @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - - } -} - -// scss-docs-start responsive-breakpoints -// We deliberately hardcode the `bs-` prefix because we check -// this custom property in JS to determine Popper's positioning - -@each $breakpoint in map-keys($grid-breakpoints) { - @include media-breakpoint-up($breakpoint) { - $infix: breakpoint-infix($breakpoint, $grid-breakpoints); - - .dropdown-menu#{$infix}-start { - --bs-position: start; - - &[data-bs-popper] { - right: auto; - left: 0; - } - } - - .dropdown-menu#{$infix}-end { - --bs-position: end; - - &[data-bs-popper] { - right: 0; - left: auto; - } - } - } -} -// scss-docs-end responsive-breakpoints - -// Allow for dropdowns to go bottom up (aka, dropup-menu) -// Just add .dropup after the standard .dropdown class and you're set. -.dropup { - .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(up); - } -} - -.dropend { - .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(end); - &::after { - vertical-align: 0; - } - } -} - -.dropstart { - .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(start); - &::before { - vertical-align: 0; - } - } -} - - -// Dividers (basically an `
      `) within the dropdown -.dropdown-divider { - height: 0; - margin: var(--#{$prefix}dropdown-divider-margin-y) 0; - overflow: hidden; - border-top: 1px solid var(--#{$prefix}dropdown-divider-bg); - opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
      element -} - -// Links, buttons, and more within the dropdown menu -// -// `
      ` alignment by inheriting `text-align`. -// 3. Fix alignment for Safari - -th { - font-weight: $table-th-font-weight; // 1 - text-align: inherit; // 2 - text-align: -webkit-match-parent; // 3 -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - - -// Forms -// -// 1. Allow labels to use `margin` for spacing. - -label { - display: inline-block; // 1 -} - -// Remove the default `border-radius` that macOS Chrome adds. -// See https://github.com/twbs/bootstrap/issues/24093 - -button { - // stylelint-disable-next-line property-disallowed-list - border-radius: 0; -} - -// Explicitly remove focus outline in Chromium when it shouldn't be -// visible (e.g. as result of mouse click or touch tap). It already -// should be doing this automatically, but seems to currently be -// confused and applies its very visible two-tone outline anyway. - -button:focus:not(:focus-visible) { - outline: 0; -} - -// 1. Remove the margin in Firefox and Safari - -input, -button, -select, -optgroup, -textarea { - margin: 0; // 1 - font-family: inherit; - @include font-size(inherit); - line-height: inherit; -} - -// Remove the inheritance of text transform in Firefox -button, -select { - text-transform: none; -} -// Set the cursor for non-` - - - - - ); -}; -export default FormContact; diff --git a/05_react/unterricht/tag42/02_react-with-forms/src/components/navs/Navbar.jsx b/05_react/unterricht/tag42/02_react-with-forms/src/components/navs/Navbar.jsx deleted file mode 100644 index bc70c62..0000000 --- a/05_react/unterricht/tag42/02_react-with-forms/src/components/navs/Navbar.jsx +++ /dev/null @@ -1,44 +0,0 @@ -import { NavLink } from 'react-router-dom'; - -const Navbar = (props) => { - return ( - - ); -}; - -export default Navbar; diff --git a/05_react/unterricht/tag42/02_react-with-forms/src/main.jsx b/05_react/unterricht/tag42/02_react-with-forms/src/main.jsx deleted file mode 100644 index 1f95cf7..0000000 --- a/05_react/unterricht/tag42/02_react-with-forms/src/main.jsx +++ /dev/null @@ -1,21 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; - -import { BrowserRouter } from 'react-router-dom'; - -import App from './App.jsx'; - -// JS import -import 'bootstrap'; -// import 'bootstrap/dist/css/bootstrap.min.css'; -import './styles/main.scss'; - -const root = createRoot(document.getElementById('root')); - -root.render( - - - - - , -); diff --git a/05_react/unterricht/tag42/02_react-with-forms/src/pages/AboutPage.jsx b/05_react/unterricht/tag42/02_react-with-forms/src/pages/AboutPage.jsx deleted file mode 100644 index 0fbfc09..0000000 --- a/05_react/unterricht/tag42/02_react-with-forms/src/pages/AboutPage.jsx +++ /dev/null @@ -1,34 +0,0 @@ -const AboutPage = (props) => { - return ( -
      -

      About

      -

      - Lorem ipsum dolor sit amet consectetur adipisicing elit. Minima, voluptatibus nobis molestiae, dignissimos id - dolores minus iste quisquam harum vitae rem dolorem debitis natus asperiores amet rerum ratione laboriosam quam. - Sit corporis voluptate laboriosam doloribus incidunt voluptatibus repellat. Excepturi vitae perferendis odit - enim, iusto, consequuntur assumenda corrupti autem eius minus explicabo tempore amet? Facere repudiandae, culpa - autem quae sint accusantium! Recusandae dicta itaque pariatur, veritatis voluptatem reprehenderit? Error facilis - fugit veritatis quam harum tempore dignissimos laboriosam commodi quod. Quas magnam modi saepe quae ab ipsam - amet veritatis molestias facilis odit? Quos nihil minus suscipit vel unde ipsa non quia ex quis obcaecati fugiat - animi nobis sit ducimus libero dolorem voluptates numquam, assumenda autem? Excepturi reprehenderit hic - aspernatur tempora, maiores nihil. Itaque quisquam expedita repellat voluptate, rem delectus sed, laborum dolor - minima nam ipsum possimus odit asperiores molestiae ex fugit sequi cupiditate doloremque tempora inventore - praesentium quo! Minima minus numquam aspernatur! Laudantium quisquam perspiciatis consectetur eos, nobis - doloribus reiciendis accusamus dolor quos cum cumque voluptatibus vero harum sapiente consequuntur eaque in quas - obcaecati. Et mollitia ex esse sint facilis fuga perferendis! Saepe ipsa voluptatum, nam labore corrupti, - laboriosam, sit ex explicabo facere laborum sunt natus eaque! Accusamus culpa harum repellendus iure, quasi, cum - architecto fugit ut est voluptatem cumque nisi recusandae? Cumque culpa sequi quis dolores nostrum omnis facilis - beatae quam similique, reiciendis nam modi hic libero natus blanditiis voluptatibus, magnam quos ea voluptate - odit commodi sapiente iusto dolor molestias! Blanditiis? Accusamus itaque nulla exercitationem. Maiores vitae at - dicta ipsam. Ullam eum excepturi eius, facere cumque nulla alias ab natus distinctio officia placeat possimus - optio commodi molestias repellendus voluptatem dicta delectus? Maxime aliquid numquam qui vitae doloribus - consectetur temporibus doloremque, perspiciatis sint quia obcaecati, nemo saepe velit odio nobis laborum. Natus - iure id nostrum quidem doloribus quae explicabo deserunt et quia? Labore dicta unde eum est esse reiciendis - maiores dignissimos temporibus ullam magnam, amet exercitationem praesentium voluptas, impedit sed alias, - eveniet voluptates nisi nulla dolore sequi similique fugit? Reiciendis, animi quibusdam? Pariatur sequi cum -

      -
      - ); -}; - -export default AboutPage; diff --git a/05_react/unterricht/tag42/02_react-with-forms/src/pages/ContactPage.jsx b/05_react/unterricht/tag42/02_react-with-forms/src/pages/ContactPage.jsx deleted file mode 100644 index fc53e25..0000000 --- a/05_react/unterricht/tag42/02_react-with-forms/src/pages/ContactPage.jsx +++ /dev/null @@ -1,16 +0,0 @@ -import FormContact from '../components/forms/FormContact'; - -const ContactPage = (props) => { - // const { } = props; - - return ( -
      -

      Contact

      -

      - Lorem ipsum dolor sit amet consectetur, adipisicing elit. Magnam alias dolor eveniet amet veniam, possimus qui -

      - -
      - ); -}; -export default ContactPage; diff --git a/05_react/unterricht/tag42/02_react-with-forms/src/pages/HomePage.jsx b/05_react/unterricht/tag42/02_react-with-forms/src/pages/HomePage.jsx deleted file mode 100644 index dbe58d5..0000000 --- a/05_react/unterricht/tag42/02_react-with-forms/src/pages/HomePage.jsx +++ /dev/null @@ -1,10 +0,0 @@ -const HomePage = (props) => { - return ( -
      -

      Home

      -

      Lorem, ipsum dolor sit amet consectetur adipisicing elit. Ad, voluptatibus.

      -
      - ); -}; - -export default HomePage; diff --git a/05_react/unterricht/tag42/02_react-with-forms/src/pages/UserPage.jsx b/05_react/unterricht/tag42/02_react-with-forms/src/pages/UserPage.jsx deleted file mode 100644 index 7e837b9..0000000 --- a/05_react/unterricht/tag42/02_react-with-forms/src/pages/UserPage.jsx +++ /dev/null @@ -1,25 +0,0 @@ -import { Outlet } from 'react-router-dom'; - -const UserPage = (props) => { - // const { } = props; - - return ( -
      -
      -
      -

      User

      -

      The nestes user site:

      -
      -
      -
      - -
      -
      -
      -

      © 2026 IA Donkey Fabric

      -
      -
      -
      - ); -}; -export default UserPage; diff --git a/05_react/unterricht/tag42/02_react-with-forms/src/pages/UserProfilePage.jsx b/05_react/unterricht/tag42/02_react-with-forms/src/pages/UserProfilePage.jsx deleted file mode 100644 index 48c2d60..0000000 --- a/05_react/unterricht/tag42/02_react-with-forms/src/pages/UserProfilePage.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import { useParams } from 'react-router-dom'; -import Badge from '../components/common/Badge'; - -const UserProfilePage = (props) => { - // const { } = props; - - const { userId } = useParams(); - - return ( -
      -

      - User Profile -

      -

      Lorem ipsum dolor

      -
      - ); -}; -export default UserProfilePage; diff --git a/05_react/unterricht/tag42/02_react-with-forms/src/routes/Router.jsx b/05_react/unterricht/tag42/02_react-with-forms/src/routes/Router.jsx deleted file mode 100644 index e9472b9..0000000 --- a/05_react/unterricht/tag42/02_react-with-forms/src/routes/Router.jsx +++ /dev/null @@ -1,61 +0,0 @@ -import { Routes, Route, Navigate } from 'react-router-dom'; - -import About from '../pages/AboutPage'; -import Home from '../pages/HomePage'; -import Contact from '../pages/ContactPage'; -import UserProfilePage from '../pages/UserProfilePage'; -import UserPage from '../pages/UserPage'; - -// Prinzip einer geschützen Route-Komponente - -const checkAuth = () => { - // localStorage.setItem('token', 'secret-token'); - const token = localStorage.getItem('token'); - return token && token === 'secret-token' ? true : false; -}; - -const ProtectedRoute = (props) => { - const { redirectTo = '/', children } = props; - - const isAuthenticated = checkAuth(); // true | false // Authentication -Prüfung - - return isAuthenticated ? <>{children} : ; -}; - -const Router = (props) => { - // const { } = props; - - return ( - - {/* Static Routes */} - } /> - } /> - } /> - - {/* Dynamic Routes */} - Flights} /> - } /> - - {/* Nested Routes | Verschachtelte Routen */} - }> - Index} /> - Profile} /> - Dashboard} /> - - - {/* Protected Routes | Geschützte Routen */} - -
      -

      Admin Dashboard Page

      -

      Lorem ipsum, dolor sit amet consectetur adipisicing elit. Ad, ex?

      -
      - - }>
      -
      - ); -}; - -export default Router; diff --git a/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/_index.scss b/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/_index.scss deleted file mode 100644 index dcefbc9..0000000 --- a/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/_index.scss +++ /dev/null @@ -1,3 +0,0 @@ -// @import 'bootstrap-5.3.8/bootstrap-grid'; -@import 'bootstrap-5.3.8/bootstrap'; -// @import 'bulma-1.04/index' diff --git a/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss b/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss deleted file mode 100644 index e9f267f..0000000 --- a/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss +++ /dev/null @@ -1,153 +0,0 @@ -// -// Base styles -// - -.accordion { - // scss-docs-start accordion-css-vars - --#{$prefix}accordion-color: #{$accordion-color}; - --#{$prefix}accordion-bg: #{$accordion-bg}; - --#{$prefix}accordion-transition: #{$accordion-transition}; - --#{$prefix}accordion-border-color: #{$accordion-border-color}; - --#{$prefix}accordion-border-width: #{$accordion-border-width}; - --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; - --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; - --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; - --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; - --#{$prefix}accordion-btn-color: #{$accordion-button-color}; - --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; - --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; - --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; - --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; - --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; - --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; - --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; - --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; - --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; - // scss-docs-end accordion-css-vars -} - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); - @include font-size($font-size-base); - color: var(--#{$prefix}accordion-btn-color); - text-align: left; // Reset button style - background-color: var(--#{$prefix}accordion-btn-bg); - border: 0; - @include border-radius(0); - overflow-anchor: none; - @include transition(var(--#{$prefix}accordion-transition)); - - &:not(.collapsed) { - color: var(--#{$prefix}accordion-active-color); - background-color: var(--#{$prefix}accordion-active-bg); - box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list - - &::after { - background-image: var(--#{$prefix}accordion-btn-active-icon); - transform: var(--#{$prefix}accordion-btn-icon-transform); - } - } - - // Accordion icon - &::after { - flex-shrink: 0; - width: var(--#{$prefix}accordion-btn-icon-width); - height: var(--#{$prefix}accordion-btn-icon-width); - margin-left: auto; - content: ""; - background-image: var(--#{$prefix}accordion-btn-icon); - background-repeat: no-repeat; - background-size: var(--#{$prefix}accordion-btn-icon-width); - @include transition(var(--#{$prefix}accordion-btn-icon-transition)); - } - - &:hover { - z-index: 2; - } - - &:focus { - z-index: 3; - outline: 0; - box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); - } -} - -.accordion-header { - margin-bottom: 0; -} - -.accordion-item { - color: var(--#{$prefix}accordion-color); - background-color: var(--#{$prefix}accordion-bg); - border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); - - &:first-of-type { - @include border-top-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - &:not(:first-of-type) { - border-top: 0; - } - - // Only set a border-radius on the last item if the accordion is collapsed - &:last-of-type { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - &.collapsed { - @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - > .accordion-collapse { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - } - } -} - -.accordion-body { - padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); -} - - -// Flush accordion items -// -// Remove borders and border-radius to keep accordion items edge-to-edge. - -.accordion-flush { - > .accordion-item { - border-right: 0; - border-left: 0; - @include border-radius(0); - - &:first-child { border-top: 0; } - &:last-child { border-bottom: 0; } - - // stylelint-disable selector-max-class - > .accordion-collapse, - > .accordion-header .accordion-button, - > .accordion-header .accordion-button.collapsed { - @include border-radius(0); - } - // stylelint-enable selector-max-class - } -} - -@if $enable-dark-mode { - @include color-mode(dark) { - .accordion-button::after { - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; - } - } -} diff --git a/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss b/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss deleted file mode 100644 index b8cff9b..0000000 --- a/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss +++ /dev/null @@ -1,68 +0,0 @@ -// -// Base styles -// - -.alert { - // scss-docs-start alert-css-vars - --#{$prefix}alert-bg: transparent; - --#{$prefix}alert-padding-x: #{$alert-padding-x}; - --#{$prefix}alert-padding-y: #{$alert-padding-y}; - --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; - --#{$prefix}alert-color: inherit; - --#{$prefix}alert-border-color: transparent; - --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); - --#{$prefix}alert-border-radius: #{$alert-border-radius}; - --#{$prefix}alert-link-color: inherit; - // scss-docs-end alert-css-vars - - position: relative; - padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); - margin-bottom: var(--#{$prefix}alert-margin-bottom); - color: var(--#{$prefix}alert-color); - background-color: var(--#{$prefix}alert-bg); - border: var(--#{$prefix}alert-border); - @include border-radius(var(--#{$prefix}alert-border-radius)); -} - -// Headings for larger alerts -.alert-heading { - // Specified to prevent conflicts of changing $headings-color - color: inherit; -} - -// Provide class for links that match alerts -.alert-link { - font-weight: $alert-link-font-weight; - color: var(--#{$prefix}alert-link-color); -} - - -// Dismissible alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissible { - padding-right: $alert-dismissible-padding-r; - - // Adjust close link position - .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: $stretched-link-z-index + 1; - padding: $alert-padding-y * 1.25 $alert-padding-x; - } -} - - -// scss-docs-start alert-modifiers -// Generate contextual modifier classes for colorizing the alert -@each $state in map-keys($theme-colors) { - .alert-#{$state} { - --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); - --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); - --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); - --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); - } -} -// scss-docs-end alert-modifiers diff --git a/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss b/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss deleted file mode 100644 index cc3d269..0000000 --- a/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss +++ /dev/null @@ -1,38 +0,0 @@ -// Base class -// -// Requires one of the contextual, color modifier classes for `color` and -// `background-color`. - -.badge { - // scss-docs-start badge-css-vars - --#{$prefix}badge-padding-x: #{$badge-padding-x}; - --#{$prefix}badge-padding-y: #{$badge-padding-y}; - @include rfs($badge-font-size, --#{$prefix}badge-font-size); - --#{$prefix}badge-font-weight: #{$badge-font-weight}; - --#{$prefix}badge-color: #{$badge-color}; - --#{$prefix}badge-border-radius: #{$badge-border-radius}; - // scss-docs-end badge-css-vars - - display: inline-block; - padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x); - @include font-size(var(--#{$prefix}badge-font-size)); - font-weight: var(--#{$prefix}badge-font-weight); - line-height: 1; - color: var(--#{$prefix}badge-color); - text-align: center; - white-space: nowrap; - vertical-align: baseline; - @include border-radius(var(--#{$prefix}badge-border-radius)); - @include gradient-bg(); - - // Empty badges collapse automatically - &:empty { - display: none; - } -} - -// Quick fix for badges in buttons -.btn .badge { - position: relative; - top: -1px; -} diff --git a/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss b/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss deleted file mode 100644 index b8252ff..0000000 --- a/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss +++ /dev/null @@ -1,40 +0,0 @@ -.breadcrumb { - // scss-docs-start breadcrumb-css-vars - --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x}; - --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y}; - --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom}; - @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size); - --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg}; - --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius}; - --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color}; - --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x}; - --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color}; - // scss-docs-end breadcrumb-css-vars - - display: flex; - flex-wrap: wrap; - padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x); - margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom); - @include font-size(var(--#{$prefix}breadcrumb-font-size)); - list-style: none; - background-color: var(--#{$prefix}breadcrumb-bg); - @include border-radius(var(--#{$prefix}breadcrumb-border-radius)); -} - -.breadcrumb-item { - // The separator between breadcrumbs (by default, a forward-slash: "/") - + .breadcrumb-item { - padding-left: var(--#{$prefix}breadcrumb-item-padding-x); - - &::before { - float: left; // Suppress inline spacings and underlining of the separator - padding-right: var(--#{$prefix}breadcrumb-item-padding-x); - color: var(--#{$prefix}breadcrumb-divider-color); - content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; - } - } - - &.active { - color: var(--#{$prefix}breadcrumb-item-active-color); - } -} diff --git a/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss b/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss deleted file mode 100644 index 78e1252..0000000 --- a/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss +++ /dev/null @@ -1,147 +0,0 @@ -// Make the div behave like a button -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; // match .btn alignment given font-size hack above - - > .btn { - position: relative; - flex: 1 1 auto; - } - - // Bring the hover, focused, and "active" buttons to the front to overlay - // the borders properly - > .btn-check:checked + .btn, - > .btn-check:focus + .btn, - > .btn:hover, - > .btn:focus, - > .btn:active, - > .btn.active { - z-index: 1; - } -} - -// Optional: Group multiple button groups together for a toolbar -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; - - .input-group { - width: auto; - } -} - -.btn-group { - @include border-radius($btn-border-radius); - - // Prevent double borders when buttons are next to each other - > :not(.btn-check:first-child) + .btn, - > .btn-group:not(:first-child) { - margin-left: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn.dropdown-toggle-split:first-child, - > .btn-group:not(:last-child) > .btn { - @include border-end-radius(0); - } - - // The left radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-start-radius(0); - } -} - -// Sizing -// -// Remix the default button sizing classes into new ones for easier manipulation. - -.btn-group-sm > .btn { @extend .btn-sm; } -.btn-group-lg > .btn { @extend .btn-lg; } - - -// -// Split button dropdowns -// - -.dropdown-toggle-split { - padding-right: $btn-padding-x * .75; - padding-left: $btn-padding-x * .75; - - &::after, - .dropup &::after, - .dropend &::after { - margin-left: 0; - } - - .dropstart &::before { - margin-right: 0; - } -} - -.btn-sm + .dropdown-toggle-split { - padding-right: $btn-padding-x-sm * .75; - padding-left: $btn-padding-x-sm * .75; -} - -.btn-lg + .dropdown-toggle-split { - padding-right: $btn-padding-x-lg * .75; - padding-left: $btn-padding-x-lg * .75; -} - - -// The clickable button for toggling the menu -// Set the same inset shadow as the :active state -.btn-group.show .dropdown-toggle { - @include box-shadow($btn-active-box-shadow); - - // Show no shadow for `.btn-link` since it has no other button styles. - &.btn-link { - @include box-shadow(none); - } -} - - -// -// Vertical button groups -// - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; - - > .btn, - > .btn-group { - width: 100%; - } - - > .btn:not(:first-child), - > .btn-group:not(:first-child) { - margin-top: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn-group:not(:last-child) > .btn { - @include border-bottom-radius(0); - } - - // The top radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-top-radius(0); - } -} diff --git a/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss b/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss deleted file mode 100644 index caa4518..0000000 --- a/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss +++ /dev/null @@ -1,216 +0,0 @@ -// -// Base styles -// - -.btn { - // scss-docs-start btn-css-vars - --#{$prefix}btn-padding-x: #{$btn-padding-x}; - --#{$prefix}btn-padding-y: #{$btn-padding-y}; - --#{$prefix}btn-font-family: #{$btn-font-family}; - @include rfs($btn-font-size, --#{$prefix}btn-font-size); - --#{$prefix}btn-font-weight: #{$btn-font-weight}; - --#{$prefix}btn-line-height: #{$btn-line-height}; - --#{$prefix}btn-color: #{$btn-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-width: #{$btn-border-width}; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-border-radius: #{$btn-border-radius}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-box-shadow: #{$btn-box-shadow}; - --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity}; - --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5); - // scss-docs-end btn-css-vars - - display: inline-block; - padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x); - font-family: var(--#{$prefix}btn-font-family); - @include font-size(var(--#{$prefix}btn-font-size)); - font-weight: var(--#{$prefix}btn-font-weight); - line-height: var(--#{$prefix}btn-line-height); - color: var(--#{$prefix}btn-color); - text-align: center; - text-decoration: if($link-decoration == none, null, none); - white-space: $btn-white-space; - vertical-align: middle; - cursor: if($enable-button-pointers, pointer, null); - user-select: none; - border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color); - @include border-radius(var(--#{$prefix}btn-border-radius)); - @include gradient-bg(var(--#{$prefix}btn-bg)); - @include box-shadow(var(--#{$prefix}btn-box-shadow)); - @include transition($btn-transition); - - &:hover { - color: var(--#{$prefix}btn-hover-color); - text-decoration: if($link-hover-decoration == underline, none, null); - background-color: var(--#{$prefix}btn-hover-bg); - border-color: var(--#{$prefix}btn-hover-border-color); - } - - .btn-check + &:hover { - // override for the checkbox/radio buttons - color: var(--#{$prefix}btn-color); - background-color: var(--#{$prefix}btn-bg); - border-color: var(--#{$prefix}btn-border-color); - } - - &:focus-visible { - color: var(--#{$prefix}btn-hover-color); - @include gradient-bg(var(--#{$prefix}btn-hover-bg)); - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:focus-visible + & { - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:checked + &, - :not(.btn-check) + &:active, - &:first-child:active, - &.active, - &.show { - color: var(--#{$prefix}btn-active-color); - background-color: var(--#{$prefix}btn-active-bg); - // Remove CSS gradients if they're enabled - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-active-border-color); - @include box-shadow(var(--#{$prefix}btn-active-shadow)); - - &:focus-visible { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - } - - .btn-check:checked:focus-visible + & { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - &:disabled, - &.disabled, - fieldset:disabled & { - color: var(--#{$prefix}btn-disabled-color); - pointer-events: none; - background-color: var(--#{$prefix}btn-disabled-bg); - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-disabled-border-color); - opacity: var(--#{$prefix}btn-disabled-opacity); - @include box-shadow(none); - } -} - - -// -// Alternate buttons -// - -// scss-docs-start btn-variant-loops -@each $color, $value in $theme-colors { - .btn-#{$color} { - @if $color == "light" { - @include button-variant( - $value, - $value, - $hover-background: shade-color($value, $btn-hover-bg-shade-amount), - $hover-border: shade-color($value, $btn-hover-border-shade-amount), - $active-background: shade-color($value, $btn-active-bg-shade-amount), - $active-border: shade-color($value, $btn-active-border-shade-amount) - ); - } @else if $color == "dark" { - @include button-variant( - $value, - $value, - $hover-background: tint-color($value, $btn-hover-bg-tint-amount), - $hover-border: tint-color($value, $btn-hover-border-tint-amount), - $active-background: tint-color($value, $btn-active-bg-tint-amount), - $active-border: tint-color($value, $btn-active-border-tint-amount) - ); - } @else { - @include button-variant($value, $value); - } - } -} - -@each $color, $value in $theme-colors { - .btn-outline-#{$color} { - @include button-outline-variant($value); - } -} -// scss-docs-end btn-variant-loops - - -// -// Link buttons -// - -// Make a button look and behave like a link -.btn-link { - --#{$prefix}btn-font-weight: #{$font-weight-normal}; - --#{$prefix}btn-color: #{$btn-link-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-hover-color: #{$btn-link-hover-color}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-active-color: #{$btn-link-hover-color}; - --#{$prefix}btn-active-border-color: transparent; - --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color}; - --#{$prefix}btn-disabled-border-color: transparent; - --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows - --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb}; - - text-decoration: $link-decoration; - @if $enable-gradients { - background-image: none; - } - - &:hover, - &:focus-visible { - text-decoration: $link-hover-decoration; - } - - &:focus-visible { - color: var(--#{$prefix}btn-color); - } - - &:hover { - color: var(--#{$prefix}btn-hover-color); - } - - // No need for an active state here -} - - -// -// Button Sizes -// - -.btn-lg { - @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); -} - -.btn-sm { - @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); -} diff --git a/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss b/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss deleted file mode 100644 index dcebe6a..0000000 --- a/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss +++ /dev/null @@ -1,238 +0,0 @@ -// -// Base styles -// - -.card { - // scss-docs-start card-css-vars - --#{$prefix}card-spacer-y: #{$card-spacer-y}; - --#{$prefix}card-spacer-x: #{$card-spacer-x}; - --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y}; - --#{$prefix}card-title-color: #{$card-title-color}; - --#{$prefix}card-subtitle-color: #{$card-subtitle-color}; - --#{$prefix}card-border-width: #{$card-border-width}; - --#{$prefix}card-border-color: #{$card-border-color}; - --#{$prefix}card-border-radius: #{$card-border-radius}; - --#{$prefix}card-box-shadow: #{$card-box-shadow}; - --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius}; - --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y}; - --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x}; - --#{$prefix}card-cap-bg: #{$card-cap-bg}; - --#{$prefix}card-cap-color: #{$card-cap-color}; - --#{$prefix}card-height: #{$card-height}; - --#{$prefix}card-color: #{$card-color}; - --#{$prefix}card-bg: #{$card-bg}; - --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding}; - --#{$prefix}card-group-margin: #{$card-group-margin}; - // scss-docs-end card-css-vars - - position: relative; - display: flex; - flex-direction: column; - min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 - height: var(--#{$prefix}card-height); - color: var(--#{$prefix}body-color); - word-wrap: break-word; - background-color: var(--#{$prefix}card-bg); - background-clip: border-box; - border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - @include border-radius(var(--#{$prefix}card-border-radius)); - @include box-shadow(var(--#{$prefix}card-box-shadow)); - - > hr { - margin-right: 0; - margin-left: 0; - } - - > .list-group { - border-top: inherit; - border-bottom: inherit; - - &:first-child { - border-top-width: 0; - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); - } - - &:last-child { - border-bottom-width: 0; - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); - } - } - - // Due to specificity of the above selector (`.card > .list-group`), we must - // use a child selector here to prevent double borders. - > .card-header + .list-group, - > .list-group + .card-footer { - border-top: 0; - } -} - -.card-body { - // Enable `flex-grow: 1` for decks and groups so that card blocks take up - // as much space as possible, ensuring footers are aligned to the bottom. - flex: 1 1 auto; - padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x); - color: var(--#{$prefix}card-color); -} - -.card-title { - margin-bottom: var(--#{$prefix}card-title-spacer-y); - color: var(--#{$prefix}card-title-color); -} - -.card-subtitle { - margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list - margin-bottom: 0; - color: var(--#{$prefix}card-subtitle-color); -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link { - &:hover { - text-decoration: if($link-hover-decoration == underline, none, null); - } - - + .card-link { - margin-left: var(--#{$prefix}card-spacer-x); - } -} - -// -// Optional textual caps -// - -.card-header { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - margin-bottom: 0; // Removes the default margin-bottom of - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:first-child { - @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0); - } -} - -.card-footer { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:last-child { - @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius)); - } -} - - -// -// Header navs -// - -.card-header-tabs { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - border-bottom: 0; - - .nav-link.active { - background-color: var(--#{$prefix}card-bg); - border-bottom-color: var(--#{$prefix}card-bg); - } -} - -.card-header-pills { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list -} - -// Card image -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: var(--#{$prefix}card-img-overlay-padding); - @include border-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch -} - -.card-img, -.card-img-top { - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-bottom { - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); -} - - -// -// Card groups -// - -.card-group { - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - margin-bottom: var(--#{$prefix}card-group-margin); - } - - @include media-breakpoint-up(sm) { - display: flex; - flex-flow: row wrap; - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - flex: 1 0 0; - margin-bottom: 0; - - + .card { - margin-left: 0; - border-left: 0; - } - - // Handle rounded corners - @if $enable-rounded { - &:not(:last-child) { - @include border-end-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-right-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-right-radius: 0; - } - } - - &:not(:first-child) { - @include border-start-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-left-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-left-radius: 0; - } - } - } - } - } -} diff --git a/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss b/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss deleted file mode 100644 index 5ebf6b1..0000000 --- a/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss +++ /dev/null @@ -1,226 +0,0 @@ -// Notes on the classes: -// -// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) -// even when their scroll action started on a carousel, but for compatibility (with Firefox) -// we're preventing all actions instead -// 2. The .carousel-item-start and .carousel-item-end is used to indicate where -// the active slide is heading. -// 3. .active.carousel-item is the current slide. -// 4. .active.carousel-item-start and .active.carousel-item-end is the current -// slide in its in-transition state. Only one of these occurs at a time. -// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end -// is the upcoming slide in transition. - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; - @include clearfix(); -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - @include transition($carousel-transition); -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); -} - - -// -// Alternate transitions -// - -.carousel-fade { - .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; - } - - .carousel-item.active, - .carousel-item-next.carousel-item-start, - .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; - } - - .active.carousel-item-start, - .active.carousel-item-end { - z-index: 0; - opacity: 0; - @include transition(opacity 0s $carousel-transition-duration); - } -} - - -// -// Left/right controls for nav -// - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - // Use flex for alignment (1-3) - display: flex; // 1. allow flex styles - align-items: center; // 2. vertically center contents - justify-content: center; // 3. horizontally center contents - width: $carousel-control-width; - padding: 0; - color: $carousel-control-color; - text-align: center; - background: none; - filter: var(--#{$prefix}carousel-control-icon-filter); - border: 0; - opacity: $carousel-control-opacity; - @include transition($carousel-control-transition); - - // Hover/focus state - &:hover, - &:focus { - color: $carousel-control-color; - text-decoration: none; - outline: 0; - opacity: $carousel-control-hover-opacity; - } -} -.carousel-control-prev { - left: 0; - background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); -} -.carousel-control-next { - right: 0; - background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); -} - -// Icons for within -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: $carousel-control-icon-width; - height: $carousel-control-icon-width; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; -} - -.carousel-control-prev-icon { - background-image: escape-svg($carousel-control-prev-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-next-icon-bg) + "*/"}; -} -.carousel-control-next-icon { - background-image: escape-svg($carousel-control-next-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-prev-icon-bg) + "*/"}; -} - -// Optional indicator pips/controls -// -// Add a container (such as a list) with the following class and add an item (ideally a focusable control, -// like a button) with data-bs-target for each slide your carousel holds. - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - // Use the .carousel-control's width as margin so we don't overlay those - margin-right: $carousel-control-width; - margin-bottom: 1rem; - margin-left: $carousel-control-width; - - [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: $carousel-indicator-width; - height: $carousel-indicator-height; - padding: 0; - margin-right: $carousel-indicator-spacer; - margin-left: $carousel-indicator-spacer; - text-indent: -999px; - cursor: pointer; - background-color: var(--#{$prefix}carousel-indicator-active-bg); - background-clip: padding-box; - border: 0; - // Use transparent borders to increase the hit area by 10px on top and bottom. - border-top: $carousel-indicator-hit-area-height solid transparent; - border-bottom: $carousel-indicator-hit-area-height solid transparent; - opacity: $carousel-indicator-opacity; - @include transition($carousel-indicator-transition); - } - - .active { - opacity: $carousel-indicator-active-opacity; - } -} - - -// Optional captions -// -// - -.carousel-caption { - position: absolute; - right: (100% - $carousel-caption-width) * .5; - bottom: $carousel-caption-spacer; - left: (100% - $carousel-caption-width) * .5; - padding-top: $carousel-caption-padding-y; - padding-bottom: $carousel-caption-padding-y; - color: var(--#{$prefix}carousel-caption-color); - text-align: center; -} - -// Dark mode carousel - -@mixin carousel-dark() { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg-dark}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color-dark}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter-dark}; -} - -.carousel-dark { - @include carousel-dark(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include carousel-dark(); - } -} diff --git a/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss b/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss deleted file mode 100644 index d53c96f..0000000 --- a/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss +++ /dev/null @@ -1,66 +0,0 @@ -// Transparent background and border properties included for button version. -// iOS requires the button element instead of an anchor tag. -// If you want the anchor version, it requires `href="#"`. -// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile - -.btn-close { - // scss-docs-start close-css-vars - --#{$prefix}btn-close-color: #{$btn-close-color}; - --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) }; - --#{$prefix}btn-close-opacity: #{$btn-close-opacity}; - --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity}; - --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow}; - --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity}; - --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity}; - // scss-docs-end close-css-vars - - box-sizing: content-box; - width: $btn-close-width; - height: $btn-close-height; - padding: $btn-close-padding-y $btn-close-padding-x; - color: var(--#{$prefix}btn-close-color); - background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements - filter: var(--#{$prefix}btn-close-filter); - border: 0; // for button elements - @include border-radius(); - opacity: var(--#{$prefix}btn-close-opacity); - - // Override 's hover style - &:hover { - color: var(--#{$prefix}btn-close-color); - text-decoration: none; - opacity: var(--#{$prefix}btn-close-hover-opacity); - } - - &:focus { - outline: 0; - box-shadow: var(--#{$prefix}btn-close-focus-shadow); - opacity: var(--#{$prefix}btn-close-focus-opacity); - } - - &:disabled, - &.disabled { - pointer-events: none; - user-select: none; - opacity: var(--#{$prefix}btn-close-disabled-opacity); - } -} - -@mixin btn-close-white() { - --#{$prefix}btn-close-filter: #{$btn-close-filter-dark}; -} - -.btn-close-white { - @include btn-close-white(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}btn-close-filter: #{$btn-close-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include btn-close-white(); - } -} diff --git a/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss b/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss deleted file mode 100644 index 83b3138..0000000 --- a/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss +++ /dev/null @@ -1,41 +0,0 @@ -// Container widths -// -// Set the container width, and override it for fixed navbars in media queries. - -@if $enable-container-classes { - // Single container class with breakpoint max-widths - .container, - // 100% wide container at all breakpoints - .container-fluid { - @include make-container(); - } - - // Responsive containers that are 100% wide until a breakpoint - @each $breakpoint, $container-max-width in $container-max-widths { - .container-#{$breakpoint} { - @extend .container-fluid; - } - - @include media-breakpoint-up($breakpoint, $grid-breakpoints) { - %responsive-container-#{$breakpoint} { - max-width: $container-max-width; - } - - // Extend each breakpoint which is smaller or equal to the current breakpoint - $extend-breakpoint: true; - - @each $name, $width in $grid-breakpoints { - @if ($extend-breakpoint) { - .container#{breakpoint-infix($name, $grid-breakpoints)} { - @extend %responsive-container-#{$breakpoint}; - } - - // Once the current breakpoint is reached, stop extending - @if ($breakpoint == $name) { - $extend-breakpoint: false; - } - } - } - } - } -} diff --git a/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss b/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss deleted file mode 100644 index 587ebb4..0000000 --- a/05_react/unterricht/tag42/02_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss +++ /dev/null @@ -1,250 +0,0 @@ -// The dropdown wrapper (`
      `) -.dropup, -.dropend, -.dropdown, -.dropstart, -.dropup-center, -.dropdown-center { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; - - // Generate the caret automatically - @include caret(); -} - -// The dropdown menu -.dropdown-menu { - // scss-docs-start dropdown-css-vars - --#{$prefix}dropdown-zindex: #{$zindex-dropdown}; - --#{$prefix}dropdown-min-width: #{$dropdown-min-width}; - --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x}; - --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y}; - --#{$prefix}dropdown-spacer: #{$dropdown-spacer}; - @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size); - --#{$prefix}dropdown-color: #{$dropdown-color}; - --#{$prefix}dropdown-bg: #{$dropdown-bg}; - --#{$prefix}dropdown-border-color: #{$dropdown-border-color}; - --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius}; - --#{$prefix}dropdown-border-width: #{$dropdown-border-width}; - --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius}; - --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg}; - --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y}; - --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow}; - --#{$prefix}dropdown-link-color: #{$dropdown-link-color}; - --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color}; - --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg}; - --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color}; - --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg}; - --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color}; - --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x}; - --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y}; - --#{$prefix}dropdown-header-color: #{$dropdown-header-color}; - --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x}; - --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y}; - // scss-docs-end dropdown-css-vars - - position: absolute; - z-index: var(--#{$prefix}dropdown-zindex); - display: none; // none by default, but block on "open" of the menu - min-width: var(--#{$prefix}dropdown-min-width); - padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x); - margin: 0; // Override default margin of ul - @include font-size(var(--#{$prefix}dropdown-font-size)); - color: var(--#{$prefix}dropdown-color); - text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) - list-style: none; - background-color: var(--#{$prefix}dropdown-bg); - background-clip: padding-box; - border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color); - @include border-radius(var(--#{$prefix}dropdown-border-radius)); - @include box-shadow(var(--#{$prefix}dropdown-box-shadow)); - - &[data-bs-popper] { - top: 100%; - left: 0; - margin-top: var(--#{$prefix}dropdown-spacer); - } - - @if $dropdown-padding-y == 0 { - > .dropdown-item:first-child, - > li:first-child .dropdown-item { - @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - > .dropdown-item:last-child, - > li:last-child .dropdown-item { - @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - - } -} - -// scss-docs-start responsive-breakpoints -// We deliberately hardcode the `bs-` prefix because we check -// this custom property in JS to determine Popper's positioning - -@each $breakpoint in map-keys($grid-breakpoints) { - @include media-breakpoint-up($breakpoint) { - $infix: breakpoint-infix($breakpoint, $grid-breakpoints); - - .dropdown-menu#{$infix}-start { - --bs-position: start; - - &[data-bs-popper] { - right: auto; - left: 0; - } - } - - .dropdown-menu#{$infix}-end { - --bs-position: end; - - &[data-bs-popper] { - right: 0; - left: auto; - } - } - } -} -// scss-docs-end responsive-breakpoints - -// Allow for dropdowns to go bottom up (aka, dropup-menu) -// Just add .dropup after the standard .dropdown class and you're set. -.dropup { - .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(up); - } -} - -.dropend { - .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(end); - &::after { - vertical-align: 0; - } - } -} - -.dropstart { - .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(start); - &::before { - vertical-align: 0; - } - } -} - - -// Dividers (basically an `
      `) within the dropdown -.dropdown-divider { - height: 0; - margin: var(--#{$prefix}dropdown-divider-margin-y) 0; - overflow: hidden; - border-top: 1px solid var(--#{$prefix}dropdown-divider-bg); - opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
      element -} - -// Links, buttons, and more within the dropdown menu -// -// `
      ` alignment by inheriting `text-align`. -// 3. Fix alignment for Safari - -th { - font-weight: $table-th-font-weight; // 1 - text-align: inherit; // 2 - text-align: -webkit-match-parent; // 3 -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - - -// Forms -// -// 1. Allow labels to use `margin` for spacing. - -label { - display: inline-block; // 1 -} - -// Remove the default `border-radius` that macOS Chrome adds. -// See https://github.com/twbs/bootstrap/issues/24093 - -button { - // stylelint-disable-next-line property-disallowed-list - border-radius: 0; -} - -// Explicitly remove focus outline in Chromium when it shouldn't be -// visible (e.g. as result of mouse click or touch tap). It already -// should be doing this automatically, but seems to currently be -// confused and applies its very visible two-tone outline anyway. - -button:focus:not(:focus-visible) { - outline: 0; -} - -// 1. Remove the margin in Firefox and Safari - -input, -button, -select, -optgroup, -textarea { - margin: 0; // 1 - font-family: inherit; - @include font-size(inherit); - line-height: inherit; -} - -// Remove the inheritance of text transform in Firefox -button, -select { - text-transform: none; -} -// Set the cursor for non-` - - - - - ); -}; -export default FormContact; diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/components/forms/joi/FormContact.jsx b/05_react/unterricht/tag43/01_react-with-forms/src/components/forms/joi/FormContact.jsx deleted file mode 100644 index 1d69095..0000000 --- a/05_react/unterricht/tag43/01_react-with-forms/src/components/forms/joi/FormContact.jsx +++ /dev/null @@ -1,156 +0,0 @@ -import { useState } from 'react'; -import validate from './validate'; - -const FormContact = (props) => { - // const { } = props; - - const [formData, setFormData] = useState({ - firstname: '', // - lastname: '', - email: '', - message: '', - }); - - const [errors, setErrors] = useState({}); - - // EventHandlers ======= - const handleSubmit = (e) => { - e.preventDefault(); // Standardverhalten (Versenden vom Formular) unterbinden. - - const form = e.currentTarget; - - const errors = validate(formData); - - if (Object.keys(errors).length === 0) { - console.log('Form submitted ....'); - // TODO: send over AJAX/Fetch - form.reset(); - setFormData({ - firstname: '', // - lastname: '', - email: '', - message: '', - }); - setErrors({}); - } else { - console.warn('Form submit error'); - setErrors(errors); - } - }; - - const handleBlur = (e) => { - const { name } = e.target; - const error = validate(formData); - - if (error[name]) { - setErrors({ ...errors, [name]: error[name] }); - } else { - setErrors({ ...errors, [name]: '' }); - } - }; - - const handleChange = (e) => { - const { name, value } = e.target; - - setFormData((state) => ({ ...state, [name]: value })); - - // console.log({ [e.target.name]: e.target.value }); - // console.log('Formdata', formData); - }; - - return ( -
      -
      -
      -
      - - -
      OK
      -
      {errors?.firstname || 'Error'}
      -
      -
      -
      -
      - - -
      OK
      -
      {errors?.lastname}
      -
      -
      -
      - -
      -
      -
      - - -
      OK
      -
      {errors?.email}
      -
      -
      -
      - -
      -
      -
      - - -
      OK
      -
      {errors?.message}
      -
      -
      -
      - -
      -
      -
      - -
      -
      -
      -
      - ); -}; -export default FormContact; diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/components/forms/joi/validate.js b/05_react/unterricht/tag43/01_react-with-forms/src/components/forms/joi/validate.js deleted file mode 100644 index 01d41df..0000000 --- a/05_react/unterricht/tag43/01_react-with-forms/src/components/forms/joi/validate.js +++ /dev/null @@ -1,42 +0,0 @@ -import Joi from 'joi'; - -const validate = (formData) => { - const schema = Joi.object({ - firstname: Joi.string() - .min(2) - .max(60) - .required() - .messages({ 'string.min': 'Firstname must have a min length 2', 'string.empty': 'Firstname is required' }) - .label('Firstname'), - lastname: Joi.string().required().label('Lastname'), - email: Joi.string() - .email({ tlds: { allow: false } }) // tld = top-level domain is deactivated - .required() - .label('Email'), - message: Joi.string().required().label('Message'), - }); - - const { error } = schema.validate(formData, { abortEarly: false }); - - if (!error) { - return {}; - } - - console.log(error.details); - // [{ - // context : {label: 'Firstname', value: '', key: 'firstname'} - // message : "\"Firstname\" is not allowed to be empty" - // path: ['firstname'] - // type : "string.empty"} - // },...]; - - const errors = error.details.reduce((obj, current) => { - // obj[current.context.key] = current.message; - obj[current.path[0]] = current.message; - return obj; - }, {}); // initalValue = {} - - // { firstname: "\"Firstname\" is not allowed to be empty", lastname: '...'} - return errors; -}; -export default validate; diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/components/forms/react-hook-form/FormContact.jsx b/05_react/unterricht/tag43/01_react-with-forms/src/components/forms/react-hook-form/FormContact.jsx deleted file mode 100644 index f8d33ac..0000000 --- a/05_react/unterricht/tag43/01_react-with-forms/src/components/forms/react-hook-form/FormContact.jsx +++ /dev/null @@ -1,129 +0,0 @@ -import { useState } from 'react'; -import { useForm } from 'react-hook-form'; -import validate from '../../../utils/validators/validate'; - -const FormContact = (props) => { - // const { } = props; - - const { - register, - handleSubmit, - formState: { errors }, - } = useForm(); - - // EventHandlers ======= - const onSubmit = (data) => { - console.log('submitted'); - console.log('Form data:', data); - - // fetch('/send', { - // method: 'POST', - // headers: { - // 'Content-Type': 'application/json', - // }, - // body: JSON.stringify(data), - // }) - // .then((res) => res.json()) - // .then((data) => console.log(data)) - // .catch((err) => console.error(err)); - }; - - if (errors) { - console.log(errors); - } - - return ( -
      -
      -
      -
      - - -
      OK
      -
      {errors?.firstname?.message || 'Error'}
      -
      -
      -
      -
      - - -
      OK
      -
      {errors?.lastname?.message}
      -
      -
      -
      - -
      -
      -
      - - -
      OK
      -
      Email is required
      -
      -
      -
      - -
      -
      -
      - - -
      OK
      -
      {errors?.message?.message}
      -
      -
      -
      - -
      -
      -
      - -
      -
      -
      -
      - ); -}; -export default FormContact; diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/components/navs/Navbar.jsx b/05_react/unterricht/tag43/01_react-with-forms/src/components/navs/Navbar.jsx deleted file mode 100644 index bc70c62..0000000 --- a/05_react/unterricht/tag43/01_react-with-forms/src/components/navs/Navbar.jsx +++ /dev/null @@ -1,44 +0,0 @@ -import { NavLink } from 'react-router-dom'; - -const Navbar = (props) => { - return ( - - ); -}; - -export default Navbar; diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/main.jsx b/05_react/unterricht/tag43/01_react-with-forms/src/main.jsx deleted file mode 100644 index 1f95cf7..0000000 --- a/05_react/unterricht/tag43/01_react-with-forms/src/main.jsx +++ /dev/null @@ -1,21 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; - -import { BrowserRouter } from 'react-router-dom'; - -import App from './App.jsx'; - -// JS import -import 'bootstrap'; -// import 'bootstrap/dist/css/bootstrap.min.css'; -import './styles/main.scss'; - -const root = createRoot(document.getElementById('root')); - -root.render( - - - - - , -); diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/pages/AboutPage.jsx b/05_react/unterricht/tag43/01_react-with-forms/src/pages/AboutPage.jsx deleted file mode 100644 index 0fbfc09..0000000 --- a/05_react/unterricht/tag43/01_react-with-forms/src/pages/AboutPage.jsx +++ /dev/null @@ -1,34 +0,0 @@ -const AboutPage = (props) => { - return ( -
      -

      About

      -

      - Lorem ipsum dolor sit amet consectetur adipisicing elit. Minima, voluptatibus nobis molestiae, dignissimos id - dolores minus iste quisquam harum vitae rem dolorem debitis natus asperiores amet rerum ratione laboriosam quam. - Sit corporis voluptate laboriosam doloribus incidunt voluptatibus repellat. Excepturi vitae perferendis odit - enim, iusto, consequuntur assumenda corrupti autem eius minus explicabo tempore amet? Facere repudiandae, culpa - autem quae sint accusantium! Recusandae dicta itaque pariatur, veritatis voluptatem reprehenderit? Error facilis - fugit veritatis quam harum tempore dignissimos laboriosam commodi quod. Quas magnam modi saepe quae ab ipsam - amet veritatis molestias facilis odit? Quos nihil minus suscipit vel unde ipsa non quia ex quis obcaecati fugiat - animi nobis sit ducimus libero dolorem voluptates numquam, assumenda autem? Excepturi reprehenderit hic - aspernatur tempora, maiores nihil. Itaque quisquam expedita repellat voluptate, rem delectus sed, laborum dolor - minima nam ipsum possimus odit asperiores molestiae ex fugit sequi cupiditate doloremque tempora inventore - praesentium quo! Minima minus numquam aspernatur! Laudantium quisquam perspiciatis consectetur eos, nobis - doloribus reiciendis accusamus dolor quos cum cumque voluptatibus vero harum sapiente consequuntur eaque in quas - obcaecati. Et mollitia ex esse sint facilis fuga perferendis! Saepe ipsa voluptatum, nam labore corrupti, - laboriosam, sit ex explicabo facere laborum sunt natus eaque! Accusamus culpa harum repellendus iure, quasi, cum - architecto fugit ut est voluptatem cumque nisi recusandae? Cumque culpa sequi quis dolores nostrum omnis facilis - beatae quam similique, reiciendis nam modi hic libero natus blanditiis voluptatibus, magnam quos ea voluptate - odit commodi sapiente iusto dolor molestias! Blanditiis? Accusamus itaque nulla exercitationem. Maiores vitae at - dicta ipsam. Ullam eum excepturi eius, facere cumque nulla alias ab natus distinctio officia placeat possimus - optio commodi molestias repellendus voluptatem dicta delectus? Maxime aliquid numquam qui vitae doloribus - consectetur temporibus doloremque, perspiciatis sint quia obcaecati, nemo saepe velit odio nobis laborum. Natus - iure id nostrum quidem doloribus quae explicabo deserunt et quia? Labore dicta unde eum est esse reiciendis - maiores dignissimos temporibus ullam magnam, amet exercitationem praesentium voluptas, impedit sed alias, - eveniet voluptates nisi nulla dolore sequi similique fugit? Reiciendis, animi quibusdam? Pariatur sequi cum -

      -
      - ); -}; - -export default AboutPage; diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/pages/ContactPage.jsx b/05_react/unterricht/tag43/01_react-with-forms/src/pages/ContactPage.jsx deleted file mode 100644 index 53cd20c..0000000 --- a/05_react/unterricht/tag43/01_react-with-forms/src/pages/ContactPage.jsx +++ /dev/null @@ -1,16 +0,0 @@ -import FormContact from '../components/forms/joi/FormContact'; - -const ContactPage = (props) => { - // const { } = props; - - return ( -
      -

      Contact

      -

      - Lorem ipsum dolor sit amet consectetur, adipisicing elit. Magnam alias dolor eveniet amet veniam, possimus qui -

      - -
      - ); -}; -export default ContactPage; diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/pages/HomePage.jsx b/05_react/unterricht/tag43/01_react-with-forms/src/pages/HomePage.jsx deleted file mode 100644 index dbe58d5..0000000 --- a/05_react/unterricht/tag43/01_react-with-forms/src/pages/HomePage.jsx +++ /dev/null @@ -1,10 +0,0 @@ -const HomePage = (props) => { - return ( -
      -

      Home

      -

      Lorem, ipsum dolor sit amet consectetur adipisicing elit. Ad, voluptatibus.

      -
      - ); -}; - -export default HomePage; diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/pages/UserPage.jsx b/05_react/unterricht/tag43/01_react-with-forms/src/pages/UserPage.jsx deleted file mode 100644 index 7e837b9..0000000 --- a/05_react/unterricht/tag43/01_react-with-forms/src/pages/UserPage.jsx +++ /dev/null @@ -1,25 +0,0 @@ -import { Outlet } from 'react-router-dom'; - -const UserPage = (props) => { - // const { } = props; - - return ( -
      -
      -
      -

      User

      -

      The nestes user site:

      -
      -
      -
      - -
      -
      -
      -

      © 2026 IA Donkey Fabric

      -
      -
      -
      - ); -}; -export default UserPage; diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/pages/UserProfilePage.jsx b/05_react/unterricht/tag43/01_react-with-forms/src/pages/UserProfilePage.jsx deleted file mode 100644 index 48c2d60..0000000 --- a/05_react/unterricht/tag43/01_react-with-forms/src/pages/UserProfilePage.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import { useParams } from 'react-router-dom'; -import Badge from '../components/common/Badge'; - -const UserProfilePage = (props) => { - // const { } = props; - - const { userId } = useParams(); - - return ( -
      -

      - User Profile -

      -

      Lorem ipsum dolor

      -
      - ); -}; -export default UserProfilePage; diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/routes/Router.jsx b/05_react/unterricht/tag43/01_react-with-forms/src/routes/Router.jsx deleted file mode 100644 index e9472b9..0000000 --- a/05_react/unterricht/tag43/01_react-with-forms/src/routes/Router.jsx +++ /dev/null @@ -1,61 +0,0 @@ -import { Routes, Route, Navigate } from 'react-router-dom'; - -import About from '../pages/AboutPage'; -import Home from '../pages/HomePage'; -import Contact from '../pages/ContactPage'; -import UserProfilePage from '../pages/UserProfilePage'; -import UserPage from '../pages/UserPage'; - -// Prinzip einer geschützen Route-Komponente - -const checkAuth = () => { - // localStorage.setItem('token', 'secret-token'); - const token = localStorage.getItem('token'); - return token && token === 'secret-token' ? true : false; -}; - -const ProtectedRoute = (props) => { - const { redirectTo = '/', children } = props; - - const isAuthenticated = checkAuth(); // true | false // Authentication -Prüfung - - return isAuthenticated ? <>{children} : ; -}; - -const Router = (props) => { - // const { } = props; - - return ( - - {/* Static Routes */} - } /> - } /> - } /> - - {/* Dynamic Routes */} - Flights} /> - } /> - - {/* Nested Routes | Verschachtelte Routen */} - }> - Index} /> - Profile} /> - Dashboard} /> - - - {/* Protected Routes | Geschützte Routen */} - -
      -

      Admin Dashboard Page

      -

      Lorem ipsum, dolor sit amet consectetur adipisicing elit. Ad, ex?

      -
      - - }>
      -
      - ); -}; - -export default Router; diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/_index.scss b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/_index.scss deleted file mode 100644 index dcefbc9..0000000 --- a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/_index.scss +++ /dev/null @@ -1,3 +0,0 @@ -// @import 'bootstrap-5.3.8/bootstrap-grid'; -@import 'bootstrap-5.3.8/bootstrap'; -// @import 'bulma-1.04/index' diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss deleted file mode 100644 index e9f267f..0000000 --- a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss +++ /dev/null @@ -1,153 +0,0 @@ -// -// Base styles -// - -.accordion { - // scss-docs-start accordion-css-vars - --#{$prefix}accordion-color: #{$accordion-color}; - --#{$prefix}accordion-bg: #{$accordion-bg}; - --#{$prefix}accordion-transition: #{$accordion-transition}; - --#{$prefix}accordion-border-color: #{$accordion-border-color}; - --#{$prefix}accordion-border-width: #{$accordion-border-width}; - --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; - --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; - --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; - --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; - --#{$prefix}accordion-btn-color: #{$accordion-button-color}; - --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; - --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; - --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; - --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; - --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; - --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; - --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; - --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; - --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; - // scss-docs-end accordion-css-vars -} - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); - @include font-size($font-size-base); - color: var(--#{$prefix}accordion-btn-color); - text-align: left; // Reset button style - background-color: var(--#{$prefix}accordion-btn-bg); - border: 0; - @include border-radius(0); - overflow-anchor: none; - @include transition(var(--#{$prefix}accordion-transition)); - - &:not(.collapsed) { - color: var(--#{$prefix}accordion-active-color); - background-color: var(--#{$prefix}accordion-active-bg); - box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list - - &::after { - background-image: var(--#{$prefix}accordion-btn-active-icon); - transform: var(--#{$prefix}accordion-btn-icon-transform); - } - } - - // Accordion icon - &::after { - flex-shrink: 0; - width: var(--#{$prefix}accordion-btn-icon-width); - height: var(--#{$prefix}accordion-btn-icon-width); - margin-left: auto; - content: ""; - background-image: var(--#{$prefix}accordion-btn-icon); - background-repeat: no-repeat; - background-size: var(--#{$prefix}accordion-btn-icon-width); - @include transition(var(--#{$prefix}accordion-btn-icon-transition)); - } - - &:hover { - z-index: 2; - } - - &:focus { - z-index: 3; - outline: 0; - box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); - } -} - -.accordion-header { - margin-bottom: 0; -} - -.accordion-item { - color: var(--#{$prefix}accordion-color); - background-color: var(--#{$prefix}accordion-bg); - border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); - - &:first-of-type { - @include border-top-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - &:not(:first-of-type) { - border-top: 0; - } - - // Only set a border-radius on the last item if the accordion is collapsed - &:last-of-type { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - &.collapsed { - @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - > .accordion-collapse { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - } - } -} - -.accordion-body { - padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); -} - - -// Flush accordion items -// -// Remove borders and border-radius to keep accordion items edge-to-edge. - -.accordion-flush { - > .accordion-item { - border-right: 0; - border-left: 0; - @include border-radius(0); - - &:first-child { border-top: 0; } - &:last-child { border-bottom: 0; } - - // stylelint-disable selector-max-class - > .accordion-collapse, - > .accordion-header .accordion-button, - > .accordion-header .accordion-button.collapsed { - @include border-radius(0); - } - // stylelint-enable selector-max-class - } -} - -@if $enable-dark-mode { - @include color-mode(dark) { - .accordion-button::after { - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; - } - } -} diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss deleted file mode 100644 index b8cff9b..0000000 --- a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss +++ /dev/null @@ -1,68 +0,0 @@ -// -// Base styles -// - -.alert { - // scss-docs-start alert-css-vars - --#{$prefix}alert-bg: transparent; - --#{$prefix}alert-padding-x: #{$alert-padding-x}; - --#{$prefix}alert-padding-y: #{$alert-padding-y}; - --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; - --#{$prefix}alert-color: inherit; - --#{$prefix}alert-border-color: transparent; - --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); - --#{$prefix}alert-border-radius: #{$alert-border-radius}; - --#{$prefix}alert-link-color: inherit; - // scss-docs-end alert-css-vars - - position: relative; - padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); - margin-bottom: var(--#{$prefix}alert-margin-bottom); - color: var(--#{$prefix}alert-color); - background-color: var(--#{$prefix}alert-bg); - border: var(--#{$prefix}alert-border); - @include border-radius(var(--#{$prefix}alert-border-radius)); -} - -// Headings for larger alerts -.alert-heading { - // Specified to prevent conflicts of changing $headings-color - color: inherit; -} - -// Provide class for links that match alerts -.alert-link { - font-weight: $alert-link-font-weight; - color: var(--#{$prefix}alert-link-color); -} - - -// Dismissible alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissible { - padding-right: $alert-dismissible-padding-r; - - // Adjust close link position - .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: $stretched-link-z-index + 1; - padding: $alert-padding-y * 1.25 $alert-padding-x; - } -} - - -// scss-docs-start alert-modifiers -// Generate contextual modifier classes for colorizing the alert -@each $state in map-keys($theme-colors) { - .alert-#{$state} { - --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); - --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); - --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); - --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); - } -} -// scss-docs-end alert-modifiers diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss deleted file mode 100644 index cc3d269..0000000 --- a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss +++ /dev/null @@ -1,38 +0,0 @@ -// Base class -// -// Requires one of the contextual, color modifier classes for `color` and -// `background-color`. - -.badge { - // scss-docs-start badge-css-vars - --#{$prefix}badge-padding-x: #{$badge-padding-x}; - --#{$prefix}badge-padding-y: #{$badge-padding-y}; - @include rfs($badge-font-size, --#{$prefix}badge-font-size); - --#{$prefix}badge-font-weight: #{$badge-font-weight}; - --#{$prefix}badge-color: #{$badge-color}; - --#{$prefix}badge-border-radius: #{$badge-border-radius}; - // scss-docs-end badge-css-vars - - display: inline-block; - padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x); - @include font-size(var(--#{$prefix}badge-font-size)); - font-weight: var(--#{$prefix}badge-font-weight); - line-height: 1; - color: var(--#{$prefix}badge-color); - text-align: center; - white-space: nowrap; - vertical-align: baseline; - @include border-radius(var(--#{$prefix}badge-border-radius)); - @include gradient-bg(); - - // Empty badges collapse automatically - &:empty { - display: none; - } -} - -// Quick fix for badges in buttons -.btn .badge { - position: relative; - top: -1px; -} diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss deleted file mode 100644 index b8252ff..0000000 --- a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss +++ /dev/null @@ -1,40 +0,0 @@ -.breadcrumb { - // scss-docs-start breadcrumb-css-vars - --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x}; - --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y}; - --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom}; - @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size); - --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg}; - --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius}; - --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color}; - --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x}; - --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color}; - // scss-docs-end breadcrumb-css-vars - - display: flex; - flex-wrap: wrap; - padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x); - margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom); - @include font-size(var(--#{$prefix}breadcrumb-font-size)); - list-style: none; - background-color: var(--#{$prefix}breadcrumb-bg); - @include border-radius(var(--#{$prefix}breadcrumb-border-radius)); -} - -.breadcrumb-item { - // The separator between breadcrumbs (by default, a forward-slash: "/") - + .breadcrumb-item { - padding-left: var(--#{$prefix}breadcrumb-item-padding-x); - - &::before { - float: left; // Suppress inline spacings and underlining of the separator - padding-right: var(--#{$prefix}breadcrumb-item-padding-x); - color: var(--#{$prefix}breadcrumb-divider-color); - content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; - } - } - - &.active { - color: var(--#{$prefix}breadcrumb-item-active-color); - } -} diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss deleted file mode 100644 index 78e1252..0000000 --- a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss +++ /dev/null @@ -1,147 +0,0 @@ -// Make the div behave like a button -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; // match .btn alignment given font-size hack above - - > .btn { - position: relative; - flex: 1 1 auto; - } - - // Bring the hover, focused, and "active" buttons to the front to overlay - // the borders properly - > .btn-check:checked + .btn, - > .btn-check:focus + .btn, - > .btn:hover, - > .btn:focus, - > .btn:active, - > .btn.active { - z-index: 1; - } -} - -// Optional: Group multiple button groups together for a toolbar -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; - - .input-group { - width: auto; - } -} - -.btn-group { - @include border-radius($btn-border-radius); - - // Prevent double borders when buttons are next to each other - > :not(.btn-check:first-child) + .btn, - > .btn-group:not(:first-child) { - margin-left: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn.dropdown-toggle-split:first-child, - > .btn-group:not(:last-child) > .btn { - @include border-end-radius(0); - } - - // The left radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-start-radius(0); - } -} - -// Sizing -// -// Remix the default button sizing classes into new ones for easier manipulation. - -.btn-group-sm > .btn { @extend .btn-sm; } -.btn-group-lg > .btn { @extend .btn-lg; } - - -// -// Split button dropdowns -// - -.dropdown-toggle-split { - padding-right: $btn-padding-x * .75; - padding-left: $btn-padding-x * .75; - - &::after, - .dropup &::after, - .dropend &::after { - margin-left: 0; - } - - .dropstart &::before { - margin-right: 0; - } -} - -.btn-sm + .dropdown-toggle-split { - padding-right: $btn-padding-x-sm * .75; - padding-left: $btn-padding-x-sm * .75; -} - -.btn-lg + .dropdown-toggle-split { - padding-right: $btn-padding-x-lg * .75; - padding-left: $btn-padding-x-lg * .75; -} - - -// The clickable button for toggling the menu -// Set the same inset shadow as the :active state -.btn-group.show .dropdown-toggle { - @include box-shadow($btn-active-box-shadow); - - // Show no shadow for `.btn-link` since it has no other button styles. - &.btn-link { - @include box-shadow(none); - } -} - - -// -// Vertical button groups -// - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; - - > .btn, - > .btn-group { - width: 100%; - } - - > .btn:not(:first-child), - > .btn-group:not(:first-child) { - margin-top: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn-group:not(:last-child) > .btn { - @include border-bottom-radius(0); - } - - // The top radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-top-radius(0); - } -} diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss deleted file mode 100644 index caa4518..0000000 --- a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss +++ /dev/null @@ -1,216 +0,0 @@ -// -// Base styles -// - -.btn { - // scss-docs-start btn-css-vars - --#{$prefix}btn-padding-x: #{$btn-padding-x}; - --#{$prefix}btn-padding-y: #{$btn-padding-y}; - --#{$prefix}btn-font-family: #{$btn-font-family}; - @include rfs($btn-font-size, --#{$prefix}btn-font-size); - --#{$prefix}btn-font-weight: #{$btn-font-weight}; - --#{$prefix}btn-line-height: #{$btn-line-height}; - --#{$prefix}btn-color: #{$btn-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-width: #{$btn-border-width}; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-border-radius: #{$btn-border-radius}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-box-shadow: #{$btn-box-shadow}; - --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity}; - --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5); - // scss-docs-end btn-css-vars - - display: inline-block; - padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x); - font-family: var(--#{$prefix}btn-font-family); - @include font-size(var(--#{$prefix}btn-font-size)); - font-weight: var(--#{$prefix}btn-font-weight); - line-height: var(--#{$prefix}btn-line-height); - color: var(--#{$prefix}btn-color); - text-align: center; - text-decoration: if($link-decoration == none, null, none); - white-space: $btn-white-space; - vertical-align: middle; - cursor: if($enable-button-pointers, pointer, null); - user-select: none; - border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color); - @include border-radius(var(--#{$prefix}btn-border-radius)); - @include gradient-bg(var(--#{$prefix}btn-bg)); - @include box-shadow(var(--#{$prefix}btn-box-shadow)); - @include transition($btn-transition); - - &:hover { - color: var(--#{$prefix}btn-hover-color); - text-decoration: if($link-hover-decoration == underline, none, null); - background-color: var(--#{$prefix}btn-hover-bg); - border-color: var(--#{$prefix}btn-hover-border-color); - } - - .btn-check + &:hover { - // override for the checkbox/radio buttons - color: var(--#{$prefix}btn-color); - background-color: var(--#{$prefix}btn-bg); - border-color: var(--#{$prefix}btn-border-color); - } - - &:focus-visible { - color: var(--#{$prefix}btn-hover-color); - @include gradient-bg(var(--#{$prefix}btn-hover-bg)); - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:focus-visible + & { - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:checked + &, - :not(.btn-check) + &:active, - &:first-child:active, - &.active, - &.show { - color: var(--#{$prefix}btn-active-color); - background-color: var(--#{$prefix}btn-active-bg); - // Remove CSS gradients if they're enabled - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-active-border-color); - @include box-shadow(var(--#{$prefix}btn-active-shadow)); - - &:focus-visible { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - } - - .btn-check:checked:focus-visible + & { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - &:disabled, - &.disabled, - fieldset:disabled & { - color: var(--#{$prefix}btn-disabled-color); - pointer-events: none; - background-color: var(--#{$prefix}btn-disabled-bg); - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-disabled-border-color); - opacity: var(--#{$prefix}btn-disabled-opacity); - @include box-shadow(none); - } -} - - -// -// Alternate buttons -// - -// scss-docs-start btn-variant-loops -@each $color, $value in $theme-colors { - .btn-#{$color} { - @if $color == "light" { - @include button-variant( - $value, - $value, - $hover-background: shade-color($value, $btn-hover-bg-shade-amount), - $hover-border: shade-color($value, $btn-hover-border-shade-amount), - $active-background: shade-color($value, $btn-active-bg-shade-amount), - $active-border: shade-color($value, $btn-active-border-shade-amount) - ); - } @else if $color == "dark" { - @include button-variant( - $value, - $value, - $hover-background: tint-color($value, $btn-hover-bg-tint-amount), - $hover-border: tint-color($value, $btn-hover-border-tint-amount), - $active-background: tint-color($value, $btn-active-bg-tint-amount), - $active-border: tint-color($value, $btn-active-border-tint-amount) - ); - } @else { - @include button-variant($value, $value); - } - } -} - -@each $color, $value in $theme-colors { - .btn-outline-#{$color} { - @include button-outline-variant($value); - } -} -// scss-docs-end btn-variant-loops - - -// -// Link buttons -// - -// Make a button look and behave like a link -.btn-link { - --#{$prefix}btn-font-weight: #{$font-weight-normal}; - --#{$prefix}btn-color: #{$btn-link-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-hover-color: #{$btn-link-hover-color}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-active-color: #{$btn-link-hover-color}; - --#{$prefix}btn-active-border-color: transparent; - --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color}; - --#{$prefix}btn-disabled-border-color: transparent; - --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows - --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb}; - - text-decoration: $link-decoration; - @if $enable-gradients { - background-image: none; - } - - &:hover, - &:focus-visible { - text-decoration: $link-hover-decoration; - } - - &:focus-visible { - color: var(--#{$prefix}btn-color); - } - - &:hover { - color: var(--#{$prefix}btn-hover-color); - } - - // No need for an active state here -} - - -// -// Button Sizes -// - -.btn-lg { - @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); -} - -.btn-sm { - @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); -} diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss deleted file mode 100644 index dcebe6a..0000000 --- a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss +++ /dev/null @@ -1,238 +0,0 @@ -// -// Base styles -// - -.card { - // scss-docs-start card-css-vars - --#{$prefix}card-spacer-y: #{$card-spacer-y}; - --#{$prefix}card-spacer-x: #{$card-spacer-x}; - --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y}; - --#{$prefix}card-title-color: #{$card-title-color}; - --#{$prefix}card-subtitle-color: #{$card-subtitle-color}; - --#{$prefix}card-border-width: #{$card-border-width}; - --#{$prefix}card-border-color: #{$card-border-color}; - --#{$prefix}card-border-radius: #{$card-border-radius}; - --#{$prefix}card-box-shadow: #{$card-box-shadow}; - --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius}; - --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y}; - --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x}; - --#{$prefix}card-cap-bg: #{$card-cap-bg}; - --#{$prefix}card-cap-color: #{$card-cap-color}; - --#{$prefix}card-height: #{$card-height}; - --#{$prefix}card-color: #{$card-color}; - --#{$prefix}card-bg: #{$card-bg}; - --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding}; - --#{$prefix}card-group-margin: #{$card-group-margin}; - // scss-docs-end card-css-vars - - position: relative; - display: flex; - flex-direction: column; - min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 - height: var(--#{$prefix}card-height); - color: var(--#{$prefix}body-color); - word-wrap: break-word; - background-color: var(--#{$prefix}card-bg); - background-clip: border-box; - border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - @include border-radius(var(--#{$prefix}card-border-radius)); - @include box-shadow(var(--#{$prefix}card-box-shadow)); - - > hr { - margin-right: 0; - margin-left: 0; - } - - > .list-group { - border-top: inherit; - border-bottom: inherit; - - &:first-child { - border-top-width: 0; - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); - } - - &:last-child { - border-bottom-width: 0; - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); - } - } - - // Due to specificity of the above selector (`.card > .list-group`), we must - // use a child selector here to prevent double borders. - > .card-header + .list-group, - > .list-group + .card-footer { - border-top: 0; - } -} - -.card-body { - // Enable `flex-grow: 1` for decks and groups so that card blocks take up - // as much space as possible, ensuring footers are aligned to the bottom. - flex: 1 1 auto; - padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x); - color: var(--#{$prefix}card-color); -} - -.card-title { - margin-bottom: var(--#{$prefix}card-title-spacer-y); - color: var(--#{$prefix}card-title-color); -} - -.card-subtitle { - margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list - margin-bottom: 0; - color: var(--#{$prefix}card-subtitle-color); -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link { - &:hover { - text-decoration: if($link-hover-decoration == underline, none, null); - } - - + .card-link { - margin-left: var(--#{$prefix}card-spacer-x); - } -} - -// -// Optional textual caps -// - -.card-header { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - margin-bottom: 0; // Removes the default margin-bottom of - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:first-child { - @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0); - } -} - -.card-footer { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:last-child { - @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius)); - } -} - - -// -// Header navs -// - -.card-header-tabs { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - border-bottom: 0; - - .nav-link.active { - background-color: var(--#{$prefix}card-bg); - border-bottom-color: var(--#{$prefix}card-bg); - } -} - -.card-header-pills { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list -} - -// Card image -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: var(--#{$prefix}card-img-overlay-padding); - @include border-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch -} - -.card-img, -.card-img-top { - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-bottom { - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); -} - - -// -// Card groups -// - -.card-group { - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - margin-bottom: var(--#{$prefix}card-group-margin); - } - - @include media-breakpoint-up(sm) { - display: flex; - flex-flow: row wrap; - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - flex: 1 0 0; - margin-bottom: 0; - - + .card { - margin-left: 0; - border-left: 0; - } - - // Handle rounded corners - @if $enable-rounded { - &:not(:last-child) { - @include border-end-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-right-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-right-radius: 0; - } - } - - &:not(:first-child) { - @include border-start-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-left-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-left-radius: 0; - } - } - } - } - } -} diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss deleted file mode 100644 index 5ebf6b1..0000000 --- a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss +++ /dev/null @@ -1,226 +0,0 @@ -// Notes on the classes: -// -// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) -// even when their scroll action started on a carousel, but for compatibility (with Firefox) -// we're preventing all actions instead -// 2. The .carousel-item-start and .carousel-item-end is used to indicate where -// the active slide is heading. -// 3. .active.carousel-item is the current slide. -// 4. .active.carousel-item-start and .active.carousel-item-end is the current -// slide in its in-transition state. Only one of these occurs at a time. -// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end -// is the upcoming slide in transition. - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; - @include clearfix(); -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - @include transition($carousel-transition); -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); -} - - -// -// Alternate transitions -// - -.carousel-fade { - .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; - } - - .carousel-item.active, - .carousel-item-next.carousel-item-start, - .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; - } - - .active.carousel-item-start, - .active.carousel-item-end { - z-index: 0; - opacity: 0; - @include transition(opacity 0s $carousel-transition-duration); - } -} - - -// -// Left/right controls for nav -// - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - // Use flex for alignment (1-3) - display: flex; // 1. allow flex styles - align-items: center; // 2. vertically center contents - justify-content: center; // 3. horizontally center contents - width: $carousel-control-width; - padding: 0; - color: $carousel-control-color; - text-align: center; - background: none; - filter: var(--#{$prefix}carousel-control-icon-filter); - border: 0; - opacity: $carousel-control-opacity; - @include transition($carousel-control-transition); - - // Hover/focus state - &:hover, - &:focus { - color: $carousel-control-color; - text-decoration: none; - outline: 0; - opacity: $carousel-control-hover-opacity; - } -} -.carousel-control-prev { - left: 0; - background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); -} -.carousel-control-next { - right: 0; - background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); -} - -// Icons for within -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: $carousel-control-icon-width; - height: $carousel-control-icon-width; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; -} - -.carousel-control-prev-icon { - background-image: escape-svg($carousel-control-prev-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-next-icon-bg) + "*/"}; -} -.carousel-control-next-icon { - background-image: escape-svg($carousel-control-next-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-prev-icon-bg) + "*/"}; -} - -// Optional indicator pips/controls -// -// Add a container (such as a list) with the following class and add an item (ideally a focusable control, -// like a button) with data-bs-target for each slide your carousel holds. - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - // Use the .carousel-control's width as margin so we don't overlay those - margin-right: $carousel-control-width; - margin-bottom: 1rem; - margin-left: $carousel-control-width; - - [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: $carousel-indicator-width; - height: $carousel-indicator-height; - padding: 0; - margin-right: $carousel-indicator-spacer; - margin-left: $carousel-indicator-spacer; - text-indent: -999px; - cursor: pointer; - background-color: var(--#{$prefix}carousel-indicator-active-bg); - background-clip: padding-box; - border: 0; - // Use transparent borders to increase the hit area by 10px on top and bottom. - border-top: $carousel-indicator-hit-area-height solid transparent; - border-bottom: $carousel-indicator-hit-area-height solid transparent; - opacity: $carousel-indicator-opacity; - @include transition($carousel-indicator-transition); - } - - .active { - opacity: $carousel-indicator-active-opacity; - } -} - - -// Optional captions -// -// - -.carousel-caption { - position: absolute; - right: (100% - $carousel-caption-width) * .5; - bottom: $carousel-caption-spacer; - left: (100% - $carousel-caption-width) * .5; - padding-top: $carousel-caption-padding-y; - padding-bottom: $carousel-caption-padding-y; - color: var(--#{$prefix}carousel-caption-color); - text-align: center; -} - -// Dark mode carousel - -@mixin carousel-dark() { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg-dark}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color-dark}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter-dark}; -} - -.carousel-dark { - @include carousel-dark(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include carousel-dark(); - } -} diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss deleted file mode 100644 index d53c96f..0000000 --- a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss +++ /dev/null @@ -1,66 +0,0 @@ -// Transparent background and border properties included for button version. -// iOS requires the button element instead of an anchor tag. -// If you want the anchor version, it requires `href="#"`. -// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile - -.btn-close { - // scss-docs-start close-css-vars - --#{$prefix}btn-close-color: #{$btn-close-color}; - --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) }; - --#{$prefix}btn-close-opacity: #{$btn-close-opacity}; - --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity}; - --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow}; - --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity}; - --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity}; - // scss-docs-end close-css-vars - - box-sizing: content-box; - width: $btn-close-width; - height: $btn-close-height; - padding: $btn-close-padding-y $btn-close-padding-x; - color: var(--#{$prefix}btn-close-color); - background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements - filter: var(--#{$prefix}btn-close-filter); - border: 0; // for button elements - @include border-radius(); - opacity: var(--#{$prefix}btn-close-opacity); - - // Override 's hover style - &:hover { - color: var(--#{$prefix}btn-close-color); - text-decoration: none; - opacity: var(--#{$prefix}btn-close-hover-opacity); - } - - &:focus { - outline: 0; - box-shadow: var(--#{$prefix}btn-close-focus-shadow); - opacity: var(--#{$prefix}btn-close-focus-opacity); - } - - &:disabled, - &.disabled { - pointer-events: none; - user-select: none; - opacity: var(--#{$prefix}btn-close-disabled-opacity); - } -} - -@mixin btn-close-white() { - --#{$prefix}btn-close-filter: #{$btn-close-filter-dark}; -} - -.btn-close-white { - @include btn-close-white(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}btn-close-filter: #{$btn-close-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include btn-close-white(); - } -} diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss deleted file mode 100644 index 83b3138..0000000 --- a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss +++ /dev/null @@ -1,41 +0,0 @@ -// Container widths -// -// Set the container width, and override it for fixed navbars in media queries. - -@if $enable-container-classes { - // Single container class with breakpoint max-widths - .container, - // 100% wide container at all breakpoints - .container-fluid { - @include make-container(); - } - - // Responsive containers that are 100% wide until a breakpoint - @each $breakpoint, $container-max-width in $container-max-widths { - .container-#{$breakpoint} { - @extend .container-fluid; - } - - @include media-breakpoint-up($breakpoint, $grid-breakpoints) { - %responsive-container-#{$breakpoint} { - max-width: $container-max-width; - } - - // Extend each breakpoint which is smaller or equal to the current breakpoint - $extend-breakpoint: true; - - @each $name, $width in $grid-breakpoints { - @if ($extend-breakpoint) { - .container#{breakpoint-infix($name, $grid-breakpoints)} { - @extend %responsive-container-#{$breakpoint}; - } - - // Once the current breakpoint is reached, stop extending - @if ($breakpoint == $name) { - $extend-breakpoint: false; - } - } - } - } - } -} diff --git a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss b/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss deleted file mode 100644 index 587ebb4..0000000 --- a/05_react/unterricht/tag43/01_react-with-forms/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss +++ /dev/null @@ -1,250 +0,0 @@ -// The dropdown wrapper (`
      `) -.dropup, -.dropend, -.dropdown, -.dropstart, -.dropup-center, -.dropdown-center { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; - - // Generate the caret automatically - @include caret(); -} - -// The dropdown menu -.dropdown-menu { - // scss-docs-start dropdown-css-vars - --#{$prefix}dropdown-zindex: #{$zindex-dropdown}; - --#{$prefix}dropdown-min-width: #{$dropdown-min-width}; - --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x}; - --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y}; - --#{$prefix}dropdown-spacer: #{$dropdown-spacer}; - @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size); - --#{$prefix}dropdown-color: #{$dropdown-color}; - --#{$prefix}dropdown-bg: #{$dropdown-bg}; - --#{$prefix}dropdown-border-color: #{$dropdown-border-color}; - --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius}; - --#{$prefix}dropdown-border-width: #{$dropdown-border-width}; - --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius}; - --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg}; - --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y}; - --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow}; - --#{$prefix}dropdown-link-color: #{$dropdown-link-color}; - --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color}; - --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg}; - --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color}; - --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg}; - --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color}; - --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x}; - --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y}; - --#{$prefix}dropdown-header-color: #{$dropdown-header-color}; - --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x}; - --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y}; - // scss-docs-end dropdown-css-vars - - position: absolute; - z-index: var(--#{$prefix}dropdown-zindex); - display: none; // none by default, but block on "open" of the menu - min-width: var(--#{$prefix}dropdown-min-width); - padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x); - margin: 0; // Override default margin of ul - @include font-size(var(--#{$prefix}dropdown-font-size)); - color: var(--#{$prefix}dropdown-color); - text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) - list-style: none; - background-color: var(--#{$prefix}dropdown-bg); - background-clip: padding-box; - border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color); - @include border-radius(var(--#{$prefix}dropdown-border-radius)); - @include box-shadow(var(--#{$prefix}dropdown-box-shadow)); - - &[data-bs-popper] { - top: 100%; - left: 0; - margin-top: var(--#{$prefix}dropdown-spacer); - } - - @if $dropdown-padding-y == 0 { - > .dropdown-item:first-child, - > li:first-child .dropdown-item { - @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - > .dropdown-item:last-child, - > li:last-child .dropdown-item { - @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - - } -} - -// scss-docs-start responsive-breakpoints -// We deliberately hardcode the `bs-` prefix because we check -// this custom property in JS to determine Popper's positioning - -@each $breakpoint in map-keys($grid-breakpoints) { - @include media-breakpoint-up($breakpoint) { - $infix: breakpoint-infix($breakpoint, $grid-breakpoints); - - .dropdown-menu#{$infix}-start { - --bs-position: start; - - &[data-bs-popper] { - right: auto; - left: 0; - } - } - - .dropdown-menu#{$infix}-end { - --bs-position: end; - - &[data-bs-popper] { - right: 0; - left: auto; - } - } - } -} -// scss-docs-end responsive-breakpoints - -// Allow for dropdowns to go bottom up (aka, dropup-menu) -// Just add .dropup after the standard .dropdown class and you're set. -.dropup { - .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(up); - } -} - -.dropend { - .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(end); - &::after { - vertical-align: 0; - } - } -} - -.dropstart { - .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(start); - &::before { - vertical-align: 0; - } - } -} - - -// Dividers (basically an `
      `) within the dropdown -.dropdown-divider { - height: 0; - margin: var(--#{$prefix}dropdown-divider-margin-y) 0; - overflow: hidden; - border-top: 1px solid var(--#{$prefix}dropdown-divider-bg); - opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
      element -} - -// Links, buttons, and more within the dropdown menu -// -// `
      ` alignment by inheriting `text-align`. -// 3. Fix alignment for Safari - -th { - font-weight: $table-th-font-weight; // 1 - text-align: inherit; // 2 - text-align: -webkit-match-parent; // 3 -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - - -// Forms -// -// 1. Allow labels to use `margin` for spacing. - -label { - display: inline-block; // 1 -} - -// Remove the default `border-radius` that macOS Chrome adds. -// See https://github.com/twbs/bootstrap/issues/24093 - -button { - // stylelint-disable-next-line property-disallowed-list - border-radius: 0; -} - -// Explicitly remove focus outline in Chromium when it shouldn't be -// visible (e.g. as result of mouse click or touch tap). It already -// should be doing this automatically, but seems to currently be -// confused and applies its very visible two-tone outline anyway. - -button:focus:not(:focus-visible) { - outline: 0; -} - -// 1. Remove the margin in Firefox and Safari - -input, -button, -select, -optgroup, -textarea { - margin: 0; // 1 - font-family: inherit; - @include font-size(inherit); - line-height: inherit; -} - -// Remove the inheritance of text transform in Firefox -button, -select { - text-transform: none; -} -// Set the cursor for non-` - ); -}; -export default Button; diff --git a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/examples/ExampleUseContext.jsx b/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/examples/ExampleUseContext.jsx deleted file mode 100644 index 665f3f4..0000000 --- a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/examples/ExampleUseContext.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import { useContext } from 'react'; -import ThemeContext from './theme-switcher/ThemeContext'; - -const ExampleUseContext = (props) => { - // const { } = props; - - const theme = useContext(ThemeContext); - - return ( -
      -

      useContext

      -

      - The theme of this component is: {theme} -

      -
      - ); -}; -export default ExampleUseContext; diff --git a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/examples/ExampleUseEffectDidUpdate.jsx b/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/examples/ExampleUseEffectDidUpdate.jsx deleted file mode 100644 index 1acaf1a..0000000 --- a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/examples/ExampleUseEffectDidUpdate.jsx +++ /dev/null @@ -1,32 +0,0 @@ -import { useEffect, useState } from 'react'; -import { FaPlus } from 'react-icons/fa6'; - -const ExampleUseEffectDidUpdate = (props) => { - // const { } = props; - - const [value, setValue] = useState(0); - - useEffect(() => { - // mount - console.log('first render and rerender:', value); - - return () => { - // unmount - }; - }, []); // <-- wenn state sich ändert, wird useEffect erneut ausgeführt (update) - - // EventHandlers =========== - const handleClick = (e) => { - setValue(value + 1); - }; - - return ( -
      -

      The value is: {value}

      - -
      - ); -}; -export default ExampleUseEffectDidUpdate; diff --git a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/examples/ExampleUseEffectMount.jsx b/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/examples/ExampleUseEffectMount.jsx deleted file mode 100644 index 3b61117..0000000 --- a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/examples/ExampleUseEffectMount.jsx +++ /dev/null @@ -1,28 +0,0 @@ -import { useEffect } from 'react'; - -const ExampleUseEffectMount = (props) => { - // const { } = props; - - console.log(document.querySelector('#box')); // null - - useEffect(() => { - // mount - console.log(document.querySelector('#box')); // JSX liegt als gerendertes HTML vor - document.querySelector('#box').style.color = 'white'; - document.querySelector('#box').style.backgroundColor = '#222'; - document.querySelector('#box').style.padding = '1rem'; - - return () => { - // cleanup | unmount - }; - }, []); // did update (wenn state oder state-list verändert wird) - - return ( -
      -
      -

      Box was rendered

      -
      -
      - ); -}; -export default ExampleUseEffectMount; diff --git a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/examples/ExampleUseEffectUnMount.jsx b/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/examples/ExampleUseEffectUnMount.jsx deleted file mode 100644 index 252e967..0000000 --- a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/examples/ExampleUseEffectUnMount.jsx +++ /dev/null @@ -1,35 +0,0 @@ -import { useEffect, useState } from 'react'; - -const ExampleUseEffectUnMount = (props) => { - // const { } = props; - - const [timer, setTimer] = useState(0); - - useEffect(() => { - // mount - const interval = setInterval(() => { - setTimer((prevTimer) => prevTimer + 1); - }, 1000); - - window.addEventListener('resize', handleResize); - return () => { - // cleanup | unmount - clearInterval(interval); - window.removeEventListener('resize', handleResize); - }; - }, []); - - // EventHandler ====== - const handleResize = (e) => { - console.log(e); - const { x, y } = document.body.getBoundingClientRect(); - console.log('resize:', { x, y }); - }; - - return ( -
      -

      Timer: {timer}

      -
      - ); -}; -export default ExampleUseEffectUnMount; diff --git a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/examples/ExampleUseId.jsx b/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/examples/ExampleUseId.jsx deleted file mode 100644 index a486d4f..0000000 --- a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/examples/ExampleUseId.jsx +++ /dev/null @@ -1,24 +0,0 @@ -import { useId } from 'react'; -// import { v4 as uuidv4 } from 'uuid'; - -const ExampleUseId = (props) => { - // const { } = props; - const id = useId().replaceAll(/[_r.]/g, ''); - // const id2 = uuidv4(); // -> 'b18794e8-5d0d-417c-b361-ba38e78411b4' - - return ( -
      -

      - ID: {id} -

      - -
      - - -
      -
      - ); -}; -export default ExampleUseId; diff --git a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/examples/ExampleUseReducer.jsx b/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/examples/ExampleUseReducer.jsx deleted file mode 100644 index 559f808..0000000 --- a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/examples/ExampleUseReducer.jsx +++ /dev/null @@ -1,77 +0,0 @@ -import { useReducer } from 'react'; -import { FaMinus, FaPlus } from 'react-icons/fa6'; - -const initialState = { - counter: 0, - //more props... -}; - -// Reducer Funktion verwaltet das state Objekt. Über die Funktion lässt sich das state-Objekt gezielt verändern -function reducer(state, action) { - // action Objekt hat immer folgende Eigenschaften: {type: 'ACTION_NAME', payload: changeValue} - const { type, payload = 1 } = action; - switch (type) { - case 'INCREASE': - return { ...state, counter: state.counter + 1 }; - case 'DECREASE': - return { ...state, counter: state.counter - 1 }; - case 'DOUBLE': - return { ...state, counter: state.counter * 2 }; - case 'INC_VALUE': - return { ...state, counter: state.counter + payload }; - - default: - console.warn('Action Type not found'); - return state; - } -} - -const ExampleUseReducer = (props) => { - // const { } = props; - - // Hook - Toplevel - // const [counter, setCounter] = useState(0); - - const [state, dispatch] = useReducer(reducer, initialState); - - // EventHandler ============ - const handeClickInc = (e) => { - //setCounter(counter + 1); - dispatch({ type: 'INCREASE' }); - }; - const handeClickDec = (e) => { - // setCounter(counter - 1); - - // dispatch(action_object) - dispatch({ type: 'DECREASE' }); - }; - - const handleClickDouble = (e) => { - // dispatch(action_object) - dispatch({ type: 'DOUBLE' }); - }; - - const handleClickIncValue = (e) => { - dispatch({ type: 'INC_VALUE', payload: 5 }); - }; - - return ( -
      - Counter: {state.counter} - - - - -
      - ); -}; -export default ExampleUseReducer; diff --git a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/examples/ExampleUseState.jsx b/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/examples/ExampleUseState.jsx deleted file mode 100644 index 8a9487b..0000000 --- a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/examples/ExampleUseState.jsx +++ /dev/null @@ -1,41 +0,0 @@ -import { useState } from 'react'; - -import { FaPlus, FaMinus } from 'react-icons/fa6'; - -const ExampleUseState = (props) => { - // const { } = props; - - const [counter, setCounter] = useState(0); - - // let counter = 0; - - // EventHandler ======= - const handleClick = (e) => { - console.log('click'); - const btn = e.currentTarget; - const label = btn.ariaLabel; - - switch (label) { - case 'Increase': - // setCounter(counter + 1); // setter(value) - setCounter((prevState) => prevState + 1); // setter(fn(prevValue) => newValue ) - break; - case 'Decrease': - setCounter(counter - 1); - break; - } - }; - - return ( -
      - Counter: {counter} - - -
      - ); -}; -export default ExampleUseState; diff --git a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/examples/theme-switcher/ThemeContext.jsx b/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/examples/theme-switcher/ThemeContext.jsx deleted file mode 100644 index ee75ac4..0000000 --- a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/examples/theme-switcher/ThemeContext.jsx +++ /dev/null @@ -1,8 +0,0 @@ -import { createContext } from 'react'; - -export const THEME_DEFAULT_VALUE = 'light'; - -const ThemeContext = createContext(THEME_DEFAULT_VALUE); // standard theme is light; -// ThemeContext wird durch createContext() zu einem JSX-Element - -export default ThemeContext; diff --git a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/examples/theme-switcher/ThemeProvider.jsx b/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/examples/theme-switcher/ThemeProvider.jsx deleted file mode 100644 index f21ff57..0000000 --- a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/examples/theme-switcher/ThemeProvider.jsx +++ /dev/null @@ -1,26 +0,0 @@ -import { useState } from 'react'; -import ThemeContext, { THEME_DEFAULT_VALUE } from './ThemeContext'; - -const ThemeProvider = (props) => { - const { children } = props; - - console.log(ThemeContext._currentValue); // 'light' <- _currentValue beinhaltet initialWert. Soll aber in production Umgebung nicht verwendet werden, da kein offizieller Standard. - - const [theme, setTheme] = useState(THEME_DEFAULT_VALUE); - - // EventHandler ============== - const handleToggleTheme = () => { - console.log('click'); - setTheme((prevState) => (prevState === 'light' ? 'dark' : 'light')); - }; - - return ( - - - {children} - - ); -}; -export default ThemeProvider; diff --git a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/footers/FooterMain.jsx b/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/footers/FooterMain.jsx deleted file mode 100644 index 6c746be..0000000 --- a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/footers/FooterMain.jsx +++ /dev/null @@ -1,38 +0,0 @@ -const FooterMain = (props) => { - // const { } = props; - - return ( -
      -
      -
      -
      -
      -

      Address

      -
      -
      -
      -
      -

      Links

      - -
      -
      -
      -
      -

      Socials

      -
      -
      -
      -
      -
      - ); -}; -export default FooterMain; diff --git a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/forms/FormNewsletter.jsx b/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/forms/FormNewsletter.jsx deleted file mode 100644 index 04e039d..0000000 --- a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/forms/FormNewsletter.jsx +++ /dev/null @@ -1,29 +0,0 @@ -const FormNewsletter = (props) => { - // const { } = props; - - // EventHandlers ========= - const handleSubmit = (e) => { - e.preventDefault(); - console.log('Form data submit over Fetch/Xhr'); - }; - - return ( -
      -
      -
      -
      - -
      -
      -
      -
      - -
      -
      -
      -
      - ); -}; -export default FormNewsletter; diff --git a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/headers/HeaderMain.jsx b/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/headers/HeaderMain.jsx deleted file mode 100644 index cacc690..0000000 --- a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/headers/HeaderMain.jsx +++ /dev/null @@ -1,14 +0,0 @@ -import LogoMain from '../logos/LogoMain'; - -const HeaderMain = (props) => { - // const { } = props; - - return ( -
      -
      - -
      -
      - ); // VIEW -}; -export default HeaderMain; diff --git a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/icons/LogoDonkey.jsx b/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/icons/LogoDonkey.jsx deleted file mode 100644 index 958a172..0000000 --- a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/icons/LogoDonkey.jsx +++ /dev/null @@ -1,80 +0,0 @@ -import React from 'react'; - -const LogoDonkey = (props) => { - // const { } = props; - - return ( - - - - - - - - - - - - - - - ); -}; -export default LogoDonkey; diff --git a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/inputs/InputAmount.jsx b/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/inputs/InputAmount.jsx deleted file mode 100644 index 516b77a..0000000 --- a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/inputs/InputAmount.jsx +++ /dev/null @@ -1,37 +0,0 @@ -import { FaMinus, FaPlus } from 'react-icons/fa6'; -// npm install react-icons | Auf der npm Seite mit --save, ist nicht mehr nötig -const InputAmount = (props) => { - // const { } = props; - - // EventHandlers ================ - const handleChange = (e) => { - console.log(e); // Event-Objekte wurden um React Methoden und Eigenschaften erweitert. (SyntheticBaseEvent anstatt InputEvent) - console.log(e.target.value); - }; - - return ( -
      -
      - - - - - - - -
      -
      - ); -}; -export default InputAmount; diff --git a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/lists/ListTodo.jsx b/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/lists/ListTodo.jsx deleted file mode 100644 index ff72067..0000000 --- a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/lists/ListTodo.jsx +++ /dev/null @@ -1,32 +0,0 @@ -import { useEffect, useState } from 'react'; - -const ListTodo = (props) => { - // const { } = props; - - const [todos, setTodos] = useState([]); - - useEffect(() => { - fetch('https://dummyjson.com/todos/random/6') - .then((res) => res.json()) - .then((data) => { - setTodos(data); - }) - .catch((err) => { - console.error(err); - }); - - return () => {}; - }, []); - - return ( -
        - {todos.length > 0 && - todos.map(({ id, todo, completed, userId }, idx) => ( -
      • - {todo} -
      • - ))} -
      - ); -}; -export default ListTodo; diff --git a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/lists/ListUser.jsx b/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/lists/ListUser.jsx deleted file mode 100644 index 289377a..0000000 --- a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/lists/ListUser.jsx +++ /dev/null @@ -1,42 +0,0 @@ -import axios from 'axios'; -import { useEffect, useState } from 'react'; - -const ListUser = (props) => { - // const { } = props; - - const [users, setUsers] = useState([]); - - useEffect(() => { - axios - .get('https://dummyjson.com/users?limit=6') - .then(({ data }) => { - console.log(data); - setUsers(data?.users); - }) - .catch((err) => { - console.error(err); - }); - - return () => {}; - }, []); - - return ( -
        - {users.length > 0 && - users.map(({ id, firstName, lastName, age, email }, idx) => ( -
      • -

        - Name: - {firstName} {lastName} -
        - age: {age} -
        - email: {email} -
        -

        -
      • - ))} -
      - ); -}; -export default ListUser; diff --git a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/logos/LogoMain.jsx b/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/logos/LogoMain.jsx deleted file mode 100644 index d74f500..0000000 --- a/05_react/unterricht/tag43/02_react-api-with-hooks/src/components/logos/LogoMain.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import LogoDonkey from '../icons/LogoDonkey'; - -const LogoMain = (props) => { - // const { } = props; - - return ( -
      - -
      IA - JS Course
      -
      - ); -}; -export default LogoMain; diff --git a/05_react/unterricht/tag43/02_react-api-with-hooks/src/main.jsx b/05_react/unterricht/tag43/02_react-api-with-hooks/src/main.jsx deleted file mode 100644 index 4f28fd8..0000000 --- a/05_react/unterricht/tag43/02_react-api-with-hooks/src/main.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; - -// import von 'main'-Datei -import './styles/main.scss'; - -import App from './App.jsx'; - -createRoot(document.getElementById('root')).render( - - - , -); diff --git a/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/_index.scss b/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/_index.scss deleted file mode 100644 index dcefbc9..0000000 --- a/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/_index.scss +++ /dev/null @@ -1,3 +0,0 @@ -// @import 'bootstrap-5.3.8/bootstrap-grid'; -@import 'bootstrap-5.3.8/bootstrap'; -// @import 'bulma-1.04/index' diff --git a/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss b/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss deleted file mode 100644 index e9f267f..0000000 --- a/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss +++ /dev/null @@ -1,153 +0,0 @@ -// -// Base styles -// - -.accordion { - // scss-docs-start accordion-css-vars - --#{$prefix}accordion-color: #{$accordion-color}; - --#{$prefix}accordion-bg: #{$accordion-bg}; - --#{$prefix}accordion-transition: #{$accordion-transition}; - --#{$prefix}accordion-border-color: #{$accordion-border-color}; - --#{$prefix}accordion-border-width: #{$accordion-border-width}; - --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; - --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; - --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; - --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; - --#{$prefix}accordion-btn-color: #{$accordion-button-color}; - --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; - --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; - --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; - --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; - --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; - --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; - --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; - --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; - --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; - // scss-docs-end accordion-css-vars -} - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); - @include font-size($font-size-base); - color: var(--#{$prefix}accordion-btn-color); - text-align: left; // Reset button style - background-color: var(--#{$prefix}accordion-btn-bg); - border: 0; - @include border-radius(0); - overflow-anchor: none; - @include transition(var(--#{$prefix}accordion-transition)); - - &:not(.collapsed) { - color: var(--#{$prefix}accordion-active-color); - background-color: var(--#{$prefix}accordion-active-bg); - box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list - - &::after { - background-image: var(--#{$prefix}accordion-btn-active-icon); - transform: var(--#{$prefix}accordion-btn-icon-transform); - } - } - - // Accordion icon - &::after { - flex-shrink: 0; - width: var(--#{$prefix}accordion-btn-icon-width); - height: var(--#{$prefix}accordion-btn-icon-width); - margin-left: auto; - content: ""; - background-image: var(--#{$prefix}accordion-btn-icon); - background-repeat: no-repeat; - background-size: var(--#{$prefix}accordion-btn-icon-width); - @include transition(var(--#{$prefix}accordion-btn-icon-transition)); - } - - &:hover { - z-index: 2; - } - - &:focus { - z-index: 3; - outline: 0; - box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); - } -} - -.accordion-header { - margin-bottom: 0; -} - -.accordion-item { - color: var(--#{$prefix}accordion-color); - background-color: var(--#{$prefix}accordion-bg); - border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); - - &:first-of-type { - @include border-top-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - &:not(:first-of-type) { - border-top: 0; - } - - // Only set a border-radius on the last item if the accordion is collapsed - &:last-of-type { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - &.collapsed { - @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - > .accordion-collapse { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - } - } -} - -.accordion-body { - padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); -} - - -// Flush accordion items -// -// Remove borders and border-radius to keep accordion items edge-to-edge. - -.accordion-flush { - > .accordion-item { - border-right: 0; - border-left: 0; - @include border-radius(0); - - &:first-child { border-top: 0; } - &:last-child { border-bottom: 0; } - - // stylelint-disable selector-max-class - > .accordion-collapse, - > .accordion-header .accordion-button, - > .accordion-header .accordion-button.collapsed { - @include border-radius(0); - } - // stylelint-enable selector-max-class - } -} - -@if $enable-dark-mode { - @include color-mode(dark) { - .accordion-button::after { - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; - } - } -} diff --git a/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss b/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss deleted file mode 100644 index b8cff9b..0000000 --- a/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss +++ /dev/null @@ -1,68 +0,0 @@ -// -// Base styles -// - -.alert { - // scss-docs-start alert-css-vars - --#{$prefix}alert-bg: transparent; - --#{$prefix}alert-padding-x: #{$alert-padding-x}; - --#{$prefix}alert-padding-y: #{$alert-padding-y}; - --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; - --#{$prefix}alert-color: inherit; - --#{$prefix}alert-border-color: transparent; - --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); - --#{$prefix}alert-border-radius: #{$alert-border-radius}; - --#{$prefix}alert-link-color: inherit; - // scss-docs-end alert-css-vars - - position: relative; - padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); - margin-bottom: var(--#{$prefix}alert-margin-bottom); - color: var(--#{$prefix}alert-color); - background-color: var(--#{$prefix}alert-bg); - border: var(--#{$prefix}alert-border); - @include border-radius(var(--#{$prefix}alert-border-radius)); -} - -// Headings for larger alerts -.alert-heading { - // Specified to prevent conflicts of changing $headings-color - color: inherit; -} - -// Provide class for links that match alerts -.alert-link { - font-weight: $alert-link-font-weight; - color: var(--#{$prefix}alert-link-color); -} - - -// Dismissible alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissible { - padding-right: $alert-dismissible-padding-r; - - // Adjust close link position - .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: $stretched-link-z-index + 1; - padding: $alert-padding-y * 1.25 $alert-padding-x; - } -} - - -// scss-docs-start alert-modifiers -// Generate contextual modifier classes for colorizing the alert -@each $state in map-keys($theme-colors) { - .alert-#{$state} { - --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); - --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); - --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); - --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); - } -} -// scss-docs-end alert-modifiers diff --git a/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss b/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss deleted file mode 100644 index cc3d269..0000000 --- a/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss +++ /dev/null @@ -1,38 +0,0 @@ -// Base class -// -// Requires one of the contextual, color modifier classes for `color` and -// `background-color`. - -.badge { - // scss-docs-start badge-css-vars - --#{$prefix}badge-padding-x: #{$badge-padding-x}; - --#{$prefix}badge-padding-y: #{$badge-padding-y}; - @include rfs($badge-font-size, --#{$prefix}badge-font-size); - --#{$prefix}badge-font-weight: #{$badge-font-weight}; - --#{$prefix}badge-color: #{$badge-color}; - --#{$prefix}badge-border-radius: #{$badge-border-radius}; - // scss-docs-end badge-css-vars - - display: inline-block; - padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x); - @include font-size(var(--#{$prefix}badge-font-size)); - font-weight: var(--#{$prefix}badge-font-weight); - line-height: 1; - color: var(--#{$prefix}badge-color); - text-align: center; - white-space: nowrap; - vertical-align: baseline; - @include border-radius(var(--#{$prefix}badge-border-radius)); - @include gradient-bg(); - - // Empty badges collapse automatically - &:empty { - display: none; - } -} - -// Quick fix for badges in buttons -.btn .badge { - position: relative; - top: -1px; -} diff --git a/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss b/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss deleted file mode 100644 index b8252ff..0000000 --- a/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss +++ /dev/null @@ -1,40 +0,0 @@ -.breadcrumb { - // scss-docs-start breadcrumb-css-vars - --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x}; - --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y}; - --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom}; - @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size); - --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg}; - --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius}; - --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color}; - --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x}; - --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color}; - // scss-docs-end breadcrumb-css-vars - - display: flex; - flex-wrap: wrap; - padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x); - margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom); - @include font-size(var(--#{$prefix}breadcrumb-font-size)); - list-style: none; - background-color: var(--#{$prefix}breadcrumb-bg); - @include border-radius(var(--#{$prefix}breadcrumb-border-radius)); -} - -.breadcrumb-item { - // The separator between breadcrumbs (by default, a forward-slash: "/") - + .breadcrumb-item { - padding-left: var(--#{$prefix}breadcrumb-item-padding-x); - - &::before { - float: left; // Suppress inline spacings and underlining of the separator - padding-right: var(--#{$prefix}breadcrumb-item-padding-x); - color: var(--#{$prefix}breadcrumb-divider-color); - content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; - } - } - - &.active { - color: var(--#{$prefix}breadcrumb-item-active-color); - } -} diff --git a/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss b/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss deleted file mode 100644 index 78e1252..0000000 --- a/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss +++ /dev/null @@ -1,147 +0,0 @@ -// Make the div behave like a button -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; // match .btn alignment given font-size hack above - - > .btn { - position: relative; - flex: 1 1 auto; - } - - // Bring the hover, focused, and "active" buttons to the front to overlay - // the borders properly - > .btn-check:checked + .btn, - > .btn-check:focus + .btn, - > .btn:hover, - > .btn:focus, - > .btn:active, - > .btn.active { - z-index: 1; - } -} - -// Optional: Group multiple button groups together for a toolbar -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; - - .input-group { - width: auto; - } -} - -.btn-group { - @include border-radius($btn-border-radius); - - // Prevent double borders when buttons are next to each other - > :not(.btn-check:first-child) + .btn, - > .btn-group:not(:first-child) { - margin-left: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn.dropdown-toggle-split:first-child, - > .btn-group:not(:last-child) > .btn { - @include border-end-radius(0); - } - - // The left radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-start-radius(0); - } -} - -// Sizing -// -// Remix the default button sizing classes into new ones for easier manipulation. - -.btn-group-sm > .btn { @extend .btn-sm; } -.btn-group-lg > .btn { @extend .btn-lg; } - - -// -// Split button dropdowns -// - -.dropdown-toggle-split { - padding-right: $btn-padding-x * .75; - padding-left: $btn-padding-x * .75; - - &::after, - .dropup &::after, - .dropend &::after { - margin-left: 0; - } - - .dropstart &::before { - margin-right: 0; - } -} - -.btn-sm + .dropdown-toggle-split { - padding-right: $btn-padding-x-sm * .75; - padding-left: $btn-padding-x-sm * .75; -} - -.btn-lg + .dropdown-toggle-split { - padding-right: $btn-padding-x-lg * .75; - padding-left: $btn-padding-x-lg * .75; -} - - -// The clickable button for toggling the menu -// Set the same inset shadow as the :active state -.btn-group.show .dropdown-toggle { - @include box-shadow($btn-active-box-shadow); - - // Show no shadow for `.btn-link` since it has no other button styles. - &.btn-link { - @include box-shadow(none); - } -} - - -// -// Vertical button groups -// - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; - - > .btn, - > .btn-group { - width: 100%; - } - - > .btn:not(:first-child), - > .btn-group:not(:first-child) { - margin-top: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn-group:not(:last-child) > .btn { - @include border-bottom-radius(0); - } - - // The top radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-top-radius(0); - } -} diff --git a/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss b/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss deleted file mode 100644 index caa4518..0000000 --- a/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss +++ /dev/null @@ -1,216 +0,0 @@ -// -// Base styles -// - -.btn { - // scss-docs-start btn-css-vars - --#{$prefix}btn-padding-x: #{$btn-padding-x}; - --#{$prefix}btn-padding-y: #{$btn-padding-y}; - --#{$prefix}btn-font-family: #{$btn-font-family}; - @include rfs($btn-font-size, --#{$prefix}btn-font-size); - --#{$prefix}btn-font-weight: #{$btn-font-weight}; - --#{$prefix}btn-line-height: #{$btn-line-height}; - --#{$prefix}btn-color: #{$btn-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-width: #{$btn-border-width}; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-border-radius: #{$btn-border-radius}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-box-shadow: #{$btn-box-shadow}; - --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity}; - --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5); - // scss-docs-end btn-css-vars - - display: inline-block; - padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x); - font-family: var(--#{$prefix}btn-font-family); - @include font-size(var(--#{$prefix}btn-font-size)); - font-weight: var(--#{$prefix}btn-font-weight); - line-height: var(--#{$prefix}btn-line-height); - color: var(--#{$prefix}btn-color); - text-align: center; - text-decoration: if($link-decoration == none, null, none); - white-space: $btn-white-space; - vertical-align: middle; - cursor: if($enable-button-pointers, pointer, null); - user-select: none; - border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color); - @include border-radius(var(--#{$prefix}btn-border-radius)); - @include gradient-bg(var(--#{$prefix}btn-bg)); - @include box-shadow(var(--#{$prefix}btn-box-shadow)); - @include transition($btn-transition); - - &:hover { - color: var(--#{$prefix}btn-hover-color); - text-decoration: if($link-hover-decoration == underline, none, null); - background-color: var(--#{$prefix}btn-hover-bg); - border-color: var(--#{$prefix}btn-hover-border-color); - } - - .btn-check + &:hover { - // override for the checkbox/radio buttons - color: var(--#{$prefix}btn-color); - background-color: var(--#{$prefix}btn-bg); - border-color: var(--#{$prefix}btn-border-color); - } - - &:focus-visible { - color: var(--#{$prefix}btn-hover-color); - @include gradient-bg(var(--#{$prefix}btn-hover-bg)); - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:focus-visible + & { - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:checked + &, - :not(.btn-check) + &:active, - &:first-child:active, - &.active, - &.show { - color: var(--#{$prefix}btn-active-color); - background-color: var(--#{$prefix}btn-active-bg); - // Remove CSS gradients if they're enabled - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-active-border-color); - @include box-shadow(var(--#{$prefix}btn-active-shadow)); - - &:focus-visible { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - } - - .btn-check:checked:focus-visible + & { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - &:disabled, - &.disabled, - fieldset:disabled & { - color: var(--#{$prefix}btn-disabled-color); - pointer-events: none; - background-color: var(--#{$prefix}btn-disabled-bg); - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-disabled-border-color); - opacity: var(--#{$prefix}btn-disabled-opacity); - @include box-shadow(none); - } -} - - -// -// Alternate buttons -// - -// scss-docs-start btn-variant-loops -@each $color, $value in $theme-colors { - .btn-#{$color} { - @if $color == "light" { - @include button-variant( - $value, - $value, - $hover-background: shade-color($value, $btn-hover-bg-shade-amount), - $hover-border: shade-color($value, $btn-hover-border-shade-amount), - $active-background: shade-color($value, $btn-active-bg-shade-amount), - $active-border: shade-color($value, $btn-active-border-shade-amount) - ); - } @else if $color == "dark" { - @include button-variant( - $value, - $value, - $hover-background: tint-color($value, $btn-hover-bg-tint-amount), - $hover-border: tint-color($value, $btn-hover-border-tint-amount), - $active-background: tint-color($value, $btn-active-bg-tint-amount), - $active-border: tint-color($value, $btn-active-border-tint-amount) - ); - } @else { - @include button-variant($value, $value); - } - } -} - -@each $color, $value in $theme-colors { - .btn-outline-#{$color} { - @include button-outline-variant($value); - } -} -// scss-docs-end btn-variant-loops - - -// -// Link buttons -// - -// Make a button look and behave like a link -.btn-link { - --#{$prefix}btn-font-weight: #{$font-weight-normal}; - --#{$prefix}btn-color: #{$btn-link-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-hover-color: #{$btn-link-hover-color}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-active-color: #{$btn-link-hover-color}; - --#{$prefix}btn-active-border-color: transparent; - --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color}; - --#{$prefix}btn-disabled-border-color: transparent; - --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows - --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb}; - - text-decoration: $link-decoration; - @if $enable-gradients { - background-image: none; - } - - &:hover, - &:focus-visible { - text-decoration: $link-hover-decoration; - } - - &:focus-visible { - color: var(--#{$prefix}btn-color); - } - - &:hover { - color: var(--#{$prefix}btn-hover-color); - } - - // No need for an active state here -} - - -// -// Button Sizes -// - -.btn-lg { - @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); -} - -.btn-sm { - @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); -} diff --git a/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss b/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss deleted file mode 100644 index dcebe6a..0000000 --- a/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss +++ /dev/null @@ -1,238 +0,0 @@ -// -// Base styles -// - -.card { - // scss-docs-start card-css-vars - --#{$prefix}card-spacer-y: #{$card-spacer-y}; - --#{$prefix}card-spacer-x: #{$card-spacer-x}; - --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y}; - --#{$prefix}card-title-color: #{$card-title-color}; - --#{$prefix}card-subtitle-color: #{$card-subtitle-color}; - --#{$prefix}card-border-width: #{$card-border-width}; - --#{$prefix}card-border-color: #{$card-border-color}; - --#{$prefix}card-border-radius: #{$card-border-radius}; - --#{$prefix}card-box-shadow: #{$card-box-shadow}; - --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius}; - --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y}; - --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x}; - --#{$prefix}card-cap-bg: #{$card-cap-bg}; - --#{$prefix}card-cap-color: #{$card-cap-color}; - --#{$prefix}card-height: #{$card-height}; - --#{$prefix}card-color: #{$card-color}; - --#{$prefix}card-bg: #{$card-bg}; - --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding}; - --#{$prefix}card-group-margin: #{$card-group-margin}; - // scss-docs-end card-css-vars - - position: relative; - display: flex; - flex-direction: column; - min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 - height: var(--#{$prefix}card-height); - color: var(--#{$prefix}body-color); - word-wrap: break-word; - background-color: var(--#{$prefix}card-bg); - background-clip: border-box; - border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - @include border-radius(var(--#{$prefix}card-border-radius)); - @include box-shadow(var(--#{$prefix}card-box-shadow)); - - > hr { - margin-right: 0; - margin-left: 0; - } - - > .list-group { - border-top: inherit; - border-bottom: inherit; - - &:first-child { - border-top-width: 0; - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); - } - - &:last-child { - border-bottom-width: 0; - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); - } - } - - // Due to specificity of the above selector (`.card > .list-group`), we must - // use a child selector here to prevent double borders. - > .card-header + .list-group, - > .list-group + .card-footer { - border-top: 0; - } -} - -.card-body { - // Enable `flex-grow: 1` for decks and groups so that card blocks take up - // as much space as possible, ensuring footers are aligned to the bottom. - flex: 1 1 auto; - padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x); - color: var(--#{$prefix}card-color); -} - -.card-title { - margin-bottom: var(--#{$prefix}card-title-spacer-y); - color: var(--#{$prefix}card-title-color); -} - -.card-subtitle { - margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list - margin-bottom: 0; - color: var(--#{$prefix}card-subtitle-color); -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link { - &:hover { - text-decoration: if($link-hover-decoration == underline, none, null); - } - - + .card-link { - margin-left: var(--#{$prefix}card-spacer-x); - } -} - -// -// Optional textual caps -// - -.card-header { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - margin-bottom: 0; // Removes the default margin-bottom of - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:first-child { - @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0); - } -} - -.card-footer { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:last-child { - @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius)); - } -} - - -// -// Header navs -// - -.card-header-tabs { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - border-bottom: 0; - - .nav-link.active { - background-color: var(--#{$prefix}card-bg); - border-bottom-color: var(--#{$prefix}card-bg); - } -} - -.card-header-pills { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list -} - -// Card image -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: var(--#{$prefix}card-img-overlay-padding); - @include border-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch -} - -.card-img, -.card-img-top { - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-bottom { - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); -} - - -// -// Card groups -// - -.card-group { - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - margin-bottom: var(--#{$prefix}card-group-margin); - } - - @include media-breakpoint-up(sm) { - display: flex; - flex-flow: row wrap; - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - flex: 1 0 0; - margin-bottom: 0; - - + .card { - margin-left: 0; - border-left: 0; - } - - // Handle rounded corners - @if $enable-rounded { - &:not(:last-child) { - @include border-end-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-right-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-right-radius: 0; - } - } - - &:not(:first-child) { - @include border-start-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-left-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-left-radius: 0; - } - } - } - } - } -} diff --git a/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss b/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss deleted file mode 100644 index 5ebf6b1..0000000 --- a/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss +++ /dev/null @@ -1,226 +0,0 @@ -// Notes on the classes: -// -// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) -// even when their scroll action started on a carousel, but for compatibility (with Firefox) -// we're preventing all actions instead -// 2. The .carousel-item-start and .carousel-item-end is used to indicate where -// the active slide is heading. -// 3. .active.carousel-item is the current slide. -// 4. .active.carousel-item-start and .active.carousel-item-end is the current -// slide in its in-transition state. Only one of these occurs at a time. -// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end -// is the upcoming slide in transition. - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; - @include clearfix(); -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - @include transition($carousel-transition); -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); -} - - -// -// Alternate transitions -// - -.carousel-fade { - .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; - } - - .carousel-item.active, - .carousel-item-next.carousel-item-start, - .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; - } - - .active.carousel-item-start, - .active.carousel-item-end { - z-index: 0; - opacity: 0; - @include transition(opacity 0s $carousel-transition-duration); - } -} - - -// -// Left/right controls for nav -// - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - // Use flex for alignment (1-3) - display: flex; // 1. allow flex styles - align-items: center; // 2. vertically center contents - justify-content: center; // 3. horizontally center contents - width: $carousel-control-width; - padding: 0; - color: $carousel-control-color; - text-align: center; - background: none; - filter: var(--#{$prefix}carousel-control-icon-filter); - border: 0; - opacity: $carousel-control-opacity; - @include transition($carousel-control-transition); - - // Hover/focus state - &:hover, - &:focus { - color: $carousel-control-color; - text-decoration: none; - outline: 0; - opacity: $carousel-control-hover-opacity; - } -} -.carousel-control-prev { - left: 0; - background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); -} -.carousel-control-next { - right: 0; - background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); -} - -// Icons for within -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: $carousel-control-icon-width; - height: $carousel-control-icon-width; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; -} - -.carousel-control-prev-icon { - background-image: escape-svg($carousel-control-prev-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-next-icon-bg) + "*/"}; -} -.carousel-control-next-icon { - background-image: escape-svg($carousel-control-next-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-prev-icon-bg) + "*/"}; -} - -// Optional indicator pips/controls -// -// Add a container (such as a list) with the following class and add an item (ideally a focusable control, -// like a button) with data-bs-target for each slide your carousel holds. - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - // Use the .carousel-control's width as margin so we don't overlay those - margin-right: $carousel-control-width; - margin-bottom: 1rem; - margin-left: $carousel-control-width; - - [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: $carousel-indicator-width; - height: $carousel-indicator-height; - padding: 0; - margin-right: $carousel-indicator-spacer; - margin-left: $carousel-indicator-spacer; - text-indent: -999px; - cursor: pointer; - background-color: var(--#{$prefix}carousel-indicator-active-bg); - background-clip: padding-box; - border: 0; - // Use transparent borders to increase the hit area by 10px on top and bottom. - border-top: $carousel-indicator-hit-area-height solid transparent; - border-bottom: $carousel-indicator-hit-area-height solid transparent; - opacity: $carousel-indicator-opacity; - @include transition($carousel-indicator-transition); - } - - .active { - opacity: $carousel-indicator-active-opacity; - } -} - - -// Optional captions -// -// - -.carousel-caption { - position: absolute; - right: (100% - $carousel-caption-width) * .5; - bottom: $carousel-caption-spacer; - left: (100% - $carousel-caption-width) * .5; - padding-top: $carousel-caption-padding-y; - padding-bottom: $carousel-caption-padding-y; - color: var(--#{$prefix}carousel-caption-color); - text-align: center; -} - -// Dark mode carousel - -@mixin carousel-dark() { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg-dark}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color-dark}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter-dark}; -} - -.carousel-dark { - @include carousel-dark(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include carousel-dark(); - } -} diff --git a/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss b/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss deleted file mode 100644 index d53c96f..0000000 --- a/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss +++ /dev/null @@ -1,66 +0,0 @@ -// Transparent background and border properties included for button version. -// iOS requires the button element instead of an anchor tag. -// If you want the anchor version, it requires `href="#"`. -// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile - -.btn-close { - // scss-docs-start close-css-vars - --#{$prefix}btn-close-color: #{$btn-close-color}; - --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) }; - --#{$prefix}btn-close-opacity: #{$btn-close-opacity}; - --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity}; - --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow}; - --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity}; - --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity}; - // scss-docs-end close-css-vars - - box-sizing: content-box; - width: $btn-close-width; - height: $btn-close-height; - padding: $btn-close-padding-y $btn-close-padding-x; - color: var(--#{$prefix}btn-close-color); - background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements - filter: var(--#{$prefix}btn-close-filter); - border: 0; // for button elements - @include border-radius(); - opacity: var(--#{$prefix}btn-close-opacity); - - // Override 's hover style - &:hover { - color: var(--#{$prefix}btn-close-color); - text-decoration: none; - opacity: var(--#{$prefix}btn-close-hover-opacity); - } - - &:focus { - outline: 0; - box-shadow: var(--#{$prefix}btn-close-focus-shadow); - opacity: var(--#{$prefix}btn-close-focus-opacity); - } - - &:disabled, - &.disabled { - pointer-events: none; - user-select: none; - opacity: var(--#{$prefix}btn-close-disabled-opacity); - } -} - -@mixin btn-close-white() { - --#{$prefix}btn-close-filter: #{$btn-close-filter-dark}; -} - -.btn-close-white { - @include btn-close-white(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}btn-close-filter: #{$btn-close-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include btn-close-white(); - } -} diff --git a/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss b/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss deleted file mode 100644 index 83b3138..0000000 --- a/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss +++ /dev/null @@ -1,41 +0,0 @@ -// Container widths -// -// Set the container width, and override it for fixed navbars in media queries. - -@if $enable-container-classes { - // Single container class with breakpoint max-widths - .container, - // 100% wide container at all breakpoints - .container-fluid { - @include make-container(); - } - - // Responsive containers that are 100% wide until a breakpoint - @each $breakpoint, $container-max-width in $container-max-widths { - .container-#{$breakpoint} { - @extend .container-fluid; - } - - @include media-breakpoint-up($breakpoint, $grid-breakpoints) { - %responsive-container-#{$breakpoint} { - max-width: $container-max-width; - } - - // Extend each breakpoint which is smaller or equal to the current breakpoint - $extend-breakpoint: true; - - @each $name, $width in $grid-breakpoints { - @if ($extend-breakpoint) { - .container#{breakpoint-infix($name, $grid-breakpoints)} { - @extend %responsive-container-#{$breakpoint}; - } - - // Once the current breakpoint is reached, stop extending - @if ($breakpoint == $name) { - $extend-breakpoint: false; - } - } - } - } - } -} diff --git a/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss b/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss deleted file mode 100644 index 587ebb4..0000000 --- a/05_react/unterricht/tag43/02_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss +++ /dev/null @@ -1,250 +0,0 @@ -// The dropdown wrapper (`
      `) -.dropup, -.dropend, -.dropdown, -.dropstart, -.dropup-center, -.dropdown-center { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; - - // Generate the caret automatically - @include caret(); -} - -// The dropdown menu -.dropdown-menu { - // scss-docs-start dropdown-css-vars - --#{$prefix}dropdown-zindex: #{$zindex-dropdown}; - --#{$prefix}dropdown-min-width: #{$dropdown-min-width}; - --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x}; - --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y}; - --#{$prefix}dropdown-spacer: #{$dropdown-spacer}; - @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size); - --#{$prefix}dropdown-color: #{$dropdown-color}; - --#{$prefix}dropdown-bg: #{$dropdown-bg}; - --#{$prefix}dropdown-border-color: #{$dropdown-border-color}; - --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius}; - --#{$prefix}dropdown-border-width: #{$dropdown-border-width}; - --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius}; - --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg}; - --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y}; - --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow}; - --#{$prefix}dropdown-link-color: #{$dropdown-link-color}; - --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color}; - --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg}; - --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color}; - --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg}; - --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color}; - --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x}; - --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y}; - --#{$prefix}dropdown-header-color: #{$dropdown-header-color}; - --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x}; - --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y}; - // scss-docs-end dropdown-css-vars - - position: absolute; - z-index: var(--#{$prefix}dropdown-zindex); - display: none; // none by default, but block on "open" of the menu - min-width: var(--#{$prefix}dropdown-min-width); - padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x); - margin: 0; // Override default margin of ul - @include font-size(var(--#{$prefix}dropdown-font-size)); - color: var(--#{$prefix}dropdown-color); - text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) - list-style: none; - background-color: var(--#{$prefix}dropdown-bg); - background-clip: padding-box; - border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color); - @include border-radius(var(--#{$prefix}dropdown-border-radius)); - @include box-shadow(var(--#{$prefix}dropdown-box-shadow)); - - &[data-bs-popper] { - top: 100%; - left: 0; - margin-top: var(--#{$prefix}dropdown-spacer); - } - - @if $dropdown-padding-y == 0 { - > .dropdown-item:first-child, - > li:first-child .dropdown-item { - @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - > .dropdown-item:last-child, - > li:last-child .dropdown-item { - @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - - } -} - -// scss-docs-start responsive-breakpoints -// We deliberately hardcode the `bs-` prefix because we check -// this custom property in JS to determine Popper's positioning - -@each $breakpoint in map-keys($grid-breakpoints) { - @include media-breakpoint-up($breakpoint) { - $infix: breakpoint-infix($breakpoint, $grid-breakpoints); - - .dropdown-menu#{$infix}-start { - --bs-position: start; - - &[data-bs-popper] { - right: auto; - left: 0; - } - } - - .dropdown-menu#{$infix}-end { - --bs-position: end; - - &[data-bs-popper] { - right: 0; - left: auto; - } - } - } -} -// scss-docs-end responsive-breakpoints - -// Allow for dropdowns to go bottom up (aka, dropup-menu) -// Just add .dropup after the standard .dropdown class and you're set. -.dropup { - .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(up); - } -} - -.dropend { - .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(end); - &::after { - vertical-align: 0; - } - } -} - -.dropstart { - .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(start); - &::before { - vertical-align: 0; - } - } -} - - -// Dividers (basically an `
      `) within the dropdown -.dropdown-divider { - height: 0; - margin: var(--#{$prefix}dropdown-divider-margin-y) 0; - overflow: hidden; - border-top: 1px solid var(--#{$prefix}dropdown-divider-bg); - opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
      element -} - -// Links, buttons, and more within the dropdown menu -// -// `
      ` alignment by inheriting `text-align`. -// 3. Fix alignment for Safari - -th { - font-weight: $table-th-font-weight; // 1 - text-align: inherit; // 2 - text-align: -webkit-match-parent; // 3 -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - - -// Forms -// -// 1. Allow labels to use `margin` for spacing. - -label { - display: inline-block; // 1 -} - -// Remove the default `border-radius` that macOS Chrome adds. -// See https://github.com/twbs/bootstrap/issues/24093 - -button { - // stylelint-disable-next-line property-disallowed-list - border-radius: 0; -} - -// Explicitly remove focus outline in Chromium when it shouldn't be -// visible (e.g. as result of mouse click or touch tap). It already -// should be doing this automatically, but seems to currently be -// confused and applies its very visible two-tone outline anyway. - -button:focus:not(:focus-visible) { - outline: 0; -} - -// 1. Remove the margin in Firefox and Safari - -input, -button, -select, -optgroup, -textarea { - margin: 0; // 1 - font-family: inherit; - @include font-size(inherit); - line-height: inherit; -} - -// Remove the inheritance of text transform in Firefox -button, -select { - text-transform: none; -} -// Set the cursor for non-` - ); -}; -export default Button; diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/examples/ExampleUseContext.jsx b/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/examples/ExampleUseContext.jsx deleted file mode 100644 index 665f3f4..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/examples/ExampleUseContext.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import { useContext } from 'react'; -import ThemeContext from './theme-switcher/ThemeContext'; - -const ExampleUseContext = (props) => { - // const { } = props; - - const theme = useContext(ThemeContext); - - return ( -
      -

      useContext

      -

      - The theme of this component is: {theme} -

      -
      - ); -}; -export default ExampleUseContext; diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/examples/ExampleUseEffectDidUpdate.jsx b/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/examples/ExampleUseEffectDidUpdate.jsx deleted file mode 100644 index bb0ded2..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/examples/ExampleUseEffectDidUpdate.jsx +++ /dev/null @@ -1,32 +0,0 @@ -import { useEffect, useState } from 'react'; -import { FaPlus } from 'react-icons/fa6'; - -const ExampleUseEffectDidUpdate = (props) => { - // const { } = props; - - const [value, setValue] = useState(0); - - useEffect(() => { - // mount - console.log('first render and rerender:', value); - - return () => { - // unmount - }; - }, [value]); // <-- wenn state sich ändert, wird useEffect erneut ausgeführt (update) - - // EventHandlers =========== - const handleClick = (e) => { - setValue(value + 1); - }; - - return ( -
      -

      The value is: {value}

      - -
      - ); -}; -export default ExampleUseEffectDidUpdate; diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/examples/ExampleUseEffectMount.jsx b/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/examples/ExampleUseEffectMount.jsx deleted file mode 100644 index 3b61117..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/examples/ExampleUseEffectMount.jsx +++ /dev/null @@ -1,28 +0,0 @@ -import { useEffect } from 'react'; - -const ExampleUseEffectMount = (props) => { - // const { } = props; - - console.log(document.querySelector('#box')); // null - - useEffect(() => { - // mount - console.log(document.querySelector('#box')); // JSX liegt als gerendertes HTML vor - document.querySelector('#box').style.color = 'white'; - document.querySelector('#box').style.backgroundColor = '#222'; - document.querySelector('#box').style.padding = '1rem'; - - return () => { - // cleanup | unmount - }; - }, []); // did update (wenn state oder state-list verändert wird) - - return ( -
      -
      -

      Box was rendered

      -
      -
      - ); -}; -export default ExampleUseEffectMount; diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/examples/ExampleUseEffectUnMount.jsx b/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/examples/ExampleUseEffectUnMount.jsx deleted file mode 100644 index 5a45db2..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/examples/ExampleUseEffectUnMount.jsx +++ /dev/null @@ -1,35 +0,0 @@ -import { useEffect, useState } from 'react'; - -const ExampleUseEffectUnMount = (props) => { - // const { } = props; - - const [timer, setTimer] = useState(0); - - useEffect(() => { - // mount - const interval = setInterval(() => { - setTimer((prevTimer) => prevTimer + 1); - }, 1000); - - window.addEventListener('resize', handleResize); - return () => { - // cleanup | unmount - clearInterval(interval); - window.removeEventListener('resize', handleResize); - }; - }, []); - - // EventHandler ====== - const handleResize = (e) => { - console.log(e); - const { x, y, width, height } = document.body.getBoundingClientRect(); - console.log('resize:', { x, y, width, height }); - }; - - return ( -
      -

      Timer: {timer}

      -
      - ); -}; -export default ExampleUseEffectUnMount; diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/examples/ExampleUseId.jsx b/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/examples/ExampleUseId.jsx deleted file mode 100644 index a486d4f..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/examples/ExampleUseId.jsx +++ /dev/null @@ -1,24 +0,0 @@ -import { useId } from 'react'; -// import { v4 as uuidv4 } from 'uuid'; - -const ExampleUseId = (props) => { - // const { } = props; - const id = useId().replaceAll(/[_r.]/g, ''); - // const id2 = uuidv4(); // -> 'b18794e8-5d0d-417c-b361-ba38e78411b4' - - return ( -
      -

      - ID: {id} -

      - -
      - - -
      -
      - ); -}; -export default ExampleUseId; diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/examples/ExampleUseReducer.jsx b/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/examples/ExampleUseReducer.jsx deleted file mode 100644 index 559f808..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/examples/ExampleUseReducer.jsx +++ /dev/null @@ -1,77 +0,0 @@ -import { useReducer } from 'react'; -import { FaMinus, FaPlus } from 'react-icons/fa6'; - -const initialState = { - counter: 0, - //more props... -}; - -// Reducer Funktion verwaltet das state Objekt. Über die Funktion lässt sich das state-Objekt gezielt verändern -function reducer(state, action) { - // action Objekt hat immer folgende Eigenschaften: {type: 'ACTION_NAME', payload: changeValue} - const { type, payload = 1 } = action; - switch (type) { - case 'INCREASE': - return { ...state, counter: state.counter + 1 }; - case 'DECREASE': - return { ...state, counter: state.counter - 1 }; - case 'DOUBLE': - return { ...state, counter: state.counter * 2 }; - case 'INC_VALUE': - return { ...state, counter: state.counter + payload }; - - default: - console.warn('Action Type not found'); - return state; - } -} - -const ExampleUseReducer = (props) => { - // const { } = props; - - // Hook - Toplevel - // const [counter, setCounter] = useState(0); - - const [state, dispatch] = useReducer(reducer, initialState); - - // EventHandler ============ - const handeClickInc = (e) => { - //setCounter(counter + 1); - dispatch({ type: 'INCREASE' }); - }; - const handeClickDec = (e) => { - // setCounter(counter - 1); - - // dispatch(action_object) - dispatch({ type: 'DECREASE' }); - }; - - const handleClickDouble = (e) => { - // dispatch(action_object) - dispatch({ type: 'DOUBLE' }); - }; - - const handleClickIncValue = (e) => { - dispatch({ type: 'INC_VALUE', payload: 5 }); - }; - - return ( -
      - Counter: {state.counter} - - - - -
      - ); -}; -export default ExampleUseReducer; diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/examples/ExampleUseState.jsx b/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/examples/ExampleUseState.jsx deleted file mode 100644 index 8a9487b..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/examples/ExampleUseState.jsx +++ /dev/null @@ -1,41 +0,0 @@ -import { useState } from 'react'; - -import { FaPlus, FaMinus } from 'react-icons/fa6'; - -const ExampleUseState = (props) => { - // const { } = props; - - const [counter, setCounter] = useState(0); - - // let counter = 0; - - // EventHandler ======= - const handleClick = (e) => { - console.log('click'); - const btn = e.currentTarget; - const label = btn.ariaLabel; - - switch (label) { - case 'Increase': - // setCounter(counter + 1); // setter(value) - setCounter((prevState) => prevState + 1); // setter(fn(prevValue) => newValue ) - break; - case 'Decrease': - setCounter(counter - 1); - break; - } - }; - - return ( -
      - Counter: {counter} - - -
      - ); -}; -export default ExampleUseState; diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/examples/theme-switcher/ThemeContext.jsx b/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/examples/theme-switcher/ThemeContext.jsx deleted file mode 100644 index ee75ac4..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/examples/theme-switcher/ThemeContext.jsx +++ /dev/null @@ -1,8 +0,0 @@ -import { createContext } from 'react'; - -export const THEME_DEFAULT_VALUE = 'light'; - -const ThemeContext = createContext(THEME_DEFAULT_VALUE); // standard theme is light; -// ThemeContext wird durch createContext() zu einem JSX-Element - -export default ThemeContext; diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/examples/theme-switcher/ThemeProvider.jsx b/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/examples/theme-switcher/ThemeProvider.jsx deleted file mode 100644 index f21ff57..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/examples/theme-switcher/ThemeProvider.jsx +++ /dev/null @@ -1,26 +0,0 @@ -import { useState } from 'react'; -import ThemeContext, { THEME_DEFAULT_VALUE } from './ThemeContext'; - -const ThemeProvider = (props) => { - const { children } = props; - - console.log(ThemeContext._currentValue); // 'light' <- _currentValue beinhaltet initialWert. Soll aber in production Umgebung nicht verwendet werden, da kein offizieller Standard. - - const [theme, setTheme] = useState(THEME_DEFAULT_VALUE); - - // EventHandler ============== - const handleToggleTheme = () => { - console.log('click'); - setTheme((prevState) => (prevState === 'light' ? 'dark' : 'light')); - }; - - return ( - - - {children} - - ); -}; -export default ThemeProvider; diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/footers/FooterMain.jsx b/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/footers/FooterMain.jsx deleted file mode 100644 index 6c746be..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/footers/FooterMain.jsx +++ /dev/null @@ -1,38 +0,0 @@ -const FooterMain = (props) => { - // const { } = props; - - return ( -
      -
      -
      -
      -
      -

      Address

      -
      -
      -
      -
      -

      Links

      - -
      -
      -
      -
      -

      Socials

      -
      -
      -
      -
      -
      - ); -}; -export default FooterMain; diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/forms/FormNewsletter.jsx b/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/forms/FormNewsletter.jsx deleted file mode 100644 index 04e039d..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/forms/FormNewsletter.jsx +++ /dev/null @@ -1,29 +0,0 @@ -const FormNewsletter = (props) => { - // const { } = props; - - // EventHandlers ========= - const handleSubmit = (e) => { - e.preventDefault(); - console.log('Form data submit over Fetch/Xhr'); - }; - - return ( -
      -
      -
      -
      - -
      -
      -
      -
      - -
      -
      -
      -
      - ); -}; -export default FormNewsletter; diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/headers/HeaderMain.jsx b/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/headers/HeaderMain.jsx deleted file mode 100644 index cacc690..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/headers/HeaderMain.jsx +++ /dev/null @@ -1,14 +0,0 @@ -import LogoMain from '../logos/LogoMain'; - -const HeaderMain = (props) => { - // const { } = props; - - return ( -
      -
      - -
      -
      - ); // VIEW -}; -export default HeaderMain; diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/icons/LogoDonkey.jsx b/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/icons/LogoDonkey.jsx deleted file mode 100644 index 958a172..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/icons/LogoDonkey.jsx +++ /dev/null @@ -1,80 +0,0 @@ -import React from 'react'; - -const LogoDonkey = (props) => { - // const { } = props; - - return ( - - - - - - - - - - - - - - - ); -}; -export default LogoDonkey; diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/inputs/InputAmount.jsx b/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/inputs/InputAmount.jsx deleted file mode 100644 index 516b77a..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/inputs/InputAmount.jsx +++ /dev/null @@ -1,37 +0,0 @@ -import { FaMinus, FaPlus } from 'react-icons/fa6'; -// npm install react-icons | Auf der npm Seite mit --save, ist nicht mehr nötig -const InputAmount = (props) => { - // const { } = props; - - // EventHandlers ================ - const handleChange = (e) => { - console.log(e); // Event-Objekte wurden um React Methoden und Eigenschaften erweitert. (SyntheticBaseEvent anstatt InputEvent) - console.log(e.target.value); - }; - - return ( -
      -
      - - - - - - - -
      -
      - ); -}; -export default InputAmount; diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/jokes/ChuckNorrisJokes.jsx b/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/jokes/ChuckNorrisJokes.jsx deleted file mode 100644 index 84d04ca..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/jokes/ChuckNorrisJokes.jsx +++ /dev/null @@ -1,42 +0,0 @@ -import { useEffect, useState } from 'react'; - -const ChuckNorrisJokes = (props) => { - // const { } = props; - - const [joke, setJoke] = useState(''); - const getJoke = async () => { - await fetch('https://api.chucknorris.io/jokes/random') - .then((res) => res.json()) - .then((data) => { - setJoke(data.value); - console.log('1'); - }) - .catch((err) => { - console.log(err); - }); - }; - - useEffect(() => { - getJoke(); - - return () => { - // controller.abort(); - }; - }, []); - - // Event-Handler =========== - const onClickJoke = () => { - getJoke(); - }; - - return ( -
      -
      {joke}
      - -
      - ); -}; - -export default ChuckNorrisJokes; diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/jokes/ChuckNorrisJokesAdvanced.jsx b/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/jokes/ChuckNorrisJokesAdvanced.jsx deleted file mode 100644 index f670f61..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/jokes/ChuckNorrisJokesAdvanced.jsx +++ /dev/null @@ -1,58 +0,0 @@ -import { useEffect, useState } from 'react'; - -const ChuckNorrisJokes = (props) => { - // const { } = props; - - const [joke, setJoke] = useState(''); - - const getJoke = async (signal) => { - await fetch('https://api.chucknorris.io/jokes/random', { - signal, - }) - .then((res) => { - if (!res.ok) { - throw new Error('HTTP-Response error'); - } - return res.json(); - }) - .then((data) => { - setJoke(data.value); - console.log('1'); - }) - .catch((err) => { - if (err.name === 'AbortError') { - console.warn('Fetch wurde abgebrochen'); - } else if (err instanceof Error) { - console.error('Error', err.message); - } - }); - }; - - useEffect(() => { - const controller = new AbortController(); - - getJoke(controller.signal); - - return () => { - controller.abort(); - }; - }, []); - - // Event-Handler =========== - - // hier wird signal nicht abgebrochen, da kein Abbruch erwünscht - const onClickJoke = () => { - getJoke(); - }; - - return ( -
      -
      {joke}
      - -
      - ); -}; - -export default ChuckNorrisJokes; diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/lists/ListTodo.jsx b/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/lists/ListTodo.jsx deleted file mode 100644 index 07b526c..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/lists/ListTodo.jsx +++ /dev/null @@ -1,66 +0,0 @@ -import { useEffect, useState } from 'react'; - -const ListTodo = (props) => { - // const { } = props; - - const [todos, setTodos] = useState([]); - const [isLoading, setIsLoading] = useState(false); - const [error, setError] = useState(null); - - useEffect(() => { - // AbortController instanziieren (seit 2019) - const controller = new AbortController(); - - setIsLoading(true); - setError(null); - - fetch('https://dummyjson.com/todos/random/6', { - signal: controller.signal, // signal mitsenden - }) - .then((res) => { - if (!res.ok) { - throw new Error('Http-Request went wrong'); - } - return res.json(); - }) - .then((data) => { - setTodos(data); - }) - .catch((err) => { - console.error(err); - if (err.name === 'AbortError') { - console.error('Fetch wurde abgebrochen'); - } else if (err instanceof Error) { - console.error(err.message); - setError(err); - } - }) - .finally(() => { - if (!controller.signal.aborted) { - setIsLoading(false); - } - }); - - return () => { - // unmount - controller.abort(); // The abort() method of the AbortController interface aborts an asynchronous operation before it has completed. - }; - }, []); - - return ( - <> - {!isLoading && ( -
        - {todos.length > 0 && - todos.map(({ id, todo, completed, userId }, idx) => ( -
      • - {todo} -
      • - ))} -
      - )} - {error &&
      {error?.message}
      } - - ); -}; -export default ListTodo; diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/lists/ListUser.jsx b/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/lists/ListUser.jsx deleted file mode 100644 index 66edae2..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/lists/ListUser.jsx +++ /dev/null @@ -1,69 +0,0 @@ -import axios from 'axios'; -import { useEffect, useState } from 'react'; - -const ListUser = (props) => { - // const { } = props; - const [users, setUsers] = useState([]); - const [isLoading, setIsLoading] = useState(false); - // const [error, setError] = useState(null); - - useEffect(() => { - const controller = new AbortController(); // 2019 - - setIsLoading(true); - - axios - .get('https://dummyjson.com/users?limit=100', { - signal: controller.signal, - }) - .then(({ data }) => { - console.log(data); - setUsers(data?.users); - }) - .catch((err) => { - // - // if (err.name === 'AbortError') {} - if (axios.isCancel(err)) { - console.error('Request abgebrochen:', err.message); - } else { - console.error('Error:', err); - } - }) - .finally(() => { - // Nur wenn die Komponente nicht abgebrochen/unmounted wurde, - // den Lade-Zustand auf false setzen - if (!controller.signal.aborted) { - setIsLoading(false); - } - }); - - return () => { - // umount - controller.abort(); - }; - }, []); - - if (isLoading) { - return

      is loading users...

      ; - } - - return ( -
        - {users.length > 0 && - users.map(({ id, firstName, lastName, age, email }, idx) => ( -
      • -

        - Name: - {firstName} {lastName} -
        - age: {age} -
        - email: {email} -
        -

        -
      • - ))} -
      - ); -}; -export default ListUser; diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/logos/LogoMain.jsx b/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/logos/LogoMain.jsx deleted file mode 100644 index d74f500..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/components/logos/LogoMain.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import LogoDonkey from '../icons/LogoDonkey'; - -const LogoMain = (props) => { - // const { } = props; - - return ( -
      - -
      IA - JS Course
      -
      - ); -}; -export default LogoMain; diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/main.jsx b/05_react/unterricht/tag44/01_react-api-with-hooks/src/main.jsx deleted file mode 100644 index 4f28fd8..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/main.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; - -// import von 'main'-Datei -import './styles/main.scss'; - -import App from './App.jsx'; - -createRoot(document.getElementById('root')).render( - - - , -); diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/_index.scss b/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/_index.scss deleted file mode 100644 index dcefbc9..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/_index.scss +++ /dev/null @@ -1,3 +0,0 @@ -// @import 'bootstrap-5.3.8/bootstrap-grid'; -@import 'bootstrap-5.3.8/bootstrap'; -// @import 'bulma-1.04/index' diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss b/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss deleted file mode 100644 index e9f267f..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss +++ /dev/null @@ -1,153 +0,0 @@ -// -// Base styles -// - -.accordion { - // scss-docs-start accordion-css-vars - --#{$prefix}accordion-color: #{$accordion-color}; - --#{$prefix}accordion-bg: #{$accordion-bg}; - --#{$prefix}accordion-transition: #{$accordion-transition}; - --#{$prefix}accordion-border-color: #{$accordion-border-color}; - --#{$prefix}accordion-border-width: #{$accordion-border-width}; - --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; - --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; - --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; - --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; - --#{$prefix}accordion-btn-color: #{$accordion-button-color}; - --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; - --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; - --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; - --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; - --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; - --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; - --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; - --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; - --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; - // scss-docs-end accordion-css-vars -} - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); - @include font-size($font-size-base); - color: var(--#{$prefix}accordion-btn-color); - text-align: left; // Reset button style - background-color: var(--#{$prefix}accordion-btn-bg); - border: 0; - @include border-radius(0); - overflow-anchor: none; - @include transition(var(--#{$prefix}accordion-transition)); - - &:not(.collapsed) { - color: var(--#{$prefix}accordion-active-color); - background-color: var(--#{$prefix}accordion-active-bg); - box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list - - &::after { - background-image: var(--#{$prefix}accordion-btn-active-icon); - transform: var(--#{$prefix}accordion-btn-icon-transform); - } - } - - // Accordion icon - &::after { - flex-shrink: 0; - width: var(--#{$prefix}accordion-btn-icon-width); - height: var(--#{$prefix}accordion-btn-icon-width); - margin-left: auto; - content: ""; - background-image: var(--#{$prefix}accordion-btn-icon); - background-repeat: no-repeat; - background-size: var(--#{$prefix}accordion-btn-icon-width); - @include transition(var(--#{$prefix}accordion-btn-icon-transition)); - } - - &:hover { - z-index: 2; - } - - &:focus { - z-index: 3; - outline: 0; - box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); - } -} - -.accordion-header { - margin-bottom: 0; -} - -.accordion-item { - color: var(--#{$prefix}accordion-color); - background-color: var(--#{$prefix}accordion-bg); - border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); - - &:first-of-type { - @include border-top-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - &:not(:first-of-type) { - border-top: 0; - } - - // Only set a border-radius on the last item if the accordion is collapsed - &:last-of-type { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - &.collapsed { - @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - > .accordion-collapse { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - } - } -} - -.accordion-body { - padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); -} - - -// Flush accordion items -// -// Remove borders and border-radius to keep accordion items edge-to-edge. - -.accordion-flush { - > .accordion-item { - border-right: 0; - border-left: 0; - @include border-radius(0); - - &:first-child { border-top: 0; } - &:last-child { border-bottom: 0; } - - // stylelint-disable selector-max-class - > .accordion-collapse, - > .accordion-header .accordion-button, - > .accordion-header .accordion-button.collapsed { - @include border-radius(0); - } - // stylelint-enable selector-max-class - } -} - -@if $enable-dark-mode { - @include color-mode(dark) { - .accordion-button::after { - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; - } - } -} diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss b/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss deleted file mode 100644 index b8cff9b..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss +++ /dev/null @@ -1,68 +0,0 @@ -// -// Base styles -// - -.alert { - // scss-docs-start alert-css-vars - --#{$prefix}alert-bg: transparent; - --#{$prefix}alert-padding-x: #{$alert-padding-x}; - --#{$prefix}alert-padding-y: #{$alert-padding-y}; - --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; - --#{$prefix}alert-color: inherit; - --#{$prefix}alert-border-color: transparent; - --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); - --#{$prefix}alert-border-radius: #{$alert-border-radius}; - --#{$prefix}alert-link-color: inherit; - // scss-docs-end alert-css-vars - - position: relative; - padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); - margin-bottom: var(--#{$prefix}alert-margin-bottom); - color: var(--#{$prefix}alert-color); - background-color: var(--#{$prefix}alert-bg); - border: var(--#{$prefix}alert-border); - @include border-radius(var(--#{$prefix}alert-border-radius)); -} - -// Headings for larger alerts -.alert-heading { - // Specified to prevent conflicts of changing $headings-color - color: inherit; -} - -// Provide class for links that match alerts -.alert-link { - font-weight: $alert-link-font-weight; - color: var(--#{$prefix}alert-link-color); -} - - -// Dismissible alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissible { - padding-right: $alert-dismissible-padding-r; - - // Adjust close link position - .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: $stretched-link-z-index + 1; - padding: $alert-padding-y * 1.25 $alert-padding-x; - } -} - - -// scss-docs-start alert-modifiers -// Generate contextual modifier classes for colorizing the alert -@each $state in map-keys($theme-colors) { - .alert-#{$state} { - --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); - --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); - --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); - --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); - } -} -// scss-docs-end alert-modifiers diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss b/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss deleted file mode 100644 index cc3d269..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss +++ /dev/null @@ -1,38 +0,0 @@ -// Base class -// -// Requires one of the contextual, color modifier classes for `color` and -// `background-color`. - -.badge { - // scss-docs-start badge-css-vars - --#{$prefix}badge-padding-x: #{$badge-padding-x}; - --#{$prefix}badge-padding-y: #{$badge-padding-y}; - @include rfs($badge-font-size, --#{$prefix}badge-font-size); - --#{$prefix}badge-font-weight: #{$badge-font-weight}; - --#{$prefix}badge-color: #{$badge-color}; - --#{$prefix}badge-border-radius: #{$badge-border-radius}; - // scss-docs-end badge-css-vars - - display: inline-block; - padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x); - @include font-size(var(--#{$prefix}badge-font-size)); - font-weight: var(--#{$prefix}badge-font-weight); - line-height: 1; - color: var(--#{$prefix}badge-color); - text-align: center; - white-space: nowrap; - vertical-align: baseline; - @include border-radius(var(--#{$prefix}badge-border-radius)); - @include gradient-bg(); - - // Empty badges collapse automatically - &:empty { - display: none; - } -} - -// Quick fix for badges in buttons -.btn .badge { - position: relative; - top: -1px; -} diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss b/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss deleted file mode 100644 index b8252ff..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss +++ /dev/null @@ -1,40 +0,0 @@ -.breadcrumb { - // scss-docs-start breadcrumb-css-vars - --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x}; - --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y}; - --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom}; - @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size); - --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg}; - --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius}; - --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color}; - --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x}; - --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color}; - // scss-docs-end breadcrumb-css-vars - - display: flex; - flex-wrap: wrap; - padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x); - margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom); - @include font-size(var(--#{$prefix}breadcrumb-font-size)); - list-style: none; - background-color: var(--#{$prefix}breadcrumb-bg); - @include border-radius(var(--#{$prefix}breadcrumb-border-radius)); -} - -.breadcrumb-item { - // The separator between breadcrumbs (by default, a forward-slash: "/") - + .breadcrumb-item { - padding-left: var(--#{$prefix}breadcrumb-item-padding-x); - - &::before { - float: left; // Suppress inline spacings and underlining of the separator - padding-right: var(--#{$prefix}breadcrumb-item-padding-x); - color: var(--#{$prefix}breadcrumb-divider-color); - content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; - } - } - - &.active { - color: var(--#{$prefix}breadcrumb-item-active-color); - } -} diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss b/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss deleted file mode 100644 index 78e1252..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss +++ /dev/null @@ -1,147 +0,0 @@ -// Make the div behave like a button -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; // match .btn alignment given font-size hack above - - > .btn { - position: relative; - flex: 1 1 auto; - } - - // Bring the hover, focused, and "active" buttons to the front to overlay - // the borders properly - > .btn-check:checked + .btn, - > .btn-check:focus + .btn, - > .btn:hover, - > .btn:focus, - > .btn:active, - > .btn.active { - z-index: 1; - } -} - -// Optional: Group multiple button groups together for a toolbar -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; - - .input-group { - width: auto; - } -} - -.btn-group { - @include border-radius($btn-border-radius); - - // Prevent double borders when buttons are next to each other - > :not(.btn-check:first-child) + .btn, - > .btn-group:not(:first-child) { - margin-left: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn.dropdown-toggle-split:first-child, - > .btn-group:not(:last-child) > .btn { - @include border-end-radius(0); - } - - // The left radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-start-radius(0); - } -} - -// Sizing -// -// Remix the default button sizing classes into new ones for easier manipulation. - -.btn-group-sm > .btn { @extend .btn-sm; } -.btn-group-lg > .btn { @extend .btn-lg; } - - -// -// Split button dropdowns -// - -.dropdown-toggle-split { - padding-right: $btn-padding-x * .75; - padding-left: $btn-padding-x * .75; - - &::after, - .dropup &::after, - .dropend &::after { - margin-left: 0; - } - - .dropstart &::before { - margin-right: 0; - } -} - -.btn-sm + .dropdown-toggle-split { - padding-right: $btn-padding-x-sm * .75; - padding-left: $btn-padding-x-sm * .75; -} - -.btn-lg + .dropdown-toggle-split { - padding-right: $btn-padding-x-lg * .75; - padding-left: $btn-padding-x-lg * .75; -} - - -// The clickable button for toggling the menu -// Set the same inset shadow as the :active state -.btn-group.show .dropdown-toggle { - @include box-shadow($btn-active-box-shadow); - - // Show no shadow for `.btn-link` since it has no other button styles. - &.btn-link { - @include box-shadow(none); - } -} - - -// -// Vertical button groups -// - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; - - > .btn, - > .btn-group { - width: 100%; - } - - > .btn:not(:first-child), - > .btn-group:not(:first-child) { - margin-top: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn-group:not(:last-child) > .btn { - @include border-bottom-radius(0); - } - - // The top radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-top-radius(0); - } -} diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss b/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss deleted file mode 100644 index caa4518..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss +++ /dev/null @@ -1,216 +0,0 @@ -// -// Base styles -// - -.btn { - // scss-docs-start btn-css-vars - --#{$prefix}btn-padding-x: #{$btn-padding-x}; - --#{$prefix}btn-padding-y: #{$btn-padding-y}; - --#{$prefix}btn-font-family: #{$btn-font-family}; - @include rfs($btn-font-size, --#{$prefix}btn-font-size); - --#{$prefix}btn-font-weight: #{$btn-font-weight}; - --#{$prefix}btn-line-height: #{$btn-line-height}; - --#{$prefix}btn-color: #{$btn-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-width: #{$btn-border-width}; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-border-radius: #{$btn-border-radius}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-box-shadow: #{$btn-box-shadow}; - --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity}; - --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5); - // scss-docs-end btn-css-vars - - display: inline-block; - padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x); - font-family: var(--#{$prefix}btn-font-family); - @include font-size(var(--#{$prefix}btn-font-size)); - font-weight: var(--#{$prefix}btn-font-weight); - line-height: var(--#{$prefix}btn-line-height); - color: var(--#{$prefix}btn-color); - text-align: center; - text-decoration: if($link-decoration == none, null, none); - white-space: $btn-white-space; - vertical-align: middle; - cursor: if($enable-button-pointers, pointer, null); - user-select: none; - border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color); - @include border-radius(var(--#{$prefix}btn-border-radius)); - @include gradient-bg(var(--#{$prefix}btn-bg)); - @include box-shadow(var(--#{$prefix}btn-box-shadow)); - @include transition($btn-transition); - - &:hover { - color: var(--#{$prefix}btn-hover-color); - text-decoration: if($link-hover-decoration == underline, none, null); - background-color: var(--#{$prefix}btn-hover-bg); - border-color: var(--#{$prefix}btn-hover-border-color); - } - - .btn-check + &:hover { - // override for the checkbox/radio buttons - color: var(--#{$prefix}btn-color); - background-color: var(--#{$prefix}btn-bg); - border-color: var(--#{$prefix}btn-border-color); - } - - &:focus-visible { - color: var(--#{$prefix}btn-hover-color); - @include gradient-bg(var(--#{$prefix}btn-hover-bg)); - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:focus-visible + & { - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:checked + &, - :not(.btn-check) + &:active, - &:first-child:active, - &.active, - &.show { - color: var(--#{$prefix}btn-active-color); - background-color: var(--#{$prefix}btn-active-bg); - // Remove CSS gradients if they're enabled - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-active-border-color); - @include box-shadow(var(--#{$prefix}btn-active-shadow)); - - &:focus-visible { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - } - - .btn-check:checked:focus-visible + & { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - &:disabled, - &.disabled, - fieldset:disabled & { - color: var(--#{$prefix}btn-disabled-color); - pointer-events: none; - background-color: var(--#{$prefix}btn-disabled-bg); - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-disabled-border-color); - opacity: var(--#{$prefix}btn-disabled-opacity); - @include box-shadow(none); - } -} - - -// -// Alternate buttons -// - -// scss-docs-start btn-variant-loops -@each $color, $value in $theme-colors { - .btn-#{$color} { - @if $color == "light" { - @include button-variant( - $value, - $value, - $hover-background: shade-color($value, $btn-hover-bg-shade-amount), - $hover-border: shade-color($value, $btn-hover-border-shade-amount), - $active-background: shade-color($value, $btn-active-bg-shade-amount), - $active-border: shade-color($value, $btn-active-border-shade-amount) - ); - } @else if $color == "dark" { - @include button-variant( - $value, - $value, - $hover-background: tint-color($value, $btn-hover-bg-tint-amount), - $hover-border: tint-color($value, $btn-hover-border-tint-amount), - $active-background: tint-color($value, $btn-active-bg-tint-amount), - $active-border: tint-color($value, $btn-active-border-tint-amount) - ); - } @else { - @include button-variant($value, $value); - } - } -} - -@each $color, $value in $theme-colors { - .btn-outline-#{$color} { - @include button-outline-variant($value); - } -} -// scss-docs-end btn-variant-loops - - -// -// Link buttons -// - -// Make a button look and behave like a link -.btn-link { - --#{$prefix}btn-font-weight: #{$font-weight-normal}; - --#{$prefix}btn-color: #{$btn-link-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-hover-color: #{$btn-link-hover-color}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-active-color: #{$btn-link-hover-color}; - --#{$prefix}btn-active-border-color: transparent; - --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color}; - --#{$prefix}btn-disabled-border-color: transparent; - --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows - --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb}; - - text-decoration: $link-decoration; - @if $enable-gradients { - background-image: none; - } - - &:hover, - &:focus-visible { - text-decoration: $link-hover-decoration; - } - - &:focus-visible { - color: var(--#{$prefix}btn-color); - } - - &:hover { - color: var(--#{$prefix}btn-hover-color); - } - - // No need for an active state here -} - - -// -// Button Sizes -// - -.btn-lg { - @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); -} - -.btn-sm { - @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); -} diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss b/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss deleted file mode 100644 index dcebe6a..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss +++ /dev/null @@ -1,238 +0,0 @@ -// -// Base styles -// - -.card { - // scss-docs-start card-css-vars - --#{$prefix}card-spacer-y: #{$card-spacer-y}; - --#{$prefix}card-spacer-x: #{$card-spacer-x}; - --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y}; - --#{$prefix}card-title-color: #{$card-title-color}; - --#{$prefix}card-subtitle-color: #{$card-subtitle-color}; - --#{$prefix}card-border-width: #{$card-border-width}; - --#{$prefix}card-border-color: #{$card-border-color}; - --#{$prefix}card-border-radius: #{$card-border-radius}; - --#{$prefix}card-box-shadow: #{$card-box-shadow}; - --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius}; - --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y}; - --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x}; - --#{$prefix}card-cap-bg: #{$card-cap-bg}; - --#{$prefix}card-cap-color: #{$card-cap-color}; - --#{$prefix}card-height: #{$card-height}; - --#{$prefix}card-color: #{$card-color}; - --#{$prefix}card-bg: #{$card-bg}; - --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding}; - --#{$prefix}card-group-margin: #{$card-group-margin}; - // scss-docs-end card-css-vars - - position: relative; - display: flex; - flex-direction: column; - min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 - height: var(--#{$prefix}card-height); - color: var(--#{$prefix}body-color); - word-wrap: break-word; - background-color: var(--#{$prefix}card-bg); - background-clip: border-box; - border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - @include border-radius(var(--#{$prefix}card-border-radius)); - @include box-shadow(var(--#{$prefix}card-box-shadow)); - - > hr { - margin-right: 0; - margin-left: 0; - } - - > .list-group { - border-top: inherit; - border-bottom: inherit; - - &:first-child { - border-top-width: 0; - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); - } - - &:last-child { - border-bottom-width: 0; - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); - } - } - - // Due to specificity of the above selector (`.card > .list-group`), we must - // use a child selector here to prevent double borders. - > .card-header + .list-group, - > .list-group + .card-footer { - border-top: 0; - } -} - -.card-body { - // Enable `flex-grow: 1` for decks and groups so that card blocks take up - // as much space as possible, ensuring footers are aligned to the bottom. - flex: 1 1 auto; - padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x); - color: var(--#{$prefix}card-color); -} - -.card-title { - margin-bottom: var(--#{$prefix}card-title-spacer-y); - color: var(--#{$prefix}card-title-color); -} - -.card-subtitle { - margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list - margin-bottom: 0; - color: var(--#{$prefix}card-subtitle-color); -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link { - &:hover { - text-decoration: if($link-hover-decoration == underline, none, null); - } - - + .card-link { - margin-left: var(--#{$prefix}card-spacer-x); - } -} - -// -// Optional textual caps -// - -.card-header { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - margin-bottom: 0; // Removes the default margin-bottom of - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:first-child { - @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0); - } -} - -.card-footer { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:last-child { - @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius)); - } -} - - -// -// Header navs -// - -.card-header-tabs { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - border-bottom: 0; - - .nav-link.active { - background-color: var(--#{$prefix}card-bg); - border-bottom-color: var(--#{$prefix}card-bg); - } -} - -.card-header-pills { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list -} - -// Card image -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: var(--#{$prefix}card-img-overlay-padding); - @include border-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch -} - -.card-img, -.card-img-top { - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-bottom { - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); -} - - -// -// Card groups -// - -.card-group { - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - margin-bottom: var(--#{$prefix}card-group-margin); - } - - @include media-breakpoint-up(sm) { - display: flex; - flex-flow: row wrap; - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - flex: 1 0 0; - margin-bottom: 0; - - + .card { - margin-left: 0; - border-left: 0; - } - - // Handle rounded corners - @if $enable-rounded { - &:not(:last-child) { - @include border-end-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-right-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-right-radius: 0; - } - } - - &:not(:first-child) { - @include border-start-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-left-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-left-radius: 0; - } - } - } - } - } -} diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss b/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss deleted file mode 100644 index 5ebf6b1..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss +++ /dev/null @@ -1,226 +0,0 @@ -// Notes on the classes: -// -// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) -// even when their scroll action started on a carousel, but for compatibility (with Firefox) -// we're preventing all actions instead -// 2. The .carousel-item-start and .carousel-item-end is used to indicate where -// the active slide is heading. -// 3. .active.carousel-item is the current slide. -// 4. .active.carousel-item-start and .active.carousel-item-end is the current -// slide in its in-transition state. Only one of these occurs at a time. -// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end -// is the upcoming slide in transition. - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; - @include clearfix(); -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - @include transition($carousel-transition); -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); -} - - -// -// Alternate transitions -// - -.carousel-fade { - .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; - } - - .carousel-item.active, - .carousel-item-next.carousel-item-start, - .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; - } - - .active.carousel-item-start, - .active.carousel-item-end { - z-index: 0; - opacity: 0; - @include transition(opacity 0s $carousel-transition-duration); - } -} - - -// -// Left/right controls for nav -// - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - // Use flex for alignment (1-3) - display: flex; // 1. allow flex styles - align-items: center; // 2. vertically center contents - justify-content: center; // 3. horizontally center contents - width: $carousel-control-width; - padding: 0; - color: $carousel-control-color; - text-align: center; - background: none; - filter: var(--#{$prefix}carousel-control-icon-filter); - border: 0; - opacity: $carousel-control-opacity; - @include transition($carousel-control-transition); - - // Hover/focus state - &:hover, - &:focus { - color: $carousel-control-color; - text-decoration: none; - outline: 0; - opacity: $carousel-control-hover-opacity; - } -} -.carousel-control-prev { - left: 0; - background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); -} -.carousel-control-next { - right: 0; - background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); -} - -// Icons for within -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: $carousel-control-icon-width; - height: $carousel-control-icon-width; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; -} - -.carousel-control-prev-icon { - background-image: escape-svg($carousel-control-prev-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-next-icon-bg) + "*/"}; -} -.carousel-control-next-icon { - background-image: escape-svg($carousel-control-next-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-prev-icon-bg) + "*/"}; -} - -// Optional indicator pips/controls -// -// Add a container (such as a list) with the following class and add an item (ideally a focusable control, -// like a button) with data-bs-target for each slide your carousel holds. - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - // Use the .carousel-control's width as margin so we don't overlay those - margin-right: $carousel-control-width; - margin-bottom: 1rem; - margin-left: $carousel-control-width; - - [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: $carousel-indicator-width; - height: $carousel-indicator-height; - padding: 0; - margin-right: $carousel-indicator-spacer; - margin-left: $carousel-indicator-spacer; - text-indent: -999px; - cursor: pointer; - background-color: var(--#{$prefix}carousel-indicator-active-bg); - background-clip: padding-box; - border: 0; - // Use transparent borders to increase the hit area by 10px on top and bottom. - border-top: $carousel-indicator-hit-area-height solid transparent; - border-bottom: $carousel-indicator-hit-area-height solid transparent; - opacity: $carousel-indicator-opacity; - @include transition($carousel-indicator-transition); - } - - .active { - opacity: $carousel-indicator-active-opacity; - } -} - - -// Optional captions -// -// - -.carousel-caption { - position: absolute; - right: (100% - $carousel-caption-width) * .5; - bottom: $carousel-caption-spacer; - left: (100% - $carousel-caption-width) * .5; - padding-top: $carousel-caption-padding-y; - padding-bottom: $carousel-caption-padding-y; - color: var(--#{$prefix}carousel-caption-color); - text-align: center; -} - -// Dark mode carousel - -@mixin carousel-dark() { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg-dark}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color-dark}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter-dark}; -} - -.carousel-dark { - @include carousel-dark(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include carousel-dark(); - } -} diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss b/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss deleted file mode 100644 index d53c96f..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss +++ /dev/null @@ -1,66 +0,0 @@ -// Transparent background and border properties included for button version. -// iOS requires the button element instead of an anchor tag. -// If you want the anchor version, it requires `href="#"`. -// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile - -.btn-close { - // scss-docs-start close-css-vars - --#{$prefix}btn-close-color: #{$btn-close-color}; - --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) }; - --#{$prefix}btn-close-opacity: #{$btn-close-opacity}; - --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity}; - --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow}; - --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity}; - --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity}; - // scss-docs-end close-css-vars - - box-sizing: content-box; - width: $btn-close-width; - height: $btn-close-height; - padding: $btn-close-padding-y $btn-close-padding-x; - color: var(--#{$prefix}btn-close-color); - background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements - filter: var(--#{$prefix}btn-close-filter); - border: 0; // for button elements - @include border-radius(); - opacity: var(--#{$prefix}btn-close-opacity); - - // Override 's hover style - &:hover { - color: var(--#{$prefix}btn-close-color); - text-decoration: none; - opacity: var(--#{$prefix}btn-close-hover-opacity); - } - - &:focus { - outline: 0; - box-shadow: var(--#{$prefix}btn-close-focus-shadow); - opacity: var(--#{$prefix}btn-close-focus-opacity); - } - - &:disabled, - &.disabled { - pointer-events: none; - user-select: none; - opacity: var(--#{$prefix}btn-close-disabled-opacity); - } -} - -@mixin btn-close-white() { - --#{$prefix}btn-close-filter: #{$btn-close-filter-dark}; -} - -.btn-close-white { - @include btn-close-white(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}btn-close-filter: #{$btn-close-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include btn-close-white(); - } -} diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss b/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss deleted file mode 100644 index 83b3138..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss +++ /dev/null @@ -1,41 +0,0 @@ -// Container widths -// -// Set the container width, and override it for fixed navbars in media queries. - -@if $enable-container-classes { - // Single container class with breakpoint max-widths - .container, - // 100% wide container at all breakpoints - .container-fluid { - @include make-container(); - } - - // Responsive containers that are 100% wide until a breakpoint - @each $breakpoint, $container-max-width in $container-max-widths { - .container-#{$breakpoint} { - @extend .container-fluid; - } - - @include media-breakpoint-up($breakpoint, $grid-breakpoints) { - %responsive-container-#{$breakpoint} { - max-width: $container-max-width; - } - - // Extend each breakpoint which is smaller or equal to the current breakpoint - $extend-breakpoint: true; - - @each $name, $width in $grid-breakpoints { - @if ($extend-breakpoint) { - .container#{breakpoint-infix($name, $grid-breakpoints)} { - @extend %responsive-container-#{$breakpoint}; - } - - // Once the current breakpoint is reached, stop extending - @if ($breakpoint == $name) { - $extend-breakpoint: false; - } - } - } - } - } -} diff --git a/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss b/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss deleted file mode 100644 index 587ebb4..0000000 --- a/05_react/unterricht/tag44/01_react-api-with-hooks/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss +++ /dev/null @@ -1,250 +0,0 @@ -// The dropdown wrapper (`
      `) -.dropup, -.dropend, -.dropdown, -.dropstart, -.dropup-center, -.dropdown-center { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; - - // Generate the caret automatically - @include caret(); -} - -// The dropdown menu -.dropdown-menu { - // scss-docs-start dropdown-css-vars - --#{$prefix}dropdown-zindex: #{$zindex-dropdown}; - --#{$prefix}dropdown-min-width: #{$dropdown-min-width}; - --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x}; - --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y}; - --#{$prefix}dropdown-spacer: #{$dropdown-spacer}; - @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size); - --#{$prefix}dropdown-color: #{$dropdown-color}; - --#{$prefix}dropdown-bg: #{$dropdown-bg}; - --#{$prefix}dropdown-border-color: #{$dropdown-border-color}; - --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius}; - --#{$prefix}dropdown-border-width: #{$dropdown-border-width}; - --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius}; - --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg}; - --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y}; - --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow}; - --#{$prefix}dropdown-link-color: #{$dropdown-link-color}; - --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color}; - --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg}; - --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color}; - --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg}; - --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color}; - --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x}; - --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y}; - --#{$prefix}dropdown-header-color: #{$dropdown-header-color}; - --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x}; - --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y}; - // scss-docs-end dropdown-css-vars - - position: absolute; - z-index: var(--#{$prefix}dropdown-zindex); - display: none; // none by default, but block on "open" of the menu - min-width: var(--#{$prefix}dropdown-min-width); - padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x); - margin: 0; // Override default margin of ul - @include font-size(var(--#{$prefix}dropdown-font-size)); - color: var(--#{$prefix}dropdown-color); - text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) - list-style: none; - background-color: var(--#{$prefix}dropdown-bg); - background-clip: padding-box; - border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color); - @include border-radius(var(--#{$prefix}dropdown-border-radius)); - @include box-shadow(var(--#{$prefix}dropdown-box-shadow)); - - &[data-bs-popper] { - top: 100%; - left: 0; - margin-top: var(--#{$prefix}dropdown-spacer); - } - - @if $dropdown-padding-y == 0 { - > .dropdown-item:first-child, - > li:first-child .dropdown-item { - @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - > .dropdown-item:last-child, - > li:last-child .dropdown-item { - @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - - } -} - -// scss-docs-start responsive-breakpoints -// We deliberately hardcode the `bs-` prefix because we check -// this custom property in JS to determine Popper's positioning - -@each $breakpoint in map-keys($grid-breakpoints) { - @include media-breakpoint-up($breakpoint) { - $infix: breakpoint-infix($breakpoint, $grid-breakpoints); - - .dropdown-menu#{$infix}-start { - --bs-position: start; - - &[data-bs-popper] { - right: auto; - left: 0; - } - } - - .dropdown-menu#{$infix}-end { - --bs-position: end; - - &[data-bs-popper] { - right: 0; - left: auto; - } - } - } -} -// scss-docs-end responsive-breakpoints - -// Allow for dropdowns to go bottom up (aka, dropup-menu) -// Just add .dropup after the standard .dropdown class and you're set. -.dropup { - .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(up); - } -} - -.dropend { - .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(end); - &::after { - vertical-align: 0; - } - } -} - -.dropstart { - .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(start); - &::before { - vertical-align: 0; - } - } -} - - -// Dividers (basically an `
      `) within the dropdown -.dropdown-divider { - height: 0; - margin: var(--#{$prefix}dropdown-divider-margin-y) 0; - overflow: hidden; - border-top: 1px solid var(--#{$prefix}dropdown-divider-bg); - opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
      element -} - -// Links, buttons, and more within the dropdown menu -// -// `
      ` alignment by inheriting `text-align`. -// 3. Fix alignment for Safari - -th { - font-weight: $table-th-font-weight; // 1 - text-align: inherit; // 2 - text-align: -webkit-match-parent; // 3 -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - - -// Forms -// -// 1. Allow labels to use `margin` for spacing. - -label { - display: inline-block; // 1 -} - -// Remove the default `border-radius` that macOS Chrome adds. -// See https://github.com/twbs/bootstrap/issues/24093 - -button { - // stylelint-disable-next-line property-disallowed-list - border-radius: 0; -} - -// Explicitly remove focus outline in Chromium when it shouldn't be -// visible (e.g. as result of mouse click or touch tap). It already -// should be doing this automatically, but seems to currently be -// confused and applies its very visible two-tone outline anyway. - -button:focus:not(:focus-visible) { - outline: 0; -} - -// 1. Remove the margin in Firefox and Safari - -input, -button, -select, -optgroup, -textarea { - margin: 0; // 1 - font-family: inherit; - @include font-size(inherit); - line-height: inherit; -} - -// Remove the inheritance of text transform in Firefox -button, -select { - text-transform: none; -} -// Set the cursor for non-` - ); -}; -export default Button; diff --git a/05_react/unterricht/tag44/02_react-app-with-tests/src/components/examples/ExampleComponent.jsx b/05_react/unterricht/tag44/02_react-app-with-tests/src/components/examples/ExampleComponent.jsx deleted file mode 100644 index 0b326c7..0000000 --- a/05_react/unterricht/tag44/02_react-app-with-tests/src/components/examples/ExampleComponent.jsx +++ /dev/null @@ -1,10 +0,0 @@ -const ExampleComponent = (props) => { - // const { } = props; - - return ( - <> -

      Hello World!

      - - ); -}; -export default ExampleComponent; diff --git a/05_react/unterricht/tag44/02_react-app-with-tests/src/components/examples/__test__/ExampleComponent.test.jsx b/05_react/unterricht/tag44/02_react-app-with-tests/src/components/examples/__test__/ExampleComponent.test.jsx deleted file mode 100644 index e674772..0000000 --- a/05_react/unterricht/tag44/02_react-app-with-tests/src/components/examples/__test__/ExampleComponent.test.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import { render, screen } from '@testing-library/react'; -import ExampleComponent from '../ExampleComponent'; - -// import nicht notwendig ( Findet automatisch durch globale Setting statt) -// import { test, expect } from 'vitest'; - -// Test Case -test('Components renders correctly and contains text "Hello World"', () => { - // AAA - // Arrange, Acting, Assert - render(); - - const element = screen.getByText(/Hello World/i); - - expect(element).toBeInTheDocument(); -}); - -// console.log(document.querySelector('p').textContent.includes('Hello World')); // => true diff --git a/05_react/unterricht/tag44/02_react-app-with-tests/src/main.jsx b/05_react/unterricht/tag44/02_react-app-with-tests/src/main.jsx deleted file mode 100644 index 4233564..0000000 --- a/05_react/unterricht/tag44/02_react-app-with-tests/src/main.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; - -import 'bootstrap'; // import von JS -import 'bootstrap/dist/css/bootstrap.min.css'; // CSS import - -import App from './App.jsx'; - -createRoot(document.getElementById('root')).render( - - - , -); diff --git a/05_react/unterricht/tag44/02_react-app-with-tests/src/test/Button.test.jsx b/05_react/unterricht/tag44/02_react-app-with-tests/src/test/Button.test.jsx deleted file mode 100644 index 485aeaa..0000000 --- a/05_react/unterricht/tag44/02_react-app-with-tests/src/test/Button.test.jsx +++ /dev/null @@ -1,19 +0,0 @@ -import { render, screen, fireEvent } from '@testing-library/react'; -import Button from '../components/buttons/Button'; -import userEvent from '@testing-library/user-event'; - -import { expect, test } from 'vitest'; // Muss nicht eingebunden werden. Einbindung findet automatisch statt, allerdings haben wir dann keine Autocomplete Funktion - -// Test Case -test('Button is clickable and changes text on click to "Clicked"', async () => { - render( - ); -}; -export default Button; diff --git a/05_react/unterricht/tag45/01_react-app-with-tests-andi/src/components/examples/ExampleComponent.jsx b/05_react/unterricht/tag45/01_react-app-with-tests-andi/src/components/examples/ExampleComponent.jsx deleted file mode 100644 index 9886557..0000000 --- a/05_react/unterricht/tag45/01_react-app-with-tests-andi/src/components/examples/ExampleComponent.jsx +++ /dev/null @@ -1,10 +0,0 @@ -const ExampleComponent = (props) => { - // const { } = props; - - return ( - <> -

      Hello World!

      - - ); -}; -export default ExampleComponent; diff --git a/05_react/unterricht/tag45/01_react-app-with-tests-andi/src/components/examples/__test__/ExampleComponent.test.jsx b/05_react/unterricht/tag45/01_react-app-with-tests-andi/src/components/examples/__test__/ExampleComponent.test.jsx deleted file mode 100644 index 032f5e7..0000000 --- a/05_react/unterricht/tag45/01_react-app-with-tests-andi/src/components/examples/__test__/ExampleComponent.test.jsx +++ /dev/null @@ -1,16 +0,0 @@ -import { render, screen } from '@testing-library/react'; -import ExampleComponent from '../ExampleComponent'; - -// import nicht notwendig ( Findet automatisch durch globale Setting statt ) -// import { test, expect } from 'vitest'; - -// Test Case -test('Components renders correctly and contains text "Hello World!"', () => { - // AAA - // Arrange, Acting, Assert - render(); - - const element = screen.getByText(/Hello World!/i); - - expect(element).toBeInTheDocument(); -}); diff --git a/05_react/unterricht/tag45/01_react-app-with-tests-andi/src/components/forms/FormContact.jsx b/05_react/unterricht/tag45/01_react-app-with-tests-andi/src/components/forms/FormContact.jsx deleted file mode 100644 index 015c79a..0000000 --- a/05_react/unterricht/tag45/01_react-app-with-tests-andi/src/components/forms/FormContact.jsx +++ /dev/null @@ -1,167 +0,0 @@ -import { useState } from 'react'; -import validate from '../../utils/validators/validate'; - -const FormContact = (props) => { - // const { } = props; - - const [formData, setFormData] = useState({ - firstname: '', // - lastname: '', - email: '', - message: '', - }); - - const [errors, setErrors] = useState({}); - const [successMessage, setSuccessMessage] = useState(''); - - // EventHandlers ======= - const handleSubmit = (e) => { - e.preventDefault(); // Standardverhalten (Versenden vom Formular) unterbinden. - - const form = e.currentTarget; - - const errors = validate(formData); - - if (Object.keys(errors).length === 0) { - console.log('Form Data', formData); - // TODO: send over AJAX/Fetch - setSuccessMessage('Form submitted'); - - form.reset(); - setFormData({ - firstname: '', // - lastname: '', - email: '', - message: '', - }); - setErrors({}); - } else { - console.warn('Form submit error'); - setErrors(errors); - setSuccessMessage(''); - } - }; - - const handleBlur = (e) => { - const { name } = e.target; - const error = validate(formData); - - if (error[name]) { - setErrors({ ...errors, [name]: error[name] }); - } else { - setErrors({ ...errors, [name]: '' }); - } - }; - - const handleChange = (e) => { - const { name, value } = e.target; - - setFormData((state) => ({ ...state, [name]: value })); - - // console.log({ [e.target.name]: e.target.value }); - // console.log('Formdata', formData); - }; - - return ( -
      -
      -
      -
      - - -
      OK
      -
      {errors?.firstname || 'Error'}
      -
      -
      -
      -
      - - -
      OK
      -
      {errors?.lastname}
      -
      -
      -
      - -
      -
      -
      - - -
      OK
      -
      {errors?.email}
      -
      -
      -
      - -
      -
      -
      - - -
      OK
      -
      {errors?.message}
      -
      -
      -
      - -
      -
      -
      - -
      -
      -
      - - {successMessage && ( -
      - {successMessage} -
      - )} -
      - ); -}; -export default FormContact; diff --git a/05_react/unterricht/tag45/01_react-app-with-tests-andi/src/main.jsx b/05_react/unterricht/tag45/01_react-app-with-tests-andi/src/main.jsx deleted file mode 100644 index 4233564..0000000 --- a/05_react/unterricht/tag45/01_react-app-with-tests-andi/src/main.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; - -import 'bootstrap'; // import von JS -import 'bootstrap/dist/css/bootstrap.min.css'; // CSS import - -import App from './App.jsx'; - -createRoot(document.getElementById('root')).render( - - - , -); diff --git a/05_react/unterricht/tag45/01_react-app-with-tests-andi/src/test/Button.test.jsx b/05_react/unterricht/tag45/01_react-app-with-tests-andi/src/test/Button.test.jsx deleted file mode 100644 index 7228768..0000000 --- a/05_react/unterricht/tag45/01_react-app-with-tests-andi/src/test/Button.test.jsx +++ /dev/null @@ -1,19 +0,0 @@ -import { test, expect } from 'vitest'; -import { render, screen, fireEvent } from '@testing-library/react'; - -import Button from '../components/buttons/Button'; -import userEvent from '@testing-library/user-event'; - -test('Button is clickable and changes text on click to "Clicked"', async () => { - render( - ); -}; -export default Button; diff --git a/05_react/unterricht/tag45/01_react-app-with-tests/src/components/examples/ExampleComponent.jsx b/05_react/unterricht/tag45/01_react-app-with-tests/src/components/examples/ExampleComponent.jsx deleted file mode 100644 index 0b326c7..0000000 --- a/05_react/unterricht/tag45/01_react-app-with-tests/src/components/examples/ExampleComponent.jsx +++ /dev/null @@ -1,10 +0,0 @@ -const ExampleComponent = (props) => { - // const { } = props; - - return ( - <> -

      Hello World!

      - - ); -}; -export default ExampleComponent; diff --git a/05_react/unterricht/tag45/01_react-app-with-tests/src/components/examples/__test__/ExampleComponent.test.jsx b/05_react/unterricht/tag45/01_react-app-with-tests/src/components/examples/__test__/ExampleComponent.test.jsx deleted file mode 100644 index e674772..0000000 --- a/05_react/unterricht/tag45/01_react-app-with-tests/src/components/examples/__test__/ExampleComponent.test.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import { render, screen } from '@testing-library/react'; -import ExampleComponent from '../ExampleComponent'; - -// import nicht notwendig ( Findet automatisch durch globale Setting statt) -// import { test, expect } from 'vitest'; - -// Test Case -test('Components renders correctly and contains text "Hello World"', () => { - // AAA - // Arrange, Acting, Assert - render(); - - const element = screen.getByText(/Hello World/i); - - expect(element).toBeInTheDocument(); -}); - -// console.log(document.querySelector('p').textContent.includes('Hello World')); // => true diff --git a/05_react/unterricht/tag45/01_react-app-with-tests/src/components/forms/FormContact.jsx b/05_react/unterricht/tag45/01_react-app-with-tests/src/components/forms/FormContact.jsx deleted file mode 100644 index c805c11..0000000 --- a/05_react/unterricht/tag45/01_react-app-with-tests/src/components/forms/FormContact.jsx +++ /dev/null @@ -1,167 +0,0 @@ -import { useState } from 'react'; -import validate from '../../utils/validators/validate'; - -const FormContact = (props) => { - // const { } = props; - - const [formData, setFormData] = useState({ - firstname: '', // - lastname: '', - email: '', - message: '', - }); - - const [errors, setErrors] = useState({}); - const [successMessage, setSuccessMessage] = useState(''); - - // EventHandlers ======= - const handleSubmit = (e) => { - e.preventDefault(); // Standardverhalten (Versenden vom Formular) unterbinden. - - const form = e.currentTarget; - - const errors = validate(formData); - - if (Object.keys(errors).length === 0) { - console.log('Form Data', formData); - // TODO: send over AJAX/Fetch - setSuccessMessage('Form submitted'); - - form.reset(); - setFormData({ - firstname: '', // - lastname: '', - email: '', - message: '', - }); - setErrors({}); - } else { - console.warn('Form submit error'); - setErrors(errors); - setSuccessMessage(''); - } - }; - - const handleBlur = (e) => { - const { name } = e.target; - const error = validate(formData); - - if (error[name]) { - setErrors({ ...errors, [name]: error[name] }); - } else { - setErrors({ ...errors, [name]: '' }); - } - }; - - const handleChange = (e) => { - const { name, value } = e.target; - - setFormData((state) => ({ ...state, [name]: value })); - - // console.log({ [e.target.name]: e.target.value }); - // console.log('Formdata', formData); - }; - - return ( -
      -
      -
      -
      - - - -
      OK
      -
      {errors?.firstname || 'Error'}
      -
      -
      -
      -
      - - -
      OK
      -
      {errors?.lastname}
      -
      -
      -
      - -
      -
      -
      - - -
      OK
      -
      {errors?.email}
      -
      -
      -
      - -
      -
      -
      - - -
      OK
      -
      {errors?.message}
      -
      -
      -
      - -
      -
      -
      - -
      -
      -
      - - {successMessage && ( -
      - {successMessage} -
      - )} -
      - ); -}; -export default FormContact; diff --git a/05_react/unterricht/tag45/01_react-app-with-tests/src/components/lists/ListTodo.jsx b/05_react/unterricht/tag45/01_react-app-with-tests/src/components/lists/ListTodo.jsx deleted file mode 100644 index 07b526c..0000000 --- a/05_react/unterricht/tag45/01_react-app-with-tests/src/components/lists/ListTodo.jsx +++ /dev/null @@ -1,66 +0,0 @@ -import { useEffect, useState } from 'react'; - -const ListTodo = (props) => { - // const { } = props; - - const [todos, setTodos] = useState([]); - const [isLoading, setIsLoading] = useState(false); - const [error, setError] = useState(null); - - useEffect(() => { - // AbortController instanziieren (seit 2019) - const controller = new AbortController(); - - setIsLoading(true); - setError(null); - - fetch('https://dummyjson.com/todos/random/6', { - signal: controller.signal, // signal mitsenden - }) - .then((res) => { - if (!res.ok) { - throw new Error('Http-Request went wrong'); - } - return res.json(); - }) - .then((data) => { - setTodos(data); - }) - .catch((err) => { - console.error(err); - if (err.name === 'AbortError') { - console.error('Fetch wurde abgebrochen'); - } else if (err instanceof Error) { - console.error(err.message); - setError(err); - } - }) - .finally(() => { - if (!controller.signal.aborted) { - setIsLoading(false); - } - }); - - return () => { - // unmount - controller.abort(); // The abort() method of the AbortController interface aborts an asynchronous operation before it has completed. - }; - }, []); - - return ( - <> - {!isLoading && ( -
        - {todos.length > 0 && - todos.map(({ id, todo, completed, userId }, idx) => ( -
      • - {todo} -
      • - ))} -
      - )} - {error &&
      {error?.message}
      } - - ); -}; -export default ListTodo; diff --git a/05_react/unterricht/tag45/01_react-app-with-tests/src/components/lists/ListUser.jsx b/05_react/unterricht/tag45/01_react-app-with-tests/src/components/lists/ListUser.jsx deleted file mode 100644 index 66edae2..0000000 --- a/05_react/unterricht/tag45/01_react-app-with-tests/src/components/lists/ListUser.jsx +++ /dev/null @@ -1,69 +0,0 @@ -import axios from 'axios'; -import { useEffect, useState } from 'react'; - -const ListUser = (props) => { - // const { } = props; - const [users, setUsers] = useState([]); - const [isLoading, setIsLoading] = useState(false); - // const [error, setError] = useState(null); - - useEffect(() => { - const controller = new AbortController(); // 2019 - - setIsLoading(true); - - axios - .get('https://dummyjson.com/users?limit=100', { - signal: controller.signal, - }) - .then(({ data }) => { - console.log(data); - setUsers(data?.users); - }) - .catch((err) => { - // - // if (err.name === 'AbortError') {} - if (axios.isCancel(err)) { - console.error('Request abgebrochen:', err.message); - } else { - console.error('Error:', err); - } - }) - .finally(() => { - // Nur wenn die Komponente nicht abgebrochen/unmounted wurde, - // den Lade-Zustand auf false setzen - if (!controller.signal.aborted) { - setIsLoading(false); - } - }); - - return () => { - // umount - controller.abort(); - }; - }, []); - - if (isLoading) { - return

      is loading users...

      ; - } - - return ( -
        - {users.length > 0 && - users.map(({ id, firstName, lastName, age, email }, idx) => ( -
      • -

        - Name: - {firstName} {lastName} -
        - age: {age} -
        - email: {email} -
        -

        -
      • - ))} -
      - ); -}; -export default ListUser; diff --git a/05_react/unterricht/tag45/01_react-app-with-tests/src/main.jsx b/05_react/unterricht/tag45/01_react-app-with-tests/src/main.jsx deleted file mode 100644 index 4233564..0000000 --- a/05_react/unterricht/tag45/01_react-app-with-tests/src/main.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; - -import 'bootstrap'; // import von JS -import 'bootstrap/dist/css/bootstrap.min.css'; // CSS import - -import App from './App.jsx'; - -createRoot(document.getElementById('root')).render( - - - , -); diff --git a/05_react/unterricht/tag45/01_react-app-with-tests/src/test/Button.test.jsx b/05_react/unterricht/tag45/01_react-app-with-tests/src/test/Button.test.jsx deleted file mode 100644 index 485aeaa..0000000 --- a/05_react/unterricht/tag45/01_react-app-with-tests/src/test/Button.test.jsx +++ /dev/null @@ -1,19 +0,0 @@ -import { render, screen, fireEvent } from '@testing-library/react'; -import Button from '../components/buttons/Button'; -import userEvent from '@testing-library/user-event'; - -import { expect, test } from 'vitest'; // Muss nicht eingebunden werden. Einbindung findet automatisch statt, allerdings haben wir dann keine Autocomplete Funktion - -// Test Case -test('Button is clickable and changes text on click to "Clicked"', async () => { - render( - ); -}; -export default Button; diff --git a/05_react/unterricht/tag51/01_react-app-with-tests/src/components/examples/ExampleAsyncComponent.jsx b/05_react/unterricht/tag51/01_react-app-with-tests/src/components/examples/ExampleAsyncComponent.jsx deleted file mode 100644 index 627980a..0000000 --- a/05_react/unterricht/tag51/01_react-app-with-tests/src/components/examples/ExampleAsyncComponent.jsx +++ /dev/null @@ -1,16 +0,0 @@ -import { useEffect, useState } from 'react'; - -const ExampleAsyncComponent = () => { - const [data, setData] = useState(''); - useEffect(() => { - setTimeout(() => { - setData('Data loaded'); - }, 250); - }, []); - return ( -
      -

      {data}

      -
      - ); -}; -export default ExampleAsyncComponent; diff --git a/05_react/unterricht/tag51/01_react-app-with-tests/src/components/examples/ExampleComponent.jsx b/05_react/unterricht/tag51/01_react-app-with-tests/src/components/examples/ExampleComponent.jsx deleted file mode 100644 index 0b326c7..0000000 --- a/05_react/unterricht/tag51/01_react-app-with-tests/src/components/examples/ExampleComponent.jsx +++ /dev/null @@ -1,10 +0,0 @@ -const ExampleComponent = (props) => { - // const { } = props; - - return ( - <> -

      Hello World!

      - - ); -}; -export default ExampleComponent; diff --git a/05_react/unterricht/tag51/01_react-app-with-tests/src/components/examples/ExampleCounter.jsx b/05_react/unterricht/tag51/01_react-app-with-tests/src/components/examples/ExampleCounter.jsx deleted file mode 100644 index eec9fc6..0000000 --- a/05_react/unterricht/tag51/01_react-app-with-tests/src/components/examples/ExampleCounter.jsx +++ /dev/null @@ -1,19 +0,0 @@ -import { useState } from 'react'; - -const ExampleCounter = () => { - const [count, setCount] = useState(0); - - const handleClick = () => { - setCount(count + 1); - }; - return ( -
      -

      Counter: {count}

      - -
      - ); -}; - -export default ExampleCounter; diff --git a/05_react/unterricht/tag51/01_react-app-with-tests/src/components/examples/ExampleUserList.jsx b/05_react/unterricht/tag51/01_react-app-with-tests/src/components/examples/ExampleUserList.jsx deleted file mode 100644 index 4565619..0000000 --- a/05_react/unterricht/tag51/01_react-app-with-tests/src/components/examples/ExampleUserList.jsx +++ /dev/null @@ -1,19 +0,0 @@ -import axios from 'axios'; -import { useEffect, useState } from 'react'; - -const ExampleUserList = (props) => { - const [users, setUsers] = useState([]); - useEffect(() => { - axios.get('https://dummyjson.com/users?limit=3').then((response) => setUsers(response.data.users)); - }, []); - return ( -
        - {users.map((user) => ( -
      • - {user.firstName} -
      • - ))} -
      - ); -}; -export default ExampleUserList; diff --git a/05_react/unterricht/tag51/01_react-app-with-tests/src/components/examples/__test__/ExampleComponent.test.jsx b/05_react/unterricht/tag51/01_react-app-with-tests/src/components/examples/__test__/ExampleComponent.test.jsx deleted file mode 100644 index e674772..0000000 --- a/05_react/unterricht/tag51/01_react-app-with-tests/src/components/examples/__test__/ExampleComponent.test.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import { render, screen } from '@testing-library/react'; -import ExampleComponent from '../ExampleComponent'; - -// import nicht notwendig ( Findet automatisch durch globale Setting statt) -// import { test, expect } from 'vitest'; - -// Test Case -test('Components renders correctly and contains text "Hello World"', () => { - // AAA - // Arrange, Acting, Assert - render(); - - const element = screen.getByText(/Hello World/i); - - expect(element).toBeInTheDocument(); -}); - -// console.log(document.querySelector('p').textContent.includes('Hello World')); // => true diff --git a/05_react/unterricht/tag51/01_react-app-with-tests/src/components/forms/FormContact.jsx b/05_react/unterricht/tag51/01_react-app-with-tests/src/components/forms/FormContact.jsx deleted file mode 100644 index c805c11..0000000 --- a/05_react/unterricht/tag51/01_react-app-with-tests/src/components/forms/FormContact.jsx +++ /dev/null @@ -1,167 +0,0 @@ -import { useState } from 'react'; -import validate from '../../utils/validators/validate'; - -const FormContact = (props) => { - // const { } = props; - - const [formData, setFormData] = useState({ - firstname: '', // - lastname: '', - email: '', - message: '', - }); - - const [errors, setErrors] = useState({}); - const [successMessage, setSuccessMessage] = useState(''); - - // EventHandlers ======= - const handleSubmit = (e) => { - e.preventDefault(); // Standardverhalten (Versenden vom Formular) unterbinden. - - const form = e.currentTarget; - - const errors = validate(formData); - - if (Object.keys(errors).length === 0) { - console.log('Form Data', formData); - // TODO: send over AJAX/Fetch - setSuccessMessage('Form submitted'); - - form.reset(); - setFormData({ - firstname: '', // - lastname: '', - email: '', - message: '', - }); - setErrors({}); - } else { - console.warn('Form submit error'); - setErrors(errors); - setSuccessMessage(''); - } - }; - - const handleBlur = (e) => { - const { name } = e.target; - const error = validate(formData); - - if (error[name]) { - setErrors({ ...errors, [name]: error[name] }); - } else { - setErrors({ ...errors, [name]: '' }); - } - }; - - const handleChange = (e) => { - const { name, value } = e.target; - - setFormData((state) => ({ ...state, [name]: value })); - - // console.log({ [e.target.name]: e.target.value }); - // console.log('Formdata', formData); - }; - - return ( -
      -
      -
      -
      - - - -
      OK
      -
      {errors?.firstname || 'Error'}
      -
      -
      -
      -
      - - -
      OK
      -
      {errors?.lastname}
      -
      -
      -
      - -
      -
      -
      - - -
      OK
      -
      {errors?.email}
      -
      -
      -
      - -
      -
      -
      - - -
      OK
      -
      {errors?.message}
      -
      -
      -
      - -
      -
      -
      - -
      -
      -
      - - {successMessage && ( -
      - {successMessage} -
      - )} -
      - ); -}; -export default FormContact; diff --git a/05_react/unterricht/tag51/01_react-app-with-tests/src/components/inputs/InputAmount.jsx b/05_react/unterricht/tag51/01_react-app-with-tests/src/components/inputs/InputAmount.jsx deleted file mode 100644 index b78c8af..0000000 --- a/05_react/unterricht/tag51/01_react-app-with-tests/src/components/inputs/InputAmount.jsx +++ /dev/null @@ -1,54 +0,0 @@ -import { useState } from 'react'; -import { FaMinus, FaPlus } from 'react-icons/fa6'; -const InputAmount = () => { - const [amount, setAmount] = useState(0); - - const handleChange = (e) => { - const value = e.target.value; - if (!isNaN(value)) { - setAmount(Number(value)); - } - }; - - const handleClickIncrement = () => { - setAmount(amount + 1); - }; - - const handleClickDecrement = () => { - setAmount(amount - 1); - }; - - return ( -
      -
      - - - - - - - -
      -
      - ); -}; - -export default InputAmount; diff --git a/05_react/unterricht/tag51/01_react-app-with-tests/src/components/lists/ListTodo.jsx b/05_react/unterricht/tag51/01_react-app-with-tests/src/components/lists/ListTodo.jsx deleted file mode 100644 index 07b526c..0000000 --- a/05_react/unterricht/tag51/01_react-app-with-tests/src/components/lists/ListTodo.jsx +++ /dev/null @@ -1,66 +0,0 @@ -import { useEffect, useState } from 'react'; - -const ListTodo = (props) => { - // const { } = props; - - const [todos, setTodos] = useState([]); - const [isLoading, setIsLoading] = useState(false); - const [error, setError] = useState(null); - - useEffect(() => { - // AbortController instanziieren (seit 2019) - const controller = new AbortController(); - - setIsLoading(true); - setError(null); - - fetch('https://dummyjson.com/todos/random/6', { - signal: controller.signal, // signal mitsenden - }) - .then((res) => { - if (!res.ok) { - throw new Error('Http-Request went wrong'); - } - return res.json(); - }) - .then((data) => { - setTodos(data); - }) - .catch((err) => { - console.error(err); - if (err.name === 'AbortError') { - console.error('Fetch wurde abgebrochen'); - } else if (err instanceof Error) { - console.error(err.message); - setError(err); - } - }) - .finally(() => { - if (!controller.signal.aborted) { - setIsLoading(false); - } - }); - - return () => { - // unmount - controller.abort(); // The abort() method of the AbortController interface aborts an asynchronous operation before it has completed. - }; - }, []); - - return ( - <> - {!isLoading && ( -
        - {todos.length > 0 && - todos.map(({ id, todo, completed, userId }, idx) => ( -
      • - {todo} -
      • - ))} -
      - )} - {error &&
      {error?.message}
      } - - ); -}; -export default ListTodo; diff --git a/05_react/unterricht/tag51/01_react-app-with-tests/src/components/lists/ListUser.jsx b/05_react/unterricht/tag51/01_react-app-with-tests/src/components/lists/ListUser.jsx deleted file mode 100644 index 442d44f..0000000 --- a/05_react/unterricht/tag51/01_react-app-with-tests/src/components/lists/ListUser.jsx +++ /dev/null @@ -1,80 +0,0 @@ -import axios from 'axios'; -import { useEffect, useState } from 'react'; - -const ListUser = (props) => { - // const { } = props; - const [users, setUsers] = useState([]); - const [isLoading, setIsLoading] = useState(false); - const [error, setError] = useState(null); - - useEffect(() => { - const controller = new AbortController(); // 2019 - - setIsLoading(true); - - axios - .get('https://dummyjson.com/users?limit=100', { - signal: controller.signal, - }) - .then(({ data }) => { - console.log(data); - setUsers(data?.users ?? []); - setError(null); - }) - .catch((err) => { - // - // if (err.name === 'AbortError') {} - if (axios.isCancel(err)) { - console.error('Request abgebrochen:', err.message); - } else { - console.error('Error:', err); - setError(err); - } - }) - .finally(() => { - // Nur wenn die Komponente nicht abgebrochen/unmounted wurde, - // den Lade-Zustand auf false setzen - if (!controller.signal.aborted) { - setIsLoading(false); - } - }); - - return () => { - // umount - controller.abort(); - }; - }, []); - - if (isLoading) { - return

      is loading users...

      ; - } - - if (error) { - const status = error.response?.status; - return ( -

      - {status ? `Failed to load users (HTTP ${status})` : 'Failed to load users'} -

      - ); - } - - return ( -
        - {users.length > 0 && - users.map(({ id, firstName, lastName, age, email }, idx) => ( -
      • -

        - Name: - {firstName} {lastName} -
        - age: {age} -
        - email: {email} -
        -

        -
      • - ))} -
      - ); -}; -export default ListUser; diff --git a/05_react/unterricht/tag51/01_react-app-with-tests/src/main.jsx b/05_react/unterricht/tag51/01_react-app-with-tests/src/main.jsx deleted file mode 100644 index 4233564..0000000 --- a/05_react/unterricht/tag51/01_react-app-with-tests/src/main.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; - -import 'bootstrap'; // import von JS -import 'bootstrap/dist/css/bootstrap.min.css'; // CSS import - -import App from './App.jsx'; - -createRoot(document.getElementById('root')).render( - - - , -); diff --git a/05_react/unterricht/tag51/01_react-app-with-tests/src/test/Button.test.jsx b/05_react/unterricht/tag51/01_react-app-with-tests/src/test/Button.test.jsx deleted file mode 100644 index 485aeaa..0000000 --- a/05_react/unterricht/tag51/01_react-app-with-tests/src/test/Button.test.jsx +++ /dev/null @@ -1,19 +0,0 @@ -import { render, screen, fireEvent } from '@testing-library/react'; -import Button from '../components/buttons/Button'; -import userEvent from '@testing-library/user-event'; - -import { expect, test } from 'vitest'; // Muss nicht eingebunden werden. Einbindung findet automatisch statt, allerdings haben wir dann keine Autocomplete Funktion - -// Test Case -test('Button is clickable and changes text on click to "Clicked"', async () => { - render( - - - - - - - - -`; diff --git a/05_react/unterricht/tag51/01_react-app-with-tests/src/test/setup.js b/05_react/unterricht/tag51/01_react-app-with-tests/src/test/setup.js deleted file mode 100644 index 67c151f..0000000 --- a/05_react/unterricht/tag51/01_react-app-with-tests/src/test/setup.js +++ /dev/null @@ -1,14 +0,0 @@ -// src/test/setup.js -import { expect, afterEach } from 'vitest'; -import { cleanup } from '@testing-library/react'; -import * as matchers from '@testing-library/jest-dom/matchers'; - -// add jest-dom matchers to expect -expect.extend(matchers); - -// Add cleanup function to run after each test -afterEach(() => { - cleanup(); -}); - -// More setup code here, if needed diff --git a/05_react/unterricht/tag51/01_react-app-with-tests/src/utils/validators/validate.js b/05_react/unterricht/tag51/01_react-app-with-tests/src/utils/validators/validate.js deleted file mode 100644 index a186292..0000000 --- a/05_react/unterricht/tag51/01_react-app-with-tests/src/utils/validators/validate.js +++ /dev/null @@ -1,37 +0,0 @@ -import validator from 'validator'; - -const validate = (formData) => { - const errors = {}; - - // Firstname min 2 chars - if (validator.isEmpty(formData.firstname.trim())) { - errors.firstname = 'Vorname ist erforderlich.'; - } else if (!validator.isLength(formData.firstname.trim(), { min: 2, max: 60 })) { - errors.firstname = 'Vorname muss mindestens 2 Zeichen und maximal 60 Zeichen lang sein.'; - } - - // Lastname - if (validator.isEmpty(formData.lastname.trim())) { - errors.lastname = 'Nachname ist erforderlich.'; - } else if (!validator.isLength(formData.lastname.trim(), { min: 2, max: 60 })) { - errors.lastname = 'Nachname muss mindestens 2 Zeichen und maximal 60 Zeichen lang sein.'; - } - - // Email - if (validator.isEmpty(formData.email.trim())) { - errors.email = 'E-Mail ist erforderlich.'; - } else if (!validator.isEmail(formData.email.trim())) { - errors.email = 'Bitte gib eine gültige E-Mail-Adresse ein.'; - } - - // Message - if (validator.isEmpty(formData.message.trim())) { - errors.message = 'Nachricht ist erforderlich.'; - } else if (!validator.isLength(formData.message.trim(), { min: 10, max: 1000 })) { - errors.message = 'Die Nachricht muss mindestens 10 und maximal 1000 Zeichen lang sein.'; - } - - return errors; -}; - -export default validate; diff --git a/05_react/unterricht/tag51/01_react-app-with-tests/vite.config.js b/05_react/unterricht/tag51/01_react-app-with-tests/vite.config.js deleted file mode 100644 index b4a17ce..0000000 --- a/05_react/unterricht/tag51/01_react-app-with-tests/vite.config.js +++ /dev/null @@ -1,16 +0,0 @@ -import { defineConfig } from 'vite'; -import react from '@vitejs/plugin-react'; - -// https://vite.dev/config/ -export default defineConfig({ - plugins: [react()], - test: { - // Vitest configuration - globals: true, // make the global objects available in the test environment - environment: 'jsdom', // use jsdom as the test environment - setupFiles: './src/test/setup.js', // if you have a setup file - // more options here - // testTimeout: 2000, // 10 Sekunden für alle Tests - // hookTimeout: 2000, // Optional: Timeout für beforeAll, afterAll, etc. - }, -}); diff --git a/05_react/unterricht/tag52/01_react-app-performance/.gitignore b/05_react/unterricht/tag52/01_react-app-performance/.gitignore deleted file mode 100644 index a547bf3..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/05_react/unterricht/tag52/01_react-app-performance/.oxlintrc.json b/05_react/unterricht/tag52/01_react-app-performance/.oxlintrc.json deleted file mode 100644 index 1255078..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/.oxlintrc.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$schema": "./node_modules/oxlint/configuration_schema.json", - "plugins": ["react", "oxc"], - "rules": { - "react/rules-of-hooks": "error", - "react/only-export-components": ["warn", { "allowConstantExport": true }] - } -} diff --git a/05_react/unterricht/tag52/01_react-app-performance/README.md b/05_react/unterricht/tag52/01_react-app-performance/README.md deleted file mode 100644 index d937833..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# React + Vite - -This template provides a minimal setup to get React working in Vite with HMR and some Oxlint rules. - -Currently, two official plugins are available: - -- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs) -- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) - -## React Compiler - -The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). - -## Expanding the Oxlint configuration - -If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and Oxlint's TypeScript related rules in your project. diff --git a/05_react/unterricht/tag52/01_react-app-performance/index.html b/05_react/unterricht/tag52/01_react-app-performance/index.html deleted file mode 100644 index 2d7e304..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - 01_react-app-performance - - -
      - - - diff --git a/05_react/unterricht/tag52/01_react-app-performance/package-lock.json b/05_react/unterricht/tag52/01_react-app-performance/package-lock.json deleted file mode 100644 index 12e8c74..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/package-lock.json +++ /dev/null @@ -1,3899 +0,0 @@ -{ - "name": "01_react-app-performance", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "01_react-app-performance", - "version": "0.0.0", - "dependencies": { - "axios": "^1.19.0", - "bootstrap": "^5.3.8", - "react": "^19.2.8", - "react-dom": "^19.2.8", - "react-icons": "^5.7.0", - "validator": "^13.15.35" - }, - "devDependencies": { - "@testing-library/jest-dom": "^7.0.1", - "@testing-library/react": "^16.3.2", - "@testing-library/user-event": "^14.6.6", - "@types/react": "^19.2.18", - "@types/react-dom": "^19.2.5", - "@vitejs/plugin-react": "^6.1.0", - "@vitest/ui": "^4.1.11", - "axios-mock-adapter": "^2.1.0", - "jsdom": "^30.0.1", - "oxlint": "^1.80.0", - "sass-embedded": "^1.103.1", - "vite": "^8.2.2", - "vitest": "^4.1.11" - } - }, - "node_modules/@adobe/css-tools": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.5.0.tgz", - "integrity": "sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@asamuzakjp/css-color": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-6.0.7.tgz", - "integrity": "sha512-vC/bk1Lz7Tn/EfU9/apOTBk80/8dyGyWMowPoV1tJ52muDGsDqt2HPT2klrFUiY60MQmQv9q8yIht15JnBgDGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@csstools/css-calc": "^3.3.0", - "@csstools/css-color-parser": "^4.1.10", - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0", - "lru-cache": "^11.5.2" - }, - "engines": { - "node": "^22.13.0 || >=24.0.0" - } - }, - "node_modules/@asamuzakjp/dom-selector": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-8.3.2.tgz", - "integrity": "sha512-93Z1N+BQNXysodoicpOIyNh2drHfz/CTf9nnT0FEx72GJcIiwgydD7tGAr78j41LsYn3hlRn+LdGPuBLn1Bl8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "bidi-js": "^1.0.3", - "css-tree": "^3.2.1", - "is-potential-custom-element-name": "^1.0.1", - "lru-cache": "^11.5.2" - }, - "engines": { - "node": "^22.13.0 || >=24.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", - "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.29.7", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", - "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bramus/specificity": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", - "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "css-tree": "^3.0.0" - }, - "bin": { - "specificity": "bin/cli.js" - } - }, - "node_modules/@bufbuild/protobuf": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.14.0.tgz", - "integrity": "sha512-C3UGsiCwSprE2NKIIFA3hCDlpXTMCAXRZuEVp88L1GY36Y41+rYL5fryE+nOFhp4p4JPQvdV8PQ4DWgHgeTE+w==", - "dev": true, - "license": "(Apache-2.0 AND BSD-3-Clause)" - }, - "node_modules/@csstools/color-helpers": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.1.1.tgz", - "integrity": "sha512-gLNsunvwf3mCi5u5o46/Z/JcJMnhbHSaZ69rkgPzNM3J4s8hWwpPUQB6/tt0EDFyCiWzxANlx+2LJwpYj4zS1w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=20.19.0" - } - }, - "node_modules/@csstools/css-calc": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.3.0.tgz", - "integrity": "sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@csstools/css-color-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.2.0.tgz", - "integrity": "sha512-5+5LEmFuY1AjXdYhmgjTJogtQnP1evJ1zrBZGUNZ0thkpwnnmKxcHdAMn/OtFjAb25zA+jKDVYVRl+5G7rjv1A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/color-helpers": "^6.1.1", - "@csstools/css-calc": "^3.3.0" - }, - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", - "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.8.tgz", - "integrity": "sha512-CpMLjAvwQg3BL5S0IeqsZNMH7EQrEWi0kLKOC13ZBF0ZwERiLWlibNPJr8G1kdU3Ms/r2KiNrF81pUh2HwAHdg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "peerDependencies": { - "css-tree": "^3.2.1" - }, - "peerDependenciesMeta": { - "css-tree": { - "optional": true - } - } - }, - "node_modules/@csstools/css-tokenizer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", - "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=20.19.0" - } - }, - "node_modules/@exodus/bytes": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.1.tgz", - "integrity": "sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "@noble/hashes": "^1.8.0 || ^2.0.0" - }, - "peerDependenciesMeta": { - "@noble/hashes": { - "optional": true - } - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@oxc-project/types": { - "version": "0.146.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.146.0.tgz", - "integrity": "sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@oxlint/binding-android-arm-eabi": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.80.0.tgz", - "integrity": "sha512-RM3Plj+biQpxa5d1GOOX6ciDlcUROmm4OZ/pLTpitkQt2mJv4jhtY4cbgaetOm5UKWZe05/TGQ6o1Vl8EOHkrA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-android-arm64": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.80.0.tgz", - "integrity": "sha512-YlO5JEf0Yr2bUUlu8O8daVcUxtcGGbcSmyV7E7nSbJbfAdxTE0PFPwgnIlw7wXJaTYjb+qs5hI5q3jxUkI7cAw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-darwin-arm64": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.80.0.tgz", - "integrity": "sha512-BULDOyO3AhsmdWfQeIUCykDt3dd7XZBGLhp1eIh56skRv01O+cNjNPwXMIbeW1x4+pxcln5if72wcRgViVo7PA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-darwin-x64": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.80.0.tgz", - "integrity": "sha512-YJ4JzLw7N5TDSQFlA0hAQGHvnDZgyypm1yunObVWcWiF9KM7eGCJKYKLgTC2Fi/57OdnBhbj4OkzPGdFQJ6HyA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-freebsd-x64": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.80.0.tgz", - "integrity": "sha512-AYUIk5QnL0s8oWAYsREZwkRYy1SupJTXALo93J1TgzHywxQtdM99FecRMQ87MXEdPQ0j1TmEpeeq3fGNkpvMqg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm-gnueabihf": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.80.0.tgz", - "integrity": "sha512-9hBZVANupQ89W9dXyE0n8doCyaW5pDyGn3y6XlIMPZ+rIKuyqkr3SNUXmVJIhuvUq0NBU3RBiSXXE69l4XI6KA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm-musleabihf": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.80.0.tgz", - "integrity": "sha512-SvS2uKqzY+pbfuvAHzH4338R6Zwo805GAwrIMVvK1KxoOWCIjZUdfzTCvilD7z6JK91v011+zYMryabhDo2AsQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm64-gnu": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.80.0.tgz", - "integrity": "sha512-tCLadyqRVL3pQTRPNg7cjXKvcvS4fbyXeQHhKk5BTJ1oftQln5/yIIWbu/Xom/DX41zv2P9QGt6+D/TtQVtY3A==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm64-musl": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.80.0.tgz", - "integrity": "sha512-XfpCNRlOPcLlJl4Bn/FUhjqlR6BVavEykERBf/MV7YA9VZDa5g5znVqYhyviMafcxS9Pe/i/kPvHNO0U6svEHQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-ppc64-gnu": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.80.0.tgz", - "integrity": "sha512-3I4yMwcFG9NeO8ioY6JBBuKsIm5GL/x7MATt1S4tVWaxPu5HcJ+XnLUbcVBTxG8q2Wu56HSj+NmXQiVYb1lp6A==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-riscv64-gnu": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.80.0.tgz", - "integrity": "sha512-E1wAKymkpe1/E8helzBKdm81OBOF+ezxRyXRMEuik3ZpWDER5CPOKZwF66RsdwW98uwZv8UTFremUQtC1CzdJA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-riscv64-musl": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.80.0.tgz", - "integrity": "sha512-+gLRGD4sIo3+VA++iham5UxD9tKSoJ/VOrROCEXIcknrYtQg6iIQgvjN0cpiRF7N6UYC7pJbvHJlDnMge5LRpQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-s390x-gnu": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.80.0.tgz", - "integrity": "sha512-aR0PrzHj9leW3NmzBAAP4EzdoBNoJcs9sjnIQPIwyRnBGYrRbXUIpEB5Q39AqK3PLY5JK5uEhDQDiUa1QSAstw==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-x64-gnu": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.80.0.tgz", - "integrity": "sha512-vSVh5cSo3Xxs6ghBCcFJlpbkbENzDog1qXtoXLa/HC3aCrR4XO76GZbXmQoCPHnu99nQpdCeC3H9tdNICfDh7A==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-x64-musl": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.80.0.tgz", - "integrity": "sha512-FfzBXpNQ8u7/ZI/p8bl73MeZ508Ax3hxWp3SiJpEFiC+BB9XcXy5FAZHTLKDPSzrUpxQZSZJAVdDmuJp/+HDBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-openharmony-arm64": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.80.0.tgz", - "integrity": "sha512-zMzbkumtmprCgRwoYNzcB3iC39fXdJIMLMU33KdCjEGLlJGOEt1+LwQ4LF8ndLzAEKVz4BR0y3V6Xrkk3Nm3yA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-arm64-msvc": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.80.0.tgz", - "integrity": "sha512-ib6iRcrXsk4t1fm3iKcwksyWh1ZkZXC/2mEzakl0ai2+6HZunf1WWMZ/xP9EJAvw9g9K4UVTC3NF/+G2qLrbTQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-ia32-msvc": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.80.0.tgz", - "integrity": "sha512-xhRWBMpLxZvgKAH6+DJZmpP+W8Y8UdQOSU1JfxSWNXsaBaRGW77j+1hCuNHlzj7OH4SPN8fYd1q0o2qrDtoVyw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-x64-msvc": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.80.0.tgz", - "integrity": "sha512-yAnO7lwBYQnz2pcfBPIGQQZWIX5zd5R/1aAKIF3oE+TVj7IhoHcROjOkz3sRDngzqhfPKfFaXqug5j5rE5dn6Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz", - "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.3", - "is-glob": "^4.0.3", - "node-addon-api": "^7.0.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.6.0", - "@parcel/watcher-darwin-arm64": "2.6.0", - "@parcel/watcher-darwin-x64": "2.6.0", - "@parcel/watcher-freebsd-x64": "2.6.0", - "@parcel/watcher-linux-arm-glibc": "2.6.0", - "@parcel/watcher-linux-arm-musl": "2.6.0", - "@parcel/watcher-linux-arm64-glibc": "2.6.0", - "@parcel/watcher-linux-arm64-musl": "2.6.0", - "@parcel/watcher-linux-x64-glibc": "2.6.0", - "@parcel/watcher-linux-x64-musl": "2.6.0", - "@parcel/watcher-win32-arm64": "2.6.0", - "@parcel/watcher-win32-x64": "2.6.0" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz", - "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz", - "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz", - "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz", - "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz", - "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz", - "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz", - "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz", - "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz", - "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz", - "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz", - "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz", - "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "dev": true, - "license": "MIT" - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "license": "MIT", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@rolldown/binding-android-arm-eabi": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.5.tgz", - "integrity": "sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.5.tgz", - "integrity": "sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.5.tgz", - "integrity": "sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.5.tgz", - "integrity": "sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.5.tgz", - "integrity": "sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.5.tgz", - "integrity": "sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.5.tgz", - "integrity": "sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.5.tgz", - "integrity": "sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.5.tgz", - "integrity": "sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.5.tgz", - "integrity": "sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.5.tgz", - "integrity": "sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.5.tgz", - "integrity": "sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.5.tgz", - "integrity": "sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.5.tgz", - "integrity": "sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.5.tgz", - "integrity": "sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@testing-library/dom": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", - "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "picocolors": "1.1.1", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@testing-library/jest-dom": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-7.0.1.tgz", - "integrity": "sha512-oMDTC3oA+6CXSO2JZnvOI7CA6oVub6kij5ggk9ohwye5slmkwxYDXcPOVxgMw/RQlticjtO0C1RZkR97HgrWMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@adobe/css-tools": "^4.4.0", - "aria-query": "^5.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.6.3", - "picocolors": "^1.1.1", - "redent": "^3.0.0" - }, - "engines": { - "node": ">=22", - "npm": ">=6", - "yarn": ">=1" - }, - "peerDependencies": { - "@testing-library/dom": ">=10 <11", - "vitest": ">= 0.32" - }, - "peerDependenciesMeta": { - "vitest": { - "optional": true - } - } - }, - "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", - "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@testing-library/react": { - "version": "16.3.2", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.2.tgz", - "integrity": "sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@testing-library/dom": "^10.0.0", - "@types/react": "^18.0.0 || ^19.0.0", - "@types/react-dom": "^18.0.0 || ^19.0.0", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@testing-library/user-event": { - "version": "14.6.6", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.6.tgz", - "integrity": "sha512-Jbs9FpkkIDw8FgSc6kOVsOv8JuuqGAL7J4X1oot77JxAoDlkNn2GRkd0aYRVuQ+pVQAiHWVkE4rX/dkF5fBiCw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" - } - }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@types/chai": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" - } - }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.2.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", - "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.2.5", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.5.tgz", - "integrity": "sha512-fMPwH9v7r/pp43yUd2/Mbiex5KouJwwR3dzHkhLREUC6764VyDsqxhAxv6OFEYR1RhjOyD1naqba8ECDBe7ZQg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.1.0.tgz", - "integrity": "sha512-qd2BzUBehkov86WFhg0JkEFEYyCLG9uPCe6qWTY/kRlss9OvJrOF2UbIWT7p+8IzZHkEu0DNGHc4HSv+JdDLsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rolldown/pluginutils": "^1.0.1" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", - "babel-plugin-react-compiler": "^1.0.0", - "oxc-transform-react": "^0.145.0", - "vite": "^8.0.0" - }, - "peerDependenciesMeta": { - "@rolldown/plugin-babel": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true - }, - "oxc-transform-react": { - "optional": true - } - } - }, - "node_modules/@vitest/expect": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.11.tgz", - "integrity": "sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.1.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.11", - "@vitest/utils": "4.1.11", - "chai": "^6.2.2", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.11.tgz", - "integrity": "sha512-2XJVD55d1o5AZous5CCGKS74g/riOj9odEt2bQpCVZeblHyHdnMeFl4jl0XjU21stf4mbjUkew2eXQZt65g5CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.1.11", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/pretty-format": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.11.tgz", - "integrity": "sha512-yiZzPbGTS9Sr/JpFl8zHrcIkAofNbFV6k21vIgQN/cY/oxZeXhJv5sc/MBJ5jFKWmWs+oJHw0UXLZjmf931+Vw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.11.tgz", - "integrity": "sha512-LztvUgdwMNJMIkj3hQnnxiC2Xy1zNxq928W/xhjCLaNCzqTZOudjwbQf6v9IntZGPw132i2Lq2rgTRZHD3JHNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.1.11", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.11.tgz", - "integrity": "sha512-pN7ikn1ON7h8ee4gIAp4AzyK+zBtJPzVbqOgu5LCEh4VaJVbPQcgYQYJIMGQPXVeJJq1fnfazis7a5pFNPahog==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.1.11", - "@vitest/utils": "4.1.11", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.11.tgz", - "integrity": "sha512-apNa/prQy2qCeywhnixOHPRCgGNhvg7T4Dapfl1GahLp/R+uhBm5cPyFoNVyqsNd2h1nJxL6BqqdIjiABL60YA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/ui": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-4.1.11.tgz", - "integrity": "sha512-r/rwyKoev21mWdRGSEkZOqkQ2BYy68mwjihg9M90nNRbf4NGrgzZ4cj6JNCEwlOGJkbKeMgsjlykvwKUbRr7gw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.1.11", - "fflate": "^0.8.2", - "flatted": "^3.4.2", - "pathe": "^2.0.3", - "sirv": "^3.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.1.11" - } - }, - "node_modules/@vitest/utils": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.11.tgz", - "integrity": "sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.1.11", - "convert-source-map": "^2.0.0", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.19.0.tgz", - "integrity": "sha512-ht/iuYZXEjFxLH/Hkezgd7m6JKlHHXEUSneaDz8uZe1Gj5QZtCnpyDsckvAiEnT89OEbCLmnte4R4sn7P0EKFw==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.16.0", - "form-data": "^4.0.6", - "https-proxy-agent": "^5.0.1", - "proxy-from-env": "^2.1.0" - } - }, - "node_modules/axios-mock-adapter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-2.1.0.tgz", - "integrity": "sha512-AZUe4OjECGCNNssH8SOdtneiQELsqTsat3SQQCWLPjN436/H+L9AjWfV7bF+Zg/YL9cgbhrz5671hoh+Tbn98w==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "is-buffer": "^2.0.5" - }, - "peerDependencies": { - "axios": ">= 0.17.0" - } - }, - "node_modules/bidi-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", - "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", - "dev": true, - "license": "MIT", - "dependencies": { - "require-from-string": "^2.0.2" - } - }, - "node_modules/bootstrap": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz", - "integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/twbs" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - } - ], - "license": "MIT", - "peerDependencies": { - "@popperjs/core": "^2.11.8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/colorjs.io": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.7.1.tgz", - "integrity": "sha512-LY7OHnJZxHwT5UlzNa9bbhHHDbzB6yE5+3MIPwJEQKRvSCt/T4G7epsj+9j2BExUIIfXFIJGsIXUKdfrK9Q5tA==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/color" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/css-tree": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", - "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mdn-data": "2.27.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", - "dev": true, - "license": "MIT" - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/data-urls": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", - "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-mimetype": "^5.0.0", - "whatwg-url": "^16.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz", - "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@exodus/bytes": "^1.11.0", - "tr46": "^6.0.0", - "webidl-conversions": "^8.0.1" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", - "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", - "dev": true, - "license": "MIT" - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/entities": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", - "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=20.19.0" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", - "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", - "dev": true, - "license": "MIT" - }, - "node_modules/es-object-atoms": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", - "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/expect-type": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", - "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fflate": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.3.tgz", - "integrity": "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==", - "dev": true, - "license": "MIT" - }, - "node_modules/flatted": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", - "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", - "dev": true, - "license": "ISC" - }, - "node_modules/follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", - "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.4", - "mime-types": "^2.1.35" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", - "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", - "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@exodus/bytes": "^1.6.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/immutable": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", - "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", - "dev": true, - "license": "MIT" - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/jsdom": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-30.0.1.tgz", - "integrity": "sha512-52v7mUVUfNQVYYqE1lcdaymWL0njO7lTLUog6ZvW2U5KsbiLk/GnZlVJ+qx0xfNJZ6Gn+KSpPNE52vurbxZwrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@asamuzakjp/css-color": "^6.0.5", - "@asamuzakjp/dom-selector": "^8.3.0", - "@bramus/specificity": "^2.4.2", - "@csstools/css-syntax-patches-for-csstree": "^1.1.7", - "@exodus/bytes": "^1.15.1", - "css-tree": "^3.2.1", - "data-urls": "^7.0.0", - "decimal.js": "^10.6.0", - "html-encoding-sniffer": "^6.0.0", - "is-potential-custom-element-name": "^1.0.1", - "lru-cache": "^11.5.2", - "parse5": "^8.0.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^6.0.2", - "undici": "^8.9.0", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^8.0.1", - "whatwg-mimetype": "^5.0.0", - "whatwg-url": "^17.1.0", - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": "^22.22.2 || ^24.15.0 || >=26.0.0" - }, - "peerDependencies": { - "canvas": "^3.2.3" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/lightningcss": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", - "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.33.0", - "lightningcss-darwin-arm64": "1.33.0", - "lightningcss-darwin-x64": "1.33.0", - "lightningcss-freebsd-x64": "1.33.0", - "lightningcss-linux-arm-gnueabihf": "1.33.0", - "lightningcss-linux-arm64-gnu": "1.33.0", - "lightningcss-linux-arm64-musl": "1.33.0", - "lightningcss-linux-x64-gnu": "1.33.0", - "lightningcss-linux-x64-musl": "1.33.0", - "lightningcss-win32-arm64-msvc": "1.33.0", - "lightningcss-win32-x64-msvc": "1.33.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", - "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", - "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", - "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", - "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", - "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", - "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", - "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", - "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", - "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", - "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", - "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lru-cache": { - "version": "11.5.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mdn-data": { - "version": "2.27.1", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", - "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.18", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", - "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/obug": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", - "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==", - "dev": true, - "funding": [ - "https://github.com/sponsors/sxzz", - "https://opencollective.com/debug" - ], - "license": "MIT", - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/oxlint": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.80.0.tgz", - "integrity": "sha512-5nTiSps4qdbCWLbxzuO00alHkEO2exR9YMN/ig6QXWrLsYSG0KaObOAM+l6oU2LcKPWoSAGYbkZIGEu1ViiWKA==", - "dev": true, - "license": "MIT", - "bin": { - "oxlint": "bin/oxlint" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/Boshen" - }, - "optionalDependencies": { - "@oxlint/binding-android-arm-eabi": "1.80.0", - "@oxlint/binding-android-arm64": "1.80.0", - "@oxlint/binding-darwin-arm64": "1.80.0", - "@oxlint/binding-darwin-x64": "1.80.0", - "@oxlint/binding-freebsd-x64": "1.80.0", - "@oxlint/binding-linux-arm-gnueabihf": "1.80.0", - "@oxlint/binding-linux-arm-musleabihf": "1.80.0", - "@oxlint/binding-linux-arm64-gnu": "1.80.0", - "@oxlint/binding-linux-arm64-musl": "1.80.0", - "@oxlint/binding-linux-ppc64-gnu": "1.80.0", - "@oxlint/binding-linux-riscv64-gnu": "1.80.0", - "@oxlint/binding-linux-riscv64-musl": "1.80.0", - "@oxlint/binding-linux-s390x-gnu": "1.80.0", - "@oxlint/binding-linux-x64-gnu": "1.80.0", - "@oxlint/binding-linux-x64-musl": "1.80.0", - "@oxlint/binding-openharmony-arm64": "1.80.0", - "@oxlint/binding-win32-arm64-msvc": "1.80.0", - "@oxlint/binding-win32-ia32-msvc": "1.80.0", - "@oxlint/binding-win32-x64-msvc": "1.80.0" - }, - "peerDependencies": { - "oxlint-tsgolint": ">=7.0.2001", - "vite-plus": "*" - }, - "peerDependenciesMeta": { - "oxlint-tsgolint": { - "optional": true - }, - "vite-plus": { - "optional": true - } - } - }, - "node_modules/parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", - "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^8.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", - "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", - "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.17", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/proxy-from-env": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", - "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/react": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", - "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", - "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.8" - } - }, - "node_modules/react-icons": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.7.0.tgz", - "integrity": "sha512-LBLy340Rzqy6+/yVhZKT3B/QpP1BZaesGqasf09HPOBzRarcDIFH0WwXlXQfE7q7ipxK4MSiC5DIBWURCny6fw==", - "license": "MIT", - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/readdirp": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", - "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/rolldown": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.5.tgz", - "integrity": "sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "=0.146.0", - "@rolldown/pluginutils": "^1.0.0" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm-eabi": "1.2.5", - "@rolldown/binding-android-arm64": "1.2.5", - "@rolldown/binding-darwin-arm64": "1.2.5", - "@rolldown/binding-darwin-x64": "1.2.5", - "@rolldown/binding-freebsd-x64": "1.2.5", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.5", - "@rolldown/binding-linux-arm64-gnu": "1.2.5", - "@rolldown/binding-linux-arm64-musl": "1.2.5", - "@rolldown/binding-linux-ppc64-gnu": "1.2.5", - "@rolldown/binding-linux-s390x-gnu": "1.2.5", - "@rolldown/binding-linux-x64-gnu": "1.2.5", - "@rolldown/binding-linux-x64-musl": "1.2.5", - "@rolldown/binding-openharmony-arm64": "1.2.5", - "@rolldown/binding-win32-arm64-msvc": "1.2.5", - "@rolldown/binding-win32-x64-msvc": "1.2.5" - } - }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/sass": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.103.1.tgz", - "integrity": "sha512-9icZURbP51S6S0QGoyaeqk9uB06GNWxsFYWfH5RgpFgqK5FA8tJcM3AdVxrZEVJ7dz+L87nG95gBKf4VuaMHGw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "chokidar": "^5.0.0", - "immutable": "^5.1.5", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=20.19.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" - } - }, - "node_modules/sass-embedded": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.103.1.tgz", - "integrity": "sha512-UVIuFZPzz+4DXYbHzQ5gKaKkyP2IH3Sc/WoF63N2V7QIfnC2E9UpQAtiKlCVJTfBe43HRgHDBLnXpZkYAEBsNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@bufbuild/protobuf": "^2.5.0", - "colorjs.io": "^0.7.0", - "immutable": "^5.1.5", - "rxjs": "^7.4.0", - "supports-color": "^8.1.1", - "sync-child-process": "^1.0.2", - "varint": "^6.0.0" - }, - "bin": { - "sass": "dist/bin/sass.js" - }, - "engines": { - "node": ">=20.19.0" - }, - "optionalDependencies": { - "sass-embedded-all-unknown": "1.103.1", - "sass-embedded-android-arm": "1.103.1", - "sass-embedded-android-arm64": "1.103.1", - "sass-embedded-android-riscv64": "1.103.1", - "sass-embedded-android-x64": "1.103.1", - "sass-embedded-darwin-arm64": "1.103.1", - "sass-embedded-darwin-x64": "1.103.1", - "sass-embedded-linux-arm": "1.103.1", - "sass-embedded-linux-arm64": "1.103.1", - "sass-embedded-linux-musl-arm": "1.103.1", - "sass-embedded-linux-musl-arm64": "1.103.1", - "sass-embedded-linux-musl-riscv64": "1.103.1", - "sass-embedded-linux-musl-x64": "1.103.1", - "sass-embedded-linux-riscv64": "1.103.1", - "sass-embedded-linux-x64": "1.103.1", - "sass-embedded-unknown-all": "1.103.1", - "sass-embedded-win32-arm64": "1.103.1", - "sass-embedded-win32-x64": "1.103.1" - } - }, - "node_modules/sass-embedded-all-unknown": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.103.1.tgz", - "integrity": "sha512-MwX2ap06TbImAqlbnH6EndgBBejk6Eq2QB6Ae2hukCn9wmXf9cRu27um3mz3tyB4oJOOku0xfHqFH/+ckYj6YA==", - "cpu": [ - "!arm", - "!arm64", - "!riscv64", - "!x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "sass": "1.103.1" - } - }, - "node_modules/sass-embedded-android-arm": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.103.1.tgz", - "integrity": "sha512-p36WHpsu5HEo2+NVNbI2Nmb8VgVH0xwOQyzghvZhF7ikGCzEVYI5BP28vHUZlCcgj2TUvMEJKI2lV336a+F/sg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-arm64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.103.1.tgz", - "integrity": "sha512-jBXWMksyz55XeLOWvQs64BqiG5DcqflmMxcvMoA2oHtQT/7XZ02hBn502qpcF/q8Qd+qqG/hU5ccM+hGXrbQZw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-riscv64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.103.1.tgz", - "integrity": "sha512-rzrH7RNntk0rx+zCE9xOiAIUt37D1cQKvFfcoX0xiePdGbNHBN8DWKaWN9vaCRfbgKCmxPjevzaqFNI/G/8E1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-x64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.103.1.tgz", - "integrity": "sha512-EQglAJXJutuIcqgZf7YOwzao2ND6ow/OgqN+cM48/Qaeb6AimYmZiUJmM9FFcmS3Q2n1k6/2OU3l3Hlin7bFpw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-darwin-arm64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.103.1.tgz", - "integrity": "sha512-rlaBeCul8pLbDRKdBAxdDxSBwFU5fbX42ci6CxW2Vbs34jWTMQ72+nE2v2KkGGce+JnYbb7UV6xDP/4uDWWi+w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-darwin-x64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.103.1.tgz", - "integrity": "sha512-VSKFfhI//AOct6ppFmAaSH7tlW2LOFECMGs77jIoWf0ZjvGch/3sc9lUTTdIaYIOnTS4qpZck+8OcI2D0G92QA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-arm": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.103.1.tgz", - "integrity": "sha512-tJRLPUtBwXHTnBnG7I39gQvCLreuOHLLCMyKHPR1hQ7aFNwiZjADYzKMRQPNMUqti/Os9z+6I7V13FqgQHfuzg==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-arm64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.103.1.tgz", - "integrity": "sha512-rC+80/Xr9svo0ka2Zr/sjD+N1zEHTw2Urm/nsEjaVp5HSH2i22jwhTKTIqie2OLl6ti+qdYnbI0sSfxOYRtgrg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-arm": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.103.1.tgz", - "integrity": "sha512-N8L/kgVzXpnH+8d6ErIzqvb0l8kHODR3OfPaf0Azw6DOLGtEjwDRUbHno+G7iogGzyPOjKsM8OdyqHJj/bpTdw==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-arm64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.103.1.tgz", - "integrity": "sha512-jMgG/C/VMo7+ShMFdk0xjJmQmYkj1PbJu/yrQiaQHpuo5pE2G+vnkEgsuM5EM3lTQ4MbMfnf715qy1fkbNPiUQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-riscv64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.103.1.tgz", - "integrity": "sha512-LZm8rEvI6sKU87qPOlODsYeAs7CmWy0B4ShYkjG4OMcGCcV4Ffxn25XW4TFqmruThITQvJ8WT+WGblzdoxYgbA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-x64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.103.1.tgz", - "integrity": "sha512-rmKzgk4t6RpaDhSefbbnk5yrA4pk1nHlVhJECGay8yMfzK8eglATeY9fzPgt89xCuQk6rkOiy11e+m8tLYOW5Q==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-riscv64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.103.1.tgz", - "integrity": "sha512-xydQmtxla31uMrmN6z+mAogVGdEMDmkUElVq2+udomX/TPZDYJBkApEyJl237M2VLWVv29v1N4U4i2Z4xa7SDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-x64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.103.1.tgz", - "integrity": "sha512-Rln1oWm0MWKzzemOgQWrRFzfVBARwS9qxAidZPpCQHSohzPnWizFkmY1CUJad/YJNsA7sscueMdX63OEvxoM8w==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-unknown-all": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.103.1.tgz", - "integrity": "sha512-p7kI4US8+n+YguKczXh+4KcodJnk+8cwv+QFdvMaz3OfPrdHV0EnhPsaVDWD9qXb1XXCEdUhpp6vQwGk3eKc3A==", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "!android", - "!darwin", - "!linux", - "!win32" - ], - "dependencies": { - "sass": "1.103.1" - } - }, - "node_modules/sass-embedded-win32-arm64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.103.1.tgz", - "integrity": "sha512-/0renOj3SpZGu4TA8CZJ6qZbTxGZk1khkPfiBTmV1uFB40ESYM5VsdXNj76P07bsAjIj9X2fCjTafLQFLSd9Nw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-win32-x64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.103.1.tgz", - "integrity": "sha512-fIg60j9u5YlLUU3W8FvySMR4HHIo9R12HHFQTW7njyQ8nXqgR+t+XfCzGJloQka8g583BlAfu31Q76Ljr5o+9g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "node_modules/sirv": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", - "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, - "node_modules/std-env": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz", - "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==", - "dev": true, - "license": "MIT" - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true, - "license": "MIT" - }, - "node_modules/sync-child-process": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz", - "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "sync-message-port": "^1.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/sync-message-port": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.2.0.tgz", - "integrity": "sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz", - "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyrainbow": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.1.tgz", - "integrity": "sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tldts": { - "version": "7.4.11", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.11.tgz", - "integrity": "sha512-aBiNayCfTQxuIJBm06M+xR14cYaYlDlSXZbgsnKzKNxDKUVq7KFwTjwBSsb7m9Y5xO8WfPnBc63WaYFMTGlvqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tldts-core": "^7.4.11" - }, - "bin": { - "tldts": "bin/cli.js" - } - }, - "node_modules/tldts-core": { - "version": "7.4.11", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.11.tgz", - "integrity": "sha512-CW3WN2rIIE/Of21mulhgnGOwoDyEFNygyIBOONSdyAuSATgMMUCpLeUlB+E8sAwA5xRV9hYPl+kyZ9citHCaKg==", - "dev": true, - "license": "MIT" - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.2.tgz", - "integrity": "sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tldts": "^7.0.5" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/tr46": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", - "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/undici": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-8.10.0.tgz", - "integrity": "sha512-HvltHd7avK13QIw/oLe4qoOLyoVSoafqJ2jYOrtMRBkbYT31eiBQ8O0ehRKZiEZCMEyLFQNIADpgCWC5fALvYQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=22.19.0" - } - }, - "node_modules/validator": { - "version": "13.15.35", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.35.tgz", - "integrity": "sha512-TQ5pAGhd5whStmqWvYF4OjQROlmv9SMFVt37qoCBdqRffuuklWYQlCNnEs2ZaIBD1kZRNnikiZOS1eqgkar0iw==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/varint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", - "dev": true, - "license": "MIT" - }, - "node_modules/vite": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", - "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "lightningcss": "^1.33.0", - "picomatch": "^4.0.5", - "postcss": "^8.5.26", - "rolldown": "~1.2.4", - "tinyglobby": "^0.2.17" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.4.0 || ^0.5.0", - "esbuild": "^0.27.0 || ^0.28.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vitest": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.11.tgz", - "integrity": "sha512-fhACrNXUidIbGSBr5FlbuBkO7VWC1ZyLl0DO4CU2DrQoAPxX84Ysxs+HeGQpii5lZWV1Q4gBZTTu49mF+A6Edw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.1.11", - "@vitest/mocker": "4.1.11", - "@vitest/pretty-format": "4.1.11", - "@vitest/runner": "4.1.11", - "@vitest/snapshot": "4.1.11", - "@vitest/spy": "4.1.11", - "@vitest/utils": "4.1.11", - "es-module-lexer": "^2.0.0", - "expect-type": "^1.3.0", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^4.0.0-rc.1", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.1.0", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.11", - "@vitest/browser-preview": "4.1.11", - "@vitest/browser-webdriverio": "4.1.11", - "@vitest/coverage-istanbul": "4.1.11", - "@vitest/coverage-v8": "4.1.11", - "@vitest/ui": "4.1.11", - "happy-dom": "*", - "jsdom": "*", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/coverage-istanbul": { - "optional": true - }, - "@vitest/coverage-v8": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - }, - "vite": { - "optional": false - } - } - }, - "node_modules/w3c-xmlserializer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/webidl-conversions": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", - "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=20" - } - }, - "node_modules/whatwg-mimetype": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", - "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/whatwg-url": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-17.1.0.tgz", - "integrity": "sha512-3GeworPmc2ZfEEHP7lEbUfBX/L75wdEsi0rLNhXcXxnoN5jyq0SL5gCy06SGW2cyTIZdTvWIDQNQoza++vKeaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@exodus/bytes": "^1.15.1", - "tr46": "^6.0.0", - "webidl-conversions": "^8.0.1" - }, - "engines": { - "node": "^22.14.0 || >=24.0.0" - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/xml-name-validator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true, - "license": "MIT" - } - } -} diff --git a/05_react/unterricht/tag52/01_react-app-performance/package.json b/05_react/unterricht/tag52/01_react-app-performance/package.json deleted file mode 100644 index b4ffdfd..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "01_react-app-performance", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "lint": "oxlint", - "preview": "vite preview", - "test:ui": "npx vitest --ui", - "test": "vitest", - "test:watch": "vitest --watch" - }, - "dependencies": { - "axios": "^1.19.0", - "bootstrap": "^5.3.8", - "react": "^19.2.8", - "react-dom": "^19.2.8", - "react-icons": "^5.7.0", - "validator": "^13.15.35" - }, - "devDependencies": { - "@testing-library/jest-dom": "^7.0.1", - "@testing-library/react": "^16.3.2", - "@testing-library/user-event": "^14.6.6", - "@types/react": "^19.2.18", - "@types/react-dom": "^19.2.5", - "@vitejs/plugin-react": "^6.1.0", - "@vitest/ui": "^4.1.11", - "axios-mock-adapter": "^2.1.0", - "jsdom": "^30.0.1", - "oxlint": "^1.80.0", - "sass-embedded": "^1.103.1", - "vite": "^8.2.2", - "vitest": "^4.1.11" - } -} diff --git a/05_react/unterricht/tag52/01_react-app-performance/public/favicon.svg b/05_react/unterricht/tag52/01_react-app-performance/public/favicon.svg deleted file mode 100644 index 6893eb1..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/public/favicon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/05_react/unterricht/tag52/01_react-app-performance/public/icons.svg b/05_react/unterricht/tag52/01_react-app-performance/public/icons.svg deleted file mode 100644 index e952219..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/public/icons.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/05_react/unterricht/tag52/01_react-app-performance/src/App.jsx b/05_react/unterricht/tag52/01_react-app-performance/src/App.jsx deleted file mode 100644 index 5829b83..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/src/App.jsx +++ /dev/null @@ -1,60 +0,0 @@ -import Button from './components/buttons/Button'; -import ExampleComponent from './components/examples/ExampleComponent'; -import ExampleCounter from './components/examples/ExampleCounter'; -import ExampleLazy from './components/examples/ExampleLazy'; -import ExampleMemoParent from './components/examples/ExampleMemoParent'; -import ExampleUseCallback from './components/examples/ExampleUseCallback'; -import ExampleUseCallbackRef from './components/examples/ExampleUseCallbackRef'; -import ExampleUseMemo from './components/examples/ExampleUseMemo'; -import ExampleUseRef from './components/examples/ExampleUseRef'; -import InputAmount from './components/inputs/InputAmount'; - -// import FormContact from './components/forms/FormContact'; -// import ListUser from './components/lists/ListUser'; - -function App(props) { - // const { } = props; - - return ( - <> - - -
      - -
      -

      useCallback mit ref- Attribut

      - -
      -

      useRef - Hook

      - -
      -

      useCallback auf EventHandler angewandt

      - -
      -

      memo - Funktion von React

      - -
      - -
      - -
      - -
      - -
      - {/* */} -
      -
      - - ); -} -export default App; diff --git a/05_react/unterricht/tag52/01_react-app-performance/src/assets/hero.png b/05_react/unterricht/tag52/01_react-app-performance/src/assets/hero.png deleted file mode 100644 index 02251f4..0000000 Binary files a/05_react/unterricht/tag52/01_react-app-performance/src/assets/hero.png and /dev/null differ diff --git a/05_react/unterricht/tag52/01_react-app-performance/src/assets/react.svg b/05_react/unterricht/tag52/01_react-app-performance/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/05_react/unterricht/tag52/01_react-app-performance/src/assets/vite.svg b/05_react/unterricht/tag52/01_react-app-performance/src/assets/vite.svg deleted file mode 100644 index 5101b67..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/src/assets/vite.svg +++ /dev/null @@ -1 +0,0 @@ -Vite diff --git a/05_react/unterricht/tag52/01_react-app-performance/src/components/buttons/Button.jsx b/05_react/unterricht/tag52/01_react-app-performance/src/components/buttons/Button.jsx deleted file mode 100644 index b3a7606..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/src/components/buttons/Button.jsx +++ /dev/null @@ -1,15 +0,0 @@ -const Button = (props) => { - // const { } = props; - - const handleClick = (e) => { - const btn = e.currentTarget; - btn.textContent = 'Clicked'; - }; - - return ( - - ); -}; -export default Button; diff --git a/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleAsyncComponent.jsx b/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleAsyncComponent.jsx deleted file mode 100644 index 627980a..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleAsyncComponent.jsx +++ /dev/null @@ -1,16 +0,0 @@ -import { useEffect, useState } from 'react'; - -const ExampleAsyncComponent = () => { - const [data, setData] = useState(''); - useEffect(() => { - setTimeout(() => { - setData('Data loaded'); - }, 250); - }, []); - return ( -
      -

      {data}

      -
      - ); -}; -export default ExampleAsyncComponent; diff --git a/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleComponent.jsx b/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleComponent.jsx deleted file mode 100644 index 0b326c7..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleComponent.jsx +++ /dev/null @@ -1,10 +0,0 @@ -const ExampleComponent = (props) => { - // const { } = props; - - return ( - <> -

      Hello World!

      - - ); -}; -export default ExampleComponent; diff --git a/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleCounter.jsx b/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleCounter.jsx deleted file mode 100644 index eec9fc6..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleCounter.jsx +++ /dev/null @@ -1,19 +0,0 @@ -import { useState } from 'react'; - -const ExampleCounter = () => { - const [count, setCount] = useState(0); - - const handleClick = () => { - setCount(count + 1); - }; - return ( -
      -

      Counter: {count}

      - -
      - ); -}; - -export default ExampleCounter; diff --git a/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleLazy.jsx b/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleLazy.jsx deleted file mode 100644 index 3988990..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleLazy.jsx +++ /dev/null @@ -1,21 +0,0 @@ -import { lazy, Suspense } from 'react'; - -// import LazyComponent from './LazyComponent'; - -const LazyComponent = lazy(() => import('./LazyComponent')); // dynamic import (2020) - -const Loading = () =>

      is loading...

      ; - -const ExampleLazy = (props) => { - // const { } = props; - - return ( -
      -

      The content below will only be loaded when the component is needed

      - }> - - -
      - ); -}; -export default ExampleLazy; diff --git a/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleMemo.jsx b/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleMemo.jsx deleted file mode 100644 index d042689..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleMemo.jsx +++ /dev/null @@ -1,15 +0,0 @@ -import { memo } from 'react'; - -const ExampleMemo = (props) => { - const { name } = props; - - console.log('ExampleMemo is rendered'); - - return ( -
      -

      Hello, {name}

      -
      - ); -}; -export default memo(ExampleMemo); -// rendert nur neu, wenn sich props (hier: name) verändert diff --git a/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleMemoParent.jsx b/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleMemoParent.jsx deleted file mode 100644 index 4f63b98..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleMemoParent.jsx +++ /dev/null @@ -1,34 +0,0 @@ -import { useState } from 'react'; -import ExampleMemo from './ExampleMemo'; - -const ExampleMemoParent = (props) => { - // const { } = props; - const [name, setName] = useState('World'); - const [counter, setCounter] = useState(0); - - const names = ['Kahleel', 'Andreas', 'Ersin', 'Adel', 'Philippe']; - - const handleClickCounter = (e) => { - setCounter((prevState) => prevState + 1); - }; - - const handleClickName = (e) => { - setName(names[Math.floor(Math.random() * names.length)]); - }; - - return ( -
      - - -

      Parent component is rendering: {counter}

      - - - -
      - ); -}; -export default ExampleMemoParent; diff --git a/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleUseCallback.jsx b/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleUseCallback.jsx deleted file mode 100644 index 05138c6..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleUseCallback.jsx +++ /dev/null @@ -1,65 +0,0 @@ -import { useCallback, useState } from 'react'; -import ListItemProduct from './ListItemProduct'; - -const ExampleUseCallback = (props) => { - // const { } = props; - const [products, setProducts] = useState( - props.products || [ - { id: 1, title: 'Product 1', description: 'lorem ipsum', price: 10 }, - { id: 2, title: 'Product 2', description: 'ipsum lorem', price: 20 }, - { id: 3, title: 'Product 3', description: 'lorem dolor', price: 30 }, - { id: 4, title: 'Witcher 3', description: 'free update', price: 0 }, - ], - ); - - const handleClick = useCallback((e, productId) => { - setProducts((prevProducts) => { - return prevProducts.map((product) => { - if (product.id === productId) { - return { ...product, price: parseFloat(product.price + 1) }; - } else { - return product; - } - }); - }); - }, []); // <-- leere dependency- Array sorgt dafür, dass die callback funktion und somit der Event-Handler nur einmalig ausgeführt/angelegt wird. - - // EventHandler ================= - // const handleClick = (e, productId) => { - // console.log('Product clicked:', productId); - - // setProducts((prevProducts) => { - // return prevProducts.map((product) => { - // if (product.id === productId) { - // return { ...product, price: parseFloat(product.price + 1) }; - // } else { - // return product; - // } - // }); - // }); - // }; - - // show me the render stuff. - console.log(JSON.stringify(products)); - - return ( -
      - {products && products.length > 0 ? ( -
        - {products.map((product) => ( - { - handleClick(e, product.id); - }} - /> - ))} -
      - ) : ( -

      no products

      - )} -
      - ); -}; -export default ExampleUseCallback; diff --git a/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleUseCallbackRef.jsx b/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleUseCallbackRef.jsx deleted file mode 100644 index 37e6f88..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleUseCallbackRef.jsx +++ /dev/null @@ -1,53 +0,0 @@ -import { useCallback, useState } from 'react'; -import { FaPen } from 'react-icons/fa6'; - -const ExampleUseCallbackRef = (props) => { - // const { } = props; - - const [title, setTitle] = useState(''); - const [editMode, setEditMode] = useState(true); - - // const inputRef = useRef(null); // Rückgabewert ist ein Objekt mit Eigenschaft current { current: HTMLElement} - - const inputRef = useCallback((input) => { - input && input.focus(); - console.log(input); - }, []); - - const handleChangeTitle = (e) => { - setTitle(e.target.value); - }; - - const handleClickEditMode = (e) => { - setEditMode((prevState) => !prevState); - console.log(inputRef); - }; - - return ( -
      -
      -
      - {editMode ? ( - - ) : ( - {title} - )} -
      -
      - -
      -
      -
      - ); -}; -export default ExampleUseCallbackRef; diff --git a/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleUseMemo.jsx b/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleUseMemo.jsx deleted file mode 100644 index 9803b39..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleUseMemo.jsx +++ /dev/null @@ -1,59 +0,0 @@ -import { useMemo, useState } from 'react'; - -const ExampleUseMemo = (props) => { - // const { } = props; - const [products, setProducts] = useState([ - { id: 1, name: 'Product 1', price: 10 }, - { id: 2, name: 'Product 2', price: 20 }, - { id: 3, name: 'Product 3', price: 30 }, - ]); - - const [text, setText] = useState(''); - - const productsAmount = useMemo(() => { - console.log('Calculating the number of products'); - return products.length; - }, [products]); // Bei Veränderung des "states" (hier: products) wird der Funktionsausdruck neu ausgeführt und der Rückgabewert in die Variable geschrieben - - // EventHandler - const handleChangeText = (e) => { - setText(e.target.value); - }; - - // Functions - const getNumberProducts = () => { - console.log('Calculating the number of products'); - return products.length; - }; - - return ( -
      - {products && products.length > 0 ? ( -
        - {products.map((product, idx) => ( -
      • - {product.name} - ${product.price.toFixed(2)} -
      • - ))} -
      - ) : ( -

      Loading...

      - )} -

      Number of products in the list: {productsAmount}

      - -

      Input to rerender component:

      - -

      - Text: {text} -

      -
      - ); -}; -export default ExampleUseMemo; diff --git a/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleUseRef.jsx b/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleUseRef.jsx deleted file mode 100644 index 8d8ac7a..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleUseRef.jsx +++ /dev/null @@ -1,59 +0,0 @@ -import { useEffect, useRef, useState } from 'react'; -import { FaPen } from 'react-icons/fa6'; - -const ExampleUseRef = (props) => { - // const { } = props; - - const [title, setTitle] = useState(''); - const [editMode, setEditMode] = useState(true); - - const inputRef = useRef(null); // Rückgabewert ist ein Objekt mit Eigenschaft current { current: HTMLElement} - - useEffect(() => { - console.log('Full component rendered'); - - if (inputRef.current) { - console.log('ref: ', inputRef.current); - inputRef.current.focus(); - } - - return () => {}; - }, [editMode]); - - const handleChangeTitle = (e) => { - setTitle(e.target.value); - }; - - const handleClickEditMode = (e) => { - setEditMode((prevState) => !prevState); - console.log(inputRef); - }; - - return ( -
      -
      -
      - {editMode ? ( - - ) : ( - {title} - )} -
      -
      - -
      -
      -
      - ); -}; -export default ExampleUseRef; diff --git a/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleUserList.jsx b/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleUserList.jsx deleted file mode 100644 index 4565619..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ExampleUserList.jsx +++ /dev/null @@ -1,19 +0,0 @@ -import axios from 'axios'; -import { useEffect, useState } from 'react'; - -const ExampleUserList = (props) => { - const [users, setUsers] = useState([]); - useEffect(() => { - axios.get('https://dummyjson.com/users?limit=3').then((response) => setUsers(response.data.users)); - }, []); - return ( -
        - {users.map((user) => ( -
      • - {user.firstName} -
      • - ))} -
      - ); -}; -export default ExampleUserList; diff --git a/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/LazyComponent.jsx b/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/LazyComponent.jsx deleted file mode 100644 index 8b4e0f2..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/LazyComponent.jsx +++ /dev/null @@ -1,21 +0,0 @@ -import { useState } from 'react'; - -const LazyComponent = (props) => { - // const { } = props; - - const [textLoaded, setTextLoaded] = useState(''); - - // Simulate a slow content placement // TODO: replace with fetch component - const wait = (delay) => new Promise((resolve) => setTimeout(resolve, delay)); - wait(3000).then(() => { - setTextLoaded('Content fully loaded'); - }); - - return ( -
      -

      I was loaded late: {textLoaded}

      -

      This text only appears after the code for this component has been loaded

      -
      - ); -}; -export default LazyComponent; diff --git a/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ListItemProduct.jsx b/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ListItemProduct.jsx deleted file mode 100644 index fcffaeb..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/ListItemProduct.jsx +++ /dev/null @@ -1,14 +0,0 @@ -const ListItemProduct = (props) => { - const { title, description, price, children } = props; - - return ( -
    • -

      {title}

      -

      {children || description}

      -

      - Price: ${price.toFixed(2)} -

      -
    • - ); -}; -export default ListItemProduct; diff --git a/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/__test__/ExampleComponent.test.jsx b/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/__test__/ExampleComponent.test.jsx deleted file mode 100644 index e674772..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/src/components/examples/__test__/ExampleComponent.test.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import { render, screen } from '@testing-library/react'; -import ExampleComponent from '../ExampleComponent'; - -// import nicht notwendig ( Findet automatisch durch globale Setting statt) -// import { test, expect } from 'vitest'; - -// Test Case -test('Components renders correctly and contains text "Hello World"', () => { - // AAA - // Arrange, Acting, Assert - render(); - - const element = screen.getByText(/Hello World/i); - - expect(element).toBeInTheDocument(); -}); - -// console.log(document.querySelector('p').textContent.includes('Hello World')); // => true diff --git a/05_react/unterricht/tag52/01_react-app-performance/src/components/forms/FormContact.jsx b/05_react/unterricht/tag52/01_react-app-performance/src/components/forms/FormContact.jsx deleted file mode 100644 index c805c11..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/src/components/forms/FormContact.jsx +++ /dev/null @@ -1,167 +0,0 @@ -import { useState } from 'react'; -import validate from '../../utils/validators/validate'; - -const FormContact = (props) => { - // const { } = props; - - const [formData, setFormData] = useState({ - firstname: '', // - lastname: '', - email: '', - message: '', - }); - - const [errors, setErrors] = useState({}); - const [successMessage, setSuccessMessage] = useState(''); - - // EventHandlers ======= - const handleSubmit = (e) => { - e.preventDefault(); // Standardverhalten (Versenden vom Formular) unterbinden. - - const form = e.currentTarget; - - const errors = validate(formData); - - if (Object.keys(errors).length === 0) { - console.log('Form Data', formData); - // TODO: send over AJAX/Fetch - setSuccessMessage('Form submitted'); - - form.reset(); - setFormData({ - firstname: '', // - lastname: '', - email: '', - message: '', - }); - setErrors({}); - } else { - console.warn('Form submit error'); - setErrors(errors); - setSuccessMessage(''); - } - }; - - const handleBlur = (e) => { - const { name } = e.target; - const error = validate(formData); - - if (error[name]) { - setErrors({ ...errors, [name]: error[name] }); - } else { - setErrors({ ...errors, [name]: '' }); - } - }; - - const handleChange = (e) => { - const { name, value } = e.target; - - setFormData((state) => ({ ...state, [name]: value })); - - // console.log({ [e.target.name]: e.target.value }); - // console.log('Formdata', formData); - }; - - return ( -
      -
      -
      -
      - - - -
      OK
      -
      {errors?.firstname || 'Error'}
      -
      -
      -
      -
      - - -
      OK
      -
      {errors?.lastname}
      -
      -
      -
      - -
      -
      -
      - - -
      OK
      -
      {errors?.email}
      -
      -
      -
      - -
      -
      -
      - - -
      OK
      -
      {errors?.message}
      -
      -
      -
      - -
      -
      -
      - -
      -
      -
      - - {successMessage && ( -
      - {successMessage} -
      - )} -
      - ); -}; -export default FormContact; diff --git a/05_react/unterricht/tag52/01_react-app-performance/src/components/inputs/InputAmount.jsx b/05_react/unterricht/tag52/01_react-app-performance/src/components/inputs/InputAmount.jsx deleted file mode 100644 index b78c8af..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/src/components/inputs/InputAmount.jsx +++ /dev/null @@ -1,54 +0,0 @@ -import { useState } from 'react'; -import { FaMinus, FaPlus } from 'react-icons/fa6'; -const InputAmount = () => { - const [amount, setAmount] = useState(0); - - const handleChange = (e) => { - const value = e.target.value; - if (!isNaN(value)) { - setAmount(Number(value)); - } - }; - - const handleClickIncrement = () => { - setAmount(amount + 1); - }; - - const handleClickDecrement = () => { - setAmount(amount - 1); - }; - - return ( -
      -
      - - - - - - - -
      -
      - ); -}; - -export default InputAmount; diff --git a/05_react/unterricht/tag52/01_react-app-performance/src/components/lists/ListTodo.jsx b/05_react/unterricht/tag52/01_react-app-performance/src/components/lists/ListTodo.jsx deleted file mode 100644 index 07b526c..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/src/components/lists/ListTodo.jsx +++ /dev/null @@ -1,66 +0,0 @@ -import { useEffect, useState } from 'react'; - -const ListTodo = (props) => { - // const { } = props; - - const [todos, setTodos] = useState([]); - const [isLoading, setIsLoading] = useState(false); - const [error, setError] = useState(null); - - useEffect(() => { - // AbortController instanziieren (seit 2019) - const controller = new AbortController(); - - setIsLoading(true); - setError(null); - - fetch('https://dummyjson.com/todos/random/6', { - signal: controller.signal, // signal mitsenden - }) - .then((res) => { - if (!res.ok) { - throw new Error('Http-Request went wrong'); - } - return res.json(); - }) - .then((data) => { - setTodos(data); - }) - .catch((err) => { - console.error(err); - if (err.name === 'AbortError') { - console.error('Fetch wurde abgebrochen'); - } else if (err instanceof Error) { - console.error(err.message); - setError(err); - } - }) - .finally(() => { - if (!controller.signal.aborted) { - setIsLoading(false); - } - }); - - return () => { - // unmount - controller.abort(); // The abort() method of the AbortController interface aborts an asynchronous operation before it has completed. - }; - }, []); - - return ( - <> - {!isLoading && ( -
        - {todos.length > 0 && - todos.map(({ id, todo, completed, userId }, idx) => ( -
      • - {todo} -
      • - ))} -
      - )} - {error &&
      {error?.message}
      } - - ); -}; -export default ListTodo; diff --git a/05_react/unterricht/tag52/01_react-app-performance/src/components/lists/ListUser.jsx b/05_react/unterricht/tag52/01_react-app-performance/src/components/lists/ListUser.jsx deleted file mode 100644 index 442d44f..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/src/components/lists/ListUser.jsx +++ /dev/null @@ -1,80 +0,0 @@ -import axios from 'axios'; -import { useEffect, useState } from 'react'; - -const ListUser = (props) => { - // const { } = props; - const [users, setUsers] = useState([]); - const [isLoading, setIsLoading] = useState(false); - const [error, setError] = useState(null); - - useEffect(() => { - const controller = new AbortController(); // 2019 - - setIsLoading(true); - - axios - .get('https://dummyjson.com/users?limit=100', { - signal: controller.signal, - }) - .then(({ data }) => { - console.log(data); - setUsers(data?.users ?? []); - setError(null); - }) - .catch((err) => { - // - // if (err.name === 'AbortError') {} - if (axios.isCancel(err)) { - console.error('Request abgebrochen:', err.message); - } else { - console.error('Error:', err); - setError(err); - } - }) - .finally(() => { - // Nur wenn die Komponente nicht abgebrochen/unmounted wurde, - // den Lade-Zustand auf false setzen - if (!controller.signal.aborted) { - setIsLoading(false); - } - }); - - return () => { - // umount - controller.abort(); - }; - }, []); - - if (isLoading) { - return

      is loading users...

      ; - } - - if (error) { - const status = error.response?.status; - return ( -

      - {status ? `Failed to load users (HTTP ${status})` : 'Failed to load users'} -

      - ); - } - - return ( -
        - {users.length > 0 && - users.map(({ id, firstName, lastName, age, email }, idx) => ( -
      • -

        - Name: - {firstName} {lastName} -
        - age: {age} -
        - email: {email} -
        -

        -
      • - ))} -
      - ); -}; -export default ListUser; diff --git a/05_react/unterricht/tag52/01_react-app-performance/src/main.jsx b/05_react/unterricht/tag52/01_react-app-performance/src/main.jsx deleted file mode 100644 index 4233564..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/src/main.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; - -import 'bootstrap'; // import von JS -import 'bootstrap/dist/css/bootstrap.min.css'; // CSS import - -import App from './App.jsx'; - -createRoot(document.getElementById('root')).render( - - - , -); diff --git a/05_react/unterricht/tag52/01_react-app-performance/src/test/Button.test.jsx b/05_react/unterricht/tag52/01_react-app-performance/src/test/Button.test.jsx deleted file mode 100644 index 485aeaa..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/src/test/Button.test.jsx +++ /dev/null @@ -1,19 +0,0 @@ -import { render, screen, fireEvent } from '@testing-library/react'; -import Button from '../components/buttons/Button'; -import userEvent from '@testing-library/user-event'; - -import { expect, test } from 'vitest'; // Muss nicht eingebunden werden. Einbindung findet automatisch statt, allerdings haben wir dann keine Autocomplete Funktion - -// Test Case -test('Button is clickable and changes text on click to "Clicked"', async () => { - render( - - - - - - - - -`; diff --git a/05_react/unterricht/tag52/01_react-app-performance/src/test/setup.js b/05_react/unterricht/tag52/01_react-app-performance/src/test/setup.js deleted file mode 100644 index 67c151f..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/src/test/setup.js +++ /dev/null @@ -1,14 +0,0 @@ -// src/test/setup.js -import { expect, afterEach } from 'vitest'; -import { cleanup } from '@testing-library/react'; -import * as matchers from '@testing-library/jest-dom/matchers'; - -// add jest-dom matchers to expect -expect.extend(matchers); - -// Add cleanup function to run after each test -afterEach(() => { - cleanup(); -}); - -// More setup code here, if needed diff --git a/05_react/unterricht/tag52/01_react-app-performance/src/utils/validators/validate.js b/05_react/unterricht/tag52/01_react-app-performance/src/utils/validators/validate.js deleted file mode 100644 index a186292..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/src/utils/validators/validate.js +++ /dev/null @@ -1,37 +0,0 @@ -import validator from 'validator'; - -const validate = (formData) => { - const errors = {}; - - // Firstname min 2 chars - if (validator.isEmpty(formData.firstname.trim())) { - errors.firstname = 'Vorname ist erforderlich.'; - } else if (!validator.isLength(formData.firstname.trim(), { min: 2, max: 60 })) { - errors.firstname = 'Vorname muss mindestens 2 Zeichen und maximal 60 Zeichen lang sein.'; - } - - // Lastname - if (validator.isEmpty(formData.lastname.trim())) { - errors.lastname = 'Nachname ist erforderlich.'; - } else if (!validator.isLength(formData.lastname.trim(), { min: 2, max: 60 })) { - errors.lastname = 'Nachname muss mindestens 2 Zeichen und maximal 60 Zeichen lang sein.'; - } - - // Email - if (validator.isEmpty(formData.email.trim())) { - errors.email = 'E-Mail ist erforderlich.'; - } else if (!validator.isEmail(formData.email.trim())) { - errors.email = 'Bitte gib eine gültige E-Mail-Adresse ein.'; - } - - // Message - if (validator.isEmpty(formData.message.trim())) { - errors.message = 'Nachricht ist erforderlich.'; - } else if (!validator.isLength(formData.message.trim(), { min: 10, max: 1000 })) { - errors.message = 'Die Nachricht muss mindestens 10 und maximal 1000 Zeichen lang sein.'; - } - - return errors; -}; - -export default validate; diff --git a/05_react/unterricht/tag52/01_react-app-performance/vite.config.js b/05_react/unterricht/tag52/01_react-app-performance/vite.config.js deleted file mode 100644 index b4a17ce..0000000 --- a/05_react/unterricht/tag52/01_react-app-performance/vite.config.js +++ /dev/null @@ -1,16 +0,0 @@ -import { defineConfig } from 'vite'; -import react from '@vitejs/plugin-react'; - -// https://vite.dev/config/ -export default defineConfig({ - plugins: [react()], - test: { - // Vitest configuration - globals: true, // make the global objects available in the test environment - environment: 'jsdom', // use jsdom as the test environment - setupFiles: './src/test/setup.js', // if you have a setup file - // more options here - // testTimeout: 2000, // 10 Sekunden für alle Tests - // hookTimeout: 2000, // Optional: Timeout für beforeAll, afterAll, etc. - }, -}); diff --git a/05_react/unterricht/tag52/react-app/.gitignore b/05_react/unterricht/tag52/react-app/.gitignore deleted file mode 100644 index a547bf3..0000000 --- a/05_react/unterricht/tag52/react-app/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/05_react/unterricht/tag52/react-app/.oxlintrc.json b/05_react/unterricht/tag52/react-app/.oxlintrc.json deleted file mode 100644 index 1255078..0000000 --- a/05_react/unterricht/tag52/react-app/.oxlintrc.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$schema": "./node_modules/oxlint/configuration_schema.json", - "plugins": ["react", "oxc"], - "rules": { - "react/rules-of-hooks": "error", - "react/only-export-components": ["warn", { "allowConstantExport": true }] - } -} diff --git a/05_react/unterricht/tag52/react-app/README.md b/05_react/unterricht/tag52/react-app/README.md deleted file mode 100644 index d937833..0000000 --- a/05_react/unterricht/tag52/react-app/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# React + Vite - -This template provides a minimal setup to get React working in Vite with HMR and some Oxlint rules. - -Currently, two official plugins are available: - -- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs) -- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) - -## React Compiler - -The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). - -## Expanding the Oxlint configuration - -If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and Oxlint's TypeScript related rules in your project. diff --git a/05_react/unterricht/tag52/react-app/index.html b/05_react/unterricht/tag52/react-app/index.html deleted file mode 100644 index a42fb30..0000000 --- a/05_react/unterricht/tag52/react-app/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - react-app - - -
      - - - diff --git a/05_react/unterricht/tag52/react-app/package-lock.json b/05_react/unterricht/tag52/react-app/package-lock.json deleted file mode 100644 index cd9d4bb..0000000 --- a/05_react/unterricht/tag52/react-app/package-lock.json +++ /dev/null @@ -1,2611 +0,0 @@ -{ - "name": "react-app", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "react-app", - "version": "0.0.0", - "dependencies": { - "@splidejs/react-splide": "^0.7.12", - "axios": "^1.19.0", - "bootstrap": "^5.3.8", - "react": "^19.2.8", - "react-dom": "^19.2.8", - "react-icons": "^5.7.0", - "react-router-dom": "^7.18.2" - }, - "devDependencies": { - "@types/react": "^19.2.18", - "@types/react-dom": "^19.2.5", - "@vitejs/plugin-react": "^6.1.0", - "oxlint": "^1.80.0", - "sass-embedded": "^1.103.1", - "vite": "^8.2.2" - } - }, - "node_modules/@bufbuild/protobuf": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.14.0.tgz", - "integrity": "sha512-C3UGsiCwSprE2NKIIFA3hCDlpXTMCAXRZuEVp88L1GY36Y41+rYL5fryE+nOFhp4p4JPQvdV8PQ4DWgHgeTE+w==", - "dev": true, - "license": "(Apache-2.0 AND BSD-3-Clause)" - }, - "node_modules/@oxc-project/types": { - "version": "0.146.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.146.0.tgz", - "integrity": "sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@oxlint/binding-android-arm-eabi": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.80.0.tgz", - "integrity": "sha512-RM3Plj+biQpxa5d1GOOX6ciDlcUROmm4OZ/pLTpitkQt2mJv4jhtY4cbgaetOm5UKWZe05/TGQ6o1Vl8EOHkrA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-android-arm64": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.80.0.tgz", - "integrity": "sha512-YlO5JEf0Yr2bUUlu8O8daVcUxtcGGbcSmyV7E7nSbJbfAdxTE0PFPwgnIlw7wXJaTYjb+qs5hI5q3jxUkI7cAw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-darwin-arm64": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.80.0.tgz", - "integrity": "sha512-BULDOyO3AhsmdWfQeIUCykDt3dd7XZBGLhp1eIh56skRv01O+cNjNPwXMIbeW1x4+pxcln5if72wcRgViVo7PA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-darwin-x64": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.80.0.tgz", - "integrity": "sha512-YJ4JzLw7N5TDSQFlA0hAQGHvnDZgyypm1yunObVWcWiF9KM7eGCJKYKLgTC2Fi/57OdnBhbj4OkzPGdFQJ6HyA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-freebsd-x64": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.80.0.tgz", - "integrity": "sha512-AYUIk5QnL0s8oWAYsREZwkRYy1SupJTXALo93J1TgzHywxQtdM99FecRMQ87MXEdPQ0j1TmEpeeq3fGNkpvMqg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm-gnueabihf": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.80.0.tgz", - "integrity": "sha512-9hBZVANupQ89W9dXyE0n8doCyaW5pDyGn3y6XlIMPZ+rIKuyqkr3SNUXmVJIhuvUq0NBU3RBiSXXE69l4XI6KA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm-musleabihf": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.80.0.tgz", - "integrity": "sha512-SvS2uKqzY+pbfuvAHzH4338R6Zwo805GAwrIMVvK1KxoOWCIjZUdfzTCvilD7z6JK91v011+zYMryabhDo2AsQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm64-gnu": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.80.0.tgz", - "integrity": "sha512-tCLadyqRVL3pQTRPNg7cjXKvcvS4fbyXeQHhKk5BTJ1oftQln5/yIIWbu/Xom/DX41zv2P9QGt6+D/TtQVtY3A==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm64-musl": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.80.0.tgz", - "integrity": "sha512-XfpCNRlOPcLlJl4Bn/FUhjqlR6BVavEykERBf/MV7YA9VZDa5g5znVqYhyviMafcxS9Pe/i/kPvHNO0U6svEHQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-ppc64-gnu": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.80.0.tgz", - "integrity": "sha512-3I4yMwcFG9NeO8ioY6JBBuKsIm5GL/x7MATt1S4tVWaxPu5HcJ+XnLUbcVBTxG8q2Wu56HSj+NmXQiVYb1lp6A==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-riscv64-gnu": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.80.0.tgz", - "integrity": "sha512-E1wAKymkpe1/E8helzBKdm81OBOF+ezxRyXRMEuik3ZpWDER5CPOKZwF66RsdwW98uwZv8UTFremUQtC1CzdJA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-riscv64-musl": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.80.0.tgz", - "integrity": "sha512-+gLRGD4sIo3+VA++iham5UxD9tKSoJ/VOrROCEXIcknrYtQg6iIQgvjN0cpiRF7N6UYC7pJbvHJlDnMge5LRpQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-s390x-gnu": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.80.0.tgz", - "integrity": "sha512-aR0PrzHj9leW3NmzBAAP4EzdoBNoJcs9sjnIQPIwyRnBGYrRbXUIpEB5Q39AqK3PLY5JK5uEhDQDiUa1QSAstw==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-x64-gnu": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.80.0.tgz", - "integrity": "sha512-vSVh5cSo3Xxs6ghBCcFJlpbkbENzDog1qXtoXLa/HC3aCrR4XO76GZbXmQoCPHnu99nQpdCeC3H9tdNICfDh7A==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-x64-musl": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.80.0.tgz", - "integrity": "sha512-FfzBXpNQ8u7/ZI/p8bl73MeZ508Ax3hxWp3SiJpEFiC+BB9XcXy5FAZHTLKDPSzrUpxQZSZJAVdDmuJp/+HDBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-openharmony-arm64": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.80.0.tgz", - "integrity": "sha512-zMzbkumtmprCgRwoYNzcB3iC39fXdJIMLMU33KdCjEGLlJGOEt1+LwQ4LF8ndLzAEKVz4BR0y3V6Xrkk3Nm3yA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-arm64-msvc": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.80.0.tgz", - "integrity": "sha512-ib6iRcrXsk4t1fm3iKcwksyWh1ZkZXC/2mEzakl0ai2+6HZunf1WWMZ/xP9EJAvw9g9K4UVTC3NF/+G2qLrbTQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-ia32-msvc": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.80.0.tgz", - "integrity": "sha512-xhRWBMpLxZvgKAH6+DJZmpP+W8Y8UdQOSU1JfxSWNXsaBaRGW77j+1hCuNHlzj7OH4SPN8fYd1q0o2qrDtoVyw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-x64-msvc": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.80.0.tgz", - "integrity": "sha512-yAnO7lwBYQnz2pcfBPIGQQZWIX5zd5R/1aAKIF3oE+TVj7IhoHcROjOkz3sRDngzqhfPKfFaXqug5j5rE5dn6Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz", - "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.3", - "is-glob": "^4.0.3", - "node-addon-api": "^7.0.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.6.0", - "@parcel/watcher-darwin-arm64": "2.6.0", - "@parcel/watcher-darwin-x64": "2.6.0", - "@parcel/watcher-freebsd-x64": "2.6.0", - "@parcel/watcher-linux-arm-glibc": "2.6.0", - "@parcel/watcher-linux-arm-musl": "2.6.0", - "@parcel/watcher-linux-arm64-glibc": "2.6.0", - "@parcel/watcher-linux-arm64-musl": "2.6.0", - "@parcel/watcher-linux-x64-glibc": "2.6.0", - "@parcel/watcher-linux-x64-musl": "2.6.0", - "@parcel/watcher-win32-arm64": "2.6.0", - "@parcel/watcher-win32-x64": "2.6.0" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz", - "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz", - "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz", - "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz", - "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz", - "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz", - "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz", - "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz", - "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz", - "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz", - "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz", - "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz", - "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "license": "MIT", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@rolldown/binding-android-arm-eabi": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.5.tgz", - "integrity": "sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.5.tgz", - "integrity": "sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.5.tgz", - "integrity": "sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.5.tgz", - "integrity": "sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.5.tgz", - "integrity": "sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.5.tgz", - "integrity": "sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.5.tgz", - "integrity": "sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.5.tgz", - "integrity": "sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.5.tgz", - "integrity": "sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.5.tgz", - "integrity": "sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.5.tgz", - "integrity": "sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.5.tgz", - "integrity": "sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.5.tgz", - "integrity": "sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.5.tgz", - "integrity": "sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.5.tgz", - "integrity": "sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@splidejs/react-splide": { - "version": "0.7.12", - "resolved": "https://registry.npmjs.org/@splidejs/react-splide/-/react-splide-0.7.12.tgz", - "integrity": "sha512-UfXH+j47jsMc4x5HA/aOwuuHPqn6y9+ZTNYPWDRD8iLKvIVMZlzq2unjUEvyDAU+TTVPZOXkG2Ojeoz0P4AkZw==", - "license": "MIT", - "dependencies": { - "@splidejs/splide": "^4.1.3" - } - }, - "node_modules/@splidejs/splide": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@splidejs/splide/-/splide-4.1.4.tgz", - "integrity": "sha512-5I30evTJcAJQXt6vJ26g2xEkG+l1nXcpEw4xpKh0/FWQ8ozmAeTbtniVtVmz2sH1Es3vgfC4SS8B2X4o5JMptA==", - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.2.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", - "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.2.5", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.5.tgz", - "integrity": "sha512-fMPwH9v7r/pp43yUd2/Mbiex5KouJwwR3dzHkhLREUC6764VyDsqxhAxv6OFEYR1RhjOyD1naqba8ECDBe7ZQg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.1.0.tgz", - "integrity": "sha512-qd2BzUBehkov86WFhg0JkEFEYyCLG9uPCe6qWTY/kRlss9OvJrOF2UbIWT7p+8IzZHkEu0DNGHc4HSv+JdDLsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rolldown/pluginutils": "^1.0.1" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", - "babel-plugin-react-compiler": "^1.0.0", - "oxc-transform-react": "^0.145.0", - "vite": "^8.0.0" - }, - "peerDependenciesMeta": { - "@rolldown/plugin-babel": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true - }, - "oxc-transform-react": { - "optional": true - } - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.19.0.tgz", - "integrity": "sha512-ht/iuYZXEjFxLH/Hkezgd7m6JKlHHXEUSneaDz8uZe1Gj5QZtCnpyDsckvAiEnT89OEbCLmnte4R4sn7P0EKFw==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.16.0", - "form-data": "^4.0.6", - "https-proxy-agent": "^5.0.1", - "proxy-from-env": "^2.1.0" - } - }, - "node_modules/bootstrap": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz", - "integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/twbs" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - } - ], - "license": "MIT", - "peerDependencies": { - "@popperjs/core": "^2.11.8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/colorjs.io": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.7.1.tgz", - "integrity": "sha512-LY7OHnJZxHwT5UlzNa9bbhHHDbzB6yE5+3MIPwJEQKRvSCt/T4G7epsj+9j2BExUIIfXFIJGsIXUKdfrK9Q5tA==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/color" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cookie": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", - "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", - "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", - "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.4", - "mime-types": "^2.1.35" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", - "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/immutable": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", - "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lightningcss": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", - "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.33.0", - "lightningcss-darwin-arm64": "1.33.0", - "lightningcss-darwin-x64": "1.33.0", - "lightningcss-freebsd-x64": "1.33.0", - "lightningcss-linux-arm-gnueabihf": "1.33.0", - "lightningcss-linux-arm64-gnu": "1.33.0", - "lightningcss-linux-arm64-musl": "1.33.0", - "lightningcss-linux-x64-gnu": "1.33.0", - "lightningcss-linux-x64-musl": "1.33.0", - "lightningcss-win32-arm64-msvc": "1.33.0", - "lightningcss-win32-x64-msvc": "1.33.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", - "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", - "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", - "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", - "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", - "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", - "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", - "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", - "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", - "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", - "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", - "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.18", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", - "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/oxlint": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.80.0.tgz", - "integrity": "sha512-5nTiSps4qdbCWLbxzuO00alHkEO2exR9YMN/ig6QXWrLsYSG0KaObOAM+l6oU2LcKPWoSAGYbkZIGEu1ViiWKA==", - "dev": true, - "license": "MIT", - "bin": { - "oxlint": "bin/oxlint" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/Boshen" - }, - "optionalDependencies": { - "@oxlint/binding-android-arm-eabi": "1.80.0", - "@oxlint/binding-android-arm64": "1.80.0", - "@oxlint/binding-darwin-arm64": "1.80.0", - "@oxlint/binding-darwin-x64": "1.80.0", - "@oxlint/binding-freebsd-x64": "1.80.0", - "@oxlint/binding-linux-arm-gnueabihf": "1.80.0", - "@oxlint/binding-linux-arm-musleabihf": "1.80.0", - "@oxlint/binding-linux-arm64-gnu": "1.80.0", - "@oxlint/binding-linux-arm64-musl": "1.80.0", - "@oxlint/binding-linux-ppc64-gnu": "1.80.0", - "@oxlint/binding-linux-riscv64-gnu": "1.80.0", - "@oxlint/binding-linux-riscv64-musl": "1.80.0", - "@oxlint/binding-linux-s390x-gnu": "1.80.0", - "@oxlint/binding-linux-x64-gnu": "1.80.0", - "@oxlint/binding-linux-x64-musl": "1.80.0", - "@oxlint/binding-openharmony-arm64": "1.80.0", - "@oxlint/binding-win32-arm64-msvc": "1.80.0", - "@oxlint/binding-win32-ia32-msvc": "1.80.0", - "@oxlint/binding-win32-x64-msvc": "1.80.0" - }, - "peerDependencies": { - "oxlint-tsgolint": ">=7.0.2001", - "vite-plus": "*" - }, - "peerDependenciesMeta": { - "oxlint-tsgolint": { - "optional": true - }, - "vite-plus": { - "optional": true - } - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", - "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", - "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.17", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/proxy-from-env": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", - "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/react": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", - "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", - "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.8" - } - }, - "node_modules/react-icons": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.7.0.tgz", - "integrity": "sha512-LBLy340Rzqy6+/yVhZKT3B/QpP1BZaesGqasf09HPOBzRarcDIFH0WwXlXQfE7q7ipxK4MSiC5DIBWURCny6fw==", - "license": "MIT", - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-router": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.2.tgz", - "integrity": "sha512-aUVMjFm3GAPTTZL7oYr5E7ETiqfQCHRLH+B+5afnICvf0r7kkK4eR6SMuwbSTJw/7t+12khT/Kahij49fqOCIg==", - "license": "MIT", - "dependencies": { - "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/react-router-dom": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.2.tgz", - "integrity": "sha512-AIKJ/jgGlFb3EbfCXk5Gzshiwt+l3mqbCrNjmEWMMjqQxNJ3svBa6bgzFyCC2Sw3RA0VWF1kg3uQf2OFhxb8hw==", - "license": "MIT", - "dependencies": { - "react-router": "7.18.2" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - } - }, - "node_modules/readdirp": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", - "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/rolldown": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.5.tgz", - "integrity": "sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "=0.146.0", - "@rolldown/pluginutils": "^1.0.0" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm-eabi": "1.2.5", - "@rolldown/binding-android-arm64": "1.2.5", - "@rolldown/binding-darwin-arm64": "1.2.5", - "@rolldown/binding-darwin-x64": "1.2.5", - "@rolldown/binding-freebsd-x64": "1.2.5", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.5", - "@rolldown/binding-linux-arm64-gnu": "1.2.5", - "@rolldown/binding-linux-arm64-musl": "1.2.5", - "@rolldown/binding-linux-ppc64-gnu": "1.2.5", - "@rolldown/binding-linux-s390x-gnu": "1.2.5", - "@rolldown/binding-linux-x64-gnu": "1.2.5", - "@rolldown/binding-linux-x64-musl": "1.2.5", - "@rolldown/binding-openharmony-arm64": "1.2.5", - "@rolldown/binding-win32-arm64-msvc": "1.2.5", - "@rolldown/binding-win32-x64-msvc": "1.2.5" - } - }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/sass": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.103.1.tgz", - "integrity": "sha512-9icZURbP51S6S0QGoyaeqk9uB06GNWxsFYWfH5RgpFgqK5FA8tJcM3AdVxrZEVJ7dz+L87nG95gBKf4VuaMHGw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "chokidar": "^5.0.0", - "immutable": "^5.1.5", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=20.19.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" - } - }, - "node_modules/sass-embedded": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.103.1.tgz", - "integrity": "sha512-UVIuFZPzz+4DXYbHzQ5gKaKkyP2IH3Sc/WoF63N2V7QIfnC2E9UpQAtiKlCVJTfBe43HRgHDBLnXpZkYAEBsNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@bufbuild/protobuf": "^2.5.0", - "colorjs.io": "^0.7.0", - "immutable": "^5.1.5", - "rxjs": "^7.4.0", - "supports-color": "^8.1.1", - "sync-child-process": "^1.0.2", - "varint": "^6.0.0" - }, - "bin": { - "sass": "dist/bin/sass.js" - }, - "engines": { - "node": ">=20.19.0" - }, - "optionalDependencies": { - "sass-embedded-all-unknown": "1.103.1", - "sass-embedded-android-arm": "1.103.1", - "sass-embedded-android-arm64": "1.103.1", - "sass-embedded-android-riscv64": "1.103.1", - "sass-embedded-android-x64": "1.103.1", - "sass-embedded-darwin-arm64": "1.103.1", - "sass-embedded-darwin-x64": "1.103.1", - "sass-embedded-linux-arm": "1.103.1", - "sass-embedded-linux-arm64": "1.103.1", - "sass-embedded-linux-musl-arm": "1.103.1", - "sass-embedded-linux-musl-arm64": "1.103.1", - "sass-embedded-linux-musl-riscv64": "1.103.1", - "sass-embedded-linux-musl-x64": "1.103.1", - "sass-embedded-linux-riscv64": "1.103.1", - "sass-embedded-linux-x64": "1.103.1", - "sass-embedded-unknown-all": "1.103.1", - "sass-embedded-win32-arm64": "1.103.1", - "sass-embedded-win32-x64": "1.103.1" - } - }, - "node_modules/sass-embedded-all-unknown": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.103.1.tgz", - "integrity": "sha512-MwX2ap06TbImAqlbnH6EndgBBejk6Eq2QB6Ae2hukCn9wmXf9cRu27um3mz3tyB4oJOOku0xfHqFH/+ckYj6YA==", - "cpu": [ - "!arm", - "!arm64", - "!riscv64", - "!x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "sass": "1.103.1" - } - }, - "node_modules/sass-embedded-android-arm": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.103.1.tgz", - "integrity": "sha512-p36WHpsu5HEo2+NVNbI2Nmb8VgVH0xwOQyzghvZhF7ikGCzEVYI5BP28vHUZlCcgj2TUvMEJKI2lV336a+F/sg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-arm64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.103.1.tgz", - "integrity": "sha512-jBXWMksyz55XeLOWvQs64BqiG5DcqflmMxcvMoA2oHtQT/7XZ02hBn502qpcF/q8Qd+qqG/hU5ccM+hGXrbQZw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-riscv64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.103.1.tgz", - "integrity": "sha512-rzrH7RNntk0rx+zCE9xOiAIUt37D1cQKvFfcoX0xiePdGbNHBN8DWKaWN9vaCRfbgKCmxPjevzaqFNI/G/8E1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-x64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.103.1.tgz", - "integrity": "sha512-EQglAJXJutuIcqgZf7YOwzao2ND6ow/OgqN+cM48/Qaeb6AimYmZiUJmM9FFcmS3Q2n1k6/2OU3l3Hlin7bFpw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-darwin-arm64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.103.1.tgz", - "integrity": "sha512-rlaBeCul8pLbDRKdBAxdDxSBwFU5fbX42ci6CxW2Vbs34jWTMQ72+nE2v2KkGGce+JnYbb7UV6xDP/4uDWWi+w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-darwin-x64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.103.1.tgz", - "integrity": "sha512-VSKFfhI//AOct6ppFmAaSH7tlW2LOFECMGs77jIoWf0ZjvGch/3sc9lUTTdIaYIOnTS4qpZck+8OcI2D0G92QA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-arm": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.103.1.tgz", - "integrity": "sha512-tJRLPUtBwXHTnBnG7I39gQvCLreuOHLLCMyKHPR1hQ7aFNwiZjADYzKMRQPNMUqti/Os9z+6I7V13FqgQHfuzg==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-arm64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.103.1.tgz", - "integrity": "sha512-rC+80/Xr9svo0ka2Zr/sjD+N1zEHTw2Urm/nsEjaVp5HSH2i22jwhTKTIqie2OLl6ti+qdYnbI0sSfxOYRtgrg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-arm": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.103.1.tgz", - "integrity": "sha512-N8L/kgVzXpnH+8d6ErIzqvb0l8kHODR3OfPaf0Azw6DOLGtEjwDRUbHno+G7iogGzyPOjKsM8OdyqHJj/bpTdw==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-arm64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.103.1.tgz", - "integrity": "sha512-jMgG/C/VMo7+ShMFdk0xjJmQmYkj1PbJu/yrQiaQHpuo5pE2G+vnkEgsuM5EM3lTQ4MbMfnf715qy1fkbNPiUQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-riscv64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.103.1.tgz", - "integrity": "sha512-LZm8rEvI6sKU87qPOlODsYeAs7CmWy0B4ShYkjG4OMcGCcV4Ffxn25XW4TFqmruThITQvJ8WT+WGblzdoxYgbA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-x64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.103.1.tgz", - "integrity": "sha512-rmKzgk4t6RpaDhSefbbnk5yrA4pk1nHlVhJECGay8yMfzK8eglATeY9fzPgt89xCuQk6rkOiy11e+m8tLYOW5Q==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": "musl", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-riscv64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.103.1.tgz", - "integrity": "sha512-xydQmtxla31uMrmN6z+mAogVGdEMDmkUElVq2+udomX/TPZDYJBkApEyJl237M2VLWVv29v1N4U4i2Z4xa7SDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-x64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.103.1.tgz", - "integrity": "sha512-Rln1oWm0MWKzzemOgQWrRFzfVBARwS9qxAidZPpCQHSohzPnWizFkmY1CUJad/YJNsA7sscueMdX63OEvxoM8w==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": "glibc", - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-unknown-all": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.103.1.tgz", - "integrity": "sha512-p7kI4US8+n+YguKczXh+4KcodJnk+8cwv+QFdvMaz3OfPrdHV0EnhPsaVDWD9qXb1XXCEdUhpp6vQwGk3eKc3A==", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "!android", - "!darwin", - "!linux", - "!win32" - ], - "dependencies": { - "sass": "1.103.1" - } - }, - "node_modules/sass-embedded-win32-arm64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.103.1.tgz", - "integrity": "sha512-/0renOj3SpZGu4TA8CZJ6qZbTxGZk1khkPfiBTmV1uFB40ESYM5VsdXNj76P07bsAjIj9X2fCjTafLQFLSd9Nw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-win32-x64": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.103.1.tgz", - "integrity": "sha512-fIg60j9u5YlLUU3W8FvySMR4HHIo9R12HHFQTW7njyQ8nXqgR+t+XfCzGJloQka8g583BlAfu31Q76Ljr5o+9g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" - }, - "node_modules/set-cookie-parser": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", - "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", - "license": "MIT" - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/sync-child-process": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz", - "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "sync-message-port": "^1.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/sync-message-port": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.2.0.tgz", - "integrity": "sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/varint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", - "dev": true, - "license": "MIT" - }, - "node_modules/vite": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", - "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "lightningcss": "^1.33.0", - "picomatch": "^4.0.5", - "postcss": "^8.5.26", - "rolldown": "~1.2.4", - "tinyglobby": "^0.2.17" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.4.0 || ^0.5.0", - "esbuild": "^0.27.0 || ^0.28.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - } - } -} diff --git a/05_react/unterricht/tag52/react-app/package.json b/05_react/unterricht/tag52/react-app/package.json deleted file mode 100644 index b5a9606..0000000 --- a/05_react/unterricht/tag52/react-app/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "react-app", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "lint": "oxlint", - "preview": "vite preview" - }, - "dependencies": { - "@splidejs/react-splide": "^0.7.12", - "axios": "^1.19.0", - "bootstrap": "^5.3.8", - "react": "^19.2.8", - "react-dom": "^19.2.8", - "react-icons": "^5.7.0", - "react-router-dom": "^7.18.2" - }, - "devDependencies": { - "@types/react": "^19.2.18", - "@types/react-dom": "^19.2.5", - "@vitejs/plugin-react": "^6.1.0", - "oxlint": "^1.80.0", - "sass-embedded": "^1.103.1", - "vite": "^8.2.2" - } -} diff --git a/05_react/unterricht/tag52/react-app/public/data/nerdshop-products.json b/05_react/unterricht/tag52/react-app/public/data/nerdshop-products.json deleted file mode 100644 index f8db02d..0000000 --- a/05_react/unterricht/tag52/react-app/public/data/nerdshop-products.json +++ /dev/null @@ -1,119 +0,0 @@ -[ - { - "_id": "675bee96bb39023b77e6cd92", - "title": "Smart Coffee Mug with LCD Level Indicator", - "sku": "MUG0007", - "stock": 25, - "price": 49.99, - "description": "Know exactly how much coffee you have left with this LCD-equipped mug.", - "tagline": "Never face an empty mug again." - }, - { - "_id": "675bee96bb39023b77e6cd93", - "title": "Bluetooth Coffee Mug with Fortune Telling Scanner", - "sku": "MUG0013", - "stock": 15, - "price": 99.99, - "description": "Get your daily fortune with every sip using this Bluetooth-connected mug.", - "tagline": "Coffee reading, made smart." - }, - { - "_id": "675bee96bb39023b77e6cd94", - "title": "South Pole Tested Pre-Warmed Ink Pen", - "sku": "OFF3145", - "stock": 34, - "price": 29.95, - "description": "Write smoothly even in the coldest conditions with this pre-warmed ink pen.", - "tagline": "The pen that conquers the cold." - }, - { - "_id": "675bee96bb39023b77e6cd95", - "title": "Ambidextrous Computer Mouse", - "sku": "COM1001", - "stock": 50, - "price": 19.9, - "description": "Finally, a mouse designed for both left and right-handed users.", - "tagline": "End the left-right struggle." - }, - { - "_id": "675bee96bb39023b77e6cd96", - "title": "Easter Egg Themed Webcam", - "sku": "COM0404", - "stock": 8, - "price": 14.99, - "description": "Add some festive flair to your video calls with this Easter egg webcam.", - "tagline": "Happy Easter, every day." - }, - { - "_id": "675bee96bb39023b77e6cd97", - "title": "Vulcan Language vi Cheatsheet", - "sku": "COM0001", - "stock": 6, - "price": 9.9, - "description": "Master the Vulcan language and vi editor simultaneously with this handy cheatsheet.", - "tagline": "Learn vi and Vulcan, live long and prosper." - }, - { - "_id": "675bee96bb39023b77e6cd98", - "title": "Klingon Language emacs Cheatsheet", - "sku": "COM1536", - "stock": 33, - "price": 9.9, - "description": "Conquer the Klingon language and emacs with this comprehensive cheatsheet.", - "tagline": "Learn emacs and Klingon, qapla'!" - }, - { - "_id": "675bee96bb39023b77e6cda0", - "title": "Self-Folding Laundry Basket", - "sku": "HME0023", - "stock": 15, - "price": 79.99, - "description": "Say goodbye to laundry clutter with this self-folding basket.", - "tagline": "Laundry day just got easier." - }, - { - "_id": "675bee96bb39023b77e6cda1", - "title": "Noise-Cancelling Headphones for Cats", - "sku": "PET0112", - "stock": 39, - "price": 39.95, - "description": "Give your cat the gift of silence with these noise-canceling headphones.", - "tagline": "Purrfect tranquility for your feline friend." - }, - { - "_id": "675bee96bb39023b77e6cda2", - "title": "Glow-in-the-Dark Toilet Paper", - "sku": "HME0221", - "stock": 65, - "price": 12.5, - "description": "Navigate your midnight bathroom trips with ease using this glow-in-the-dark toilet paper.", - "tagline": "A guiding light in the darkness." - }, - { - "_id": "675bee96bb39023b77e6cda3", - "title": "Automatic Plant Waterer with Compliment Dispenser", - "sku": "GRD0334", - "stock": 17, - "price": 69.99, - "description": "Keep your plants happy and hydrated with automatic watering and daily compliments.", - "tagline": "Nurture your plants, boost their self-esteem." - }, - { - "_id": "675bee96bb39023b77e6cda4", - "title": "Self-Stirring Cereal Bowl", - "sku": "KIT0445", - "stock": 55, - "price": 24.95, - "description": "Enjoy perfectly crunchy cereal every time with this self-stirring bowl.", - "tagline": "No more soggy surprises." - }, - { - "_id": "675bee96bb39023b77e6cda5", - "title": "Polygon Planet Lamp", - "sku": "LMP0556", - "stock": 4, - "price": 39.9, - "description": "Transform your space with the enchanting glow of a planetarium-inspired lamp.", - "tagline": "Bring the cosmos into your home." - } -] diff --git a/05_react/unterricht/tag52/react-app/public/favicon.svg b/05_react/unterricht/tag52/react-app/public/favicon.svg deleted file mode 100644 index 6893eb1..0000000 --- a/05_react/unterricht/tag52/react-app/public/favicon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/05_react/unterricht/tag52/react-app/public/fonts/amatic-sc-v26-latin/amatic-sc-v26-latin-700.woff2 b/05_react/unterricht/tag52/react-app/public/fonts/amatic-sc-v26-latin/amatic-sc-v26-latin-700.woff2 deleted file mode 100644 index d0c13cc..0000000 Binary files a/05_react/unterricht/tag52/react-app/public/fonts/amatic-sc-v26-latin/amatic-sc-v26-latin-700.woff2 and /dev/null differ diff --git a/05_react/unterricht/tag52/react-app/public/fonts/amatic-sc-v26-latin/amatic-sc-v26-latin-regular.woff2 b/05_react/unterricht/tag52/react-app/public/fonts/amatic-sc-v26-latin/amatic-sc-v26-latin-regular.woff2 deleted file mode 100644 index 804b1aa..0000000 Binary files a/05_react/unterricht/tag52/react-app/public/fonts/amatic-sc-v26-latin/amatic-sc-v26-latin-regular.woff2 and /dev/null differ diff --git a/05_react/unterricht/tag52/react-app/public/fonts/merriweather-v30-latin/merriweather-v30-latin-300.woff2 b/05_react/unterricht/tag52/react-app/public/fonts/merriweather-v30-latin/merriweather-v30-latin-300.woff2 deleted file mode 100644 index a119883..0000000 Binary files a/05_react/unterricht/tag52/react-app/public/fonts/merriweather-v30-latin/merriweather-v30-latin-300.woff2 and /dev/null differ diff --git a/05_react/unterricht/tag52/react-app/public/fonts/merriweather-v30-latin/merriweather-v30-latin-300italic.woff2 b/05_react/unterricht/tag52/react-app/public/fonts/merriweather-v30-latin/merriweather-v30-latin-300italic.woff2 deleted file mode 100644 index 0c7b8ed..0000000 Binary files a/05_react/unterricht/tag52/react-app/public/fonts/merriweather-v30-latin/merriweather-v30-latin-300italic.woff2 and /dev/null differ diff --git a/05_react/unterricht/tag52/react-app/public/fonts/merriweather-v30-latin/merriweather-v30-latin-700.woff2 b/05_react/unterricht/tag52/react-app/public/fonts/merriweather-v30-latin/merriweather-v30-latin-700.woff2 deleted file mode 100644 index a6919a9..0000000 Binary files a/05_react/unterricht/tag52/react-app/public/fonts/merriweather-v30-latin/merriweather-v30-latin-700.woff2 and /dev/null differ diff --git a/05_react/unterricht/tag52/react-app/public/fonts/merriweather-v30-latin/merriweather-v30-latin-700italic.woff2 b/05_react/unterricht/tag52/react-app/public/fonts/merriweather-v30-latin/merriweather-v30-latin-700italic.woff2 deleted file mode 100644 index 2048135..0000000 Binary files a/05_react/unterricht/tag52/react-app/public/fonts/merriweather-v30-latin/merriweather-v30-latin-700italic.woff2 and /dev/null differ diff --git a/05_react/unterricht/tag52/react-app/public/fonts/merriweather-v30-latin/merriweather-v30-latin-900.woff2 b/05_react/unterricht/tag52/react-app/public/fonts/merriweather-v30-latin/merriweather-v30-latin-900.woff2 deleted file mode 100644 index 4e3aec9..0000000 Binary files a/05_react/unterricht/tag52/react-app/public/fonts/merriweather-v30-latin/merriweather-v30-latin-900.woff2 and /dev/null differ diff --git a/05_react/unterricht/tag52/react-app/public/fonts/merriweather-v30-latin/merriweather-v30-latin-900italic.woff2 b/05_react/unterricht/tag52/react-app/public/fonts/merriweather-v30-latin/merriweather-v30-latin-900italic.woff2 deleted file mode 100644 index d7cdeaa..0000000 Binary files a/05_react/unterricht/tag52/react-app/public/fonts/merriweather-v30-latin/merriweather-v30-latin-900italic.woff2 and /dev/null differ diff --git a/05_react/unterricht/tag52/react-app/public/fonts/merriweather-v30-latin/merriweather-v30-latin-italic.woff2 b/05_react/unterricht/tag52/react-app/public/fonts/merriweather-v30-latin/merriweather-v30-latin-italic.woff2 deleted file mode 100644 index 38bfa01..0000000 Binary files a/05_react/unterricht/tag52/react-app/public/fonts/merriweather-v30-latin/merriweather-v30-latin-italic.woff2 and /dev/null differ diff --git a/05_react/unterricht/tag52/react-app/public/fonts/merriweather-v30-latin/merriweather-v30-latin-regular.woff2 b/05_react/unterricht/tag52/react-app/public/fonts/merriweather-v30-latin/merriweather-v30-latin-regular.woff2 deleted file mode 100644 index 6515c26..0000000 Binary files a/05_react/unterricht/tag52/react-app/public/fonts/merriweather-v30-latin/merriweather-v30-latin-regular.woff2 and /dev/null differ diff --git a/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-300.woff2 b/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-300.woff2 deleted file mode 100644 index e000fcb..0000000 Binary files a/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-300.woff2 and /dev/null differ diff --git a/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-300italic.woff2 b/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-300italic.woff2 deleted file mode 100644 index 5167821..0000000 Binary files a/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-300italic.woff2 and /dev/null differ diff --git a/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-500.woff2 b/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-500.woff2 deleted file mode 100644 index a35be30..0000000 Binary files a/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-500.woff2 and /dev/null differ diff --git a/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-500italic.woff2 b/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-500italic.woff2 deleted file mode 100644 index 039e72f..0000000 Binary files a/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-500italic.woff2 and /dev/null differ diff --git a/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-600.woff2 b/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-600.woff2 deleted file mode 100644 index f67ef00..0000000 Binary files a/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-600.woff2 and /dev/null differ diff --git a/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-600italic.woff2 b/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-600italic.woff2 deleted file mode 100644 index bd6a4d1..0000000 Binary files a/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-600italic.woff2 and /dev/null differ diff --git a/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-700.woff2 b/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-700.woff2 deleted file mode 100644 index 7e3b8b0..0000000 Binary files a/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-700.woff2 and /dev/null differ diff --git a/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-700italic.woff2 b/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-700italic.woff2 deleted file mode 100644 index 2c96334..0000000 Binary files a/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-700italic.woff2 and /dev/null differ diff --git a/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-800.woff2 b/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-800.woff2 deleted file mode 100644 index cf65114..0000000 Binary files a/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-800.woff2 and /dev/null differ diff --git a/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-800italic.woff2 b/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-800italic.woff2 deleted file mode 100644 index 17bc073..0000000 Binary files a/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-800italic.woff2 and /dev/null differ diff --git a/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-italic.woff2 b/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-italic.woff2 deleted file mode 100644 index 84ee197..0000000 Binary files a/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-italic.woff2 and /dev/null differ diff --git a/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-regular.woff2 b/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-regular.woff2 deleted file mode 100644 index eaae942..0000000 Binary files a/05_react/unterricht/tag52/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-regular.woff2 and /dev/null differ diff --git a/05_react/unterricht/tag52/react-app/public/icons.svg b/05_react/unterricht/tag52/react-app/public/icons.svg deleted file mode 100644 index e952219..0000000 --- a/05_react/unterricht/tag52/react-app/public/icons.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/05_react/unterricht/tag52/react-app/public/img/header-bg.jpg b/05_react/unterricht/tag52/react-app/public/img/header-bg.jpg deleted file mode 100644 index 7113677..0000000 Binary files a/05_react/unterricht/tag52/react-app/public/img/header-bg.jpg and /dev/null differ diff --git a/05_react/unterricht/tag52/react-app/public/img/logo-react.min.svg b/05_react/unterricht/tag52/react-app/public/img/logo-react.min.svg deleted file mode 100644 index 5fb5f94..0000000 --- a/05_react/unterricht/tag52/react-app/public/img/logo-react.min.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/05_react/unterricht/tag52/react-app/public/img/logo-react.svg b/05_react/unterricht/tag52/react-app/public/img/logo-react.svg deleted file mode 100644 index 08c4248..0000000 --- a/05_react/unterricht/tag52/react-app/public/img/logo-react.svg +++ /dev/null @@ -1,1923 +0,0 @@ - - \ No newline at end of file diff --git a/05_react/unterricht/tag52/react-app/public/img/slides/slide-01.jpg b/05_react/unterricht/tag52/react-app/public/img/slides/slide-01.jpg deleted file mode 100644 index d98bbcc..0000000 Binary files a/05_react/unterricht/tag52/react-app/public/img/slides/slide-01.jpg and /dev/null differ diff --git a/05_react/unterricht/tag52/react-app/public/img/slides/slide-02.jpg b/05_react/unterricht/tag52/react-app/public/img/slides/slide-02.jpg deleted file mode 100644 index 2b2d966..0000000 Binary files a/05_react/unterricht/tag52/react-app/public/img/slides/slide-02.jpg and /dev/null differ diff --git a/05_react/unterricht/tag52/react-app/public/img/slides/slide-03.jpg b/05_react/unterricht/tag52/react-app/public/img/slides/slide-03.jpg deleted file mode 100644 index 70509f3..0000000 Binary files a/05_react/unterricht/tag52/react-app/public/img/slides/slide-03.jpg and /dev/null differ diff --git a/05_react/unterricht/tag52/react-app/src/App.jsx b/05_react/unterricht/tag52/react-app/src/App.jsx deleted file mode 100644 index 07230a3..0000000 --- a/05_react/unterricht/tag52/react-app/src/App.jsx +++ /dev/null @@ -1,19 +0,0 @@ -import FooterMain from './components/footers/FooterMain'; -import HeaderMain from './components/headers/HeaderMain'; - -import Router from './routes/Router'; - -function App(props) { - // const { } = props; - - return ( - <> - -
      - -
      - - - ); -} -export default App; diff --git a/05_react/unterricht/tag52/react-app/src/assets/img/logo-react.min.svg b/05_react/unterricht/tag52/react-app/src/assets/img/logo-react.min.svg deleted file mode 100644 index 5fb5f94..0000000 --- a/05_react/unterricht/tag52/react-app/src/assets/img/logo-react.min.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/05_react/unterricht/tag52/react-app/src/assets/img/logo-react.min2.svg b/05_react/unterricht/tag52/react-app/src/assets/img/logo-react.min2.svg deleted file mode 100644 index 692d30f..0000000 --- a/05_react/unterricht/tag52/react-app/src/assets/img/logo-react.min2.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/05_react/unterricht/tag52/react-app/src/assets/img/logo-react.svg b/05_react/unterricht/tag52/react-app/src/assets/img/logo-react.svg deleted file mode 100644 index 08c4248..0000000 --- a/05_react/unterricht/tag52/react-app/src/assets/img/logo-react.svg +++ /dev/null @@ -1,1923 +0,0 @@ - - \ No newline at end of file diff --git a/05_react/unterricht/tag52/react-app/src/assets/react.svg b/05_react/unterricht/tag52/react-app/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/05_react/unterricht/tag52/react-app/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/05_react/unterricht/tag52/react-app/src/assets/vite.svg b/05_react/unterricht/tag52/react-app/src/assets/vite.svg deleted file mode 100644 index 5101b67..0000000 --- a/05_react/unterricht/tag52/react-app/src/assets/vite.svg +++ /dev/null @@ -1 +0,0 @@ -Vite diff --git a/05_react/unterricht/tag52/react-app/src/components/footers/FooterMain.jsx b/05_react/unterricht/tag52/react-app/src/components/footers/FooterMain.jsx deleted file mode 100644 index 8b48fef..0000000 --- a/05_react/unterricht/tag52/react-app/src/components/footers/FooterMain.jsx +++ /dev/null @@ -1,46 +0,0 @@ -const FooterMain = (props) => { - // const { } = props; - - return ( -
      -
      -
      -
      -
      -

      Contact

      -
      - John Smith -
      - 1 Example Street -
      - Anytown, AB1 2CD -
      -
      -
      -
      -
      -

      More Information

      - -
      -
      -
      -
      -

      Social Media

      - {/* NavSocial */} -
      -
      -
      -
      -
      - ); -}; -export default FooterMain; diff --git a/05_react/unterricht/tag52/react-app/src/components/headers/HeaderMain.jsx b/05_react/unterricht/tag52/react-app/src/components/headers/HeaderMain.jsx deleted file mode 100644 index f06dc74..0000000 --- a/05_react/unterricht/tag52/react-app/src/components/headers/HeaderMain.jsx +++ /dev/null @@ -1,21 +0,0 @@ -import LogoMain from '../logos/LogoMain'; -import SliderSplide from '../sliders/SliderSplide'; - -const HeaderMain = () => { - const images = [ - { path: '/img/slides/slide-01.jpg', title: 'Classroom' }, - { path: '/img/slides/slide-02.jpg', title: 'Mountains' }, - { path: '/img/slides/slide-03.jpg', title: 'Canyons' }, - ]; - - return ( -
      - -
      - -
      -
      - ); -}; - -export default HeaderMain; diff --git a/05_react/unterricht/tag52/react-app/src/components/logos/LogoMain.jsx b/05_react/unterricht/tag52/react-app/src/components/logos/LogoMain.jsx deleted file mode 100644 index e33f1d3..0000000 --- a/05_react/unterricht/tag52/react-app/src/components/logos/LogoMain.jsx +++ /dev/null @@ -1,12 +0,0 @@ -import Logo from '../../assets/img/logo-react.min.svg'; - -const LogoMain = (props) => { - // const { } = props; - - return ( -
      - React -
      - ); -}; -export default LogoMain; diff --git a/05_react/unterricht/tag52/react-app/src/components/sliders/SliderSplide.jsx b/05_react/unterricht/tag52/react-app/src/components/sliders/SliderSplide.jsx deleted file mode 100644 index eb27bfd..0000000 --- a/05_react/unterricht/tag52/react-app/src/components/sliders/SliderSplide.jsx +++ /dev/null @@ -1,33 +0,0 @@ -import { Splide, SplideSlide } from '@splidejs/react-splide'; - -const SliderSplide = (props) => { - const { - images = [], - label = 'Slides', - options = { - rewind: true, - height: '100%', - autoplay: true, - speed: 800, - type: 'fade', - }, - } = props; - - return ( - <> - {images.length > 0 && ( -
      - - {images.map(({ path, title }, idx) => ( - // - - {title} - - ))} - -
      - )} - - ); -}; -export default SliderSplide; diff --git a/05_react/unterricht/tag52/react-app/src/main.jsx b/05_react/unterricht/tag52/react-app/src/main.jsx deleted file mode 100644 index 6187b22..0000000 --- a/05_react/unterricht/tag52/react-app/src/main.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; -import { BrowserRouter } from 'react-router-dom'; - -// eigene separate Gestaltung mit main.scss (beinhaltet boostrap) -import './styles/main.scss'; - -import 'bootstrap'; // bootstrap JS wird über esbuild aus node_modules ausgelesen und eingebunden (bundled) - -import App from './App.jsx'; - -createRoot(document.getElementById('root')).render( - - - - - , -); diff --git a/05_react/unterricht/tag52/react-app/src/pages/About.jsx b/05_react/unterricht/tag52/react-app/src/pages/About.jsx deleted file mode 100644 index 6be700c..0000000 --- a/05_react/unterricht/tag52/react-app/src/pages/About.jsx +++ /dev/null @@ -1,13 +0,0 @@ -const About = (props) => { - // const { } = props; - - return ( -
      -
      -

      About

      -

      Welcome to the Single-Page-Application (SPA) with React. This is the About page.

      -
      -
      - ); -}; -export default About; diff --git a/05_react/unterricht/tag52/react-app/src/pages/Contact.jsx b/05_react/unterricht/tag52/react-app/src/pages/Contact.jsx deleted file mode 100644 index 68ff51a..0000000 --- a/05_react/unterricht/tag52/react-app/src/pages/Contact.jsx +++ /dev/null @@ -1,16 +0,0 @@ -const Contact = (props) => { - // const { } = props; - - return ( -
      -
      -

      Contact

      -

      - Lorem ipsum dolor, sit amet consectetur adipisicing elit. Iste suscipit eos autem iure soluta laboriosam in - perferendis atque explicabo, possimus eius? Ea magnam sed atque exercitationem officiis ipsum, deserunt iste. -

      -
      -
      - ); -}; -export default Contact; diff --git a/05_react/unterricht/tag52/react-app/src/pages/Home.jsx b/05_react/unterricht/tag52/react-app/src/pages/Home.jsx deleted file mode 100644 index ee88d61..0000000 --- a/05_react/unterricht/tag52/react-app/src/pages/Home.jsx +++ /dev/null @@ -1,13 +0,0 @@ -const Home = (props) => { - // const { } = props; - - return ( -
      -
      -

      Hello, Spa!

      -

      Welcome to the Single-Page-Application (SPA) with React. This is the Home page.

      -
      -
      - ); -}; -export default Home; diff --git a/05_react/unterricht/tag52/react-app/src/routes/Router.jsx b/05_react/unterricht/tag52/react-app/src/routes/Router.jsx deleted file mode 100644 index 8bd8f58..0000000 --- a/05_react/unterricht/tag52/react-app/src/routes/Router.jsx +++ /dev/null @@ -1,23 +0,0 @@ -import { Route, Routes } from 'react-router-dom'; -import Home from '../pages/Home'; -import About from '../pages/About'; -import Contact from '../pages/Contact'; - -// Projects - -const Router = (props) => { - // const { } = props; - - return ( - - } /> - } /> - } /> - - - - - - ); -}; -export default Router; diff --git a/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/_index.scss b/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/_index.scss deleted file mode 100644 index dcefbc9..0000000 --- a/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/_index.scss +++ /dev/null @@ -1,3 +0,0 @@ -// @import 'bootstrap-5.3.8/bootstrap-grid'; -@import 'bootstrap-5.3.8/bootstrap'; -// @import 'bulma-1.04/index' diff --git a/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss b/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss deleted file mode 100644 index e9f267f..0000000 --- a/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss +++ /dev/null @@ -1,153 +0,0 @@ -// -// Base styles -// - -.accordion { - // scss-docs-start accordion-css-vars - --#{$prefix}accordion-color: #{$accordion-color}; - --#{$prefix}accordion-bg: #{$accordion-bg}; - --#{$prefix}accordion-transition: #{$accordion-transition}; - --#{$prefix}accordion-border-color: #{$accordion-border-color}; - --#{$prefix}accordion-border-width: #{$accordion-border-width}; - --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; - --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; - --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; - --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; - --#{$prefix}accordion-btn-color: #{$accordion-button-color}; - --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; - --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; - --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; - --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; - --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; - --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; - --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; - --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; - --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; - // scss-docs-end accordion-css-vars -} - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); - @include font-size($font-size-base); - color: var(--#{$prefix}accordion-btn-color); - text-align: left; // Reset button style - background-color: var(--#{$prefix}accordion-btn-bg); - border: 0; - @include border-radius(0); - overflow-anchor: none; - @include transition(var(--#{$prefix}accordion-transition)); - - &:not(.collapsed) { - color: var(--#{$prefix}accordion-active-color); - background-color: var(--#{$prefix}accordion-active-bg); - box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list - - &::after { - background-image: var(--#{$prefix}accordion-btn-active-icon); - transform: var(--#{$prefix}accordion-btn-icon-transform); - } - } - - // Accordion icon - &::after { - flex-shrink: 0; - width: var(--#{$prefix}accordion-btn-icon-width); - height: var(--#{$prefix}accordion-btn-icon-width); - margin-left: auto; - content: ""; - background-image: var(--#{$prefix}accordion-btn-icon); - background-repeat: no-repeat; - background-size: var(--#{$prefix}accordion-btn-icon-width); - @include transition(var(--#{$prefix}accordion-btn-icon-transition)); - } - - &:hover { - z-index: 2; - } - - &:focus { - z-index: 3; - outline: 0; - box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); - } -} - -.accordion-header { - margin-bottom: 0; -} - -.accordion-item { - color: var(--#{$prefix}accordion-color); - background-color: var(--#{$prefix}accordion-bg); - border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); - - &:first-of-type { - @include border-top-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - &:not(:first-of-type) { - border-top: 0; - } - - // Only set a border-radius on the last item if the accordion is collapsed - &:last-of-type { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - &.collapsed { - @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - > .accordion-collapse { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - } - } -} - -.accordion-body { - padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); -} - - -// Flush accordion items -// -// Remove borders and border-radius to keep accordion items edge-to-edge. - -.accordion-flush { - > .accordion-item { - border-right: 0; - border-left: 0; - @include border-radius(0); - - &:first-child { border-top: 0; } - &:last-child { border-bottom: 0; } - - // stylelint-disable selector-max-class - > .accordion-collapse, - > .accordion-header .accordion-button, - > .accordion-header .accordion-button.collapsed { - @include border-radius(0); - } - // stylelint-enable selector-max-class - } -} - -@if $enable-dark-mode { - @include color-mode(dark) { - .accordion-button::after { - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; - } - } -} diff --git a/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss b/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss deleted file mode 100644 index b8cff9b..0000000 --- a/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss +++ /dev/null @@ -1,68 +0,0 @@ -// -// Base styles -// - -.alert { - // scss-docs-start alert-css-vars - --#{$prefix}alert-bg: transparent; - --#{$prefix}alert-padding-x: #{$alert-padding-x}; - --#{$prefix}alert-padding-y: #{$alert-padding-y}; - --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; - --#{$prefix}alert-color: inherit; - --#{$prefix}alert-border-color: transparent; - --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); - --#{$prefix}alert-border-radius: #{$alert-border-radius}; - --#{$prefix}alert-link-color: inherit; - // scss-docs-end alert-css-vars - - position: relative; - padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); - margin-bottom: var(--#{$prefix}alert-margin-bottom); - color: var(--#{$prefix}alert-color); - background-color: var(--#{$prefix}alert-bg); - border: var(--#{$prefix}alert-border); - @include border-radius(var(--#{$prefix}alert-border-radius)); -} - -// Headings for larger alerts -.alert-heading { - // Specified to prevent conflicts of changing $headings-color - color: inherit; -} - -// Provide class for links that match alerts -.alert-link { - font-weight: $alert-link-font-weight; - color: var(--#{$prefix}alert-link-color); -} - - -// Dismissible alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissible { - padding-right: $alert-dismissible-padding-r; - - // Adjust close link position - .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: $stretched-link-z-index + 1; - padding: $alert-padding-y * 1.25 $alert-padding-x; - } -} - - -// scss-docs-start alert-modifiers -// Generate contextual modifier classes for colorizing the alert -@each $state in map-keys($theme-colors) { - .alert-#{$state} { - --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); - --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); - --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); - --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); - } -} -// scss-docs-end alert-modifiers diff --git a/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss b/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss deleted file mode 100644 index cc3d269..0000000 --- a/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss +++ /dev/null @@ -1,38 +0,0 @@ -// Base class -// -// Requires one of the contextual, color modifier classes for `color` and -// `background-color`. - -.badge { - // scss-docs-start badge-css-vars - --#{$prefix}badge-padding-x: #{$badge-padding-x}; - --#{$prefix}badge-padding-y: #{$badge-padding-y}; - @include rfs($badge-font-size, --#{$prefix}badge-font-size); - --#{$prefix}badge-font-weight: #{$badge-font-weight}; - --#{$prefix}badge-color: #{$badge-color}; - --#{$prefix}badge-border-radius: #{$badge-border-radius}; - // scss-docs-end badge-css-vars - - display: inline-block; - padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x); - @include font-size(var(--#{$prefix}badge-font-size)); - font-weight: var(--#{$prefix}badge-font-weight); - line-height: 1; - color: var(--#{$prefix}badge-color); - text-align: center; - white-space: nowrap; - vertical-align: baseline; - @include border-radius(var(--#{$prefix}badge-border-radius)); - @include gradient-bg(); - - // Empty badges collapse automatically - &:empty { - display: none; - } -} - -// Quick fix for badges in buttons -.btn .badge { - position: relative; - top: -1px; -} diff --git a/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss b/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss deleted file mode 100644 index b8252ff..0000000 --- a/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss +++ /dev/null @@ -1,40 +0,0 @@ -.breadcrumb { - // scss-docs-start breadcrumb-css-vars - --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x}; - --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y}; - --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom}; - @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size); - --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg}; - --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius}; - --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color}; - --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x}; - --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color}; - // scss-docs-end breadcrumb-css-vars - - display: flex; - flex-wrap: wrap; - padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x); - margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom); - @include font-size(var(--#{$prefix}breadcrumb-font-size)); - list-style: none; - background-color: var(--#{$prefix}breadcrumb-bg); - @include border-radius(var(--#{$prefix}breadcrumb-border-radius)); -} - -.breadcrumb-item { - // The separator between breadcrumbs (by default, a forward-slash: "/") - + .breadcrumb-item { - padding-left: var(--#{$prefix}breadcrumb-item-padding-x); - - &::before { - float: left; // Suppress inline spacings and underlining of the separator - padding-right: var(--#{$prefix}breadcrumb-item-padding-x); - color: var(--#{$prefix}breadcrumb-divider-color); - content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; - } - } - - &.active { - color: var(--#{$prefix}breadcrumb-item-active-color); - } -} diff --git a/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss b/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss deleted file mode 100644 index 78e1252..0000000 --- a/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss +++ /dev/null @@ -1,147 +0,0 @@ -// Make the div behave like a button -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; // match .btn alignment given font-size hack above - - > .btn { - position: relative; - flex: 1 1 auto; - } - - // Bring the hover, focused, and "active" buttons to the front to overlay - // the borders properly - > .btn-check:checked + .btn, - > .btn-check:focus + .btn, - > .btn:hover, - > .btn:focus, - > .btn:active, - > .btn.active { - z-index: 1; - } -} - -// Optional: Group multiple button groups together for a toolbar -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; - - .input-group { - width: auto; - } -} - -.btn-group { - @include border-radius($btn-border-radius); - - // Prevent double borders when buttons are next to each other - > :not(.btn-check:first-child) + .btn, - > .btn-group:not(:first-child) { - margin-left: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn.dropdown-toggle-split:first-child, - > .btn-group:not(:last-child) > .btn { - @include border-end-radius(0); - } - - // The left radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-start-radius(0); - } -} - -// Sizing -// -// Remix the default button sizing classes into new ones for easier manipulation. - -.btn-group-sm > .btn { @extend .btn-sm; } -.btn-group-lg > .btn { @extend .btn-lg; } - - -// -// Split button dropdowns -// - -.dropdown-toggle-split { - padding-right: $btn-padding-x * .75; - padding-left: $btn-padding-x * .75; - - &::after, - .dropup &::after, - .dropend &::after { - margin-left: 0; - } - - .dropstart &::before { - margin-right: 0; - } -} - -.btn-sm + .dropdown-toggle-split { - padding-right: $btn-padding-x-sm * .75; - padding-left: $btn-padding-x-sm * .75; -} - -.btn-lg + .dropdown-toggle-split { - padding-right: $btn-padding-x-lg * .75; - padding-left: $btn-padding-x-lg * .75; -} - - -// The clickable button for toggling the menu -// Set the same inset shadow as the :active state -.btn-group.show .dropdown-toggle { - @include box-shadow($btn-active-box-shadow); - - // Show no shadow for `.btn-link` since it has no other button styles. - &.btn-link { - @include box-shadow(none); - } -} - - -// -// Vertical button groups -// - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; - - > .btn, - > .btn-group { - width: 100%; - } - - > .btn:not(:first-child), - > .btn-group:not(:first-child) { - margin-top: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn-group:not(:last-child) > .btn { - @include border-bottom-radius(0); - } - - // The top radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-top-radius(0); - } -} diff --git a/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss b/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss deleted file mode 100644 index caa4518..0000000 --- a/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss +++ /dev/null @@ -1,216 +0,0 @@ -// -// Base styles -// - -.btn { - // scss-docs-start btn-css-vars - --#{$prefix}btn-padding-x: #{$btn-padding-x}; - --#{$prefix}btn-padding-y: #{$btn-padding-y}; - --#{$prefix}btn-font-family: #{$btn-font-family}; - @include rfs($btn-font-size, --#{$prefix}btn-font-size); - --#{$prefix}btn-font-weight: #{$btn-font-weight}; - --#{$prefix}btn-line-height: #{$btn-line-height}; - --#{$prefix}btn-color: #{$btn-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-width: #{$btn-border-width}; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-border-radius: #{$btn-border-radius}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-box-shadow: #{$btn-box-shadow}; - --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity}; - --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5); - // scss-docs-end btn-css-vars - - display: inline-block; - padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x); - font-family: var(--#{$prefix}btn-font-family); - @include font-size(var(--#{$prefix}btn-font-size)); - font-weight: var(--#{$prefix}btn-font-weight); - line-height: var(--#{$prefix}btn-line-height); - color: var(--#{$prefix}btn-color); - text-align: center; - text-decoration: if($link-decoration == none, null, none); - white-space: $btn-white-space; - vertical-align: middle; - cursor: if($enable-button-pointers, pointer, null); - user-select: none; - border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color); - @include border-radius(var(--#{$prefix}btn-border-radius)); - @include gradient-bg(var(--#{$prefix}btn-bg)); - @include box-shadow(var(--#{$prefix}btn-box-shadow)); - @include transition($btn-transition); - - &:hover { - color: var(--#{$prefix}btn-hover-color); - text-decoration: if($link-hover-decoration == underline, none, null); - background-color: var(--#{$prefix}btn-hover-bg); - border-color: var(--#{$prefix}btn-hover-border-color); - } - - .btn-check + &:hover { - // override for the checkbox/radio buttons - color: var(--#{$prefix}btn-color); - background-color: var(--#{$prefix}btn-bg); - border-color: var(--#{$prefix}btn-border-color); - } - - &:focus-visible { - color: var(--#{$prefix}btn-hover-color); - @include gradient-bg(var(--#{$prefix}btn-hover-bg)); - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:focus-visible + & { - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:checked + &, - :not(.btn-check) + &:active, - &:first-child:active, - &.active, - &.show { - color: var(--#{$prefix}btn-active-color); - background-color: var(--#{$prefix}btn-active-bg); - // Remove CSS gradients if they're enabled - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-active-border-color); - @include box-shadow(var(--#{$prefix}btn-active-shadow)); - - &:focus-visible { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - } - - .btn-check:checked:focus-visible + & { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - &:disabled, - &.disabled, - fieldset:disabled & { - color: var(--#{$prefix}btn-disabled-color); - pointer-events: none; - background-color: var(--#{$prefix}btn-disabled-bg); - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-disabled-border-color); - opacity: var(--#{$prefix}btn-disabled-opacity); - @include box-shadow(none); - } -} - - -// -// Alternate buttons -// - -// scss-docs-start btn-variant-loops -@each $color, $value in $theme-colors { - .btn-#{$color} { - @if $color == "light" { - @include button-variant( - $value, - $value, - $hover-background: shade-color($value, $btn-hover-bg-shade-amount), - $hover-border: shade-color($value, $btn-hover-border-shade-amount), - $active-background: shade-color($value, $btn-active-bg-shade-amount), - $active-border: shade-color($value, $btn-active-border-shade-amount) - ); - } @else if $color == "dark" { - @include button-variant( - $value, - $value, - $hover-background: tint-color($value, $btn-hover-bg-tint-amount), - $hover-border: tint-color($value, $btn-hover-border-tint-amount), - $active-background: tint-color($value, $btn-active-bg-tint-amount), - $active-border: tint-color($value, $btn-active-border-tint-amount) - ); - } @else { - @include button-variant($value, $value); - } - } -} - -@each $color, $value in $theme-colors { - .btn-outline-#{$color} { - @include button-outline-variant($value); - } -} -// scss-docs-end btn-variant-loops - - -// -// Link buttons -// - -// Make a button look and behave like a link -.btn-link { - --#{$prefix}btn-font-weight: #{$font-weight-normal}; - --#{$prefix}btn-color: #{$btn-link-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-hover-color: #{$btn-link-hover-color}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-active-color: #{$btn-link-hover-color}; - --#{$prefix}btn-active-border-color: transparent; - --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color}; - --#{$prefix}btn-disabled-border-color: transparent; - --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows - --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb}; - - text-decoration: $link-decoration; - @if $enable-gradients { - background-image: none; - } - - &:hover, - &:focus-visible { - text-decoration: $link-hover-decoration; - } - - &:focus-visible { - color: var(--#{$prefix}btn-color); - } - - &:hover { - color: var(--#{$prefix}btn-hover-color); - } - - // No need for an active state here -} - - -// -// Button Sizes -// - -.btn-lg { - @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); -} - -.btn-sm { - @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); -} diff --git a/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss b/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss deleted file mode 100644 index dcebe6a..0000000 --- a/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss +++ /dev/null @@ -1,238 +0,0 @@ -// -// Base styles -// - -.card { - // scss-docs-start card-css-vars - --#{$prefix}card-spacer-y: #{$card-spacer-y}; - --#{$prefix}card-spacer-x: #{$card-spacer-x}; - --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y}; - --#{$prefix}card-title-color: #{$card-title-color}; - --#{$prefix}card-subtitle-color: #{$card-subtitle-color}; - --#{$prefix}card-border-width: #{$card-border-width}; - --#{$prefix}card-border-color: #{$card-border-color}; - --#{$prefix}card-border-radius: #{$card-border-radius}; - --#{$prefix}card-box-shadow: #{$card-box-shadow}; - --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius}; - --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y}; - --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x}; - --#{$prefix}card-cap-bg: #{$card-cap-bg}; - --#{$prefix}card-cap-color: #{$card-cap-color}; - --#{$prefix}card-height: #{$card-height}; - --#{$prefix}card-color: #{$card-color}; - --#{$prefix}card-bg: #{$card-bg}; - --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding}; - --#{$prefix}card-group-margin: #{$card-group-margin}; - // scss-docs-end card-css-vars - - position: relative; - display: flex; - flex-direction: column; - min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 - height: var(--#{$prefix}card-height); - color: var(--#{$prefix}body-color); - word-wrap: break-word; - background-color: var(--#{$prefix}card-bg); - background-clip: border-box; - border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - @include border-radius(var(--#{$prefix}card-border-radius)); - @include box-shadow(var(--#{$prefix}card-box-shadow)); - - > hr { - margin-right: 0; - margin-left: 0; - } - - > .list-group { - border-top: inherit; - border-bottom: inherit; - - &:first-child { - border-top-width: 0; - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); - } - - &:last-child { - border-bottom-width: 0; - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); - } - } - - // Due to specificity of the above selector (`.card > .list-group`), we must - // use a child selector here to prevent double borders. - > .card-header + .list-group, - > .list-group + .card-footer { - border-top: 0; - } -} - -.card-body { - // Enable `flex-grow: 1` for decks and groups so that card blocks take up - // as much space as possible, ensuring footers are aligned to the bottom. - flex: 1 1 auto; - padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x); - color: var(--#{$prefix}card-color); -} - -.card-title { - margin-bottom: var(--#{$prefix}card-title-spacer-y); - color: var(--#{$prefix}card-title-color); -} - -.card-subtitle { - margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list - margin-bottom: 0; - color: var(--#{$prefix}card-subtitle-color); -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link { - &:hover { - text-decoration: if($link-hover-decoration == underline, none, null); - } - - + .card-link { - margin-left: var(--#{$prefix}card-spacer-x); - } -} - -// -// Optional textual caps -// - -.card-header { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - margin-bottom: 0; // Removes the default margin-bottom of - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:first-child { - @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0); - } -} - -.card-footer { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:last-child { - @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius)); - } -} - - -// -// Header navs -// - -.card-header-tabs { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - border-bottom: 0; - - .nav-link.active { - background-color: var(--#{$prefix}card-bg); - border-bottom-color: var(--#{$prefix}card-bg); - } -} - -.card-header-pills { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list -} - -// Card image -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: var(--#{$prefix}card-img-overlay-padding); - @include border-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch -} - -.card-img, -.card-img-top { - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-bottom { - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); -} - - -// -// Card groups -// - -.card-group { - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - margin-bottom: var(--#{$prefix}card-group-margin); - } - - @include media-breakpoint-up(sm) { - display: flex; - flex-flow: row wrap; - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - flex: 1 0 0; - margin-bottom: 0; - - + .card { - margin-left: 0; - border-left: 0; - } - - // Handle rounded corners - @if $enable-rounded { - &:not(:last-child) { - @include border-end-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-right-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-right-radius: 0; - } - } - - &:not(:first-child) { - @include border-start-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-left-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-left-radius: 0; - } - } - } - } - } -} diff --git a/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss b/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss deleted file mode 100644 index 5ebf6b1..0000000 --- a/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss +++ /dev/null @@ -1,226 +0,0 @@ -// Notes on the classes: -// -// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) -// even when their scroll action started on a carousel, but for compatibility (with Firefox) -// we're preventing all actions instead -// 2. The .carousel-item-start and .carousel-item-end is used to indicate where -// the active slide is heading. -// 3. .active.carousel-item is the current slide. -// 4. .active.carousel-item-start and .active.carousel-item-end is the current -// slide in its in-transition state. Only one of these occurs at a time. -// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end -// is the upcoming slide in transition. - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; - @include clearfix(); -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - @include transition($carousel-transition); -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); -} - - -// -// Alternate transitions -// - -.carousel-fade { - .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; - } - - .carousel-item.active, - .carousel-item-next.carousel-item-start, - .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; - } - - .active.carousel-item-start, - .active.carousel-item-end { - z-index: 0; - opacity: 0; - @include transition(opacity 0s $carousel-transition-duration); - } -} - - -// -// Left/right controls for nav -// - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - // Use flex for alignment (1-3) - display: flex; // 1. allow flex styles - align-items: center; // 2. vertically center contents - justify-content: center; // 3. horizontally center contents - width: $carousel-control-width; - padding: 0; - color: $carousel-control-color; - text-align: center; - background: none; - filter: var(--#{$prefix}carousel-control-icon-filter); - border: 0; - opacity: $carousel-control-opacity; - @include transition($carousel-control-transition); - - // Hover/focus state - &:hover, - &:focus { - color: $carousel-control-color; - text-decoration: none; - outline: 0; - opacity: $carousel-control-hover-opacity; - } -} -.carousel-control-prev { - left: 0; - background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); -} -.carousel-control-next { - right: 0; - background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); -} - -// Icons for within -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: $carousel-control-icon-width; - height: $carousel-control-icon-width; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; -} - -.carousel-control-prev-icon { - background-image: escape-svg($carousel-control-prev-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-next-icon-bg) + "*/"}; -} -.carousel-control-next-icon { - background-image: escape-svg($carousel-control-next-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-prev-icon-bg) + "*/"}; -} - -// Optional indicator pips/controls -// -// Add a container (such as a list) with the following class and add an item (ideally a focusable control, -// like a button) with data-bs-target for each slide your carousel holds. - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - // Use the .carousel-control's width as margin so we don't overlay those - margin-right: $carousel-control-width; - margin-bottom: 1rem; - margin-left: $carousel-control-width; - - [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: $carousel-indicator-width; - height: $carousel-indicator-height; - padding: 0; - margin-right: $carousel-indicator-spacer; - margin-left: $carousel-indicator-spacer; - text-indent: -999px; - cursor: pointer; - background-color: var(--#{$prefix}carousel-indicator-active-bg); - background-clip: padding-box; - border: 0; - // Use transparent borders to increase the hit area by 10px on top and bottom. - border-top: $carousel-indicator-hit-area-height solid transparent; - border-bottom: $carousel-indicator-hit-area-height solid transparent; - opacity: $carousel-indicator-opacity; - @include transition($carousel-indicator-transition); - } - - .active { - opacity: $carousel-indicator-active-opacity; - } -} - - -// Optional captions -// -// - -.carousel-caption { - position: absolute; - right: (100% - $carousel-caption-width) * .5; - bottom: $carousel-caption-spacer; - left: (100% - $carousel-caption-width) * .5; - padding-top: $carousel-caption-padding-y; - padding-bottom: $carousel-caption-padding-y; - color: var(--#{$prefix}carousel-caption-color); - text-align: center; -} - -// Dark mode carousel - -@mixin carousel-dark() { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg-dark}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color-dark}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter-dark}; -} - -.carousel-dark { - @include carousel-dark(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include carousel-dark(); - } -} diff --git a/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss b/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss deleted file mode 100644 index d53c96f..0000000 --- a/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss +++ /dev/null @@ -1,66 +0,0 @@ -// Transparent background and border properties included for button version. -// iOS requires the button element instead of an anchor tag. -// If you want the anchor version, it requires `href="#"`. -// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile - -.btn-close { - // scss-docs-start close-css-vars - --#{$prefix}btn-close-color: #{$btn-close-color}; - --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) }; - --#{$prefix}btn-close-opacity: #{$btn-close-opacity}; - --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity}; - --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow}; - --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity}; - --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity}; - // scss-docs-end close-css-vars - - box-sizing: content-box; - width: $btn-close-width; - height: $btn-close-height; - padding: $btn-close-padding-y $btn-close-padding-x; - color: var(--#{$prefix}btn-close-color); - background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements - filter: var(--#{$prefix}btn-close-filter); - border: 0; // for button elements - @include border-radius(); - opacity: var(--#{$prefix}btn-close-opacity); - - // Override 's hover style - &:hover { - color: var(--#{$prefix}btn-close-color); - text-decoration: none; - opacity: var(--#{$prefix}btn-close-hover-opacity); - } - - &:focus { - outline: 0; - box-shadow: var(--#{$prefix}btn-close-focus-shadow); - opacity: var(--#{$prefix}btn-close-focus-opacity); - } - - &:disabled, - &.disabled { - pointer-events: none; - user-select: none; - opacity: var(--#{$prefix}btn-close-disabled-opacity); - } -} - -@mixin btn-close-white() { - --#{$prefix}btn-close-filter: #{$btn-close-filter-dark}; -} - -.btn-close-white { - @include btn-close-white(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}btn-close-filter: #{$btn-close-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include btn-close-white(); - } -} diff --git a/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss b/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss deleted file mode 100644 index 83b3138..0000000 --- a/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss +++ /dev/null @@ -1,41 +0,0 @@ -// Container widths -// -// Set the container width, and override it for fixed navbars in media queries. - -@if $enable-container-classes { - // Single container class with breakpoint max-widths - .container, - // 100% wide container at all breakpoints - .container-fluid { - @include make-container(); - } - - // Responsive containers that are 100% wide until a breakpoint - @each $breakpoint, $container-max-width in $container-max-widths { - .container-#{$breakpoint} { - @extend .container-fluid; - } - - @include media-breakpoint-up($breakpoint, $grid-breakpoints) { - %responsive-container-#{$breakpoint} { - max-width: $container-max-width; - } - - // Extend each breakpoint which is smaller or equal to the current breakpoint - $extend-breakpoint: true; - - @each $name, $width in $grid-breakpoints { - @if ($extend-breakpoint) { - .container#{breakpoint-infix($name, $grid-breakpoints)} { - @extend %responsive-container-#{$breakpoint}; - } - - // Once the current breakpoint is reached, stop extending - @if ($breakpoint == $name) { - $extend-breakpoint: false; - } - } - } - } - } -} diff --git a/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss b/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss deleted file mode 100644 index 587ebb4..0000000 --- a/05_react/unterricht/tag52/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss +++ /dev/null @@ -1,250 +0,0 @@ -// The dropdown wrapper (`
      `) -.dropup, -.dropend, -.dropdown, -.dropstart, -.dropup-center, -.dropdown-center { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; - - // Generate the caret automatically - @include caret(); -} - -// The dropdown menu -.dropdown-menu { - // scss-docs-start dropdown-css-vars - --#{$prefix}dropdown-zindex: #{$zindex-dropdown}; - --#{$prefix}dropdown-min-width: #{$dropdown-min-width}; - --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x}; - --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y}; - --#{$prefix}dropdown-spacer: #{$dropdown-spacer}; - @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size); - --#{$prefix}dropdown-color: #{$dropdown-color}; - --#{$prefix}dropdown-bg: #{$dropdown-bg}; - --#{$prefix}dropdown-border-color: #{$dropdown-border-color}; - --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius}; - --#{$prefix}dropdown-border-width: #{$dropdown-border-width}; - --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius}; - --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg}; - --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y}; - --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow}; - --#{$prefix}dropdown-link-color: #{$dropdown-link-color}; - --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color}; - --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg}; - --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color}; - --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg}; - --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color}; - --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x}; - --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y}; - --#{$prefix}dropdown-header-color: #{$dropdown-header-color}; - --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x}; - --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y}; - // scss-docs-end dropdown-css-vars - - position: absolute; - z-index: var(--#{$prefix}dropdown-zindex); - display: none; // none by default, but block on "open" of the menu - min-width: var(--#{$prefix}dropdown-min-width); - padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x); - margin: 0; // Override default margin of ul - @include font-size(var(--#{$prefix}dropdown-font-size)); - color: var(--#{$prefix}dropdown-color); - text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) - list-style: none; - background-color: var(--#{$prefix}dropdown-bg); - background-clip: padding-box; - border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color); - @include border-radius(var(--#{$prefix}dropdown-border-radius)); - @include box-shadow(var(--#{$prefix}dropdown-box-shadow)); - - &[data-bs-popper] { - top: 100%; - left: 0; - margin-top: var(--#{$prefix}dropdown-spacer); - } - - @if $dropdown-padding-y == 0 { - > .dropdown-item:first-child, - > li:first-child .dropdown-item { - @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - > .dropdown-item:last-child, - > li:last-child .dropdown-item { - @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - - } -} - -// scss-docs-start responsive-breakpoints -// We deliberately hardcode the `bs-` prefix because we check -// this custom property in JS to determine Popper's positioning - -@each $breakpoint in map-keys($grid-breakpoints) { - @include media-breakpoint-up($breakpoint) { - $infix: breakpoint-infix($breakpoint, $grid-breakpoints); - - .dropdown-menu#{$infix}-start { - --bs-position: start; - - &[data-bs-popper] { - right: auto; - left: 0; - } - } - - .dropdown-menu#{$infix}-end { - --bs-position: end; - - &[data-bs-popper] { - right: 0; - left: auto; - } - } - } -} -// scss-docs-end responsive-breakpoints - -// Allow for dropdowns to go bottom up (aka, dropup-menu) -// Just add .dropup after the standard .dropdown class and you're set. -.dropup { - .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(up); - } -} - -.dropend { - .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(end); - &::after { - vertical-align: 0; - } - } -} - -.dropstart { - .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(start); - &::before { - vertical-align: 0; - } - } -} - - -// Dividers (basically an `
      `) within the dropdown -.dropdown-divider { - height: 0; - margin: var(--#{$prefix}dropdown-divider-margin-y) 0; - overflow: hidden; - border-top: 1px solid var(--#{$prefix}dropdown-divider-bg); - opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
      element -} - -// Links, buttons, and more within the dropdown menu -// -// `
      ` alignment by inheriting `text-align`. -// 3. Fix alignment for Safari - -th { - font-weight: $table-th-font-weight; // 1 - text-align: inherit; // 2 - text-align: -webkit-match-parent; // 3 -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - - -// Forms -// -// 1. Allow labels to use `margin` for spacing. - -label { - display: inline-block; // 1 -} - -// Remove the default `border-radius` that macOS Chrome adds. -// See https://github.com/twbs/bootstrap/issues/24093 - -button { - // stylelint-disable-next-line property-disallowed-list - border-radius: 0; -} - -// Explicitly remove focus outline in Chromium when it shouldn't be -// visible (e.g. as result of mouse click or touch tap). It already -// should be doing this automatically, but seems to currently be -// confused and applies its very visible two-tone outline anyway. - -button:focus:not(:focus-visible) { - outline: 0; -} - -// 1. Remove the margin in Firefox and Safari - -input, -button, -select, -optgroup, -textarea { - margin: 0; // 1 - font-family: inherit; - @include font-size(inherit); - line-height: inherit; -} - -// Remove the inheritance of text transform in Firefox -button, -select { - text-transform: none; -} -// Set the cursor for non-` - - - - - - - - ); -}; -export default InputAmount; diff --git a/05_react/unterricht/tag53/react-app/src/components/inputs/InputPrice.jsx b/05_react/unterricht/tag53/react-app/src/components/inputs/InputPrice.jsx deleted file mode 100644 index 04cbc55..0000000 --- a/05_react/unterricht/tag53/react-app/src/components/inputs/InputPrice.jsx +++ /dev/null @@ -1,49 +0,0 @@ -// import { useState } from 'react'; -import { FaDollarSign, FaEuroSign, FaYenSign } from 'react-icons/fa6'; - -const InputPrice = (props) => { - const { currency = '$', price = 0 } = props; - - // const [price, setPrice] = useState(0); - - //Evenhandler - const handleChange = (e) => { - console.log(`Preis: ${e.target.value}`); - - props.onHandlePrice(e.target.value); - //setPrice(e.target.value); - }; - - return ( -
      -
      - {currency === '$' && ( - - - - )} - - {currency === '€' && ( - - - - )} - {currency === '¥' && ( - - - - )} -
      -
      - ); -}; -export default InputPrice; diff --git a/05_react/unterricht/tag53/react-app/src/components/logos/LogoMain.jsx b/05_react/unterricht/tag53/react-app/src/components/logos/LogoMain.jsx deleted file mode 100644 index e33f1d3..0000000 --- a/05_react/unterricht/tag53/react-app/src/components/logos/LogoMain.jsx +++ /dev/null @@ -1,12 +0,0 @@ -import Logo from '../../assets/img/logo-react.min.svg'; - -const LogoMain = (props) => { - // const { } = props; - - return ( -
      - React -
      - ); -}; -export default LogoMain; diff --git a/05_react/unterricht/tag53/react-app/src/components/navs/NavMain.jsx b/05_react/unterricht/tag53/react-app/src/components/navs/NavMain.jsx deleted file mode 100644 index 70e5c2f..0000000 --- a/05_react/unterricht/tag53/react-app/src/components/navs/NavMain.jsx +++ /dev/null @@ -1,66 +0,0 @@ -import { NavLink } from 'react-router-dom'; - -const NavMain = () => { - return ( - - ); -}; -export default NavMain; diff --git a/05_react/unterricht/tag53/react-app/src/components/navs/NavSocial.jsx b/05_react/unterricht/tag53/react-app/src/components/navs/NavSocial.jsx deleted file mode 100644 index 850c7ab..0000000 --- a/05_react/unterricht/tag53/react-app/src/components/navs/NavSocial.jsx +++ /dev/null @@ -1,33 +0,0 @@ -import { FaInstagram, FaXTwitter, FaYoutube, FaMeta } from 'react-icons/fa6'; - -const NavSocial = (props) => { - // const { } = props; - - return ( - - ); -}; -export default NavSocial; diff --git a/05_react/unterricht/tag53/react-app/src/components/sliders/SliderSplide.jsx b/05_react/unterricht/tag53/react-app/src/components/sliders/SliderSplide.jsx deleted file mode 100644 index e245e1d..0000000 --- a/05_react/unterricht/tag53/react-app/src/components/sliders/SliderSplide.jsx +++ /dev/null @@ -1,33 +0,0 @@ -import { Splide, SplideSlide } from '@splidejs/react-splide'; - -const SliderSplide = (props) => { - const { - images = [], - label = 'Slides', - options = { - rewind: true, - height: '100%', - autoplay: true, - speed: 800, - type: 'fade', - }, - } = props; - - return ( - <> - {images.length > 0 && ( -
      - - {images.map(({ path, title }, idx) => ( - // - - {title} - - ))} - -
      - )} - - ); -}; -export default SliderSplide; diff --git a/05_react/unterricht/tag53/react-app/src/components/tables/TableProducts.jsx b/05_react/unterricht/tag53/react-app/src/components/tables/TableProducts.jsx deleted file mode 100644 index 28b178b..0000000 --- a/05_react/unterricht/tag53/react-app/src/components/tables/TableProducts.jsx +++ /dev/null @@ -1,42 +0,0 @@ -import RowProduct from './content/RowProduct'; - -const TableProducts = (props) => { - const { - items = [ - { - _id: '1', - title: 'Example Product 1', - sku: 'ABC1234', - stock: 2, - price: 15.2, - }, - ], - } = props; - return ( -
      -
      - - - - - - - - - - - - {items.length > 0 && items.map((product, idx) => )} - - - - - - - -
      SKUStockTitlePriceTotal
      Total:
      -
      -
      - ); -}; -export default TableProducts; diff --git a/05_react/unterricht/tag53/react-app/src/components/tables/content/RowProduct.jsx b/05_react/unterricht/tag53/react-app/src/components/tables/content/RowProduct.jsx deleted file mode 100644 index 25e0360..0000000 --- a/05_react/unterricht/tag53/react-app/src/components/tables/content/RowProduct.jsx +++ /dev/null @@ -1,35 +0,0 @@ -import { useState } from 'react'; -import InputAmount from '../../inputs/InputAmount'; -import InputPrice from '../../inputs/InputPrice'; - -const RowProduct = (props) => { - // const { sku = '', stock: amount = 0, price = 0, title = '' } = props; - const { sku = '', title = '' } = props; - - const [amount, setAmount] = useState(props.stock || 0); - const [price, setPrice] = useState(props.price || 0); - - // Eventhandler - const handleAmount = (val) => { - setAmount(val); - }; - - const handlePrice = (val) => { - setPrice(val); - }; - - return ( -
      {sku} - - {title} - - {(amount * price).toFixed(2)}
      } - - ); -}; -export default TableProducts; diff --git a/05_react/unterricht/tag53/react-app/src/routes/Router.jsx b/05_react/unterricht/tag53/react-app/src/routes/Router.jsx deleted file mode 100644 index 9010e70..0000000 --- a/05_react/unterricht/tag53/react-app/src/routes/Router.jsx +++ /dev/null @@ -1,26 +0,0 @@ -import { Route, Routes } from 'react-router-dom'; -import Home from '../pages/Home'; -import About from '../pages/About'; -import Contact from '../pages/Contact'; - -// Projects -import Fibonacci from '../pages/projects/Fibonacci'; -import TableProducts from '../pages/projects/TableProducts'; - -const Router = (props) => { - // const { } = props; - - return ( - - } /> - } /> - } /> - - - } /> - } /> - - - ); -}; -export default Router; diff --git a/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/_index.scss b/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/_index.scss deleted file mode 100644 index dcefbc9..0000000 --- a/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/_index.scss +++ /dev/null @@ -1,3 +0,0 @@ -// @import 'bootstrap-5.3.8/bootstrap-grid'; -@import 'bootstrap-5.3.8/bootstrap'; -// @import 'bulma-1.04/index' diff --git a/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss b/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss deleted file mode 100644 index e9f267f..0000000 --- a/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss +++ /dev/null @@ -1,153 +0,0 @@ -// -// Base styles -// - -.accordion { - // scss-docs-start accordion-css-vars - --#{$prefix}accordion-color: #{$accordion-color}; - --#{$prefix}accordion-bg: #{$accordion-bg}; - --#{$prefix}accordion-transition: #{$accordion-transition}; - --#{$prefix}accordion-border-color: #{$accordion-border-color}; - --#{$prefix}accordion-border-width: #{$accordion-border-width}; - --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; - --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; - --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; - --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; - --#{$prefix}accordion-btn-color: #{$accordion-button-color}; - --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; - --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; - --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; - --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; - --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; - --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; - --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; - --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; - --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; - // scss-docs-end accordion-css-vars -} - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); - @include font-size($font-size-base); - color: var(--#{$prefix}accordion-btn-color); - text-align: left; // Reset button style - background-color: var(--#{$prefix}accordion-btn-bg); - border: 0; - @include border-radius(0); - overflow-anchor: none; - @include transition(var(--#{$prefix}accordion-transition)); - - &:not(.collapsed) { - color: var(--#{$prefix}accordion-active-color); - background-color: var(--#{$prefix}accordion-active-bg); - box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list - - &::after { - background-image: var(--#{$prefix}accordion-btn-active-icon); - transform: var(--#{$prefix}accordion-btn-icon-transform); - } - } - - // Accordion icon - &::after { - flex-shrink: 0; - width: var(--#{$prefix}accordion-btn-icon-width); - height: var(--#{$prefix}accordion-btn-icon-width); - margin-left: auto; - content: ""; - background-image: var(--#{$prefix}accordion-btn-icon); - background-repeat: no-repeat; - background-size: var(--#{$prefix}accordion-btn-icon-width); - @include transition(var(--#{$prefix}accordion-btn-icon-transition)); - } - - &:hover { - z-index: 2; - } - - &:focus { - z-index: 3; - outline: 0; - box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); - } -} - -.accordion-header { - margin-bottom: 0; -} - -.accordion-item { - color: var(--#{$prefix}accordion-color); - background-color: var(--#{$prefix}accordion-bg); - border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); - - &:first-of-type { - @include border-top-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - &:not(:first-of-type) { - border-top: 0; - } - - // Only set a border-radius on the last item if the accordion is collapsed - &:last-of-type { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - &.collapsed { - @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - > .accordion-collapse { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - } - } -} - -.accordion-body { - padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); -} - - -// Flush accordion items -// -// Remove borders and border-radius to keep accordion items edge-to-edge. - -.accordion-flush { - > .accordion-item { - border-right: 0; - border-left: 0; - @include border-radius(0); - - &:first-child { border-top: 0; } - &:last-child { border-bottom: 0; } - - // stylelint-disable selector-max-class - > .accordion-collapse, - > .accordion-header .accordion-button, - > .accordion-header .accordion-button.collapsed { - @include border-radius(0); - } - // stylelint-enable selector-max-class - } -} - -@if $enable-dark-mode { - @include color-mode(dark) { - .accordion-button::after { - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; - } - } -} diff --git a/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss b/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss deleted file mode 100644 index b8cff9b..0000000 --- a/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss +++ /dev/null @@ -1,68 +0,0 @@ -// -// Base styles -// - -.alert { - // scss-docs-start alert-css-vars - --#{$prefix}alert-bg: transparent; - --#{$prefix}alert-padding-x: #{$alert-padding-x}; - --#{$prefix}alert-padding-y: #{$alert-padding-y}; - --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; - --#{$prefix}alert-color: inherit; - --#{$prefix}alert-border-color: transparent; - --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); - --#{$prefix}alert-border-radius: #{$alert-border-radius}; - --#{$prefix}alert-link-color: inherit; - // scss-docs-end alert-css-vars - - position: relative; - padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); - margin-bottom: var(--#{$prefix}alert-margin-bottom); - color: var(--#{$prefix}alert-color); - background-color: var(--#{$prefix}alert-bg); - border: var(--#{$prefix}alert-border); - @include border-radius(var(--#{$prefix}alert-border-radius)); -} - -// Headings for larger alerts -.alert-heading { - // Specified to prevent conflicts of changing $headings-color - color: inherit; -} - -// Provide class for links that match alerts -.alert-link { - font-weight: $alert-link-font-weight; - color: var(--#{$prefix}alert-link-color); -} - - -// Dismissible alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissible { - padding-right: $alert-dismissible-padding-r; - - // Adjust close link position - .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: $stretched-link-z-index + 1; - padding: $alert-padding-y * 1.25 $alert-padding-x; - } -} - - -// scss-docs-start alert-modifiers -// Generate contextual modifier classes for colorizing the alert -@each $state in map-keys($theme-colors) { - .alert-#{$state} { - --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); - --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); - --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); - --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); - } -} -// scss-docs-end alert-modifiers diff --git a/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss b/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss deleted file mode 100644 index cc3d269..0000000 --- a/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss +++ /dev/null @@ -1,38 +0,0 @@ -// Base class -// -// Requires one of the contextual, color modifier classes for `color` and -// `background-color`. - -.badge { - // scss-docs-start badge-css-vars - --#{$prefix}badge-padding-x: #{$badge-padding-x}; - --#{$prefix}badge-padding-y: #{$badge-padding-y}; - @include rfs($badge-font-size, --#{$prefix}badge-font-size); - --#{$prefix}badge-font-weight: #{$badge-font-weight}; - --#{$prefix}badge-color: #{$badge-color}; - --#{$prefix}badge-border-radius: #{$badge-border-radius}; - // scss-docs-end badge-css-vars - - display: inline-block; - padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x); - @include font-size(var(--#{$prefix}badge-font-size)); - font-weight: var(--#{$prefix}badge-font-weight); - line-height: 1; - color: var(--#{$prefix}badge-color); - text-align: center; - white-space: nowrap; - vertical-align: baseline; - @include border-radius(var(--#{$prefix}badge-border-radius)); - @include gradient-bg(); - - // Empty badges collapse automatically - &:empty { - display: none; - } -} - -// Quick fix for badges in buttons -.btn .badge { - position: relative; - top: -1px; -} diff --git a/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss b/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss deleted file mode 100644 index b8252ff..0000000 --- a/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss +++ /dev/null @@ -1,40 +0,0 @@ -.breadcrumb { - // scss-docs-start breadcrumb-css-vars - --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x}; - --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y}; - --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom}; - @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size); - --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg}; - --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius}; - --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color}; - --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x}; - --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color}; - // scss-docs-end breadcrumb-css-vars - - display: flex; - flex-wrap: wrap; - padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x); - margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom); - @include font-size(var(--#{$prefix}breadcrumb-font-size)); - list-style: none; - background-color: var(--#{$prefix}breadcrumb-bg); - @include border-radius(var(--#{$prefix}breadcrumb-border-radius)); -} - -.breadcrumb-item { - // The separator between breadcrumbs (by default, a forward-slash: "/") - + .breadcrumb-item { - padding-left: var(--#{$prefix}breadcrumb-item-padding-x); - - &::before { - float: left; // Suppress inline spacings and underlining of the separator - padding-right: var(--#{$prefix}breadcrumb-item-padding-x); - color: var(--#{$prefix}breadcrumb-divider-color); - content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; - } - } - - &.active { - color: var(--#{$prefix}breadcrumb-item-active-color); - } -} diff --git a/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss b/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss deleted file mode 100644 index 78e1252..0000000 --- a/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss +++ /dev/null @@ -1,147 +0,0 @@ -// Make the div behave like a button -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; // match .btn alignment given font-size hack above - - > .btn { - position: relative; - flex: 1 1 auto; - } - - // Bring the hover, focused, and "active" buttons to the front to overlay - // the borders properly - > .btn-check:checked + .btn, - > .btn-check:focus + .btn, - > .btn:hover, - > .btn:focus, - > .btn:active, - > .btn.active { - z-index: 1; - } -} - -// Optional: Group multiple button groups together for a toolbar -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; - - .input-group { - width: auto; - } -} - -.btn-group { - @include border-radius($btn-border-radius); - - // Prevent double borders when buttons are next to each other - > :not(.btn-check:first-child) + .btn, - > .btn-group:not(:first-child) { - margin-left: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn.dropdown-toggle-split:first-child, - > .btn-group:not(:last-child) > .btn { - @include border-end-radius(0); - } - - // The left radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-start-radius(0); - } -} - -// Sizing -// -// Remix the default button sizing classes into new ones for easier manipulation. - -.btn-group-sm > .btn { @extend .btn-sm; } -.btn-group-lg > .btn { @extend .btn-lg; } - - -// -// Split button dropdowns -// - -.dropdown-toggle-split { - padding-right: $btn-padding-x * .75; - padding-left: $btn-padding-x * .75; - - &::after, - .dropup &::after, - .dropend &::after { - margin-left: 0; - } - - .dropstart &::before { - margin-right: 0; - } -} - -.btn-sm + .dropdown-toggle-split { - padding-right: $btn-padding-x-sm * .75; - padding-left: $btn-padding-x-sm * .75; -} - -.btn-lg + .dropdown-toggle-split { - padding-right: $btn-padding-x-lg * .75; - padding-left: $btn-padding-x-lg * .75; -} - - -// The clickable button for toggling the menu -// Set the same inset shadow as the :active state -.btn-group.show .dropdown-toggle { - @include box-shadow($btn-active-box-shadow); - - // Show no shadow for `.btn-link` since it has no other button styles. - &.btn-link { - @include box-shadow(none); - } -} - - -// -// Vertical button groups -// - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; - - > .btn, - > .btn-group { - width: 100%; - } - - > .btn:not(:first-child), - > .btn-group:not(:first-child) { - margin-top: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn-group:not(:last-child) > .btn { - @include border-bottom-radius(0); - } - - // The top radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-top-radius(0); - } -} diff --git a/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss b/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss deleted file mode 100644 index caa4518..0000000 --- a/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss +++ /dev/null @@ -1,216 +0,0 @@ -// -// Base styles -// - -.btn { - // scss-docs-start btn-css-vars - --#{$prefix}btn-padding-x: #{$btn-padding-x}; - --#{$prefix}btn-padding-y: #{$btn-padding-y}; - --#{$prefix}btn-font-family: #{$btn-font-family}; - @include rfs($btn-font-size, --#{$prefix}btn-font-size); - --#{$prefix}btn-font-weight: #{$btn-font-weight}; - --#{$prefix}btn-line-height: #{$btn-line-height}; - --#{$prefix}btn-color: #{$btn-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-width: #{$btn-border-width}; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-border-radius: #{$btn-border-radius}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-box-shadow: #{$btn-box-shadow}; - --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity}; - --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5); - // scss-docs-end btn-css-vars - - display: inline-block; - padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x); - font-family: var(--#{$prefix}btn-font-family); - @include font-size(var(--#{$prefix}btn-font-size)); - font-weight: var(--#{$prefix}btn-font-weight); - line-height: var(--#{$prefix}btn-line-height); - color: var(--#{$prefix}btn-color); - text-align: center; - text-decoration: if($link-decoration == none, null, none); - white-space: $btn-white-space; - vertical-align: middle; - cursor: if($enable-button-pointers, pointer, null); - user-select: none; - border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color); - @include border-radius(var(--#{$prefix}btn-border-radius)); - @include gradient-bg(var(--#{$prefix}btn-bg)); - @include box-shadow(var(--#{$prefix}btn-box-shadow)); - @include transition($btn-transition); - - &:hover { - color: var(--#{$prefix}btn-hover-color); - text-decoration: if($link-hover-decoration == underline, none, null); - background-color: var(--#{$prefix}btn-hover-bg); - border-color: var(--#{$prefix}btn-hover-border-color); - } - - .btn-check + &:hover { - // override for the checkbox/radio buttons - color: var(--#{$prefix}btn-color); - background-color: var(--#{$prefix}btn-bg); - border-color: var(--#{$prefix}btn-border-color); - } - - &:focus-visible { - color: var(--#{$prefix}btn-hover-color); - @include gradient-bg(var(--#{$prefix}btn-hover-bg)); - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:focus-visible + & { - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:checked + &, - :not(.btn-check) + &:active, - &:first-child:active, - &.active, - &.show { - color: var(--#{$prefix}btn-active-color); - background-color: var(--#{$prefix}btn-active-bg); - // Remove CSS gradients if they're enabled - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-active-border-color); - @include box-shadow(var(--#{$prefix}btn-active-shadow)); - - &:focus-visible { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - } - - .btn-check:checked:focus-visible + & { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - &:disabled, - &.disabled, - fieldset:disabled & { - color: var(--#{$prefix}btn-disabled-color); - pointer-events: none; - background-color: var(--#{$prefix}btn-disabled-bg); - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-disabled-border-color); - opacity: var(--#{$prefix}btn-disabled-opacity); - @include box-shadow(none); - } -} - - -// -// Alternate buttons -// - -// scss-docs-start btn-variant-loops -@each $color, $value in $theme-colors { - .btn-#{$color} { - @if $color == "light" { - @include button-variant( - $value, - $value, - $hover-background: shade-color($value, $btn-hover-bg-shade-amount), - $hover-border: shade-color($value, $btn-hover-border-shade-amount), - $active-background: shade-color($value, $btn-active-bg-shade-amount), - $active-border: shade-color($value, $btn-active-border-shade-amount) - ); - } @else if $color == "dark" { - @include button-variant( - $value, - $value, - $hover-background: tint-color($value, $btn-hover-bg-tint-amount), - $hover-border: tint-color($value, $btn-hover-border-tint-amount), - $active-background: tint-color($value, $btn-active-bg-tint-amount), - $active-border: tint-color($value, $btn-active-border-tint-amount) - ); - } @else { - @include button-variant($value, $value); - } - } -} - -@each $color, $value in $theme-colors { - .btn-outline-#{$color} { - @include button-outline-variant($value); - } -} -// scss-docs-end btn-variant-loops - - -// -// Link buttons -// - -// Make a button look and behave like a link -.btn-link { - --#{$prefix}btn-font-weight: #{$font-weight-normal}; - --#{$prefix}btn-color: #{$btn-link-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-hover-color: #{$btn-link-hover-color}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-active-color: #{$btn-link-hover-color}; - --#{$prefix}btn-active-border-color: transparent; - --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color}; - --#{$prefix}btn-disabled-border-color: transparent; - --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows - --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb}; - - text-decoration: $link-decoration; - @if $enable-gradients { - background-image: none; - } - - &:hover, - &:focus-visible { - text-decoration: $link-hover-decoration; - } - - &:focus-visible { - color: var(--#{$prefix}btn-color); - } - - &:hover { - color: var(--#{$prefix}btn-hover-color); - } - - // No need for an active state here -} - - -// -// Button Sizes -// - -.btn-lg { - @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); -} - -.btn-sm { - @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); -} diff --git a/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss b/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss deleted file mode 100644 index dcebe6a..0000000 --- a/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss +++ /dev/null @@ -1,238 +0,0 @@ -// -// Base styles -// - -.card { - // scss-docs-start card-css-vars - --#{$prefix}card-spacer-y: #{$card-spacer-y}; - --#{$prefix}card-spacer-x: #{$card-spacer-x}; - --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y}; - --#{$prefix}card-title-color: #{$card-title-color}; - --#{$prefix}card-subtitle-color: #{$card-subtitle-color}; - --#{$prefix}card-border-width: #{$card-border-width}; - --#{$prefix}card-border-color: #{$card-border-color}; - --#{$prefix}card-border-radius: #{$card-border-radius}; - --#{$prefix}card-box-shadow: #{$card-box-shadow}; - --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius}; - --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y}; - --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x}; - --#{$prefix}card-cap-bg: #{$card-cap-bg}; - --#{$prefix}card-cap-color: #{$card-cap-color}; - --#{$prefix}card-height: #{$card-height}; - --#{$prefix}card-color: #{$card-color}; - --#{$prefix}card-bg: #{$card-bg}; - --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding}; - --#{$prefix}card-group-margin: #{$card-group-margin}; - // scss-docs-end card-css-vars - - position: relative; - display: flex; - flex-direction: column; - min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 - height: var(--#{$prefix}card-height); - color: var(--#{$prefix}body-color); - word-wrap: break-word; - background-color: var(--#{$prefix}card-bg); - background-clip: border-box; - border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - @include border-radius(var(--#{$prefix}card-border-radius)); - @include box-shadow(var(--#{$prefix}card-box-shadow)); - - > hr { - margin-right: 0; - margin-left: 0; - } - - > .list-group { - border-top: inherit; - border-bottom: inherit; - - &:first-child { - border-top-width: 0; - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); - } - - &:last-child { - border-bottom-width: 0; - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); - } - } - - // Due to specificity of the above selector (`.card > .list-group`), we must - // use a child selector here to prevent double borders. - > .card-header + .list-group, - > .list-group + .card-footer { - border-top: 0; - } -} - -.card-body { - // Enable `flex-grow: 1` for decks and groups so that card blocks take up - // as much space as possible, ensuring footers are aligned to the bottom. - flex: 1 1 auto; - padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x); - color: var(--#{$prefix}card-color); -} - -.card-title { - margin-bottom: var(--#{$prefix}card-title-spacer-y); - color: var(--#{$prefix}card-title-color); -} - -.card-subtitle { - margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list - margin-bottom: 0; - color: var(--#{$prefix}card-subtitle-color); -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link { - &:hover { - text-decoration: if($link-hover-decoration == underline, none, null); - } - - + .card-link { - margin-left: var(--#{$prefix}card-spacer-x); - } -} - -// -// Optional textual caps -// - -.card-header { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - margin-bottom: 0; // Removes the default margin-bottom of - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:first-child { - @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0); - } -} - -.card-footer { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:last-child { - @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius)); - } -} - - -// -// Header navs -// - -.card-header-tabs { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - border-bottom: 0; - - .nav-link.active { - background-color: var(--#{$prefix}card-bg); - border-bottom-color: var(--#{$prefix}card-bg); - } -} - -.card-header-pills { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list -} - -// Card image -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: var(--#{$prefix}card-img-overlay-padding); - @include border-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch -} - -.card-img, -.card-img-top { - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-bottom { - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); -} - - -// -// Card groups -// - -.card-group { - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - margin-bottom: var(--#{$prefix}card-group-margin); - } - - @include media-breakpoint-up(sm) { - display: flex; - flex-flow: row wrap; - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - flex: 1 0 0; - margin-bottom: 0; - - + .card { - margin-left: 0; - border-left: 0; - } - - // Handle rounded corners - @if $enable-rounded { - &:not(:last-child) { - @include border-end-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-right-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-right-radius: 0; - } - } - - &:not(:first-child) { - @include border-start-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-left-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-left-radius: 0; - } - } - } - } - } -} diff --git a/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss b/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss deleted file mode 100644 index 5ebf6b1..0000000 --- a/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss +++ /dev/null @@ -1,226 +0,0 @@ -// Notes on the classes: -// -// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) -// even when their scroll action started on a carousel, but for compatibility (with Firefox) -// we're preventing all actions instead -// 2. The .carousel-item-start and .carousel-item-end is used to indicate where -// the active slide is heading. -// 3. .active.carousel-item is the current slide. -// 4. .active.carousel-item-start and .active.carousel-item-end is the current -// slide in its in-transition state. Only one of these occurs at a time. -// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end -// is the upcoming slide in transition. - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; - @include clearfix(); -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - @include transition($carousel-transition); -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); -} - - -// -// Alternate transitions -// - -.carousel-fade { - .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; - } - - .carousel-item.active, - .carousel-item-next.carousel-item-start, - .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; - } - - .active.carousel-item-start, - .active.carousel-item-end { - z-index: 0; - opacity: 0; - @include transition(opacity 0s $carousel-transition-duration); - } -} - - -// -// Left/right controls for nav -// - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - // Use flex for alignment (1-3) - display: flex; // 1. allow flex styles - align-items: center; // 2. vertically center contents - justify-content: center; // 3. horizontally center contents - width: $carousel-control-width; - padding: 0; - color: $carousel-control-color; - text-align: center; - background: none; - filter: var(--#{$prefix}carousel-control-icon-filter); - border: 0; - opacity: $carousel-control-opacity; - @include transition($carousel-control-transition); - - // Hover/focus state - &:hover, - &:focus { - color: $carousel-control-color; - text-decoration: none; - outline: 0; - opacity: $carousel-control-hover-opacity; - } -} -.carousel-control-prev { - left: 0; - background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); -} -.carousel-control-next { - right: 0; - background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); -} - -// Icons for within -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: $carousel-control-icon-width; - height: $carousel-control-icon-width; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; -} - -.carousel-control-prev-icon { - background-image: escape-svg($carousel-control-prev-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-next-icon-bg) + "*/"}; -} -.carousel-control-next-icon { - background-image: escape-svg($carousel-control-next-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-prev-icon-bg) + "*/"}; -} - -// Optional indicator pips/controls -// -// Add a container (such as a list) with the following class and add an item (ideally a focusable control, -// like a button) with data-bs-target for each slide your carousel holds. - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - // Use the .carousel-control's width as margin so we don't overlay those - margin-right: $carousel-control-width; - margin-bottom: 1rem; - margin-left: $carousel-control-width; - - [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: $carousel-indicator-width; - height: $carousel-indicator-height; - padding: 0; - margin-right: $carousel-indicator-spacer; - margin-left: $carousel-indicator-spacer; - text-indent: -999px; - cursor: pointer; - background-color: var(--#{$prefix}carousel-indicator-active-bg); - background-clip: padding-box; - border: 0; - // Use transparent borders to increase the hit area by 10px on top and bottom. - border-top: $carousel-indicator-hit-area-height solid transparent; - border-bottom: $carousel-indicator-hit-area-height solid transparent; - opacity: $carousel-indicator-opacity; - @include transition($carousel-indicator-transition); - } - - .active { - opacity: $carousel-indicator-active-opacity; - } -} - - -// Optional captions -// -// - -.carousel-caption { - position: absolute; - right: (100% - $carousel-caption-width) * .5; - bottom: $carousel-caption-spacer; - left: (100% - $carousel-caption-width) * .5; - padding-top: $carousel-caption-padding-y; - padding-bottom: $carousel-caption-padding-y; - color: var(--#{$prefix}carousel-caption-color); - text-align: center; -} - -// Dark mode carousel - -@mixin carousel-dark() { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg-dark}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color-dark}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter-dark}; -} - -.carousel-dark { - @include carousel-dark(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include carousel-dark(); - } -} diff --git a/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss b/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss deleted file mode 100644 index d53c96f..0000000 --- a/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss +++ /dev/null @@ -1,66 +0,0 @@ -// Transparent background and border properties included for button version. -// iOS requires the button element instead of an anchor tag. -// If you want the anchor version, it requires `href="#"`. -// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile - -.btn-close { - // scss-docs-start close-css-vars - --#{$prefix}btn-close-color: #{$btn-close-color}; - --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) }; - --#{$prefix}btn-close-opacity: #{$btn-close-opacity}; - --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity}; - --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow}; - --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity}; - --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity}; - // scss-docs-end close-css-vars - - box-sizing: content-box; - width: $btn-close-width; - height: $btn-close-height; - padding: $btn-close-padding-y $btn-close-padding-x; - color: var(--#{$prefix}btn-close-color); - background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements - filter: var(--#{$prefix}btn-close-filter); - border: 0; // for button elements - @include border-radius(); - opacity: var(--#{$prefix}btn-close-opacity); - - // Override 's hover style - &:hover { - color: var(--#{$prefix}btn-close-color); - text-decoration: none; - opacity: var(--#{$prefix}btn-close-hover-opacity); - } - - &:focus { - outline: 0; - box-shadow: var(--#{$prefix}btn-close-focus-shadow); - opacity: var(--#{$prefix}btn-close-focus-opacity); - } - - &:disabled, - &.disabled { - pointer-events: none; - user-select: none; - opacity: var(--#{$prefix}btn-close-disabled-opacity); - } -} - -@mixin btn-close-white() { - --#{$prefix}btn-close-filter: #{$btn-close-filter-dark}; -} - -.btn-close-white { - @include btn-close-white(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}btn-close-filter: #{$btn-close-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include btn-close-white(); - } -} diff --git a/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss b/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss deleted file mode 100644 index 83b3138..0000000 --- a/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss +++ /dev/null @@ -1,41 +0,0 @@ -// Container widths -// -// Set the container width, and override it for fixed navbars in media queries. - -@if $enable-container-classes { - // Single container class with breakpoint max-widths - .container, - // 100% wide container at all breakpoints - .container-fluid { - @include make-container(); - } - - // Responsive containers that are 100% wide until a breakpoint - @each $breakpoint, $container-max-width in $container-max-widths { - .container-#{$breakpoint} { - @extend .container-fluid; - } - - @include media-breakpoint-up($breakpoint, $grid-breakpoints) { - %responsive-container-#{$breakpoint} { - max-width: $container-max-width; - } - - // Extend each breakpoint which is smaller or equal to the current breakpoint - $extend-breakpoint: true; - - @each $name, $width in $grid-breakpoints { - @if ($extend-breakpoint) { - .container#{breakpoint-infix($name, $grid-breakpoints)} { - @extend %responsive-container-#{$breakpoint}; - } - - // Once the current breakpoint is reached, stop extending - @if ($breakpoint == $name) { - $extend-breakpoint: false; - } - } - } - } - } -} diff --git a/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss b/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss deleted file mode 100644 index 587ebb4..0000000 --- a/05_react/unterricht/tag53/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss +++ /dev/null @@ -1,250 +0,0 @@ -// The dropdown wrapper (`
      `) -.dropup, -.dropend, -.dropdown, -.dropstart, -.dropup-center, -.dropdown-center { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; - - // Generate the caret automatically - @include caret(); -} - -// The dropdown menu -.dropdown-menu { - // scss-docs-start dropdown-css-vars - --#{$prefix}dropdown-zindex: #{$zindex-dropdown}; - --#{$prefix}dropdown-min-width: #{$dropdown-min-width}; - --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x}; - --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y}; - --#{$prefix}dropdown-spacer: #{$dropdown-spacer}; - @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size); - --#{$prefix}dropdown-color: #{$dropdown-color}; - --#{$prefix}dropdown-bg: #{$dropdown-bg}; - --#{$prefix}dropdown-border-color: #{$dropdown-border-color}; - --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius}; - --#{$prefix}dropdown-border-width: #{$dropdown-border-width}; - --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius}; - --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg}; - --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y}; - --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow}; - --#{$prefix}dropdown-link-color: #{$dropdown-link-color}; - --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color}; - --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg}; - --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color}; - --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg}; - --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color}; - --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x}; - --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y}; - --#{$prefix}dropdown-header-color: #{$dropdown-header-color}; - --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x}; - --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y}; - // scss-docs-end dropdown-css-vars - - position: absolute; - z-index: var(--#{$prefix}dropdown-zindex); - display: none; // none by default, but block on "open" of the menu - min-width: var(--#{$prefix}dropdown-min-width); - padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x); - margin: 0; // Override default margin of ul - @include font-size(var(--#{$prefix}dropdown-font-size)); - color: var(--#{$prefix}dropdown-color); - text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) - list-style: none; - background-color: var(--#{$prefix}dropdown-bg); - background-clip: padding-box; - border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color); - @include border-radius(var(--#{$prefix}dropdown-border-radius)); - @include box-shadow(var(--#{$prefix}dropdown-box-shadow)); - - &[data-bs-popper] { - top: 100%; - left: 0; - margin-top: var(--#{$prefix}dropdown-spacer); - } - - @if $dropdown-padding-y == 0 { - > .dropdown-item:first-child, - > li:first-child .dropdown-item { - @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - > .dropdown-item:last-child, - > li:last-child .dropdown-item { - @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - - } -} - -// scss-docs-start responsive-breakpoints -// We deliberately hardcode the `bs-` prefix because we check -// this custom property in JS to determine Popper's positioning - -@each $breakpoint in map-keys($grid-breakpoints) { - @include media-breakpoint-up($breakpoint) { - $infix: breakpoint-infix($breakpoint, $grid-breakpoints); - - .dropdown-menu#{$infix}-start { - --bs-position: start; - - &[data-bs-popper] { - right: auto; - left: 0; - } - } - - .dropdown-menu#{$infix}-end { - --bs-position: end; - - &[data-bs-popper] { - right: 0; - left: auto; - } - } - } -} -// scss-docs-end responsive-breakpoints - -// Allow for dropdowns to go bottom up (aka, dropup-menu) -// Just add .dropup after the standard .dropdown class and you're set. -.dropup { - .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(up); - } -} - -.dropend { - .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(end); - &::after { - vertical-align: 0; - } - } -} - -.dropstart { - .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(start); - &::before { - vertical-align: 0; - } - } -} - - -// Dividers (basically an `
      `) within the dropdown -.dropdown-divider { - height: 0; - margin: var(--#{$prefix}dropdown-divider-margin-y) 0; - overflow: hidden; - border-top: 1px solid var(--#{$prefix}dropdown-divider-bg); - opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
      element -} - -// Links, buttons, and more within the dropdown menu -// -// `
      - - - - - - - ); -}; -export default RowProduct; diff --git a/05_react/unterricht/tag54/react-app/src/main.jsx b/05_react/unterricht/tag54/react-app/src/main.jsx deleted file mode 100644 index 6187b22..0000000 --- a/05_react/unterricht/tag54/react-app/src/main.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; -import { BrowserRouter } from 'react-router-dom'; - -// eigene separate Gestaltung mit main.scss (beinhaltet boostrap) -import './styles/main.scss'; - -import 'bootstrap'; // bootstrap JS wird über esbuild aus node_modules ausgelesen und eingebunden (bundled) - -import App from './App.jsx'; - -createRoot(document.getElementById('root')).render( - - - - - , -); diff --git a/05_react/unterricht/tag54/react-app/src/pages/About.jsx b/05_react/unterricht/tag54/react-app/src/pages/About.jsx deleted file mode 100644 index 6be700c..0000000 --- a/05_react/unterricht/tag54/react-app/src/pages/About.jsx +++ /dev/null @@ -1,13 +0,0 @@ -const About = (props) => { - // const { } = props; - - return ( -
      -
      -

      About

      -

      Welcome to the Single-Page-Application (SPA) with React. This is the About page.

      -
      -
      - ); -}; -export default About; diff --git a/05_react/unterricht/tag54/react-app/src/pages/Contact.jsx b/05_react/unterricht/tag54/react-app/src/pages/Contact.jsx deleted file mode 100644 index 68ff51a..0000000 --- a/05_react/unterricht/tag54/react-app/src/pages/Contact.jsx +++ /dev/null @@ -1,16 +0,0 @@ -const Contact = (props) => { - // const { } = props; - - return ( -
      -
      -

      Contact

      -

      - Lorem ipsum dolor, sit amet consectetur adipisicing elit. Iste suscipit eos autem iure soluta laboriosam in - perferendis atque explicabo, possimus eius? Ea magnam sed atque exercitationem officiis ipsum, deserunt iste. -

      -
      -
      - ); -}; -export default Contact; diff --git a/05_react/unterricht/tag54/react-app/src/pages/Home.jsx b/05_react/unterricht/tag54/react-app/src/pages/Home.jsx deleted file mode 100644 index ee88d61..0000000 --- a/05_react/unterricht/tag54/react-app/src/pages/Home.jsx +++ /dev/null @@ -1,13 +0,0 @@ -const Home = (props) => { - // const { } = props; - - return ( -
      -
      -

      Hello, Spa!

      -

      Welcome to the Single-Page-Application (SPA) with React. This is the Home page.

      -
      -
      - ); -}; -export default Home; diff --git a/05_react/unterricht/tag54/react-app/src/pages/projects/Fibonacci.jsx b/05_react/unterricht/tag54/react-app/src/pages/projects/Fibonacci.jsx deleted file mode 100644 index 0bfeda6..0000000 --- a/05_react/unterricht/tag54/react-app/src/pages/projects/Fibonacci.jsx +++ /dev/null @@ -1,45 +0,0 @@ -import { useState, useMemo } from 'react'; -import { FaMinus, FaPlus } from 'react-icons/fa6'; - -const Fibonacci = () => { - const [num, setNum] = useState(5); - - const fibonacci = useMemo(() => { - console.log('Fibonacci number is being calculated...'); - function fib(n) { - // Define a recursive function within the callback - if (n <= 1) { - return n; - } - return fib(n - 1) + fib(n - 2); - } - return fib(num); // Call the inner function - }, [num]); - - return ( -
      -
      -
      - - {num} - -
      -

      - The {num}th Fibonacci number is: {fibonacci} -

      -
      -
      - ); -}; - -export default Fibonacci; diff --git a/05_react/unterricht/tag54/react-app/src/pages/projects/TableProducts.jsx b/05_react/unterricht/tag54/react-app/src/pages/projects/TableProducts.jsx deleted file mode 100644 index 37f60fb..0000000 --- a/05_react/unterricht/tag54/react-app/src/pages/projects/TableProducts.jsx +++ /dev/null @@ -1,36 +0,0 @@ -import { useEffect, useState } from 'react'; -import axios from 'axios'; - -import Table from '../../components/tables/TableProducts'; - -const TableProducts = (props) => { - // const { } = props; - - const [items, setItems] = useState([]); - - useEffect(() => { - const getItems = async () => { - const { data } = await axios.get('/data/nerdshop-products.json'); - setItems(data); - }; - getItems(); - - // axios.get('/data/nerdshop-products.json').then((res) => { - // // console.log(res.data); - // setItems(res.data); - // }); - - return () => {}; - }, []); - - return ( -
      -
      -

      Table products

      -

      A inventory table of products

      -
      - {items.length > 0 &&
      ` alignment by inheriting `text-align`. -// 3. Fix alignment for Safari - -th { - font-weight: $table-th-font-weight; // 1 - text-align: inherit; // 2 - text-align: -webkit-match-parent; // 3 -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - - -// Forms -// -// 1. Allow labels to use `margin` for spacing. - -label { - display: inline-block; // 1 -} - -// Remove the default `border-radius` that macOS Chrome adds. -// See https://github.com/twbs/bootstrap/issues/24093 - -button { - // stylelint-disable-next-line property-disallowed-list - border-radius: 0; -} - -// Explicitly remove focus outline in Chromium when it shouldn't be -// visible (e.g. as result of mouse click or touch tap). It already -// should be doing this automatically, but seems to currently be -// confused and applies its very visible two-tone outline anyway. - -button:focus:not(:focus-visible) { - outline: 0; -} - -// 1. Remove the margin in Firefox and Safari - -input, -button, -select, -optgroup, -textarea { - margin: 0; // 1 - font-family: inherit; - @include font-size(inherit); - line-height: inherit; -} - -// Remove the inheritance of text transform in Firefox -button, -select { - text-transform: none; -} -// Set the cursor for non-` - - - - - - - - ); -}; -export default InputAmount; diff --git a/05_react/unterricht/tag54/react-app/src/components/inputs/InputPrice.jsx b/05_react/unterricht/tag54/react-app/src/components/inputs/InputPrice.jsx deleted file mode 100644 index 04cbc55..0000000 --- a/05_react/unterricht/tag54/react-app/src/components/inputs/InputPrice.jsx +++ /dev/null @@ -1,49 +0,0 @@ -// import { useState } from 'react'; -import { FaDollarSign, FaEuroSign, FaYenSign } from 'react-icons/fa6'; - -const InputPrice = (props) => { - const { currency = '$', price = 0 } = props; - - // const [price, setPrice] = useState(0); - - //Evenhandler - const handleChange = (e) => { - console.log(`Preis: ${e.target.value}`); - - props.onHandlePrice(e.target.value); - //setPrice(e.target.value); - }; - - return ( -
      -
      - {currency === '$' && ( - - - - )} - - {currency === '€' && ( - - - - )} - {currency === '¥' && ( - - - - )} -
      -
      - ); -}; -export default InputPrice; diff --git a/05_react/unterricht/tag54/react-app/src/components/logos/LogoMain.jsx b/05_react/unterricht/tag54/react-app/src/components/logos/LogoMain.jsx deleted file mode 100644 index e33f1d3..0000000 --- a/05_react/unterricht/tag54/react-app/src/components/logos/LogoMain.jsx +++ /dev/null @@ -1,12 +0,0 @@ -import Logo from '../../assets/img/logo-react.min.svg'; - -const LogoMain = (props) => { - // const { } = props; - - return ( -
      - React -
      - ); -}; -export default LogoMain; diff --git a/05_react/unterricht/tag54/react-app/src/components/navs/NavMain.jsx b/05_react/unterricht/tag54/react-app/src/components/navs/NavMain.jsx deleted file mode 100644 index 70e5c2f..0000000 --- a/05_react/unterricht/tag54/react-app/src/components/navs/NavMain.jsx +++ /dev/null @@ -1,66 +0,0 @@ -import { NavLink } from 'react-router-dom'; - -const NavMain = () => { - return ( - - ); -}; -export default NavMain; diff --git a/05_react/unterricht/tag54/react-app/src/components/navs/NavSocial.jsx b/05_react/unterricht/tag54/react-app/src/components/navs/NavSocial.jsx deleted file mode 100644 index 850c7ab..0000000 --- a/05_react/unterricht/tag54/react-app/src/components/navs/NavSocial.jsx +++ /dev/null @@ -1,33 +0,0 @@ -import { FaInstagram, FaXTwitter, FaYoutube, FaMeta } from 'react-icons/fa6'; - -const NavSocial = (props) => { - // const { } = props; - - return ( - - ); -}; -export default NavSocial; diff --git a/05_react/unterricht/tag54/react-app/src/components/sliders/SliderSplide.jsx b/05_react/unterricht/tag54/react-app/src/components/sliders/SliderSplide.jsx deleted file mode 100644 index e245e1d..0000000 --- a/05_react/unterricht/tag54/react-app/src/components/sliders/SliderSplide.jsx +++ /dev/null @@ -1,33 +0,0 @@ -import { Splide, SplideSlide } from '@splidejs/react-splide'; - -const SliderSplide = (props) => { - const { - images = [], - label = 'Slides', - options = { - rewind: true, - height: '100%', - autoplay: true, - speed: 800, - type: 'fade', - }, - } = props; - - return ( - <> - {images.length > 0 && ( -
      - - {images.map(({ path, title }, idx) => ( - // - - {title} - - ))} - -
      - )} - - ); -}; -export default SliderSplide; diff --git a/05_react/unterricht/tag54/react-app/src/components/tables/TableProducts.jsx b/05_react/unterricht/tag54/react-app/src/components/tables/TableProducts.jsx deleted file mode 100644 index 2d6468a..0000000 --- a/05_react/unterricht/tag54/react-app/src/components/tables/TableProducts.jsx +++ /dev/null @@ -1,148 +0,0 @@ -import { useCallback, useMemo, useReducer, useState } from 'react'; -import RowProduct from './content/RowProduct'; - -// Reducer (bei größerer Applikaitonsstuktur ausgelagert) -const initialState = (props) => { - // Validierung und Error Checks - items.filter((item) => !Object.hasOwn(item, _id)); - - return { - items: props.items || [ - { - _id: '1', - title: 'Example Product 1', - sku: 'ABC1234', - stock: 2, - price: 15.2, - }, - ], - }; -}; - -const reducer = (state, action) => { - const { type, payload } = action; - switch (type) { - case 'UPDATE_AMOUNT': - return { - ...state, - items: state.items.map((item) => - item._id === payload.id - ? { ...item, stock: payload.amount } // - : item, - ), - }; - case 'UPDATE_PRICE': - return { - ...state, - items: state.items.map((item) => - item._id === payload.id - ? { ...item, price: payload.price } // - : item, - ), - }; - default: - console.warn('no action found'); - return state; - } -}; - -const TableProducts = (props) => { - // const { - // items = [ - // { - // _id: '1', - // title: 'Example Product 1', - // sku: 'ABC1234', - // stock: 2, - // price: 15.2, - // }, - // ], - // } = props; - - const [{ items }, dispatch] = useReducer(reducer, initialState(props)); - - // const [items, setItems] = useState( - // props.items || [ - // { - // _id: '1', - // title: 'Example Product 1', - // sku: 'ABC1234', - // stock: 2, - // price: 15.2, - // }, - // ], - // ); - - // EventHandler ============ - const handleAmount = useCallback((amount, id) => { - dispatch({ type: 'UPDATE_AMOUNT', payload: { amount, id } }); - - setItems((prevItems) => { - return prevItems.map((item) => (item._id === id ? { ...item, stock: amount } : item)); - }); - }, []); - - const handlePrice = useCallback((price, id) => { - dispatch({ type: 'UPDATE_PRICE', payload: { price, id } }); - - // setItems((prevItems) => { - // return prevItems.map((item) => (item._id === id ? { ...item, price: price } : item)); - // }); - }, []); - - // Functions =============== - const totalPrice = useMemo(() => { - // [0, {stock: 2, price, 15.2}, {...}] - return items.reduce((sum, obj) => { - return sum + Number(obj.stock) * Number(obj.price); - }, 0); - }, [items]); - - // useCallback weiter Einsatzbereich in Kombination mit ref- Attribut - const theadRef = useCallback((el) => { - if (el) console.log(el); - }, []); - - // const getTotalPrice = () => { - // // [0, {stock: 2, price, 15.2}, {...}] - // return items.reduce((sum, obj) => { - // return sum + Number(obj.stock) * Number(obj.price); - // }, 0); - // }; - - return ( -
      -
      - - - - - - - - - - - - {items.length > 0 && - items.map((product, idx) => ( - - ))} - - - - - - - -
      SKUStockTitlePriceTotal
      Total:{totalPrice.toFixed(2)}
      -
      -
      - ); -}; -export default TableProducts; diff --git a/05_react/unterricht/tag54/react-app/src/components/tables/content/RowProduct.jsx b/05_react/unterricht/tag54/react-app/src/components/tables/content/RowProduct.jsx deleted file mode 100644 index 8e7042e..0000000 --- a/05_react/unterricht/tag54/react-app/src/components/tables/content/RowProduct.jsx +++ /dev/null @@ -1,37 +0,0 @@ -// import { useState } from 'react'; -import InputAmount from '../../inputs/InputAmount'; -import InputPrice from '../../inputs/InputPrice'; - -const RowProduct = (props) => { - const { _id, sku = '', stock: amount = 0, price = 0, title = '' } = props; - //const { sku = '', title = '' } = props; - - // const [amount, setAmount] = useState(props.stock || 0); - // const [price, setPrice] = useState(props.price || 0); - - // Eventhandler - const handleAmount = (val) => { - // setAmount(val); - props.onHandleAmount(val, _id); - }; - - const handlePrice = (val) => { - // setPrice(val); - props.onHandlePrice(val, _id); - }; - - return ( -
      {sku} - handleAmount(value)} /> - {title} - - {(amount * price).toFixed(2)}
      } - - ); -}; -export default TableProducts; diff --git a/05_react/unterricht/tag54/react-app/src/routes/Router.jsx b/05_react/unterricht/tag54/react-app/src/routes/Router.jsx deleted file mode 100644 index 9010e70..0000000 --- a/05_react/unterricht/tag54/react-app/src/routes/Router.jsx +++ /dev/null @@ -1,26 +0,0 @@ -import { Route, Routes } from 'react-router-dom'; -import Home from '../pages/Home'; -import About from '../pages/About'; -import Contact from '../pages/Contact'; - -// Projects -import Fibonacci from '../pages/projects/Fibonacci'; -import TableProducts from '../pages/projects/TableProducts'; - -const Router = (props) => { - // const { } = props; - - return ( - - } /> - } /> - } /> - - - } /> - } /> - - - ); -}; -export default Router; diff --git a/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/_index.scss b/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/_index.scss deleted file mode 100644 index dcefbc9..0000000 --- a/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/_index.scss +++ /dev/null @@ -1,3 +0,0 @@ -// @import 'bootstrap-5.3.8/bootstrap-grid'; -@import 'bootstrap-5.3.8/bootstrap'; -// @import 'bulma-1.04/index' diff --git a/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss b/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss deleted file mode 100644 index e9f267f..0000000 --- a/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss +++ /dev/null @@ -1,153 +0,0 @@ -// -// Base styles -// - -.accordion { - // scss-docs-start accordion-css-vars - --#{$prefix}accordion-color: #{$accordion-color}; - --#{$prefix}accordion-bg: #{$accordion-bg}; - --#{$prefix}accordion-transition: #{$accordion-transition}; - --#{$prefix}accordion-border-color: #{$accordion-border-color}; - --#{$prefix}accordion-border-width: #{$accordion-border-width}; - --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; - --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; - --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; - --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; - --#{$prefix}accordion-btn-color: #{$accordion-button-color}; - --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; - --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; - --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; - --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; - --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; - --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; - --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; - --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; - --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; - // scss-docs-end accordion-css-vars -} - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); - @include font-size($font-size-base); - color: var(--#{$prefix}accordion-btn-color); - text-align: left; // Reset button style - background-color: var(--#{$prefix}accordion-btn-bg); - border: 0; - @include border-radius(0); - overflow-anchor: none; - @include transition(var(--#{$prefix}accordion-transition)); - - &:not(.collapsed) { - color: var(--#{$prefix}accordion-active-color); - background-color: var(--#{$prefix}accordion-active-bg); - box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list - - &::after { - background-image: var(--#{$prefix}accordion-btn-active-icon); - transform: var(--#{$prefix}accordion-btn-icon-transform); - } - } - - // Accordion icon - &::after { - flex-shrink: 0; - width: var(--#{$prefix}accordion-btn-icon-width); - height: var(--#{$prefix}accordion-btn-icon-width); - margin-left: auto; - content: ""; - background-image: var(--#{$prefix}accordion-btn-icon); - background-repeat: no-repeat; - background-size: var(--#{$prefix}accordion-btn-icon-width); - @include transition(var(--#{$prefix}accordion-btn-icon-transition)); - } - - &:hover { - z-index: 2; - } - - &:focus { - z-index: 3; - outline: 0; - box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); - } -} - -.accordion-header { - margin-bottom: 0; -} - -.accordion-item { - color: var(--#{$prefix}accordion-color); - background-color: var(--#{$prefix}accordion-bg); - border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); - - &:first-of-type { - @include border-top-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - &:not(:first-of-type) { - border-top: 0; - } - - // Only set a border-radius on the last item if the accordion is collapsed - &:last-of-type { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - &.collapsed { - @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - > .accordion-collapse { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - } - } -} - -.accordion-body { - padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); -} - - -// Flush accordion items -// -// Remove borders and border-radius to keep accordion items edge-to-edge. - -.accordion-flush { - > .accordion-item { - border-right: 0; - border-left: 0; - @include border-radius(0); - - &:first-child { border-top: 0; } - &:last-child { border-bottom: 0; } - - // stylelint-disable selector-max-class - > .accordion-collapse, - > .accordion-header .accordion-button, - > .accordion-header .accordion-button.collapsed { - @include border-radius(0); - } - // stylelint-enable selector-max-class - } -} - -@if $enable-dark-mode { - @include color-mode(dark) { - .accordion-button::after { - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; - } - } -} diff --git a/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss b/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss deleted file mode 100644 index b8cff9b..0000000 --- a/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss +++ /dev/null @@ -1,68 +0,0 @@ -// -// Base styles -// - -.alert { - // scss-docs-start alert-css-vars - --#{$prefix}alert-bg: transparent; - --#{$prefix}alert-padding-x: #{$alert-padding-x}; - --#{$prefix}alert-padding-y: #{$alert-padding-y}; - --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; - --#{$prefix}alert-color: inherit; - --#{$prefix}alert-border-color: transparent; - --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); - --#{$prefix}alert-border-radius: #{$alert-border-radius}; - --#{$prefix}alert-link-color: inherit; - // scss-docs-end alert-css-vars - - position: relative; - padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); - margin-bottom: var(--#{$prefix}alert-margin-bottom); - color: var(--#{$prefix}alert-color); - background-color: var(--#{$prefix}alert-bg); - border: var(--#{$prefix}alert-border); - @include border-radius(var(--#{$prefix}alert-border-radius)); -} - -// Headings for larger alerts -.alert-heading { - // Specified to prevent conflicts of changing $headings-color - color: inherit; -} - -// Provide class for links that match alerts -.alert-link { - font-weight: $alert-link-font-weight; - color: var(--#{$prefix}alert-link-color); -} - - -// Dismissible alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissible { - padding-right: $alert-dismissible-padding-r; - - // Adjust close link position - .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: $stretched-link-z-index + 1; - padding: $alert-padding-y * 1.25 $alert-padding-x; - } -} - - -// scss-docs-start alert-modifiers -// Generate contextual modifier classes for colorizing the alert -@each $state in map-keys($theme-colors) { - .alert-#{$state} { - --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); - --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); - --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); - --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); - } -} -// scss-docs-end alert-modifiers diff --git a/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss b/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss deleted file mode 100644 index cc3d269..0000000 --- a/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss +++ /dev/null @@ -1,38 +0,0 @@ -// Base class -// -// Requires one of the contextual, color modifier classes for `color` and -// `background-color`. - -.badge { - // scss-docs-start badge-css-vars - --#{$prefix}badge-padding-x: #{$badge-padding-x}; - --#{$prefix}badge-padding-y: #{$badge-padding-y}; - @include rfs($badge-font-size, --#{$prefix}badge-font-size); - --#{$prefix}badge-font-weight: #{$badge-font-weight}; - --#{$prefix}badge-color: #{$badge-color}; - --#{$prefix}badge-border-radius: #{$badge-border-radius}; - // scss-docs-end badge-css-vars - - display: inline-block; - padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x); - @include font-size(var(--#{$prefix}badge-font-size)); - font-weight: var(--#{$prefix}badge-font-weight); - line-height: 1; - color: var(--#{$prefix}badge-color); - text-align: center; - white-space: nowrap; - vertical-align: baseline; - @include border-radius(var(--#{$prefix}badge-border-radius)); - @include gradient-bg(); - - // Empty badges collapse automatically - &:empty { - display: none; - } -} - -// Quick fix for badges in buttons -.btn .badge { - position: relative; - top: -1px; -} diff --git a/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss b/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss deleted file mode 100644 index b8252ff..0000000 --- a/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss +++ /dev/null @@ -1,40 +0,0 @@ -.breadcrumb { - // scss-docs-start breadcrumb-css-vars - --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x}; - --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y}; - --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom}; - @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size); - --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg}; - --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius}; - --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color}; - --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x}; - --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color}; - // scss-docs-end breadcrumb-css-vars - - display: flex; - flex-wrap: wrap; - padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x); - margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom); - @include font-size(var(--#{$prefix}breadcrumb-font-size)); - list-style: none; - background-color: var(--#{$prefix}breadcrumb-bg); - @include border-radius(var(--#{$prefix}breadcrumb-border-radius)); -} - -.breadcrumb-item { - // The separator between breadcrumbs (by default, a forward-slash: "/") - + .breadcrumb-item { - padding-left: var(--#{$prefix}breadcrumb-item-padding-x); - - &::before { - float: left; // Suppress inline spacings and underlining of the separator - padding-right: var(--#{$prefix}breadcrumb-item-padding-x); - color: var(--#{$prefix}breadcrumb-divider-color); - content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; - } - } - - &.active { - color: var(--#{$prefix}breadcrumb-item-active-color); - } -} diff --git a/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss b/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss deleted file mode 100644 index 78e1252..0000000 --- a/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss +++ /dev/null @@ -1,147 +0,0 @@ -// Make the div behave like a button -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; // match .btn alignment given font-size hack above - - > .btn { - position: relative; - flex: 1 1 auto; - } - - // Bring the hover, focused, and "active" buttons to the front to overlay - // the borders properly - > .btn-check:checked + .btn, - > .btn-check:focus + .btn, - > .btn:hover, - > .btn:focus, - > .btn:active, - > .btn.active { - z-index: 1; - } -} - -// Optional: Group multiple button groups together for a toolbar -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; - - .input-group { - width: auto; - } -} - -.btn-group { - @include border-radius($btn-border-radius); - - // Prevent double borders when buttons are next to each other - > :not(.btn-check:first-child) + .btn, - > .btn-group:not(:first-child) { - margin-left: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn.dropdown-toggle-split:first-child, - > .btn-group:not(:last-child) > .btn { - @include border-end-radius(0); - } - - // The left radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-start-radius(0); - } -} - -// Sizing -// -// Remix the default button sizing classes into new ones for easier manipulation. - -.btn-group-sm > .btn { @extend .btn-sm; } -.btn-group-lg > .btn { @extend .btn-lg; } - - -// -// Split button dropdowns -// - -.dropdown-toggle-split { - padding-right: $btn-padding-x * .75; - padding-left: $btn-padding-x * .75; - - &::after, - .dropup &::after, - .dropend &::after { - margin-left: 0; - } - - .dropstart &::before { - margin-right: 0; - } -} - -.btn-sm + .dropdown-toggle-split { - padding-right: $btn-padding-x-sm * .75; - padding-left: $btn-padding-x-sm * .75; -} - -.btn-lg + .dropdown-toggle-split { - padding-right: $btn-padding-x-lg * .75; - padding-left: $btn-padding-x-lg * .75; -} - - -// The clickable button for toggling the menu -// Set the same inset shadow as the :active state -.btn-group.show .dropdown-toggle { - @include box-shadow($btn-active-box-shadow); - - // Show no shadow for `.btn-link` since it has no other button styles. - &.btn-link { - @include box-shadow(none); - } -} - - -// -// Vertical button groups -// - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; - - > .btn, - > .btn-group { - width: 100%; - } - - > .btn:not(:first-child), - > .btn-group:not(:first-child) { - margin-top: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn-group:not(:last-child) > .btn { - @include border-bottom-radius(0); - } - - // The top radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-top-radius(0); - } -} diff --git a/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss b/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss deleted file mode 100644 index caa4518..0000000 --- a/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss +++ /dev/null @@ -1,216 +0,0 @@ -// -// Base styles -// - -.btn { - // scss-docs-start btn-css-vars - --#{$prefix}btn-padding-x: #{$btn-padding-x}; - --#{$prefix}btn-padding-y: #{$btn-padding-y}; - --#{$prefix}btn-font-family: #{$btn-font-family}; - @include rfs($btn-font-size, --#{$prefix}btn-font-size); - --#{$prefix}btn-font-weight: #{$btn-font-weight}; - --#{$prefix}btn-line-height: #{$btn-line-height}; - --#{$prefix}btn-color: #{$btn-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-width: #{$btn-border-width}; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-border-radius: #{$btn-border-radius}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-box-shadow: #{$btn-box-shadow}; - --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity}; - --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5); - // scss-docs-end btn-css-vars - - display: inline-block; - padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x); - font-family: var(--#{$prefix}btn-font-family); - @include font-size(var(--#{$prefix}btn-font-size)); - font-weight: var(--#{$prefix}btn-font-weight); - line-height: var(--#{$prefix}btn-line-height); - color: var(--#{$prefix}btn-color); - text-align: center; - text-decoration: if($link-decoration == none, null, none); - white-space: $btn-white-space; - vertical-align: middle; - cursor: if($enable-button-pointers, pointer, null); - user-select: none; - border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color); - @include border-radius(var(--#{$prefix}btn-border-radius)); - @include gradient-bg(var(--#{$prefix}btn-bg)); - @include box-shadow(var(--#{$prefix}btn-box-shadow)); - @include transition($btn-transition); - - &:hover { - color: var(--#{$prefix}btn-hover-color); - text-decoration: if($link-hover-decoration == underline, none, null); - background-color: var(--#{$prefix}btn-hover-bg); - border-color: var(--#{$prefix}btn-hover-border-color); - } - - .btn-check + &:hover { - // override for the checkbox/radio buttons - color: var(--#{$prefix}btn-color); - background-color: var(--#{$prefix}btn-bg); - border-color: var(--#{$prefix}btn-border-color); - } - - &:focus-visible { - color: var(--#{$prefix}btn-hover-color); - @include gradient-bg(var(--#{$prefix}btn-hover-bg)); - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:focus-visible + & { - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:checked + &, - :not(.btn-check) + &:active, - &:first-child:active, - &.active, - &.show { - color: var(--#{$prefix}btn-active-color); - background-color: var(--#{$prefix}btn-active-bg); - // Remove CSS gradients if they're enabled - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-active-border-color); - @include box-shadow(var(--#{$prefix}btn-active-shadow)); - - &:focus-visible { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - } - - .btn-check:checked:focus-visible + & { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - &:disabled, - &.disabled, - fieldset:disabled & { - color: var(--#{$prefix}btn-disabled-color); - pointer-events: none; - background-color: var(--#{$prefix}btn-disabled-bg); - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-disabled-border-color); - opacity: var(--#{$prefix}btn-disabled-opacity); - @include box-shadow(none); - } -} - - -// -// Alternate buttons -// - -// scss-docs-start btn-variant-loops -@each $color, $value in $theme-colors { - .btn-#{$color} { - @if $color == "light" { - @include button-variant( - $value, - $value, - $hover-background: shade-color($value, $btn-hover-bg-shade-amount), - $hover-border: shade-color($value, $btn-hover-border-shade-amount), - $active-background: shade-color($value, $btn-active-bg-shade-amount), - $active-border: shade-color($value, $btn-active-border-shade-amount) - ); - } @else if $color == "dark" { - @include button-variant( - $value, - $value, - $hover-background: tint-color($value, $btn-hover-bg-tint-amount), - $hover-border: tint-color($value, $btn-hover-border-tint-amount), - $active-background: tint-color($value, $btn-active-bg-tint-amount), - $active-border: tint-color($value, $btn-active-border-tint-amount) - ); - } @else { - @include button-variant($value, $value); - } - } -} - -@each $color, $value in $theme-colors { - .btn-outline-#{$color} { - @include button-outline-variant($value); - } -} -// scss-docs-end btn-variant-loops - - -// -// Link buttons -// - -// Make a button look and behave like a link -.btn-link { - --#{$prefix}btn-font-weight: #{$font-weight-normal}; - --#{$prefix}btn-color: #{$btn-link-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-hover-color: #{$btn-link-hover-color}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-active-color: #{$btn-link-hover-color}; - --#{$prefix}btn-active-border-color: transparent; - --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color}; - --#{$prefix}btn-disabled-border-color: transparent; - --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows - --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb}; - - text-decoration: $link-decoration; - @if $enable-gradients { - background-image: none; - } - - &:hover, - &:focus-visible { - text-decoration: $link-hover-decoration; - } - - &:focus-visible { - color: var(--#{$prefix}btn-color); - } - - &:hover { - color: var(--#{$prefix}btn-hover-color); - } - - // No need for an active state here -} - - -// -// Button Sizes -// - -.btn-lg { - @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); -} - -.btn-sm { - @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); -} diff --git a/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss b/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss deleted file mode 100644 index dcebe6a..0000000 --- a/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss +++ /dev/null @@ -1,238 +0,0 @@ -// -// Base styles -// - -.card { - // scss-docs-start card-css-vars - --#{$prefix}card-spacer-y: #{$card-spacer-y}; - --#{$prefix}card-spacer-x: #{$card-spacer-x}; - --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y}; - --#{$prefix}card-title-color: #{$card-title-color}; - --#{$prefix}card-subtitle-color: #{$card-subtitle-color}; - --#{$prefix}card-border-width: #{$card-border-width}; - --#{$prefix}card-border-color: #{$card-border-color}; - --#{$prefix}card-border-radius: #{$card-border-radius}; - --#{$prefix}card-box-shadow: #{$card-box-shadow}; - --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius}; - --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y}; - --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x}; - --#{$prefix}card-cap-bg: #{$card-cap-bg}; - --#{$prefix}card-cap-color: #{$card-cap-color}; - --#{$prefix}card-height: #{$card-height}; - --#{$prefix}card-color: #{$card-color}; - --#{$prefix}card-bg: #{$card-bg}; - --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding}; - --#{$prefix}card-group-margin: #{$card-group-margin}; - // scss-docs-end card-css-vars - - position: relative; - display: flex; - flex-direction: column; - min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 - height: var(--#{$prefix}card-height); - color: var(--#{$prefix}body-color); - word-wrap: break-word; - background-color: var(--#{$prefix}card-bg); - background-clip: border-box; - border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - @include border-radius(var(--#{$prefix}card-border-radius)); - @include box-shadow(var(--#{$prefix}card-box-shadow)); - - > hr { - margin-right: 0; - margin-left: 0; - } - - > .list-group { - border-top: inherit; - border-bottom: inherit; - - &:first-child { - border-top-width: 0; - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); - } - - &:last-child { - border-bottom-width: 0; - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); - } - } - - // Due to specificity of the above selector (`.card > .list-group`), we must - // use a child selector here to prevent double borders. - > .card-header + .list-group, - > .list-group + .card-footer { - border-top: 0; - } -} - -.card-body { - // Enable `flex-grow: 1` for decks and groups so that card blocks take up - // as much space as possible, ensuring footers are aligned to the bottom. - flex: 1 1 auto; - padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x); - color: var(--#{$prefix}card-color); -} - -.card-title { - margin-bottom: var(--#{$prefix}card-title-spacer-y); - color: var(--#{$prefix}card-title-color); -} - -.card-subtitle { - margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list - margin-bottom: 0; - color: var(--#{$prefix}card-subtitle-color); -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link { - &:hover { - text-decoration: if($link-hover-decoration == underline, none, null); - } - - + .card-link { - margin-left: var(--#{$prefix}card-spacer-x); - } -} - -// -// Optional textual caps -// - -.card-header { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - margin-bottom: 0; // Removes the default margin-bottom of - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:first-child { - @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0); - } -} - -.card-footer { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:last-child { - @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius)); - } -} - - -// -// Header navs -// - -.card-header-tabs { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - border-bottom: 0; - - .nav-link.active { - background-color: var(--#{$prefix}card-bg); - border-bottom-color: var(--#{$prefix}card-bg); - } -} - -.card-header-pills { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list -} - -// Card image -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: var(--#{$prefix}card-img-overlay-padding); - @include border-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch -} - -.card-img, -.card-img-top { - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-bottom { - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); -} - - -// -// Card groups -// - -.card-group { - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - margin-bottom: var(--#{$prefix}card-group-margin); - } - - @include media-breakpoint-up(sm) { - display: flex; - flex-flow: row wrap; - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - flex: 1 0 0; - margin-bottom: 0; - - + .card { - margin-left: 0; - border-left: 0; - } - - // Handle rounded corners - @if $enable-rounded { - &:not(:last-child) { - @include border-end-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-right-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-right-radius: 0; - } - } - - &:not(:first-child) { - @include border-start-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-left-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-left-radius: 0; - } - } - } - } - } -} diff --git a/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss b/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss deleted file mode 100644 index 5ebf6b1..0000000 --- a/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss +++ /dev/null @@ -1,226 +0,0 @@ -// Notes on the classes: -// -// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) -// even when their scroll action started on a carousel, but for compatibility (with Firefox) -// we're preventing all actions instead -// 2. The .carousel-item-start and .carousel-item-end is used to indicate where -// the active slide is heading. -// 3. .active.carousel-item is the current slide. -// 4. .active.carousel-item-start and .active.carousel-item-end is the current -// slide in its in-transition state. Only one of these occurs at a time. -// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end -// is the upcoming slide in transition. - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; - @include clearfix(); -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - @include transition($carousel-transition); -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); -} - - -// -// Alternate transitions -// - -.carousel-fade { - .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; - } - - .carousel-item.active, - .carousel-item-next.carousel-item-start, - .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; - } - - .active.carousel-item-start, - .active.carousel-item-end { - z-index: 0; - opacity: 0; - @include transition(opacity 0s $carousel-transition-duration); - } -} - - -// -// Left/right controls for nav -// - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - // Use flex for alignment (1-3) - display: flex; // 1. allow flex styles - align-items: center; // 2. vertically center contents - justify-content: center; // 3. horizontally center contents - width: $carousel-control-width; - padding: 0; - color: $carousel-control-color; - text-align: center; - background: none; - filter: var(--#{$prefix}carousel-control-icon-filter); - border: 0; - opacity: $carousel-control-opacity; - @include transition($carousel-control-transition); - - // Hover/focus state - &:hover, - &:focus { - color: $carousel-control-color; - text-decoration: none; - outline: 0; - opacity: $carousel-control-hover-opacity; - } -} -.carousel-control-prev { - left: 0; - background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); -} -.carousel-control-next { - right: 0; - background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); -} - -// Icons for within -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: $carousel-control-icon-width; - height: $carousel-control-icon-width; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; -} - -.carousel-control-prev-icon { - background-image: escape-svg($carousel-control-prev-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-next-icon-bg) + "*/"}; -} -.carousel-control-next-icon { - background-image: escape-svg($carousel-control-next-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-prev-icon-bg) + "*/"}; -} - -// Optional indicator pips/controls -// -// Add a container (such as a list) with the following class and add an item (ideally a focusable control, -// like a button) with data-bs-target for each slide your carousel holds. - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - // Use the .carousel-control's width as margin so we don't overlay those - margin-right: $carousel-control-width; - margin-bottom: 1rem; - margin-left: $carousel-control-width; - - [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: $carousel-indicator-width; - height: $carousel-indicator-height; - padding: 0; - margin-right: $carousel-indicator-spacer; - margin-left: $carousel-indicator-spacer; - text-indent: -999px; - cursor: pointer; - background-color: var(--#{$prefix}carousel-indicator-active-bg); - background-clip: padding-box; - border: 0; - // Use transparent borders to increase the hit area by 10px on top and bottom. - border-top: $carousel-indicator-hit-area-height solid transparent; - border-bottom: $carousel-indicator-hit-area-height solid transparent; - opacity: $carousel-indicator-opacity; - @include transition($carousel-indicator-transition); - } - - .active { - opacity: $carousel-indicator-active-opacity; - } -} - - -// Optional captions -// -// - -.carousel-caption { - position: absolute; - right: (100% - $carousel-caption-width) * .5; - bottom: $carousel-caption-spacer; - left: (100% - $carousel-caption-width) * .5; - padding-top: $carousel-caption-padding-y; - padding-bottom: $carousel-caption-padding-y; - color: var(--#{$prefix}carousel-caption-color); - text-align: center; -} - -// Dark mode carousel - -@mixin carousel-dark() { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg-dark}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color-dark}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter-dark}; -} - -.carousel-dark { - @include carousel-dark(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include carousel-dark(); - } -} diff --git a/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss b/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss deleted file mode 100644 index d53c96f..0000000 --- a/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss +++ /dev/null @@ -1,66 +0,0 @@ -// Transparent background and border properties included for button version. -// iOS requires the button element instead of an anchor tag. -// If you want the anchor version, it requires `href="#"`. -// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile - -.btn-close { - // scss-docs-start close-css-vars - --#{$prefix}btn-close-color: #{$btn-close-color}; - --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) }; - --#{$prefix}btn-close-opacity: #{$btn-close-opacity}; - --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity}; - --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow}; - --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity}; - --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity}; - // scss-docs-end close-css-vars - - box-sizing: content-box; - width: $btn-close-width; - height: $btn-close-height; - padding: $btn-close-padding-y $btn-close-padding-x; - color: var(--#{$prefix}btn-close-color); - background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements - filter: var(--#{$prefix}btn-close-filter); - border: 0; // for button elements - @include border-radius(); - opacity: var(--#{$prefix}btn-close-opacity); - - // Override 's hover style - &:hover { - color: var(--#{$prefix}btn-close-color); - text-decoration: none; - opacity: var(--#{$prefix}btn-close-hover-opacity); - } - - &:focus { - outline: 0; - box-shadow: var(--#{$prefix}btn-close-focus-shadow); - opacity: var(--#{$prefix}btn-close-focus-opacity); - } - - &:disabled, - &.disabled { - pointer-events: none; - user-select: none; - opacity: var(--#{$prefix}btn-close-disabled-opacity); - } -} - -@mixin btn-close-white() { - --#{$prefix}btn-close-filter: #{$btn-close-filter-dark}; -} - -.btn-close-white { - @include btn-close-white(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}btn-close-filter: #{$btn-close-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include btn-close-white(); - } -} diff --git a/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss b/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss deleted file mode 100644 index 83b3138..0000000 --- a/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss +++ /dev/null @@ -1,41 +0,0 @@ -// Container widths -// -// Set the container width, and override it for fixed navbars in media queries. - -@if $enable-container-classes { - // Single container class with breakpoint max-widths - .container, - // 100% wide container at all breakpoints - .container-fluid { - @include make-container(); - } - - // Responsive containers that are 100% wide until a breakpoint - @each $breakpoint, $container-max-width in $container-max-widths { - .container-#{$breakpoint} { - @extend .container-fluid; - } - - @include media-breakpoint-up($breakpoint, $grid-breakpoints) { - %responsive-container-#{$breakpoint} { - max-width: $container-max-width; - } - - // Extend each breakpoint which is smaller or equal to the current breakpoint - $extend-breakpoint: true; - - @each $name, $width in $grid-breakpoints { - @if ($extend-breakpoint) { - .container#{breakpoint-infix($name, $grid-breakpoints)} { - @extend %responsive-container-#{$breakpoint}; - } - - // Once the current breakpoint is reached, stop extending - @if ($breakpoint == $name) { - $extend-breakpoint: false; - } - } - } - } - } -} diff --git a/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss b/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss deleted file mode 100644 index 587ebb4..0000000 --- a/05_react/unterricht/tag54/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss +++ /dev/null @@ -1,250 +0,0 @@ -// The dropdown wrapper (`
      `) -.dropup, -.dropend, -.dropdown, -.dropstart, -.dropup-center, -.dropdown-center { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; - - // Generate the caret automatically - @include caret(); -} - -// The dropdown menu -.dropdown-menu { - // scss-docs-start dropdown-css-vars - --#{$prefix}dropdown-zindex: #{$zindex-dropdown}; - --#{$prefix}dropdown-min-width: #{$dropdown-min-width}; - --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x}; - --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y}; - --#{$prefix}dropdown-spacer: #{$dropdown-spacer}; - @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size); - --#{$prefix}dropdown-color: #{$dropdown-color}; - --#{$prefix}dropdown-bg: #{$dropdown-bg}; - --#{$prefix}dropdown-border-color: #{$dropdown-border-color}; - --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius}; - --#{$prefix}dropdown-border-width: #{$dropdown-border-width}; - --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius}; - --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg}; - --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y}; - --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow}; - --#{$prefix}dropdown-link-color: #{$dropdown-link-color}; - --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color}; - --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg}; - --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color}; - --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg}; - --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color}; - --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x}; - --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y}; - --#{$prefix}dropdown-header-color: #{$dropdown-header-color}; - --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x}; - --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y}; - // scss-docs-end dropdown-css-vars - - position: absolute; - z-index: var(--#{$prefix}dropdown-zindex); - display: none; // none by default, but block on "open" of the menu - min-width: var(--#{$prefix}dropdown-min-width); - padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x); - margin: 0; // Override default margin of ul - @include font-size(var(--#{$prefix}dropdown-font-size)); - color: var(--#{$prefix}dropdown-color); - text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) - list-style: none; - background-color: var(--#{$prefix}dropdown-bg); - background-clip: padding-box; - border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color); - @include border-radius(var(--#{$prefix}dropdown-border-radius)); - @include box-shadow(var(--#{$prefix}dropdown-box-shadow)); - - &[data-bs-popper] { - top: 100%; - left: 0; - margin-top: var(--#{$prefix}dropdown-spacer); - } - - @if $dropdown-padding-y == 0 { - > .dropdown-item:first-child, - > li:first-child .dropdown-item { - @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - > .dropdown-item:last-child, - > li:last-child .dropdown-item { - @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - - } -} - -// scss-docs-start responsive-breakpoints -// We deliberately hardcode the `bs-` prefix because we check -// this custom property in JS to determine Popper's positioning - -@each $breakpoint in map-keys($grid-breakpoints) { - @include media-breakpoint-up($breakpoint) { - $infix: breakpoint-infix($breakpoint, $grid-breakpoints); - - .dropdown-menu#{$infix}-start { - --bs-position: start; - - &[data-bs-popper] { - right: auto; - left: 0; - } - } - - .dropdown-menu#{$infix}-end { - --bs-position: end; - - &[data-bs-popper] { - right: 0; - left: auto; - } - } - } -} -// scss-docs-end responsive-breakpoints - -// Allow for dropdowns to go bottom up (aka, dropup-menu) -// Just add .dropup after the standard .dropdown class and you're set. -.dropup { - .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(up); - } -} - -.dropend { - .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(end); - &::after { - vertical-align: 0; - } - } -} - -.dropstart { - .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(start); - &::before { - vertical-align: 0; - } - } -} - - -// Dividers (basically an `
      `) within the dropdown -.dropdown-divider { - height: 0; - margin: var(--#{$prefix}dropdown-divider-margin-y) 0; - overflow: hidden; - border-top: 1px solid var(--#{$prefix}dropdown-divider-bg); - opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
      element -} - -// Links, buttons, and more within the dropdown menu -// -// `
      - - - - - - - ); -}; -export default memo(RowProduct); diff --git a/05_react/unterricht/tag55/react-app-advanced/src/main.jsx b/05_react/unterricht/tag55/react-app-advanced/src/main.jsx deleted file mode 100644 index 6187b22..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/main.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; -import { BrowserRouter } from 'react-router-dom'; - -// eigene separate Gestaltung mit main.scss (beinhaltet boostrap) -import './styles/main.scss'; - -import 'bootstrap'; // bootstrap JS wird über esbuild aus node_modules ausgelesen und eingebunden (bundled) - -import App from './App.jsx'; - -createRoot(document.getElementById('root')).render( - - - - - , -); diff --git a/05_react/unterricht/tag55/react-app-advanced/src/pages/About.jsx b/05_react/unterricht/tag55/react-app-advanced/src/pages/About.jsx deleted file mode 100644 index 6be700c..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/pages/About.jsx +++ /dev/null @@ -1,13 +0,0 @@ -const About = (props) => { - // const { } = props; - - return ( -
      -
      -

      About

      -

      Welcome to the Single-Page-Application (SPA) with React. This is the About page.

      -
      -
      - ); -}; -export default About; diff --git a/05_react/unterricht/tag55/react-app-advanced/src/pages/Contact.jsx b/05_react/unterricht/tag55/react-app-advanced/src/pages/Contact.jsx deleted file mode 100644 index 68ff51a..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/pages/Contact.jsx +++ /dev/null @@ -1,16 +0,0 @@ -const Contact = (props) => { - // const { } = props; - - return ( -
      -
      -

      Contact

      -

      - Lorem ipsum dolor, sit amet consectetur adipisicing elit. Iste suscipit eos autem iure soluta laboriosam in - perferendis atque explicabo, possimus eius? Ea magnam sed atque exercitationem officiis ipsum, deserunt iste. -

      -
      -
      - ); -}; -export default Contact; diff --git a/05_react/unterricht/tag55/react-app-advanced/src/pages/Home.jsx b/05_react/unterricht/tag55/react-app-advanced/src/pages/Home.jsx deleted file mode 100644 index ee88d61..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/pages/Home.jsx +++ /dev/null @@ -1,13 +0,0 @@ -const Home = (props) => { - // const { } = props; - - return ( -
      -
      -

      Hello, Spa!

      -

      Welcome to the Single-Page-Application (SPA) with React. This is the Home page.

      -
      -
      - ); -}; -export default Home; diff --git a/05_react/unterricht/tag55/react-app-advanced/src/pages/projects/Examples.jsx b/05_react/unterricht/tag55/react-app-advanced/src/pages/projects/Examples.jsx deleted file mode 100644 index d9b08c9..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/pages/projects/Examples.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import ExampleUseContext from '../../components/examples/ExampleUseContext'; -import ThemeProvider from '../../components/examples/theme-switcher/ThemeProvider'; - -const Examples = () => { - return ( -
      -
      -

      Examples

      -
      -

      useContext

      - - - -
      -
      - ); -}; -export default Examples; diff --git a/05_react/unterricht/tag55/react-app-advanced/src/pages/projects/Fibonacci.jsx b/05_react/unterricht/tag55/react-app-advanced/src/pages/projects/Fibonacci.jsx deleted file mode 100644 index 0bfeda6..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/pages/projects/Fibonacci.jsx +++ /dev/null @@ -1,45 +0,0 @@ -import { useState, useMemo } from 'react'; -import { FaMinus, FaPlus } from 'react-icons/fa6'; - -const Fibonacci = () => { - const [num, setNum] = useState(5); - - const fibonacci = useMemo(() => { - console.log('Fibonacci number is being calculated...'); - function fib(n) { - // Define a recursive function within the callback - if (n <= 1) { - return n; - } - return fib(n - 1) + fib(n - 2); - } - return fib(num); // Call the inner function - }, [num]); - - return ( -
      -
      -
      - - {num} - -
      -

      - The {num}th Fibonacci number is: {fibonacci} -

      -
      -
      - ); -}; - -export default Fibonacci; diff --git a/05_react/unterricht/tag55/react-app-advanced/src/pages/projects/TableProducts.jsx b/05_react/unterricht/tag55/react-app-advanced/src/pages/projects/TableProducts.jsx deleted file mode 100644 index 37f60fb..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/pages/projects/TableProducts.jsx +++ /dev/null @@ -1,36 +0,0 @@ -import { useEffect, useState } from 'react'; -import axios from 'axios'; - -import Table from '../../components/tables/TableProducts'; - -const TableProducts = (props) => { - // const { } = props; - - const [items, setItems] = useState([]); - - useEffect(() => { - const getItems = async () => { - const { data } = await axios.get('/data/nerdshop-products.json'); - setItems(data); - }; - getItems(); - - // axios.get('/data/nerdshop-products.json').then((res) => { - // // console.log(res.data); - // setItems(res.data); - // }); - - return () => {}; - }, []); - - return ( -
      -
      -

      Table products

      -

      A inventory table of products

      -
      - {items.length > 0 &&
      ` alignment by inheriting `text-align`. -// 3. Fix alignment for Safari - -th { - font-weight: $table-th-font-weight; // 1 - text-align: inherit; // 2 - text-align: -webkit-match-parent; // 3 -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - - -// Forms -// -// 1. Allow labels to use `margin` for spacing. - -label { - display: inline-block; // 1 -} - -// Remove the default `border-radius` that macOS Chrome adds. -// See https://github.com/twbs/bootstrap/issues/24093 - -button { - // stylelint-disable-next-line property-disallowed-list - border-radius: 0; -} - -// Explicitly remove focus outline in Chromium when it shouldn't be -// visible (e.g. as result of mouse click or touch tap). It already -// should be doing this automatically, but seems to currently be -// confused and applies its very visible two-tone outline anyway. - -button:focus:not(:focus-visible) { - outline: 0; -} - -// 1. Remove the margin in Firefox and Safari - -input, -button, -select, -optgroup, -textarea { - margin: 0; // 1 - font-family: inherit; - @include font-size(inherit); - line-height: inherit; -} - -// Remove the inheritance of text transform in Firefox -button, -select { - text-transform: none; -} -// Set the cursor for non-` - - - - - ); -}; -export default ExampleUseReducer; diff --git a/05_react/unterricht/tag55/react-app-advanced/src/components/examples/ExampleUseState.jsx b/05_react/unterricht/tag55/react-app-advanced/src/components/examples/ExampleUseState.jsx deleted file mode 100644 index 8a9487b..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/components/examples/ExampleUseState.jsx +++ /dev/null @@ -1,41 +0,0 @@ -import { useState } from 'react'; - -import { FaPlus, FaMinus } from 'react-icons/fa6'; - -const ExampleUseState = (props) => { - // const { } = props; - - const [counter, setCounter] = useState(0); - - // let counter = 0; - - // EventHandler ======= - const handleClick = (e) => { - console.log('click'); - const btn = e.currentTarget; - const label = btn.ariaLabel; - - switch (label) { - case 'Increase': - // setCounter(counter + 1); // setter(value) - setCounter((prevState) => prevState + 1); // setter(fn(prevValue) => newValue ) - break; - case 'Decrease': - setCounter(counter - 1); - break; - } - }; - - return ( -
      - Counter: {counter} - - -
      - ); -}; -export default ExampleUseState; diff --git a/05_react/unterricht/tag55/react-app-advanced/src/components/examples/theme-switcher/ThemeContext.jsx b/05_react/unterricht/tag55/react-app-advanced/src/components/examples/theme-switcher/ThemeContext.jsx deleted file mode 100644 index ee75ac4..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/components/examples/theme-switcher/ThemeContext.jsx +++ /dev/null @@ -1,8 +0,0 @@ -import { createContext } from 'react'; - -export const THEME_DEFAULT_VALUE = 'light'; - -const ThemeContext = createContext(THEME_DEFAULT_VALUE); // standard theme is light; -// ThemeContext wird durch createContext() zu einem JSX-Element - -export default ThemeContext; diff --git a/05_react/unterricht/tag55/react-app-advanced/src/components/examples/theme-switcher/ThemeProvider.jsx b/05_react/unterricht/tag55/react-app-advanced/src/components/examples/theme-switcher/ThemeProvider.jsx deleted file mode 100644 index f21ff57..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/components/examples/theme-switcher/ThemeProvider.jsx +++ /dev/null @@ -1,26 +0,0 @@ -import { useState } from 'react'; -import ThemeContext, { THEME_DEFAULT_VALUE } from './ThemeContext'; - -const ThemeProvider = (props) => { - const { children } = props; - - console.log(ThemeContext._currentValue); // 'light' <- _currentValue beinhaltet initialWert. Soll aber in production Umgebung nicht verwendet werden, da kein offizieller Standard. - - const [theme, setTheme] = useState(THEME_DEFAULT_VALUE); - - // EventHandler ============== - const handleToggleTheme = () => { - console.log('click'); - setTheme((prevState) => (prevState === 'light' ? 'dark' : 'light')); - }; - - return ( - - - {children} - - ); -}; -export default ThemeProvider; diff --git a/05_react/unterricht/tag55/react-app-advanced/src/components/footers/FooterMain.jsx b/05_react/unterricht/tag55/react-app-advanced/src/components/footers/FooterMain.jsx deleted file mode 100644 index edb318a..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/components/footers/FooterMain.jsx +++ /dev/null @@ -1,48 +0,0 @@ -import NavSocial from '../navs/NavSocial'; - -const FooterMain = (props) => { - // const { } = props; - - return ( -
      -
      -
      -
      -
      -

      Contact

      -
      - John Smith -
      - 1 Example Street -
      - Anytown, AB1 2CD -
      -
      -
      -
      -
      -

      More Information

      - -
      -
      -
      -
      -

      Social Media

      - -
      -
      -
      -
      -
      - ); -}; -export default FooterMain; diff --git a/05_react/unterricht/tag55/react-app-advanced/src/components/headers/HeaderMain.jsx b/05_react/unterricht/tag55/react-app-advanced/src/components/headers/HeaderMain.jsx deleted file mode 100644 index f06dc74..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/components/headers/HeaderMain.jsx +++ /dev/null @@ -1,21 +0,0 @@ -import LogoMain from '../logos/LogoMain'; -import SliderSplide from '../sliders/SliderSplide'; - -const HeaderMain = () => { - const images = [ - { path: '/img/slides/slide-01.jpg', title: 'Classroom' }, - { path: '/img/slides/slide-02.jpg', title: 'Mountains' }, - { path: '/img/slides/slide-03.jpg', title: 'Canyons' }, - ]; - - return ( -
      - -
      - -
      -
      - ); -}; - -export default HeaderMain; diff --git a/05_react/unterricht/tag55/react-app-advanced/src/components/inputs/InputAmount.jsx b/05_react/unterricht/tag55/react-app-advanced/src/components/inputs/InputAmount.jsx deleted file mode 100644 index b657040..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/components/inputs/InputAmount.jsx +++ /dev/null @@ -1,67 +0,0 @@ -// import { useState } from 'react'; -import { FaMinus, FaPlus } from 'react-icons/fa6'; -// npm install react-icons | Auf der npm Seite mit --save, ist nicht mehr nötig -const InputAmount = (props) => { - const { amount = 0, max = 100, min = -100 } = props; - // const [amount, setAmount] = useState(props.amount || 0); - - // EventHandlers ================ - const handleChange = (e) => { - const inputValue = e.target.value; - const numericRegExp = new RegExp(/^-?\d*$/); // regular expression for numbers (including optional minus sign) - - if (!numericRegExp.test(inputValue)) return; - // setAmount(inputValue); - props.onHandleAmount(inputValue); - }; - const handleClickDec = (e) => { - // Guard - if (amount < min) return; - - props.onHandleAmount(amount - 1); - // setAmount((prevState) => prevState - 1); - }; - - const handleClickInc = (e) => { - // Guard - if (amount > max) return; - - // setAmount((prevState) => prevState + 1); - props.onHandleAmount(amount + 1); - }; - - return ( -
      -
      - - - - - - - -
      -
      - ); -}; -export default InputAmount; diff --git a/05_react/unterricht/tag55/react-app-advanced/src/components/inputs/InputPrice.jsx b/05_react/unterricht/tag55/react-app-advanced/src/components/inputs/InputPrice.jsx deleted file mode 100644 index 04cbc55..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/components/inputs/InputPrice.jsx +++ /dev/null @@ -1,49 +0,0 @@ -// import { useState } from 'react'; -import { FaDollarSign, FaEuroSign, FaYenSign } from 'react-icons/fa6'; - -const InputPrice = (props) => { - const { currency = '$', price = 0 } = props; - - // const [price, setPrice] = useState(0); - - //Evenhandler - const handleChange = (e) => { - console.log(`Preis: ${e.target.value}`); - - props.onHandlePrice(e.target.value); - //setPrice(e.target.value); - }; - - return ( -
      -
      - {currency === '$' && ( - - - - )} - - {currency === '€' && ( - - - - )} - {currency === '¥' && ( - - - - )} -
      -
      - ); -}; -export default InputPrice; diff --git a/05_react/unterricht/tag55/react-app-advanced/src/components/logos/LogoMain.jsx b/05_react/unterricht/tag55/react-app-advanced/src/components/logos/LogoMain.jsx deleted file mode 100644 index e33f1d3..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/components/logos/LogoMain.jsx +++ /dev/null @@ -1,12 +0,0 @@ -import Logo from '../../assets/img/logo-react.min.svg'; - -const LogoMain = (props) => { - // const { } = props; - - return ( -
      - React -
      - ); -}; -export default LogoMain; diff --git a/05_react/unterricht/tag55/react-app-advanced/src/components/navs/NavMain.jsx b/05_react/unterricht/tag55/react-app-advanced/src/components/navs/NavMain.jsx deleted file mode 100644 index 14e7c07..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/components/navs/NavMain.jsx +++ /dev/null @@ -1,73 +0,0 @@ -import { NavLink } from 'react-router-dom'; - -const NavMain = () => { - return ( - - ); -}; -export default NavMain; diff --git a/05_react/unterricht/tag55/react-app-advanced/src/components/navs/NavSocial.jsx b/05_react/unterricht/tag55/react-app-advanced/src/components/navs/NavSocial.jsx deleted file mode 100644 index 850c7ab..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/components/navs/NavSocial.jsx +++ /dev/null @@ -1,33 +0,0 @@ -import { FaInstagram, FaXTwitter, FaYoutube, FaMeta } from 'react-icons/fa6'; - -const NavSocial = (props) => { - // const { } = props; - - return ( - - ); -}; -export default NavSocial; diff --git a/05_react/unterricht/tag55/react-app-advanced/src/components/sliders/SliderSplide.jsx b/05_react/unterricht/tag55/react-app-advanced/src/components/sliders/SliderSplide.jsx deleted file mode 100644 index e245e1d..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/components/sliders/SliderSplide.jsx +++ /dev/null @@ -1,33 +0,0 @@ -import { Splide, SplideSlide } from '@splidejs/react-splide'; - -const SliderSplide = (props) => { - const { - images = [], - label = 'Slides', - options = { - rewind: true, - height: '100%', - autoplay: true, - speed: 800, - type: 'fade', - }, - } = props; - - return ( - <> - {images.length > 0 && ( -
      - - {images.map(({ path, title }, idx) => ( - // - - {title} - - ))} - -
      - )} - - ); -}; -export default SliderSplide; diff --git a/05_react/unterricht/tag55/react-app-advanced/src/components/tables/TableProducts.jsx b/05_react/unterricht/tag55/react-app-advanced/src/components/tables/TableProducts.jsx deleted file mode 100644 index 355bbfe..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/components/tables/TableProducts.jsx +++ /dev/null @@ -1,78 +0,0 @@ -import { useCallback, useMemo } from 'react'; -import RowProduct from './content/RowProduct'; -import { ProductsProvider, useProductsState } from '../../stores/products'; - -const TableProductsView = (props) => { - const { items } = useProductsState(); - // const dispatch = useProductsDispatch() - - //const [{ items }, dispatch] = useReducer(reducer, initialState(props)); - - // EventHandler ============ - // const handleAmount = useCallback((amount, id) => { - // dispatch({ type: PRODUCTS_ACTIONS.UPDATE_AMOUNT, payload: { amount, id } }); - // }, []); - - // const handlePrice = useCallback((price, id) => { - // dispatch({ type: PRODUCTS_ACTIONS.UPDATE_PRICE, payload: { price, id } }); - // }, []); - - // Functions =============== - const totalPrice = useMemo(() => { - // [0, {stock: 2, price, 15.2}, {...}] - return items.reduce((sum, obj) => { - return sum + Number(obj.stock) * Number(obj.price); - }, 0); - }, [items]); - - // useCallback weiter Einsatzbereich in Kombination mit ref- Attribut - const theadRef = useCallback((el) => { - if (el) console.log(el); - }, []); - - return ( -
      -
      - - - - - - - - - - - - {items.length > 0 && - items.map((product, idx) => ( - - ))} - - - - - - - -
      SKUStockTitlePriceTotal
      Total:{totalPrice.toFixed(2)}
      -
      -
      - ); -}; - -const TableProducts = (props) => { - // const { } = props; - - return ( - - - - ); -}; -export default TableProducts; diff --git a/05_react/unterricht/tag55/react-app-advanced/src/components/tables/content/RowProduct.jsx b/05_react/unterricht/tag55/react-app-advanced/src/components/tables/content/RowProduct.jsx deleted file mode 100644 index 5d05fa6..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/components/tables/content/RowProduct.jsx +++ /dev/null @@ -1,57 +0,0 @@ -import { memo, useCallback } from 'react'; -import { useProductsActions } from '../../../stores/products'; // /index.js muss nicht angegeben werden (wg. Bundler) -// import { useProductsDispatch } from '../../../stores/products'; -// import { PRODUCTS_ACTIONS } from '../../../stores/products'; - -import InputAmount from '../../inputs/InputAmount'; -import InputPrice from '../../inputs/InputPrice'; - -const RowProduct = (props) => { - const { _id, sku = '', stock: amount = 0, price = 0, title = '' } = props; - //const { sku = '', title = '' } = props; - - const { updateAmount, updatePrice } = useProductsActions(); - // const dispatch = useProductsDispatch(); - - // Eventhandler - // const handleAmount = useCallback((val) => { - // // setAmount(val); - // // props.onHandleAmount(val, _id); - // dispatch({ type: PRODUCTS_ACTIONS.UPDATE_AMOUNT, payload: { amount: val, id: _id } }); - // }, []); - - const handleAmount = useCallback( - (val) => { - updateAmount(val, _id); - }, - [updateAmount, _id], - ); - - // const handlePrice = (val) => { - // // setPrice(val); - // // props.onHandlePrice(val, _id); - // dispatch({ type: PRODUCTS_ACTIONS.UPDATE_PRICE, payload: { price: val, id: _id } }); - // }; - - const handlePrice = useCallback( - (val) => { - updatePrice(val, _id); - }, - [updatePrice, _id], - ); - - return ( -
      {sku} - handleAmount(value)} /> - {title} - - {(amount * price).toFixed(2)}
      } - - ); -}; -export default TableProducts; diff --git a/05_react/unterricht/tag55/react-app-advanced/src/routes/Router.jsx b/05_react/unterricht/tag55/react-app-advanced/src/routes/Router.jsx deleted file mode 100644 index 6260501..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/routes/Router.jsx +++ /dev/null @@ -1,28 +0,0 @@ -import { Route, Routes } from 'react-router-dom'; -import Home from '../pages/Home'; -import About from '../pages/About'; -import Contact from '../pages/Contact'; - -// Projects -import Fibonacci from '../pages/projects/Fibonacci'; -import TableProducts from '../pages/projects/TableProducts'; -import Examples from '../pages/projects/Examples'; - -const Router = (props) => { - // const { } = props; - - return ( - - } /> - } /> - } /> - - - } /> - } /> - } /> - - - ); -}; -export default Router; diff --git a/05_react/unterricht/tag55/react-app-advanced/src/stores/products/ProductsStore.jsx b/05_react/unterricht/tag55/react-app-advanced/src/stores/products/ProductsStore.jsx deleted file mode 100644 index 9f14457..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/stores/products/ProductsStore.jsx +++ /dev/null @@ -1,68 +0,0 @@ -import { createContext, useCallback, useContext, useReducer } from 'react'; -import { PRODUCTS_ACTIONS, productsReducer } from './reducer'; -import { createInitialState } from './initialState'; - -const ProductsStateContext = createContext(null); -const ProductsDispatchContext = createContext(null); - -// const ProductsContext = createContext(null); - -export const ProductsProvider = (props) => { - const { children, items = [] } = props; - - const [state, dispatch] = useReducer(productsReducer, items, createInitialState); - - return ( - // - // {children} - // - - - {children} - - ); -}; - -// eigene Hooks mit ErrorHandler -export const useProductsState = () => { - const state = useContext(ProductsStateContext); - - if (state == null) { - throw Error('useProductsState muss innerhalb von ProductsProvider verwendet werden.'); - } - - return state; -}; - -export const useProductsDispatch = () => { - const dispatch = useContext(ProductsDispatchContext); - - if (dispatch == null) { - throw Error('useProductsDispatch muss innerhalb von ProductsProvider verwendet werden.'); - } - - return dispatch; -}; - -export const useProductsActions = () => { - const dispatch = useProductsDispatch(); - - const updateAmount = useCallback( - (amount, id) => { - dispatch({ type: PRODUCTS_ACTIONS.UPDATE_AMOUNT, payload: { id, amount } }); - }, - [dispatch], - ); - - const updatePrice = useCallback( - (price, id) => { - dispatch({ type: PRODUCTS_ACTIONS.UPDATE_PRICE, payload: { id, price } }); - }, - [dispatch], - ); - - return { - updateAmount, - updatePrice, - }; -}; diff --git a/05_react/unterricht/tag55/react-app-advanced/src/stores/products/index.js b/05_react/unterricht/tag55/react-app-advanced/src/stores/products/index.js deleted file mode 100644 index 2c35184..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/stores/products/index.js +++ /dev/null @@ -1,3 +0,0 @@ -export { createInitialState } from './initialState'; -export { PRODUCTS_ACTIONS, productsReducer } from './reducer'; -export { ProductsProvider, useProductsActions, useProductsDispatch, useProductsState } from './ProductsStore'; diff --git a/05_react/unterricht/tag55/react-app-advanced/src/stores/products/initialState.js b/05_react/unterricht/tag55/react-app-advanced/src/stores/products/initialState.js deleted file mode 100644 index aa2c8ee..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/stores/products/initialState.js +++ /dev/null @@ -1,7 +0,0 @@ -// import mit {} -export const createInitialState = (items) => { - // validation and sanitizing - return { items: items || [] }; -}; - -export default createInitialState; // import mit eigener Benennung möglich diff --git a/05_react/unterricht/tag55/react-app-advanced/src/stores/products/reducer.js b/05_react/unterricht/tag55/react-app-advanced/src/stores/products/reducer.js deleted file mode 100644 index 97f9447..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/stores/products/reducer.js +++ /dev/null @@ -1,36 +0,0 @@ -// in ts enum -export const PRODUCTS_ACTIONS = { - UPDATE_AMOUNT: 'UPDATE_AMOUNT', - UPDATE_PRICE: 'UPDATE_PRICE', -}; - -export const productsReducer = (state, action) => { - const { type, payload } = action; - - console.log(state); - - switch (type) { - case PRODUCTS_ACTIONS.UPDATE_AMOUNT: - return { - ...state, - items: state.items.map((item) => - item._id === payload.id // - ? { ...item, stock: payload.amount } - : item, - ), - }; - - case PRODUCTS_ACTIONS.UPDATE_PRICE: - return { - ...state, - items: state.items.map((item) => - item._id === payload.id // - ? { ...item, price: payload.price } - : item, - ), - }; - default: - console.warn('no action found'); - return state; - } -}; diff --git a/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/_index.scss b/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/_index.scss deleted file mode 100644 index dcefbc9..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/_index.scss +++ /dev/null @@ -1,3 +0,0 @@ -// @import 'bootstrap-5.3.8/bootstrap-grid'; -@import 'bootstrap-5.3.8/bootstrap'; -// @import 'bulma-1.04/index' diff --git a/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss b/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss deleted file mode 100644 index e9f267f..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss +++ /dev/null @@ -1,153 +0,0 @@ -// -// Base styles -// - -.accordion { - // scss-docs-start accordion-css-vars - --#{$prefix}accordion-color: #{$accordion-color}; - --#{$prefix}accordion-bg: #{$accordion-bg}; - --#{$prefix}accordion-transition: #{$accordion-transition}; - --#{$prefix}accordion-border-color: #{$accordion-border-color}; - --#{$prefix}accordion-border-width: #{$accordion-border-width}; - --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; - --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; - --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; - --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; - --#{$prefix}accordion-btn-color: #{$accordion-button-color}; - --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; - --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; - --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; - --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; - --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; - --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; - --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; - --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; - --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; - // scss-docs-end accordion-css-vars -} - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); - @include font-size($font-size-base); - color: var(--#{$prefix}accordion-btn-color); - text-align: left; // Reset button style - background-color: var(--#{$prefix}accordion-btn-bg); - border: 0; - @include border-radius(0); - overflow-anchor: none; - @include transition(var(--#{$prefix}accordion-transition)); - - &:not(.collapsed) { - color: var(--#{$prefix}accordion-active-color); - background-color: var(--#{$prefix}accordion-active-bg); - box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list - - &::after { - background-image: var(--#{$prefix}accordion-btn-active-icon); - transform: var(--#{$prefix}accordion-btn-icon-transform); - } - } - - // Accordion icon - &::after { - flex-shrink: 0; - width: var(--#{$prefix}accordion-btn-icon-width); - height: var(--#{$prefix}accordion-btn-icon-width); - margin-left: auto; - content: ""; - background-image: var(--#{$prefix}accordion-btn-icon); - background-repeat: no-repeat; - background-size: var(--#{$prefix}accordion-btn-icon-width); - @include transition(var(--#{$prefix}accordion-btn-icon-transition)); - } - - &:hover { - z-index: 2; - } - - &:focus { - z-index: 3; - outline: 0; - box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); - } -} - -.accordion-header { - margin-bottom: 0; -} - -.accordion-item { - color: var(--#{$prefix}accordion-color); - background-color: var(--#{$prefix}accordion-bg); - border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); - - &:first-of-type { - @include border-top-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - &:not(:first-of-type) { - border-top: 0; - } - - // Only set a border-radius on the last item if the accordion is collapsed - &:last-of-type { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - &.collapsed { - @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - > .accordion-collapse { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - } - } -} - -.accordion-body { - padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); -} - - -// Flush accordion items -// -// Remove borders and border-radius to keep accordion items edge-to-edge. - -.accordion-flush { - > .accordion-item { - border-right: 0; - border-left: 0; - @include border-radius(0); - - &:first-child { border-top: 0; } - &:last-child { border-bottom: 0; } - - // stylelint-disable selector-max-class - > .accordion-collapse, - > .accordion-header .accordion-button, - > .accordion-header .accordion-button.collapsed { - @include border-radius(0); - } - // stylelint-enable selector-max-class - } -} - -@if $enable-dark-mode { - @include color-mode(dark) { - .accordion-button::after { - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; - } - } -} diff --git a/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss b/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss deleted file mode 100644 index b8cff9b..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss +++ /dev/null @@ -1,68 +0,0 @@ -// -// Base styles -// - -.alert { - // scss-docs-start alert-css-vars - --#{$prefix}alert-bg: transparent; - --#{$prefix}alert-padding-x: #{$alert-padding-x}; - --#{$prefix}alert-padding-y: #{$alert-padding-y}; - --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; - --#{$prefix}alert-color: inherit; - --#{$prefix}alert-border-color: transparent; - --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); - --#{$prefix}alert-border-radius: #{$alert-border-radius}; - --#{$prefix}alert-link-color: inherit; - // scss-docs-end alert-css-vars - - position: relative; - padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); - margin-bottom: var(--#{$prefix}alert-margin-bottom); - color: var(--#{$prefix}alert-color); - background-color: var(--#{$prefix}alert-bg); - border: var(--#{$prefix}alert-border); - @include border-radius(var(--#{$prefix}alert-border-radius)); -} - -// Headings for larger alerts -.alert-heading { - // Specified to prevent conflicts of changing $headings-color - color: inherit; -} - -// Provide class for links that match alerts -.alert-link { - font-weight: $alert-link-font-weight; - color: var(--#{$prefix}alert-link-color); -} - - -// Dismissible alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissible { - padding-right: $alert-dismissible-padding-r; - - // Adjust close link position - .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: $stretched-link-z-index + 1; - padding: $alert-padding-y * 1.25 $alert-padding-x; - } -} - - -// scss-docs-start alert-modifiers -// Generate contextual modifier classes for colorizing the alert -@each $state in map-keys($theme-colors) { - .alert-#{$state} { - --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); - --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); - --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); - --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); - } -} -// scss-docs-end alert-modifiers diff --git a/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss b/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss deleted file mode 100644 index cc3d269..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss +++ /dev/null @@ -1,38 +0,0 @@ -// Base class -// -// Requires one of the contextual, color modifier classes for `color` and -// `background-color`. - -.badge { - // scss-docs-start badge-css-vars - --#{$prefix}badge-padding-x: #{$badge-padding-x}; - --#{$prefix}badge-padding-y: #{$badge-padding-y}; - @include rfs($badge-font-size, --#{$prefix}badge-font-size); - --#{$prefix}badge-font-weight: #{$badge-font-weight}; - --#{$prefix}badge-color: #{$badge-color}; - --#{$prefix}badge-border-radius: #{$badge-border-radius}; - // scss-docs-end badge-css-vars - - display: inline-block; - padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x); - @include font-size(var(--#{$prefix}badge-font-size)); - font-weight: var(--#{$prefix}badge-font-weight); - line-height: 1; - color: var(--#{$prefix}badge-color); - text-align: center; - white-space: nowrap; - vertical-align: baseline; - @include border-radius(var(--#{$prefix}badge-border-radius)); - @include gradient-bg(); - - // Empty badges collapse automatically - &:empty { - display: none; - } -} - -// Quick fix for badges in buttons -.btn .badge { - position: relative; - top: -1px; -} diff --git a/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss b/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss deleted file mode 100644 index b8252ff..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss +++ /dev/null @@ -1,40 +0,0 @@ -.breadcrumb { - // scss-docs-start breadcrumb-css-vars - --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x}; - --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y}; - --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom}; - @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size); - --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg}; - --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius}; - --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color}; - --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x}; - --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color}; - // scss-docs-end breadcrumb-css-vars - - display: flex; - flex-wrap: wrap; - padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x); - margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom); - @include font-size(var(--#{$prefix}breadcrumb-font-size)); - list-style: none; - background-color: var(--#{$prefix}breadcrumb-bg); - @include border-radius(var(--#{$prefix}breadcrumb-border-radius)); -} - -.breadcrumb-item { - // The separator between breadcrumbs (by default, a forward-slash: "/") - + .breadcrumb-item { - padding-left: var(--#{$prefix}breadcrumb-item-padding-x); - - &::before { - float: left; // Suppress inline spacings and underlining of the separator - padding-right: var(--#{$prefix}breadcrumb-item-padding-x); - color: var(--#{$prefix}breadcrumb-divider-color); - content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; - } - } - - &.active { - color: var(--#{$prefix}breadcrumb-item-active-color); - } -} diff --git a/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss b/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss deleted file mode 100644 index 78e1252..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss +++ /dev/null @@ -1,147 +0,0 @@ -// Make the div behave like a button -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; // match .btn alignment given font-size hack above - - > .btn { - position: relative; - flex: 1 1 auto; - } - - // Bring the hover, focused, and "active" buttons to the front to overlay - // the borders properly - > .btn-check:checked + .btn, - > .btn-check:focus + .btn, - > .btn:hover, - > .btn:focus, - > .btn:active, - > .btn.active { - z-index: 1; - } -} - -// Optional: Group multiple button groups together for a toolbar -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; - - .input-group { - width: auto; - } -} - -.btn-group { - @include border-radius($btn-border-radius); - - // Prevent double borders when buttons are next to each other - > :not(.btn-check:first-child) + .btn, - > .btn-group:not(:first-child) { - margin-left: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn.dropdown-toggle-split:first-child, - > .btn-group:not(:last-child) > .btn { - @include border-end-radius(0); - } - - // The left radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-start-radius(0); - } -} - -// Sizing -// -// Remix the default button sizing classes into new ones for easier manipulation. - -.btn-group-sm > .btn { @extend .btn-sm; } -.btn-group-lg > .btn { @extend .btn-lg; } - - -// -// Split button dropdowns -// - -.dropdown-toggle-split { - padding-right: $btn-padding-x * .75; - padding-left: $btn-padding-x * .75; - - &::after, - .dropup &::after, - .dropend &::after { - margin-left: 0; - } - - .dropstart &::before { - margin-right: 0; - } -} - -.btn-sm + .dropdown-toggle-split { - padding-right: $btn-padding-x-sm * .75; - padding-left: $btn-padding-x-sm * .75; -} - -.btn-lg + .dropdown-toggle-split { - padding-right: $btn-padding-x-lg * .75; - padding-left: $btn-padding-x-lg * .75; -} - - -// The clickable button for toggling the menu -// Set the same inset shadow as the :active state -.btn-group.show .dropdown-toggle { - @include box-shadow($btn-active-box-shadow); - - // Show no shadow for `.btn-link` since it has no other button styles. - &.btn-link { - @include box-shadow(none); - } -} - - -// -// Vertical button groups -// - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; - - > .btn, - > .btn-group { - width: 100%; - } - - > .btn:not(:first-child), - > .btn-group:not(:first-child) { - margin-top: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn-group:not(:last-child) > .btn { - @include border-bottom-radius(0); - } - - // The top radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-top-radius(0); - } -} diff --git a/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss b/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss deleted file mode 100644 index caa4518..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss +++ /dev/null @@ -1,216 +0,0 @@ -// -// Base styles -// - -.btn { - // scss-docs-start btn-css-vars - --#{$prefix}btn-padding-x: #{$btn-padding-x}; - --#{$prefix}btn-padding-y: #{$btn-padding-y}; - --#{$prefix}btn-font-family: #{$btn-font-family}; - @include rfs($btn-font-size, --#{$prefix}btn-font-size); - --#{$prefix}btn-font-weight: #{$btn-font-weight}; - --#{$prefix}btn-line-height: #{$btn-line-height}; - --#{$prefix}btn-color: #{$btn-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-width: #{$btn-border-width}; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-border-radius: #{$btn-border-radius}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-box-shadow: #{$btn-box-shadow}; - --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity}; - --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5); - // scss-docs-end btn-css-vars - - display: inline-block; - padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x); - font-family: var(--#{$prefix}btn-font-family); - @include font-size(var(--#{$prefix}btn-font-size)); - font-weight: var(--#{$prefix}btn-font-weight); - line-height: var(--#{$prefix}btn-line-height); - color: var(--#{$prefix}btn-color); - text-align: center; - text-decoration: if($link-decoration == none, null, none); - white-space: $btn-white-space; - vertical-align: middle; - cursor: if($enable-button-pointers, pointer, null); - user-select: none; - border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color); - @include border-radius(var(--#{$prefix}btn-border-radius)); - @include gradient-bg(var(--#{$prefix}btn-bg)); - @include box-shadow(var(--#{$prefix}btn-box-shadow)); - @include transition($btn-transition); - - &:hover { - color: var(--#{$prefix}btn-hover-color); - text-decoration: if($link-hover-decoration == underline, none, null); - background-color: var(--#{$prefix}btn-hover-bg); - border-color: var(--#{$prefix}btn-hover-border-color); - } - - .btn-check + &:hover { - // override for the checkbox/radio buttons - color: var(--#{$prefix}btn-color); - background-color: var(--#{$prefix}btn-bg); - border-color: var(--#{$prefix}btn-border-color); - } - - &:focus-visible { - color: var(--#{$prefix}btn-hover-color); - @include gradient-bg(var(--#{$prefix}btn-hover-bg)); - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:focus-visible + & { - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:checked + &, - :not(.btn-check) + &:active, - &:first-child:active, - &.active, - &.show { - color: var(--#{$prefix}btn-active-color); - background-color: var(--#{$prefix}btn-active-bg); - // Remove CSS gradients if they're enabled - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-active-border-color); - @include box-shadow(var(--#{$prefix}btn-active-shadow)); - - &:focus-visible { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - } - - .btn-check:checked:focus-visible + & { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - &:disabled, - &.disabled, - fieldset:disabled & { - color: var(--#{$prefix}btn-disabled-color); - pointer-events: none; - background-color: var(--#{$prefix}btn-disabled-bg); - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-disabled-border-color); - opacity: var(--#{$prefix}btn-disabled-opacity); - @include box-shadow(none); - } -} - - -// -// Alternate buttons -// - -// scss-docs-start btn-variant-loops -@each $color, $value in $theme-colors { - .btn-#{$color} { - @if $color == "light" { - @include button-variant( - $value, - $value, - $hover-background: shade-color($value, $btn-hover-bg-shade-amount), - $hover-border: shade-color($value, $btn-hover-border-shade-amount), - $active-background: shade-color($value, $btn-active-bg-shade-amount), - $active-border: shade-color($value, $btn-active-border-shade-amount) - ); - } @else if $color == "dark" { - @include button-variant( - $value, - $value, - $hover-background: tint-color($value, $btn-hover-bg-tint-amount), - $hover-border: tint-color($value, $btn-hover-border-tint-amount), - $active-background: tint-color($value, $btn-active-bg-tint-amount), - $active-border: tint-color($value, $btn-active-border-tint-amount) - ); - } @else { - @include button-variant($value, $value); - } - } -} - -@each $color, $value in $theme-colors { - .btn-outline-#{$color} { - @include button-outline-variant($value); - } -} -// scss-docs-end btn-variant-loops - - -// -// Link buttons -// - -// Make a button look and behave like a link -.btn-link { - --#{$prefix}btn-font-weight: #{$font-weight-normal}; - --#{$prefix}btn-color: #{$btn-link-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-hover-color: #{$btn-link-hover-color}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-active-color: #{$btn-link-hover-color}; - --#{$prefix}btn-active-border-color: transparent; - --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color}; - --#{$prefix}btn-disabled-border-color: transparent; - --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows - --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb}; - - text-decoration: $link-decoration; - @if $enable-gradients { - background-image: none; - } - - &:hover, - &:focus-visible { - text-decoration: $link-hover-decoration; - } - - &:focus-visible { - color: var(--#{$prefix}btn-color); - } - - &:hover { - color: var(--#{$prefix}btn-hover-color); - } - - // No need for an active state here -} - - -// -// Button Sizes -// - -.btn-lg { - @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); -} - -.btn-sm { - @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); -} diff --git a/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss b/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss deleted file mode 100644 index dcebe6a..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss +++ /dev/null @@ -1,238 +0,0 @@ -// -// Base styles -// - -.card { - // scss-docs-start card-css-vars - --#{$prefix}card-spacer-y: #{$card-spacer-y}; - --#{$prefix}card-spacer-x: #{$card-spacer-x}; - --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y}; - --#{$prefix}card-title-color: #{$card-title-color}; - --#{$prefix}card-subtitle-color: #{$card-subtitle-color}; - --#{$prefix}card-border-width: #{$card-border-width}; - --#{$prefix}card-border-color: #{$card-border-color}; - --#{$prefix}card-border-radius: #{$card-border-radius}; - --#{$prefix}card-box-shadow: #{$card-box-shadow}; - --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius}; - --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y}; - --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x}; - --#{$prefix}card-cap-bg: #{$card-cap-bg}; - --#{$prefix}card-cap-color: #{$card-cap-color}; - --#{$prefix}card-height: #{$card-height}; - --#{$prefix}card-color: #{$card-color}; - --#{$prefix}card-bg: #{$card-bg}; - --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding}; - --#{$prefix}card-group-margin: #{$card-group-margin}; - // scss-docs-end card-css-vars - - position: relative; - display: flex; - flex-direction: column; - min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 - height: var(--#{$prefix}card-height); - color: var(--#{$prefix}body-color); - word-wrap: break-word; - background-color: var(--#{$prefix}card-bg); - background-clip: border-box; - border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - @include border-radius(var(--#{$prefix}card-border-radius)); - @include box-shadow(var(--#{$prefix}card-box-shadow)); - - > hr { - margin-right: 0; - margin-left: 0; - } - - > .list-group { - border-top: inherit; - border-bottom: inherit; - - &:first-child { - border-top-width: 0; - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); - } - - &:last-child { - border-bottom-width: 0; - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); - } - } - - // Due to specificity of the above selector (`.card > .list-group`), we must - // use a child selector here to prevent double borders. - > .card-header + .list-group, - > .list-group + .card-footer { - border-top: 0; - } -} - -.card-body { - // Enable `flex-grow: 1` for decks and groups so that card blocks take up - // as much space as possible, ensuring footers are aligned to the bottom. - flex: 1 1 auto; - padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x); - color: var(--#{$prefix}card-color); -} - -.card-title { - margin-bottom: var(--#{$prefix}card-title-spacer-y); - color: var(--#{$prefix}card-title-color); -} - -.card-subtitle { - margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list - margin-bottom: 0; - color: var(--#{$prefix}card-subtitle-color); -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link { - &:hover { - text-decoration: if($link-hover-decoration == underline, none, null); - } - - + .card-link { - margin-left: var(--#{$prefix}card-spacer-x); - } -} - -// -// Optional textual caps -// - -.card-header { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - margin-bottom: 0; // Removes the default margin-bottom of - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:first-child { - @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0); - } -} - -.card-footer { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:last-child { - @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius)); - } -} - - -// -// Header navs -// - -.card-header-tabs { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - border-bottom: 0; - - .nav-link.active { - background-color: var(--#{$prefix}card-bg); - border-bottom-color: var(--#{$prefix}card-bg); - } -} - -.card-header-pills { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list -} - -// Card image -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: var(--#{$prefix}card-img-overlay-padding); - @include border-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch -} - -.card-img, -.card-img-top { - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-bottom { - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); -} - - -// -// Card groups -// - -.card-group { - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - margin-bottom: var(--#{$prefix}card-group-margin); - } - - @include media-breakpoint-up(sm) { - display: flex; - flex-flow: row wrap; - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - flex: 1 0 0; - margin-bottom: 0; - - + .card { - margin-left: 0; - border-left: 0; - } - - // Handle rounded corners - @if $enable-rounded { - &:not(:last-child) { - @include border-end-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-right-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-right-radius: 0; - } - } - - &:not(:first-child) { - @include border-start-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-left-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-left-radius: 0; - } - } - } - } - } -} diff --git a/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss b/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss deleted file mode 100644 index 5ebf6b1..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss +++ /dev/null @@ -1,226 +0,0 @@ -// Notes on the classes: -// -// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) -// even when their scroll action started on a carousel, but for compatibility (with Firefox) -// we're preventing all actions instead -// 2. The .carousel-item-start and .carousel-item-end is used to indicate where -// the active slide is heading. -// 3. .active.carousel-item is the current slide. -// 4. .active.carousel-item-start and .active.carousel-item-end is the current -// slide in its in-transition state. Only one of these occurs at a time. -// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end -// is the upcoming slide in transition. - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; - @include clearfix(); -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - @include transition($carousel-transition); -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); -} - - -// -// Alternate transitions -// - -.carousel-fade { - .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; - } - - .carousel-item.active, - .carousel-item-next.carousel-item-start, - .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; - } - - .active.carousel-item-start, - .active.carousel-item-end { - z-index: 0; - opacity: 0; - @include transition(opacity 0s $carousel-transition-duration); - } -} - - -// -// Left/right controls for nav -// - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - // Use flex for alignment (1-3) - display: flex; // 1. allow flex styles - align-items: center; // 2. vertically center contents - justify-content: center; // 3. horizontally center contents - width: $carousel-control-width; - padding: 0; - color: $carousel-control-color; - text-align: center; - background: none; - filter: var(--#{$prefix}carousel-control-icon-filter); - border: 0; - opacity: $carousel-control-opacity; - @include transition($carousel-control-transition); - - // Hover/focus state - &:hover, - &:focus { - color: $carousel-control-color; - text-decoration: none; - outline: 0; - opacity: $carousel-control-hover-opacity; - } -} -.carousel-control-prev { - left: 0; - background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); -} -.carousel-control-next { - right: 0; - background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); -} - -// Icons for within -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: $carousel-control-icon-width; - height: $carousel-control-icon-width; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; -} - -.carousel-control-prev-icon { - background-image: escape-svg($carousel-control-prev-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-next-icon-bg) + "*/"}; -} -.carousel-control-next-icon { - background-image: escape-svg($carousel-control-next-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-prev-icon-bg) + "*/"}; -} - -// Optional indicator pips/controls -// -// Add a container (such as a list) with the following class and add an item (ideally a focusable control, -// like a button) with data-bs-target for each slide your carousel holds. - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - // Use the .carousel-control's width as margin so we don't overlay those - margin-right: $carousel-control-width; - margin-bottom: 1rem; - margin-left: $carousel-control-width; - - [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: $carousel-indicator-width; - height: $carousel-indicator-height; - padding: 0; - margin-right: $carousel-indicator-spacer; - margin-left: $carousel-indicator-spacer; - text-indent: -999px; - cursor: pointer; - background-color: var(--#{$prefix}carousel-indicator-active-bg); - background-clip: padding-box; - border: 0; - // Use transparent borders to increase the hit area by 10px on top and bottom. - border-top: $carousel-indicator-hit-area-height solid transparent; - border-bottom: $carousel-indicator-hit-area-height solid transparent; - opacity: $carousel-indicator-opacity; - @include transition($carousel-indicator-transition); - } - - .active { - opacity: $carousel-indicator-active-opacity; - } -} - - -// Optional captions -// -// - -.carousel-caption { - position: absolute; - right: (100% - $carousel-caption-width) * .5; - bottom: $carousel-caption-spacer; - left: (100% - $carousel-caption-width) * .5; - padding-top: $carousel-caption-padding-y; - padding-bottom: $carousel-caption-padding-y; - color: var(--#{$prefix}carousel-caption-color); - text-align: center; -} - -// Dark mode carousel - -@mixin carousel-dark() { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg-dark}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color-dark}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter-dark}; -} - -.carousel-dark { - @include carousel-dark(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include carousel-dark(); - } -} diff --git a/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss b/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss deleted file mode 100644 index d53c96f..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss +++ /dev/null @@ -1,66 +0,0 @@ -// Transparent background and border properties included for button version. -// iOS requires the button element instead of an anchor tag. -// If you want the anchor version, it requires `href="#"`. -// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile - -.btn-close { - // scss-docs-start close-css-vars - --#{$prefix}btn-close-color: #{$btn-close-color}; - --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) }; - --#{$prefix}btn-close-opacity: #{$btn-close-opacity}; - --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity}; - --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow}; - --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity}; - --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity}; - // scss-docs-end close-css-vars - - box-sizing: content-box; - width: $btn-close-width; - height: $btn-close-height; - padding: $btn-close-padding-y $btn-close-padding-x; - color: var(--#{$prefix}btn-close-color); - background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements - filter: var(--#{$prefix}btn-close-filter); - border: 0; // for button elements - @include border-radius(); - opacity: var(--#{$prefix}btn-close-opacity); - - // Override 's hover style - &:hover { - color: var(--#{$prefix}btn-close-color); - text-decoration: none; - opacity: var(--#{$prefix}btn-close-hover-opacity); - } - - &:focus { - outline: 0; - box-shadow: var(--#{$prefix}btn-close-focus-shadow); - opacity: var(--#{$prefix}btn-close-focus-opacity); - } - - &:disabled, - &.disabled { - pointer-events: none; - user-select: none; - opacity: var(--#{$prefix}btn-close-disabled-opacity); - } -} - -@mixin btn-close-white() { - --#{$prefix}btn-close-filter: #{$btn-close-filter-dark}; -} - -.btn-close-white { - @include btn-close-white(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}btn-close-filter: #{$btn-close-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include btn-close-white(); - } -} diff --git a/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss b/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss deleted file mode 100644 index 83b3138..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss +++ /dev/null @@ -1,41 +0,0 @@ -// Container widths -// -// Set the container width, and override it for fixed navbars in media queries. - -@if $enable-container-classes { - // Single container class with breakpoint max-widths - .container, - // 100% wide container at all breakpoints - .container-fluid { - @include make-container(); - } - - // Responsive containers that are 100% wide until a breakpoint - @each $breakpoint, $container-max-width in $container-max-widths { - .container-#{$breakpoint} { - @extend .container-fluid; - } - - @include media-breakpoint-up($breakpoint, $grid-breakpoints) { - %responsive-container-#{$breakpoint} { - max-width: $container-max-width; - } - - // Extend each breakpoint which is smaller or equal to the current breakpoint - $extend-breakpoint: true; - - @each $name, $width in $grid-breakpoints { - @if ($extend-breakpoint) { - .container#{breakpoint-infix($name, $grid-breakpoints)} { - @extend %responsive-container-#{$breakpoint}; - } - - // Once the current breakpoint is reached, stop extending - @if ($breakpoint == $name) { - $extend-breakpoint: false; - } - } - } - } - } -} diff --git a/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss b/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss deleted file mode 100644 index 587ebb4..0000000 --- a/05_react/unterricht/tag55/react-app-advanced/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss +++ /dev/null @@ -1,250 +0,0 @@ -// The dropdown wrapper (`
      `) -.dropup, -.dropend, -.dropdown, -.dropstart, -.dropup-center, -.dropdown-center { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; - - // Generate the caret automatically - @include caret(); -} - -// The dropdown menu -.dropdown-menu { - // scss-docs-start dropdown-css-vars - --#{$prefix}dropdown-zindex: #{$zindex-dropdown}; - --#{$prefix}dropdown-min-width: #{$dropdown-min-width}; - --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x}; - --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y}; - --#{$prefix}dropdown-spacer: #{$dropdown-spacer}; - @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size); - --#{$prefix}dropdown-color: #{$dropdown-color}; - --#{$prefix}dropdown-bg: #{$dropdown-bg}; - --#{$prefix}dropdown-border-color: #{$dropdown-border-color}; - --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius}; - --#{$prefix}dropdown-border-width: #{$dropdown-border-width}; - --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius}; - --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg}; - --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y}; - --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow}; - --#{$prefix}dropdown-link-color: #{$dropdown-link-color}; - --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color}; - --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg}; - --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color}; - --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg}; - --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color}; - --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x}; - --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y}; - --#{$prefix}dropdown-header-color: #{$dropdown-header-color}; - --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x}; - --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y}; - // scss-docs-end dropdown-css-vars - - position: absolute; - z-index: var(--#{$prefix}dropdown-zindex); - display: none; // none by default, but block on "open" of the menu - min-width: var(--#{$prefix}dropdown-min-width); - padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x); - margin: 0; // Override default margin of ul - @include font-size(var(--#{$prefix}dropdown-font-size)); - color: var(--#{$prefix}dropdown-color); - text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) - list-style: none; - background-color: var(--#{$prefix}dropdown-bg); - background-clip: padding-box; - border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color); - @include border-radius(var(--#{$prefix}dropdown-border-radius)); - @include box-shadow(var(--#{$prefix}dropdown-box-shadow)); - - &[data-bs-popper] { - top: 100%; - left: 0; - margin-top: var(--#{$prefix}dropdown-spacer); - } - - @if $dropdown-padding-y == 0 { - > .dropdown-item:first-child, - > li:first-child .dropdown-item { - @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - > .dropdown-item:last-child, - > li:last-child .dropdown-item { - @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - - } -} - -// scss-docs-start responsive-breakpoints -// We deliberately hardcode the `bs-` prefix because we check -// this custom property in JS to determine Popper's positioning - -@each $breakpoint in map-keys($grid-breakpoints) { - @include media-breakpoint-up($breakpoint) { - $infix: breakpoint-infix($breakpoint, $grid-breakpoints); - - .dropdown-menu#{$infix}-start { - --bs-position: start; - - &[data-bs-popper] { - right: auto; - left: 0; - } - } - - .dropdown-menu#{$infix}-end { - --bs-position: end; - - &[data-bs-popper] { - right: 0; - left: auto; - } - } - } -} -// scss-docs-end responsive-breakpoints - -// Allow for dropdowns to go bottom up (aka, dropup-menu) -// Just add .dropup after the standard .dropdown class and you're set. -.dropup { - .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(up); - } -} - -.dropend { - .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(end); - &::after { - vertical-align: 0; - } - } -} - -.dropstart { - .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(start); - &::before { - vertical-align: 0; - } - } -} - - -// Dividers (basically an `
      `) within the dropdown -.dropdown-divider { - height: 0; - margin: var(--#{$prefix}dropdown-divider-margin-y) 0; - overflow: hidden; - border-top: 1px solid var(--#{$prefix}dropdown-divider-bg); - opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
      element -} - -// Links, buttons, and more within the dropdown menu -// -// `
      - - - - - - - - ); -}; - -export default TableRow; diff --git a/06_js-debug/uebungen/u15_product-sales-table/src/index.css b/06_js-debug/uebungen/u15_product-sales-table/src/index.css deleted file mode 100644 index 011e5ce..0000000 --- a/06_js-debug/uebungen/u15_product-sales-table/src/index.css +++ /dev/null @@ -1,187 +0,0 @@ -*, -*::before, -*::after { - box-sizing: border-box; -} - -*, -html, -body { - margin: 0; - padding: 0; - color: #171717; - font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, - Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; -} - -button { - border: none; -} - -.screen-reader-text { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border-width: 0; -} - -/* ===== App Component ===== */ -main { - max-width: 80rem; /* 1280px */ - margin: 0 auto; - padding: 3rem 0.75rem; /* 48px 12px */ -} - -.wrapper { - padding: 0 1rem; /* 0 16px */ -} - -.header-container { - display: block; -} - -.header-title-wrapper { - display: block; -} - -.title { - font-size: 1rem; /* 16px */ - line-height: 1.5rem; /* 24px */ - line-height: 1.5rem; /* 24px */ - font-weight: 600; - color: #111827; -} - -.subtitle { - margin-top: 0.5rem; /* 8px */ - font-size: 0.875rem; /* 14px */ - line-height: 1.25rem; /* 20px */ - color: #374151; -} - -.table-wrapper { - display: flow-root; - margin-top: 2rem; /* 32px */ -} - -.table-container { - margin: -0.5rem -1rem; /* -8px -16px */ - overflow-x: auto; -} - -.table-box { - display: inline-block; - min-width: 100%; - padding: 0.5rem 0 /* 8px 0 */; - vertical-align: middle; -} - -/* ===== Table Component ===== */ -table { - min-width: 100%; - border-collapse: collapse; -} - -th { - white-space: nowrap; - padding-top: 0.875rem /* 14px */; - padding-bottom: 0.875rem /* 14px */; - padding-left: 1rem /* 16px */; - padding-right: 0.75rem /* 12px */; - text-align: left; - font-weight: 600; - font-size: 0.875rem /* 14px */; - line-height: 1.25rem /* 20px */; - color: #111827; -} - -tbody { - background-color: white; -} - -thead tr { - border-bottom: 1px solid #d1d5db; -} - -tbody tr { - border-bottom: 1px solid #e5e7eb; -} - -.id-column { - white-space: nowrap; - padding-top: 0.5rem /* 8px */; - padding-bottom: 0.5rem /* 8px */; - padding-left: 1rem /* 16px */; - padding-right: 0.75rem /* 12px */; - font-size: 0.875rem /* 14px */; - line-height: 1.25rem /* 20px */; - color: #6b7280; -} - -.product-info-column { - white-space: nowrap; - padding: 0.5rem /* 8px */; - font-size: 0.875rem /* 14px */; - line-height: 1.25rem /* 20px */; - font-weight: 500; - color: #111827; -} - -.product-num-column { - white-space: nowrap; - padding: 0.5rem /* 8px */; - font-size: 0.875rem /* 14px */; - line-height: 1.25rem /* 20px */; - color: #6b7280; -} - -/* ===== Breakpoints ===== */ -@media (min-width: 640px) { - .wrapper { - padding: 0 1.5rem; /* 0 24px */ - } - - .header-container { - display: flex; - align-items: center; - } - - .header-title-wrapper { - flex: 1 1 auto; - } - - .table-container { - margin: -0.5rem -1.5rem; /* -8px -24px */ - } - - .table-box { - padding: 0.5rem 1.5rem /* 8px 24px */; - } - - th { - padding-left: 0px; - } - - .id-column { - padding-left: 0px; - } -} - -@media (min-width: 1024px) { - .wrapper { - padding: 0 2rem; /* 0 32px */ - } - - .table-container { - margin: -0.5rem -2rem; /* -8px -32px */ - } - - .table-box { - padding: 0.5rem 2rem /* 8px 32px */; - } -} diff --git a/06_js-debug/uebungen/u15_product-sales-table/src/lib/datatypes.ts b/06_js-debug/uebungen/u15_product-sales-table/src/lib/datatypes.ts deleted file mode 100644 index b00b7e3..0000000 --- a/06_js-debug/uebungen/u15_product-sales-table/src/lib/datatypes.ts +++ /dev/null @@ -1,8 +0,0 @@ -export interface Product { - id: number; - product: string; - productCode: string; - quantity: number; - price: number; - profit: number; -} diff --git a/06_js-debug/uebungen/u15_product-sales-table/src/lib/db/sales.json b/06_js-debug/uebungen/u15_product-sales-table/src/lib/db/sales.json deleted file mode 100644 index ac3c54e..0000000 --- a/06_js-debug/uebungen/u15_product-sales-table/src/lib/db/sales.json +++ /dev/null @@ -1,115 +0,0 @@ -[ - { - "id": 1, - "product": "Laptop", - "productCode": "LPT", - "quantity": 352, - "price": 1200.0, - "profit": 200.0 - }, - { - "id": 2, - "product": "Smartphone", - "productCode": "SPH", - "quantity": 500, - "price": 800.0, - "profit": 123.0 - }, - { - "id": 3, - "product": "Headphones", - "productCode": "HDP", - "quantity": 432, - "price": 150.0, - "profit": 50.0 - }, - { - "id": 4, - "product": "Keyboard", - "productCode": "KBD", - "quantity": 431, - "price": 75.0, - "profit": 25.0 - }, - null, - { - "id": 6, - "product": "Monitor", - "productCode": "MNT", - "quantity": 234, - "price": 300.0, - "profit": 50.0 - }, - { - "id": 7, - "product": "Tablet", - "productCode": "TBL", - "quantity": 68, - "price": 350.0, - "profit": 100.0 - }, - { - "id": 8, - "product": "Printer", - "productCode": "PRT", - "quantity": 642, - "price": 200.0, - "profit": 50.0 - }, - { - "id": 9, - "product": "Webcam", - "productCode": "WCM", - "quantity": 123, - "price": 90.0, - "profit": 20.0 - }, - { - "id": 10, - "product": "Desk Lamp", - "productCode": "DLP", - "quantity": 1921, - "price": 30.0, - "profit": 5.0 - }, - { - "id": 11, - "product": "Chair", - "productCode": "CHR", - "quantity": 4854, - "price": 120.0, - "profit": 20.0 - }, - { - "id": 12, - "product": "External Hard Drive", - "productCode": "EHD", - "quantity": 483, - "price": 100.0, - "profit": 20.0 - }, - { - "id": 13, - "product": "USB-C Adapter", - "productCode": "USC", - "quantity": 10239, - "price": 19.99, - "profit": 5.0 - }, - { - "id": 14, - "product": "Smart Watch", - "productCode": "SWT", - "quantity": 483, - "price": 199.99, - "profit": 50.0 - }, - { - "id": 15, - "product": "Speakers", - "productCode": "SPK", - "quantity": 394, - "price": 85.0, - "profit": 20.0 - } -] diff --git a/06_js-debug/uebungen/u15_product-sales-table/src/main.tsx b/06_js-debug/uebungen/u15_product-sales-table/src/main.tsx deleted file mode 100644 index 3d7150d..0000000 --- a/06_js-debug/uebungen/u15_product-sales-table/src/main.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react' -import ReactDOM from 'react-dom/client' -import App from './App.tsx' -import './index.css' - -ReactDOM.createRoot(document.getElementById('root')!).render( - - - , -) diff --git a/06_js-debug/uebungen/u15_product-sales-table/src/vite-env.d.ts b/06_js-debug/uebungen/u15_product-sales-table/src/vite-env.d.ts deleted file mode 100644 index 11f02fe..0000000 --- a/06_js-debug/uebungen/u15_product-sales-table/src/vite-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/06_js-debug/uebungen/u15_product-sales-table/tsconfig.app.json b/06_js-debug/uebungen/u15_product-sales-table/tsconfig.app.json deleted file mode 100644 index d739292..0000000 --- a/06_js-debug/uebungen/u15_product-sales-table/tsconfig.app.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", - "target": "ES2020", - "useDefineForClassFields": true, - "lib": ["ES2020", "DOM", "DOM.Iterable"], - "module": "ESNext", - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - "moduleDetection": "force", - "noEmit": true, - "jsx": "react-jsx", - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true - }, - "include": ["src"] -} diff --git a/06_js-debug/uebungen/u15_product-sales-table/tsconfig.json b/06_js-debug/uebungen/u15_product-sales-table/tsconfig.json deleted file mode 100644 index ea9d0cd..0000000 --- a/06_js-debug/uebungen/u15_product-sales-table/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "files": [], - "references": [ - { - "path": "./tsconfig.app.json" - }, - { - "path": "./tsconfig.node.json" - } - ] -} diff --git a/06_js-debug/uebungen/u15_product-sales-table/tsconfig.node.json b/06_js-debug/uebungen/u15_product-sales-table/tsconfig.node.json deleted file mode 100644 index 3afdd6e..0000000 --- a/06_js-debug/uebungen/u15_product-sales-table/tsconfig.node.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", - "skipLibCheck": true, - "module": "ESNext", - "moduleResolution": "bundler", - "allowSyntheticDefaultImports": true, - "strict": true, - "noEmit": true - }, - "include": ["vite.config.ts"] -} diff --git a/06_js-debug/uebungen/u15_product-sales-table/vite.config.ts b/06_js-debug/uebungen/u15_product-sales-table/vite.config.ts deleted file mode 100644 index 5a33944..0000000 --- a/06_js-debug/uebungen/u15_product-sales-table/vite.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [react()], -}) diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/.eslintrc.cjs b/06_js-debug/uebungen/u16_lexifind-exercise/.eslintrc.cjs deleted file mode 100644 index d6c9537..0000000 --- a/06_js-debug/uebungen/u16_lexifind-exercise/.eslintrc.cjs +++ /dev/null @@ -1,18 +0,0 @@ -module.exports = { - root: true, - env: { browser: true, es2020: true }, - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:react-hooks/recommended', - ], - ignorePatterns: ['dist', '.eslintrc.cjs'], - parser: '@typescript-eslint/parser', - plugins: ['react-refresh'], - rules: { - 'react-refresh/only-export-components': [ - 'warn', - { allowConstantExport: true }, - ], - }, -} diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/README.md b/06_js-debug/uebungen/u16_lexifind-exercise/README.md deleted file mode 100644 index 7613900..0000000 --- a/06_js-debug/uebungen/u16_lexifind-exercise/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Frontend Class: LexiFind Exercise Starter - -Install the dependencies and devDependencies and start the server. - -```bash -npm install -npm run dev -``` - -This will start the server on http://localhost:5173 diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/index.html b/06_js-debug/uebungen/u16_lexifind-exercise/index.html deleted file mode 100644 index 70b3ea2..0000000 --- a/06_js-debug/uebungen/u16_lexifind-exercise/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - LexiFind - Your Personal Dictionary - - -
      - - - diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/package-lock.json b/06_js-debug/uebungen/u16_lexifind-exercise/package-lock.json deleted file mode 100644 index 66b0f62..0000000 --- a/06_js-debug/uebungen/u16_lexifind-exercise/package-lock.json +++ /dev/null @@ -1,2744 +0,0 @@ -{ - "name": "lexifind-webmaster-exercise", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "lexifind-webmaster-exercise", - "version": "0.0.0", - "dependencies": { - "@types/react-router-dom": "^5.3.3", - "react": "^19.2.8", - "react-dom": "^19.2.8", - "react-router-dom": "^7.18.2" - }, - "devDependencies": { - "@types/react": "^19.2.18", - "@types/react-dom": "^19.2.4", - "@typescript-eslint/eslint-plugin": "^8.67.0", - "@typescript-eslint/parser": "^8.67.0", - "@vitejs/plugin-react": "^6.1.0", - "eslint": "^10.8.1", - "eslint-plugin-react-hooks": "^7.1.1", - "eslint-plugin-react-refresh": "^0.5.4", - "typescript": "^6.0.3", - "vite": "^8.2.2" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", - "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.29.7", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", - "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", - "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-compilation-targets": "^7.29.7", - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helpers": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", - "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.8", - "@babel/types": "^7.29.8", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", - "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", - "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", - "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", - "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", - "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", - "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", - "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.8" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/template": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", - "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", - "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.8", - "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.8", - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.8", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", - "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", - "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.23.5", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", - "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^3.0.5", - "debug": "^4.3.1", - "minimatch": "^10.2.4" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", - "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^1.2.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/core": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", - "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/object-schema": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", - "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", - "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^1.2.1", - "levn": "^0.4.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", - "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/types": "^0.15.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", - "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.2", - "@humanfs/types": "^0.15.0", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/types": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", - "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@oxc-project/types": { - "version": "0.146.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.146.0.tgz", - "integrity": "sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@rolldown/binding-android-arm-eabi": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.5.tgz", - "integrity": "sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.5.tgz", - "integrity": "sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.5.tgz", - "integrity": "sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.5.tgz", - "integrity": "sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.5.tgz", - "integrity": "sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.5.tgz", - "integrity": "sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.5.tgz", - "integrity": "sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.5.tgz", - "integrity": "sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.5.tgz", - "integrity": "sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.5.tgz", - "integrity": "sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.5.tgz", - "integrity": "sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.5.tgz", - "integrity": "sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.5.tgz", - "integrity": "sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.5.tgz", - "integrity": "sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.5.tgz", - "integrity": "sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/esrecurse": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", - "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/history": { - "version": "4.7.11", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.2.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", - "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" - } - }, - "node_modules/@types/react-router": { - "version": "5.1.20", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", - "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*" - } - }, - "node_modules/@types/react-router-dom": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", - "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.67.0.tgz", - "integrity": "sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.67.0", - "@typescript-eslint/type-utils": "8.67.0", - "@typescript-eslint/utils": "8.67.0", - "@typescript-eslint/visitor-keys": "8.67.0", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.67.0", - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.67.0.tgz", - "integrity": "sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.67.0", - "@typescript-eslint/types": "8.67.0", - "@typescript-eslint/typescript-estree": "8.67.0", - "@typescript-eslint/visitor-keys": "8.67.0", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.67.0.tgz", - "integrity": "sha512-cvE8c7ulYeXN9fYuszhCeCsbzyVEXuhrRCybnBre7TUmqb5nRmBfQAwCj0O3WJFDeyAZt4VYv51vMCC9LHSdYw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.67.0", - "@typescript-eslint/types": "^8.67.0", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.67.0.tgz", - "integrity": "sha512-EgvsleTwS4E+WzzSvem8fAUubLwatMNF1B5hHSLQxcvs7q2dtRhGyujHwLJSYlG41niJ7GP24Aha2+0mb1b2kg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.67.0", - "@typescript-eslint/visitor-keys": "8.67.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.67.0.tgz", - "integrity": "sha512-vV+LUSv5njUWsknE71fqKTlXUva+R76SaeORd6Zojcunk/6DvKFXONU3BrAs2H49mbygUXt6gbYunzwqNwlhdg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.67.0.tgz", - "integrity": "sha512-aVWDXbRmdXO9siTfX4ditQI1T9+zVcNazT48EJCD0v40/9RIFoUgZ05CmGEq9H2gixRpjUn/iplwvlcvutJW/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.67.0", - "@typescript-eslint/typescript-estree": "8.67.0", - "@typescript-eslint/utils": "8.67.0", - "debug": "^4.4.3", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.67.0.tgz", - "integrity": "sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.67.0.tgz", - "integrity": "sha512-EKQBCE9yNlRJYm7jdTW5AhDacDUmSwQb0FAJAmK2EKYrNXIsa2vxcSZx6PvJ/dEdI6lS+Y9W+EXckLj0iPFGcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.67.0", - "@typescript-eslint/tsconfig-utils": "8.67.0", - "@typescript-eslint/types": "8.67.0", - "@typescript-eslint/visitor-keys": "8.67.0", - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.67.0.tgz", - "integrity": "sha512-U9D1FdwEWBwok3hxxSdhclMb0twvt9QnjIQ0VfQ1AiX2epnpSgv2ubVDsayOFyY8K6FX+AQ7E0FKWVG3iKsj1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.67.0", - "@typescript-eslint/types": "8.67.0", - "@typescript-eslint/typescript-estree": "8.67.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.67.0.tgz", - "integrity": "sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.67.0", - "eslint-visitor-keys": "^5.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.1.0.tgz", - "integrity": "sha512-qd2BzUBehkov86WFhg0JkEFEYyCLG9uPCe6qWTY/kRlss9OvJrOF2UbIWT7p+8IzZHkEu0DNGHc4HSv+JdDLsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rolldown/pluginutils": "^1.0.1" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", - "babel-plugin-react-compiler": "^1.0.0", - "oxc-transform-react": "^0.145.0", - "vite": "^8.0.0" - }, - "peerDependenciesMeta": { - "@rolldown/plugin-babel": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true - }, - "oxc-transform-react": { - "optional": true - } - } - }, - "node_modules/acorn": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", - "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/baseline-browser-mapping": { - "version": "2.11.16", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.16.tgz", - "integrity": "sha512-H/bNPUFHewJHyCTdjn1n3Pit5+2GmWT6mmeHImPX+8MA9NA6b67jO4gYmi4jTbCJb2otq34KMZnovndDPqJwhQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/brace-expansion": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", - "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/browserslist": { - "version": "4.28.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", - "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.11.12", - "caniuse-lite": "^1.0.30001809", - "electron-to-chromium": "^1.5.402", - "node-releases": "^2.0.53", - "update-browserslist-db": "^1.3.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001809", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz", - "integrity": "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", - "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.412", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.412.tgz", - "integrity": "sha512-z4rMe3esBzlzovKHj4gxJnsCGZRK5l4baUvm+gCGJBPE+gsyUMKsuU9tnEUtI1dOebXz1ytAPGjvXhmQ7rIPwA==", - "dev": true, - "license": "ISC" - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "10.8.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.8.1.tgz", - "integrity": "sha512-wqA7W2jbsC/BnV9Iv1UZpKVFkO1AdNoSmYW8NWG4HNOBbkAMvIqDZ27pI2f07dqn583NcIC44ckjAcOXDL1QbQ==", - "dev": true, - "license": "MIT", - "workspaces": [ - "packages/*" - ], - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.2", - "@eslint/config-array": "^0.23.5", - "@eslint/config-helpers": "^0.7.0", - "@eslint/core": "^1.2.1", - "@eslint/plugin-kit": "^0.7.2", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.14.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^9.1.2", - "eslint-visitor-keys": "^5.0.1", - "espree": "^11.2.0", - "esquery": "^1.7.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "minimatch": "^10.2.5", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", - "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.24.4", - "@babel/parser": "^7.24.4", - "hermes-parser": "^0.25.1", - "zod": "^3.25.0 || ^4.0.0", - "zod-validation-error": "^3.5.0 || ^4.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" - } - }, - "node_modules/eslint-plugin-react-refresh": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.4.tgz", - "integrity": "sha512-7bqTKz7T0r+HKWFarNXByDE9/5+73wI2ru+M3zuqGbR7s/b/5/pQJXZoufWlrngqGqoZto73ZkGumCdLxk+4rw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "eslint": "^9 || ^10" - } - }, - "node_modules/eslint-scope": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", - "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@types/esrecurse": "^4.3.1", - "@types/estree": "^1.0.8", - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/espree": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", - "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.16.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^5.0.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", - "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/hermes-estree": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", - "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", - "dev": true, - "license": "MIT" - }, - "node_modules/hermes-parser": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", - "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "hermes-estree": "0.25.1" - } - }, - "node_modules/ignore": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", - "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lightningcss": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", - "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.33.0", - "lightningcss-darwin-arm64": "1.33.0", - "lightningcss-darwin-x64": "1.33.0", - "lightningcss-freebsd-x64": "1.33.0", - "lightningcss-linux-arm-gnueabihf": "1.33.0", - "lightningcss-linux-arm64-gnu": "1.33.0", - "lightningcss-linux-arm64-musl": "1.33.0", - "lightningcss-linux-x64-gnu": "1.33.0", - "lightningcss-linux-x64-musl": "1.33.0", - "lightningcss-win32-arm64-msvc": "1.33.0", - "lightningcss-win32-x64-msvc": "1.33.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", - "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", - "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", - "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", - "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", - "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", - "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", - "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", - "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", - "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", - "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", - "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/minimatch": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", - "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.8" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.18", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", - "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.53", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", - "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", - "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.17", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/react": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", - "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", - "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.8" - } - }, - "node_modules/react-router": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.2.tgz", - "integrity": "sha512-aUVMjFm3GAPTTZL7oYr5E7ETiqfQCHRLH+B+5afnICvf0r7kkK4eR6SMuwbSTJw/7t+12khT/Kahij49fqOCIg==", - "license": "MIT", - "dependencies": { - "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/react-router-dom": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.2.tgz", - "integrity": "sha512-AIKJ/jgGlFb3EbfCXk5Gzshiwt+l3mqbCrNjmEWMMjqQxNJ3svBa6bgzFyCC2Sw3RA0VWF1kg3uQf2OFhxb8hw==", - "license": "MIT", - "dependencies": { - "react-router": "7.18.2" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - } - }, - "node_modules/rolldown": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.5.tgz", - "integrity": "sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "=0.146.0", - "@rolldown/pluginutils": "^1.0.0" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm-eabi": "1.2.5", - "@rolldown/binding-android-arm64": "1.2.5", - "@rolldown/binding-darwin-arm64": "1.2.5", - "@rolldown/binding-darwin-x64": "1.2.5", - "@rolldown/binding-freebsd-x64": "1.2.5", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.5", - "@rolldown/binding-linux-arm64-gnu": "1.2.5", - "@rolldown/binding-linux-arm64-musl": "1.2.5", - "@rolldown/binding-linux-ppc64-gnu": "1.2.5", - "@rolldown/binding-linux-s390x-gnu": "1.2.5", - "@rolldown/binding-linux-x64-gnu": "1.2.5", - "@rolldown/binding-linux-x64-musl": "1.2.5", - "@rolldown/binding-openharmony-arm64": "1.2.5", - "@rolldown/binding-win32-arm64-msvc": "1.2.5", - "@rolldown/binding-win32-x64-msvc": "1.2.5" - } - }, - "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-cookie-parser": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", - "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", - "license": "MIT" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/ts-api-utils": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", - "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/typescript": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", - "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz", - "integrity": "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/vite": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", - "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "lightningcss": "^1.33.0", - "picomatch": "^4.0.5", - "postcss": "^8.5.26", - "rolldown": "~1.2.4", - "tinyglobby": "^0.2.17" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.4.0 || ^0.5.0", - "esbuild": "^0.27.0 || ^0.28.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", - "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-validation-error": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", - "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "zod": "^3.25.0 || ^4.0.0" - } - } - } -} diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/package.json b/06_js-debug/uebungen/u16_lexifind-exercise/package.json deleted file mode 100644 index 2369395..0000000 --- a/06_js-debug/uebungen/u16_lexifind-exercise/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "lexifind-webmaster-exercise", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "tsc -b && vite build", - "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview" - }, - "dependencies": { - "@types/react-router-dom": "^5.3.3", - "react": "^19.2.8", - "react-dom": "^19.2.8", - "react-router-dom": "^7.18.2" - }, - "devDependencies": { - "@types/react": "^19.2.18", - "@types/react-dom": "^19.2.4", - "@typescript-eslint/eslint-plugin": "^8.67.0", - "@typescript-eslint/parser": "^8.67.0", - "@vitejs/plugin-react": "^6.1.0", - "eslint": "^10.8.1", - "eslint-plugin-react-hooks": "^7.1.1", - "eslint-plugin-react-refresh": "^0.5.4", - "typescript": "^6.0.3", - "vite": "^8.2.2" - } -} diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/public/LexiFind.webp b/06_js-debug/uebungen/u16_lexifind-exercise/public/LexiFind.webp deleted file mode 100644 index 1bda48b..0000000 Binary files a/06_js-debug/uebungen/u16_lexifind-exercise/public/LexiFind.webp and /dev/null differ diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/src/components/FavoriteWord.tsx b/06_js-debug/uebungen/u16_lexifind-exercise/src/components/FavoriteWord.tsx deleted file mode 100644 index 29093a0..0000000 --- a/06_js-debug/uebungen/u16_lexifind-exercise/src/components/FavoriteWord.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { useState, useEffect } from 'react'; -import { Link } from 'react-router-dom'; - -import { HeartFilled, HeartIcon } from './Icons'; - -interface FavoriteWordProps { - word: string; -} - -const FavoriteWord: React.FC = ({ word }) => { - const [isFavorite, setIsFavorite] = useState(false); - - const toggleFavorite = () => { - const favorites = JSON.parse(localStorage.getItem('favoriteWords') || '[]'); - - if (favorites.includes(word)) { - const filteredFavorites = favorites.filter((item: string) => item !== word); - localStorage.setItem('favoriteWords', JSON.stringify(filteredFavorites)); - } else { - favorites.push(word); - localStorage.setItem('favoriteWords', JSON.stringify(favorites)); - } - setIsFavorite(!isFavorite); - }; - - // [x] Missing useEffect - useEffect(() => { - const favoriteWords = JSON.parse(localStorage.getItem('favoriteWords') || '[]'); - setIsFavorite(favoriteWords.includes(word)); - }, [word]); - - return ( -
      - -

      {word}

      - - - -
      - ); -}; - -export default FavoriteWord; diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/src/components/Header.tsx b/06_js-debug/uebungen/u16_lexifind-exercise/src/components/Header.tsx deleted file mode 100644 index 84b2d7d..0000000 --- a/06_js-debug/uebungen/u16_lexifind-exercise/src/components/Header.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import React from 'react'; -import { Link } from 'react-router-dom'; - -import { SERIF_FONTS, SANS_SERIF_FONTS } from '../lib/constants'; - -interface HeaderProps { - font: string; - setFont: React.Dispatch>; -} - -const Header: React.FC = ({ font, setFont }) => { - return ( -
      - - LexiFind Logo - LexiFind - - -
      - - Favorites - -
      - - -
      - ); -}; - -export default Header; diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/src/components/Icons.tsx b/06_js-debug/uebungen/u16_lexifind-exercise/src/components/Icons.tsx deleted file mode 100644 index 9fff78a..0000000 --- a/06_js-debug/uebungen/u16_lexifind-exercise/src/components/Icons.tsx +++ /dev/null @@ -1,46 +0,0 @@ -export function HeartIcon(props: React.SVGProps) { - return ( - - - - ); -} - -export function HeartFilled(props: React.SVGProps) { - return ( - - - - ); -} - -export function PlayIcon(props: React.SVGProps) { - return ( - - - - ); -} diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/src/components/Searchbar.tsx b/06_js-debug/uebungen/u16_lexifind-exercise/src/components/Searchbar.tsx deleted file mode 100644 index cab05bf..0000000 --- a/06_js-debug/uebungen/u16_lexifind-exercise/src/components/Searchbar.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import React from 'react'; - -interface SearchbarProps { - word: string; - setWord: React.Dispatch>; - handleSubmit: (e: React.FormEvent) => void; -} - -const Searchbar: React.FC = ({ - word, - setWord, - handleSubmit, -}) => { - return ( -
      -
      - - -
      - setWord(e.target.value)} - /> - -
      - -
      - ); -}; - -function SearchIcon(props: React.SVGProps) { - return ( - - - - ); -} - -export default Searchbar; diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/src/components/SourceFooter.tsx b/06_js-debug/uebungen/u16_lexifind-exercise/src/components/SourceFooter.tsx deleted file mode 100644 index 8cbdc03..0000000 --- a/06_js-debug/uebungen/u16_lexifind-exercise/src/components/SourceFooter.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import React from 'react'; - -interface SourceFooterProps { - source: string; -} - -const SourceFooter: React.FC = ({ source }) => { - return ( - <> -
      - -
      - - ); -}; - -function BoxArrowUpRightIcon(props: React.SVGProps) { - return ( - - - - - ); -} - -export default SourceFooter; diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/src/components/WordDefinitions.tsx b/06_js-debug/uebungen/u16_lexifind-exercise/src/components/WordDefinitions.tsx deleted file mode 100644 index ba6bcfd..0000000 --- a/06_js-debug/uebungen/u16_lexifind-exercise/src/components/WordDefinitions.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import React from 'react'; -import { Meaning, WordData } from '../lib/datatypes'; - -interface WordDefinitionsProps { - wordData: WordData; -} - -const WordDefinitions: React.FC = ({ wordData }) => { - return ( -
      - {wordData.meanings.map((meaning: any, index: number) => ( - - ))} -
      - ); -}; - -interface WordDefinitionBlockProps { - data: Meaning; -} - -const WordDefinitionBlock: React.FC = ({ data }) => { - const { partOfSpeech, definitions, synonyms } = data; - - return ( -
      -
      -

      {partOfSpeech}

      -
      -
      - -
      -

      Meaning

      - -
        - {definitions.map((definition: any, index: number) => ( -
      • - {definition.definition}{' '} - {definition.example && ( - - "{definition.example}" - - )} -
      • - ))} -
      -
      - - {synonyms.length > 0 && ( -
      -

      Synonyms

      - -
        - {synonyms.map((synonym: string, index: number) => ( -
      • - {synonym} -
      • - ))} -
      -
      - )} -
      - ); -}; - -export default WordDefinitions; diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/src/components/WordHero.tsx b/06_js-debug/uebungen/u16_lexifind-exercise/src/components/WordHero.tsx deleted file mode 100644 index fc40c93..0000000 --- a/06_js-debug/uebungen/u16_lexifind-exercise/src/components/WordHero.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import React, { useState, useEffect, useRef } from 'react'; -import { PlayIcon, HeartIcon, HeartFilled } from './Icons'; -import { Phonetic } from '../lib/datatypes'; - -interface WordHeroProps { - data: { - word: string; - phonetics: Phonetic[]; - }; -} - -const WordHero: React.FC = ({ data }) => { - const { word, phonetics } = data; - - const [isFavorite, setIsFavorite] = useState(false); - - const americanEnglishPhonetic = phonetics.find((phonetic) => phonetic.audio?.includes('-us')); - const finalPhonetic = americanEnglishPhonetic || phonetics[0]; - - const audioRef = useRef(null); - - const playAudio = () => { - if (audioRef.current) { - audioRef.current.play(); - } - }; - - const toggleFavorite = () => { - const favorites = JSON.parse(localStorage.getItem('favoriteWords') || '[]'); - - if (favorites.includes(word)) { - const filteredFavorites = favorites.filter((item: string) => item !== word); - localStorage.setItem('favoriteWords', JSON.stringify(filteredFavorites)); - } else { - favorites.push(word); - localStorage.setItem('favoriteWords', JSON.stringify(favorites)); - } - - setIsFavorite(!isFavorite); - }; - - useEffect(() => { - const favoriteWords = JSON.parse(localStorage.getItem('favoriteWords') || '[]'); - setIsFavorite(favoriteWords.includes(word)); - }, [word]); - - return ( -
      -
      - - -

      {word}

      - {finalPhonetic?.text &&

      {finalPhonetic.text}

      } -
      - - {finalPhonetic?.audio && ( -
      - - -
      - )} -
      - ); -}; - -export default WordHero; diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/src/index.css b/06_js-debug/uebungen/u16_lexifind-exercise/src/index.css deleted file mode 100644 index c684563..0000000 --- a/06_js-debug/uebungen/u16_lexifind-exercise/src/index.css +++ /dev/null @@ -1,430 +0,0 @@ -*, -*::before, -*::after { - box-sizing: border-box; -} - -*, -html, -body { - margin: 0; - padding: 0; - color: #171717; -} - -button { - border: none; -} - -a { - text-decoration: none; -} - -.screen-reader-text { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border-width: 0; -} - -.heart-icon-btn { - background-color: transparent; - margin-right: auto; - cursor: pointer; -} - -.heart-icon-unfilled { - width: 2rem; /* 32px */ - height: 2rem; /* 32px */ - stroke: #9333ea; - background-color: transparent; -} - -.heart-icon-filled { - width: 2rem; /* 32px */ - height: 2rem; /* 32px */ - fill: #9333ea; - background-color: transparent; -} - -/* ===== App Component ===== */ -.app-wrapper { - margin: 0 auto; - max-width: 42rem; /* 672px */ - padding: 3.5rem 1.5rem; /* 56px 24px */ -} - -/* ===== Header Component ===== */ -.header-container { - display: flex; - align-items: center; - justify-content: space-between; -} - -.header-logo-wrapper { - display: flex; - align-items: center; -} - -.header-logo-img { - height: 2.5rem; /* 40px */ -} - -.header-logo-text { - font-family: ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif; - font-size: 1.875rem; /* 30px */ - line-height: 2.25rem; /* 36px */ - font-weight: 600; - margin-left: 1rem; /* 16px */ - color: #262626; -} - -.header-select { - border-radius: 0.375rem; /* 6px */ - border-width: 0px; - padding: 0.625rem 0.5rem; /* 10px 8px */ - font-size: 1.125rem; /* 18px */ - line-height: 1.75rem; /* 28px */ - outline: 2px solid transparent; - outline-offset: 2px; - color: #262626; -} - -.header-select:focus { - outline-color: #9333ea; -} - -.header-link-text { - font-size: 1.125rem; /* 18px */ - line-height: 1.75rem; /* 28px */ - text-decoration: none; - color: #262626; -} - -.header-link-text:hover { - color: #9333ea; -} - -/* ===== Searchbar Component ===== */ -.searchbar-wrapper { - margin-top: 4rem; /* 64px */ -} - -.searchbar-container { - position: relative; - margin-top: 0.5rem; /* 8px */ - border-radius: 0.75rem; /* 12px */ - box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); -} - -.searchbar-input { - display: block; - width: 100%; - border-radius: 0.75rem; /* 12px */ - border-width: 0px; - padding: 1.25rem 0 1.25rem 1.5rem; /* 20px 0 20px 24px */ - font-size: 1.125rem; /* 18px */ - line-height: 1.75rem; /* 28px */ - font-weight: 600; - outline-style: solid; - outline: 2px solid transparent; - outline-color: #f5f5f5; - color: #171717; - background-color: #f5f5f5; -} - -.searchbar-input:focus { - outline-color: #9333ea; -} - -.searchbar-input::placeholder { - color: #737373; -} - -.searchbar-magnifying-glass { - position: absolute; - top: 0px; - bottom: 0px; - right: 0px; - display: flex; - align-items: center; - border-top-right-radius: 0.75rem; /* 12px */ - border-bottom-right-radius: 0.75rem; /* 12px */ - padding-left: 1rem; /* 16px */ - padding-right: 1rem; /* 16px */ - outline: 2px solid transparent; - outline-offset: 2px; - background-color: transparent; -} - -.searchbar-icon { - width: 1.5rem; /* 24px */ - height: 1.5rem; /* 24px */ - fill: #6b21a8; -} - -/* ===== WordHero Component ===== */ -.wordhero-wrapper { - display: flex; - align-items: center; - justify-content: space-between; - margin-top: 4rem; /* 64px */ -} - -.wordhero-word-container { - display: flex; - flex-direction: column; -} - -.wordhero-word { - font-size: 3.75rem; /* 60px */ - line-height: 1; - font-weight: 600; - color: #262626; -} - -.wordhero-word-phonetic { - font-size: 1.5rem; /* 24px */ - line-height: 2rem; /* 32px */ - margin-top: 0.75rem; /* 12px */ - margin-bottom: 0.75rem; /* 12px */ - color: #9333ea; -} - -.wordhero-play-btn { - display: flex; - align-items: center; - border-radius: 9999px; - padding: 1.25rem; /* 20px */ - box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); - color: white; - background-color: #e9d5ff; -} - -.wordhero-play-btn:hover { - background-color: #d8b4fe; -} - -.wordhero-play-btn:focus { - outline: 2px solid transparent; - outline-color: #9333ea; -} - -.wordhero-play-icon { - height: 2.5rem; /* 40px */ - width: 2.5rem; /* 40px */ - fill: #9333ea; -} - -/* ===== WordDefinitions Component ===== */ -.word-definitions-wrapper { - display: flex; - flex-direction: column; - gap: 2rem; /* 32px */ - margin-top: 4rem; /* 64px */ -} - -.word-block-wrapper { - display: flex; - flex-direction: column; - gap: 3.5rem; /* 56px */ -} - -.word-block-category-container { - display: flex; - align-items: center; - gap: 0.5rem; /* 8px */ -} - -.word-block-category-name { - padding-right: 0.75rem; /* 12px */ - font-size: 1.5rem; /* 24px */ - line-height: 2rem; /* 32px */ - font-weight: 600; - color: #262626; -} - -.word-block-category-divider { - height: 1px; - width: 100%; - background-color: #d4d4d4; -} - -.word-block-meaning-container { - display: flex; - flex-direction: column; - row-gap: 1rem; /* 16px */ -} - -.word-block-meaning-title { - font-size: 1.25rem; /* 20px */ - line-height: 1.75rem; /* 28px */ - font-weight: 400; - color: #737373; -} - -.word-block-meaning-list { - display: flex; - flex-direction: column; - padding-left: 1rem; /* 16px */ - font-size: 1.125rem; /* 18px */ - line-height: 1.75rem; /* 28px */ - row-gap: 2rem; /* 32px */ - color: #262626; -} - -.word-block-meaning-list-item::marker { - padding-left: 2.5rem; /* 40px */ - color: #9333ea; -} - -.word-block-meaning-list-item-example { - display: block; - margin-top: 0.5rem; /* 8px */ - color: #9333ea; -} - -.word-block-synonyms-container { - display: flex; - align-items: baseline; - column-gap: 2rem; /* 32px */ -} - -.word-block-synonyms-title { - font-size: 1.25rem; /* 20px */ - line-height: 1.75rem; /* 28px */ - font-weight: 400; - color: #737373; -} - -.word-block-synonyms-list { - display: flex; - flex-wrap: wrap; - align-items: center; - gap: 0.5rem; /* 8px */ -} - -.word-block-synonyms-list-item { - list-style: none; - font-size: 1.125rem; /* 18px */ - line-height: 1.75rem; /* 28px */ - font-weight: 600; - color: #9333ea; -} - -/* ===== SourceFooter Component ===== */ -.footer-divider { - margin-top: 2.5rem; /* 40px */ - margin-bottom: 2.5rem; /* 40px */ - height: 1px; - background-color: #e5e5e5; -} - -.footer-wrapper { - display: flex; - align-items: baseline; - gap: 1rem; /* 16px */ - font-size: 0.875rem; /* 14px */ - line-height: 1.25rem; /* 20px */ -} - -.footer-title { - font-weight: 400; - color: #737373; -} - -.footer-link-wrapper { - display: flex; - text-decoration: underline; - color: #262626; -} - -.footer-link-icon { - margin-left: 0.5rem; /* 8px */ - height: 1rem; /* 16px */ - width: 1rem; /* 16px */ - fill: #262626; -} - -/* ===== Favorites Page ===== */ -.favorites-list { - margin-top: 1rem; /* 16px */ - border-top-width: 2px; - border-bottom-width: 0px; - border-color: rgb(229 229 229); -} - -.favorites-text { - margin-top: 4rem; /* 64px */ - font-size: 1.125rem; /* 18px */ - line-height: 1.75rem; /* 28px */ - color: #525252; -} - -.favorites-item { - list-style: none; - padding: 0.5rem 0; /* Add some padding to each item */ -} - -.favorites-item.with-divider { - border-top: 1px solid #e5e5e5; /* Add divider */ -} - -/* ===== Favorite Word ===== */ -.fave-word-wrapper { - display: flex; - align-items: center; - justify-content: space-between; - padding: 2.5rem 0; /* 40px 0 */ -} - -.fave-word-link { - background-color: #e9d5ff; - padding: 0.5rem 0.875rem; /* 8px 14px */ - border-radius: 0.375rem; /* 6px */ - box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); -} - -.fave-word-link:hover { - background-color: #d8b4fe; -} - -.fave-word-link:focus { - outline: 2px solid #9333ea; -} - -.fave-word-link p { - font-size: 1.25rem; /* 20px */ - line-height: 1.75rem; /* 28px */ - font-weight: 500; - color: #262626; -} - -.fave-icon-btn { - background-color: transparent; - cursor: pointer; -} - -/* ===== Breakpoints ===== */ -@media (min-width: 640px) { - .searchbar-input { - line-height: 1.5rem; /* 24px */ - } -} - -@media (min-width: 768px) { - .word-block-meaning-list { - padding-left: 2.5rem; /* 40px */ - } -} - -@media (min-width: 1024px) { - .app-wrapper { - padding: 3.5rem 0.5rem; /* 56px 8px */ - } -} diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/src/lib/constants.ts b/06_js-debug/uebungen/u16_lexifind-exercise/src/lib/constants.ts deleted file mode 100644 index 76a8a8d..0000000 --- a/06_js-debug/uebungen/u16_lexifind-exercise/src/lib/constants.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const SERIF_FONTS = - 'ui-serif, Georgia, Cambria, "Times New Roman", Times, serif'; - -export const SANS_SERIF_FONTS = - 'ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"'; diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/src/lib/datatypes.ts b/06_js-debug/uebungen/u16_lexifind-exercise/src/lib/datatypes.ts deleted file mode 100644 index 1387f74..0000000 --- a/06_js-debug/uebungen/u16_lexifind-exercise/src/lib/datatypes.ts +++ /dev/null @@ -1,22 +0,0 @@ -export interface Phonetic { - text?: string; - audio?: string; -} - -export interface Definition { - definition: string; - example?: string; -} - -export interface Meaning { - partOfSpeech: string; - definitions: Definition[]; - synonyms: string[]; -} - -export interface WordData { - word: string; - phonetics: Phonetic[]; - meanings: Meaning[]; - sourceUrls: string[]; -} diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/src/main.tsx b/06_js-debug/uebungen/u16_lexifind-exercise/src/main.tsx deleted file mode 100644 index 448bae6..0000000 --- a/06_js-debug/uebungen/u16_lexifind-exercise/src/main.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import React from 'react'; -import ReactDOM from 'react-dom/client'; -import './index.css'; - -import Root from './pages/root.tsx'; -import Favorites from './pages/favorites.tsx'; -import { createBrowserRouter, RouterProvider } from 'react-router-dom'; - -const router = createBrowserRouter([ - { - path: '/', - element: , - }, - { - path: '/favorites', - element: , - }, -]); - -ReactDOM.createRoot(document.getElementById('root')!).render( - - - -); diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/src/pages/favorites.tsx b/06_js-debug/uebungen/u16_lexifind-exercise/src/pages/favorites.tsx deleted file mode 100644 index 580c8c0..0000000 --- a/06_js-debug/uebungen/u16_lexifind-exercise/src/pages/favorites.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { useState, useEffect } from 'react'; - -import Header from '../components/Header'; -import FavoriteWord from '../components/FavoriteWord'; - -import { SERIF_FONTS } from '../lib/constants'; - -function Favorites() { - const [font, setFont] = useState(SERIF_FONTS); - const [favoriteWords, setFavoriteWords] = useState([]); - - useEffect(() => { - const loadedFavorites = JSON.parse( - localStorage.getItem('favoriteWords') || '[]' - ); - setFavoriteWords(loadedFavorites); - }, []); - - return ( -
      -
      - - {favoriteWords.length > 0 ? ( -
        - {favoriteWords.map((word, index) => ( -
      • 0 ? 'with-divider' : ''}`} - key={index} - > - -
      • - ))} -
      - ) : ( -

      No favorite words added yet.

      - )} -
      - ); -} - -export default Favorites; diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/src/pages/root.tsx b/06_js-debug/uebungen/u16_lexifind-exercise/src/pages/root.tsx deleted file mode 100644 index a196c3e..0000000 --- a/06_js-debug/uebungen/u16_lexifind-exercise/src/pages/root.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import React, { useState, useEffect } from 'react'; -import { useSearchParams } from 'react-router-dom'; - -import { WordData } from '../lib/datatypes'; - -import Header from '../components/Header'; -import Searchbar from '../components/Searchbar'; -import WordHero from '../components/WordHero'; -import WordDefinitions from '../components/WordDefinitions'; -import SourceFooter from '../components/SourceFooter'; - -import { SERIF_FONTS } from '../lib/constants'; - -function Root() { - const [params] = useSearchParams(); - - const [font, setFont] = useState(SERIF_FONTS); - const [word, setWord] = useState(params.get('word') || 'course'); // /?word=WERT - const [wordData, setWordData] = useState(null); - - const fetchData = async () => { - try { - const url = `https://api.dictionaryapi.dev/api/v2/entries/en/${word}`; - const response = await fetch(url); - const data = await response.json(); - - setWordData(data[0]); - } catch (error: unknown) { - if (error instanceof Error) { - console.error(error.message); - } - console.error(error); - } - }; - - const handleSubmit = async (e: React.SyntheticEvent) => { - e.preventDefault(); - fetchData(); - }; - - useEffect(() => { - fetchData(); - }, []); - - return ( -
      -
      - - - - {wordData && ( -
      - - - -
      - )} -
      - ); -} - -export default Root; diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/src/vite-env.d.ts b/06_js-debug/uebungen/u16_lexifind-exercise/src/vite-env.d.ts deleted file mode 100644 index 11f02fe..0000000 --- a/06_js-debug/uebungen/u16_lexifind-exercise/src/vite-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/tsconfig.app.json b/06_js-debug/uebungen/u16_lexifind-exercise/tsconfig.app.json deleted file mode 100644 index d739292..0000000 --- a/06_js-debug/uebungen/u16_lexifind-exercise/tsconfig.app.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", - "target": "ES2020", - "useDefineForClassFields": true, - "lib": ["ES2020", "DOM", "DOM.Iterable"], - "module": "ESNext", - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - "moduleDetection": "force", - "noEmit": true, - "jsx": "react-jsx", - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true - }, - "include": ["src"] -} diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/tsconfig.json b/06_js-debug/uebungen/u16_lexifind-exercise/tsconfig.json deleted file mode 100644 index ea9d0cd..0000000 --- a/06_js-debug/uebungen/u16_lexifind-exercise/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "files": [], - "references": [ - { - "path": "./tsconfig.app.json" - }, - { - "path": "./tsconfig.node.json" - } - ] -} diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/tsconfig.node.json b/06_js-debug/uebungen/u16_lexifind-exercise/tsconfig.node.json deleted file mode 100644 index 3afdd6e..0000000 --- a/06_js-debug/uebungen/u16_lexifind-exercise/tsconfig.node.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", - "skipLibCheck": true, - "module": "ESNext", - "moduleResolution": "bundler", - "allowSyntheticDefaultImports": true, - "strict": true, - "noEmit": true - }, - "include": ["vite.config.ts"] -} diff --git a/06_js-debug/uebungen/u16_lexifind-exercise/vite.config.ts b/06_js-debug/uebungen/u16_lexifind-exercise/vite.config.ts deleted file mode 100644 index 5a33944..0000000 --- a/06_js-debug/uebungen/u16_lexifind-exercise/vite.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [react()], -}) diff --git a/06_js-debug/uebungen/u17-19_shop-vitest/.eslintrc.cjs b/06_js-debug/uebungen/u17-19_shop-vitest/.eslintrc.cjs deleted file mode 100644 index d6c9537..0000000 --- a/06_js-debug/uebungen/u17-19_shop-vitest/.eslintrc.cjs +++ /dev/null @@ -1,18 +0,0 @@ -module.exports = { - root: true, - env: { browser: true, es2020: true }, - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:react-hooks/recommended', - ], - ignorePatterns: ['dist', '.eslintrc.cjs'], - parser: '@typescript-eslint/parser', - plugins: ['react-refresh'], - rules: { - 'react-refresh/only-export-components': [ - 'warn', - { allowConstantExport: true }, - ], - }, -} diff --git a/06_js-debug/uebungen/u17-19_shop-vitest/README.md b/06_js-debug/uebungen/u17-19_shop-vitest/README.md deleted file mode 100644 index 7d128c6..0000000 --- a/06_js-debug/uebungen/u17-19_shop-vitest/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Frontend Class: VogueJunction Starter Template - -Install the dependencies and devDependencies and start the server. - -```bash -npm install -npm run dev -``` - -This will start the server on http://localhost:5173 diff --git a/06_js-debug/uebungen/u17-19_shop-vitest/index.html b/06_js-debug/uebungen/u17-19_shop-vitest/index.html deleted file mode 100644 index 6574d3c..0000000 --- a/06_js-debug/uebungen/u17-19_shop-vitest/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - Vogue Junction - - -
      - - - diff --git a/06_js-debug/uebungen/u17-19_shop-vitest/package-lock.json b/06_js-debug/uebungen/u17-19_shop-vitest/package-lock.json deleted file mode 100644 index 81aafcd..0000000 --- a/06_js-debug/uebungen/u17-19_shop-vitest/package-lock.json +++ /dev/null @@ -1,3964 +0,0 @@ -{ - "name": "01_shop-vitest", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "01_shop-vitest", - "version": "0.0.0", - "dependencies": { - "react": "^19.2.8", - "react-dom": "^19.2.8", - "react-router-dom": "^7.18.2" - }, - "devDependencies": { - "@testing-library/dom": "^10.4.1", - "@testing-library/jest-dom": "^7.0.1", - "@testing-library/react": "^16.3.2", - "@testing-library/user-event": "^14.6.6", - "@types/react": "^19.2.18", - "@types/react-dom": "^19.2.5", - "@typescript-eslint/eslint-plugin": "^8.67.0", - "@typescript-eslint/parser": "^8.67.0", - "@vitejs/plugin-react": "^6.1.0", - "@vitest/ui": "^4.1.11", - "eslint": "^10.9.0", - "eslint-plugin-react-hooks": "^7.1.1", - "eslint-plugin-react-refresh": "^0.5.4", - "jsdom": "^30.0.1", - "typescript": "^6.0.3", - "vite": "^8.2.2", - "vitest": "^4.1.11" - } - }, - "node_modules/@adobe/css-tools": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.5.0.tgz", - "integrity": "sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@asamuzakjp/css-color": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-6.0.7.tgz", - "integrity": "sha512-vC/bk1Lz7Tn/EfU9/apOTBk80/8dyGyWMowPoV1tJ52muDGsDqt2HPT2klrFUiY60MQmQv9q8yIht15JnBgDGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@csstools/css-calc": "^3.3.0", - "@csstools/css-color-parser": "^4.1.10", - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0", - "lru-cache": "^11.5.2" - }, - "engines": { - "node": "^22.13.0 || >=24.0.0" - } - }, - "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { - "version": "11.5.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@asamuzakjp/dom-selector": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-8.3.2.tgz", - "integrity": "sha512-93Z1N+BQNXysodoicpOIyNh2drHfz/CTf9nnT0FEx72GJcIiwgydD7tGAr78j41LsYn3hlRn+LdGPuBLn1Bl8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "bidi-js": "^1.0.3", - "css-tree": "^3.2.1", - "is-potential-custom-element-name": "^1.0.1", - "lru-cache": "^11.5.2" - }, - "engines": { - "node": "^22.13.0 || >=24.0.0" - } - }, - "node_modules/@asamuzakjp/dom-selector/node_modules/lru-cache": { - "version": "11.5.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", - "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.29.7", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", - "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", - "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-compilation-targets": "^7.29.7", - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helpers": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", - "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.8", - "@babel/types": "^7.29.8", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", - "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", - "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", - "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", - "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", - "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", - "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", - "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.8" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", - "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", - "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", - "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.8", - "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.8", - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.8", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", - "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bramus/specificity": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", - "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "css-tree": "^3.0.0" - }, - "bin": { - "specificity": "bin/cli.js" - } - }, - "node_modules/@csstools/color-helpers": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.1.1.tgz", - "integrity": "sha512-gLNsunvwf3mCi5u5o46/Z/JcJMnhbHSaZ69rkgPzNM3J4s8hWwpPUQB6/tt0EDFyCiWzxANlx+2LJwpYj4zS1w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=20.19.0" - } - }, - "node_modules/@csstools/css-calc": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.3.0.tgz", - "integrity": "sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@csstools/css-color-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.2.0.tgz", - "integrity": "sha512-5+5LEmFuY1AjXdYhmgjTJogtQnP1evJ1zrBZGUNZ0thkpwnnmKxcHdAMn/OtFjAb25zA+jKDVYVRl+5G7rjv1A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/color-helpers": "^6.1.1", - "@csstools/css-calc": "^3.3.0" - }, - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", - "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.8.tgz", - "integrity": "sha512-CpMLjAvwQg3BL5S0IeqsZNMH7EQrEWi0kLKOC13ZBF0ZwERiLWlibNPJr8G1kdU3Ms/r2KiNrF81pUh2HwAHdg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "peerDependencies": { - "css-tree": "^3.2.1" - }, - "peerDependenciesMeta": { - "css-tree": { - "optional": true - } - } - }, - "node_modules/@csstools/css-tokenizer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", - "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=20.19.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", - "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.23.5", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", - "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^3.0.5", - "debug": "^4.3.1", - "minimatch": "^10.2.4" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", - "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^1.2.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/core": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", - "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/object-schema": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", - "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", - "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^1.2.1", - "levn": "^0.4.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@exodus/bytes": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.1.tgz", - "integrity": "sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "@noble/hashes": "^1.8.0 || ^2.0.0" - }, - "peerDependenciesMeta": { - "@noble/hashes": { - "optional": true - } - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", - "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/types": "^0.15.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", - "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.2", - "@humanfs/types": "^0.15.0", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/types": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", - "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@oxc-project/types": { - "version": "0.146.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.146.0.tgz", - "integrity": "sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rolldown/binding-android-arm-eabi": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.5.tgz", - "integrity": "sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.5.tgz", - "integrity": "sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.5.tgz", - "integrity": "sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.5.tgz", - "integrity": "sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.5.tgz", - "integrity": "sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.5.tgz", - "integrity": "sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.5.tgz", - "integrity": "sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.5.tgz", - "integrity": "sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.5.tgz", - "integrity": "sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.5.tgz", - "integrity": "sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.5.tgz", - "integrity": "sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.5.tgz", - "integrity": "sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.5.tgz", - "integrity": "sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.5.tgz", - "integrity": "sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.5.tgz", - "integrity": "sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@testing-library/dom": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", - "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "picocolors": "1.1.1", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@testing-library/jest-dom": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-7.0.1.tgz", - "integrity": "sha512-oMDTC3oA+6CXSO2JZnvOI7CA6oVub6kij5ggk9ohwye5slmkwxYDXcPOVxgMw/RQlticjtO0C1RZkR97HgrWMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@adobe/css-tools": "^4.4.0", - "aria-query": "^5.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.6.3", - "picocolors": "^1.1.1", - "redent": "^3.0.0" - }, - "engines": { - "node": ">=22", - "npm": ">=6", - "yarn": ">=1" - }, - "peerDependencies": { - "@testing-library/dom": ">=10 <11", - "vitest": ">= 0.32" - }, - "peerDependenciesMeta": { - "vitest": { - "optional": true - } - } - }, - "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", - "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@testing-library/react": { - "version": "16.3.2", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.2.tgz", - "integrity": "sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@testing-library/dom": "^10.0.0", - "@types/react": "^18.0.0 || ^19.0.0", - "@types/react-dom": "^18.0.0 || ^19.0.0", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@testing-library/user-event": { - "version": "14.6.6", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.6.tgz", - "integrity": "sha512-Jbs9FpkkIDw8FgSc6kOVsOv8JuuqGAL7J4X1oot77JxAoDlkNn2GRkd0aYRVuQ+pVQAiHWVkE4rX/dkF5fBiCw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" - } - }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/chai": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" - } - }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/esrecurse": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", - "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.2.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", - "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.2.5", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.5.tgz", - "integrity": "sha512-fMPwH9v7r/pp43yUd2/Mbiex5KouJwwR3dzHkhLREUC6764VyDsqxhAxv6OFEYR1RhjOyD1naqba8ECDBe7ZQg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.67.0.tgz", - "integrity": "sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.67.0", - "@typescript-eslint/type-utils": "8.67.0", - "@typescript-eslint/utils": "8.67.0", - "@typescript-eslint/visitor-keys": "8.67.0", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.67.0", - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.67.0.tgz", - "integrity": "sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.67.0", - "@typescript-eslint/types": "8.67.0", - "@typescript-eslint/typescript-estree": "8.67.0", - "@typescript-eslint/visitor-keys": "8.67.0", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.67.0.tgz", - "integrity": "sha512-cvE8c7ulYeXN9fYuszhCeCsbzyVEXuhrRCybnBre7TUmqb5nRmBfQAwCj0O3WJFDeyAZt4VYv51vMCC9LHSdYw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.67.0", - "@typescript-eslint/types": "^8.67.0", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.67.0.tgz", - "integrity": "sha512-EgvsleTwS4E+WzzSvem8fAUubLwatMNF1B5hHSLQxcvs7q2dtRhGyujHwLJSYlG41niJ7GP24Aha2+0mb1b2kg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.67.0", - "@typescript-eslint/visitor-keys": "8.67.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.67.0.tgz", - "integrity": "sha512-vV+LUSv5njUWsknE71fqKTlXUva+R76SaeORd6Zojcunk/6DvKFXONU3BrAs2H49mbygUXt6gbYunzwqNwlhdg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.67.0.tgz", - "integrity": "sha512-aVWDXbRmdXO9siTfX4ditQI1T9+zVcNazT48EJCD0v40/9RIFoUgZ05CmGEq9H2gixRpjUn/iplwvlcvutJW/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.67.0", - "@typescript-eslint/typescript-estree": "8.67.0", - "@typescript-eslint/utils": "8.67.0", - "debug": "^4.4.3", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.67.0.tgz", - "integrity": "sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.67.0.tgz", - "integrity": "sha512-EKQBCE9yNlRJYm7jdTW5AhDacDUmSwQb0FAJAmK2EKYrNXIsa2vxcSZx6PvJ/dEdI6lS+Y9W+EXckLj0iPFGcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.67.0", - "@typescript-eslint/tsconfig-utils": "8.67.0", - "@typescript-eslint/types": "8.67.0", - "@typescript-eslint/visitor-keys": "8.67.0", - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.67.0.tgz", - "integrity": "sha512-U9D1FdwEWBwok3hxxSdhclMb0twvt9QnjIQ0VfQ1AiX2epnpSgv2ubVDsayOFyY8K6FX+AQ7E0FKWVG3iKsj1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.67.0", - "@typescript-eslint/types": "8.67.0", - "@typescript-eslint/typescript-estree": "8.67.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.67.0.tgz", - "integrity": "sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.67.0", - "eslint-visitor-keys": "^5.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.1.0.tgz", - "integrity": "sha512-qd2BzUBehkov86WFhg0JkEFEYyCLG9uPCe6qWTY/kRlss9OvJrOF2UbIWT7p+8IzZHkEu0DNGHc4HSv+JdDLsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rolldown/pluginutils": "^1.0.1" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", - "babel-plugin-react-compiler": "^1.0.0", - "oxc-transform-react": "^0.145.0", - "vite": "^8.0.0" - }, - "peerDependenciesMeta": { - "@rolldown/plugin-babel": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true - }, - "oxc-transform-react": { - "optional": true - } - } - }, - "node_modules/@vitest/expect": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.11.tgz", - "integrity": "sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.1.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.11", - "@vitest/utils": "4.1.11", - "chai": "^6.2.2", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.11.tgz", - "integrity": "sha512-2XJVD55d1o5AZous5CCGKS74g/riOj9odEt2bQpCVZeblHyHdnMeFl4jl0XjU21stf4mbjUkew2eXQZt65g5CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.1.11", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/pretty-format": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.11.tgz", - "integrity": "sha512-yiZzPbGTS9Sr/JpFl8zHrcIkAofNbFV6k21vIgQN/cY/oxZeXhJv5sc/MBJ5jFKWmWs+oJHw0UXLZjmf931+Vw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.11.tgz", - "integrity": "sha512-LztvUgdwMNJMIkj3hQnnxiC2Xy1zNxq928W/xhjCLaNCzqTZOudjwbQf6v9IntZGPw132i2Lq2rgTRZHD3JHNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.1.11", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.11.tgz", - "integrity": "sha512-pN7ikn1ON7h8ee4gIAp4AzyK+zBtJPzVbqOgu5LCEh4VaJVbPQcgYQYJIMGQPXVeJJq1fnfazis7a5pFNPahog==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.1.11", - "@vitest/utils": "4.1.11", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.11.tgz", - "integrity": "sha512-apNa/prQy2qCeywhnixOHPRCgGNhvg7T4Dapfl1GahLp/R+uhBm5cPyFoNVyqsNd2h1nJxL6BqqdIjiABL60YA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/ui": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-4.1.11.tgz", - "integrity": "sha512-r/rwyKoev21mWdRGSEkZOqkQ2BYy68mwjihg9M90nNRbf4NGrgzZ4cj6JNCEwlOGJkbKeMgsjlykvwKUbRr7gw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.1.11", - "fflate": "^0.8.2", - "flatted": "^3.4.2", - "pathe": "^2.0.3", - "sirv": "^3.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.1.11" - } - }, - "node_modules/@vitest/utils": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.11.tgz", - "integrity": "sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.1.11", - "convert-source-map": "^2.0.0", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/acorn": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", - "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/baseline-browser-mapping": { - "version": "2.11.18", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.18.tgz", - "integrity": "sha512-1iEmLEYSiE1SeBoAfPo/Mnx3PzfzHUkDK61ASkCpuk3YXugYLH5DYK1SzqV55F8FMI6s0F+/tCP7Polz1QRjxw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/bidi-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", - "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", - "dev": true, - "license": "MIT", - "dependencies": { - "require-from-string": "^2.0.2" - } - }, - "node_modules/brace-expansion": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", - "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/browserslist": { - "version": "4.28.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", - "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.11.12", - "caniuse-lite": "^1.0.30001809", - "electron-to-chromium": "^1.5.402", - "node-releases": "^2.0.53", - "update-browserslist-db": "^1.3.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001809", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz", - "integrity": "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", - "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-tree": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", - "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mdn-data": "2.27.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", - "dev": true, - "license": "MIT" - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/data-urls": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", - "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-mimetype": "^5.0.0", - "whatwg-url": "^16.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz", - "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@exodus/bytes": "^1.11.0", - "tr46": "^6.0.0", - "webidl-conversions": "^8.0.1" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", - "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", - "dev": true, - "license": "MIT" - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "dev": true, - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.412", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.412.tgz", - "integrity": "sha512-z4rMe3esBzlzovKHj4gxJnsCGZRK5l4baUvm+gCGJBPE+gsyUMKsuU9tnEUtI1dOebXz1ytAPGjvXhmQ7rIPwA==", - "dev": true, - "license": "ISC" - }, - "node_modules/entities": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", - "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=20.19.0" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/es-module-lexer": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", - "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", - "dev": true, - "license": "MIT" - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "10.9.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.9.0.tgz", - "integrity": "sha512-5KeEOJZBfEVA47boFiBsf+6MmmJpffM7qEBg4pLla2e4nlKgdKlqCW0oSLOGsT8Wl5uCGJptLV1bkaiShj90Gw==", - "dev": true, - "license": "MIT", - "workspaces": [ - "packages/*" - ], - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.2", - "@eslint/config-array": "^0.23.5", - "@eslint/config-helpers": "^0.7.0", - "@eslint/core": "^1.2.1", - "@eslint/plugin-kit": "^0.7.2", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.14.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^9.1.2", - "eslint-visitor-keys": "^5.0.1", - "espree": "^11.2.0", - "esquery": "^1.7.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "minimatch": "^10.2.5", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", - "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.24.4", - "@babel/parser": "^7.24.4", - "hermes-parser": "^0.25.1", - "zod": "^3.25.0 || ^4.0.0", - "zod-validation-error": "^3.5.0 || ^4.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" - } - }, - "node_modules/eslint-plugin-react-refresh": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.4.tgz", - "integrity": "sha512-7bqTKz7T0r+HKWFarNXByDE9/5+73wI2ru+M3zuqGbR7s/b/5/pQJXZoufWlrngqGqoZto73ZkGumCdLxk+4rw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "eslint": "^9 || ^10" - } - }, - "node_modules/eslint-scope": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", - "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@types/esrecurse": "^4.3.1", - "@types/estree": "^1.0.8", - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/espree": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", - "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.16.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^5.0.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expect-type": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", - "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fflate": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.3.tgz", - "integrity": "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==", - "dev": true, - "license": "MIT" - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", - "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/hermes-estree": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", - "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", - "dev": true, - "license": "MIT" - }, - "node_modules/hermes-parser": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", - "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "hermes-estree": "0.25.1" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", - "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@exodus/bytes": "^1.6.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/ignore": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", - "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsdom": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-30.0.1.tgz", - "integrity": "sha512-52v7mUVUfNQVYYqE1lcdaymWL0njO7lTLUog6ZvW2U5KsbiLk/GnZlVJ+qx0xfNJZ6Gn+KSpPNE52vurbxZwrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@asamuzakjp/css-color": "^6.0.5", - "@asamuzakjp/dom-selector": "^8.3.0", - "@bramus/specificity": "^2.4.2", - "@csstools/css-syntax-patches-for-csstree": "^1.1.7", - "@exodus/bytes": "^1.15.1", - "css-tree": "^3.2.1", - "data-urls": "^7.0.0", - "decimal.js": "^10.6.0", - "html-encoding-sniffer": "^6.0.0", - "is-potential-custom-element-name": "^1.0.1", - "lru-cache": "^11.5.2", - "parse5": "^8.0.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^6.0.2", - "undici": "^8.9.0", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^8.0.1", - "whatwg-mimetype": "^5.0.0", - "whatwg-url": "^17.1.0", - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": "^22.22.2 || ^24.15.0 || >=26.0.0" - }, - "peerDependencies": { - "canvas": "^3.2.3" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/lru-cache": { - "version": "11.5.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lightningcss": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", - "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.33.0", - "lightningcss-darwin-arm64": "1.33.0", - "lightningcss-darwin-x64": "1.33.0", - "lightningcss-freebsd-x64": "1.33.0", - "lightningcss-linux-arm-gnueabihf": "1.33.0", - "lightningcss-linux-arm64-gnu": "1.33.0", - "lightningcss-linux-arm64-musl": "1.33.0", - "lightningcss-linux-x64-gnu": "1.33.0", - "lightningcss-linux-x64-musl": "1.33.0", - "lightningcss-win32-arm64-msvc": "1.33.0", - "lightningcss-win32-x64-msvc": "1.33.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", - "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", - "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", - "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", - "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", - "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", - "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", - "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", - "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", - "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", - "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", - "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "dev": true, - "license": "MIT", - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/mdn-data": { - "version": "2.27.1", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", - "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", - "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.8" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.18", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", - "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.53", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", - "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/obug": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", - "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==", - "dev": true, - "funding": [ - "https://github.com/sponsors/sxzz", - "https://opencollective.com/debug" - ], - "license": "MIT", - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", - "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^8.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", - "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.17", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/react": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", - "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", - "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.8" - } - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true, - "license": "MIT" - }, - "node_modules/react-router": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.2.tgz", - "integrity": "sha512-aUVMjFm3GAPTTZL7oYr5E7ETiqfQCHRLH+B+5afnICvf0r7kkK4eR6SMuwbSTJw/7t+12khT/Kahij49fqOCIg==", - "license": "MIT", - "dependencies": { - "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/react-router-dom": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.2.tgz", - "integrity": "sha512-AIKJ/jgGlFb3EbfCXk5Gzshiwt+l3mqbCrNjmEWMMjqQxNJ3svBa6bgzFyCC2Sw3RA0VWF1kg3uQf2OFhxb8hw==", - "license": "MIT", - "dependencies": { - "react-router": "7.18.2" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/rolldown": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.5.tgz", - "integrity": "sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "=0.146.0", - "@rolldown/pluginutils": "^1.0.0" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm-eabi": "1.2.5", - "@rolldown/binding-android-arm64": "1.2.5", - "@rolldown/binding-darwin-arm64": "1.2.5", - "@rolldown/binding-darwin-x64": "1.2.5", - "@rolldown/binding-freebsd-x64": "1.2.5", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.5", - "@rolldown/binding-linux-arm64-gnu": "1.2.5", - "@rolldown/binding-linux-arm64-musl": "1.2.5", - "@rolldown/binding-linux-ppc64-gnu": "1.2.5", - "@rolldown/binding-linux-s390x-gnu": "1.2.5", - "@rolldown/binding-linux-x64-gnu": "1.2.5", - "@rolldown/binding-linux-x64-musl": "1.2.5", - "@rolldown/binding-openharmony-arm64": "1.2.5", - "@rolldown/binding-win32-arm64-msvc": "1.2.5", - "@rolldown/binding-win32-x64-msvc": "1.2.5" - } - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-cookie-parser": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", - "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", - "license": "MIT" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "node_modules/sirv": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", - "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, - "node_modules/std-env": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz", - "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==", - "dev": true, - "license": "MIT" - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz", - "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyrainbow": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.1.tgz", - "integrity": "sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tldts": { - "version": "7.4.11", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.11.tgz", - "integrity": "sha512-aBiNayCfTQxuIJBm06M+xR14cYaYlDlSXZbgsnKzKNxDKUVq7KFwTjwBSsb7m9Y5xO8WfPnBc63WaYFMTGlvqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tldts-core": "^7.4.11" - }, - "bin": { - "tldts": "bin/cli.js" - } - }, - "node_modules/tldts-core": { - "version": "7.4.11", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.11.tgz", - "integrity": "sha512-CW3WN2rIIE/Of21mulhgnGOwoDyEFNygyIBOONSdyAuSATgMMUCpLeUlB+E8sAwA5xRV9hYPl+kyZ9citHCaKg==", - "dev": true, - "license": "MIT" - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.2.tgz", - "integrity": "sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tldts": "^7.0.5" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/tr46": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", - "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/ts-api-utils": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", - "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/typescript": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", - "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-8.10.0.tgz", - "integrity": "sha512-HvltHd7avK13QIw/oLe4qoOLyoVSoafqJ2jYOrtMRBkbYT31eiBQ8O0ehRKZiEZCMEyLFQNIADpgCWC5fALvYQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=22.19.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz", - "integrity": "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/vite": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", - "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "lightningcss": "^1.33.0", - "picomatch": "^4.0.5", - "postcss": "^8.5.26", - "rolldown": "~1.2.4", - "tinyglobby": "^0.2.17" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.4.0 || ^0.5.0", - "esbuild": "^0.27.0 || ^0.28.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vitest": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.11.tgz", - "integrity": "sha512-fhACrNXUidIbGSBr5FlbuBkO7VWC1ZyLl0DO4CU2DrQoAPxX84Ysxs+HeGQpii5lZWV1Q4gBZTTu49mF+A6Edw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.1.11", - "@vitest/mocker": "4.1.11", - "@vitest/pretty-format": "4.1.11", - "@vitest/runner": "4.1.11", - "@vitest/snapshot": "4.1.11", - "@vitest/spy": "4.1.11", - "@vitest/utils": "4.1.11", - "es-module-lexer": "^2.0.0", - "expect-type": "^1.3.0", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^4.0.0-rc.1", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.1.0", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.11", - "@vitest/browser-preview": "4.1.11", - "@vitest/browser-webdriverio": "4.1.11", - "@vitest/coverage-istanbul": "4.1.11", - "@vitest/coverage-v8": "4.1.11", - "@vitest/ui": "4.1.11", - "happy-dom": "*", - "jsdom": "*", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/coverage-istanbul": { - "optional": true - }, - "@vitest/coverage-v8": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - }, - "vite": { - "optional": false - } - } - }, - "node_modules/w3c-xmlserializer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/webidl-conversions": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", - "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=20" - } - }, - "node_modules/whatwg-mimetype": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", - "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/whatwg-url": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-17.1.0.tgz", - "integrity": "sha512-3GeworPmc2ZfEEHP7lEbUfBX/L75wdEsi0rLNhXcXxnoN5jyq0SL5gCy06SGW2cyTIZdTvWIDQNQoza++vKeaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@exodus/bytes": "^1.15.1", - "tr46": "^6.0.0", - "webidl-conversions": "^8.0.1" - }, - "engines": { - "node": "^22.14.0 || >=24.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/xml-name-validator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true, - "license": "MIT" - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", - "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-validation-error": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", - "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "zod": "^3.25.0 || ^4.0.0" - } - } - } -} diff --git a/06_js-debug/uebungen/u17-19_shop-vitest/package.json b/06_js-debug/uebungen/u17-19_shop-vitest/package.json deleted file mode 100644 index 2aa16d4..0000000 --- a/06_js-debug/uebungen/u17-19_shop-vitest/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "01_shop-vitest", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "tsc -b && vite build", - "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview", - "test": "vitest", - "test:ui": "npx vitest --ui" - }, - "dependencies": { - "react": "^19.2.8", - "react-dom": "^19.2.8", - "react-router-dom": "^7.18.2" - }, - "devDependencies": { - "@testing-library/dom": "^10.4.1", - "@testing-library/jest-dom": "^7.0.1", - "@testing-library/react": "^16.3.2", - "@testing-library/user-event": "^14.6.6", - "@types/react": "^19.2.18", - "@types/react-dom": "^19.2.5", - "@typescript-eslint/eslint-plugin": "^8.67.0", - "@typescript-eslint/parser": "^8.67.0", - "@vitejs/plugin-react": "^6.1.0", - "@vitest/ui": "^4.1.11", - "eslint": "^10.9.0", - "eslint-plugin-react-hooks": "^7.1.1", - "eslint-plugin-react-refresh": "^0.5.4", - "jsdom": "^30.0.1", - "typescript": "^6.0.3", - "vite": "^8.2.2", - "vitest": "^4.1.11" - } -} diff --git a/06_js-debug/uebungen/u17-19_shop-vitest/public/vite.svg b/06_js-debug/uebungen/u17-19_shop-vitest/public/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/06_js-debug/uebungen/u17-19_shop-vitest/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/06_js-debug/uebungen/u17-19_shop-vitest/src/components/CategorySection.tsx b/06_js-debug/uebungen/u17-19_shop-vitest/src/components/CategorySection.tsx deleted file mode 100644 index 4fb8862..0000000 --- a/06_js-debug/uebungen/u17-19_shop-vitest/src/components/CategorySection.tsx +++ /dev/null @@ -1,77 +0,0 @@ -import React from 'react'; - -type CategorySectionProps = { - categories: { - imgSrc: string; - imgAlt: string; - href: string; - linkText: string; - }[]; -}; - -import { Link } from 'react-router-dom'; - -const CategorySection: React.FC = ({ categories }) => { - return ( -
      -
      -

      - Explore by Category -

      - -
      - - {categories[0].imgAlt} - - -
      - ); -}; - -export default CategorySection; diff --git a/06_js-debug/uebungen/u17-19_shop-vitest/src/components/Footer.tsx b/06_js-debug/uebungen/u17-19_shop-vitest/src/components/Footer.tsx deleted file mode 100644 index 86ea22e..0000000 --- a/06_js-debug/uebungen/u17-19_shop-vitest/src/components/Footer.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import React from 'react'; -import { Link } from 'react-router-dom'; - -type NavigationItem = { - name: string; - href: string; -}; - -const navigationItems: NavigationItem[] = [ - { - name: 'Home', - href: '/', - }, - { - name: 'Women', - href: '/women', - }, - { - name: 'Men', - href: '/men', - }, - { - name: 'Accessories', - href: '/accessories', - }, -]; - -type FooterProps = { - navigation?: NavigationItem[]; -}; - -const Footer: React.FC = ({ navigation = navigationItems }) => { - return ( -
      -
      -
      - {navigation.map((item) => ( - - {item.name} - - ))} -
      - -
      -

      - © {new Date().getFullYear()} Vogue Junction, Inc. All rights - reserved. -

      -
      -
      -
      - ); -}; - -export default Footer; diff --git a/06_js-debug/uebungen/u17-19_shop-vitest/src/components/Header.tsx b/06_js-debug/uebungen/u17-19_shop-vitest/src/components/Header.tsx deleted file mode 100644 index ae21fd5..0000000 --- a/06_js-debug/uebungen/u17-19_shop-vitest/src/components/Header.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { Link } from 'react-router-dom'; - -const Header = () => { - return ( -
      - {/* Mobile Header */} -
      -
      - -
      Vogue Junction
      - -
      - -
      - - Women - - - Men - - - Accessories - -
      -
      - - {/* Desktop Header */} -
      -
      - -
      Vogue Junction
      - - -
      - - Women - - - Men - - - Accessories - -
      -
      -
      - -
      -
      - ); -}; - -export default Header; diff --git a/06_js-debug/uebungen/u17-19_shop-vitest/src/components/Hero.tsx b/06_js-debug/uebungen/u17-19_shop-vitest/src/components/Hero.tsx deleted file mode 100644 index afa8772..0000000 --- a/06_js-debug/uebungen/u17-19_shop-vitest/src/components/Hero.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import React from 'react'; - -type HeroProps = { - companyName?: string; -}; - -const Hero: React.FC = ({ companyName = 'Vogue Junction' }) => { - return ( -
      -
      -

      Welcome to the world of {companyName}!

      -

      - Discover a diverse collection of stylish products for everyone. From - trendy apparel and accessories to timeless classics, we offer - something for every taste and occasion. Shop now and elevate your - style! -

      -
      -
      - ); -}; - -export default Hero; diff --git a/06_js-debug/uebungen/u17-19_shop-vitest/src/components/ImageGallery.tsx b/06_js-debug/uebungen/u17-19_shop-vitest/src/components/ImageGallery.tsx deleted file mode 100644 index b68a3af..0000000 --- a/06_js-debug/uebungen/u17-19_shop-vitest/src/components/ImageGallery.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import React, { useState, useEffect } from 'react'; -import { Product } from '../lib/datatypes'; - -type ImageGalleryProps = { - product: Product; -}; - -const ImageGallery: React.FC = ({ product }: { product: Product }) => { - const [selectedImage, setSelectedImage] = useState(product.images[0]); - const [selectedIndex, setSelectedIndex] = useState(0); - - const handleKeyDown = (event: KeyboardEvent) => { - if (event.key === 'ArrowRight') { - setSelectedIndex((prevIndex) => { - const nextIndex = (prevIndex + 1) % product.images.length; - setSelectedImage(product.images[nextIndex]); - return nextIndex; - }); - } - - if (event.key === 'ArrowLeft') { - setSelectedIndex((prevIndex) => { - const nextIndex = (prevIndex - 1 + product.images.length) % product.images.length; - setSelectedImage(product.images[nextIndex]); - return nextIndex; - }); - } - }; - - useEffect(() => { - window.addEventListener('keydown', handleKeyDown); - - return () => { - window.removeEventListener('keydown', handleKeyDown); - }; - }, [product.images]); - - return ( -
      - {/* Image selector */} -
      -
      - {product.images.map((image, index) => ( - - ))} -
      -
      - - {/* Main Image Display */} -
      - {product.title} -
      -
      - ); -}; - -export default ImageGallery; diff --git a/06_js-debug/uebungen/u17-19_shop-vitest/src/components/ProductList.tsx b/06_js-debug/uebungen/u17-19_shop-vitest/src/components/ProductList.tsx deleted file mode 100644 index 17f7234..0000000 --- a/06_js-debug/uebungen/u17-19_shop-vitest/src/components/ProductList.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import React from 'react'; -import { Product } from '../lib/datatypes'; - -import ProductListCard from './ProductListCard'; - -type ProductListProps = { - data: Product[]; -}; - -const ProductList: React.FC = ({ data }) => { - return ( -
      -

      Products

      - -
      - {data.map((product) => ( - - ))} -
      -
      - ); -}; - -export default ProductList; diff --git a/06_js-debug/uebungen/u17-19_shop-vitest/src/components/ProductListCard.tsx b/06_js-debug/uebungen/u17-19_shop-vitest/src/components/ProductListCard.tsx deleted file mode 100644 index dcf4832..0000000 --- a/06_js-debug/uebungen/u17-19_shop-vitest/src/components/ProductListCard.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import React from 'react'; -import { Product } from '../lib/datatypes'; - -import { Link } from 'react-router-dom'; - -const ProductListCard = ({ product }: { product: Product }) => { - const { id, title, price, rating, stock, thumbnail } = product; - - return ( -
      -
      - {title} -
      - -
      -

      - -

      - -
      -

      {Math.round(rating)} out of 5 stars

      - -
      - {[0, 1, 2, 3, 4].map((ratingNumber) => ( - ratingNumber ? '#1e293b' : '#e5e7eb', - }} - aria-hidden="true" - /> - ))} -
      - -

      {stock} in stock

      -
      - -

      - {Number(price).toLocaleString('en-US', { - style: 'currency', - currency: 'USD', - })} -

      -
      -
      - ); -}; - -export default ProductListCard; - -function StarIcon(props: React.SVGProps) { - return ( - - - - ); -} diff --git a/06_js-debug/uebungen/u17-19_shop-vitest/src/index.css b/06_js-debug/uebungen/u17-19_shop-vitest/src/index.css deleted file mode 100644 index a483ad3..0000000 --- a/06_js-debug/uebungen/u17-19_shop-vitest/src/index.css +++ /dev/null @@ -1,798 +0,0 @@ -*, -*::before, -*::after { - box-sizing: border-box; -} - -*, -html, -body { - margin: 0; - padding: 0; - font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, - Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; - color: #0f172a; -} - -button { - background-color: transparent; - border: none; -} - -a { - text-decoration: none; - color: inherit; -} - -header { - position: relative; - width: 100%; -} - -footer { - border: 1px solid #e5e7eb; - border-top-width: 1px; - margin-top: 3.5rem /* 56px */; -} - -.screen-reader-text { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border-width: 0; -} - -.star-icons { - height: 1.25rem /* 20px */; - width: 1.25rem /* 20px */; - flex-shrink: 0; -} - -/* ===== Header Component ===== */ -.logo-text { - font-size: 1.25rem /* 20px */; - line-height: 1.75rem /* 28px */; - font-weight: 600; - color: #1f2937; -} - -.header-container { - position: relative; - display: flex; - align-items: center; - justify-content: space-between; - padding: 1.5rem 1rem; /* 24px 16px */ - max-width: 80rem; /* 1280px */ - margin: 0 auto; -} - -.mobile-header-wrapper { - display: block; -} - -.mobile-header-links-container { - display: flex; - justify-content: center; - gap: 1.5rem; /* 24px */ - padding-bottom: 1rem /* 16px */; -} - -.mobile-header-logo-link { - display: flex; - align-items: center; - justify-content: center; - gap: 1rem; /* 16px */ - width: 100%; -} - -.desktop-header-wrapper { - display: none; -} - -.desktop-header-logo-link { - display: flex; - align-items: center; - gap: 1rem; /* 16px */ -} - -.desktop-header-links-container { - position: absolute; - left: 50%; - transform: translateX(-50%); - display: flex; - gap: 1.5rem; /* 24px */ -} - -.header-link-text { - padding: 0.5rem /* 8px */; - color: #1f2937; -} - -.header-link-text:hover { - color: #4b5563; -} - -.header-border { - border-bottom-width: 2px; - width: 100%; - box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); - border-color: #f3f4f6; -} - -/* ===== Hero Component ===== */ -.hero-wrapper { - max-width: 42rem /* 672px */; - margin: 0 auto; - padding: 6rem 1rem; /* 96px 16px */ -} - -.hero-text-container { - text-align: center; -} - -.hero-title { - font-size: 2.25rem /* 36px */; - line-height: 2.5rem /* 40px */; - font-weight: 700; - letter-spacing: -0.025em; - color: #111827; -} - -.hero-subtitle { - margin-top: 2.5rem /* 40px */; - font-size: 1.125rem /* 18px */; - line-height: 2rem /* 32px */; - color: #4b5563; -} - -/* ===== CategorySection Component ===== */ -.category-section-wrapper { - margin: 0 auto; - max-width: 80rem /* 1280px */; - padding: 2.5rem 1rem; /* 40px 16px */ -} - -.category-section-title { - font-size: 1.5rem /* 24px */; - line-height: 2rem /* 32px */; - font-weight: 700; - letter-spacing: -0.025em; - color: #111827; -} - -.category-section-grid-wrapper { - margin-top: 1.5rem /* 24px */; - display: grid; - grid-template-columns: repeat(1, minmax(0, 1fr)); - row-gap: 1.5rem /* 24px */; -} - -.category-section-grid-main { - position: relative; - overflow: hidden; - border-radius: 0.5rem /* 8px */; - aspect-ratio: 1 / 2; - width: 100%; - height: 100%; - max-height: 250px; -} - -.category-section-grid-main:hover { - opacity: 0.85; -} - -.category-section-grid-main-img { - height: 100%; - width: 100%; - object-fit: cover; - object-position: top; - filter: grayscale(100%); -} - -.category-section-gradient-bg { - position: absolute; - bottom: 0; - z-index: 100; - height: 100%; - width: 100%; - background: linear-gradient(to bottom, transparent, black); - opacity: 0.5; -} - -.category-section-cta-container { - position: absolute; - z-index: 100; - bottom: 0; - display: flex; - align-items: flex-end; - padding: 1.5rem /* 24px */; -} - -.category-section-cta-title { - font-weight: 600; - color: white; -} - -.category-section-cta-span { - position: absolute; - inset: 0px; - z-index: 100; -} - -.category-section-cta { - margin-top: 0.25rem /* 4px */; - font-size: 0.875rem /* 14px */; - line-height: 1.25rem /* 20px */; - color: white; -} - -.category-section-categories-container { - position: relative; - aspect-ratio: 1 / 2; - overflow: hidden; - border-radius: 0.5rem /* 8px */; - height: 100%; - width: 100%; - max-height: 250px; -} - -.category-section-categories-container:hover { - opacity: 0.85; -} - -.category-section-categories-img { - height: 100%; - width: 100%; - object-fit: cover; - object-position: center; - filter: grayscale(100%); -} - -.category-section-categories-cta-container { - position: absolute; - z-index: 100; - bottom: 0; - display: flex; - align-items: flex-end; - padding: 1.5rem; /* 24px */ -} - -/* ===== Footer Component ===== */ -.footer-wrapper { - margin: 0 auto; - max-width: 80rem /* 1280px */; - padding: 3rem 1.5rem; /* 48px 24px */ -} - -.footer-links-container { - display: flex; - justify-content: center; - gap: 1.5rem; /* 24px */ -} - -.footer-links-text { - color: #9ca3af; -} - -.footer-links-text:hover { - color: #4b5563; -} - -.footer-copyright { - margin-top: 2rem /* 32px */; -} - -.footer-copyright-text { - text-align: center; - font-size: 0.75rem /* 12px */; - line-height: 1rem /* 16px */; - line-height: 1.25rem /* 20px */; - color: #6b7280; -} - -/* ===== ProductList Component ===== */ -.products-list { - margin: 0 -1px; - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); -} - -/* ===== ProductListCard Component ===== */ -.product-card-container { - position: relative; - padding: 1rem; -} - -.product-card-img-wrapper { - aspect-ratio: 1 / 1; - overflow: hidden; - border-radius: 0.5rem /* 8px */; - background-color: white; -} - -.product-card-container:hover .product-card-img-wrapper { - opacity: 0.75; -} - -.product-card-img { - height: 100%; - width: 100%; - object-fit: cover; - object-position: center; -} - -.product-card-info-box { - padding-bottom: 1rem /* 16px */; - padding-top: 2.5rem /* 40px */; - text-align: center; -} - -.product-card-name { - font-size: 0.875rem /* 14px */; - line-height: 1.25rem /* 20px */; - font-weight: 500; - color: #111827; -} - -.product-card-name-span { - position: absolute; - inset: 0px; -} - -.product-card-desc-box { - margin-top: 0.75rem /* 12px */; - display: flex; - flex-direction: column; - align-items: center; -} - -.product-card-ratings-wrapper { - display: flex; - align-items: center; -} - -.product-card-stock { - margin-top: 0.25rem /* 4px */; - font-size: 0.875rem /* 14px */; - line-height: 1.25rem /* 20px */; - color: #6b7280; -} - -.product-card-price { - margin-top: 1rem /* 16px */; - font-size: 1rem /* 16px */; - line-height: 1.5rem /* 24px */; - font-weight: 500; - color: #111827; -} - -/* ===== ImageGallery Component ===== */ -.image-gallery-wrapper { - display: flex; - flex-direction: column-reverse; -} - -.image-selector-wrapper { - margin-left: auto; - margin-right: auto; - margin-top: 1.5rem /* 24px */; - display: none; - width: 100%; - max-width: 42rem /* 672px */; -} - -.image-selector-container { - display: grid; - grid-template-columns: repeat(4, minmax(0, 1fr)); - gap: 1.5rem /* 24px */; -} - -.image-selector-btn { - position: relative; - display: flex; - height: 6rem /* 96px */; - cursor: pointer; - align-items: center; - justify-content: center; - border-radius: 0.375rem /* 6px */; - background-color: white; - font-size: 0.875rem /* 14px */; - line-height: 1.25rem /* 20px */; - font-weight: 500; - text-transform: uppercase; - color: #111827; -} - -.image-selector-btn:hover { - background-color: #f9fafb; -} - -.image-selector-img-wrapper { - position: absolute; - inset: 0px; - display: flex; - overflow: hidden; - border-radius: 0.375rem /* 6px */; -} - -.image-selector-img { - height: 100%; - width: 100%; - object-fit: cover; - object-position: center; -} - -.image-selector-main-img-wrapper { - aspect-ratio: 1 / 1; - width: 100%; -} - -.image-selector-main-img { - height: 100%; - width: 100%; - object-fit: cover; - object-position: center; -} - -/* ===== Category Page ===== */ -.category-page-wrapper { - padding: 3.5rem 0; /* 56px 0 */ -} - -.category-page-container { - margin: 0 auto; - max-width: 80rem /* 1280px */; - overflow: hidden; - padding: 0 1rem; /* 0 16px */ -} - -.category-page-header { - display: flex; - justify-content: space-between; - align-items: top; -} - -.category-page-header-title { - font-size: 1.5rem /* 24px */; - line-height: 2rem /* 32px */; - font-weight: 700; - letter-spacing: -0.025em; - color: #111827; - margin-bottom: 2rem /* 32px */; -} - -.category-page-select { - margin: 0.5rem 0; /* 8px 0 */ - display: block; - width: 11rem /* 176px */; - border: 1px solid #d1d5db; - border-radius: 0.375rem /* 6px */; - padding-top: 0.5rem /* 8px */; - padding-bottom: 0.5rem /* 8px */; - color: #0f172a; -} - -.category-page-select:focus { - border: 1px solid #1e293b; -} - -.category-page-products-wrapper { - margin-top: 2.5rem /* 40px */; -} - -/* ===== Single Product Page ===== */ -.back-button-wrapper { - margin: 0 auto; - max-width: 42rem /* 672px */; - padding-left: 1rem /* 16px */; - padding-right: 1rem /* 16px */; - padding-top: 2rem /* 32px */; -} - -.back-button { - display: flex; - align-items: center; - margin-bottom: 1rem /* 16px */; - font-weight: 500; - margin-top: 1.5rem /* 24px */; -} - -.back-button-icon { - height: 1.5rem /* 24px */; - width: 1.5rem /* 24px */; - stroke: #1e293b; -} - -.back-button-icon-span { - margin-left: 0.75rem /* 12px */; - font-size: 1rem /* 16px */; - line-height: 1.5rem /* 24px */; -} - -.product-page-wrapper { - margin: 0 auto; - max-width: 42rem /* 672px */; - padding: 2.5rem 1rem; /* 40px 16px */ -} - -.product-page-container { - display: block; -} - -.product-page-info-container { - margin-top: 2.5rem /* 40px */; - padding-left: 1rem /* 16px */; - padding-right: 1rem /* 16px */; -} - -.product-page-info-title { - font-size: 1.875rem /* 30px */; - line-height: 2.25rem /* 36px */; - font-weight: 700; - letter-spacing: -0.025em; - color: #111827; -} - -.product-page-mt-3 { - margin-top: 0.75rem /* 12px */; -} - -.product-page-mt-6 { - margin-top: 1.5rem /* 24px */; -} - -.product-page-text { - font-size: 0.875rem /* 14px */; - line-height: 1.25rem /* 20px */; - color: #6b7280; -} - -.product-page-info-price { - font-size: 1.875rem /* 30px */; - line-height: 2.25rem /* 36px */; - letter-spacing: -0.025em; - color: #111827; -} - -.product-page-info-rating-container { - display: flex; - align-items: center; -} - -.product-page-description { - font-size: 1rem /* 16px */; - line-height: 1.5rem /* 24px */; - line-height: 2; - color: #374151; -} - -.product-page-tags-container { - display: flex; - align-items: center; - gap: 0.5rem; /* 8px */ -} - -.product-page-tag { - font-size: 0.75rem /* 12px */; - line-height: 1rem /* 16px */; - font-weight: 500; - text-transform: uppercase; - padding: 0.25rem 0.5rem; - border-radius: 9999px; - background-color: #1e293b; - color: white; -} - -.product-page-reviews-wrapper { - margin-top: 3.5rem /* 56px */; -} - -.product-page-reviews-title { - font-size: 1.5rem /* 24px */; - line-height: 2rem /* 32px */; - font-weight: 500; - color: #111827; -} - -.product-page-reviews-container { - display: flex; - flex-direction: column; - gap: 1.25rem /* 20px */; - margin-top: 0.5rem /* 8px */; -} - -.product-page-ratings-box { - display: flex; - align-items: center; -} - -.product-page-reviews-text-box { - display: flex; - align-items: center; - gap: 1rem; /* 16px */ - margin-top: 0.5rem /* 8px */; -} - -.product-page-reviews-comment { - margin-top: 0.5rem /* 8px */; - font-size: 1.125rem /* 18px */; - line-height: 1.75rem /* 28px */; - color: #374151; -} - -/* ===== Breakpoints ===== */ -@media (min-width: 640px) { - .desktop-header-container { - padding: 1.5rem 2rem; /* 24px 32px */ - } - - .hero-wrapper { - padding: 6rem 2rem; /* 96px 32px */ - } - - .hero-title { - font-size: 3.75rem /* 60px */; - line-height: 1; - } - - .category-section-wrapper { - padding: 2.5rem 1.5rem; /* 40px 24px */ - } - - .category-section-grid-wrapper { - grid-template-columns: repeat(2, minmax(0, 1fr)); - grid-template-rows: repeat(2, minmax(0, 1fr)); - column-gap: 1.5rem /* 24px */; - grid-row: span 2 / span 2; - } - - .category-section-grid-main { - aspect-ratio: 1 / 1; - grid-row: span 2 / span 2; - max-height: 100%; - } - - .category-section-grid-main-img { - object-position: center; - } - - .category-section-categories-container { - position: relative; - max-height: 300px; - } - - .category-section-categories-img { - position: absolute; - inset: 0px; - height: 100%; - width: 100%; - } - - .category-section-categories-cta-container { - position: absolute; - inset: 0px; - } - - .category-page-container { - padding: 0 1.5rem; /* 0 24px */ - } - - .products-list { - margin: 0; - } - - .product-card-container { - padding: 1.5rem; - } - - .back-button-wrapper { - padding-left: 1.5rem /* 24px */; - padding-right: 1.5rem /* 24px */; - } - - .product-page-wrapper { - padding: 2.5rem 1.5rem; /* 40px 24px */ - } - - .image-selector-wrapper { - display: block; - } - - .image-selector-main-img { - border-radius: 0.5rem /* 8px */; - } - - .product-page-info-container { - margin-top: 4rem /* 64px */; - padding-left: 0px; - padding-right: 0px; - } -} - -@media (min-width: 768px) { - footer { - margin-top: 5rem; /* 80px */ - } - - .mobile-header-wrapper { - display: none; - } - - .desktop-header-wrapper { - display: block; - } - - .logo-text { - font-size: 1.5rem /* 24px */; - line-height: 2rem /* 32px */; - } - - .footer-wrapper { - display: flex; - align-items: center; - justify-content: space-between; - padding: 3rem 2rem; /* 48px 32px */ - } - - .footer-links-container { - order: 2; - } - - .footer-copyright { - order: 1; - margin-top: 0; - } - - .products-list { - grid-template-columns: repeat(3, minmax(0, 1fr)); - } -} - -@media (min-width: 1024px) { - footer { - margin-top: 6rem; /* 96px */ - } - - .category-section-wrapper { - padding: 2.5rem 2rem /* 40px 32px */; - } - - .category-page-container { - padding: 0 2rem; /* 0 32px */ - } - - .products-list { - grid-template-columns: repeat(4, minmax(0, 1fr)); - } - - .back-button-wrapper { - max-width: 80rem /* 1280px */; - padding-left: 2rem /* 32px */; - padding-right: 2rem /* 32px */; - } - - .product-page-wrapper { - padding: 2.5rem 2rem; /* 40px 32px */ - max-width: 80rem /* 1280px */; - } - - .product-page-container { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - align-items: center; - column-gap: 2rem /* 32px */; - } - - .image-selector-wrapper { - max-width: none; - } - - .product-page-info-container { - margin-top: 0px; - } -} diff --git a/06_js-debug/uebungen/u17-19_shop-vitest/src/lib/datatypes.ts b/06_js-debug/uebungen/u17-19_shop-vitest/src/lib/datatypes.ts deleted file mode 100644 index f0e5483..0000000 --- a/06_js-debug/uebungen/u17-19_shop-vitest/src/lib/datatypes.ts +++ /dev/null @@ -1,45 +0,0 @@ -export interface Product { - id: number; - title: string; - description: string; - category: string; - price: number; - discountPercentage: number; - rating: number; - stock: number; - tags: string[]; - brand: string; - sku: string; - weight: number; - dimensions: Dimensions; - warrantyInformation: string; - shippingInformation: string; - availabilityStatus: string; - reviews: Review[]; - returnPolicy: string; - minimumOrderQuantity: number; - meta: Meta; - images: string[]; - thumbnail: string; -} - -export interface Dimensions { - width: number; - height: number; - depth: number; -} - -export interface Review { - rating: number; - comment: string; - date: Date; - reviewerName: string; - reviewerEmail: string; -} - -export interface Meta { - createdAt: Date; - updatedAt: Date; - barcode: string; - qrCode: string; -} diff --git a/06_js-debug/uebungen/u17-19_shop-vitest/src/lib/helpers.ts b/06_js-debug/uebungen/u17-19_shop-vitest/src/lib/helpers.ts deleted file mode 100644 index 593e340..0000000 --- a/06_js-debug/uebungen/u17-19_shop-vitest/src/lib/helpers.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Product } from './datatypes'; - -export const fetchProductsByCategory = async ( - category: string -): Promise => { - try { - const response = await fetch( - `https://dummyjson.com/products/category/${category}` - ); - const data = await response.json(); - return data.products; - } catch (error) { - console.error(`Failed to fetch products for category ${category}:`, error); - return []; - } -}; diff --git a/06_js-debug/uebungen/u17-19_shop-vitest/src/main.tsx b/06_js-debug/uebungen/u17-19_shop-vitest/src/main.tsx deleted file mode 100644 index 0f17abc..0000000 --- a/06_js-debug/uebungen/u17-19_shop-vitest/src/main.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import React from 'react'; -import ReactDOM from 'react-dom/client'; -import './index.css'; - -import { createBrowserRouter, RouterProvider } from 'react-router-dom'; -import Homepage from './pages/root'; -import WomenProducts from './pages/women'; -import MenProducts from './pages/men'; -import AccessoryProducts from './pages/accessories'; -import ProductPage from './pages/product'; - -const router = createBrowserRouter([ - { - path: '/', - element: , - }, - { - path: '/women', - element: , - }, - { - path: '/men', - element: , - }, - { - path: '/accessories', - element: , - }, - { - path: '/products/:productId', - element: , - }, -]); - -ReactDOM.createRoot(document.getElementById('root')!).render( - - - , -); diff --git a/06_js-debug/uebungen/u17-19_shop-vitest/src/pages/accessories.tsx b/06_js-debug/uebungen/u17-19_shop-vitest/src/pages/accessories.tsx deleted file mode 100644 index d5e9033..0000000 --- a/06_js-debug/uebungen/u17-19_shop-vitest/src/pages/accessories.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import { useState, useEffect } from 'react'; - -import Header from '../components/Header'; -import ProductList from '../components/ProductList'; -import Footer from '../components/Footer'; - -import { Product } from '../lib/datatypes'; -import { fetchProductsByCategory } from '../lib/helpers'; - -export default function AccessoryProducts() { - const [products, setProducts] = useState([]); - const [selectedCategory, setSelectedCategory] = useState('all'); - - const categories = [ - 'all', - 'mobile-accessories', - 'sports-accessories', - 'kitchen-accessories', - ]; - - const fetchProducts = async () => { - try { - const fetchedProducts = - selectedCategory === 'all' - ? await Promise.all(categories.slice(1).map(fetchProductsByCategory)) - : await fetchProductsByCategory(selectedCategory); - - const allProducts = Array.isArray(fetchedProducts) - ? fetchedProducts.flat() - : fetchedProducts; - - setProducts(allProducts); - } catch (error) { - console.error('Failed to fetch products:', error); - } - }; - - useEffect(() => { - fetchProducts(); - }, [selectedCategory]); - - return ( -
      -
      - -
      -
      -
      -

      - Accessories -

      - -
      - - -
      -
      - -
      - {products && } -
      -
      -
      - -
      -
      - ); -} diff --git a/06_js-debug/uebungen/u17-19_shop-vitest/src/pages/men.tsx b/06_js-debug/uebungen/u17-19_shop-vitest/src/pages/men.tsx deleted file mode 100644 index 710cc0b..0000000 --- a/06_js-debug/uebungen/u17-19_shop-vitest/src/pages/men.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import { useState, useEffect } from 'react'; - -import Header from '../components/Header'; -import ProductList from '../components/ProductList'; -import Footer from '../components/Footer'; - -import { Product } from '../lib/datatypes'; -import { fetchProductsByCategory } from '../lib/helpers'; - -export default function MenProducts() { - const [products, setProducts] = useState([]); - const [selectedCategory, setSelectedCategory] = useState('all'); - - const categories = ['all', 'mens-shirts', 'mens-shoes', 'mens-watches']; - - const fetchProducts = async () => { - try { - const fetchedProducts = - selectedCategory === 'all' - ? await Promise.all(categories.slice(1).map(fetchProductsByCategory)) - : await fetchProductsByCategory(selectedCategory); - - const allProducts = Array.isArray(fetchedProducts) - ? fetchedProducts.flat() - : fetchedProducts; - - setProducts(allProducts); - } catch (error) { - console.error('Failed to fetch products:', error); - } - }; - - useEffect(() => { - fetchProducts(); - }, [selectedCategory]); - - return ( -
      -
      - -
      -
      -
      -

      - Men Products -

      - -
      - - -
      -
      - -
      - {products && } -
      -
      -
      - -
      -
      - ); -} diff --git a/06_js-debug/uebungen/u17-19_shop-vitest/src/pages/product.tsx b/06_js-debug/uebungen/u17-19_shop-vitest/src/pages/product.tsx deleted file mode 100644 index d90186f..0000000 --- a/06_js-debug/uebungen/u17-19_shop-vitest/src/pages/product.tsx +++ /dev/null @@ -1,188 +0,0 @@ -import { useState, useEffect } from 'react'; -import { Product, Review } from '../lib/datatypes'; - -import { useParams, useNavigate } from 'react-router-dom'; - -import Header from '../components/Header'; -import ImageGallery from '../components/ImageGallery'; -import Footer from '../components/Footer'; - -const ProductPage = () => { - const { productId } = useParams<{ productId: string }>(); - const [product, setProduct] = useState(null); - - const fetchProduct = async () => { - try { - const productRes = await fetch(`https://dummyjson.com/products/${productId}`); - const productData = await productRes.json(); - setProduct(productData); - } catch (error) { - console.error('Failed to fetch products:', error); - } - }; - - useEffect(() => { - fetchProduct(); - }, [productId]); - - if (!product) { - return null; - } - - return ( -
      -
      - -
      - - -
      -
      - - - {/* Product info */} -
      -

      {product.title}

      - -
      -

      Product information

      - -

      - {Number(product.price).toLocaleString('en-US', { - style: 'currency', - currency: 'USD', - })} -

      - - {/* Rating */} -
      -

      Rating

      - -
      -
      - {[0, 1, 2, 3, 4].map((rating) => ( - rating ? '#1e293b' : '#e5e7eb', - }} - aria-hidden="true" - /> - ))} -
      -

      {product.rating} out of 5 stars

      -
      -
      - - {/* Availability */} -
      -

      {product.stock} in stock

      -
      - - {/* Description */} -
      -

      Description

      - -

      {product.description}

      -
      - - {/* Tags */} -
      -

      Tags

      -
      - {product.tags.map((tag) => ( - - {tag} - - ))} -
      -
      -
      -
      - - -
      -
      -
      - -
      -
      - ); -}; - -export default ProductPage; - -function BackButton() { - const navigate = useNavigate(); - - return ( -
      - -
      - ); -} - -function Reviews({ reviews }: { reviews: Review[] }) { - return ( -
      -

      Reviews

      - -
      - {reviews.map((review, index) => ( -
      -
      - {[0, 1, 2, 3, 4].map((rating) => ( - rating ? '#1e293b' : '#e5e7eb', - }} - aria-hidden="true" - /> - ))} -
      - -
      -

      {review.reviewerName}

      - -

      {new Date(review.date).toLocaleDateString()}

      -
      - -

      {review.comment}

      -
      - ))} -
      -
      - ); -} - -function ChevronRightIcon(props: React.SVGProps) { - return ( - - - - ); -} - -function StarIcon(props: React.SVGProps) { - return ( - - - - ); -} diff --git a/06_js-debug/uebungen/u17-19_shop-vitest/src/pages/root.tsx b/06_js-debug/uebungen/u17-19_shop-vitest/src/pages/root.tsx deleted file mode 100644 index cf40e02..0000000 --- a/06_js-debug/uebungen/u17-19_shop-vitest/src/pages/root.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import Header from '../components/Header'; -import Hero from '../components/Hero'; -import CategorySection from '../components/CategorySection'; -import Footer from '../components/Footer'; - -const categories = [ - { - imgSrc: - 'https://images.unsplash.com/photo-1530011940847-04cba36df39f?q=80&w=1920', - imgAlt: - 'Two female models sitting on a bed. Photo by Billie (@billiebodybrand) on Unsplash.', - href: '/women', - linkText: 'Women Clothing', - }, - { - imgSrc: - 'https://images.unsplash.com/photo-1595909315417-2edd382a56dc?q=80&w=1920', - imgAlt: - 'Jumping rope, smartphone, sports bra, a pair of sneakers, and a water bottle. Photo by erica steeves on Unsplash.', - href: '/accessories', - linkText: 'Accessories', - }, - { - imgSrc: - 'https://images.unsplash.com/photo-1467779009031-53938b78ca38?q=80&w=1920', - imgAlt: 'Group of men sitting in a van. Photo by Luke Porter on Unsplash.', - href: '/men', - linkText: 'Men Clothing', - }, -]; - -export default function Root() { - return ( - <> -
      -
      - - -
      -
      ...\n trEl.dataset.position = String(position); // ...\n\n DOM.tBody.appendChild(trEl); // Im DOM hinzufügen\n };\n\n const showModalEdit = (product: Product) => {\n const { name = '', price = 0, _id: id, position } = product;\n\n DOM.inputEditName.value = name;\n DOM.inputEditPrice.value = String(price);\n\n DOM.inputEditId.value = String(id);\n DOM.inputEditPosition.value = String(position);\n };\n\n const resetFields = () => {\n DOM.btnAdd.disabled = true;\n DOM.inputPrice.value = '';\n DOM.inputName.value = '';\n\n DOM.formEdit.reset();\n };\n\n const disableNonFunctionalButtons = () => {\n Array.from(DOM.tBody.querySelectorAll('tr')).forEach((tr) => {\n const btnMoveUp = querySelectorTyped('.button-product-move-up', tr);\n const btnMoveDown = querySelectorTyped('.button-product-move-down', tr);\n\n btnMoveUp.disabled = !tr.previousElementSibling;\n btnMoveDown.disabled = !tr.nextElementSibling;\n });\n };\n\n init();\n\n return {\n init,\n initProducts,\n resetFields,\n };\n};\n\n// Freigabe für import\nexport default ProductManager;\n","function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n/*!\n * Splide.js\n * Version : 4.1.4\n * License : MIT\n * Copyright: 2022 Naotoshi Fujita\n */\nvar MEDIA_PREFERS_REDUCED_MOTION = \"(prefers-reduced-motion: reduce)\";\nvar CREATED = 1;\nvar MOUNTED = 2;\nvar IDLE = 3;\nvar MOVING = 4;\nvar SCROLLING = 5;\nvar DRAGGING = 6;\nvar DESTROYED = 7;\nvar STATES = {\n CREATED: CREATED,\n MOUNTED: MOUNTED,\n IDLE: IDLE,\n MOVING: MOVING,\n SCROLLING: SCROLLING,\n DRAGGING: DRAGGING,\n DESTROYED: DESTROYED\n};\n\nfunction empty(array) {\n array.length = 0;\n}\n\nfunction slice(arrayLike, start, end) {\n return Array.prototype.slice.call(arrayLike, start, end);\n}\n\nfunction apply(func) {\n return func.bind.apply(func, [null].concat(slice(arguments, 1)));\n}\n\nvar nextTick = setTimeout;\n\nvar noop = function noop() {};\n\nfunction raf(func) {\n return requestAnimationFrame(func);\n}\n\nfunction typeOf(type, subject) {\n return typeof subject === type;\n}\n\nfunction isObject(subject) {\n return !isNull(subject) && typeOf(\"object\", subject);\n}\n\nvar isArray = Array.isArray;\nvar isFunction = apply(typeOf, \"function\");\nvar isString = apply(typeOf, \"string\");\nvar isUndefined = apply(typeOf, \"undefined\");\n\nfunction isNull(subject) {\n return subject === null;\n}\n\nfunction isHTMLElement(subject) {\n try {\n return subject instanceof (subject.ownerDocument.defaultView || window).HTMLElement;\n } catch (e) {\n return false;\n }\n}\n\nfunction toArray(value) {\n return isArray(value) ? value : [value];\n}\n\nfunction forEach(values, iteratee) {\n toArray(values).forEach(iteratee);\n}\n\nfunction includes(array, value) {\n return array.indexOf(value) > -1;\n}\n\nfunction push(array, items) {\n array.push.apply(array, toArray(items));\n return array;\n}\n\nfunction toggleClass(elm, classes, add) {\n if (elm) {\n forEach(classes, function (name) {\n if (name) {\n elm.classList[add ? \"add\" : \"remove\"](name);\n }\n });\n }\n}\n\nfunction addClass(elm, classes) {\n toggleClass(elm, isString(classes) ? classes.split(\" \") : classes, true);\n}\n\nfunction append(parent, children) {\n forEach(children, parent.appendChild.bind(parent));\n}\n\nfunction before(nodes, ref) {\n forEach(nodes, function (node) {\n var parent = (ref || node).parentNode;\n\n if (parent) {\n parent.insertBefore(node, ref);\n }\n });\n}\n\nfunction matches(elm, selector) {\n return isHTMLElement(elm) && (elm[\"msMatchesSelector\"] || elm.matches).call(elm, selector);\n}\n\nfunction children(parent, selector) {\n var children2 = parent ? slice(parent.children) : [];\n return selector ? children2.filter(function (child) {\n return matches(child, selector);\n }) : children2;\n}\n\nfunction child(parent, selector) {\n return selector ? children(parent, selector)[0] : parent.firstElementChild;\n}\n\nvar ownKeys = Object.keys;\n\nfunction forOwn(object, iteratee, right) {\n if (object) {\n (right ? ownKeys(object).reverse() : ownKeys(object)).forEach(function (key) {\n key !== \"__proto__\" && iteratee(object[key], key);\n });\n }\n\n return object;\n}\n\nfunction assign(object) {\n slice(arguments, 1).forEach(function (source) {\n forOwn(source, function (value, key) {\n object[key] = source[key];\n });\n });\n return object;\n}\n\nfunction merge(object) {\n slice(arguments, 1).forEach(function (source) {\n forOwn(source, function (value, key) {\n if (isArray(value)) {\n object[key] = value.slice();\n } else if (isObject(value)) {\n object[key] = merge({}, isObject(object[key]) ? object[key] : {}, value);\n } else {\n object[key] = value;\n }\n });\n });\n return object;\n}\n\nfunction omit(object, keys) {\n forEach(keys || ownKeys(object), function (key) {\n delete object[key];\n });\n}\n\nfunction removeAttribute(elms, attrs) {\n forEach(elms, function (elm) {\n forEach(attrs, function (attr) {\n elm && elm.removeAttribute(attr);\n });\n });\n}\n\nfunction setAttribute(elms, attrs, value) {\n if (isObject(attrs)) {\n forOwn(attrs, function (value2, name) {\n setAttribute(elms, name, value2);\n });\n } else {\n forEach(elms, function (elm) {\n isNull(value) || value === \"\" ? removeAttribute(elm, attrs) : elm.setAttribute(attrs, String(value));\n });\n }\n}\n\nfunction create(tag, attrs, parent) {\n var elm = document.createElement(tag);\n\n if (attrs) {\n isString(attrs) ? addClass(elm, attrs) : setAttribute(elm, attrs);\n }\n\n parent && append(parent, elm);\n return elm;\n}\n\nfunction style(elm, prop, value) {\n if (isUndefined(value)) {\n return getComputedStyle(elm)[prop];\n }\n\n if (!isNull(value)) {\n elm.style[prop] = \"\" + value;\n }\n}\n\nfunction display(elm, display2) {\n style(elm, \"display\", display2);\n}\n\nfunction focus(elm) {\n elm[\"setActive\"] && elm[\"setActive\"]() || elm.focus({\n preventScroll: true\n });\n}\n\nfunction getAttribute(elm, attr) {\n return elm.getAttribute(attr);\n}\n\nfunction hasClass(elm, className) {\n return elm && elm.classList.contains(className);\n}\n\nfunction rect(target) {\n return target.getBoundingClientRect();\n}\n\nfunction remove(nodes) {\n forEach(nodes, function (node) {\n if (node && node.parentNode) {\n node.parentNode.removeChild(node);\n }\n });\n}\n\nfunction parseHtml(html) {\n return child(new DOMParser().parseFromString(html, \"text/html\").body);\n}\n\nfunction prevent(e, stopPropagation) {\n e.preventDefault();\n\n if (stopPropagation) {\n e.stopPropagation();\n e.stopImmediatePropagation();\n }\n}\n\nfunction query(parent, selector) {\n return parent && parent.querySelector(selector);\n}\n\nfunction queryAll(parent, selector) {\n return selector ? slice(parent.querySelectorAll(selector)) : [];\n}\n\nfunction removeClass(elm, classes) {\n toggleClass(elm, classes, false);\n}\n\nfunction timeOf(e) {\n return e.timeStamp;\n}\n\nfunction unit(value) {\n return isString(value) ? value : value ? value + \"px\" : \"\";\n}\n\nvar PROJECT_CODE = \"splide\";\nvar DATA_ATTRIBUTE = \"data-\" + PROJECT_CODE;\n\nfunction assert(condition, message) {\n if (!condition) {\n throw new Error(\"[\" + PROJECT_CODE + \"] \" + (message || \"\"));\n }\n}\n\nvar min = Math.min,\n max = Math.max,\n floor = Math.floor,\n ceil = Math.ceil,\n abs = Math.abs;\n\nfunction approximatelyEqual(x, y, epsilon) {\n return abs(x - y) < epsilon;\n}\n\nfunction between(number, x, y, exclusive) {\n var minimum = min(x, y);\n var maximum = max(x, y);\n return exclusive ? minimum < number && number < maximum : minimum <= number && number <= maximum;\n}\n\nfunction clamp(number, x, y) {\n var minimum = min(x, y);\n var maximum = max(x, y);\n return min(max(minimum, number), maximum);\n}\n\nfunction sign(x) {\n return +(x > 0) - +(x < 0);\n}\n\nfunction camelToKebab(string) {\n return string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n}\n\nfunction format(string, replacements) {\n forEach(replacements, function (replacement) {\n string = string.replace(\"%s\", \"\" + replacement);\n });\n return string;\n}\n\nfunction pad(number) {\n return number < 10 ? \"0\" + number : \"\" + number;\n}\n\nvar ids = {};\n\nfunction uniqueId(prefix) {\n return \"\" + prefix + pad(ids[prefix] = (ids[prefix] || 0) + 1);\n}\n\nfunction EventBinder() {\n var listeners = [];\n\n function bind(targets, events, callback, options) {\n forEachEvent(targets, events, function (target, event, namespace) {\n var isEventTarget = (\"addEventListener\" in target);\n var remover = isEventTarget ? target.removeEventListener.bind(target, event, callback, options) : target[\"removeListener\"].bind(target, callback);\n isEventTarget ? target.addEventListener(event, callback, options) : target[\"addListener\"](callback);\n listeners.push([target, event, namespace, callback, remover]);\n });\n }\n\n function unbind(targets, events, callback) {\n forEachEvent(targets, events, function (target, event, namespace) {\n listeners = listeners.filter(function (listener) {\n if (listener[0] === target && listener[1] === event && listener[2] === namespace && (!callback || listener[3] === callback)) {\n listener[4]();\n return false;\n }\n\n return true;\n });\n });\n }\n\n function dispatch(target, type, detail) {\n var e;\n var bubbles = true;\n\n if (typeof CustomEvent === \"function\") {\n e = new CustomEvent(type, {\n bubbles: bubbles,\n detail: detail\n });\n } else {\n e = document.createEvent(\"CustomEvent\");\n e.initCustomEvent(type, bubbles, false, detail);\n }\n\n target.dispatchEvent(e);\n return e;\n }\n\n function forEachEvent(targets, events, iteratee) {\n forEach(targets, function (target) {\n target && forEach(events, function (events2) {\n events2.split(\" \").forEach(function (eventNS) {\n var fragment = eventNS.split(\".\");\n iteratee(target, fragment[0], fragment[1]);\n });\n });\n });\n }\n\n function destroy() {\n listeners.forEach(function (data) {\n data[4]();\n });\n empty(listeners);\n }\n\n return {\n bind: bind,\n unbind: unbind,\n dispatch: dispatch,\n destroy: destroy\n };\n}\n\nvar EVENT_MOUNTED = \"mounted\";\nvar EVENT_READY = \"ready\";\nvar EVENT_MOVE = \"move\";\nvar EVENT_MOVED = \"moved\";\nvar EVENT_CLICK = \"click\";\nvar EVENT_ACTIVE = \"active\";\nvar EVENT_INACTIVE = \"inactive\";\nvar EVENT_VISIBLE = \"visible\";\nvar EVENT_HIDDEN = \"hidden\";\nvar EVENT_REFRESH = \"refresh\";\nvar EVENT_UPDATED = \"updated\";\nvar EVENT_RESIZE = \"resize\";\nvar EVENT_RESIZED = \"resized\";\nvar EVENT_DRAG = \"drag\";\nvar EVENT_DRAGGING = \"dragging\";\nvar EVENT_DRAGGED = \"dragged\";\nvar EVENT_SCROLL = \"scroll\";\nvar EVENT_SCROLLED = \"scrolled\";\nvar EVENT_OVERFLOW = \"overflow\";\nvar EVENT_DESTROY = \"destroy\";\nvar EVENT_ARROWS_MOUNTED = \"arrows:mounted\";\nvar EVENT_ARROWS_UPDATED = \"arrows:updated\";\nvar EVENT_PAGINATION_MOUNTED = \"pagination:mounted\";\nvar EVENT_PAGINATION_UPDATED = \"pagination:updated\";\nvar EVENT_NAVIGATION_MOUNTED = \"navigation:mounted\";\nvar EVENT_AUTOPLAY_PLAY = \"autoplay:play\";\nvar EVENT_AUTOPLAY_PLAYING = \"autoplay:playing\";\nvar EVENT_AUTOPLAY_PAUSE = \"autoplay:pause\";\nvar EVENT_LAZYLOAD_LOADED = \"lazyload:loaded\";\nvar EVENT_SLIDE_KEYDOWN = \"sk\";\nvar EVENT_SHIFTED = \"sh\";\nvar EVENT_END_INDEX_CHANGED = \"ei\";\n\nfunction EventInterface(Splide2) {\n var bus = Splide2 ? Splide2.event.bus : document.createDocumentFragment();\n var binder = EventBinder();\n\n function on(events, callback) {\n binder.bind(bus, toArray(events).join(\" \"), function (e) {\n callback.apply(callback, isArray(e.detail) ? e.detail : []);\n });\n }\n\n function emit(event) {\n binder.dispatch(bus, event, slice(arguments, 1));\n }\n\n if (Splide2) {\n Splide2.event.on(EVENT_DESTROY, binder.destroy);\n }\n\n return assign(binder, {\n bus: bus,\n on: on,\n off: apply(binder.unbind, bus),\n emit: emit\n });\n}\n\nfunction RequestInterval(interval, onInterval, onUpdate, limit) {\n var now = Date.now;\n var startTime;\n var rate = 0;\n var id;\n var paused = true;\n var count = 0;\n\n function update() {\n if (!paused) {\n rate = interval ? min((now() - startTime) / interval, 1) : 1;\n onUpdate && onUpdate(rate);\n\n if (rate >= 1) {\n onInterval();\n startTime = now();\n\n if (limit && ++count >= limit) {\n return pause();\n }\n }\n\n id = raf(update);\n }\n }\n\n function start(resume) {\n resume || cancel();\n startTime = now() - (resume ? rate * interval : 0);\n paused = false;\n id = raf(update);\n }\n\n function pause() {\n paused = true;\n }\n\n function rewind() {\n startTime = now();\n rate = 0;\n\n if (onUpdate) {\n onUpdate(rate);\n }\n }\n\n function cancel() {\n id && cancelAnimationFrame(id);\n rate = 0;\n id = 0;\n paused = true;\n }\n\n function set(time) {\n interval = time;\n }\n\n function isPaused() {\n return paused;\n }\n\n return {\n start: start,\n rewind: rewind,\n pause: pause,\n cancel: cancel,\n set: set,\n isPaused: isPaused\n };\n}\n\nfunction State(initialState) {\n var state = initialState;\n\n function set(value) {\n state = value;\n }\n\n function is(states) {\n return includes(toArray(states), state);\n }\n\n return {\n set: set,\n is: is\n };\n}\n\nfunction Throttle(func, duration) {\n var interval = RequestInterval(duration || 0, func, null, 1);\n return function () {\n interval.isPaused() && interval.start();\n };\n}\n\nfunction Media(Splide2, Components2, options) {\n var state = Splide2.state;\n var breakpoints = options.breakpoints || {};\n var reducedMotion = options.reducedMotion || {};\n var binder = EventBinder();\n var queries = [];\n\n function setup() {\n var isMin = options.mediaQuery === \"min\";\n ownKeys(breakpoints).sort(function (n, m) {\n return isMin ? +n - +m : +m - +n;\n }).forEach(function (key) {\n register(breakpoints[key], \"(\" + (isMin ? \"min\" : \"max\") + \"-width:\" + key + \"px)\");\n });\n register(reducedMotion, MEDIA_PREFERS_REDUCED_MOTION);\n update();\n }\n\n function destroy(completely) {\n if (completely) {\n binder.destroy();\n }\n }\n\n function register(options2, query) {\n var queryList = matchMedia(query);\n binder.bind(queryList, \"change\", update);\n queries.push([options2, queryList]);\n }\n\n function update() {\n var destroyed = state.is(DESTROYED);\n var direction = options.direction;\n var merged = queries.reduce(function (merged2, entry) {\n return merge(merged2, entry[1].matches ? entry[0] : {});\n }, {});\n omit(options);\n set(merged);\n\n if (options.destroy) {\n Splide2.destroy(options.destroy === \"completely\");\n } else if (destroyed) {\n destroy(true);\n Splide2.mount();\n } else {\n direction !== options.direction && Splide2.refresh();\n }\n }\n\n function reduce(enable) {\n if (matchMedia(MEDIA_PREFERS_REDUCED_MOTION).matches) {\n enable ? merge(options, reducedMotion) : omit(options, ownKeys(reducedMotion));\n }\n }\n\n function set(opts, base, notify) {\n merge(options, opts);\n base && merge(Object.getPrototypeOf(options), opts);\n\n if (notify || !state.is(CREATED)) {\n Splide2.emit(EVENT_UPDATED, options);\n }\n }\n\n return {\n setup: setup,\n destroy: destroy,\n reduce: reduce,\n set: set\n };\n}\n\nvar ARROW = \"Arrow\";\nvar ARROW_LEFT = ARROW + \"Left\";\nvar ARROW_RIGHT = ARROW + \"Right\";\nvar ARROW_UP = ARROW + \"Up\";\nvar ARROW_DOWN = ARROW + \"Down\";\nvar LTR = \"ltr\";\nvar RTL = \"rtl\";\nvar TTB = \"ttb\";\nvar ORIENTATION_MAP = {\n width: [\"height\"],\n left: [\"top\", \"right\"],\n right: [\"bottom\", \"left\"],\n x: [\"y\"],\n X: [\"Y\"],\n Y: [\"X\"],\n ArrowLeft: [ARROW_UP, ARROW_RIGHT],\n ArrowRight: [ARROW_DOWN, ARROW_LEFT]\n};\n\nfunction Direction(Splide2, Components2, options) {\n function resolve(prop, axisOnly, direction) {\n direction = direction || options.direction;\n var index = direction === RTL && !axisOnly ? 1 : direction === TTB ? 0 : -1;\n return ORIENTATION_MAP[prop] && ORIENTATION_MAP[prop][index] || prop.replace(/width|left|right/i, function (match, offset) {\n var replacement = ORIENTATION_MAP[match.toLowerCase()][index] || match;\n return offset > 0 ? replacement.charAt(0).toUpperCase() + replacement.slice(1) : replacement;\n });\n }\n\n function orient(value) {\n return value * (options.direction === RTL ? 1 : -1);\n }\n\n return {\n resolve: resolve,\n orient: orient\n };\n}\n\nvar ROLE = \"role\";\nvar TAB_INDEX = \"tabindex\";\nvar DISABLED = \"disabled\";\nvar ARIA_PREFIX = \"aria-\";\nvar ARIA_CONTROLS = ARIA_PREFIX + \"controls\";\nvar ARIA_CURRENT = ARIA_PREFIX + \"current\";\nvar ARIA_SELECTED = ARIA_PREFIX + \"selected\";\nvar ARIA_LABEL = ARIA_PREFIX + \"label\";\nvar ARIA_LABELLEDBY = ARIA_PREFIX + \"labelledby\";\nvar ARIA_HIDDEN = ARIA_PREFIX + \"hidden\";\nvar ARIA_ORIENTATION = ARIA_PREFIX + \"orientation\";\nvar ARIA_ROLEDESCRIPTION = ARIA_PREFIX + \"roledescription\";\nvar ARIA_LIVE = ARIA_PREFIX + \"live\";\nvar ARIA_BUSY = ARIA_PREFIX + \"busy\";\nvar ARIA_ATOMIC = ARIA_PREFIX + \"atomic\";\nvar ALL_ATTRIBUTES = [ROLE, TAB_INDEX, DISABLED, ARIA_CONTROLS, ARIA_CURRENT, ARIA_LABEL, ARIA_LABELLEDBY, ARIA_HIDDEN, ARIA_ORIENTATION, ARIA_ROLEDESCRIPTION];\nvar CLASS_PREFIX = PROJECT_CODE + \"__\";\nvar STATUS_CLASS_PREFIX = \"is-\";\nvar CLASS_ROOT = PROJECT_CODE;\nvar CLASS_TRACK = CLASS_PREFIX + \"track\";\nvar CLASS_LIST = CLASS_PREFIX + \"list\";\nvar CLASS_SLIDE = CLASS_PREFIX + \"slide\";\nvar CLASS_CLONE = CLASS_SLIDE + \"--clone\";\nvar CLASS_CONTAINER = CLASS_SLIDE + \"__container\";\nvar CLASS_ARROWS = CLASS_PREFIX + \"arrows\";\nvar CLASS_ARROW = CLASS_PREFIX + \"arrow\";\nvar CLASS_ARROW_PREV = CLASS_ARROW + \"--prev\";\nvar CLASS_ARROW_NEXT = CLASS_ARROW + \"--next\";\nvar CLASS_PAGINATION = CLASS_PREFIX + \"pagination\";\nvar CLASS_PAGINATION_PAGE = CLASS_PAGINATION + \"__page\";\nvar CLASS_PROGRESS = CLASS_PREFIX + \"progress\";\nvar CLASS_PROGRESS_BAR = CLASS_PROGRESS + \"__bar\";\nvar CLASS_TOGGLE = CLASS_PREFIX + \"toggle\";\nvar CLASS_TOGGLE_PLAY = CLASS_TOGGLE + \"__play\";\nvar CLASS_TOGGLE_PAUSE = CLASS_TOGGLE + \"__pause\";\nvar CLASS_SPINNER = CLASS_PREFIX + \"spinner\";\nvar CLASS_SR = CLASS_PREFIX + \"sr\";\nvar CLASS_INITIALIZED = STATUS_CLASS_PREFIX + \"initialized\";\nvar CLASS_ACTIVE = STATUS_CLASS_PREFIX + \"active\";\nvar CLASS_PREV = STATUS_CLASS_PREFIX + \"prev\";\nvar CLASS_NEXT = STATUS_CLASS_PREFIX + \"next\";\nvar CLASS_VISIBLE = STATUS_CLASS_PREFIX + \"visible\";\nvar CLASS_LOADING = STATUS_CLASS_PREFIX + \"loading\";\nvar CLASS_FOCUS_IN = STATUS_CLASS_PREFIX + \"focus-in\";\nvar CLASS_OVERFLOW = STATUS_CLASS_PREFIX + \"overflow\";\nvar STATUS_CLASSES = [CLASS_ACTIVE, CLASS_VISIBLE, CLASS_PREV, CLASS_NEXT, CLASS_LOADING, CLASS_FOCUS_IN, CLASS_OVERFLOW];\nvar CLASSES = {\n slide: CLASS_SLIDE,\n clone: CLASS_CLONE,\n arrows: CLASS_ARROWS,\n arrow: CLASS_ARROW,\n prev: CLASS_ARROW_PREV,\n next: CLASS_ARROW_NEXT,\n pagination: CLASS_PAGINATION,\n page: CLASS_PAGINATION_PAGE,\n spinner: CLASS_SPINNER\n};\n\nfunction closest(from, selector) {\n if (isFunction(from.closest)) {\n return from.closest(selector);\n }\n\n var elm = from;\n\n while (elm && elm.nodeType === 1) {\n if (matches(elm, selector)) {\n break;\n }\n\n elm = elm.parentElement;\n }\n\n return elm;\n}\n\nvar FRICTION = 5;\nvar LOG_INTERVAL = 200;\nvar POINTER_DOWN_EVENTS = \"touchstart mousedown\";\nvar POINTER_MOVE_EVENTS = \"touchmove mousemove\";\nvar POINTER_UP_EVENTS = \"touchend touchcancel mouseup click\";\n\nfunction Elements(Splide2, Components2, options) {\n var _EventInterface = EventInterface(Splide2),\n on = _EventInterface.on,\n bind = _EventInterface.bind;\n\n var root = Splide2.root;\n var i18n = options.i18n;\n var elements = {};\n var slides = [];\n var rootClasses = [];\n var trackClasses = [];\n var track;\n var list;\n var isUsingKey;\n\n function setup() {\n collect();\n init();\n update();\n }\n\n function mount() {\n on(EVENT_REFRESH, destroy);\n on(EVENT_REFRESH, setup);\n on(EVENT_UPDATED, update);\n bind(document, POINTER_DOWN_EVENTS + \" keydown\", function (e) {\n isUsingKey = e.type === \"keydown\";\n }, {\n capture: true\n });\n bind(root, \"focusin\", function () {\n toggleClass(root, CLASS_FOCUS_IN, !!isUsingKey);\n });\n }\n\n function destroy(completely) {\n var attrs = ALL_ATTRIBUTES.concat(\"style\");\n empty(slides);\n removeClass(root, rootClasses);\n removeClass(track, trackClasses);\n removeAttribute([track, list], attrs);\n removeAttribute(root, completely ? attrs : [\"style\", ARIA_ROLEDESCRIPTION]);\n }\n\n function update() {\n removeClass(root, rootClasses);\n removeClass(track, trackClasses);\n rootClasses = getClasses(CLASS_ROOT);\n trackClasses = getClasses(CLASS_TRACK);\n addClass(root, rootClasses);\n addClass(track, trackClasses);\n setAttribute(root, ARIA_LABEL, options.label);\n setAttribute(root, ARIA_LABELLEDBY, options.labelledby);\n }\n\n function collect() {\n track = find(\".\" + CLASS_TRACK);\n list = child(track, \".\" + CLASS_LIST);\n assert(track && list, \"A track/list element is missing.\");\n push(slides, children(list, \".\" + CLASS_SLIDE + \":not(.\" + CLASS_CLONE + \")\"));\n forOwn({\n arrows: CLASS_ARROWS,\n pagination: CLASS_PAGINATION,\n prev: CLASS_ARROW_PREV,\n next: CLASS_ARROW_NEXT,\n bar: CLASS_PROGRESS_BAR,\n toggle: CLASS_TOGGLE\n }, function (className, key) {\n elements[key] = find(\".\" + className);\n });\n assign(elements, {\n root: root,\n track: track,\n list: list,\n slides: slides\n });\n }\n\n function init() {\n var id = root.id || uniqueId(PROJECT_CODE);\n var role = options.role;\n root.id = id;\n track.id = track.id || id + \"-track\";\n list.id = list.id || id + \"-list\";\n\n if (!getAttribute(root, ROLE) && root.tagName !== \"SECTION\" && role) {\n setAttribute(root, ROLE, role);\n }\n\n setAttribute(root, ARIA_ROLEDESCRIPTION, i18n.carousel);\n setAttribute(list, ROLE, \"presentation\");\n }\n\n function find(selector) {\n var elm = query(root, selector);\n return elm && closest(elm, \".\" + CLASS_ROOT) === root ? elm : void 0;\n }\n\n function getClasses(base) {\n return [base + \"--\" + options.type, base + \"--\" + options.direction, options.drag && base + \"--draggable\", options.isNavigation && base + \"--nav\", base === CLASS_ROOT && CLASS_ACTIVE];\n }\n\n return assign(elements, {\n setup: setup,\n mount: mount,\n destroy: destroy\n });\n}\n\nvar SLIDE = \"slide\";\nvar LOOP = \"loop\";\nvar FADE = \"fade\";\n\nfunction Slide$1(Splide2, index, slideIndex, slide) {\n var event = EventInterface(Splide2);\n var on = event.on,\n emit = event.emit,\n bind = event.bind;\n var Components = Splide2.Components,\n root = Splide2.root,\n options = Splide2.options;\n var isNavigation = options.isNavigation,\n updateOnMove = options.updateOnMove,\n i18n = options.i18n,\n pagination = options.pagination,\n slideFocus = options.slideFocus;\n var resolve = Components.Direction.resolve;\n var styles = getAttribute(slide, \"style\");\n var label = getAttribute(slide, ARIA_LABEL);\n var isClone = slideIndex > -1;\n var container = child(slide, \".\" + CLASS_CONTAINER);\n var destroyed;\n\n function mount() {\n if (!isClone) {\n slide.id = root.id + \"-slide\" + pad(index + 1);\n setAttribute(slide, ROLE, pagination ? \"tabpanel\" : \"group\");\n setAttribute(slide, ARIA_ROLEDESCRIPTION, i18n.slide);\n setAttribute(slide, ARIA_LABEL, label || format(i18n.slideLabel, [index + 1, Splide2.length]));\n }\n\n listen();\n }\n\n function listen() {\n bind(slide, \"click\", apply(emit, EVENT_CLICK, self));\n bind(slide, \"keydown\", apply(emit, EVENT_SLIDE_KEYDOWN, self));\n on([EVENT_MOVED, EVENT_SHIFTED, EVENT_SCROLLED], update);\n on(EVENT_NAVIGATION_MOUNTED, initNavigation);\n\n if (updateOnMove) {\n on(EVENT_MOVE, onMove);\n }\n }\n\n function destroy() {\n destroyed = true;\n event.destroy();\n removeClass(slide, STATUS_CLASSES);\n removeAttribute(slide, ALL_ATTRIBUTES);\n setAttribute(slide, \"style\", styles);\n setAttribute(slide, ARIA_LABEL, label || \"\");\n }\n\n function initNavigation() {\n var controls = Splide2.splides.map(function (target) {\n var Slide2 = target.splide.Components.Slides.getAt(index);\n return Slide2 ? Slide2.slide.id : \"\";\n }).join(\" \");\n setAttribute(slide, ARIA_LABEL, format(i18n.slideX, (isClone ? slideIndex : index) + 1));\n setAttribute(slide, ARIA_CONTROLS, controls);\n setAttribute(slide, ROLE, slideFocus ? \"button\" : \"\");\n slideFocus && removeAttribute(slide, ARIA_ROLEDESCRIPTION);\n }\n\n function onMove() {\n if (!destroyed) {\n update();\n }\n }\n\n function update() {\n if (!destroyed) {\n var curr = Splide2.index;\n updateActivity();\n updateVisibility();\n toggleClass(slide, CLASS_PREV, index === curr - 1);\n toggleClass(slide, CLASS_NEXT, index === curr + 1);\n }\n }\n\n function updateActivity() {\n var active = isActive();\n\n if (active !== hasClass(slide, CLASS_ACTIVE)) {\n toggleClass(slide, CLASS_ACTIVE, active);\n setAttribute(slide, ARIA_CURRENT, isNavigation && active || \"\");\n emit(active ? EVENT_ACTIVE : EVENT_INACTIVE, self);\n }\n }\n\n function updateVisibility() {\n var visible = isVisible();\n var hidden = !visible && (!isActive() || isClone);\n\n if (!Splide2.state.is([MOVING, SCROLLING])) {\n setAttribute(slide, ARIA_HIDDEN, hidden || \"\");\n }\n\n setAttribute(queryAll(slide, options.focusableNodes || \"\"), TAB_INDEX, hidden ? -1 : \"\");\n\n if (slideFocus) {\n setAttribute(slide, TAB_INDEX, hidden ? -1 : 0);\n }\n\n if (visible !== hasClass(slide, CLASS_VISIBLE)) {\n toggleClass(slide, CLASS_VISIBLE, visible);\n emit(visible ? EVENT_VISIBLE : EVENT_HIDDEN, self);\n }\n\n if (!visible && document.activeElement === slide) {\n var Slide2 = Components.Slides.getAt(Splide2.index);\n Slide2 && focus(Slide2.slide);\n }\n }\n\n function style$1(prop, value, useContainer) {\n style(useContainer && container || slide, prop, value);\n }\n\n function isActive() {\n var curr = Splide2.index;\n return curr === index || options.cloneStatus && curr === slideIndex;\n }\n\n function isVisible() {\n if (Splide2.is(FADE)) {\n return isActive();\n }\n\n var trackRect = rect(Components.Elements.track);\n var slideRect = rect(slide);\n var left = resolve(\"left\", true);\n var right = resolve(\"right\", true);\n return floor(trackRect[left]) <= ceil(slideRect[left]) && floor(slideRect[right]) <= ceil(trackRect[right]);\n }\n\n function isWithin(from, distance) {\n var diff = abs(from - index);\n\n if (!isClone && (options.rewind || Splide2.is(LOOP))) {\n diff = min(diff, Splide2.length - diff);\n }\n\n return diff <= distance;\n }\n\n var self = {\n index: index,\n slideIndex: slideIndex,\n slide: slide,\n container: container,\n isClone: isClone,\n mount: mount,\n destroy: destroy,\n update: update,\n style: style$1,\n isWithin: isWithin\n };\n return self;\n}\n\nfunction Slides(Splide2, Components2, options) {\n var _EventInterface2 = EventInterface(Splide2),\n on = _EventInterface2.on,\n emit = _EventInterface2.emit,\n bind = _EventInterface2.bind;\n\n var _Components2$Elements = Components2.Elements,\n slides = _Components2$Elements.slides,\n list = _Components2$Elements.list;\n var Slides2 = [];\n\n function mount() {\n init();\n on(EVENT_REFRESH, destroy);\n on(EVENT_REFRESH, init);\n }\n\n function init() {\n slides.forEach(function (slide, index) {\n register(slide, index, -1);\n });\n }\n\n function destroy() {\n forEach$1(function (Slide2) {\n Slide2.destroy();\n });\n empty(Slides2);\n }\n\n function update() {\n forEach$1(function (Slide2) {\n Slide2.update();\n });\n }\n\n function register(slide, index, slideIndex) {\n var object = Slide$1(Splide2, index, slideIndex, slide);\n object.mount();\n Slides2.push(object);\n Slides2.sort(function (Slide1, Slide2) {\n return Slide1.index - Slide2.index;\n });\n }\n\n function get(excludeClones) {\n return excludeClones ? filter(function (Slide2) {\n return !Slide2.isClone;\n }) : Slides2;\n }\n\n function getIn(page) {\n var Controller = Components2.Controller;\n var index = Controller.toIndex(page);\n var max = Controller.hasFocus() ? 1 : options.perPage;\n return filter(function (Slide2) {\n return between(Slide2.index, index, index + max - 1);\n });\n }\n\n function getAt(index) {\n return filter(index)[0];\n }\n\n function add(items, index) {\n forEach(items, function (slide) {\n if (isString(slide)) {\n slide = parseHtml(slide);\n }\n\n if (isHTMLElement(slide)) {\n var ref = slides[index];\n ref ? before(slide, ref) : append(list, slide);\n addClass(slide, options.classes.slide);\n observeImages(slide, apply(emit, EVENT_RESIZE));\n }\n });\n emit(EVENT_REFRESH);\n }\n\n function remove$1(matcher) {\n remove(filter(matcher).map(function (Slide2) {\n return Slide2.slide;\n }));\n emit(EVENT_REFRESH);\n }\n\n function forEach$1(iteratee, excludeClones) {\n get(excludeClones).forEach(iteratee);\n }\n\n function filter(matcher) {\n return Slides2.filter(isFunction(matcher) ? matcher : function (Slide2) {\n return isString(matcher) ? matches(Slide2.slide, matcher) : includes(toArray(matcher), Slide2.index);\n });\n }\n\n function style(prop, value, useContainer) {\n forEach$1(function (Slide2) {\n Slide2.style(prop, value, useContainer);\n });\n }\n\n function observeImages(elm, callback) {\n var images = queryAll(elm, \"img\");\n var length = images.length;\n\n if (length) {\n images.forEach(function (img) {\n bind(img, \"load error\", function () {\n if (! --length) {\n callback();\n }\n });\n });\n } else {\n callback();\n }\n }\n\n function getLength(excludeClones) {\n return excludeClones ? slides.length : Slides2.length;\n }\n\n function isEnough() {\n return Slides2.length > options.perPage;\n }\n\n return {\n mount: mount,\n destroy: destroy,\n update: update,\n register: register,\n get: get,\n getIn: getIn,\n getAt: getAt,\n add: add,\n remove: remove$1,\n forEach: forEach$1,\n filter: filter,\n style: style,\n getLength: getLength,\n isEnough: isEnough\n };\n}\n\nfunction Layout(Splide2, Components2, options) {\n var _EventInterface3 = EventInterface(Splide2),\n on = _EventInterface3.on,\n bind = _EventInterface3.bind,\n emit = _EventInterface3.emit;\n\n var Slides = Components2.Slides;\n var resolve = Components2.Direction.resolve;\n var _Components2$Elements2 = Components2.Elements,\n root = _Components2$Elements2.root,\n track = _Components2$Elements2.track,\n list = _Components2$Elements2.list;\n var getAt = Slides.getAt,\n styleSlides = Slides.style;\n var vertical;\n var rootRect;\n var overflow;\n\n function mount() {\n init();\n bind(window, \"resize load\", Throttle(apply(emit, EVENT_RESIZE)));\n on([EVENT_UPDATED, EVENT_REFRESH], init);\n on(EVENT_RESIZE, resize);\n }\n\n function init() {\n vertical = options.direction === TTB;\n style(root, \"maxWidth\", unit(options.width));\n style(track, resolve(\"paddingLeft\"), cssPadding(false));\n style(track, resolve(\"paddingRight\"), cssPadding(true));\n resize(true);\n }\n\n function resize(force) {\n var newRect = rect(root);\n\n if (force || rootRect.width !== newRect.width || rootRect.height !== newRect.height) {\n style(track, \"height\", cssTrackHeight());\n styleSlides(resolve(\"marginRight\"), unit(options.gap));\n styleSlides(\"width\", cssSlideWidth());\n styleSlides(\"height\", cssSlideHeight(), true);\n rootRect = newRect;\n emit(EVENT_RESIZED);\n\n if (overflow !== (overflow = isOverflow())) {\n toggleClass(root, CLASS_OVERFLOW, overflow);\n emit(EVENT_OVERFLOW, overflow);\n }\n }\n }\n\n function cssPadding(right) {\n var padding = options.padding;\n var prop = resolve(right ? \"right\" : \"left\");\n return padding && unit(padding[prop] || (isObject(padding) ? 0 : padding)) || \"0px\";\n }\n\n function cssTrackHeight() {\n var height = \"\";\n\n if (vertical) {\n height = cssHeight();\n assert(height, \"height or heightRatio is missing.\");\n height = \"calc(\" + height + \" - \" + cssPadding(false) + \" - \" + cssPadding(true) + \")\";\n }\n\n return height;\n }\n\n function cssHeight() {\n return unit(options.height || rect(list).width * options.heightRatio);\n }\n\n function cssSlideWidth() {\n return options.autoWidth ? null : unit(options.fixedWidth) || (vertical ? \"\" : cssSlideSize());\n }\n\n function cssSlideHeight() {\n return unit(options.fixedHeight) || (vertical ? options.autoHeight ? null : cssSlideSize() : cssHeight());\n }\n\n function cssSlideSize() {\n var gap = unit(options.gap);\n return \"calc((100%\" + (gap && \" + \" + gap) + \")/\" + (options.perPage || 1) + (gap && \" - \" + gap) + \")\";\n }\n\n function listSize() {\n return rect(list)[resolve(\"width\")];\n }\n\n function slideSize(index, withoutGap) {\n var Slide = getAt(index || 0);\n return Slide ? rect(Slide.slide)[resolve(\"width\")] + (withoutGap ? 0 : getGap()) : 0;\n }\n\n function totalSize(index, withoutGap) {\n var Slide = getAt(index);\n\n if (Slide) {\n var right = rect(Slide.slide)[resolve(\"right\")];\n var left = rect(list)[resolve(\"left\")];\n return abs(right - left) + (withoutGap ? 0 : getGap());\n }\n\n return 0;\n }\n\n function sliderSize(withoutGap) {\n return totalSize(Splide2.length - 1) - totalSize(0) + slideSize(0, withoutGap);\n }\n\n function getGap() {\n var Slide = getAt(0);\n return Slide && parseFloat(style(Slide.slide, resolve(\"marginRight\"))) || 0;\n }\n\n function getPadding(right) {\n return parseFloat(style(track, resolve(\"padding\" + (right ? \"Right\" : \"Left\")))) || 0;\n }\n\n function isOverflow() {\n return Splide2.is(FADE) || sliderSize(true) > listSize();\n }\n\n return {\n mount: mount,\n resize: resize,\n listSize: listSize,\n slideSize: slideSize,\n sliderSize: sliderSize,\n totalSize: totalSize,\n getPadding: getPadding,\n isOverflow: isOverflow\n };\n}\n\nvar MULTIPLIER = 2;\n\nfunction Clones(Splide2, Components2, options) {\n var event = EventInterface(Splide2);\n var on = event.on;\n var Elements = Components2.Elements,\n Slides = Components2.Slides;\n var resolve = Components2.Direction.resolve;\n var clones = [];\n var cloneCount;\n\n function mount() {\n on(EVENT_REFRESH, remount);\n on([EVENT_UPDATED, EVENT_RESIZE], observe);\n\n if (cloneCount = computeCloneCount()) {\n generate(cloneCount);\n Components2.Layout.resize(true);\n }\n }\n\n function remount() {\n destroy();\n mount();\n }\n\n function destroy() {\n remove(clones);\n empty(clones);\n event.destroy();\n }\n\n function observe() {\n var count = computeCloneCount();\n\n if (cloneCount !== count) {\n if (cloneCount < count || !count) {\n event.emit(EVENT_REFRESH);\n }\n }\n }\n\n function generate(count) {\n var slides = Slides.get().slice();\n var length = slides.length;\n\n if (length) {\n while (slides.length < count) {\n push(slides, slides);\n }\n\n push(slides.slice(-count), slides.slice(0, count)).forEach(function (Slide, index) {\n var isHead = index < count;\n var clone = cloneDeep(Slide.slide, index);\n isHead ? before(clone, slides[0].slide) : append(Elements.list, clone);\n push(clones, clone);\n Slides.register(clone, index - count + (isHead ? 0 : length), Slide.index);\n });\n }\n }\n\n function cloneDeep(elm, index) {\n var clone = elm.cloneNode(true);\n addClass(clone, options.classes.clone);\n clone.id = Splide2.root.id + \"-clone\" + pad(index + 1);\n return clone;\n }\n\n function computeCloneCount() {\n var clones2 = options.clones;\n\n if (!Splide2.is(LOOP)) {\n clones2 = 0;\n } else if (isUndefined(clones2)) {\n var fixedSize = options[resolve(\"fixedWidth\")] && Components2.Layout.slideSize(0);\n var fixedCount = fixedSize && ceil(rect(Elements.track)[resolve(\"width\")] / fixedSize);\n clones2 = fixedCount || options[resolve(\"autoWidth\")] && Splide2.length || options.perPage * MULTIPLIER;\n }\n\n return clones2;\n }\n\n return {\n mount: mount,\n destroy: destroy\n };\n}\n\nfunction Move(Splide2, Components2, options) {\n var _EventInterface4 = EventInterface(Splide2),\n on = _EventInterface4.on,\n emit = _EventInterface4.emit;\n\n var set = Splide2.state.set;\n var _Components2$Layout = Components2.Layout,\n slideSize = _Components2$Layout.slideSize,\n getPadding = _Components2$Layout.getPadding,\n totalSize = _Components2$Layout.totalSize,\n listSize = _Components2$Layout.listSize,\n sliderSize = _Components2$Layout.sliderSize;\n var _Components2$Directio = Components2.Direction,\n resolve = _Components2$Directio.resolve,\n orient = _Components2$Directio.orient;\n var _Components2$Elements3 = Components2.Elements,\n list = _Components2$Elements3.list,\n track = _Components2$Elements3.track;\n var Transition;\n\n function mount() {\n Transition = Components2.Transition;\n on([EVENT_MOUNTED, EVENT_RESIZED, EVENT_UPDATED, EVENT_REFRESH], reposition);\n }\n\n function reposition() {\n if (!Components2.Controller.isBusy()) {\n Components2.Scroll.cancel();\n jump(Splide2.index);\n Components2.Slides.update();\n }\n }\n\n function move(dest, index, prev, callback) {\n if (dest !== index && canShift(dest > prev)) {\n cancel();\n translate(shift(getPosition(), dest > prev), true);\n }\n\n set(MOVING);\n emit(EVENT_MOVE, index, prev, dest);\n Transition.start(index, function () {\n set(IDLE);\n emit(EVENT_MOVED, index, prev, dest);\n callback && callback();\n });\n }\n\n function jump(index) {\n translate(toPosition(index, true));\n }\n\n function translate(position, preventLoop) {\n if (!Splide2.is(FADE)) {\n var destination = preventLoop ? position : loop(position);\n style(list, \"transform\", \"translate\" + resolve(\"X\") + \"(\" + destination + \"px)\");\n position !== destination && emit(EVENT_SHIFTED);\n }\n }\n\n function loop(position) {\n if (Splide2.is(LOOP)) {\n var index = toIndex(position);\n var exceededMax = index > Components2.Controller.getEnd();\n var exceededMin = index < 0;\n\n if (exceededMin || exceededMax) {\n position = shift(position, exceededMax);\n }\n }\n\n return position;\n }\n\n function shift(position, backwards) {\n var excess = position - getLimit(backwards);\n var size = sliderSize();\n position -= orient(size * (ceil(abs(excess) / size) || 1)) * (backwards ? 1 : -1);\n return position;\n }\n\n function cancel() {\n translate(getPosition(), true);\n Transition.cancel();\n }\n\n function toIndex(position) {\n var Slides = Components2.Slides.get();\n var index = 0;\n var minDistance = Infinity;\n\n for (var i = 0; i < Slides.length; i++) {\n var slideIndex = Slides[i].index;\n var distance = abs(toPosition(slideIndex, true) - position);\n\n if (distance <= minDistance) {\n minDistance = distance;\n index = slideIndex;\n } else {\n break;\n }\n }\n\n return index;\n }\n\n function toPosition(index, trimming) {\n var position = orient(totalSize(index - 1) - offset(index));\n return trimming ? trim(position) : position;\n }\n\n function getPosition() {\n var left = resolve(\"left\");\n return rect(list)[left] - rect(track)[left] + orient(getPadding(false));\n }\n\n function trim(position) {\n if (options.trimSpace && Splide2.is(SLIDE)) {\n position = clamp(position, 0, orient(sliderSize(true) - listSize()));\n }\n\n return position;\n }\n\n function offset(index) {\n var focus = options.focus;\n return focus === \"center\" ? (listSize() - slideSize(index, true)) / 2 : +focus * slideSize(index) || 0;\n }\n\n function getLimit(max) {\n return toPosition(max ? Components2.Controller.getEnd() : 0, !!options.trimSpace);\n }\n\n function canShift(backwards) {\n var shifted = orient(shift(getPosition(), backwards));\n return backwards ? shifted >= 0 : shifted <= list[resolve(\"scrollWidth\")] - rect(track)[resolve(\"width\")];\n }\n\n function exceededLimit(max, position) {\n position = isUndefined(position) ? getPosition() : position;\n var exceededMin = max !== true && orient(position) < orient(getLimit(false));\n var exceededMax = max !== false && orient(position) > orient(getLimit(true));\n return exceededMin || exceededMax;\n }\n\n return {\n mount: mount,\n move: move,\n jump: jump,\n translate: translate,\n shift: shift,\n cancel: cancel,\n toIndex: toIndex,\n toPosition: toPosition,\n getPosition: getPosition,\n getLimit: getLimit,\n exceededLimit: exceededLimit,\n reposition: reposition\n };\n}\n\nfunction Controller(Splide2, Components2, options) {\n var _EventInterface5 = EventInterface(Splide2),\n on = _EventInterface5.on,\n emit = _EventInterface5.emit;\n\n var Move = Components2.Move;\n var getPosition = Move.getPosition,\n getLimit = Move.getLimit,\n toPosition = Move.toPosition;\n var _Components2$Slides = Components2.Slides,\n isEnough = _Components2$Slides.isEnough,\n getLength = _Components2$Slides.getLength;\n var omitEnd = options.omitEnd;\n var isLoop = Splide2.is(LOOP);\n var isSlide = Splide2.is(SLIDE);\n var getNext = apply(getAdjacent, false);\n var getPrev = apply(getAdjacent, true);\n var currIndex = options.start || 0;\n var endIndex;\n var prevIndex = currIndex;\n var slideCount;\n var perMove;\n var perPage;\n\n function mount() {\n init();\n on([EVENT_UPDATED, EVENT_REFRESH, EVENT_END_INDEX_CHANGED], init);\n on(EVENT_RESIZED, onResized);\n }\n\n function init() {\n slideCount = getLength(true);\n perMove = options.perMove;\n perPage = options.perPage;\n endIndex = getEnd();\n var index = clamp(currIndex, 0, omitEnd ? endIndex : slideCount - 1);\n\n if (index !== currIndex) {\n currIndex = index;\n Move.reposition();\n }\n }\n\n function onResized() {\n if (endIndex !== getEnd()) {\n emit(EVENT_END_INDEX_CHANGED);\n }\n }\n\n function go(control, allowSameIndex, callback) {\n if (!isBusy()) {\n var dest = parse(control);\n var index = loop(dest);\n\n if (index > -1 && (allowSameIndex || index !== currIndex)) {\n setIndex(index);\n Move.move(dest, index, prevIndex, callback);\n }\n }\n }\n\n function scroll(destination, duration, snap, callback) {\n Components2.Scroll.scroll(destination, duration, snap, function () {\n var index = loop(Move.toIndex(getPosition()));\n setIndex(omitEnd ? min(index, endIndex) : index);\n callback && callback();\n });\n }\n\n function parse(control) {\n var index = currIndex;\n\n if (isString(control)) {\n var _ref = control.match(/([+\\-<>])(\\d+)?/) || [],\n indicator = _ref[1],\n number = _ref[2];\n\n if (indicator === \"+\" || indicator === \"-\") {\n index = computeDestIndex(currIndex + +(\"\" + indicator + (+number || 1)), currIndex);\n } else if (indicator === \">\") {\n index = number ? toIndex(+number) : getNext(true);\n } else if (indicator === \"<\") {\n index = getPrev(true);\n }\n } else {\n index = isLoop ? control : clamp(control, 0, endIndex);\n }\n\n return index;\n }\n\n function getAdjacent(prev, destination) {\n var number = perMove || (hasFocus() ? 1 : perPage);\n var dest = computeDestIndex(currIndex + number * (prev ? -1 : 1), currIndex, !(perMove || hasFocus()));\n\n if (dest === -1 && isSlide) {\n if (!approximatelyEqual(getPosition(), getLimit(!prev), 1)) {\n return prev ? 0 : endIndex;\n }\n }\n\n return destination ? dest : loop(dest);\n }\n\n function computeDestIndex(dest, from, snapPage) {\n if (isEnough() || hasFocus()) {\n var index = computeMovableDestIndex(dest);\n\n if (index !== dest) {\n from = dest;\n dest = index;\n snapPage = false;\n }\n\n if (dest < 0 || dest > endIndex) {\n if (!perMove && (between(0, dest, from, true) || between(endIndex, from, dest, true))) {\n dest = toIndex(toPage(dest));\n } else {\n if (isLoop) {\n dest = snapPage ? dest < 0 ? -(slideCount % perPage || perPage) : slideCount : dest;\n } else if (options.rewind) {\n dest = dest < 0 ? endIndex : 0;\n } else {\n dest = -1;\n }\n }\n } else {\n if (snapPage && dest !== from) {\n dest = toIndex(toPage(from) + (dest < from ? -1 : 1));\n }\n }\n } else {\n dest = -1;\n }\n\n return dest;\n }\n\n function computeMovableDestIndex(dest) {\n if (isSlide && options.trimSpace === \"move\" && dest !== currIndex) {\n var position = getPosition();\n\n while (position === toPosition(dest, true) && between(dest, 0, Splide2.length - 1, !options.rewind)) {\n dest < currIndex ? --dest : ++dest;\n }\n }\n\n return dest;\n }\n\n function loop(index) {\n return isLoop ? (index + slideCount) % slideCount || 0 : index;\n }\n\n function getEnd() {\n var end = slideCount - (hasFocus() || isLoop && perMove ? 1 : perPage);\n\n while (omitEnd && end-- > 0) {\n if (toPosition(slideCount - 1, true) !== toPosition(end, true)) {\n end++;\n break;\n }\n }\n\n return clamp(end, 0, slideCount - 1);\n }\n\n function toIndex(page) {\n return clamp(hasFocus() ? page : perPage * page, 0, endIndex);\n }\n\n function toPage(index) {\n return hasFocus() ? min(index, endIndex) : floor((index >= endIndex ? slideCount - 1 : index) / perPage);\n }\n\n function toDest(destination) {\n var closest = Move.toIndex(destination);\n return isSlide ? clamp(closest, 0, endIndex) : closest;\n }\n\n function setIndex(index) {\n if (index !== currIndex) {\n prevIndex = currIndex;\n currIndex = index;\n }\n }\n\n function getIndex(prev) {\n return prev ? prevIndex : currIndex;\n }\n\n function hasFocus() {\n return !isUndefined(options.focus) || options.isNavigation;\n }\n\n function isBusy() {\n return Splide2.state.is([MOVING, SCROLLING]) && !!options.waitForTransition;\n }\n\n return {\n mount: mount,\n go: go,\n scroll: scroll,\n getNext: getNext,\n getPrev: getPrev,\n getAdjacent: getAdjacent,\n getEnd: getEnd,\n setIndex: setIndex,\n getIndex: getIndex,\n toIndex: toIndex,\n toPage: toPage,\n toDest: toDest,\n hasFocus: hasFocus,\n isBusy: isBusy\n };\n}\n\nvar XML_NAME_SPACE = \"http://www.w3.org/2000/svg\";\nvar PATH = \"m15.5 0.932-4.3 4.38 14.5 14.6-14.5 14.5 4.3 4.4 14.6-14.6 4.4-4.3-4.4-4.4-14.6-14.6z\";\nvar SIZE = 40;\n\nfunction Arrows(Splide2, Components2, options) {\n var event = EventInterface(Splide2);\n var on = event.on,\n bind = event.bind,\n emit = event.emit;\n var classes = options.classes,\n i18n = options.i18n;\n var Elements = Components2.Elements,\n Controller = Components2.Controller;\n var placeholder = Elements.arrows,\n track = Elements.track;\n var wrapper = placeholder;\n var prev = Elements.prev;\n var next = Elements.next;\n var created;\n var wrapperClasses;\n var arrows = {};\n\n function mount() {\n init();\n on(EVENT_UPDATED, remount);\n }\n\n function remount() {\n destroy();\n mount();\n }\n\n function init() {\n var enabled = options.arrows;\n\n if (enabled && !(prev && next)) {\n createArrows();\n }\n\n if (prev && next) {\n assign(arrows, {\n prev: prev,\n next: next\n });\n display(wrapper, enabled ? \"\" : \"none\");\n addClass(wrapper, wrapperClasses = CLASS_ARROWS + \"--\" + options.direction);\n\n if (enabled) {\n listen();\n update();\n setAttribute([prev, next], ARIA_CONTROLS, track.id);\n emit(EVENT_ARROWS_MOUNTED, prev, next);\n }\n }\n }\n\n function destroy() {\n event.destroy();\n removeClass(wrapper, wrapperClasses);\n\n if (created) {\n remove(placeholder ? [prev, next] : wrapper);\n prev = next = null;\n } else {\n removeAttribute([prev, next], ALL_ATTRIBUTES);\n }\n }\n\n function listen() {\n on([EVENT_MOUNTED, EVENT_MOVED, EVENT_REFRESH, EVENT_SCROLLED, EVENT_END_INDEX_CHANGED], update);\n bind(next, \"click\", apply(go, \">\"));\n bind(prev, \"click\", apply(go, \"<\"));\n }\n\n function go(control) {\n Controller.go(control, true);\n }\n\n function createArrows() {\n wrapper = placeholder || create(\"div\", classes.arrows);\n prev = createArrow(true);\n next = createArrow(false);\n created = true;\n append(wrapper, [prev, next]);\n !placeholder && before(wrapper, track);\n }\n\n function createArrow(prev2) {\n var arrow = \"\";\n };\n\n _proto3.html = function html() {\n var _this$config = this.config,\n rootClass = _this$config.rootClass,\n listTag = _this$config.listTag,\n arrows = _this$config.arrows,\n beforeTrack = _this$config.beforeTrack,\n afterTrack = _this$config.afterTrack,\n slider = _this$config.slider,\n beforeSlider = _this$config.beforeSlider,\n afterSlider = _this$config.afterSlider;\n var html = \"\";\n html += \"
      \";\n html += \"\";\n\n if (slider) {\n html += beforeSlider || \"\";\n html += \"
      \";\n }\n\n html += beforeTrack || \"\";\n\n if (arrows) {\n html += this.renderArrows();\n }\n\n html += \"
      \";\n html += \"<\" + listTag + \" class=\\\"splide__list\\\">\";\n html += this.renderSlides();\n html += \"\";\n html += \"
      \";\n html += afterTrack || \"\";\n\n if (slider) {\n html += \"
      \";\n html += afterSlider || \"\";\n }\n\n html += \"
      \";\n return html;\n };\n\n return SplideRenderer;\n}();\n\nexport { CLASSES, CLASS_ACTIVE, CLASS_ARROW, CLASS_ARROWS, CLASS_ARROW_NEXT, CLASS_ARROW_PREV, CLASS_CLONE, CLASS_CONTAINER, CLASS_FOCUS_IN, CLASS_INITIALIZED, CLASS_LIST, CLASS_LOADING, CLASS_NEXT, CLASS_OVERFLOW, CLASS_PAGINATION, CLASS_PAGINATION_PAGE, CLASS_PREV, CLASS_PROGRESS, CLASS_PROGRESS_BAR, CLASS_ROOT, CLASS_SLIDE, CLASS_SPINNER, CLASS_SR, CLASS_TOGGLE, CLASS_TOGGLE_PAUSE, CLASS_TOGGLE_PLAY, CLASS_TRACK, CLASS_VISIBLE, DEFAULTS, EVENT_ACTIVE, EVENT_ARROWS_MOUNTED, EVENT_ARROWS_UPDATED, EVENT_AUTOPLAY_PAUSE, EVENT_AUTOPLAY_PLAY, EVENT_AUTOPLAY_PLAYING, EVENT_CLICK, EVENT_DESTROY, EVENT_DRAG, EVENT_DRAGGED, EVENT_DRAGGING, EVENT_END_INDEX_CHANGED, EVENT_HIDDEN, EVENT_INACTIVE, EVENT_LAZYLOAD_LOADED, EVENT_MOUNTED, EVENT_MOVE, EVENT_MOVED, EVENT_NAVIGATION_MOUNTED, EVENT_OVERFLOW, EVENT_PAGINATION_MOUNTED, EVENT_PAGINATION_UPDATED, EVENT_READY, EVENT_REFRESH, EVENT_RESIZE, EVENT_RESIZED, EVENT_SCROLL, EVENT_SCROLLED, EVENT_SHIFTED, EVENT_SLIDE_KEYDOWN, EVENT_UPDATED, EVENT_VISIBLE, EventBinder, EventInterface, FADE, LOOP, LTR, RTL, RequestInterval, SLIDE, STATUS_CLASSES, Splide, SplideRenderer, State, TTB, Throttle, Splide as default };\n","// import 'bootstrap'; // ohne Pfadangabe (Modul auslesen aus node_modules) funktioniert nur mit JS-Bundler (esbuild, rollup & co.)\n\nimport ProductManager from './modules/ProductManager'; // Dateiendung kann weggelassen werden, wenn ein Bundler eingesetzt wird (esbuild, webpack, rollup, etc.)\nimport Splide from '@splidejs/splide';\n\n(() => {\n // === DOM & VARS =======\n const DOM = {};\n\n // === INIT =============\n const init = () => {\n console.log('init!!');\n router();\n };\n\n // === EVENTHANDLER =====\n\n // === XHR/FETCH ========\n\n // === FUNCTIONS ========\n const router = () => {\n const path = window.location.pathname;\n\n console.log(path);\n\n switch (path) {\n case '/':\n case '/index.html':\n console.log('HOME');\n const splider = new Splide('.splide', {\n type: 'loop',\n fixedHeight: '100%',\n height: '100%',\n autoHeight: true,\n }).mount();\n\n // nur Skripte, die für Home relevant ausführen\n break;\n case '/projects/product-manager.html':\n console.log('PRODUCT_MANAGER');\n const pm = ProductManager();\n break;\n default:\n console.warn('Page not found');\n }\n };\n\n init();\n})();\n"],"names":["top","bottom","right","left","auto","basePlacements","start","end","clippingParents","viewport","popper","reference","variationPlacements","reduce","acc","placement","concat","placements","beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite","modifierPhases","getNodeName","element","nodeName","toLowerCase","getWindow","node","window","toString","ownerDocument","defaultView","isElement","OwnElement","Element","isHTMLElement","HTMLElement","isShadowRoot","ShadowRoot","applyStyles","_ref","state","Object","keys","elements","forEach","name","style","styles","attributes","assign","value","removeAttribute","setAttribute","effect","_ref2","initialStyles","position","options","strategy","margin","arrow","styleProperties","hasOwnProperty","property","attribute","enabled","phase","fn","requires","getBasePlacement","split","max","Math","min","round","getUAString","uaData","navigator","userAgentData","brands","Array","isArray","map","item","brand","version","join","userAgent","isLayoutViewport","test","getBoundingClientRect","includeScale","isFixedStrategy","clientRect","scaleX","scaleY","offsetWidth","width","offsetHeight","height","visualViewport","addVisualOffsets","x","offsetLeft","y","offsetTop","getLayoutRect","abs","contains","parent","child","rootNode","getRootNode","next","isSameNode","parentNode","host","getComputedStyle","isTableElement","indexOf","getDocumentElement","document","documentElement","getParentNode","assignedSlot","getTrueOffsetParent","offsetParent","getContainingBlock","isFirefox","isIE","elementCss","currentNode","css","transform","perspective","contain","willChange","filter","getOffsetParent","getMainAxisFromPlacement","within","mathMax","mathMin","withinMaxClamp","v","getFreshSideObject","mergePaddingObject","paddingObject","expandToHashMap","hashMap","key","toPaddingObject","padding","rects","_state$modifiersData$","arrowElement","popperOffsets","modifiersData","basePlacement","axis","isVertical","len","arrowRect","minProp","maxProp","endDiff","startDiff","arrowOffsetParent","clientSize","clientHeight","clientWidth","centerToReference","center","offset","axisProp","centerOffset","_options$element","querySelector","requiresIfExists","getVariation","unsetSides","roundOffsetsByDPR","win","dpr","devicePixelRatio","mapToStyles","_Object$assign2","popperRect","variation","offsets","gpuAcceleration","adaptive","roundOffsets","isFixed","_offsets$x","_offsets$y","_ref3","hasX","hasY","sideX","sideY","heightProp","widthProp","offsetY","offsetX","commonStyles","_ref4","_Object$assign","computeStyles","_ref5","_options$gpuAccelerat","_options$adaptive","_options$roundOffsets","data","passive","instance","_options$scroll","scroll","_options$resize","resize","scrollParents","scrollParent","addEventListener","update","removeEventListener","hash","getOppositePlacement","replace","matched","getOppositeVariationPlacement","getWindowScroll","scrollLeft","pageXOffset","scrollTop","pageYOffset","getWindowScrollBarX","getViewportRect","html","layoutViewport","getDocumentRect","_element$ownerDocumen","winScroll","body","scrollWidth","scrollHeight","direction","isScrollParent","_getComputedStyle","overflow","overflowX","overflowY","getScrollParent","listScrollParents","list","isBody","target","updatedList","rectToClientRect","rect","getInnerBoundingClientRect","clientTop","clientLeft","getClientRectFromMixedType","clippingParent","getClippingParents","canEscapeClipping","clipperElement","getClippingRect","boundary","rootBoundary","mainClippingParents","firstClippingParent","clippingRect","accRect","computeOffsets","commonX","commonY","mainAxis","detectOverflow","_options","_options$placement","_options$strategy","_options$boundary","_options$rootBoundary","_options$elementConte","elementContext","_options$altBoundary","altBoundary","_options$padding","altContext","clippingClientRect","contextElement","referenceClientRect","popperClientRect","elementClientRect","overflowOffsets","offsetData","multiply","computeAutoPlacement","flipVariations","_options$allowedAutoP","allowedAutoPlacements","allPlacements","allowedPlacements","length","overflows","sort","a","b","getExpandedFallbackPlacements","oppositePlacement","flip","_skip","_options$mainAxis","checkMainAxis","_options$altAxis","altAxis","checkAltAxis","specifiedFallbackPlacements","fallbackPlacements","_options$flipVariatio","preferredPlacement","isBasePlacement","referenceRect","checksMap","Map","makeFallbackChecks","firstFittingPlacement","i","_basePlacement","isStartVariation","mainVariationSide","altVariationSide","checks","push","every","check","set","numberOfChecks","_loop","_i","fittingPlacement","find","get","slice","_ret","reset","getSideOffsets","preventedOffsets","isAnySideFullyClipped","some","side","hide","preventOverflow","referenceOverflow","popperAltOverflow","referenceClippingOffsets","popperEscapeOffsets","isReferenceHidden","hasPopperEscaped","distanceAndSkiddingToXY","invertDistance","skidding","distance","_options$offset","_data$state$placement","getAltAxis","_options$tether","tether","_options$tetherOffset","tetherOffset","tetherOffsetValue","normalizedTetherOffsetValue","offsetModifierState","_offsetModifierState$","mainSide","altSide","additive","minLen","maxLen","arrowPaddingObject","arrowPaddingMin","arrowPaddingMax","arrowLen","minOffset","maxOffset","clientOffset","offsetModifierValue","tetherMin","tetherMax","preventedOffset","_offsetModifierState$2","_mainSide","_altSide","_offset","_len","_min","_max","isOriginSide","_offsetModifierValue","_tetherMin","_tetherMax","_preventedOffset","getHTMLElementScroll","getNodeScroll","isElementScaled","getCompositeRect","elementOrVirtualElement","isOffsetParentAnElement","offsetParentIsScaled","order","modifiers","visited","Set","result","modifier","add","dep","has","depModifier","orderModifiers","orderedModifiers","debounce","pending","Promise","resolve","then","undefined","mergeByName","merged","current","existing","DEFAULT_OPTIONS","areValidElements","arguments","args","_key","popperGenerator","generatorOptions","_generatorOptions","_generatorOptions$def","defaultModifiers","_generatorOptions$def2","defaultOptions","createPopper","effectCleanupFns","isDestroyed","setOptions","setOptionsAction","cleanupModifierEffects","m","runModifierEffects","forceUpdate","_state$elements","index","_state$orderedModifie","_state$orderedModifie2","destroy","onFirstUpdate","_ref$options","cleanupFn","noopFn","eventListeners","elementMap","Data","instanceMap","size","console","error","from","remove","delete","root","factory","module","exports","Toastify","this","global","lib","init","defaults","oldestFirst","text","duration","selector","callback","destination","newWindow","close","gravity","positionLeft","backgroundColor","avatar","className","stopOnFocus","onClick","escapeMarkup","ariaLive","background","prototype","toastify","constructor","toastElement","buildToast","divElement","createElement","warn","nodeType","Node","ELEMENT_NODE","appendChild","innerText","innerHTML","avatarElement","src","insertAdjacentElement","closeElement","type","event","stopPropagation","removeElement","clearTimeout","timeOutValue","bind","innerWidth","screen","self","setTimeout","open","location","getAxisOffsetAValue","xOffset","yOffset","showToast","rootElement","getElementById","elementToInsert","firstChild","lastChild","insertBefore","reposition","hideToast","removeChild","call","topLeftOffsetSize","topRightOffsetSize","offsetSize","allToasts","getElementsByClassName","classUsed","containsClass","substr","isNaN","elem","yourClass","trim","Toast","variant","getColorByName","color","show","querySelectorTyped","Error","parents","el","currentEl","parentElement","matches","ProductManager","BASE_URL","DOM","table","tBody","inputName","inputPrice","btnAdd","templateRow","btnSave","btnReset","modalEdit","formEdit","inputEditName","inputEditPrice","inputEditId","inputEditPosition","btnUpdate","modalDelete","productName","btnConfirmDelete","log","bsModalEdit","Modal","backdrop","keyboard","bsModalDelete","initProducts","onClickReset","onClickSave","onClickAdd","disabled","onClickConfirmDelete","onSubmitEdit","onKeyUp","e","currentTarget","resetProducts","success","msg","loadProducts","btnEl","icon","classList","saveProducts","preventDefault","product","price","Number","_id","updateProduct","resetFields","createProduct","disableNonFunctionalButtons","onClickEdit","currentRow","id","String","dataset","getProduct","showModalEdit","onClickRemove","textContent","deleteProduct","onClickMoveUp","currentRowEl","previousElementSibling","before","onClickMoveDown","nextElementSibling","after","onMouseDownDrag","draggable","onMouseUpDrag","onDragStart","idx","children","dataTransfer","setData","onDragOver","onDrop","targetIdx","sourceIdx","parseInt","getData","draggedEl","response","fetch","method","headers","JSON","stringify","ok","json","message","save","getProducts","products","addProduct","trEl","content","firstElementChild","cloneNode","tdNameEl","tdPriceEl","btnRemoveEl","btnMoveUpEl","btnMoveDownEl","btnDragEl","btnEditEl","querySelectorAll","tr","btnMoveUp","btnMoveDown","_defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","_createClass","Constructor","protoProps","staticProps","MEDIA_PREFERS_REDUCED_MOTION","CREATED","MOUNTED","IDLE","MOVING","SCROLLING","DRAGGING","DESTROYED","STATES","empty","array","arrayLike","apply","func","nextTick","noop","raf","requestAnimationFrame","typeOf","subject","isObject","isNull","isFunction","isString","isUndefined","toArray","values","iteratee","includes","items","toggleClass","elm","classes","addClass","append","nodes","ref","children2","ownKeys","forOwn","object","reverse","source","merge","omit","elms","attrs","attr","value2","create","tag","prop","display","display2","focus","preventScroll","getAttribute","hasClass","parseHtml","DOMParser","parseFromString","prevent","stopImmediatePropagation","query","queryAll","removeClass","timeOf","timeStamp","unit","PROJECT_CODE","DATA_ATTRIBUTE","assert","condition","floor","ceil","approximatelyEqual","epsilon","between","number","exclusive","minimum","maximum","clamp","sign","format","string","replacements","replacement","pad","ids","uniqueId","prefix","EventBinder","listeners","targets","events","forEachEvent","namespace","isEventTarget","remover","unbind","listener","dispatch","detail","bubbles","CustomEvent","createEvent","initCustomEvent","dispatchEvent","events2","eventNS","fragment","EVENT_MOUNTED","EVENT_READY","EVENT_MOVE","EVENT_MOVED","EVENT_CLICK","EVENT_ACTIVE","EVENT_INACTIVE","EVENT_VISIBLE","EVENT_HIDDEN","EVENT_REFRESH","EVENT_UPDATED","EVENT_RESIZE","EVENT_RESIZED","EVENT_DRAG","EVENT_DRAGGING","EVENT_DRAGGED","EVENT_SCROLL","EVENT_SCROLLED","EVENT_OVERFLOW","EVENT_DESTROY","EVENT_ARROWS_MOUNTED","EVENT_ARROWS_UPDATED","EVENT_PAGINATION_MOUNTED","EVENT_PAGINATION_UPDATED","EVENT_NAVIGATION_MOUNTED","EVENT_AUTOPLAY_PLAY","EVENT_AUTOPLAY_PLAYING","EVENT_AUTOPLAY_PAUSE","EVENT_LAZYLOAD_LOADED","EVENT_SLIDE_KEYDOWN","EVENT_SHIFTED","EVENT_END_INDEX_CHANGED","EventInterface","Splide2","bus","createDocumentFragment","binder","on","emit","off","RequestInterval","interval","onInterval","onUpdate","limit","now","Date","startTime","rate","paused","count","pause","resume","cancel","rewind","cancelAnimationFrame","time","isPaused","State","initialState","is","states","Throttle","Media","Components2","breakpoints","reducedMotion","queries","setup","isMin","mediaQuery","n","register","completely","options2","queryList","matchMedia","destroyed","merged2","entry","mount","refresh","enable","opts","base","notify","getPrototypeOf","ARROW","ARROW_LEFT","ARROW_RIGHT","ARROW_UP","ARROW_DOWN","RTL","TTB","ORIENTATION_MAP","X","Y","ArrowLeft","ArrowRight","Direction","axisOnly","match","charAt","toUpperCase","orient","ROLE","TAB_INDEX","DISABLED","ARIA_PREFIX","ARIA_CONTROLS","ARIA_CURRENT","ARIA_SELECTED","ARIA_LABEL","ARIA_LABELLEDBY","ARIA_HIDDEN","ARIA_ORIENTATION","ARIA_ROLEDESCRIPTION","ARIA_LIVE","ARIA_BUSY","ARIA_ATOMIC","ALL_ATTRIBUTES","CLASS_PREFIX","STATUS_CLASS_PREFIX","CLASS_ROOT","CLASS_TRACK","CLASS_LIST","CLASS_SLIDE","CLASS_CLONE","CLASS_CONTAINER","CLASS_ARROWS","CLASS_ARROW","CLASS_ARROW_PREV","CLASS_ARROW_NEXT","CLASS_PAGINATION","CLASS_PAGINATION_PAGE","CLASS_PROGRESS","CLASS_PROGRESS_BAR","CLASS_TOGGLE","CLASS_SPINNER","CLASS_SR","CLASS_INITIALIZED","CLASS_ACTIVE","CLASS_PREV","CLASS_NEXT","CLASS_VISIBLE","CLASS_LOADING","CLASS_FOCUS_IN","CLASS_OVERFLOW","STATUS_CLASSES","CLASSES","slide","clone","arrows","prev","pagination","page","spinner","closest","FRICTION","LOG_INTERVAL","POINTER_DOWN_EVENTS","POINTER_MOVE_EVENTS","POINTER_UP_EVENTS","Elements","_EventInterface","i18n","slides","rootClasses","trackClasses","track","isUsingKey","collect","capture","getClasses","label","labelledby","bar","toggle","role","tagName","carousel","drag","isNavigation","SLIDE","LOOP","FADE","Slide$1","slideIndex","Components","updateOnMove","slideFocus","isClone","container","slideLabel","listen","initNavigation","onMove","controls","splides","Slide2","splide","Slides","getAt","slideX","curr","updateActivity","updateVisibility","active","isActive","visible","isVisible","hidden","focusableNodes","activeElement","style$1","useContainer","cloneStatus","trackRect","slideRect","isWithin","diff","_EventInterface2","_Components2$Elements","Slides2","forEach$1","Slide1","excludeClones","getIn","Controller","toIndex","hasFocus","perPage","observeImages","remove$1","matcher","images","img","getLength","isEnough","Layout","_EventInterface3","_Components2$Elements2","styleSlides","vertical","rootRect","cssPadding","force","newRect","cssTrackHeight","gap","cssSlideWidth","cssSlideHeight","isOverflow","cssHeight","heightRatio","autoWidth","fixedWidth","cssSlideSize","fixedHeight","autoHeight","listSize","slideSize","withoutGap","Slide","getGap","totalSize","sliderSize","parseFloat","getPadding","MULTIPLIER","Clones","clones","cloneCount","remount","observe","computeCloneCount","generate","isHead","cloneDeep","clones2","fixedSize","fixedCount","Move","_EventInterface4","_Components2$Layout","_Components2$Directio","_Components2$Elements3","Transition","isBusy","Scroll","jump","move","dest","canShift","translate","shift","getPosition","toPosition","preventLoop","loop","exceededMax","getEnd","exceededMin","backwards","excess","getLimit","minDistance","Infinity","trimming","trimSpace","shifted","exceededLimit","_EventInterface5","_Components2$Slides","omitEnd","isLoop","isSlide","getNext","getAdjacent","getPrev","currIndex","endIndex","prevIndex","slideCount","perMove","onResized","go","control","allowSameIndex","parse","setIndex","snap","indicator","computeDestIndex","snapPage","computeMovableDestIndex","toPage","toDest","getIndex","waitForTransition","XML_NAME_SPACE","PATH","SIZE","Arrows","placeholder","wrapper","created","wrapperClasses","createArrows","createArrow","prev2","arrowPath","nextIndex","prevLabel","last","nextLabel","first","INTERVAL_DATA_ATTRIBUTE","Autoplay","_EventInterface6","onAnimationFrame","_Components2$Elements4","autoplay","hovered","focused","stopped","play","pauseOnHover","autoToggle","pauseOnFocus","resetProgress","stop","Cover","_EventInterface7","cover","cover2","BOUNCE_DIFF_THRESHOLD","BOUNCE_DURATION","FRICTION_FACTOR","BASE_VELOCITY","MIN_DURATION","_EventInterface8","friction","clear","onScrolled","noConstrain","noDistance","onEnd","to","easing","t","easingFunc","pow","SCROLL_LISTENER_OPTIONS","Drag","_EventInterface9","_Components2$Directio2","basePosition","baseEvent","prevBaseEvent","isFree","dragging","exceeded","clickPrevented","onPointerDown","disable","isTouch","isTouchEvent","isDraggable","button","onPointerMove","onPointerUp","cancelable","constrain","diffCoord","expired","diffTime","hasExceeded","isSliderDirection","shouldStart","velocity","computeVelocity","computeDestination","rewindByDrag","thresholds","dragMinThreshold","isObj","mouse","touch","flickPower","flickMaxPages","orthogonal","coordOf","getBaseEvent","changedTouches","target2","noDrag","TouchEvent","isDragging","NORMALIZATION_MAP","Spacebar","Right","Left","Up","Down","normalizeKey","KEYBOARD_EVENT","Keyboard","_EventInterface10","onKeydown","_disabled","SRC_DATA_ATTRIBUTE","SRCSET_DATA_ATTRIBUTE","IMAGE_SELECTOR","LazyLoad","_EventInterface11","isSequential","lazyLoad","entries","loadNext","srcset","preloadPages","load","onLoad","Pagination","paginationClasses","createPagination","getDirection","select","li","class","pageX","paginationKeyboard","dir","nextPage","paginationDirection","_button","TRIGGER_KEYS","Sync","isParent","sync","navigate","Wheel","_EventInterface12","lastTime","wheel","onWheel","deltaY","wheelMinThreshold","sleep","wheelSleep","shouldPrevent","releaseWheel","SR_REMOVAL_DELAY","Live","_EventInterface13","live","sr","ComponentConstructors","freeze","__proto__","I18N","DEFAULTS","speed","rewindSpeed","Fade","done","transition","endCallback","getSpeed","useScroll","_Splide","_o","_E","_proto","Extensions","_this","_C","_T","Constructors","Component","component","_this$event","Splide","router","path","pathname"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,59],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9lbnVtcy5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldE5vZGVOYW1lLmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0V2luZG93LmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvaW5zdGFuY2VPZi5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2FwcGx5U3R5bGVzLmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9tYXRoLmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy91c2VyQWdlbnQuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pc0xheW91dFZpZXdwb3J0LmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0TGF5b3V0UmVjdC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2NvbnRhaW5zLmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Q29tcHV0ZWRTdHlsZS5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2lzVGFibGVFbGVtZW50LmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRFbGVtZW50LmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0UGFyZW50Tm9kZS5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50LmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy93aXRoaW4uanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldEZyZXNoU2lkZU9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvbWVyZ2VQYWRkaW5nT2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9leHBhbmRUb0hhc2hNYXAuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9hcnJvdy5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0VmFyaWF0aW9uLmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvY29tcHV0ZVN0eWxlcy5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2V2ZW50TGlzdGVuZXJzLmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRPcHBvc2l0ZVBsYWNlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRXaW5kb3dTY3JvbGwuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRXaW5kb3dTY3JvbGxCYXJYLmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Vmlld3BvcnRSZWN0LmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRSZWN0LmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvaXNTY3JvbGxQYXJlbnQuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRTY3JvbGxQYXJlbnQuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9saXN0U2Nyb2xsUGFyZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvcmVjdFRvQ2xpZW50UmVjdC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldENsaXBwaW5nUmVjdC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvY29tcHV0ZU9mZnNldHMuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9jb21wdXRlQXV0b1BsYWNlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2ZsaXAuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9oaWRlLmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvb2Zmc2V0LmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvcG9wcGVyT2Zmc2V0cy5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0QWx0QXhpcy5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL3ByZXZlbnRPdmVyZmxvdy5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldEhUTUxFbGVtZW50U2Nyb2xsLmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Tm9kZVNjcm9sbC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldENvbXBvc2l0ZVJlY3QuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL29yZGVyTW9kaWZpZXJzLmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9kZWJvdW5jZS5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvbWVyZ2VCeU5hbWUuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2NyZWF0ZVBvcHBlci5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvcG9wcGVyLmpzIiwibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9kaXN0L2pzL2Jvb3RzdHJhcC5lc20uanMiLCJub2RlX21vZHVsZXMvdG9hc3RpZnktanMvc3JjL3RvYXN0aWZ5LmpzIiwiZGV2L3NjcmlwdHMvbW9kdWxlcy9Ub2FzdC50cyIsImRldi9zY3JpcHRzL3V0aWxzL2hlbHBlcnMudHMiLCJkZXYvc2NyaXB0cy9tb2R1bGVzL1Byb2R1Y3RNYW5hZ2VyLnRzIiwibm9kZV9tb2R1bGVzL0BzcGxpZGVqcy9zcGxpZGUvZGlzdC9qcy9zcGxpZGUuZXNtLmpzIiwiZGV2L3NjcmlwdHMvbWFpbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdmFyIHRvcCA9ICd0b3AnO1xuZXhwb3J0IHZhciBib3R0b20gPSAnYm90dG9tJztcbmV4cG9ydCB2YXIgcmlnaHQgPSAncmlnaHQnO1xuZXhwb3J0IHZhciBsZWZ0ID0gJ2xlZnQnO1xuZXhwb3J0IHZhciBhdXRvID0gJ2F1dG8nO1xuZXhwb3J0IHZhciBiYXNlUGxhY2VtZW50cyA9IFt0b3AsIGJvdHRvbSwgcmlnaHQsIGxlZnRdO1xuZXhwb3J0IHZhciBzdGFydCA9ICdzdGFydCc7XG5leHBvcnQgdmFyIGVuZCA9ICdlbmQnO1xuZXhwb3J0IHZhciBjbGlwcGluZ1BhcmVudHMgPSAnY2xpcHBpbmdQYXJlbnRzJztcbmV4cG9ydCB2YXIgdmlld3BvcnQgPSAndmlld3BvcnQnO1xuZXhwb3J0IHZhciBwb3BwZXIgPSAncG9wcGVyJztcbmV4cG9ydCB2YXIgcmVmZXJlbmNlID0gJ3JlZmVyZW5jZSc7XG5leHBvcnQgdmFyIHZhcmlhdGlvblBsYWNlbWVudHMgPSAvKiNfX1BVUkVfXyovYmFzZVBsYWNlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICByZXR1cm4gYWNjLmNvbmNhdChbcGxhY2VtZW50ICsgXCItXCIgKyBzdGFydCwgcGxhY2VtZW50ICsgXCItXCIgKyBlbmRdKTtcbn0sIFtdKTtcbmV4cG9ydCB2YXIgcGxhY2VtZW50cyA9IC8qI19fUFVSRV9fKi9bXS5jb25jYXQoYmFzZVBsYWNlbWVudHMsIFthdXRvXSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICByZXR1cm4gYWNjLmNvbmNhdChbcGxhY2VtZW50LCBwbGFjZW1lbnQgKyBcIi1cIiArIHN0YXJ0LCBwbGFjZW1lbnQgKyBcIi1cIiArIGVuZF0pO1xufSwgW10pOyAvLyBtb2RpZmllcnMgdGhhdCBuZWVkIHRvIHJlYWQgdGhlIERPTVxuXG5leHBvcnQgdmFyIGJlZm9yZVJlYWQgPSAnYmVmb3JlUmVhZCc7XG5leHBvcnQgdmFyIHJlYWQgPSAncmVhZCc7XG5leHBvcnQgdmFyIGFmdGVyUmVhZCA9ICdhZnRlclJlYWQnOyAvLyBwdXJlLWxvZ2ljIG1vZGlmaWVyc1xuXG5leHBvcnQgdmFyIGJlZm9yZU1haW4gPSAnYmVmb3JlTWFpbic7XG5leHBvcnQgdmFyIG1haW4gPSAnbWFpbic7XG5leHBvcnQgdmFyIGFmdGVyTWFpbiA9ICdhZnRlck1haW4nOyAvLyBtb2RpZmllciB3aXRoIHRoZSBwdXJwb3NlIHRvIHdyaXRlIHRvIHRoZSBET00gKG9yIHdyaXRlIGludG8gYSBmcmFtZXdvcmsgc3RhdGUpXG5cbmV4cG9ydCB2YXIgYmVmb3JlV3JpdGUgPSAnYmVmb3JlV3JpdGUnO1xuZXhwb3J0IHZhciB3cml0ZSA9ICd3cml0ZSc7XG5leHBvcnQgdmFyIGFmdGVyV3JpdGUgPSAnYWZ0ZXJXcml0ZSc7XG5leHBvcnQgdmFyIG1vZGlmaWVyUGhhc2VzID0gW2JlZm9yZVJlYWQsIHJlYWQsIGFmdGVyUmVhZCwgYmVmb3JlTWFpbiwgbWFpbiwgYWZ0ZXJNYWluLCBiZWZvcmVXcml0ZSwgd3JpdGUsIGFmdGVyV3JpdGVdOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE5vZGVOYW1lKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGVsZW1lbnQgPyAoZWxlbWVudC5ub2RlTmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKSA6IG51bGw7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0V2luZG93KG5vZGUpIHtcbiAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgIHJldHVybiB3aW5kb3c7XG4gIH1cblxuICBpZiAobm9kZS50b1N0cmluZygpICE9PSAnW29iamVjdCBXaW5kb3ddJykge1xuICAgIHZhciBvd25lckRvY3VtZW50ID0gbm9kZS5vd25lckRvY3VtZW50O1xuICAgIHJldHVybiBvd25lckRvY3VtZW50ID8gb3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3cgOiB3aW5kb3c7XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn0iLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuXG5mdW5jdGlvbiBpc0VsZW1lbnQobm9kZSkge1xuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5FbGVtZW50O1xuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIE93bkVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGlzSFRNTEVsZW1lbnQobm9kZSkge1xuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5IVE1MRWxlbWVudDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudDtcbn1cblxuZnVuY3Rpb24gaXNTaGFkb3dSb290KG5vZGUpIHtcbiAgLy8gSUUgMTEgaGFzIG5vIFNoYWRvd1Jvb3RcbiAgaWYgKHR5cGVvZiBTaGFkb3dSb290ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBPd25FbGVtZW50ID0gZ2V0V2luZG93KG5vZGUpLlNoYWRvd1Jvb3Q7XG4gIHJldHVybiBub2RlIGluc3RhbmNlb2YgT3duRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdDtcbn1cblxuZXhwb3J0IHsgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50LCBpc1NoYWRvd1Jvb3QgfTsiLCJpbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4uL2RvbS11dGlscy9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuLi9kb20tdXRpbHMvaW5zdGFuY2VPZi5qc1wiOyAvLyBUaGlzIG1vZGlmaWVyIHRha2VzIHRoZSBzdHlsZXMgcHJlcGFyZWQgYnkgdGhlIGBjb21wdXRlU3R5bGVzYCBtb2RpZmllclxuLy8gYW5kIGFwcGxpZXMgdGhlbSB0byB0aGUgSFRNTEVsZW1lbnRzIHN1Y2ggYXMgcG9wcGVyIGFuZCBhcnJvd1xuXG5mdW5jdGlvbiBhcHBseVN0eWxlcyhfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGU7XG4gIE9iamVjdC5rZXlzKHN0YXRlLmVsZW1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdmFyIHN0eWxlID0gc3RhdGUuc3R5bGVzW25hbWVdIHx8IHt9O1xuICAgIHZhciBhdHRyaWJ1dGVzID0gc3RhdGUuYXR0cmlidXRlc1tuYW1lXSB8fCB7fTtcbiAgICB2YXIgZWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzW25hbWVdOyAvLyBhcnJvdyBpcyBvcHRpb25hbCArIHZpcnR1YWwgZWxlbWVudHNcblxuICAgIGlmICghaXNIVE1MRWxlbWVudChlbGVtZW50KSB8fCAhZ2V0Tm9kZU5hbWUoZWxlbWVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIEZsb3cgZG9lc24ndCBzdXBwb3J0IHRvIGV4dGVuZCB0aGlzIHByb3BlcnR5LCBidXQgaXQncyB0aGUgbW9zdFxuICAgIC8vIGVmZmVjdGl2ZSB3YXkgdG8gYXBwbHkgc3R5bGVzIHRvIGFuIEhUTUxFbGVtZW50XG4gICAgLy8gJEZsb3dGaXhNZVtjYW5ub3Qtd3JpdGVdXG5cblxuICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgc3R5bGUpO1xuICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGF0dHJpYnV0ZXNbbmFtZV07XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSA9PT0gdHJ1ZSA/ICcnIDogdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZWZmZWN0KF9yZWYyKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYyLnN0YXRlO1xuICB2YXIgaW5pdGlhbFN0eWxlcyA9IHtcbiAgICBwb3BwZXI6IHtcbiAgICAgIHBvc2l0aW9uOiBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgbGVmdDogJzAnLFxuICAgICAgdG9wOiAnMCcsXG4gICAgICBtYXJnaW46ICcwJ1xuICAgIH0sXG4gICAgYXJyb3c6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnXG4gICAgfSxcbiAgICByZWZlcmVuY2U6IHt9XG4gIH07XG4gIE9iamVjdC5hc3NpZ24oc3RhdGUuZWxlbWVudHMucG9wcGVyLnN0eWxlLCBpbml0aWFsU3R5bGVzLnBvcHBlcik7XG4gIHN0YXRlLnN0eWxlcyA9IGluaXRpYWxTdHlsZXM7XG5cbiAgaWYgKHN0YXRlLmVsZW1lbnRzLmFycm93KSB7XG4gICAgT2JqZWN0LmFzc2lnbihzdGF0ZS5lbGVtZW50cy5hcnJvdy5zdHlsZSwgaW5pdGlhbFN0eWxlcy5hcnJvdyk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIE9iamVjdC5rZXlzKHN0YXRlLmVsZW1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICB2YXIgZWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzW25hbWVdO1xuICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBzdGF0ZS5hdHRyaWJ1dGVzW25hbWVdIHx8IHt9O1xuICAgICAgdmFyIHN0eWxlUHJvcGVydGllcyA9IE9iamVjdC5rZXlzKHN0YXRlLnN0eWxlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSA/IHN0YXRlLnN0eWxlc1tuYW1lXSA6IGluaXRpYWxTdHlsZXNbbmFtZV0pOyAvLyBTZXQgYWxsIHZhbHVlcyB0byBhbiBlbXB0eSBzdHJpbmcgdG8gdW5zZXQgdGhlbVxuXG4gICAgICB2YXIgc3R5bGUgPSBzdHlsZVByb3BlcnRpZXMucmVkdWNlKGZ1bmN0aW9uIChzdHlsZSwgcHJvcGVydHkpIHtcbiAgICAgICAgc3R5bGVbcHJvcGVydHldID0gJyc7XG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICAgIH0sIHt9KTsgLy8gYXJyb3cgaXMgb3B0aW9uYWwgKyB2aXJ0dWFsIGVsZW1lbnRzXG5cbiAgICAgIGlmICghaXNIVE1MRWxlbWVudChlbGVtZW50KSB8fCAhZ2V0Tm9kZU5hbWUoZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlKTtcbiAgICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZSkge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdhcHBseVN0eWxlcycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnd3JpdGUnLFxuICBmbjogYXBwbHlTdHlsZXMsXG4gIGVmZmVjdDogZWZmZWN0LFxuICByZXF1aXJlczogWydjb21wdXRlU3R5bGVzJ11cbn07IiwiaW1wb3J0IHsgYXV0byB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xufSIsImV4cG9ydCB2YXIgbWF4ID0gTWF0aC5tYXg7XG5leHBvcnQgdmFyIG1pbiA9IE1hdGgubWluO1xuZXhwb3J0IHZhciByb3VuZCA9IE1hdGgucm91bmQ7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0VUFTdHJpbmcoKSB7XG4gIHZhciB1YURhdGEgPSBuYXZpZ2F0b3IudXNlckFnZW50RGF0YTtcblxuICBpZiAodWFEYXRhICE9IG51bGwgJiYgdWFEYXRhLmJyYW5kcyAmJiBBcnJheS5pc0FycmF5KHVhRGF0YS5icmFuZHMpKSB7XG4gICAgcmV0dXJuIHVhRGF0YS5icmFuZHMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gaXRlbS5icmFuZCArIFwiL1wiICsgaXRlbS52ZXJzaW9uO1xuICAgIH0pLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50O1xufSIsImltcG9ydCBnZXRVQVN0cmluZyBmcm9tIFwiLi4vdXRpbHMvdXNlckFnZW50LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0xheW91dFZpZXdwb3J0KCkge1xuICByZXR1cm4gIS9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QoZ2V0VUFTdHJpbmcoKSk7XG59IiwiaW1wb3J0IHsgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBpc0xheW91dFZpZXdwb3J0IGZyb20gXCIuL2lzTGF5b3V0Vmlld3BvcnQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50LCBpbmNsdWRlU2NhbGUsIGlzRml4ZWRTdHJhdGVneSkge1xuICBpZiAoaW5jbHVkZVNjYWxlID09PSB2b2lkIDApIHtcbiAgICBpbmNsdWRlU2NhbGUgPSBmYWxzZTtcbiAgfVxuXG4gIGlmIChpc0ZpeGVkU3RyYXRlZ3kgPT09IHZvaWQgMCkge1xuICAgIGlzRml4ZWRTdHJhdGVneSA9IGZhbHNlO1xuICB9XG5cbiAgdmFyIGNsaWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgc2NhbGVYID0gMTtcbiAgdmFyIHNjYWxlWSA9IDE7XG5cbiAgaWYgKGluY2x1ZGVTY2FsZSAmJiBpc0hUTUxFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgc2NhbGVYID0gZWxlbWVudC5vZmZzZXRXaWR0aCA+IDAgPyByb3VuZChjbGllbnRSZWN0LndpZHRoKSAvIGVsZW1lbnQub2Zmc2V0V2lkdGggfHwgMSA6IDE7XG4gICAgc2NhbGVZID0gZWxlbWVudC5vZmZzZXRIZWlnaHQgPiAwID8gcm91bmQoY2xpZW50UmVjdC5oZWlnaHQpIC8gZWxlbWVudC5vZmZzZXRIZWlnaHQgfHwgMSA6IDE7XG4gIH1cblxuICB2YXIgX3JlZiA9IGlzRWxlbWVudChlbGVtZW50KSA/IGdldFdpbmRvdyhlbGVtZW50KSA6IHdpbmRvdyxcbiAgICAgIHZpc3VhbFZpZXdwb3J0ID0gX3JlZi52aXN1YWxWaWV3cG9ydDtcblxuICB2YXIgYWRkVmlzdWFsT2Zmc2V0cyA9ICFpc0xheW91dFZpZXdwb3J0KCkgJiYgaXNGaXhlZFN0cmF0ZWd5O1xuICB2YXIgeCA9IChjbGllbnRSZWN0LmxlZnQgKyAoYWRkVmlzdWFsT2Zmc2V0cyAmJiB2aXN1YWxWaWV3cG9ydCA/IHZpc3VhbFZpZXdwb3J0Lm9mZnNldExlZnQgOiAwKSkgLyBzY2FsZVg7XG4gIHZhciB5ID0gKGNsaWVudFJlY3QudG9wICsgKGFkZFZpc3VhbE9mZnNldHMgJiYgdmlzdWFsVmlld3BvcnQgPyB2aXN1YWxWaWV3cG9ydC5vZmZzZXRUb3AgOiAwKSkgLyBzY2FsZVk7XG4gIHZhciB3aWR0aCA9IGNsaWVudFJlY3Qud2lkdGggLyBzY2FsZVg7XG4gIHZhciBoZWlnaHQgPSBjbGllbnRSZWN0LmhlaWdodCAvIHNjYWxlWTtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgdG9wOiB5LFxuICAgIHJpZ2h0OiB4ICsgd2lkdGgsXG4gICAgYm90dG9tOiB5ICsgaGVpZ2h0LFxuICAgIGxlZnQ6IHgsXG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH07XG59IiwiaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjsgLy8gUmV0dXJucyB0aGUgbGF5b3V0IHJlY3Qgb2YgYW4gZWxlbWVudCByZWxhdGl2ZSB0byBpdHMgb2Zmc2V0UGFyZW50LiBMYXlvdXRcbi8vIG1lYW5zIGl0IGRvZXNuJ3QgdGFrZSBpbnRvIGFjY291bnQgdHJhbnNmb3Jtcy5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0TGF5b3V0UmVjdChlbGVtZW50KSB7XG4gIHZhciBjbGllbnRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQpOyAvLyBVc2UgdGhlIGNsaWVudFJlY3Qgc2l6ZXMgaWYgaXQncyBub3QgYmVlbiB0cmFuc2Zvcm1lZC5cbiAgLy8gRml4ZXMgaHR0cHM6Ly9naXRodWIuY29tL3BvcHBlcmpzL3BvcHBlci1jb3JlL2lzc3Vlcy8xMjIzXG5cbiAgdmFyIHdpZHRoID0gZWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgdmFyIGhlaWdodCA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuXG4gIGlmIChNYXRoLmFicyhjbGllbnRSZWN0LndpZHRoIC0gd2lkdGgpIDw9IDEpIHtcbiAgICB3aWR0aCA9IGNsaWVudFJlY3Qud2lkdGg7XG4gIH1cblxuICBpZiAoTWF0aC5hYnMoY2xpZW50UmVjdC5oZWlnaHQgLSBoZWlnaHQpIDw9IDEpIHtcbiAgICBoZWlnaHQgPSBjbGllbnRSZWN0LmhlaWdodDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgeDogZWxlbWVudC5vZmZzZXRMZWZ0LFxuICAgIHk6IGVsZW1lbnQub2Zmc2V0VG9wLFxuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodFxuICB9O1xufSIsImltcG9ydCB7IGlzU2hhZG93Um9vdCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbnRhaW5zKHBhcmVudCwgY2hpbGQpIHtcbiAgdmFyIHJvb3ROb2RlID0gY2hpbGQuZ2V0Um9vdE5vZGUgJiYgY2hpbGQuZ2V0Um9vdE5vZGUoKTsgLy8gRmlyc3QsIGF0dGVtcHQgd2l0aCBmYXN0ZXIgbmF0aXZlIG1ldGhvZFxuXG4gIGlmIChwYXJlbnQuY29udGFpbnMoY2hpbGQpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gdGhlbiBmYWxsYmFjayB0byBjdXN0b20gaW1wbGVtZW50YXRpb24gd2l0aCBTaGFkb3cgRE9NIHN1cHBvcnRcbiAgZWxzZSBpZiAocm9vdE5vZGUgJiYgaXNTaGFkb3dSb290KHJvb3ROb2RlKSkge1xuICAgICAgdmFyIG5leHQgPSBjaGlsZDtcblxuICAgICAgZG8ge1xuICAgICAgICBpZiAobmV4dCAmJiBwYXJlbnQuaXNTYW1lTm9kZShuZXh0KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXTogbmVlZCBhIGJldHRlciB3YXkgdG8gaGFuZGxlIHRoaXMuLi5cblxuXG4gICAgICAgIG5leHQgPSBuZXh0LnBhcmVudE5vZGUgfHwgbmV4dC5ob3N0O1xuICAgICAgfSB3aGlsZSAobmV4dCk7XG4gICAgfSAvLyBHaXZlIHVwLCB0aGUgcmVzdWx0IGlzIGZhbHNlXG5cblxuICByZXR1cm4gZmFsc2U7XG59IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkge1xuICByZXR1cm4gZ2V0V2luZG93KGVsZW1lbnQpLmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG59IiwiaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1RhYmxlRWxlbWVudChlbGVtZW50KSB7XG4gIHJldHVybiBbJ3RhYmxlJywgJ3RkJywgJ3RoJ10uaW5kZXhPZihnZXROb2RlTmFtZShlbGVtZW50KSkgPj0gMDtcbn0iLCJpbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkge1xuICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dOiBhc3N1bWUgYm9keSBpcyBhbHdheXMgYXZhaWxhYmxlXG4gIHJldHVybiAoKGlzRWxlbWVudChlbGVtZW50KSA/IGVsZW1lbnQub3duZXJEb2N1bWVudCA6IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICBlbGVtZW50LmRvY3VtZW50KSB8fCB3aW5kb3cuZG9jdW1lbnQpLmRvY3VtZW50RWxlbWVudDtcbn0iLCJpbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgeyBpc1NoYWRvd1Jvb3QgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRQYXJlbnROb2RlKGVsZW1lbnQpIHtcbiAgaWYgKGdldE5vZGVOYW1lKGVsZW1lbnQpID09PSAnaHRtbCcpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHJldHVybiAoLy8gdGhpcyBpcyBhIHF1aWNrZXIgKGJ1dCBsZXNzIHR5cGUgc2FmZSkgd2F5IHRvIHNhdmUgcXVpdGUgc29tZSBieXRlcyBmcm9tIHRoZSBidW5kbGVcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dXG4gICAgLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG4gICAgZWxlbWVudC5hc3NpZ25lZFNsb3QgfHwgLy8gc3RlcCBpbnRvIHRoZSBzaGFkb3cgRE9NIG9mIHRoZSBwYXJlbnQgb2YgYSBzbG90dGVkIG5vZGVcbiAgICBlbGVtZW50LnBhcmVudE5vZGUgfHwgKCAvLyBET00gRWxlbWVudCBkZXRlY3RlZFxuICAgIGlzU2hhZG93Um9vdChlbGVtZW50KSA/IGVsZW1lbnQuaG9zdCA6IG51bGwpIHx8IC8vIFNoYWRvd1Jvb3QgZGV0ZWN0ZWRcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYWxsXTogSFRNTEVsZW1lbnQgaXMgYSBOb2RlXG4gICAgZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpIC8vIGZhbGxiYWNrXG5cbiAgKTtcbn0iLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50LCBpc1NoYWRvd1Jvb3QgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgaXNUYWJsZUVsZW1lbnQgZnJvbSBcIi4vaXNUYWJsZUVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcbmltcG9ydCBnZXRVQVN0cmluZyBmcm9tIFwiLi4vdXRpbHMvdXNlckFnZW50LmpzXCI7XG5cbmZ1bmN0aW9uIGdldFRydWVPZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BvcHBlcmpzL3BvcHBlci1jb3JlL2lzc3Vlcy84MzdcbiAgZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbiA9PT0gJ2ZpeGVkJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQub2Zmc2V0UGFyZW50O1xufSAvLyBgLm9mZnNldFBhcmVudGAgcmVwb3J0cyBgbnVsbGAgZm9yIGZpeGVkIGVsZW1lbnRzLCB3aGlsZSBhYnNvbHV0ZSBlbGVtZW50c1xuLy8gcmV0dXJuIHRoZSBjb250YWluaW5nIGJsb2NrXG5cblxuZnVuY3Rpb24gZ2V0Q29udGFpbmluZ0Jsb2NrKGVsZW1lbnQpIHtcbiAgdmFyIGlzRmlyZWZveCA9IC9maXJlZm94L2kudGVzdChnZXRVQVN0cmluZygpKTtcbiAgdmFyIGlzSUUgPSAvVHJpZGVudC9pLnRlc3QoZ2V0VUFTdHJpbmcoKSk7XG5cbiAgaWYgKGlzSUUgJiYgaXNIVE1MRWxlbWVudChlbGVtZW50KSkge1xuICAgIC8vIEluIElFIDksIDEwIGFuZCAxMSBmaXhlZCBlbGVtZW50cyBjb250YWluaW5nIGJsb2NrIGlzIGFsd2F5cyBlc3RhYmxpc2hlZCBieSB0aGUgdmlld3BvcnRcbiAgICB2YXIgZWxlbWVudENzcyA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG5cbiAgICBpZiAoZWxlbWVudENzcy5wb3NpdGlvbiA9PT0gJ2ZpeGVkJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgdmFyIGN1cnJlbnROb2RlID0gZ2V0UGFyZW50Tm9kZShlbGVtZW50KTtcblxuICBpZiAoaXNTaGFkb3dSb290KGN1cnJlbnROb2RlKSkge1xuICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuaG9zdDtcbiAgfVxuXG4gIHdoaWxlIChpc0hUTUxFbGVtZW50KGN1cnJlbnROb2RlKSAmJiBbJ2h0bWwnLCAnYm9keSddLmluZGV4T2YoZ2V0Tm9kZU5hbWUoY3VycmVudE5vZGUpKSA8IDApIHtcbiAgICB2YXIgY3NzID0gZ2V0Q29tcHV0ZWRTdHlsZShjdXJyZW50Tm9kZSk7IC8vIFRoaXMgaXMgbm9uLWV4aGF1c3RpdmUgYnV0IGNvdmVycyB0aGUgbW9zdCBjb21tb24gQ1NTIHByb3BlcnRpZXMgdGhhdFxuICAgIC8vIGNyZWF0ZSBhIGNvbnRhaW5pbmcgYmxvY2suXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NvbnRhaW5pbmdfYmxvY2sjaWRlbnRpZnlpbmdfdGhlX2NvbnRhaW5pbmdfYmxvY2tcblxuICAgIGlmIChjc3MudHJhbnNmb3JtICE9PSAnbm9uZScgfHwgY3NzLnBlcnNwZWN0aXZlICE9PSAnbm9uZScgfHwgY3NzLmNvbnRhaW4gPT09ICdwYWludCcgfHwgWyd0cmFuc2Zvcm0nLCAncGVyc3BlY3RpdmUnXS5pbmRleE9mKGNzcy53aWxsQ2hhbmdlKSAhPT0gLTEgfHwgaXNGaXJlZm94ICYmIGNzcy53aWxsQ2hhbmdlID09PSAnZmlsdGVyJyB8fCBpc0ZpcmVmb3ggJiYgY3NzLmZpbHRlciAmJiBjc3MuZmlsdGVyICE9PSAnbm9uZScpIHtcbiAgICAgIHJldHVybiBjdXJyZW50Tm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufSAvLyBHZXRzIHRoZSBjbG9zZXN0IGFuY2VzdG9yIHBvc2l0aW9uZWQgZWxlbWVudC4gSGFuZGxlcyBzb21lIGVkZ2UgY2FzZXMsXG4vLyBzdWNoIGFzIHRhYmxlIGFuY2VzdG9ycyBhbmQgY3Jvc3MgYnJvd3NlciBidWdzLlxuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9mZnNldFBhcmVudChlbGVtZW50KSB7XG4gIHZhciB3aW5kb3cgPSBnZXRXaW5kb3coZWxlbWVudCk7XG4gIHZhciBvZmZzZXRQYXJlbnQgPSBnZXRUcnVlT2Zmc2V0UGFyZW50KGVsZW1lbnQpO1xuXG4gIHdoaWxlIChvZmZzZXRQYXJlbnQgJiYgaXNUYWJsZUVsZW1lbnQob2Zmc2V0UGFyZW50KSAmJiBnZXRDb21wdXRlZFN0eWxlKG9mZnNldFBhcmVudCkucG9zaXRpb24gPT09ICdzdGF0aWMnKSB7XG4gICAgb2Zmc2V0UGFyZW50ID0gZ2V0VHJ1ZU9mZnNldFBhcmVudChvZmZzZXRQYXJlbnQpO1xuICB9XG5cbiAgaWYgKG9mZnNldFBhcmVudCAmJiAoZ2V0Tm9kZU5hbWUob2Zmc2V0UGFyZW50KSA9PT0gJ2h0bWwnIHx8IGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgPT09ICdib2R5JyAmJiBnZXRDb21wdXRlZFN0eWxlKG9mZnNldFBhcmVudCkucG9zaXRpb24gPT09ICdzdGF0aWMnKSkge1xuICAgIHJldHVybiB3aW5kb3c7XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50KSB8fCB3aW5kb3c7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gWyd0b3AnLCAnYm90dG9tJ10uaW5kZXhPZihwbGFjZW1lbnQpID49IDAgPyAneCcgOiAneSc7XG59IiwiaW1wb3J0IHsgbWF4IGFzIG1hdGhNYXgsIG1pbiBhcyBtYXRoTWluIH0gZnJvbSBcIi4vbWF0aC5qc1wiO1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhpbihtaW4sIHZhbHVlLCBtYXgpIHtcbiAgcmV0dXJuIG1hdGhNYXgobWluLCBtYXRoTWluKHZhbHVlLCBtYXgpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3aXRoaW5NYXhDbGFtcChtaW4sIHZhbHVlLCBtYXgpIHtcbiAgdmFyIHYgPSB3aXRoaW4obWluLCB2YWx1ZSwgbWF4KTtcbiAgcmV0dXJuIHYgPiBtYXggPyBtYXggOiB2O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEZyZXNoU2lkZU9iamVjdCgpIHtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IDAsXG4gICAgcmlnaHQ6IDAsXG4gICAgYm90dG9tOiAwLFxuICAgIGxlZnQ6IDBcbiAgfTtcbn0iLCJpbXBvcnQgZ2V0RnJlc2hTaWRlT2JqZWN0IGZyb20gXCIuL2dldEZyZXNoU2lkZU9iamVjdC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWVyZ2VQYWRkaW5nT2JqZWN0KHBhZGRpbmdPYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGdldEZyZXNoU2lkZU9iamVjdCgpLCBwYWRkaW5nT2JqZWN0KTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBleHBhbmRUb0hhc2hNYXAodmFsdWUsIGtleXMpIHtcbiAgcmV0dXJuIGtleXMucmVkdWNlKGZ1bmN0aW9uIChoYXNoTWFwLCBrZXkpIHtcbiAgICBoYXNoTWFwW2tleV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gaGFzaE1hcDtcbiAgfSwge30pO1xufSIsImltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0TGF5b3V0UmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldExheW91dFJlY3QuanNcIjtcbmltcG9ydCBjb250YWlucyBmcm9tIFwiLi4vZG9tLXV0aWxzL2NvbnRhaW5zLmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanNcIjtcbmltcG9ydCB7IHdpdGhpbiB9IGZyb20gXCIuLi91dGlscy93aXRoaW4uanNcIjtcbmltcG9ydCBtZXJnZVBhZGRpbmdPYmplY3QgZnJvbSBcIi4uL3V0aWxzL21lcmdlUGFkZGluZ09iamVjdC5qc1wiO1xuaW1wb3J0IGV4cGFuZFRvSGFzaE1hcCBmcm9tIFwiLi4vdXRpbHMvZXhwYW5kVG9IYXNoTWFwLmpzXCI7XG5pbXBvcnQgeyBsZWZ0LCByaWdodCwgYmFzZVBsYWNlbWVudHMsIHRvcCwgYm90dG9tIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxudmFyIHRvUGFkZGluZ09iamVjdCA9IGZ1bmN0aW9uIHRvUGFkZGluZ09iamVjdChwYWRkaW5nLCBzdGF0ZSkge1xuICBwYWRkaW5nID0gdHlwZW9mIHBhZGRpbmcgPT09ICdmdW5jdGlvbicgPyBwYWRkaW5nKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnJlY3RzLCB7XG4gICAgcGxhY2VtZW50OiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSkpIDogcGFkZGluZztcbiAgcmV0dXJuIG1lcmdlUGFkZGluZ09iamVjdCh0eXBlb2YgcGFkZGluZyAhPT0gJ251bWJlcicgPyBwYWRkaW5nIDogZXhwYW5kVG9IYXNoTWFwKHBhZGRpbmcsIGJhc2VQbGFjZW1lbnRzKSk7XG59O1xuXG5mdW5jdGlvbiBhcnJvdyhfcmVmKSB7XG4gIHZhciBfc3RhdGUkbW9kaWZpZXJzRGF0YSQ7XG5cbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWUsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zO1xuICB2YXIgYXJyb3dFbGVtZW50ID0gc3RhdGUuZWxlbWVudHMuYXJyb3c7XG4gIHZhciBwb3BwZXJPZmZzZXRzID0gc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzO1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQoc3RhdGUucGxhY2VtZW50KTtcbiAgdmFyIGF4aXMgPSBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQoYmFzZVBsYWNlbWVudCk7XG4gIHZhciBpc1ZlcnRpY2FsID0gW2xlZnQsIHJpZ2h0XS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpID49IDA7XG4gIHZhciBsZW4gPSBpc1ZlcnRpY2FsID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuXG4gIGlmICghYXJyb3dFbGVtZW50IHx8ICFwb3BwZXJPZmZzZXRzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHBhZGRpbmdPYmplY3QgPSB0b1BhZGRpbmdPYmplY3Qob3B0aW9ucy5wYWRkaW5nLCBzdGF0ZSk7XG4gIHZhciBhcnJvd1JlY3QgPSBnZXRMYXlvdXRSZWN0KGFycm93RWxlbWVudCk7XG4gIHZhciBtaW5Qcm9wID0gYXhpcyA9PT0gJ3knID8gdG9wIDogbGVmdDtcbiAgdmFyIG1heFByb3AgPSBheGlzID09PSAneScgPyBib3R0b20gOiByaWdodDtcbiAgdmFyIGVuZERpZmYgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2VbbGVuXSArIHN0YXRlLnJlY3RzLnJlZmVyZW5jZVtheGlzXSAtIHBvcHBlck9mZnNldHNbYXhpc10gLSBzdGF0ZS5yZWN0cy5wb3BwZXJbbGVuXTtcbiAgdmFyIHN0YXJ0RGlmZiA9IHBvcHBlck9mZnNldHNbYXhpc10gLSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2VbYXhpc107XG4gIHZhciBhcnJvd09mZnNldFBhcmVudCA9IGdldE9mZnNldFBhcmVudChhcnJvd0VsZW1lbnQpO1xuICB2YXIgY2xpZW50U2l6ZSA9IGFycm93T2Zmc2V0UGFyZW50ID8gYXhpcyA9PT0gJ3knID8gYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50SGVpZ2h0IHx8IDAgOiBhcnJvd09mZnNldFBhcmVudC5jbGllbnRXaWR0aCB8fCAwIDogMDtcbiAgdmFyIGNlbnRlclRvUmVmZXJlbmNlID0gZW5kRGlmZiAvIDIgLSBzdGFydERpZmYgLyAyOyAvLyBNYWtlIHN1cmUgdGhlIGFycm93IGRvZXNuJ3Qgb3ZlcmZsb3cgdGhlIHBvcHBlciBpZiB0aGUgY2VudGVyIHBvaW50IGlzXG4gIC8vIG91dHNpZGUgb2YgdGhlIHBvcHBlciBib3VuZHNcblxuICB2YXIgbWluID0gcGFkZGluZ09iamVjdFttaW5Qcm9wXTtcbiAgdmFyIG1heCA9IGNsaWVudFNpemUgLSBhcnJvd1JlY3RbbGVuXSAtIHBhZGRpbmdPYmplY3RbbWF4UHJvcF07XG4gIHZhciBjZW50ZXIgPSBjbGllbnRTaXplIC8gMiAtIGFycm93UmVjdFtsZW5dIC8gMiArIGNlbnRlclRvUmVmZXJlbmNlO1xuICB2YXIgb2Zmc2V0ID0gd2l0aGluKG1pbiwgY2VudGVyLCBtYXgpOyAvLyBQcmV2ZW50cyBicmVha2luZyBzeW50YXggaGlnaGxpZ2h0aW5nLi4uXG5cbiAgdmFyIGF4aXNQcm9wID0gYXhpcztcbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IChfc3RhdGUkbW9kaWZpZXJzRGF0YSQgPSB7fSwgX3N0YXRlJG1vZGlmaWVyc0RhdGEkW2F4aXNQcm9wXSA9IG9mZnNldCwgX3N0YXRlJG1vZGlmaWVyc0RhdGEkLmNlbnRlck9mZnNldCA9IG9mZnNldCAtIGNlbnRlciwgX3N0YXRlJG1vZGlmaWVyc0RhdGEkKTtcbn1cblxuZnVuY3Rpb24gZWZmZWN0KF9yZWYyKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYyLnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYyLm9wdGlvbnM7XG4gIHZhciBfb3B0aW9ucyRlbGVtZW50ID0gb3B0aW9ucy5lbGVtZW50LFxuICAgICAgYXJyb3dFbGVtZW50ID0gX29wdGlvbnMkZWxlbWVudCA9PT0gdm9pZCAwID8gJ1tkYXRhLXBvcHBlci1hcnJvd10nIDogX29wdGlvbnMkZWxlbWVudDtcblxuICBpZiAoYXJyb3dFbGVtZW50ID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gQ1NTIHNlbGVjdG9yXG5cblxuICBpZiAodHlwZW9mIGFycm93RWxlbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICBhcnJvd0VsZW1lbnQgPSBzdGF0ZS5lbGVtZW50cy5wb3BwZXIucXVlcnlTZWxlY3RvcihhcnJvd0VsZW1lbnQpO1xuXG4gICAgaWYgKCFhcnJvd0VsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbnRhaW5zKHN0YXRlLmVsZW1lbnRzLnBvcHBlciwgYXJyb3dFbGVtZW50KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHN0YXRlLmVsZW1lbnRzLmFycm93ID0gYXJyb3dFbGVtZW50O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnYXJyb3cnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogYXJyb3csXG4gIGVmZmVjdDogZWZmZWN0LFxuICByZXF1aXJlczogWydwb3BwZXJPZmZzZXRzJ10sXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsncHJldmVudE92ZXJmbG93J11cbn07IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnNwbGl0KCctJylbMV07XG59IiwiaW1wb3J0IHsgdG9wLCBsZWZ0LCByaWdodCwgYm90dG9tLCBlbmQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4uL3V0aWxzL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbnZhciB1bnNldFNpZGVzID0ge1xuICB0b3A6ICdhdXRvJyxcbiAgcmlnaHQ6ICdhdXRvJyxcbiAgYm90dG9tOiAnYXV0bycsXG4gIGxlZnQ6ICdhdXRvJ1xufTsgLy8gUm91bmQgdGhlIG9mZnNldHMgdG8gdGhlIG5lYXJlc3Qgc3VpdGFibGUgc3VicGl4ZWwgYmFzZWQgb24gdGhlIERQUi5cbi8vIFpvb21pbmcgY2FuIGNoYW5nZSB0aGUgRFBSLCBidXQgaXQgc2VlbXMgdG8gcmVwb3J0IGEgdmFsdWUgdGhhdCB3aWxsXG4vLyBjbGVhbmx5IGRpdmlkZSB0aGUgdmFsdWVzIGludG8gdGhlIGFwcHJvcHJpYXRlIHN1YnBpeGVscy5cblxuZnVuY3Rpb24gcm91bmRPZmZzZXRzQnlEUFIoX3JlZiwgd2luKSB7XG4gIHZhciB4ID0gX3JlZi54LFxuICAgICAgeSA9IF9yZWYueTtcbiAgdmFyIGRwciA9IHdpbi5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gIHJldHVybiB7XG4gICAgeDogcm91bmQoeCAqIGRwcikgLyBkcHIgfHwgMCxcbiAgICB5OiByb3VuZCh5ICogZHByKSAvIGRwciB8fCAwXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXBUb1N0eWxlcyhfcmVmMikge1xuICB2YXIgX09iamVjdCRhc3NpZ24yO1xuXG4gIHZhciBwb3BwZXIgPSBfcmVmMi5wb3BwZXIsXG4gICAgICBwb3BwZXJSZWN0ID0gX3JlZjIucG9wcGVyUmVjdCxcbiAgICAgIHBsYWNlbWVudCA9IF9yZWYyLnBsYWNlbWVudCxcbiAgICAgIHZhcmlhdGlvbiA9IF9yZWYyLnZhcmlhdGlvbixcbiAgICAgIG9mZnNldHMgPSBfcmVmMi5vZmZzZXRzLFxuICAgICAgcG9zaXRpb24gPSBfcmVmMi5wb3NpdGlvbixcbiAgICAgIGdwdUFjY2VsZXJhdGlvbiA9IF9yZWYyLmdwdUFjY2VsZXJhdGlvbixcbiAgICAgIGFkYXB0aXZlID0gX3JlZjIuYWRhcHRpdmUsXG4gICAgICByb3VuZE9mZnNldHMgPSBfcmVmMi5yb3VuZE9mZnNldHMsXG4gICAgICBpc0ZpeGVkID0gX3JlZjIuaXNGaXhlZDtcbiAgdmFyIF9vZmZzZXRzJHggPSBvZmZzZXRzLngsXG4gICAgICB4ID0gX29mZnNldHMkeCA9PT0gdm9pZCAwID8gMCA6IF9vZmZzZXRzJHgsXG4gICAgICBfb2Zmc2V0cyR5ID0gb2Zmc2V0cy55LFxuICAgICAgeSA9IF9vZmZzZXRzJHkgPT09IHZvaWQgMCA/IDAgOiBfb2Zmc2V0cyR5O1xuXG4gIHZhciBfcmVmMyA9IHR5cGVvZiByb3VuZE9mZnNldHMgPT09ICdmdW5jdGlvbicgPyByb3VuZE9mZnNldHMoe1xuICAgIHg6IHgsXG4gICAgeTogeVxuICB9KSA6IHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcblxuICB4ID0gX3JlZjMueDtcbiAgeSA9IF9yZWYzLnk7XG4gIHZhciBoYXNYID0gb2Zmc2V0cy5oYXNPd25Qcm9wZXJ0eSgneCcpO1xuICB2YXIgaGFzWSA9IG9mZnNldHMuaGFzT3duUHJvcGVydHkoJ3knKTtcbiAgdmFyIHNpZGVYID0gbGVmdDtcbiAgdmFyIHNpZGVZID0gdG9wO1xuICB2YXIgd2luID0gd2luZG93O1xuXG4gIGlmIChhZGFwdGl2ZSkge1xuICAgIHZhciBvZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQocG9wcGVyKTtcbiAgICB2YXIgaGVpZ2h0UHJvcCA9ICdjbGllbnRIZWlnaHQnO1xuICAgIHZhciB3aWR0aFByb3AgPSAnY2xpZW50V2lkdGgnO1xuXG4gICAgaWYgKG9mZnNldFBhcmVudCA9PT0gZ2V0V2luZG93KHBvcHBlcikpIHtcbiAgICAgIG9mZnNldFBhcmVudCA9IGdldERvY3VtZW50RWxlbWVudChwb3BwZXIpO1xuXG4gICAgICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uICE9PSAnc3RhdGljJyAmJiBwb3NpdGlvbiA9PT0gJ2Fic29sdXRlJykge1xuICAgICAgICBoZWlnaHRQcm9wID0gJ3Njcm9sbEhlaWdodCc7XG4gICAgICAgIHdpZHRoUHJvcCA9ICdzY3JvbGxXaWR0aCc7XG4gICAgICB9XG4gICAgfSAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYXN0XTogZm9yY2UgdHlwZSByZWZpbmVtZW50LCB3ZSBjb21wYXJlIG9mZnNldFBhcmVudCB3aXRoIHdpbmRvdyBhYm92ZSwgYnV0IEZsb3cgZG9lc24ndCBkZXRlY3QgaXRcblxuXG4gICAgb2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50O1xuXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gdG9wIHx8IChwbGFjZW1lbnQgPT09IGxlZnQgfHwgcGxhY2VtZW50ID09PSByaWdodCkgJiYgdmFyaWF0aW9uID09PSBlbmQpIHtcbiAgICAgIHNpZGVZID0gYm90dG9tO1xuICAgICAgdmFyIG9mZnNldFkgPSBpc0ZpeGVkICYmIG9mZnNldFBhcmVudCA9PT0gd2luICYmIHdpbi52aXN1YWxWaWV3cG9ydCA/IHdpbi52aXN1YWxWaWV3cG9ydC5oZWlnaHQgOiAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgICAgIG9mZnNldFBhcmVudFtoZWlnaHRQcm9wXTtcbiAgICAgIHkgLT0gb2Zmc2V0WSAtIHBvcHBlclJlY3QuaGVpZ2h0O1xuICAgICAgeSAqPSBncHVBY2NlbGVyYXRpb24gPyAxIDogLTE7XG4gICAgfVxuXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gbGVmdCB8fCAocGxhY2VtZW50ID09PSB0b3AgfHwgcGxhY2VtZW50ID09PSBib3R0b20pICYmIHZhcmlhdGlvbiA9PT0gZW5kKSB7XG4gICAgICBzaWRlWCA9IHJpZ2h0O1xuICAgICAgdmFyIG9mZnNldFggPSBpc0ZpeGVkICYmIG9mZnNldFBhcmVudCA9PT0gd2luICYmIHdpbi52aXN1YWxWaWV3cG9ydCA/IHdpbi52aXN1YWxWaWV3cG9ydC53aWR0aCA6IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgICAgb2Zmc2V0UGFyZW50W3dpZHRoUHJvcF07XG4gICAgICB4IC09IG9mZnNldFggLSBwb3BwZXJSZWN0LndpZHRoO1xuICAgICAgeCAqPSBncHVBY2NlbGVyYXRpb24gPyAxIDogLTE7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbW1vblN0eWxlcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHBvc2l0aW9uOiBwb3NpdGlvblxuICB9LCBhZGFwdGl2ZSAmJiB1bnNldFNpZGVzKTtcblxuICB2YXIgX3JlZjQgPSByb3VuZE9mZnNldHMgPT09IHRydWUgPyByb3VuZE9mZnNldHNCeURQUih7XG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH0sIGdldFdpbmRvdyhwb3BwZXIpKSA6IHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcblxuICB4ID0gX3JlZjQueDtcbiAgeSA9IF9yZWY0Lnk7XG5cbiAgaWYgKGdwdUFjY2VsZXJhdGlvbikge1xuICAgIHZhciBfT2JqZWN0JGFzc2lnbjtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIChfT2JqZWN0JGFzc2lnbiA9IHt9LCBfT2JqZWN0JGFzc2lnbltzaWRlWV0gPSBoYXNZID8gJzAnIDogJycsIF9PYmplY3QkYXNzaWduW3NpZGVYXSA9IGhhc1ggPyAnMCcgOiAnJywgX09iamVjdCRhc3NpZ24udHJhbnNmb3JtID0gKHdpbi5kZXZpY2VQaXhlbFJhdGlvIHx8IDEpIDw9IDEgPyBcInRyYW5zbGF0ZShcIiArIHggKyBcInB4LCBcIiArIHkgKyBcInB4KVwiIDogXCJ0cmFuc2xhdGUzZChcIiArIHggKyBcInB4LCBcIiArIHkgKyBcInB4LCAwKVwiLCBfT2JqZWN0JGFzc2lnbikpO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcywgKF9PYmplY3QkYXNzaWduMiA9IHt9LCBfT2JqZWN0JGFzc2lnbjJbc2lkZVldID0gaGFzWSA/IHkgKyBcInB4XCIgOiAnJywgX09iamVjdCRhc3NpZ24yW3NpZGVYXSA9IGhhc1ggPyB4ICsgXCJweFwiIDogJycsIF9PYmplY3QkYXNzaWduMi50cmFuc2Zvcm0gPSAnJywgX09iamVjdCRhc3NpZ24yKSk7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVTdHlsZXMoX3JlZjUpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjUuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZjUub3B0aW9ucztcbiAgdmFyIF9vcHRpb25zJGdwdUFjY2VsZXJhdCA9IG9wdGlvbnMuZ3B1QWNjZWxlcmF0aW9uLFxuICAgICAgZ3B1QWNjZWxlcmF0aW9uID0gX29wdGlvbnMkZ3B1QWNjZWxlcmF0ID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkZ3B1QWNjZWxlcmF0LFxuICAgICAgX29wdGlvbnMkYWRhcHRpdmUgPSBvcHRpb25zLmFkYXB0aXZlLFxuICAgICAgYWRhcHRpdmUgPSBfb3B0aW9ucyRhZGFwdGl2ZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJGFkYXB0aXZlLFxuICAgICAgX29wdGlvbnMkcm91bmRPZmZzZXRzID0gb3B0aW9ucy5yb3VuZE9mZnNldHMsXG4gICAgICByb3VuZE9mZnNldHMgPSBfb3B0aW9ucyRyb3VuZE9mZnNldHMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRyb3VuZE9mZnNldHM7XG4gIHZhciBjb21tb25TdHlsZXMgPSB7XG4gICAgcGxhY2VtZW50OiBnZXRCYXNlUGxhY2VtZW50KHN0YXRlLnBsYWNlbWVudCksXG4gICAgdmFyaWF0aW9uOiBnZXRWYXJpYXRpb24oc3RhdGUucGxhY2VtZW50KSxcbiAgICBwb3BwZXI6IHN0YXRlLmVsZW1lbnRzLnBvcHBlcixcbiAgICBwb3BwZXJSZWN0OiBzdGF0ZS5yZWN0cy5wb3BwZXIsXG4gICAgZ3B1QWNjZWxlcmF0aW9uOiBncHVBY2NlbGVyYXRpb24sXG4gICAgaXNGaXhlZDogc3RhdGUub3B0aW9ucy5zdHJhdGVneSA9PT0gJ2ZpeGVkJ1xuICB9O1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMgIT0gbnVsbCkge1xuICAgIHN0YXRlLnN0eWxlcy5wb3BwZXIgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zdHlsZXMucG9wcGVyLCBtYXBUb1N0eWxlcyhPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIHtcbiAgICAgIG9mZnNldHM6IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyxcbiAgICAgIHBvc2l0aW9uOiBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgYWRhcHRpdmU6IGFkYXB0aXZlLFxuICAgICAgcm91bmRPZmZzZXRzOiByb3VuZE9mZnNldHNcbiAgICB9KSkpO1xuICB9XG5cbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGEuYXJyb3cgIT0gbnVsbCkge1xuICAgIHN0YXRlLnN0eWxlcy5hcnJvdyA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnN0eWxlcy5hcnJvdywgbWFwVG9TdHlsZXMoT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCB7XG4gICAgICBvZmZzZXRzOiBzdGF0ZS5tb2RpZmllcnNEYXRhLmFycm93LFxuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBhZGFwdGl2ZTogZmFsc2UsXG4gICAgICByb3VuZE9mZnNldHM6IHJvdW5kT2Zmc2V0c1xuICAgIH0pKSk7XG4gIH1cblxuICBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyLCB7XG4gICAgJ2RhdGEtcG9wcGVyLXBsYWNlbWVudCc6IHN0YXRlLnBsYWNlbWVudFxuICB9KTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2NvbXB1dGVTdHlsZXMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ2JlZm9yZVdyaXRlJyxcbiAgZm46IGNvbXB1dGVTdHlsZXMsXG4gIGRhdGE6IHt9XG59OyIsImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRXaW5kb3cuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG52YXIgcGFzc2l2ZSA9IHtcbiAgcGFzc2l2ZTogdHJ1ZVxufTtcblxuZnVuY3Rpb24gZWZmZWN0KF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnM7XG4gIHZhciBfb3B0aW9ucyRzY3JvbGwgPSBvcHRpb25zLnNjcm9sbCxcbiAgICAgIHNjcm9sbCA9IF9vcHRpb25zJHNjcm9sbCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHNjcm9sbCxcbiAgICAgIF9vcHRpb25zJHJlc2l6ZSA9IG9wdGlvbnMucmVzaXplLFxuICAgICAgcmVzaXplID0gX29wdGlvbnMkcmVzaXplID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkcmVzaXplO1xuICB2YXIgd2luZG93ID0gZ2V0V2luZG93KHN0YXRlLmVsZW1lbnRzLnBvcHBlcik7XG4gIHZhciBzY3JvbGxQYXJlbnRzID0gW10uY29uY2F0KHN0YXRlLnNjcm9sbFBhcmVudHMucmVmZXJlbmNlLCBzdGF0ZS5zY3JvbGxQYXJlbnRzLnBvcHBlcik7XG5cbiAgaWYgKHNjcm9sbCkge1xuICAgIHNjcm9sbFBhcmVudHMuZm9yRWFjaChmdW5jdGlvbiAoc2Nyb2xsUGFyZW50KSB7XG4gICAgICBzY3JvbGxQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChyZXNpemUpIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNjcm9sbCkge1xuICAgICAgc2Nyb2xsUGFyZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChzY3JvbGxQYXJlbnQpIHtcbiAgICAgICAgc2Nyb2xsUGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocmVzaXplKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgICB9XG4gIH07XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdldmVudExpc3RlbmVycycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnd3JpdGUnLFxuICBmbjogZnVuY3Rpb24gZm4oKSB7fSxcbiAgZWZmZWN0OiBlZmZlY3QsXG4gIGRhdGE6IHt9XG59OyIsInZhciBoYXNoID0ge1xuICBsZWZ0OiAncmlnaHQnLFxuICByaWdodDogJ2xlZnQnLFxuICBib3R0b206ICd0b3AnLFxuICB0b3A6ICdib3R0b20nXG59O1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQucmVwbGFjZSgvbGVmdHxyaWdodHxib3R0b218dG9wL2csIGZ1bmN0aW9uIChtYXRjaGVkKSB7XG4gICAgcmV0dXJuIGhhc2hbbWF0Y2hlZF07XG4gIH0pO1xufSIsInZhciBoYXNoID0ge1xuICBzdGFydDogJ2VuZCcsXG4gIGVuZDogJ3N0YXJ0J1xufTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnJlcGxhY2UoL3N0YXJ0fGVuZC9nLCBmdW5jdGlvbiAobWF0Y2hlZCkge1xuICAgIHJldHVybiBoYXNoW21hdGNoZWRdO1xuICB9KTtcbn0iLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsKG5vZGUpIHtcbiAgdmFyIHdpbiA9IGdldFdpbmRvdyhub2RlKTtcbiAgdmFyIHNjcm9sbExlZnQgPSB3aW4ucGFnZVhPZmZzZXQ7XG4gIHZhciBzY3JvbGxUb3AgPSB3aW4ucGFnZVlPZmZzZXQ7XG4gIHJldHVybiB7XG4gICAgc2Nyb2xsTGVmdDogc2Nyb2xsTGVmdCxcbiAgICBzY3JvbGxUb3A6IHNjcm9sbFRvcFxuICB9O1xufSIsImltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGwuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCkge1xuICAvLyBJZiA8aHRtbD4gaGFzIGEgQ1NTIHdpZHRoIGdyZWF0ZXIgdGhhbiB0aGUgdmlld3BvcnQsIHRoZW4gdGhpcyB3aWxsIGJlXG4gIC8vIGluY29ycmVjdCBmb3IgUlRMLlxuICAvLyBQb3BwZXIgMSBpcyBicm9rZW4gaW4gdGhpcyBjYXNlIGFuZCBuZXZlciBoYWQgYSBidWcgcmVwb3J0IHNvIGxldCdzIGFzc3VtZVxuICAvLyBpdCdzIG5vdCBhbiBpc3N1ZS4gSSBkb24ndCB0aGluayBhbnlvbmUgZXZlciBzcGVjaWZpZXMgd2lkdGggb24gPGh0bWw+XG4gIC8vIGFueXdheS5cbiAgLy8gQnJvd3NlcnMgd2hlcmUgdGhlIGxlZnQgc2Nyb2xsYmFyIGRvZXNuJ3QgY2F1c2UgYW4gaXNzdWUgcmVwb3J0IGAwYCBmb3JcbiAgLy8gdGhpcyAoZS5nLiBFZGdlIDIwMTksIElFMTEsIFNhZmFyaSlcbiAgcmV0dXJuIGdldEJvdW5kaW5nQ2xpZW50UmVjdChnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkpLmxlZnQgKyBnZXRXaW5kb3dTY3JvbGwoZWxlbWVudCkuc2Nyb2xsTGVmdDtcbn0iLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbEJhclguanNcIjtcbmltcG9ydCBpc0xheW91dFZpZXdwb3J0IGZyb20gXCIuL2lzTGF5b3V0Vmlld3BvcnQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFZpZXdwb3J0UmVjdChlbGVtZW50LCBzdHJhdGVneSkge1xuICB2YXIgd2luID0gZ2V0V2luZG93KGVsZW1lbnQpO1xuICB2YXIgaHRtbCA9IGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KTtcbiAgdmFyIHZpc3VhbFZpZXdwb3J0ID0gd2luLnZpc3VhbFZpZXdwb3J0O1xuICB2YXIgd2lkdGggPSBodG1sLmNsaWVudFdpZHRoO1xuICB2YXIgaGVpZ2h0ID0gaHRtbC5jbGllbnRIZWlnaHQ7XG4gIHZhciB4ID0gMDtcbiAgdmFyIHkgPSAwO1xuXG4gIGlmICh2aXN1YWxWaWV3cG9ydCkge1xuICAgIHdpZHRoID0gdmlzdWFsVmlld3BvcnQud2lkdGg7XG4gICAgaGVpZ2h0ID0gdmlzdWFsVmlld3BvcnQuaGVpZ2h0O1xuICAgIHZhciBsYXlvdXRWaWV3cG9ydCA9IGlzTGF5b3V0Vmlld3BvcnQoKTtcblxuICAgIGlmIChsYXlvdXRWaWV3cG9ydCB8fCAhbGF5b3V0Vmlld3BvcnQgJiYgc3RyYXRlZ3kgPT09ICdmaXhlZCcpIHtcbiAgICAgIHggPSB2aXN1YWxWaWV3cG9ydC5vZmZzZXRMZWZ0O1xuICAgICAgeSA9IHZpc3VhbFZpZXdwb3J0Lm9mZnNldFRvcDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICB4OiB4ICsgZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KSxcbiAgICB5OiB5XG4gIH07XG59IiwiaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbEJhclguanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGwgZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsLmpzXCI7XG5pbXBvcnQgeyBtYXggfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiOyAvLyBHZXRzIHRoZSBlbnRpcmUgc2l6ZSBvZiB0aGUgc2Nyb2xsYWJsZSBkb2N1bWVudCBhcmVhLCBldmVuIGV4dGVuZGluZyBvdXRzaWRlXG4vLyBvZiB0aGUgYDxodG1sPmAgYW5kIGA8Ym9keT5gIHJlY3QgYm91bmRzIGlmIGhvcml6b250YWxseSBzY3JvbGxhYmxlXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldERvY3VtZW50UmVjdChlbGVtZW50KSB7XG4gIHZhciBfZWxlbWVudCRvd25lckRvY3VtZW47XG5cbiAgdmFyIGh0bWwgPSBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCk7XG4gIHZhciB3aW5TY3JvbGwgPSBnZXRXaW5kb3dTY3JvbGwoZWxlbWVudCk7XG4gIHZhciBib2R5ID0gKF9lbGVtZW50JG93bmVyRG9jdW1lbiA9IGVsZW1lbnQub3duZXJEb2N1bWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9lbGVtZW50JG93bmVyRG9jdW1lbi5ib2R5O1xuICB2YXIgd2lkdGggPSBtYXgoaHRtbC5zY3JvbGxXaWR0aCwgaHRtbC5jbGllbnRXaWR0aCwgYm9keSA/IGJvZHkuc2Nyb2xsV2lkdGggOiAwLCBib2R5ID8gYm9keS5jbGllbnRXaWR0aCA6IDApO1xuICB2YXIgaGVpZ2h0ID0gbWF4KGh0bWwuc2Nyb2xsSGVpZ2h0LCBodG1sLmNsaWVudEhlaWdodCwgYm9keSA/IGJvZHkuc2Nyb2xsSGVpZ2h0IDogMCwgYm9keSA/IGJvZHkuY2xpZW50SGVpZ2h0IDogMCk7XG4gIHZhciB4ID0gLXdpblNjcm9sbC5zY3JvbGxMZWZ0ICsgZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KTtcbiAgdmFyIHkgPSAtd2luU2Nyb2xsLnNjcm9sbFRvcDtcblxuICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShib2R5IHx8IGh0bWwpLmRpcmVjdGlvbiA9PT0gJ3J0bCcpIHtcbiAgICB4ICs9IG1heChodG1sLmNsaWVudFdpZHRoLCBib2R5ID8gYm9keS5jbGllbnRXaWR0aCA6IDApIC0gd2lkdGg7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcbn0iLCJpbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1Njcm9sbFBhcmVudChlbGVtZW50KSB7XG4gIC8vIEZpcmVmb3ggd2FudHMgdXMgdG8gY2hlY2sgYC14YCBhbmQgYC15YCB2YXJpYXRpb25zIGFzIHdlbGxcbiAgdmFyIF9nZXRDb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KSxcbiAgICAgIG92ZXJmbG93ID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3csXG4gICAgICBvdmVyZmxvd1ggPSBfZ2V0Q29tcHV0ZWRTdHlsZS5vdmVyZmxvd1gsXG4gICAgICBvdmVyZmxvd1kgPSBfZ2V0Q29tcHV0ZWRTdHlsZS5vdmVyZmxvd1k7XG5cbiAgcmV0dXJuIC9hdXRvfHNjcm9sbHxvdmVybGF5fGhpZGRlbi8udGVzdChvdmVyZmxvdyArIG92ZXJmbG93WSArIG92ZXJmbG93WCk7XG59IiwiaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuaW1wb3J0IGlzU2Nyb2xsUGFyZW50IGZyb20gXCIuL2lzU2Nyb2xsUGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRTY3JvbGxQYXJlbnQobm9kZSkge1xuICBpZiAoWydodG1sJywgJ2JvZHknLCAnI2RvY3VtZW50J10uaW5kZXhPZihnZXROb2RlTmFtZShub2RlKSkgPj0gMCkge1xuICAgIC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXJldHVybl06IGFzc3VtZSBib2R5IGlzIGFsd2F5cyBhdmFpbGFibGVcbiAgICByZXR1cm4gbm9kZS5vd25lckRvY3VtZW50LmJvZHk7XG4gIH1cblxuICBpZiAoaXNIVE1MRWxlbWVudChub2RlKSAmJiBpc1Njcm9sbFBhcmVudChub2RlKSkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgcmV0dXJuIGdldFNjcm9sbFBhcmVudChnZXRQYXJlbnROb2RlKG5vZGUpKTtcbn0iLCJpbXBvcnQgZ2V0U2Nyb2xsUGFyZW50IGZyb20gXCIuL2dldFNjcm9sbFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBpc1Njcm9sbFBhcmVudCBmcm9tIFwiLi9pc1Njcm9sbFBhcmVudC5qc1wiO1xuLypcbmdpdmVuIGEgRE9NIGVsZW1lbnQsIHJldHVybiB0aGUgbGlzdCBvZiBhbGwgc2Nyb2xsIHBhcmVudHMsIHVwIHRoZSBsaXN0IG9mIGFuY2Vzb3JzXG51bnRpbCB3ZSBnZXQgdG8gdGhlIHRvcCB3aW5kb3cgb2JqZWN0LiBUaGlzIGxpc3QgaXMgd2hhdCB3ZSBhdHRhY2ggc2Nyb2xsIGxpc3RlbmVyc1xudG8sIGJlY2F1c2UgaWYgYW55IG9mIHRoZXNlIHBhcmVudCBlbGVtZW50cyBzY3JvbGwsIHdlJ2xsIG5lZWQgdG8gcmUtY2FsY3VsYXRlIHRoZVxucmVmZXJlbmNlIGVsZW1lbnQncyBwb3NpdGlvbi5cbiovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxpc3RTY3JvbGxQYXJlbnRzKGVsZW1lbnQsIGxpc3QpIHtcbiAgdmFyIF9lbGVtZW50JG93bmVyRG9jdW1lbjtcblxuICBpZiAobGlzdCA9PT0gdm9pZCAwKSB7XG4gICAgbGlzdCA9IFtdO1xuICB9XG5cbiAgdmFyIHNjcm9sbFBhcmVudCA9IGdldFNjcm9sbFBhcmVudChlbGVtZW50KTtcbiAgdmFyIGlzQm9keSA9IHNjcm9sbFBhcmVudCA9PT0gKChfZWxlbWVudCRvd25lckRvY3VtZW4gPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfZWxlbWVudCRvd25lckRvY3VtZW4uYm9keSk7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3coc2Nyb2xsUGFyZW50KTtcbiAgdmFyIHRhcmdldCA9IGlzQm9keSA/IFt3aW5dLmNvbmNhdCh3aW4udmlzdWFsVmlld3BvcnQgfHwgW10sIGlzU2Nyb2xsUGFyZW50KHNjcm9sbFBhcmVudCkgPyBzY3JvbGxQYXJlbnQgOiBbXSkgOiBzY3JvbGxQYXJlbnQ7XG4gIHZhciB1cGRhdGVkTGlzdCA9IGxpc3QuY29uY2F0KHRhcmdldCk7XG4gIHJldHVybiBpc0JvZHkgPyB1cGRhdGVkTGlzdCA6IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLWNhbGxdOiBpc0JvZHkgdGVsbHMgdXMgdGFyZ2V0IHdpbGwgYmUgYW4gSFRNTEVsZW1lbnQgaGVyZVxuICB1cGRhdGVkTGlzdC5jb25jYXQobGlzdFNjcm9sbFBhcmVudHMoZ2V0UGFyZW50Tm9kZSh0YXJnZXQpKSk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVjdFRvQ2xpZW50UmVjdChyZWN0KSB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCByZWN0LCB7XG4gICAgbGVmdDogcmVjdC54LFxuICAgIHRvcDogcmVjdC55LFxuICAgIHJpZ2h0OiByZWN0LnggKyByZWN0LndpZHRoLFxuICAgIGJvdHRvbTogcmVjdC55ICsgcmVjdC5oZWlnaHRcbiAgfSk7XG59IiwiaW1wb3J0IHsgdmlld3BvcnQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRWaWV3cG9ydFJlY3QgZnJvbSBcIi4vZ2V0Vmlld3BvcnRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRSZWN0IGZyb20gXCIuL2dldERvY3VtZW50UmVjdC5qc1wiO1xuaW1wb3J0IGxpc3RTY3JvbGxQYXJlbnRzIGZyb20gXCIuL2xpc3RTY3JvbGxQYXJlbnRzLmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCB7IGlzRWxlbWVudCwgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tIFwiLi9nZXRQYXJlbnROb2RlLmpzXCI7XG5pbXBvcnQgY29udGFpbnMgZnJvbSBcIi4vY29udGFpbnMuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHJlY3RUb0NsaWVudFJlY3QgZnJvbSBcIi4uL3V0aWxzL3JlY3RUb0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCB7IG1heCwgbWluIH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcblxuZnVuY3Rpb24gZ2V0SW5uZXJCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCwgc3RyYXRlZ3kpIHtcbiAgdmFyIHJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCwgZmFsc2UsIHN0cmF0ZWd5ID09PSAnZml4ZWQnKTtcbiAgcmVjdC50b3AgPSByZWN0LnRvcCArIGVsZW1lbnQuY2xpZW50VG9wO1xuICByZWN0LmxlZnQgPSByZWN0LmxlZnQgKyBlbGVtZW50LmNsaWVudExlZnQ7XG4gIHJlY3QuYm90dG9tID0gcmVjdC50b3AgKyBlbGVtZW50LmNsaWVudEhlaWdodDtcbiAgcmVjdC5yaWdodCA9IHJlY3QubGVmdCArIGVsZW1lbnQuY2xpZW50V2lkdGg7XG4gIHJlY3Qud2lkdGggPSBlbGVtZW50LmNsaWVudFdpZHRoO1xuICByZWN0LmhlaWdodCA9IGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICByZWN0LnggPSByZWN0LmxlZnQ7XG4gIHJlY3QueSA9IHJlY3QudG9wO1xuICByZXR1cm4gcmVjdDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgY2xpcHBpbmdQYXJlbnQsIHN0cmF0ZWd5KSB7XG4gIHJldHVybiBjbGlwcGluZ1BhcmVudCA9PT0gdmlld3BvcnQgPyByZWN0VG9DbGllbnRSZWN0KGdldFZpZXdwb3J0UmVjdChlbGVtZW50LCBzdHJhdGVneSkpIDogaXNFbGVtZW50KGNsaXBwaW5nUGFyZW50KSA/IGdldElubmVyQm91bmRpbmdDbGllbnRSZWN0KGNsaXBwaW5nUGFyZW50LCBzdHJhdGVneSkgOiByZWN0VG9DbGllbnRSZWN0KGdldERvY3VtZW50UmVjdChnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkpKTtcbn0gLy8gQSBcImNsaXBwaW5nIHBhcmVudFwiIGlzIGFuIG92ZXJmbG93YWJsZSBjb250YWluZXIgd2l0aCB0aGUgY2hhcmFjdGVyaXN0aWMgb2Zcbi8vIGNsaXBwaW5nIChvciBoaWRpbmcpIG92ZXJmbG93aW5nIGVsZW1lbnRzIHdpdGggYSBwb3NpdGlvbiBkaWZmZXJlbnQgZnJvbVxuLy8gYGluaXRpYWxgXG5cblxuZnVuY3Rpb24gZ2V0Q2xpcHBpbmdQYXJlbnRzKGVsZW1lbnQpIHtcbiAgdmFyIGNsaXBwaW5nUGFyZW50cyA9IGxpc3RTY3JvbGxQYXJlbnRzKGdldFBhcmVudE5vZGUoZWxlbWVudCkpO1xuICB2YXIgY2FuRXNjYXBlQ2xpcHBpbmcgPSBbJ2Fic29sdXRlJywgJ2ZpeGVkJ10uaW5kZXhPZihnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLnBvc2l0aW9uKSA+PSAwO1xuICB2YXIgY2xpcHBlckVsZW1lbnQgPSBjYW5Fc2NhcGVDbGlwcGluZyAmJiBpc0hUTUxFbGVtZW50KGVsZW1lbnQpID8gZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQpIDogZWxlbWVudDtcblxuICBpZiAoIWlzRWxlbWVudChjbGlwcGVyRWxlbWVudCkpIHtcbiAgICByZXR1cm4gW107XG4gIH0gLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzE0MTRcblxuXG4gIHJldHVybiBjbGlwcGluZ1BhcmVudHMuZmlsdGVyKGZ1bmN0aW9uIChjbGlwcGluZ1BhcmVudCkge1xuICAgIHJldHVybiBpc0VsZW1lbnQoY2xpcHBpbmdQYXJlbnQpICYmIGNvbnRhaW5zKGNsaXBwaW5nUGFyZW50LCBjbGlwcGVyRWxlbWVudCkgJiYgZ2V0Tm9kZU5hbWUoY2xpcHBpbmdQYXJlbnQpICE9PSAnYm9keSc7XG4gIH0pO1xufSAvLyBHZXRzIHRoZSBtYXhpbXVtIGFyZWEgdGhhdCB0aGUgZWxlbWVudCBpcyB2aXNpYmxlIGluIGR1ZSB0byBhbnkgbnVtYmVyIG9mXG4vLyBjbGlwcGluZyBwYXJlbnRzXG5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q2xpcHBpbmdSZWN0KGVsZW1lbnQsIGJvdW5kYXJ5LCByb290Qm91bmRhcnksIHN0cmF0ZWd5KSB7XG4gIHZhciBtYWluQ2xpcHBpbmdQYXJlbnRzID0gYm91bmRhcnkgPT09ICdjbGlwcGluZ1BhcmVudHMnID8gZ2V0Q2xpcHBpbmdQYXJlbnRzKGVsZW1lbnQpIDogW10uY29uY2F0KGJvdW5kYXJ5KTtcbiAgdmFyIGNsaXBwaW5nUGFyZW50cyA9IFtdLmNvbmNhdChtYWluQ2xpcHBpbmdQYXJlbnRzLCBbcm9vdEJvdW5kYXJ5XSk7XG4gIHZhciBmaXJzdENsaXBwaW5nUGFyZW50ID0gY2xpcHBpbmdQYXJlbnRzWzBdO1xuICB2YXIgY2xpcHBpbmdSZWN0ID0gY2xpcHBpbmdQYXJlbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjUmVjdCwgY2xpcHBpbmdQYXJlbnQpIHtcbiAgICB2YXIgcmVjdCA9IGdldENsaWVudFJlY3RGcm9tTWl4ZWRUeXBlKGVsZW1lbnQsIGNsaXBwaW5nUGFyZW50LCBzdHJhdGVneSk7XG4gICAgYWNjUmVjdC50b3AgPSBtYXgocmVjdC50b3AsIGFjY1JlY3QudG9wKTtcbiAgICBhY2NSZWN0LnJpZ2h0ID0gbWluKHJlY3QucmlnaHQsIGFjY1JlY3QucmlnaHQpO1xuICAgIGFjY1JlY3QuYm90dG9tID0gbWluKHJlY3QuYm90dG9tLCBhY2NSZWN0LmJvdHRvbSk7XG4gICAgYWNjUmVjdC5sZWZ0ID0gbWF4KHJlY3QubGVmdCwgYWNjUmVjdC5sZWZ0KTtcbiAgICByZXR1cm4gYWNjUmVjdDtcbiAgfSwgZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgZmlyc3RDbGlwcGluZ1BhcmVudCwgc3RyYXRlZ3kpKTtcbiAgY2xpcHBpbmdSZWN0LndpZHRoID0gY2xpcHBpbmdSZWN0LnJpZ2h0IC0gY2xpcHBpbmdSZWN0LmxlZnQ7XG4gIGNsaXBwaW5nUmVjdC5oZWlnaHQgPSBjbGlwcGluZ1JlY3QuYm90dG9tIC0gY2xpcHBpbmdSZWN0LnRvcDtcbiAgY2xpcHBpbmdSZWN0LnggPSBjbGlwcGluZ1JlY3QubGVmdDtcbiAgY2xpcHBpbmdSZWN0LnkgPSBjbGlwcGluZ1JlY3QudG9wO1xuICByZXR1cm4gY2xpcHBpbmdSZWN0O1xufSIsImltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4vZ2V0VmFyaWF0aW9uLmpzXCI7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gXCIuL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0LCBzdGFydCwgZW5kIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wdXRlT2Zmc2V0cyhfcmVmKSB7XG4gIHZhciByZWZlcmVuY2UgPSBfcmVmLnJlZmVyZW5jZSxcbiAgICAgIGVsZW1lbnQgPSBfcmVmLmVsZW1lbnQsXG4gICAgICBwbGFjZW1lbnQgPSBfcmVmLnBsYWNlbWVudDtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBwbGFjZW1lbnQgPyBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgOiBudWxsO1xuICB2YXIgdmFyaWF0aW9uID0gcGxhY2VtZW50ID8gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgOiBudWxsO1xuICB2YXIgY29tbW9uWCA9IHJlZmVyZW5jZS54ICsgcmVmZXJlbmNlLndpZHRoIC8gMiAtIGVsZW1lbnQud2lkdGggLyAyO1xuICB2YXIgY29tbW9uWSA9IHJlZmVyZW5jZS55ICsgcmVmZXJlbmNlLmhlaWdodCAvIDIgLSBlbGVtZW50LmhlaWdodCAvIDI7XG4gIHZhciBvZmZzZXRzO1xuXG4gIHN3aXRjaCAoYmFzZVBsYWNlbWVudCkge1xuICAgIGNhc2UgdG9wOlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogY29tbW9uWCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnkgLSBlbGVtZW50LmhlaWdodFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBib3R0b206XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiBjb21tb25YLFxuICAgICAgICB5OiByZWZlcmVuY2UueSArIHJlZmVyZW5jZS5oZWlnaHRcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgcmlnaHQ6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiByZWZlcmVuY2UueCArIHJlZmVyZW5jZS53aWR0aCxcbiAgICAgICAgeTogY29tbW9uWVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBsZWZ0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLnggLSBlbGVtZW50LndpZHRoLFxuICAgICAgICB5OiBjb21tb25ZXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLngsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55XG4gICAgICB9O1xuICB9XG5cbiAgdmFyIG1haW5BeGlzID0gYmFzZVBsYWNlbWVudCA/IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChiYXNlUGxhY2VtZW50KSA6IG51bGw7XG5cbiAgaWYgKG1haW5BeGlzICE9IG51bGwpIHtcbiAgICB2YXIgbGVuID0gbWFpbkF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICAgIHN3aXRjaCAodmFyaWF0aW9uKSB7XG4gICAgICBjYXNlIHN0YXJ0OlxuICAgICAgICBvZmZzZXRzW21haW5BeGlzXSA9IG9mZnNldHNbbWFpbkF4aXNdIC0gKHJlZmVyZW5jZVtsZW5dIC8gMiAtIGVsZW1lbnRbbGVuXSAvIDIpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBlbmQ6XG4gICAgICAgIG9mZnNldHNbbWFpbkF4aXNdID0gb2Zmc2V0c1ttYWluQXhpc10gKyAocmVmZXJlbmNlW2xlbl0gLyAyIC0gZWxlbWVudFtsZW5dIC8gMik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvZmZzZXRzO1xufSIsImltcG9ydCBnZXRDbGlwcGluZ1JlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRDbGlwcGluZ1JlY3QuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBjb21wdXRlT2Zmc2V0cyBmcm9tIFwiLi9jb21wdXRlT2Zmc2V0cy5qc1wiO1xuaW1wb3J0IHJlY3RUb0NsaWVudFJlY3QgZnJvbSBcIi4vcmVjdFRvQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IHsgY2xpcHBpbmdQYXJlbnRzLCByZWZlcmVuY2UsIHBvcHBlciwgYm90dG9tLCB0b3AsIHJpZ2h0LCBiYXNlUGxhY2VtZW50cywgdmlld3BvcnQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCB7IGlzRWxlbWVudCB9IGZyb20gXCIuLi9kb20tdXRpbHMvaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IG1lcmdlUGFkZGluZ09iamVjdCBmcm9tIFwiLi9tZXJnZVBhZGRpbmdPYmplY3QuanNcIjtcbmltcG9ydCBleHBhbmRUb0hhc2hNYXAgZnJvbSBcIi4vZXhwYW5kVG9IYXNoTWFwLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBfb3B0aW9ucyA9IG9wdGlvbnMsXG4gICAgICBfb3B0aW9ucyRwbGFjZW1lbnQgPSBfb3B0aW9ucy5wbGFjZW1lbnQsXG4gICAgICBwbGFjZW1lbnQgPSBfb3B0aW9ucyRwbGFjZW1lbnQgPT09IHZvaWQgMCA/IHN0YXRlLnBsYWNlbWVudCA6IF9vcHRpb25zJHBsYWNlbWVudCxcbiAgICAgIF9vcHRpb25zJHN0cmF0ZWd5ID0gX29wdGlvbnMuc3RyYXRlZ3ksXG4gICAgICBzdHJhdGVneSA9IF9vcHRpb25zJHN0cmF0ZWd5ID09PSB2b2lkIDAgPyBzdGF0ZS5zdHJhdGVneSA6IF9vcHRpb25zJHN0cmF0ZWd5LFxuICAgICAgX29wdGlvbnMkYm91bmRhcnkgPSBfb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIGJvdW5kYXJ5ID0gX29wdGlvbnMkYm91bmRhcnkgPT09IHZvaWQgMCA/IGNsaXBwaW5nUGFyZW50cyA6IF9vcHRpb25zJGJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkcm9vdEJvdW5kYXJ5ID0gX29wdGlvbnMucm9vdEJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gX29wdGlvbnMkcm9vdEJvdW5kYXJ5ID09PSB2b2lkIDAgPyB2aWV3cG9ydCA6IF9vcHRpb25zJHJvb3RCb3VuZGFyeSxcbiAgICAgIF9vcHRpb25zJGVsZW1lbnRDb250ZSA9IF9vcHRpb25zLmVsZW1lbnRDb250ZXh0LFxuICAgICAgZWxlbWVudENvbnRleHQgPSBfb3B0aW9ucyRlbGVtZW50Q29udGUgPT09IHZvaWQgMCA/IHBvcHBlciA6IF9vcHRpb25zJGVsZW1lbnRDb250ZSxcbiAgICAgIF9vcHRpb25zJGFsdEJvdW5kYXJ5ID0gX29wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IF9vcHRpb25zJGFsdEJvdW5kYXJ5ID09PSB2b2lkIDAgPyBmYWxzZSA6IF9vcHRpb25zJGFsdEJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkcGFkZGluZyA9IF9vcHRpb25zLnBhZGRpbmcsXG4gICAgICBwYWRkaW5nID0gX29wdGlvbnMkcGFkZGluZyA9PT0gdm9pZCAwID8gMCA6IF9vcHRpb25zJHBhZGRpbmc7XG4gIHZhciBwYWRkaW5nT2JqZWN0ID0gbWVyZ2VQYWRkaW5nT2JqZWN0KHR5cGVvZiBwYWRkaW5nICE9PSAnbnVtYmVyJyA/IHBhZGRpbmcgOiBleHBhbmRUb0hhc2hNYXAocGFkZGluZywgYmFzZVBsYWNlbWVudHMpKTtcbiAgdmFyIGFsdENvbnRleHQgPSBlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyID8gcmVmZXJlbmNlIDogcG9wcGVyO1xuICB2YXIgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgdmFyIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1thbHRCb3VuZGFyeSA/IGFsdENvbnRleHQgOiBlbGVtZW50Q29udGV4dF07XG4gIHZhciBjbGlwcGluZ0NsaWVudFJlY3QgPSBnZXRDbGlwcGluZ1JlY3QoaXNFbGVtZW50KGVsZW1lbnQpID8gZWxlbWVudCA6IGVsZW1lbnQuY29udGV4dEVsZW1lbnQgfHwgZ2V0RG9jdW1lbnRFbGVtZW50KHN0YXRlLmVsZW1lbnRzLnBvcHBlciksIGJvdW5kYXJ5LCByb290Qm91bmRhcnksIHN0cmF0ZWd5KTtcbiAgdmFyIHJlZmVyZW5jZUNsaWVudFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3Qoc3RhdGUuZWxlbWVudHMucmVmZXJlbmNlKTtcbiAgdmFyIHBvcHBlck9mZnNldHMgPSBjb21wdXRlT2Zmc2V0cyh7XG4gICAgcmVmZXJlbmNlOiByZWZlcmVuY2VDbGllbnRSZWN0LFxuICAgIGVsZW1lbnQ6IHBvcHBlclJlY3QsXG4gICAgc3RyYXRlZ3k6ICdhYnNvbHV0ZScsXG4gICAgcGxhY2VtZW50OiBwbGFjZW1lbnRcbiAgfSk7XG4gIHZhciBwb3BwZXJDbGllbnRSZWN0ID0gcmVjdFRvQ2xpZW50UmVjdChPYmplY3QuYXNzaWduKHt9LCBwb3BwZXJSZWN0LCBwb3BwZXJPZmZzZXRzKSk7XG4gIHZhciBlbGVtZW50Q2xpZW50UmVjdCA9IGVsZW1lbnRDb250ZXh0ID09PSBwb3BwZXIgPyBwb3BwZXJDbGllbnRSZWN0IDogcmVmZXJlbmNlQ2xpZW50UmVjdDsgLy8gcG9zaXRpdmUgPSBvdmVyZmxvd2luZyB0aGUgY2xpcHBpbmcgcmVjdFxuICAvLyAwIG9yIG5lZ2F0aXZlID0gd2l0aGluIHRoZSBjbGlwcGluZyByZWN0XG5cbiAgdmFyIG92ZXJmbG93T2Zmc2V0cyA9IHtcbiAgICB0b3A6IGNsaXBwaW5nQ2xpZW50UmVjdC50b3AgLSBlbGVtZW50Q2xpZW50UmVjdC50b3AgKyBwYWRkaW5nT2JqZWN0LnRvcCxcbiAgICBib3R0b206IGVsZW1lbnRDbGllbnRSZWN0LmJvdHRvbSAtIGNsaXBwaW5nQ2xpZW50UmVjdC5ib3R0b20gKyBwYWRkaW5nT2JqZWN0LmJvdHRvbSxcbiAgICBsZWZ0OiBjbGlwcGluZ0NsaWVudFJlY3QubGVmdCAtIGVsZW1lbnRDbGllbnRSZWN0LmxlZnQgKyBwYWRkaW5nT2JqZWN0LmxlZnQsXG4gICAgcmlnaHQ6IGVsZW1lbnRDbGllbnRSZWN0LnJpZ2h0IC0gY2xpcHBpbmdDbGllbnRSZWN0LnJpZ2h0ICsgcGFkZGluZ09iamVjdC5yaWdodFxuICB9O1xuICB2YXIgb2Zmc2V0RGF0YSA9IHN0YXRlLm1vZGlmaWVyc0RhdGEub2Zmc2V0OyAvLyBPZmZzZXRzIGNhbiBiZSBhcHBsaWVkIG9ubHkgdG8gdGhlIHBvcHBlciBlbGVtZW50XG5cbiAgaWYgKGVsZW1lbnRDb250ZXh0ID09PSBwb3BwZXIgJiYgb2Zmc2V0RGF0YSkge1xuICAgIHZhciBvZmZzZXQgPSBvZmZzZXREYXRhW3BsYWNlbWVudF07XG4gICAgT2JqZWN0LmtleXMob3ZlcmZsb3dPZmZzZXRzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBtdWx0aXBseSA9IFtyaWdodCwgYm90dG9tXS5pbmRleE9mKGtleSkgPj0gMCA/IDEgOiAtMTtcbiAgICAgIHZhciBheGlzID0gW3RvcCwgYm90dG9tXS5pbmRleE9mKGtleSkgPj0gMCA/ICd5JyA6ICd4JztcbiAgICAgIG92ZXJmbG93T2Zmc2V0c1trZXldICs9IG9mZnNldFtheGlzXSAqIG11bHRpcGx5O1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG92ZXJmbG93T2Zmc2V0cztcbn0iLCJpbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IHsgdmFyaWF0aW9uUGxhY2VtZW50cywgYmFzZVBsYWNlbWVudHMsIHBsYWNlbWVudHMgYXMgYWxsUGxhY2VtZW50cyB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wdXRlQXV0b1BsYWNlbWVudChzdGF0ZSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgIHBsYWNlbWVudCA9IF9vcHRpb25zLnBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5ID0gX29wdGlvbnMuYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBfb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nID0gX29wdGlvbnMucGFkZGluZyxcbiAgICAgIGZsaXBWYXJpYXRpb25zID0gX29wdGlvbnMuZmxpcFZhcmlhdGlvbnMsXG4gICAgICBfb3B0aW9ucyRhbGxvd2VkQXV0b1AgPSBfb3B0aW9ucy5hbGxvd2VkQXV0b1BsYWNlbWVudHMsXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHMgPSBfb3B0aW9ucyRhbGxvd2VkQXV0b1AgPT09IHZvaWQgMCA/IGFsbFBsYWNlbWVudHMgOiBfb3B0aW9ucyRhbGxvd2VkQXV0b1A7XG4gIHZhciB2YXJpYXRpb24gPSBnZXRWYXJpYXRpb24ocGxhY2VtZW50KTtcbiAgdmFyIHBsYWNlbWVudHMgPSB2YXJpYXRpb24gPyBmbGlwVmFyaWF0aW9ucyA/IHZhcmlhdGlvblBsYWNlbWVudHMgOiB2YXJpYXRpb25QbGFjZW1lbnRzLmZpbHRlcihmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgcmV0dXJuIGdldFZhcmlhdGlvbihwbGFjZW1lbnQpID09PSB2YXJpYXRpb247XG4gIH0pIDogYmFzZVBsYWNlbWVudHM7XG4gIHZhciBhbGxvd2VkUGxhY2VtZW50cyA9IHBsYWNlbWVudHMuZmlsdGVyKGZ1bmN0aW9uIChwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gYWxsb3dlZEF1dG9QbGFjZW1lbnRzLmluZGV4T2YocGxhY2VtZW50KSA+PSAwO1xuICB9KTtcblxuICBpZiAoYWxsb3dlZFBsYWNlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgYWxsb3dlZFBsYWNlbWVudHMgPSBwbGFjZW1lbnRzO1xuICB9IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXR5cGVdOiBGbG93IHNlZW1zIHRvIGhhdmUgcHJvYmxlbXMgd2l0aCB0d28gYXJyYXkgdW5pb25zLi4uXG5cblxuICB2YXIgb3ZlcmZsb3dzID0gYWxsb3dlZFBsYWNlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICAgIGFjY1twbGFjZW1lbnRdID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nOiBwYWRkaW5nXG4gICAgfSlbZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpXTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvdmVyZmxvd3MpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gb3ZlcmZsb3dzW2FdIC0gb3ZlcmZsb3dzW2JdO1xuICB9KTtcbn0iLCJpbXBvcnQgZ2V0T3Bwb3NpdGVQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldE9wcG9zaXRlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IGNvbXB1dGVBdXRvUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9jb21wdXRlQXV0b1BsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgYm90dG9tLCB0b3AsIHN0YXJ0LCByaWdodCwgbGVmdCwgYXV0byB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi4vdXRpbHMvZ2V0VmFyaWF0aW9uLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZnVuY3Rpb24gZ2V0RXhwYW5kZWRGYWxsYmFja1BsYWNlbWVudHMocGxhY2VtZW50KSB7XG4gIGlmIChnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgPT09IGF1dG8pIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgb3Bwb3NpdGVQbGFjZW1lbnQgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICByZXR1cm4gW2dldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KHBsYWNlbWVudCksIG9wcG9zaXRlUGxhY2VtZW50LCBnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudChvcHBvc2l0ZVBsYWNlbWVudCldO1xufVxuXG5mdW5jdGlvbiBmbGlwKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdLl9za2lwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIF9vcHRpb25zJG1haW5BeGlzID0gb3B0aW9ucy5tYWluQXhpcyxcbiAgICAgIGNoZWNrTWFpbkF4aXMgPSBfb3B0aW9ucyRtYWluQXhpcyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJG1haW5BeGlzLFxuICAgICAgX29wdGlvbnMkYWx0QXhpcyA9IG9wdGlvbnMuYWx0QXhpcyxcbiAgICAgIGNoZWNrQWx0QXhpcyA9IF9vcHRpb25zJGFsdEF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRhbHRBeGlzLFxuICAgICAgc3BlY2lmaWVkRmFsbGJhY2tQbGFjZW1lbnRzID0gb3B0aW9ucy5mYWxsYmFja1BsYWNlbWVudHMsXG4gICAgICBwYWRkaW5nID0gb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgYm91bmRhcnkgPSBvcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IG9wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRmbGlwVmFyaWF0aW8gPSBvcHRpb25zLmZsaXBWYXJpYXRpb25zLFxuICAgICAgZmxpcFZhcmlhdGlvbnMgPSBfb3B0aW9ucyRmbGlwVmFyaWF0aW8gPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRmbGlwVmFyaWF0aW8sXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHMgPSBvcHRpb25zLmFsbG93ZWRBdXRvUGxhY2VtZW50cztcbiAgdmFyIHByZWZlcnJlZFBsYWNlbWVudCA9IHN0YXRlLm9wdGlvbnMucGxhY2VtZW50O1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocHJlZmVycmVkUGxhY2VtZW50KTtcbiAgdmFyIGlzQmFzZVBsYWNlbWVudCA9IGJhc2VQbGFjZW1lbnQgPT09IHByZWZlcnJlZFBsYWNlbWVudDtcbiAgdmFyIGZhbGxiYWNrUGxhY2VtZW50cyA9IHNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyB8fCAoaXNCYXNlUGxhY2VtZW50IHx8ICFmbGlwVmFyaWF0aW9ucyA/IFtnZXRPcHBvc2l0ZVBsYWNlbWVudChwcmVmZXJyZWRQbGFjZW1lbnQpXSA6IGdldEV4cGFuZGVkRmFsbGJhY2tQbGFjZW1lbnRzKHByZWZlcnJlZFBsYWNlbWVudCkpO1xuICB2YXIgcGxhY2VtZW50cyA9IFtwcmVmZXJyZWRQbGFjZW1lbnRdLmNvbmNhdChmYWxsYmFja1BsYWNlbWVudHMpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gYWNjLmNvbmNhdChnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgPT09IGF1dG8gPyBjb21wdXRlQXV0b1BsYWNlbWVudChzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmcsXG4gICAgICBmbGlwVmFyaWF0aW9uczogZmxpcFZhcmlhdGlvbnMsXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHM6IGFsbG93ZWRBdXRvUGxhY2VtZW50c1xuICAgIH0pIDogcGxhY2VtZW50KTtcbiAgfSwgW10pO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciBjaGVja3NNYXAgPSBuZXcgTWFwKCk7XG4gIHZhciBtYWtlRmFsbGJhY2tDaGVja3MgPSB0cnVlO1xuICB2YXIgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gcGxhY2VtZW50c1swXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBsYWNlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcGxhY2VtZW50ID0gcGxhY2VtZW50c1tpXTtcblxuICAgIHZhciBfYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KTtcblxuICAgIHZhciBpc1N0YXJ0VmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgPT09IHN0YXJ0O1xuICAgIHZhciBpc1ZlcnRpY2FsID0gW3RvcCwgYm90dG9tXS5pbmRleE9mKF9iYXNlUGxhY2VtZW50KSA+PSAwO1xuICAgIHZhciBsZW4gPSBpc1ZlcnRpY2FsID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgIHZhciBvdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeTogcm9vdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnk6IGFsdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZzogcGFkZGluZ1xuICAgIH0pO1xuICAgIHZhciBtYWluVmFyaWF0aW9uU2lkZSA9IGlzVmVydGljYWwgPyBpc1N0YXJ0VmFyaWF0aW9uID8gcmlnaHQgOiBsZWZ0IDogaXNTdGFydFZhcmlhdGlvbiA/IGJvdHRvbSA6IHRvcDtcblxuICAgIGlmIChyZWZlcmVuY2VSZWN0W2xlbl0gPiBwb3BwZXJSZWN0W2xlbl0pIHtcbiAgICAgIG1haW5WYXJpYXRpb25TaWRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpblZhcmlhdGlvblNpZGUpO1xuICAgIH1cblxuICAgIHZhciBhbHRWYXJpYXRpb25TaWRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpblZhcmlhdGlvblNpZGUpO1xuICAgIHZhciBjaGVja3MgPSBbXTtcblxuICAgIGlmIChjaGVja01haW5BeGlzKSB7XG4gICAgICBjaGVja3MucHVzaChvdmVyZmxvd1tfYmFzZVBsYWNlbWVudF0gPD0gMCk7XG4gICAgfVxuXG4gICAgaWYgKGNoZWNrQWx0QXhpcykge1xuICAgICAgY2hlY2tzLnB1c2gob3ZlcmZsb3dbbWFpblZhcmlhdGlvblNpZGVdIDw9IDAsIG92ZXJmbG93W2FsdFZhcmlhdGlvblNpZGVdIDw9IDApO1xuICAgIH1cblxuICAgIGlmIChjaGVja3MuZXZlcnkoZnVuY3Rpb24gKGNoZWNrKSB7XG4gICAgICByZXR1cm4gY2hlY2s7XG4gICAgfSkpIHtcbiAgICAgIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudDtcbiAgICAgIG1ha2VGYWxsYmFja0NoZWNrcyA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY2hlY2tzTWFwLnNldChwbGFjZW1lbnQsIGNoZWNrcyk7XG4gIH1cblxuICBpZiAobWFrZUZhbGxiYWNrQ2hlY2tzKSB7XG4gICAgLy8gYDJgIG1heSBiZSBkZXNpcmVkIGluIHNvbWUgY2FzZXMg4oCTIHJlc2VhcmNoIGxhdGVyXG4gICAgdmFyIG51bWJlck9mQ2hlY2tzID0gZmxpcFZhcmlhdGlvbnMgPyAzIDogMTtcblxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKF9pKSB7XG4gICAgICB2YXIgZml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudHMuZmluZChmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgICAgIHZhciBjaGVja3MgPSBjaGVja3NNYXAuZ2V0KHBsYWNlbWVudCk7XG5cbiAgICAgICAgaWYgKGNoZWNrcykge1xuICAgICAgICAgIHJldHVybiBjaGVja3Muc2xpY2UoMCwgX2kpLmV2ZXJ5KGZ1bmN0aW9uIChjaGVjaykge1xuICAgICAgICAgICAgcmV0dXJuIGNoZWNrO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKGZpdHRpbmdQbGFjZW1lbnQpIHtcbiAgICAgICAgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gZml0dGluZ1BsYWNlbWVudDtcbiAgICAgICAgcmV0dXJuIFwiYnJlYWtcIjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yICh2YXIgX2kgPSBudW1iZXJPZkNoZWNrczsgX2kgPiAwOyBfaS0tKSB7XG4gICAgICB2YXIgX3JldCA9IF9sb29wKF9pKTtcblxuICAgICAgaWYgKF9yZXQgPT09IFwiYnJlYWtcIikgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLnBsYWNlbWVudCAhPT0gZmlyc3RGaXR0aW5nUGxhY2VtZW50KSB7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXS5fc2tpcCA9IHRydWU7XG4gICAgc3RhdGUucGxhY2VtZW50ID0gZmlyc3RGaXR0aW5nUGxhY2VtZW50O1xuICAgIHN0YXRlLnJlc2V0ID0gdHJ1ZTtcbiAgfVxufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnZmxpcCcsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIGZuOiBmbGlwLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ29mZnNldCddLFxuICBkYXRhOiB7XG4gICAgX3NraXA6IGZhbHNlXG4gIH1cbn07IiwiaW1wb3J0IHsgdG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0IH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4uL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzXCI7XG5cbmZ1bmN0aW9uIGdldFNpZGVPZmZzZXRzKG92ZXJmbG93LCByZWN0LCBwcmV2ZW50ZWRPZmZzZXRzKSB7XG4gIGlmIChwcmV2ZW50ZWRPZmZzZXRzID09PSB2b2lkIDApIHtcbiAgICBwcmV2ZW50ZWRPZmZzZXRzID0ge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0b3A6IG92ZXJmbG93LnRvcCAtIHJlY3QuaGVpZ2h0IC0gcHJldmVudGVkT2Zmc2V0cy55LFxuICAgIHJpZ2h0OiBvdmVyZmxvdy5yaWdodCAtIHJlY3Qud2lkdGggKyBwcmV2ZW50ZWRPZmZzZXRzLngsXG4gICAgYm90dG9tOiBvdmVyZmxvdy5ib3R0b20gLSByZWN0LmhlaWdodCArIHByZXZlbnRlZE9mZnNldHMueSxcbiAgICBsZWZ0OiBvdmVyZmxvdy5sZWZ0IC0gcmVjdC53aWR0aCAtIHByZXZlbnRlZE9mZnNldHMueFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc0FueVNpZGVGdWxseUNsaXBwZWQob3ZlcmZsb3cpIHtcbiAgcmV0dXJuIFt0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnRdLnNvbWUoZnVuY3Rpb24gKHNpZGUpIHtcbiAgICByZXR1cm4gb3ZlcmZsb3dbc2lkZV0gPj0gMDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGhpZGUoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcbiAgdmFyIHJlZmVyZW5jZVJlY3QgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2U7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgcHJldmVudGVkT2Zmc2V0cyA9IHN0YXRlLm1vZGlmaWVyc0RhdGEucHJldmVudE92ZXJmbG93O1xuICB2YXIgcmVmZXJlbmNlT3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgIGVsZW1lbnRDb250ZXh0OiAncmVmZXJlbmNlJ1xuICB9KTtcbiAgdmFyIHBvcHBlckFsdE92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICBhbHRCb3VuZGFyeTogdHJ1ZVxuICB9KTtcbiAgdmFyIHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0cyA9IGdldFNpZGVPZmZzZXRzKHJlZmVyZW5jZU92ZXJmbG93LCByZWZlcmVuY2VSZWN0KTtcbiAgdmFyIHBvcHBlckVzY2FwZU9mZnNldHMgPSBnZXRTaWRlT2Zmc2V0cyhwb3BwZXJBbHRPdmVyZmxvdywgcG9wcGVyUmVjdCwgcHJldmVudGVkT2Zmc2V0cyk7XG4gIHZhciBpc1JlZmVyZW5jZUhpZGRlbiA9IGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChyZWZlcmVuY2VDbGlwcGluZ09mZnNldHMpO1xuICB2YXIgaGFzUG9wcGVyRXNjYXBlZCA9IGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChwb3BwZXJFc2NhcGVPZmZzZXRzKTtcbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IHtcbiAgICByZWZlcmVuY2VDbGlwcGluZ09mZnNldHM6IHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0cyxcbiAgICBwb3BwZXJFc2NhcGVPZmZzZXRzOiBwb3BwZXJFc2NhcGVPZmZzZXRzLFxuICAgIGlzUmVmZXJlbmNlSGlkZGVuOiBpc1JlZmVyZW5jZUhpZGRlbixcbiAgICBoYXNQb3BwZXJFc2NhcGVkOiBoYXNQb3BwZXJFc2NhcGVkXG4gIH07XG4gIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIsIHtcbiAgICAnZGF0YS1wb3BwZXItcmVmZXJlbmNlLWhpZGRlbic6IGlzUmVmZXJlbmNlSGlkZGVuLFxuICAgICdkYXRhLXBvcHBlci1lc2NhcGVkJzogaGFzUG9wcGVyRXNjYXBlZFxuICB9KTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2hpZGUnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ3ByZXZlbnRPdmVyZmxvdyddLFxuICBmbjogaGlkZVxufTsiLCJpbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgdG9wLCBsZWZ0LCByaWdodCwgcGxhY2VtZW50cyB9IGZyb20gXCIuLi9lbnVtcy5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZUFuZFNraWRkaW5nVG9YWShwbGFjZW1lbnQsIHJlY3RzLCBvZmZzZXQpIHtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCk7XG4gIHZhciBpbnZlcnREaXN0YW5jZSA9IFtsZWZ0LCB0b3BdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMCA/IC0xIDogMTtcblxuICB2YXIgX3JlZiA9IHR5cGVvZiBvZmZzZXQgPT09ICdmdW5jdGlvbicgPyBvZmZzZXQoT2JqZWN0LmFzc2lnbih7fSwgcmVjdHMsIHtcbiAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudFxuICB9KSkgOiBvZmZzZXQsXG4gICAgICBza2lkZGluZyA9IF9yZWZbMF0sXG4gICAgICBkaXN0YW5jZSA9IF9yZWZbMV07XG5cbiAgc2tpZGRpbmcgPSBza2lkZGluZyB8fCAwO1xuICBkaXN0YW5jZSA9IChkaXN0YW5jZSB8fCAwKSAqIGludmVydERpc3RhbmNlO1xuICByZXR1cm4gW2xlZnQsIHJpZ2h0XS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpID49IDAgPyB7XG4gICAgeDogZGlzdGFuY2UsXG4gICAgeTogc2tpZGRpbmdcbiAgfSA6IHtcbiAgICB4OiBza2lkZGluZyxcbiAgICB5OiBkaXN0YW5jZVxuICB9O1xufVxuXG5mdW5jdGlvbiBvZmZzZXQoX3JlZjIpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjIuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZjIub3B0aW9ucyxcbiAgICAgIG5hbWUgPSBfcmVmMi5uYW1lO1xuICB2YXIgX29wdGlvbnMkb2Zmc2V0ID0gb3B0aW9ucy5vZmZzZXQsXG4gICAgICBvZmZzZXQgPSBfb3B0aW9ucyRvZmZzZXQgPT09IHZvaWQgMCA/IFswLCAwXSA6IF9vcHRpb25zJG9mZnNldDtcbiAgdmFyIGRhdGEgPSBwbGFjZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICBhY2NbcGxhY2VtZW50XSA9IGRpc3RhbmNlQW5kU2tpZGRpbmdUb1hZKHBsYWNlbWVudCwgc3RhdGUucmVjdHMsIG9mZnNldCk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xuICB2YXIgX2RhdGEkc3RhdGUkcGxhY2VtZW50ID0gZGF0YVtzdGF0ZS5wbGFjZW1lbnRdLFxuICAgICAgeCA9IF9kYXRhJHN0YXRlJHBsYWNlbWVudC54LFxuICAgICAgeSA9IF9kYXRhJHN0YXRlJHBsYWNlbWVudC55O1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMgIT0gbnVsbCkge1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cy54ICs9IHg7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLnkgKz0geTtcbiAgfVxuXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBkYXRhO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnb2Zmc2V0JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgcmVxdWlyZXM6IFsncG9wcGVyT2Zmc2V0cyddLFxuICBmbjogb2Zmc2V0XG59OyIsImltcG9ydCBjb21wdXRlT2Zmc2V0cyBmcm9tIFwiLi4vdXRpbHMvY29tcHV0ZU9mZnNldHMuanNcIjtcblxuZnVuY3Rpb24gcG9wcGVyT2Zmc2V0cyhfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICAvLyBPZmZzZXRzIGFyZSB0aGUgYWN0dWFsIHBvc2l0aW9uIHRoZSBwb3BwZXIgbmVlZHMgdG8gaGF2ZSB0byBiZVxuICAvLyBwcm9wZXJseSBwb3NpdGlvbmVkIG5lYXIgaXRzIHJlZmVyZW5jZSBlbGVtZW50XG4gIC8vIFRoaXMgaXMgdGhlIG1vc3QgYmFzaWMgcGxhY2VtZW50LCBhbmQgd2lsbCBiZSBhZGp1c3RlZCBieVxuICAvLyB0aGUgbW9kaWZpZXJzIGluIHRoZSBuZXh0IHN0ZXBcbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IGNvbXB1dGVPZmZzZXRzKHtcbiAgICByZWZlcmVuY2U6IHN0YXRlLnJlY3RzLnJlZmVyZW5jZSxcbiAgICBlbGVtZW50OiBzdGF0ZS5yZWN0cy5wb3BwZXIsXG4gICAgc3RyYXRlZ3k6ICdhYnNvbHV0ZScsXG4gICAgcGxhY2VtZW50OiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdwb3BwZXJPZmZzZXRzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdyZWFkJyxcbiAgZm46IHBvcHBlck9mZnNldHMsXG4gIGRhdGE6IHt9XG59OyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEFsdEF4aXMoYXhpcykge1xuICByZXR1cm4gYXhpcyA9PT0gJ3gnID8gJ3knIDogJ3gnO1xufSIsImltcG9ydCB7IHRvcCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgc3RhcnQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRBbHRBeGlzIGZyb20gXCIuLi91dGlscy9nZXRBbHRBeGlzLmpzXCI7XG5pbXBvcnQgeyB3aXRoaW4sIHdpdGhpbk1heENsYW1wIH0gZnJvbSBcIi4uL3V0aWxzL3dpdGhpbi5qc1wiO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRMYXlvdXRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4uL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuLi91dGlscy9nZXRWYXJpYXRpb24uanNcIjtcbmltcG9ydCBnZXRGcmVzaFNpZGVPYmplY3QgZnJvbSBcIi4uL3V0aWxzL2dldEZyZXNoU2lkZU9iamVjdC5qc1wiO1xuaW1wb3J0IHsgbWluIGFzIG1hdGhNaW4sIG1heCBhcyBtYXRoTWF4IH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcblxuZnVuY3Rpb24gcHJldmVudE92ZXJmbG93KF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICB2YXIgX29wdGlvbnMkbWFpbkF4aXMgPSBvcHRpb25zLm1haW5BeGlzLFxuICAgICAgY2hlY2tNYWluQXhpcyA9IF9vcHRpb25zJG1haW5BeGlzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkbWFpbkF4aXMsXG4gICAgICBfb3B0aW9ucyRhbHRBeGlzID0gb3B0aW9ucy5hbHRBeGlzLFxuICAgICAgY2hlY2tBbHRBeGlzID0gX29wdGlvbnMkYWx0QXhpcyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfb3B0aW9ucyRhbHRBeGlzLFxuICAgICAgYm91bmRhcnkgPSBvcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IG9wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBwYWRkaW5nID0gb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgX29wdGlvbnMkdGV0aGVyID0gb3B0aW9ucy50ZXRoZXIsXG4gICAgICB0ZXRoZXIgPSBfb3B0aW9ucyR0ZXRoZXIgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyR0ZXRoZXIsXG4gICAgICBfb3B0aW9ucyR0ZXRoZXJPZmZzZXQgPSBvcHRpb25zLnRldGhlck9mZnNldCxcbiAgICAgIHRldGhlck9mZnNldCA9IF9vcHRpb25zJHRldGhlck9mZnNldCA9PT0gdm9pZCAwID8gMCA6IF9vcHRpb25zJHRldGhlck9mZnNldDtcbiAgdmFyIG92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgcGFkZGluZzogcGFkZGluZyxcbiAgICBhbHRCb3VuZGFyeTogYWx0Qm91bmRhcnlcbiAgfSk7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpO1xuICB2YXIgdmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciBpc0Jhc2VQbGFjZW1lbnQgPSAhdmFyaWF0aW9uO1xuICB2YXIgbWFpbkF4aXMgPSBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQoYmFzZVBsYWNlbWVudCk7XG4gIHZhciBhbHRBeGlzID0gZ2V0QWx0QXhpcyhtYWluQXhpcyk7XG4gIHZhciBwb3BwZXJPZmZzZXRzID0gc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciB0ZXRoZXJPZmZzZXRWYWx1ZSA9IHR5cGVvZiB0ZXRoZXJPZmZzZXQgPT09ICdmdW5jdGlvbicgPyB0ZXRoZXJPZmZzZXQoT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUucmVjdHMsIHtcbiAgICBwbGFjZW1lbnQ6IHN0YXRlLnBsYWNlbWVudFxuICB9KSkgOiB0ZXRoZXJPZmZzZXQ7XG4gIHZhciBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUgPSB0eXBlb2YgdGV0aGVyT2Zmc2V0VmFsdWUgPT09ICdudW1iZXInID8ge1xuICAgIG1haW5BeGlzOiB0ZXRoZXJPZmZzZXRWYWx1ZSxcbiAgICBhbHRBeGlzOiB0ZXRoZXJPZmZzZXRWYWx1ZVxuICB9IDogT2JqZWN0LmFzc2lnbih7XG4gICAgbWFpbkF4aXM6IDAsXG4gICAgYWx0QXhpczogMFxuICB9LCB0ZXRoZXJPZmZzZXRWYWx1ZSk7XG4gIHZhciBvZmZzZXRNb2RpZmllclN0YXRlID0gc3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXQgPyBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldFtzdGF0ZS5wbGFjZW1lbnRdIDogbnVsbDtcbiAgdmFyIGRhdGEgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG5cbiAgaWYgKCFwb3BwZXJPZmZzZXRzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGNoZWNrTWFpbkF4aXMpIHtcbiAgICB2YXIgX29mZnNldE1vZGlmaWVyU3RhdGUkO1xuXG4gICAgdmFyIG1haW5TaWRlID0gbWFpbkF4aXMgPT09ICd5JyA/IHRvcCA6IGxlZnQ7XG4gICAgdmFyIGFsdFNpZGUgPSBtYWluQXhpcyA9PT0gJ3knID8gYm90dG9tIDogcmlnaHQ7XG4gICAgdmFyIGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG4gICAgdmFyIG9mZnNldCA9IHBvcHBlck9mZnNldHNbbWFpbkF4aXNdO1xuICAgIHZhciBtaW4gPSBvZmZzZXQgKyBvdmVyZmxvd1ttYWluU2lkZV07XG4gICAgdmFyIG1heCA9IG9mZnNldCAtIG92ZXJmbG93W2FsdFNpZGVdO1xuICAgIHZhciBhZGRpdGl2ZSA9IHRldGhlciA/IC1wb3BwZXJSZWN0W2xlbl0gLyAyIDogMDtcbiAgICB2YXIgbWluTGVuID0gdmFyaWF0aW9uID09PSBzdGFydCA/IHJlZmVyZW5jZVJlY3RbbGVuXSA6IHBvcHBlclJlY3RbbGVuXTtcbiAgICB2YXIgbWF4TGVuID0gdmFyaWF0aW9uID09PSBzdGFydCA/IC1wb3BwZXJSZWN0W2xlbl0gOiAtcmVmZXJlbmNlUmVjdFtsZW5dOyAvLyBXZSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFycm93IGluIHRoZSBjYWxjdWxhdGlvbiBzbyB0aGUgYXJyb3cgZG9lc24ndCBnb1xuICAgIC8vIG91dHNpZGUgdGhlIHJlZmVyZW5jZSBib3VuZHNcblxuICAgIHZhciBhcnJvd0VsZW1lbnQgPSBzdGF0ZS5lbGVtZW50cy5hcnJvdztcbiAgICB2YXIgYXJyb3dSZWN0ID0gdGV0aGVyICYmIGFycm93RWxlbWVudCA/IGdldExheW91dFJlY3QoYXJyb3dFbGVtZW50KSA6IHtcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwXG4gICAgfTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nT2JqZWN0ID0gc3RhdGUubW9kaWZpZXJzRGF0YVsnYXJyb3cjcGVyc2lzdGVudCddID8gc3RhdGUubW9kaWZpZXJzRGF0YVsnYXJyb3cjcGVyc2lzdGVudCddLnBhZGRpbmcgOiBnZXRGcmVzaFNpZGVPYmplY3QoKTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nTWluID0gYXJyb3dQYWRkaW5nT2JqZWN0W21haW5TaWRlXTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nTWF4ID0gYXJyb3dQYWRkaW5nT2JqZWN0W2FsdFNpZGVdOyAvLyBJZiB0aGUgcmVmZXJlbmNlIGxlbmd0aCBpcyBzbWFsbGVyIHRoYW4gdGhlIGFycm93IGxlbmd0aCwgd2UgZG9uJ3Qgd2FudFxuICAgIC8vIHRvIGluY2x1ZGUgaXRzIGZ1bGwgc2l6ZSBpbiB0aGUgY2FsY3VsYXRpb24uIElmIHRoZSByZWZlcmVuY2UgaXMgc21hbGxcbiAgICAvLyBhbmQgbmVhciB0aGUgZWRnZSBvZiBhIGJvdW5kYXJ5LCB0aGUgcG9wcGVyIGNhbiBvdmVyZmxvdyBldmVuIGlmIHRoZVxuICAgIC8vIHJlZmVyZW5jZSBpcyBub3Qgb3ZlcmZsb3dpbmcgYXMgd2VsbCAoZS5nLiB2aXJ0dWFsIGVsZW1lbnRzIHdpdGggbm9cbiAgICAvLyB3aWR0aCBvciBoZWlnaHQpXG5cbiAgICB2YXIgYXJyb3dMZW4gPSB3aXRoaW4oMCwgcmVmZXJlbmNlUmVjdFtsZW5dLCBhcnJvd1JlY3RbbGVuXSk7XG4gICAgdmFyIG1pbk9mZnNldCA9IGlzQmFzZVBsYWNlbWVudCA/IHJlZmVyZW5jZVJlY3RbbGVuXSAvIDIgLSBhZGRpdGl2ZSAtIGFycm93TGVuIC0gYXJyb3dQYWRkaW5nTWluIC0gbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzIDogbWluTGVuIC0gYXJyb3dMZW4gLSBhcnJvd1BhZGRpbmdNaW4gLSBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXM7XG4gICAgdmFyIG1heE9mZnNldCA9IGlzQmFzZVBsYWNlbWVudCA/IC1yZWZlcmVuY2VSZWN0W2xlbl0gLyAyICsgYWRkaXRpdmUgKyBhcnJvd0xlbiArIGFycm93UGFkZGluZ01heCArIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5tYWluQXhpcyA6IG1heExlbiArIGFycm93TGVuICsgYXJyb3dQYWRkaW5nTWF4ICsgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzO1xuICAgIHZhciBhcnJvd09mZnNldFBhcmVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93ICYmIGdldE9mZnNldFBhcmVudChzdGF0ZS5lbGVtZW50cy5hcnJvdyk7XG4gICAgdmFyIGNsaWVudE9mZnNldCA9IGFycm93T2Zmc2V0UGFyZW50ID8gbWFpbkF4aXMgPT09ICd5JyA/IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudFRvcCB8fCAwIDogYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50TGVmdCB8fCAwIDogMDtcbiAgICB2YXIgb2Zmc2V0TW9kaWZpZXJWYWx1ZSA9IChfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQgPSBvZmZzZXRNb2RpZmllclN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBvZmZzZXRNb2RpZmllclN0YXRlW21haW5BeGlzXSkgIT0gbnVsbCA/IF9vZmZzZXRNb2RpZmllclN0YXRlJCA6IDA7XG4gICAgdmFyIHRldGhlck1pbiA9IG9mZnNldCArIG1pbk9mZnNldCAtIG9mZnNldE1vZGlmaWVyVmFsdWUgLSBjbGllbnRPZmZzZXQ7XG4gICAgdmFyIHRldGhlck1heCA9IG9mZnNldCArIG1heE9mZnNldCAtIG9mZnNldE1vZGlmaWVyVmFsdWU7XG4gICAgdmFyIHByZXZlbnRlZE9mZnNldCA9IHdpdGhpbih0ZXRoZXIgPyBtYXRoTWluKG1pbiwgdGV0aGVyTWluKSA6IG1pbiwgb2Zmc2V0LCB0ZXRoZXIgPyBtYXRoTWF4KG1heCwgdGV0aGVyTWF4KSA6IG1heCk7XG4gICAgcG9wcGVyT2Zmc2V0c1ttYWluQXhpc10gPSBwcmV2ZW50ZWRPZmZzZXQ7XG4gICAgZGF0YVttYWluQXhpc10gPSBwcmV2ZW50ZWRPZmZzZXQgLSBvZmZzZXQ7XG4gIH1cblxuICBpZiAoY2hlY2tBbHRBeGlzKSB7XG4gICAgdmFyIF9vZmZzZXRNb2RpZmllclN0YXRlJDI7XG5cbiAgICB2YXIgX21haW5TaWRlID0gbWFpbkF4aXMgPT09ICd4JyA/IHRvcCA6IGxlZnQ7XG5cbiAgICB2YXIgX2FsdFNpZGUgPSBtYWluQXhpcyA9PT0gJ3gnID8gYm90dG9tIDogcmlnaHQ7XG5cbiAgICB2YXIgX29mZnNldCA9IHBvcHBlck9mZnNldHNbYWx0QXhpc107XG5cbiAgICB2YXIgX2xlbiA9IGFsdEF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICAgIHZhciBfbWluID0gX29mZnNldCArIG92ZXJmbG93W19tYWluU2lkZV07XG5cbiAgICB2YXIgX21heCA9IF9vZmZzZXQgLSBvdmVyZmxvd1tfYWx0U2lkZV07XG5cbiAgICB2YXIgaXNPcmlnaW5TaWRlID0gW3RvcCwgbGVmdF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSAhPT0gLTE7XG5cbiAgICB2YXIgX29mZnNldE1vZGlmaWVyVmFsdWUgPSAoX29mZnNldE1vZGlmaWVyU3RhdGUkMiA9IG9mZnNldE1vZGlmaWVyU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IG9mZnNldE1vZGlmaWVyU3RhdGVbYWx0QXhpc10pICE9IG51bGwgPyBfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQyIDogMDtcblxuICAgIHZhciBfdGV0aGVyTWluID0gaXNPcmlnaW5TaWRlID8gX21pbiA6IF9vZmZzZXQgLSByZWZlcmVuY2VSZWN0W19sZW5dIC0gcG9wcGVyUmVjdFtfbGVuXSAtIF9vZmZzZXRNb2RpZmllclZhbHVlICsgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLmFsdEF4aXM7XG5cbiAgICB2YXIgX3RldGhlck1heCA9IGlzT3JpZ2luU2lkZSA/IF9vZmZzZXQgKyByZWZlcmVuY2VSZWN0W19sZW5dICsgcG9wcGVyUmVjdFtfbGVuXSAtIF9vZmZzZXRNb2RpZmllclZhbHVlIC0gbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLmFsdEF4aXMgOiBfbWF4O1xuXG4gICAgdmFyIF9wcmV2ZW50ZWRPZmZzZXQgPSB0ZXRoZXIgJiYgaXNPcmlnaW5TaWRlID8gd2l0aGluTWF4Q2xhbXAoX3RldGhlck1pbiwgX29mZnNldCwgX3RldGhlck1heCkgOiB3aXRoaW4odGV0aGVyID8gX3RldGhlck1pbiA6IF9taW4sIF9vZmZzZXQsIHRldGhlciA/IF90ZXRoZXJNYXggOiBfbWF4KTtcblxuICAgIHBvcHBlck9mZnNldHNbYWx0QXhpc10gPSBfcHJldmVudGVkT2Zmc2V0O1xuICAgIGRhdGFbYWx0QXhpc10gPSBfcHJldmVudGVkT2Zmc2V0IC0gX29mZnNldDtcbiAgfVxuXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBkYXRhO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAncHJldmVudE92ZXJmbG93JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgZm46IHByZXZlbnRPdmVyZmxvdyxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydvZmZzZXQnXVxufTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRIVE1MRWxlbWVudFNjcm9sbChlbGVtZW50KSB7XG4gIHJldHVybiB7XG4gICAgc2Nyb2xsTGVmdDogZWxlbWVudC5zY3JvbGxMZWZ0LFxuICAgIHNjcm9sbFRvcDogZWxlbWVudC5zY3JvbGxUb3BcbiAgfTtcbn0iLCJpbXBvcnQgZ2V0V2luZG93U2Nyb2xsIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgZ2V0SFRNTEVsZW1lbnRTY3JvbGwgZnJvbSBcIi4vZ2V0SFRNTEVsZW1lbnRTY3JvbGwuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE5vZGVTY3JvbGwobm9kZSkge1xuICBpZiAobm9kZSA9PT0gZ2V0V2luZG93KG5vZGUpIHx8ICFpc0hUTUxFbGVtZW50KG5vZGUpKSB7XG4gICAgcmV0dXJuIGdldFdpbmRvd1Njcm9sbChub2RlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZ2V0SFRNTEVsZW1lbnRTY3JvbGwobm9kZSk7XG4gIH1cbn0iLCJpbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGdldE5vZGVTY3JvbGwgZnJvbSBcIi4vZ2V0Tm9kZVNjcm9sbC5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbEJhclggZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsQmFyWC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBpc1Njcm9sbFBhcmVudCBmcm9tIFwiLi9pc1Njcm9sbFBhcmVudC5qc1wiO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiBpc0VsZW1lbnRTY2FsZWQoZWxlbWVudCkge1xuICB2YXIgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHZhciBzY2FsZVggPSByb3VuZChyZWN0LndpZHRoKSAvIGVsZW1lbnQub2Zmc2V0V2lkdGggfHwgMTtcbiAgdmFyIHNjYWxlWSA9IHJvdW5kKHJlY3QuaGVpZ2h0KSAvIGVsZW1lbnQub2Zmc2V0SGVpZ2h0IHx8IDE7XG4gIHJldHVybiBzY2FsZVggIT09IDEgfHwgc2NhbGVZICE9PSAxO1xufSAvLyBSZXR1cm5zIHRoZSBjb21wb3NpdGUgcmVjdCBvZiBhbiBlbGVtZW50IHJlbGF0aXZlIHRvIGl0cyBvZmZzZXRQYXJlbnQuXG4vLyBDb21wb3NpdGUgbWVhbnMgaXQgdGFrZXMgaW50byBhY2NvdW50IHRyYW5zZm9ybXMgYXMgd2VsbCBhcyBsYXlvdXQuXG5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q29tcG9zaXRlUmVjdChlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCwgb2Zmc2V0UGFyZW50LCBpc0ZpeGVkKSB7XG4gIGlmIChpc0ZpeGVkID09PSB2b2lkIDApIHtcbiAgICBpc0ZpeGVkID0gZmFsc2U7XG4gIH1cblxuICB2YXIgaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgPSBpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCk7XG4gIHZhciBvZmZzZXRQYXJlbnRJc1NjYWxlZCA9IGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KSAmJiBpc0VsZW1lbnRTY2FsZWQob2Zmc2V0UGFyZW50KTtcbiAgdmFyIGRvY3VtZW50RWxlbWVudCA9IGdldERvY3VtZW50RWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICB2YXIgcmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCwgb2Zmc2V0UGFyZW50SXNTY2FsZWQsIGlzRml4ZWQpO1xuICB2YXIgc2Nyb2xsID0ge1xuICAgIHNjcm9sbExlZnQ6IDAsXG4gICAgc2Nyb2xsVG9wOiAwXG4gIH07XG4gIHZhciBvZmZzZXRzID0ge1xuICAgIHg6IDAsXG4gICAgeTogMFxuICB9O1xuXG4gIGlmIChpc09mZnNldFBhcmVudEFuRWxlbWVudCB8fCAhaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgJiYgIWlzRml4ZWQpIHtcbiAgICBpZiAoZ2V0Tm9kZU5hbWUob2Zmc2V0UGFyZW50KSAhPT0gJ2JvZHknIHx8IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvMTA3OFxuICAgIGlzU2Nyb2xsUGFyZW50KGRvY3VtZW50RWxlbWVudCkpIHtcbiAgICAgIHNjcm9sbCA9IGdldE5vZGVTY3JvbGwob2Zmc2V0UGFyZW50KTtcbiAgICB9XG5cbiAgICBpZiAoaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpKSB7XG4gICAgICBvZmZzZXRzID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KG9mZnNldFBhcmVudCwgdHJ1ZSk7XG4gICAgICBvZmZzZXRzLnggKz0gb2Zmc2V0UGFyZW50LmNsaWVudExlZnQ7XG4gICAgICBvZmZzZXRzLnkgKz0gb2Zmc2V0UGFyZW50LmNsaWVudFRvcDtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50RWxlbWVudCkge1xuICAgICAgb2Zmc2V0cy54ID0gZ2V0V2luZG93U2Nyb2xsQmFyWChkb2N1bWVudEVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgeDogcmVjdC5sZWZ0ICsgc2Nyb2xsLnNjcm9sbExlZnQgLSBvZmZzZXRzLngsXG4gICAgeTogcmVjdC50b3AgKyBzY3JvbGwuc2Nyb2xsVG9wIC0gb2Zmc2V0cy55LFxuICAgIHdpZHRoOiByZWN0LndpZHRoLFxuICAgIGhlaWdodDogcmVjdC5oZWlnaHRcbiAgfTtcbn0iLCJpbXBvcnQgeyBtb2RpZmllclBoYXNlcyB9IGZyb20gXCIuLi9lbnVtcy5qc1wiOyAvLyBzb3VyY2U6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ5ODc1MjU1XG5cbmZ1bmN0aW9uIG9yZGVyKG1vZGlmaWVycykge1xuICB2YXIgbWFwID0gbmV3IE1hcCgpO1xuICB2YXIgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBtb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICBtYXAuc2V0KG1vZGlmaWVyLm5hbWUsIG1vZGlmaWVyKTtcbiAgfSk7IC8vIE9uIHZpc2l0aW5nIG9iamVjdCwgY2hlY2sgZm9yIGl0cyBkZXBlbmRlbmNpZXMgYW5kIHZpc2l0IHRoZW0gcmVjdXJzaXZlbHlcblxuICBmdW5jdGlvbiBzb3J0KG1vZGlmaWVyKSB7XG4gICAgdmlzaXRlZC5hZGQobW9kaWZpZXIubmFtZSk7XG4gICAgdmFyIHJlcXVpcmVzID0gW10uY29uY2F0KG1vZGlmaWVyLnJlcXVpcmVzIHx8IFtdLCBtb2RpZmllci5yZXF1aXJlc0lmRXhpc3RzIHx8IFtdKTtcbiAgICByZXF1aXJlcy5mb3JFYWNoKGZ1bmN0aW9uIChkZXApIHtcbiAgICAgIGlmICghdmlzaXRlZC5oYXMoZGVwKSkge1xuICAgICAgICB2YXIgZGVwTW9kaWZpZXIgPSBtYXAuZ2V0KGRlcCk7XG5cbiAgICAgICAgaWYgKGRlcE1vZGlmaWVyKSB7XG4gICAgICAgICAgc29ydChkZXBNb2RpZmllcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXN1bHQucHVzaChtb2RpZmllcik7XG4gIH1cblxuICBtb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICBpZiAoIXZpc2l0ZWQuaGFzKG1vZGlmaWVyLm5hbWUpKSB7XG4gICAgICAvLyBjaGVjayBmb3IgdmlzaXRlZCBvYmplY3RcbiAgICAgIHNvcnQobW9kaWZpZXIpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG9yZGVyTW9kaWZpZXJzKG1vZGlmaWVycykge1xuICAvLyBvcmRlciBiYXNlZCBvbiBkZXBlbmRlbmNpZXNcbiAgdmFyIG9yZGVyZWRNb2RpZmllcnMgPSBvcmRlcihtb2RpZmllcnMpOyAvLyBvcmRlciBiYXNlZCBvbiBwaGFzZVxuXG4gIHJldHVybiBtb2RpZmllclBoYXNlcy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGhhc2UpIHtcbiAgICByZXR1cm4gYWNjLmNvbmNhdChvcmRlcmVkTW9kaWZpZXJzLmZpbHRlcihmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICAgIHJldHVybiBtb2RpZmllci5waGFzZSA9PT0gcGhhc2U7XG4gICAgfSkpO1xuICB9LCBbXSk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGVib3VuY2UoZm4pIHtcbiAgdmFyIHBlbmRpbmc7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICBwZW5kaW5nID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcGVuZGluZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICByZXNvbHZlKGZuKCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBwZW5kaW5nO1xuICB9O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lcmdlQnlOYW1lKG1vZGlmaWVycykge1xuICB2YXIgbWVyZ2VkID0gbW9kaWZpZXJzLnJlZHVjZShmdW5jdGlvbiAobWVyZ2VkLCBjdXJyZW50KSB7XG4gICAgdmFyIGV4aXN0aW5nID0gbWVyZ2VkW2N1cnJlbnQubmFtZV07XG4gICAgbWVyZ2VkW2N1cnJlbnQubmFtZV0gPSBleGlzdGluZyA/IE9iamVjdC5hc3NpZ24oe30sIGV4aXN0aW5nLCBjdXJyZW50LCB7XG4gICAgICBvcHRpb25zOiBPYmplY3QuYXNzaWduKHt9LCBleGlzdGluZy5vcHRpb25zLCBjdXJyZW50Lm9wdGlvbnMpLFxuICAgICAgZGF0YTogT2JqZWN0LmFzc2lnbih7fSwgZXhpc3RpbmcuZGF0YSwgY3VycmVudC5kYXRhKVxuICAgIH0pIDogY3VycmVudDtcbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9LCB7fSk7IC8vIElFMTEgZG9lcyBub3Qgc3VwcG9ydCBPYmplY3QudmFsdWVzXG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKG1lcmdlZCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gbWVyZ2VkW2tleV07XG4gIH0pO1xufSIsImltcG9ydCBnZXRDb21wb3NpdGVSZWN0IGZyb20gXCIuL2RvbS11dGlscy9nZXRDb21wb3NpdGVSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0TGF5b3V0UmVjdCBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0TGF5b3V0UmVjdC5qc1wiO1xuaW1wb3J0IGxpc3RTY3JvbGxQYXJlbnRzIGZyb20gXCIuL2RvbS11dGlscy9saXN0U2Nyb2xsUGFyZW50cy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgb3JkZXJNb2RpZmllcnMgZnJvbSBcIi4vdXRpbHMvb3JkZXJNb2RpZmllcnMuanNcIjtcbmltcG9ydCBkZWJvdW5jZSBmcm9tIFwiLi91dGlscy9kZWJvdW5jZS5qc1wiO1xuaW1wb3J0IG1lcmdlQnlOYW1lIGZyb20gXCIuL3V0aWxzL21lcmdlQnlOYW1lLmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCB7IGlzRWxlbWVudCB9IGZyb20gXCIuL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzXCI7XG52YXIgREVGQVVMVF9PUFRJT05TID0ge1xuICBwbGFjZW1lbnQ6ICdib3R0b20nLFxuICBtb2RpZmllcnM6IFtdLFxuICBzdHJhdGVneTogJ2Fic29sdXRlJ1xufTtcblxuZnVuY3Rpb24gYXJlVmFsaWRFbGVtZW50cygpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiAhYXJncy5zb21lKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgcmV0dXJuICEoZWxlbWVudCAmJiB0eXBlb2YgZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPT09ICdmdW5jdGlvbicpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBvcHBlckdlbmVyYXRvcihnZW5lcmF0b3JPcHRpb25zKSB7XG4gIGlmIChnZW5lcmF0b3JPcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBnZW5lcmF0b3JPcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgX2dlbmVyYXRvck9wdGlvbnMgPSBnZW5lcmF0b3JPcHRpb25zLFxuICAgICAgX2dlbmVyYXRvck9wdGlvbnMkZGVmID0gX2dlbmVyYXRvck9wdGlvbnMuZGVmYXVsdE1vZGlmaWVycyxcbiAgICAgIGRlZmF1bHRNb2RpZmllcnMgPSBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYgPT09IHZvaWQgMCA/IFtdIDogX2dlbmVyYXRvck9wdGlvbnMkZGVmLFxuICAgICAgX2dlbmVyYXRvck9wdGlvbnMkZGVmMiA9IF9nZW5lcmF0b3JPcHRpb25zLmRlZmF1bHRPcHRpb25zLFxuICAgICAgZGVmYXVsdE9wdGlvbnMgPSBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYyID09PSB2b2lkIDAgPyBERUZBVUxUX09QVElPTlMgOiBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYyO1xuICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlUG9wcGVyKHJlZmVyZW5jZSwgcG9wcGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zO1xuICAgIH1cblxuICAgIHZhciBzdGF0ZSA9IHtcbiAgICAgIHBsYWNlbWVudDogJ2JvdHRvbScsXG4gICAgICBvcmRlcmVkTW9kaWZpZXJzOiBbXSxcbiAgICAgIG9wdGlvbnM6IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfT1BUSU9OUywgZGVmYXVsdE9wdGlvbnMpLFxuICAgICAgbW9kaWZpZXJzRGF0YToge30sXG4gICAgICBlbGVtZW50czoge1xuICAgICAgICByZWZlcmVuY2U6IHJlZmVyZW5jZSxcbiAgICAgICAgcG9wcGVyOiBwb3BwZXJcbiAgICAgIH0sXG4gICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgIHN0eWxlczoge31cbiAgICB9O1xuICAgIHZhciBlZmZlY3RDbGVhbnVwRm5zID0gW107XG4gICAgdmFyIGlzRGVzdHJveWVkID0gZmFsc2U7XG4gICAgdmFyIGluc3RhbmNlID0ge1xuICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgc2V0T3B0aW9uczogZnVuY3Rpb24gc2V0T3B0aW9ucyhzZXRPcHRpb25zQWN0aW9uKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gdHlwZW9mIHNldE9wdGlvbnNBY3Rpb24gPT09ICdmdW5jdGlvbicgPyBzZXRPcHRpb25zQWN0aW9uKHN0YXRlLm9wdGlvbnMpIDogc2V0T3B0aW9uc0FjdGlvbjtcbiAgICAgICAgY2xlYW51cE1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICBzdGF0ZS5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdE9wdGlvbnMsIHN0YXRlLm9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICBzdGF0ZS5zY3JvbGxQYXJlbnRzID0ge1xuICAgICAgICAgIHJlZmVyZW5jZTogaXNFbGVtZW50KHJlZmVyZW5jZSkgPyBsaXN0U2Nyb2xsUGFyZW50cyhyZWZlcmVuY2UpIDogcmVmZXJlbmNlLmNvbnRleHRFbGVtZW50ID8gbGlzdFNjcm9sbFBhcmVudHMocmVmZXJlbmNlLmNvbnRleHRFbGVtZW50KSA6IFtdLFxuICAgICAgICAgIHBvcHBlcjogbGlzdFNjcm9sbFBhcmVudHMocG9wcGVyKVxuICAgICAgICB9OyAvLyBPcmRlcnMgdGhlIG1vZGlmaWVycyBiYXNlZCBvbiB0aGVpciBkZXBlbmRlbmNpZXMgYW5kIGBwaGFzZWBcbiAgICAgICAgLy8gcHJvcGVydGllc1xuXG4gICAgICAgIHZhciBvcmRlcmVkTW9kaWZpZXJzID0gb3JkZXJNb2RpZmllcnMobWVyZ2VCeU5hbWUoW10uY29uY2F0KGRlZmF1bHRNb2RpZmllcnMsIHN0YXRlLm9wdGlvbnMubW9kaWZpZXJzKSkpOyAvLyBTdHJpcCBvdXQgZGlzYWJsZWQgbW9kaWZpZXJzXG5cbiAgICAgICAgc3RhdGUub3JkZXJlZE1vZGlmaWVycyA9IG9yZGVyZWRNb2RpZmllcnMuZmlsdGVyKGZ1bmN0aW9uIChtKSB7XG4gICAgICAgICAgcmV0dXJuIG0uZW5hYmxlZDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJ1bk1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICByZXR1cm4gaW5zdGFuY2UudXBkYXRlKCk7XG4gICAgICB9LFxuICAgICAgLy8gU3luYyB1cGRhdGUg4oCTIGl0IHdpbGwgYWx3YXlzIGJlIGV4ZWN1dGVkLCBldmVuIGlmIG5vdCBuZWNlc3NhcnkuIFRoaXNcbiAgICAgIC8vIGlzIHVzZWZ1bCBmb3IgbG93IGZyZXF1ZW5jeSB1cGRhdGVzIHdoZXJlIHN5bmMgYmVoYXZpb3Igc2ltcGxpZmllcyB0aGVcbiAgICAgIC8vIGxvZ2ljLlxuICAgICAgLy8gRm9yIGhpZ2ggZnJlcXVlbmN5IHVwZGF0ZXMgKGUuZy4gYHJlc2l6ZWAgYW5kIGBzY3JvbGxgIGV2ZW50cyksIGFsd2F5c1xuICAgICAgLy8gcHJlZmVyIHRoZSBhc3luYyBQb3BwZXIjdXBkYXRlIG1ldGhvZFxuICAgICAgZm9yY2VVcGRhdGU6IGZ1bmN0aW9uIGZvcmNlVXBkYXRlKCkge1xuICAgICAgICBpZiAoaXNEZXN0cm95ZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX3N0YXRlJGVsZW1lbnRzID0gc3RhdGUuZWxlbWVudHMsXG4gICAgICAgICAgICByZWZlcmVuY2UgPSBfc3RhdGUkZWxlbWVudHMucmVmZXJlbmNlLFxuICAgICAgICAgICAgcG9wcGVyID0gX3N0YXRlJGVsZW1lbnRzLnBvcHBlcjsgLy8gRG9uJ3QgcHJvY2VlZCBpZiBgcmVmZXJlbmNlYCBvciBgcG9wcGVyYCBhcmUgbm90IHZhbGlkIGVsZW1lbnRzXG4gICAgICAgIC8vIGFueW1vcmVcblxuICAgICAgICBpZiAoIWFyZVZhbGlkRWxlbWVudHMocmVmZXJlbmNlLCBwb3BwZXIpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IC8vIFN0b3JlIHRoZSByZWZlcmVuY2UgYW5kIHBvcHBlciByZWN0cyB0byBiZSByZWFkIGJ5IG1vZGlmaWVyc1xuXG5cbiAgICAgICAgc3RhdGUucmVjdHMgPSB7XG4gICAgICAgICAgcmVmZXJlbmNlOiBnZXRDb21wb3NpdGVSZWN0KHJlZmVyZW5jZSwgZ2V0T2Zmc2V0UGFyZW50KHBvcHBlciksIHN0YXRlLm9wdGlvbnMuc3RyYXRlZ3kgPT09ICdmaXhlZCcpLFxuICAgICAgICAgIHBvcHBlcjogZ2V0TGF5b3V0UmVjdChwb3BwZXIpXG4gICAgICAgIH07IC8vIE1vZGlmaWVycyBoYXZlIHRoZSBhYmlsaXR5IHRvIHJlc2V0IHRoZSBjdXJyZW50IHVwZGF0ZSBjeWNsZS4gVGhlXG4gICAgICAgIC8vIG1vc3QgY29tbW9uIHVzZSBjYXNlIGZvciB0aGlzIGlzIHRoZSBgZmxpcGAgbW9kaWZpZXIgY2hhbmdpbmcgdGhlXG4gICAgICAgIC8vIHBsYWNlbWVudCwgd2hpY2ggdGhlbiBuZWVkcyB0byByZS1ydW4gYWxsIHRoZSBtb2RpZmllcnMsIGJlY2F1c2UgdGhlXG4gICAgICAgIC8vIGxvZ2ljIHdhcyBwcmV2aW91c2x5IHJhbiBmb3IgdGhlIHByZXZpb3VzIHBsYWNlbWVudCBhbmQgaXMgdGhlcmVmb3JlXG4gICAgICAgIC8vIHN0YWxlL2luY29ycmVjdFxuXG4gICAgICAgIHN0YXRlLnJlc2V0ID0gZmFsc2U7XG4gICAgICAgIHN0YXRlLnBsYWNlbWVudCA9IHN0YXRlLm9wdGlvbnMucGxhY2VtZW50OyAvLyBPbiBlYWNoIHVwZGF0ZSBjeWNsZSwgdGhlIGBtb2RpZmllcnNEYXRhYCBwcm9wZXJ0eSBmb3IgZWFjaCBtb2RpZmllclxuICAgICAgICAvLyBpcyBmaWxsZWQgd2l0aCB0aGUgaW5pdGlhbCBkYXRhIHNwZWNpZmllZCBieSB0aGUgbW9kaWZpZXIuIFRoaXMgbWVhbnNcbiAgICAgICAgLy8gaXQgZG9lc24ndCBwZXJzaXN0IGFuZCBpcyBmcmVzaCBvbiBlYWNoIHVwZGF0ZS5cbiAgICAgICAgLy8gVG8gZW5zdXJlIHBlcnNpc3RlbnQgZGF0YSwgdXNlIGAke25hbWV9I3BlcnNpc3RlbnRgXG5cbiAgICAgICAgc3RhdGUub3JkZXJlZE1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgICAgICAgIHJldHVybiBzdGF0ZS5tb2RpZmllcnNEYXRhW21vZGlmaWVyLm5hbWVdID0gT2JqZWN0LmFzc2lnbih7fSwgbW9kaWZpZXIuZGF0YSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgIGlmIChzdGF0ZS5yZXNldCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgc3RhdGUucmVzZXQgPSBmYWxzZTtcbiAgICAgICAgICAgIGluZGV4ID0gLTE7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgX3N0YXRlJG9yZGVyZWRNb2RpZmllID0gc3RhdGUub3JkZXJlZE1vZGlmaWVyc1tpbmRleF0sXG4gICAgICAgICAgICAgIGZuID0gX3N0YXRlJG9yZGVyZWRNb2RpZmllLmZuLFxuICAgICAgICAgICAgICBfc3RhdGUkb3JkZXJlZE1vZGlmaWUyID0gX3N0YXRlJG9yZGVyZWRNb2RpZmllLm9wdGlvbnMsXG4gICAgICAgICAgICAgIF9vcHRpb25zID0gX3N0YXRlJG9yZGVyZWRNb2RpZmllMiA9PT0gdm9pZCAwID8ge30gOiBfc3RhdGUkb3JkZXJlZE1vZGlmaWUyLFxuICAgICAgICAgICAgICBuYW1lID0gX3N0YXRlJG9yZGVyZWRNb2RpZmllLm5hbWU7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IGZuKHtcbiAgICAgICAgICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgICAgICAgICBvcHRpb25zOiBfb3B0aW9ucyxcbiAgICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgaW5zdGFuY2U6IGluc3RhbmNlXG4gICAgICAgICAgICB9KSB8fCBzdGF0ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBBc3luYyBhbmQgb3B0aW1pc3RpY2FsbHkgb3B0aW1pemVkIHVwZGF0ZSDigJMgaXQgd2lsbCBub3QgYmUgZXhlY3V0ZWQgaWZcbiAgICAgIC8vIG5vdCBuZWNlc3NhcnkgKGRlYm91bmNlZCB0byBydW4gYXQgbW9zdCBvbmNlLXBlci10aWNrKVxuICAgICAgdXBkYXRlOiBkZWJvdW5jZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgIGluc3RhbmNlLmZvcmNlVXBkYXRlKCk7XG4gICAgICAgICAgcmVzb2x2ZShzdGF0ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgICBjbGVhbnVwTW9kaWZpZXJFZmZlY3RzKCk7XG4gICAgICAgIGlzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKCFhcmVWYWxpZEVsZW1lbnRzKHJlZmVyZW5jZSwgcG9wcGVyKSkge1xuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIGluc3RhbmNlLnNldE9wdGlvbnMob3B0aW9ucykudGhlbihmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgIGlmICghaXNEZXN0cm95ZWQgJiYgb3B0aW9ucy5vbkZpcnN0VXBkYXRlKSB7XG4gICAgICAgIG9wdGlvbnMub25GaXJzdFVwZGF0ZShzdGF0ZSk7XG4gICAgICB9XG4gICAgfSk7IC8vIE1vZGlmaWVycyBoYXZlIHRoZSBhYmlsaXR5IHRvIGV4ZWN1dGUgYXJiaXRyYXJ5IGNvZGUgYmVmb3JlIHRoZSBmaXJzdFxuICAgIC8vIHVwZGF0ZSBjeWNsZSBydW5zLiBUaGV5IHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHVwZGF0ZVxuICAgIC8vIGN5Y2xlLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGEgbW9kaWZpZXIgYWRkcyBzb21lIHBlcnNpc3RlbnQgZGF0YSB0aGF0XG4gICAgLy8gb3RoZXIgbW9kaWZpZXJzIG5lZWQgdG8gdXNlLCBidXQgdGhlIG1vZGlmaWVyIGlzIHJ1biBhZnRlciB0aGUgZGVwZW5kZW50XG4gICAgLy8gb25lLlxuXG4gICAgZnVuY3Rpb24gcnVuTW9kaWZpZXJFZmZlY3RzKCkge1xuICAgICAgc3RhdGUub3JkZXJlZE1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgIHZhciBuYW1lID0gX3JlZi5uYW1lLFxuICAgICAgICAgICAgX3JlZiRvcHRpb25zID0gX3JlZi5vcHRpb25zLFxuICAgICAgICAgICAgb3B0aW9ucyA9IF9yZWYkb3B0aW9ucyA9PT0gdm9pZCAwID8ge30gOiBfcmVmJG9wdGlvbnMsXG4gICAgICAgICAgICBlZmZlY3QgPSBfcmVmLmVmZmVjdDtcblxuICAgICAgICBpZiAodHlwZW9mIGVmZmVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhciBjbGVhbnVwRm4gPSBlZmZlY3Qoe1xuICAgICAgICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnNcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHZhciBub29wRm4gPSBmdW5jdGlvbiBub29wRm4oKSB7fTtcblxuICAgICAgICAgIGVmZmVjdENsZWFudXBGbnMucHVzaChjbGVhbnVwRm4gfHwgbm9vcEZuKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYW51cE1vZGlmaWVyRWZmZWN0cygpIHtcbiAgICAgIGVmZmVjdENsZWFudXBGbnMuZm9yRWFjaChmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgcmV0dXJuIGZuKCk7XG4gICAgICB9KTtcbiAgICAgIGVmZmVjdENsZWFudXBGbnMgPSBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH07XG59XG5leHBvcnQgdmFyIGNyZWF0ZVBvcHBlciA9IC8qI19fUFVSRV9fKi9wb3BwZXJHZW5lcmF0b3IoKTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBkZXRlY3RPdmVyZmxvdyB9OyIsImltcG9ydCB7IHBvcHBlckdlbmVyYXRvciwgZGV0ZWN0T3ZlcmZsb3cgfSBmcm9tIFwiLi9jcmVhdGVQb3BwZXIuanNcIjtcbmltcG9ydCBldmVudExpc3RlbmVycyBmcm9tIFwiLi9tb2RpZmllcnMvZXZlbnRMaXN0ZW5lcnMuanNcIjtcbmltcG9ydCBwb3BwZXJPZmZzZXRzIGZyb20gXCIuL21vZGlmaWVycy9wb3BwZXJPZmZzZXRzLmpzXCI7XG5pbXBvcnQgY29tcHV0ZVN0eWxlcyBmcm9tIFwiLi9tb2RpZmllcnMvY29tcHV0ZVN0eWxlcy5qc1wiO1xuaW1wb3J0IGFwcGx5U3R5bGVzIGZyb20gXCIuL21vZGlmaWVycy9hcHBseVN0eWxlcy5qc1wiO1xuaW1wb3J0IG9mZnNldCBmcm9tIFwiLi9tb2RpZmllcnMvb2Zmc2V0LmpzXCI7XG5pbXBvcnQgZmxpcCBmcm9tIFwiLi9tb2RpZmllcnMvZmxpcC5qc1wiO1xuaW1wb3J0IHByZXZlbnRPdmVyZmxvdyBmcm9tIFwiLi9tb2RpZmllcnMvcHJldmVudE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgYXJyb3cgZnJvbSBcIi4vbW9kaWZpZXJzL2Fycm93LmpzXCI7XG5pbXBvcnQgaGlkZSBmcm9tIFwiLi9tb2RpZmllcnMvaGlkZS5qc1wiO1xudmFyIGRlZmF1bHRNb2RpZmllcnMgPSBbZXZlbnRMaXN0ZW5lcnMsIHBvcHBlck9mZnNldHMsIGNvbXB1dGVTdHlsZXMsIGFwcGx5U3R5bGVzLCBvZmZzZXQsIGZsaXAsIHByZXZlbnRPdmVyZmxvdywgYXJyb3csIGhpZGVdO1xudmFyIGNyZWF0ZVBvcHBlciA9IC8qI19fUFVSRV9fKi9wb3BwZXJHZW5lcmF0b3Ioe1xuICBkZWZhdWx0TW9kaWZpZXJzOiBkZWZhdWx0TW9kaWZpZXJzXG59KTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBjcmVhdGVQb3BwZXIsIHBvcHBlckdlbmVyYXRvciwgZGVmYXVsdE1vZGlmaWVycywgZGV0ZWN0T3ZlcmZsb3cgfTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBjcmVhdGVQb3BwZXIgYXMgY3JlYXRlUG9wcGVyTGl0ZSB9IGZyb20gXCIuL3BvcHBlci1saXRlLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0ICogZnJvbSBcIi4vbW9kaWZpZXJzL2luZGV4LmpzXCI7IiwiLyohXG4gICogQm9vdHN0cmFwIHY1LjMuOCAoaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLylcbiAgKiBDb3B5cmlnaHQgMjAxMS0yMDI1IFRoZSBCb290c3RyYXAgQXV0aG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2dyYXBocy9jb250cmlidXRvcnMpXG4gICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICovXG5pbXBvcnQgKiBhcyBQb3BwZXIgZnJvbSAnQHBvcHBlcmpzL2NvcmUnO1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgZG9tL2RhdGEuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IGVsZW1lbnRNYXAgPSBuZXcgTWFwKCk7XG5jb25zdCBEYXRhID0ge1xuICBzZXQoZWxlbWVudCwga2V5LCBpbnN0YW5jZSkge1xuICAgIGlmICghZWxlbWVudE1hcC5oYXMoZWxlbWVudCkpIHtcbiAgICAgIGVsZW1lbnRNYXAuc2V0KGVsZW1lbnQsIG5ldyBNYXAoKSk7XG4gICAgfVxuICAgIGNvbnN0IGluc3RhbmNlTWFwID0gZWxlbWVudE1hcC5nZXQoZWxlbWVudCk7XG5cbiAgICAvLyBtYWtlIGl0IGNsZWFyIHdlIG9ubHkgd2FudCBvbmUgaW5zdGFuY2UgcGVyIGVsZW1lbnRcbiAgICAvLyBjYW4gYmUgcmVtb3ZlZCBsYXRlciB3aGVuIG11bHRpcGxlIGtleS9pbnN0YW5jZXMgYXJlIGZpbmUgdG8gYmUgdXNlZFxuICAgIGlmICghaW5zdGFuY2VNYXAuaGFzKGtleSkgJiYgaW5zdGFuY2VNYXAuc2l6ZSAhPT0gMCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEJvb3RzdHJhcCBkb2Vzbid0IGFsbG93IG1vcmUgdGhhbiBvbmUgaW5zdGFuY2UgcGVyIGVsZW1lbnQuIEJvdW5kIGluc3RhbmNlOiAke0FycmF5LmZyb20oaW5zdGFuY2VNYXAua2V5cygpKVswXX0uYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGluc3RhbmNlTWFwLnNldChrZXksIGluc3RhbmNlKTtcbiAgfSxcbiAgZ2V0KGVsZW1lbnQsIGtleSkge1xuICAgIGlmIChlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgcmV0dXJuIGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpLmdldChrZXkpIHx8IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9LFxuICByZW1vdmUoZWxlbWVudCwga2V5KSB7XG4gICAgaWYgKCFlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbnN0YW5jZU1hcCA9IGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpO1xuICAgIGluc3RhbmNlTWFwLmRlbGV0ZShrZXkpO1xuXG4gICAgLy8gZnJlZSB1cCBlbGVtZW50IHJlZmVyZW5jZXMgaWYgdGhlcmUgYXJlIG5vIGluc3RhbmNlcyBsZWZ0IGZvciBhbiBlbGVtZW50XG4gICAgaWYgKGluc3RhbmNlTWFwLnNpemUgPT09IDApIHtcbiAgICAgIGVsZW1lbnRNYXAuZGVsZXRlKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHV0aWwvaW5kZXguanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5jb25zdCBNQVhfVUlEID0gMTAwMDAwMDtcbmNvbnN0IE1JTExJU0VDT05EU19NVUxUSVBMSUVSID0gMTAwMDtcbmNvbnN0IFRSQU5TSVRJT05fRU5EID0gJ3RyYW5zaXRpb25lbmQnO1xuXG4vKipcbiAqIFByb3Blcmx5IGVzY2FwZSBJRHMgc2VsZWN0b3JzIHRvIGhhbmRsZSB3ZWlyZCBJRHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgcGFyc2VTZWxlY3RvciA9IHNlbGVjdG9yID0+IHtcbiAgaWYgKHNlbGVjdG9yICYmIHdpbmRvdy5DU1MgJiYgd2luZG93LkNTUy5lc2NhcGUpIHtcbiAgICAvLyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yIG5lZWRzIGVzY2FwaW5nIHRvIGhhbmRsZSBJRHMgKGh0bWw1KykgY29udGFpbmluZyBmb3IgaW5zdGFuY2UgL1xuICAgIHNlbGVjdG9yID0gc2VsZWN0b3IucmVwbGFjZSgvIyhbXlxcc1wiIyddKykvZywgKG1hdGNoLCBpZCkgPT4gYCMke0NTUy5lc2NhcGUoaWQpfWApO1xuICB9XG4gIHJldHVybiBzZWxlY3Rvcjtcbn07XG5cbi8vIFNob3V0LW91dCBBbmd1cyBDcm9sbCAoaHR0cHM6Ly9nb28uZ2wvcHh3UUdwKVxuY29uc3QgdG9UeXBlID0gb2JqZWN0ID0+IHtcbiAgaWYgKG9iamVjdCA9PT0gbnVsbCB8fCBvYmplY3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBgJHtvYmplY3R9YDtcbiAgfVxuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkubWF0Y2goL1xccyhbYS16XSspL2kpWzFdLnRvTG93ZXJDYXNlKCk7XG59O1xuXG4vKipcbiAqIFB1YmxpYyBVdGlsIEFQSVxuICovXG5cbmNvbnN0IGdldFVJRCA9IHByZWZpeCA9PiB7XG4gIGRvIHtcbiAgICBwcmVmaXggKz0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogTUFYX1VJRCk7XG4gIH0gd2hpbGUgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHByZWZpeCkpO1xuICByZXR1cm4gcHJlZml4O1xufTtcbmNvbnN0IGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50ID0gZWxlbWVudCA9PiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLy8gR2V0IHRyYW5zaXRpb24tZHVyYXRpb24gb2YgdGhlIGVsZW1lbnRcbiAgbGV0IHtcbiAgICB0cmFuc2l0aW9uRHVyYXRpb24sXG4gICAgdHJhbnNpdGlvbkRlbGF5XG4gIH0gPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbiAgY29uc3QgZmxvYXRUcmFuc2l0aW9uRHVyYXRpb24gPSBOdW1iZXIucGFyc2VGbG9hdCh0cmFuc2l0aW9uRHVyYXRpb24pO1xuICBjb25zdCBmbG9hdFRyYW5zaXRpb25EZWxheSA9IE51bWJlci5wYXJzZUZsb2F0KHRyYW5zaXRpb25EZWxheSk7XG5cbiAgLy8gUmV0dXJuIDAgaWYgZWxlbWVudCBvciB0cmFuc2l0aW9uIGR1cmF0aW9uIGlzIG5vdCBmb3VuZFxuICBpZiAoIWZsb2F0VHJhbnNpdGlvbkR1cmF0aW9uICYmICFmbG9hdFRyYW5zaXRpb25EZWxheSkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLy8gSWYgbXVsdGlwbGUgZHVyYXRpb25zIGFyZSBkZWZpbmVkLCB0YWtlIHRoZSBmaXJzdFxuICB0cmFuc2l0aW9uRHVyYXRpb24gPSB0cmFuc2l0aW9uRHVyYXRpb24uc3BsaXQoJywnKVswXTtcbiAgdHJhbnNpdGlvbkRlbGF5ID0gdHJhbnNpdGlvbkRlbGF5LnNwbGl0KCcsJylbMF07XG4gIHJldHVybiAoTnVtYmVyLnBhcnNlRmxvYXQodHJhbnNpdGlvbkR1cmF0aW9uKSArIE51bWJlci5wYXJzZUZsb2F0KHRyYW5zaXRpb25EZWxheSkpICogTUlMTElTRUNPTkRTX01VTFRJUExJRVI7XG59O1xuY29uc3QgdHJpZ2dlclRyYW5zaXRpb25FbmQgPSBlbGVtZW50ID0+IHtcbiAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChUUkFOU0lUSU9OX0VORCkpO1xufTtcbmNvbnN0IGlzRWxlbWVudCA9IG9iamVjdCA9PiB7XG4gIGlmICghb2JqZWN0IHx8IHR5cGVvZiBvYmplY3QgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2Ygb2JqZWN0LmpxdWVyeSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBvYmplY3QgPSBvYmplY3RbMF07XG4gIH1cbiAgcmV0dXJuIHR5cGVvZiBvYmplY3Qubm9kZVR5cGUgIT09ICd1bmRlZmluZWQnO1xufTtcbmNvbnN0IGdldEVsZW1lbnQgPSBvYmplY3QgPT4ge1xuICAvLyBpdCdzIGEgalF1ZXJ5IG9iamVjdCBvciBhIG5vZGUgZWxlbWVudFxuICBpZiAoaXNFbGVtZW50KG9iamVjdCkpIHtcbiAgICByZXR1cm4gb2JqZWN0LmpxdWVyeSA/IG9iamVjdFswXSA6IG9iamVjdDtcbiAgfVxuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ3N0cmluZycgJiYgb2JqZWN0Lmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihwYXJzZVNlbGVjdG9yKG9iamVjdCkpO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcbmNvbnN0IGlzVmlzaWJsZSA9IGVsZW1lbnQgPT4ge1xuICBpZiAoIWlzRWxlbWVudChlbGVtZW50KSB8fCBlbGVtZW50LmdldENsaWVudFJlY3RzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGVsZW1lbnRJc1Zpc2libGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ3Zpc2liaWxpdHknKSA9PT0gJ3Zpc2libGUnO1xuICAvLyBIYW5kbGUgYGRldGFpbHNgIGVsZW1lbnQgYXMgaXRzIGNvbnRlbnQgbWF5IGZhbHNpZSBhcHBlYXIgdmlzaWJsZSB3aGVuIGl0IGlzIGNsb3NlZFxuICBjb25zdCBjbG9zZWREZXRhaWxzID0gZWxlbWVudC5jbG9zZXN0KCdkZXRhaWxzOm5vdChbb3Blbl0pJyk7XG4gIGlmICghY2xvc2VkRGV0YWlscykge1xuICAgIHJldHVybiBlbGVtZW50SXNWaXNpYmxlO1xuICB9XG4gIGlmIChjbG9zZWREZXRhaWxzICE9PSBlbGVtZW50KSB7XG4gICAgY29uc3Qgc3VtbWFyeSA9IGVsZW1lbnQuY2xvc2VzdCgnc3VtbWFyeScpO1xuICAgIGlmIChzdW1tYXJ5ICYmIHN1bW1hcnkucGFyZW50Tm9kZSAhPT0gY2xvc2VkRGV0YWlscykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoc3VtbWFyeSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZWxlbWVudElzVmlzaWJsZTtcbn07XG5jb25zdCBpc0Rpc2FibGVkID0gZWxlbWVudCA9PiB7XG4gIGlmICghZWxlbWVudCB8fCBlbGVtZW50Lm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZGlzYWJsZWQnKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh0eXBlb2YgZWxlbWVudC5kaXNhYmxlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZWxlbWVudC5kaXNhYmxlZDtcbiAgfVxuICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgIT09ICdmYWxzZSc7XG59O1xuY29uc3QgZmluZFNoYWRvd1Jvb3QgPSBlbGVtZW50ID0+IHtcbiAgaWYgKCFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXR0YWNoU2hhZG93KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBDYW4gZmluZCB0aGUgc2hhZG93IHJvb3Qgb3RoZXJ3aXNlIGl0J2xsIHJldHVybiB0aGUgZG9jdW1lbnRcbiAgaWYgKHR5cGVvZiBlbGVtZW50LmdldFJvb3ROb2RlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc3Qgcm9vdCA9IGVsZW1lbnQuZ2V0Um9vdE5vZGUoKTtcbiAgICByZXR1cm4gcm9vdCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QgPyByb290IDogbnVsbDtcbiAgfVxuICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIC8vIHdoZW4gd2UgZG9uJ3QgZmluZCBhIHNoYWRvdyByb290XG4gIGlmICghZWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGZpbmRTaGFkb3dSb290KGVsZW1lbnQucGFyZW50Tm9kZSk7XG59O1xuY29uc3Qgbm9vcCA9ICgpID0+IHt9O1xuXG4vKipcbiAqIFRyaWNrIHRvIHJlc3RhcnQgYW4gZWxlbWVudCdzIGFuaW1hdGlvblxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm4gdm9pZFxuICpcbiAqIEBzZWUgaHR0cHM6Ly93d3cuaGFycnl0aGVvLmNvbS9ibG9nLzIwMjEvMDIvcmVzdGFydC1hLWNzcy1hbmltYXRpb24td2l0aC1qYXZhc2NyaXB0LyNyZXN0YXJ0aW5nLWEtY3NzLWFuaW1hdGlvblxuICovXG5jb25zdCByZWZsb3cgPSBlbGVtZW50ID0+IHtcbiAgZWxlbWVudC5vZmZzZXRIZWlnaHQ7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG59O1xuY29uc3QgZ2V0alF1ZXJ5ID0gKCkgPT4ge1xuICBpZiAod2luZG93LmpRdWVyeSAmJiAhZG9jdW1lbnQuYm9keS5oYXNBdHRyaWJ1dGUoJ2RhdGEtYnMtbm8tanF1ZXJ5JykpIHtcbiAgICByZXR1cm4gd2luZG93LmpRdWVyeTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5jb25zdCBET01Db250ZW50TG9hZGVkQ2FsbGJhY2tzID0gW107XG5jb25zdCBvbkRPTUNvbnRlbnRMb2FkZWQgPSBjYWxsYmFjayA9PiB7XG4gIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHtcbiAgICAvLyBhZGQgbGlzdGVuZXIgb24gdGhlIGZpcnN0IGNhbGwgd2hlbiB0aGUgZG9jdW1lbnQgaXMgaW4gbG9hZGluZyBzdGF0ZVxuICAgIGlmICghRE9NQ29udGVudExvYWRlZENhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgRE9NQ29udGVudExvYWRlZENhbGxiYWNrcykge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBET01Db250ZW50TG9hZGVkQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICB9IGVsc2Uge1xuICAgIGNhbGxiYWNrKCk7XG4gIH1cbn07XG5jb25zdCBpc1JUTCA9ICgpID0+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kaXIgPT09ICdydGwnO1xuY29uc3QgZGVmaW5lSlF1ZXJ5UGx1Z2luID0gcGx1Z2luID0+IHtcbiAgb25ET01Db250ZW50TG9hZGVkKCgpID0+IHtcbiAgICBjb25zdCAkID0gZ2V0alF1ZXJ5KCk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCQpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBwbHVnaW4uTkFNRTtcbiAgICAgIGNvbnN0IEpRVUVSWV9OT19DT05GTElDVCA9ICQuZm5bbmFtZV07XG4gICAgICAkLmZuW25hbWVdID0gcGx1Z2luLmpRdWVyeUludGVyZmFjZTtcbiAgICAgICQuZm5bbmFtZV0uQ29uc3RydWN0b3IgPSBwbHVnaW47XG4gICAgICAkLmZuW25hbWVdLm5vQ29uZmxpY3QgPSAoKSA9PiB7XG4gICAgICAgICQuZm5bbmFtZV0gPSBKUVVFUllfTk9fQ09ORkxJQ1Q7XG4gICAgICAgIHJldHVybiBwbHVnaW4ualF1ZXJ5SW50ZXJmYWNlO1xuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufTtcbmNvbnN0IGV4ZWN1dGUgPSAocG9zc2libGVDYWxsYmFjaywgYXJncyA9IFtdLCBkZWZhdWx0VmFsdWUgPSBwb3NzaWJsZUNhbGxiYWNrKSA9PiB7XG4gIHJldHVybiB0eXBlb2YgcG9zc2libGVDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyA/IHBvc3NpYmxlQ2FsbGJhY2suY2FsbCguLi5hcmdzKSA6IGRlZmF1bHRWYWx1ZTtcbn07XG5jb25zdCBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uID0gKGNhbGxiYWNrLCB0cmFuc2l0aW9uRWxlbWVudCwgd2FpdEZvclRyYW5zaXRpb24gPSB0cnVlKSA9PiB7XG4gIGlmICghd2FpdEZvclRyYW5zaXRpb24pIHtcbiAgICBleGVjdXRlKGNhbGxiYWNrKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgZHVyYXRpb25QYWRkaW5nID0gNTtcbiAgY29uc3QgZW11bGF0ZWREdXJhdGlvbiA9IGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRyYW5zaXRpb25FbGVtZW50KSArIGR1cmF0aW9uUGFkZGluZztcbiAgbGV0IGNhbGxlZCA9IGZhbHNlO1xuICBjb25zdCBoYW5kbGVyID0gKHtcbiAgICB0YXJnZXRcbiAgfSkgPT4ge1xuICAgIGlmICh0YXJnZXQgIT09IHRyYW5zaXRpb25FbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNhbGxlZCA9IHRydWU7XG4gICAgdHJhbnNpdGlvbkVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihUUkFOU0lUSU9OX0VORCwgaGFuZGxlcik7XG4gICAgZXhlY3V0ZShjYWxsYmFjayk7XG4gIH07XG4gIHRyYW5zaXRpb25FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoVFJBTlNJVElPTl9FTkQsIGhhbmRsZXIpO1xuICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICBpZiAoIWNhbGxlZCkge1xuICAgICAgdHJpZ2dlclRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkVsZW1lbnQpO1xuICAgIH1cbiAgfSwgZW11bGF0ZWREdXJhdGlvbik7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgcHJldmlvdXMvbmV4dCBlbGVtZW50IG9mIGEgbGlzdC5cbiAqXG4gKiBAcGFyYW0ge2FycmF5fSBsaXN0ICAgIFRoZSBsaXN0IG9mIGVsZW1lbnRzXG4gKiBAcGFyYW0gYWN0aXZlRWxlbWVudCAgIFRoZSBhY3RpdmUgZWxlbWVudFxuICogQHBhcmFtIHNob3VsZEdldE5leHQgICBDaG9vc2UgdG8gZ2V0IG5leHQgb3IgcHJldmlvdXMgZWxlbWVudFxuICogQHBhcmFtIGlzQ3ljbGVBbGxvd2VkXG4gKiBAcmV0dXJuIHtFbGVtZW50fGVsZW19IFRoZSBwcm9wZXIgZWxlbWVudFxuICovXG5jb25zdCBnZXROZXh0QWN0aXZlRWxlbWVudCA9IChsaXN0LCBhY3RpdmVFbGVtZW50LCBzaG91bGRHZXROZXh0LCBpc0N5Y2xlQWxsb3dlZCkgPT4ge1xuICBjb25zdCBsaXN0TGVuZ3RoID0gbGlzdC5sZW5ndGg7XG4gIGxldCBpbmRleCA9IGxpc3QuaW5kZXhPZihhY3RpdmVFbGVtZW50KTtcblxuICAvLyBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbGlzdCByZXR1cm4gYW4gZWxlbWVudFxuICAvLyBkZXBlbmRpbmcgb24gdGhlIGRpcmVjdGlvbiBhbmQgaWYgY3ljbGUgaXMgYWxsb3dlZFxuICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuICFzaG91bGRHZXROZXh0ICYmIGlzQ3ljbGVBbGxvd2VkID8gbGlzdFtsaXN0TGVuZ3RoIC0gMV0gOiBsaXN0WzBdO1xuICB9XG4gIGluZGV4ICs9IHNob3VsZEdldE5leHQgPyAxIDogLTE7XG4gIGlmIChpc0N5Y2xlQWxsb3dlZCkge1xuICAgIGluZGV4ID0gKGluZGV4ICsgbGlzdExlbmd0aCkgJSBsaXN0TGVuZ3RoO1xuICB9XG4gIHJldHVybiBsaXN0W01hdGgubWF4KDAsIE1hdGgubWluKGluZGV4LCBsaXN0TGVuZ3RoIC0gMSkpXTtcbn07XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBkb20vZXZlbnQtaGFuZGxlci5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBuYW1lc3BhY2VSZWdleCA9IC9bXi5dKig/PVxcLi4qKVxcLnwuKi87XG5jb25zdCBzdHJpcE5hbWVSZWdleCA9IC9cXC4uKi87XG5jb25zdCBzdHJpcFVpZFJlZ2V4ID0gLzo6XFxkKyQvO1xuY29uc3QgZXZlbnRSZWdpc3RyeSA9IHt9OyAvLyBFdmVudHMgc3RvcmFnZVxubGV0IHVpZEV2ZW50ID0gMTtcbmNvbnN0IGN1c3RvbUV2ZW50cyA9IHtcbiAgbW91c2VlbnRlcjogJ21vdXNlb3ZlcicsXG4gIG1vdXNlbGVhdmU6ICdtb3VzZW91dCdcbn07XG5jb25zdCBuYXRpdmVFdmVudHMgPSBuZXcgU2V0KFsnY2xpY2snLCAnZGJsY2xpY2snLCAnbW91c2V1cCcsICdtb3VzZWRvd24nLCAnY29udGV4dG1lbnUnLCAnbW91c2V3aGVlbCcsICdET01Nb3VzZVNjcm9sbCcsICdtb3VzZW92ZXInLCAnbW91c2VvdXQnLCAnbW91c2Vtb3ZlJywgJ3NlbGVjdHN0YXJ0JywgJ3NlbGVjdGVuZCcsICdrZXlkb3duJywgJ2tleXByZXNzJywgJ2tleXVwJywgJ29yaWVudGF0aW9uY2hhbmdlJywgJ3RvdWNoc3RhcnQnLCAndG91Y2htb3ZlJywgJ3RvdWNoZW5kJywgJ3RvdWNoY2FuY2VsJywgJ3BvaW50ZXJkb3duJywgJ3BvaW50ZXJtb3ZlJywgJ3BvaW50ZXJ1cCcsICdwb2ludGVybGVhdmUnLCAncG9pbnRlcmNhbmNlbCcsICdnZXN0dXJlc3RhcnQnLCAnZ2VzdHVyZWNoYW5nZScsICdnZXN0dXJlZW5kJywgJ2ZvY3VzJywgJ2JsdXInLCAnY2hhbmdlJywgJ3Jlc2V0JywgJ3NlbGVjdCcsICdzdWJtaXQnLCAnZm9jdXNpbicsICdmb2N1c291dCcsICdsb2FkJywgJ3VubG9hZCcsICdiZWZvcmV1bmxvYWQnLCAncmVzaXplJywgJ21vdmUnLCAnRE9NQ29udGVudExvYWRlZCcsICdyZWFkeXN0YXRlY2hhbmdlJywgJ2Vycm9yJywgJ2Fib3J0JywgJ3Njcm9sbCddKTtcblxuLyoqXG4gKiBQcml2YXRlIG1ldGhvZHNcbiAqL1xuXG5mdW5jdGlvbiBtYWtlRXZlbnRVaWQoZWxlbWVudCwgdWlkKSB7XG4gIHJldHVybiB1aWQgJiYgYCR7dWlkfTo6JHt1aWRFdmVudCsrfWAgfHwgZWxlbWVudC51aWRFdmVudCB8fCB1aWRFdmVudCsrO1xufVxuZnVuY3Rpb24gZ2V0RWxlbWVudEV2ZW50cyhlbGVtZW50KSB7XG4gIGNvbnN0IHVpZCA9IG1ha2VFdmVudFVpZChlbGVtZW50KTtcbiAgZWxlbWVudC51aWRFdmVudCA9IHVpZDtcbiAgZXZlbnRSZWdpc3RyeVt1aWRdID0gZXZlbnRSZWdpc3RyeVt1aWRdIHx8IHt9O1xuICByZXR1cm4gZXZlbnRSZWdpc3RyeVt1aWRdO1xufVxuZnVuY3Rpb24gYm9vdHN0cmFwSGFuZGxlcihlbGVtZW50LCBmbikge1xuICByZXR1cm4gZnVuY3Rpb24gaGFuZGxlcihldmVudCkge1xuICAgIGh5ZHJhdGVPYmooZXZlbnQsIHtcbiAgICAgIGRlbGVnYXRlVGFyZ2V0OiBlbGVtZW50XG4gICAgfSk7XG4gICAgaWYgKGhhbmRsZXIub25lT2ZmKSB7XG4gICAgICBFdmVudEhhbmRsZXIub2ZmKGVsZW1lbnQsIGV2ZW50LnR5cGUsIGZuKTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KGVsZW1lbnQsIFtldmVudF0pO1xuICB9O1xufVxuZnVuY3Rpb24gYm9vdHN0cmFwRGVsZWdhdGlvbkhhbmRsZXIoZWxlbWVudCwgc2VsZWN0b3IsIGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBoYW5kbGVyKGV2ZW50KSB7XG4gICAgY29uc3QgZG9tRWxlbWVudHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgIGZvciAobGV0IHtcbiAgICAgIHRhcmdldFxuICAgIH0gPSBldmVudDsgdGFyZ2V0ICYmIHRhcmdldCAhPT0gdGhpczsgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGUpIHtcbiAgICAgIGZvciAoY29uc3QgZG9tRWxlbWVudCBvZiBkb21FbGVtZW50cykge1xuICAgICAgICBpZiAoZG9tRWxlbWVudCAhPT0gdGFyZ2V0KSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaHlkcmF0ZU9iaihldmVudCwge1xuICAgICAgICAgIGRlbGVnYXRlVGFyZ2V0OiB0YXJnZXRcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChoYW5kbGVyLm9uZU9mZikge1xuICAgICAgICAgIEV2ZW50SGFuZGxlci5vZmYoZWxlbWVudCwgZXZlbnQudHlwZSwgc2VsZWN0b3IsIGZuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGFyZ2V0LCBbZXZlbnRdKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBmaW5kSGFuZGxlcihldmVudHMsIGNhbGxhYmxlLCBkZWxlZ2F0aW9uU2VsZWN0b3IgPSBudWxsKSB7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKGV2ZW50cykuZmluZChldmVudCA9PiBldmVudC5jYWxsYWJsZSA9PT0gY2FsbGFibGUgJiYgZXZlbnQuZGVsZWdhdGlvblNlbGVjdG9yID09PSBkZWxlZ2F0aW9uU2VsZWN0b3IpO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplUGFyYW1ldGVycyhvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XG4gIGNvbnN0IGlzRGVsZWdhdGVkID0gdHlwZW9mIGhhbmRsZXIgPT09ICdzdHJpbmcnO1xuICAvLyBUT0RPOiB0b29sdGlwIHBhc3NlcyBgZmFsc2VgIGluc3RlYWQgb2Ygc2VsZWN0b3IsIHNvIHdlIG5lZWQgdG8gY2hlY2tcbiAgY29uc3QgY2FsbGFibGUgPSBpc0RlbGVnYXRlZCA/IGRlbGVnYXRpb25GdW5jdGlvbiA6IGhhbmRsZXIgfHwgZGVsZWdhdGlvbkZ1bmN0aW9uO1xuICBsZXQgdHlwZUV2ZW50ID0gZ2V0VHlwZUV2ZW50KG9yaWdpbmFsVHlwZUV2ZW50KTtcbiAgaWYgKCFuYXRpdmVFdmVudHMuaGFzKHR5cGVFdmVudCkpIHtcbiAgICB0eXBlRXZlbnQgPSBvcmlnaW5hbFR5cGVFdmVudDtcbiAgfVxuICByZXR1cm4gW2lzRGVsZWdhdGVkLCBjYWxsYWJsZSwgdHlwZUV2ZW50XTtcbn1cbmZ1bmN0aW9uIGFkZEhhbmRsZXIoZWxlbWVudCwgb3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbiwgb25lT2ZmKSB7XG4gIGlmICh0eXBlb2Ygb3JpZ2luYWxUeXBlRXZlbnQgIT09ICdzdHJpbmcnIHx8ICFlbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBbaXNEZWxlZ2F0ZWQsIGNhbGxhYmxlLCB0eXBlRXZlbnRdID0gbm9ybWFsaXplUGFyYW1ldGVycyhvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKTtcblxuICAvLyBpbiBjYXNlIG9mIG1vdXNlZW50ZXIgb3IgbW91c2VsZWF2ZSB3cmFwIHRoZSBoYW5kbGVyIHdpdGhpbiBhIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGZvciBpdHMgRE9NIHBvc2l0aW9uXG4gIC8vIHRoaXMgcHJldmVudHMgdGhlIGhhbmRsZXIgZnJvbSBiZWluZyBkaXNwYXRjaGVkIHRoZSBzYW1lIHdheSBhcyBtb3VzZW92ZXIgb3IgbW91c2VvdXQgZG9lc1xuICBpZiAob3JpZ2luYWxUeXBlRXZlbnQgaW4gY3VzdG9tRXZlbnRzKSB7XG4gICAgY29uc3Qgd3JhcEZ1bmN0aW9uID0gZm4gPT4ge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBpZiAoIWV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgZXZlbnQucmVsYXRlZFRhcmdldCAhPT0gZXZlbnQuZGVsZWdhdGVUYXJnZXQgJiYgIWV2ZW50LmRlbGVnYXRlVGFyZ2V0LmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpKSB7XG4gICAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhpcywgZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG4gICAgY2FsbGFibGUgPSB3cmFwRnVuY3Rpb24oY2FsbGFibGUpO1xuICB9XG4gIGNvbnN0IGV2ZW50cyA9IGdldEVsZW1lbnRFdmVudHMoZWxlbWVudCk7XG4gIGNvbnN0IGhhbmRsZXJzID0gZXZlbnRzW3R5cGVFdmVudF0gfHwgKGV2ZW50c1t0eXBlRXZlbnRdID0ge30pO1xuICBjb25zdCBwcmV2aW91c0Z1bmN0aW9uID0gZmluZEhhbmRsZXIoaGFuZGxlcnMsIGNhbGxhYmxlLCBpc0RlbGVnYXRlZCA/IGhhbmRsZXIgOiBudWxsKTtcbiAgaWYgKHByZXZpb3VzRnVuY3Rpb24pIHtcbiAgICBwcmV2aW91c0Z1bmN0aW9uLm9uZU9mZiA9IHByZXZpb3VzRnVuY3Rpb24ub25lT2ZmICYmIG9uZU9mZjtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgdWlkID0gbWFrZUV2ZW50VWlkKGNhbGxhYmxlLCBvcmlnaW5hbFR5cGVFdmVudC5yZXBsYWNlKG5hbWVzcGFjZVJlZ2V4LCAnJykpO1xuICBjb25zdCBmbiA9IGlzRGVsZWdhdGVkID8gYm9vdHN0cmFwRGVsZWdhdGlvbkhhbmRsZXIoZWxlbWVudCwgaGFuZGxlciwgY2FsbGFibGUpIDogYm9vdHN0cmFwSGFuZGxlcihlbGVtZW50LCBjYWxsYWJsZSk7XG4gIGZuLmRlbGVnYXRpb25TZWxlY3RvciA9IGlzRGVsZWdhdGVkID8gaGFuZGxlciA6IG51bGw7XG4gIGZuLmNhbGxhYmxlID0gY2FsbGFibGU7XG4gIGZuLm9uZU9mZiA9IG9uZU9mZjtcbiAgZm4udWlkRXZlbnQgPSB1aWQ7XG4gIGhhbmRsZXJzW3VpZF0gPSBmbjtcbiAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGVFdmVudCwgZm4sIGlzRGVsZWdhdGVkKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZUhhbmRsZXIoZWxlbWVudCwgZXZlbnRzLCB0eXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25TZWxlY3Rvcikge1xuICBjb25zdCBmbiA9IGZpbmRIYW5kbGVyKGV2ZW50c1t0eXBlRXZlbnRdLCBoYW5kbGVyLCBkZWxlZ2F0aW9uU2VsZWN0b3IpO1xuICBpZiAoIWZuKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlRXZlbnQsIGZuLCBCb29sZWFuKGRlbGVnYXRpb25TZWxlY3RvcikpO1xuICBkZWxldGUgZXZlbnRzW3R5cGVFdmVudF1bZm4udWlkRXZlbnRdO1xufVxuZnVuY3Rpb24gcmVtb3ZlTmFtZXNwYWNlZEhhbmRsZXJzKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBuYW1lc3BhY2UpIHtcbiAgY29uc3Qgc3RvcmVFbGVtZW50RXZlbnQgPSBldmVudHNbdHlwZUV2ZW50XSB8fCB7fTtcbiAgZm9yIChjb25zdCBbaGFuZGxlcktleSwgZXZlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHN0b3JlRWxlbWVudEV2ZW50KSkge1xuICAgIGlmIChoYW5kbGVyS2V5LmluY2x1ZGVzKG5hbWVzcGFjZSkpIHtcbiAgICAgIHJlbW92ZUhhbmRsZXIoZWxlbWVudCwgZXZlbnRzLCB0eXBlRXZlbnQsIGV2ZW50LmNhbGxhYmxlLCBldmVudC5kZWxlZ2F0aW9uU2VsZWN0b3IpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZ2V0VHlwZUV2ZW50KGV2ZW50KSB7XG4gIC8vIGFsbG93IHRvIGdldCB0aGUgbmF0aXZlIGV2ZW50cyBmcm9tIG5hbWVzcGFjZWQgZXZlbnRzICgnY2xpY2suYnMuYnV0dG9uJyAtLT4gJ2NsaWNrJylcbiAgZXZlbnQgPSBldmVudC5yZXBsYWNlKHN0cmlwTmFtZVJlZ2V4LCAnJyk7XG4gIHJldHVybiBjdXN0b21FdmVudHNbZXZlbnRdIHx8IGV2ZW50O1xufVxuY29uc3QgRXZlbnRIYW5kbGVyID0ge1xuICBvbihlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XG4gICAgYWRkSGFuZGxlcihlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uLCBmYWxzZSk7XG4gIH0sXG4gIG9uZShlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XG4gICAgYWRkSGFuZGxlcihlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uLCB0cnVlKTtcbiAgfSxcbiAgb2ZmKGVsZW1lbnQsIG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pIHtcbiAgICBpZiAodHlwZW9mIG9yaWdpbmFsVHlwZUV2ZW50ICE9PSAnc3RyaW5nJyB8fCAhZWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBbaXNEZWxlZ2F0ZWQsIGNhbGxhYmxlLCB0eXBlRXZlbnRdID0gbm9ybWFsaXplUGFyYW1ldGVycyhvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKTtcbiAgICBjb25zdCBpbk5hbWVzcGFjZSA9IHR5cGVFdmVudCAhPT0gb3JpZ2luYWxUeXBlRXZlbnQ7XG4gICAgY29uc3QgZXZlbnRzID0gZ2V0RWxlbWVudEV2ZW50cyhlbGVtZW50KTtcbiAgICBjb25zdCBzdG9yZUVsZW1lbnRFdmVudCA9IGV2ZW50c1t0eXBlRXZlbnRdIHx8IHt9O1xuICAgIGNvbnN0IGlzTmFtZXNwYWNlID0gb3JpZ2luYWxUeXBlRXZlbnQuc3RhcnRzV2l0aCgnLicpO1xuICAgIGlmICh0eXBlb2YgY2FsbGFibGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBTaW1wbGVzdCBjYXNlOiBoYW5kbGVyIGlzIHBhc3NlZCwgcmVtb3ZlIHRoYXQgbGlzdGVuZXIgT05MWS5cbiAgICAgIGlmICghT2JqZWN0LmtleXMoc3RvcmVFbGVtZW50RXZlbnQpLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBjYWxsYWJsZSwgaXNEZWxlZ2F0ZWQgPyBoYW5kbGVyIDogbnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc05hbWVzcGFjZSkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50RXZlbnQgb2YgT2JqZWN0LmtleXMoZXZlbnRzKSkge1xuICAgICAgICByZW1vdmVOYW1lc3BhY2VkSGFuZGxlcnMoZWxlbWVudCwgZXZlbnRzLCBlbGVtZW50RXZlbnQsIG9yaWdpbmFsVHlwZUV2ZW50LnNsaWNlKDEpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBba2V5SGFuZGxlcnMsIGV2ZW50XSBvZiBPYmplY3QuZW50cmllcyhzdG9yZUVsZW1lbnRFdmVudCkpIHtcbiAgICAgIGNvbnN0IGhhbmRsZXJLZXkgPSBrZXlIYW5kbGVycy5yZXBsYWNlKHN0cmlwVWlkUmVnZXgsICcnKTtcbiAgICAgIGlmICghaW5OYW1lc3BhY2UgfHwgb3JpZ2luYWxUeXBlRXZlbnQuaW5jbHVkZXMoaGFuZGxlcktleSkpIHtcbiAgICAgICAgcmVtb3ZlSGFuZGxlcihlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgZXZlbnQuY2FsbGFibGUsIGV2ZW50LmRlbGVnYXRpb25TZWxlY3Rvcik7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICB0cmlnZ2VyKGVsZW1lbnQsIGV2ZW50LCBhcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBldmVudCAhPT0gJ3N0cmluZycgfHwgIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCAkID0gZ2V0alF1ZXJ5KCk7XG4gICAgY29uc3QgdHlwZUV2ZW50ID0gZ2V0VHlwZUV2ZW50KGV2ZW50KTtcbiAgICBjb25zdCBpbk5hbWVzcGFjZSA9IGV2ZW50ICE9PSB0eXBlRXZlbnQ7XG4gICAgbGV0IGpRdWVyeUV2ZW50ID0gbnVsbDtcbiAgICBsZXQgYnViYmxlcyA9IHRydWU7XG4gICAgbGV0IG5hdGl2ZURpc3BhdGNoID0gdHJ1ZTtcbiAgICBsZXQgZGVmYXVsdFByZXZlbnRlZCA9IGZhbHNlO1xuICAgIGlmIChpbk5hbWVzcGFjZSAmJiAkKSB7XG4gICAgICBqUXVlcnlFdmVudCA9ICQuRXZlbnQoZXZlbnQsIGFyZ3MpO1xuICAgICAgJChlbGVtZW50KS50cmlnZ2VyKGpRdWVyeUV2ZW50KTtcbiAgICAgIGJ1YmJsZXMgPSAhalF1ZXJ5RXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTtcbiAgICAgIG5hdGl2ZURpc3BhdGNoID0gIWpRdWVyeUV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCk7XG4gICAgICBkZWZhdWx0UHJldmVudGVkID0galF1ZXJ5RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCk7XG4gICAgfVxuICAgIGNvbnN0IGV2dCA9IGh5ZHJhdGVPYmoobmV3IEV2ZW50KGV2ZW50LCB7XG4gICAgICBidWJibGVzLFxuICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgIH0pLCBhcmdzKTtcbiAgICBpZiAoZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGlmIChuYXRpdmVEaXNwYXRjaCkge1xuICAgICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7XG4gICAgfVxuICAgIGlmIChldnQuZGVmYXVsdFByZXZlbnRlZCAmJiBqUXVlcnlFdmVudCkge1xuICAgICAgalF1ZXJ5RXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGV2dDtcbiAgfVxufTtcbmZ1bmN0aW9uIGh5ZHJhdGVPYmoob2JqLCBtZXRhID0ge30pIHtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobWV0YSkpIHtcbiAgICB0cnkge1xuICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgICB9IGNhdGNoIChfdW51c2VkKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGRvbS9tYW5pcHVsYXRvci5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZURhdGEodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSAndHJ1ZScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodmFsdWUgPT09ICdmYWxzZScpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHZhbHVlID09PSBOdW1iZXIodmFsdWUpLnRvU3RyaW5nKCkpIHtcbiAgICByZXR1cm4gTnVtYmVyKHZhbHVlKTtcbiAgfVxuICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSAnbnVsbCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkpO1xuICB9IGNhdGNoIChfdW51c2VkKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5mdW5jdGlvbiBub3JtYWxpemVEYXRhS2V5KGtleSkge1xuICByZXR1cm4ga2V5LnJlcGxhY2UoL1tBLVpdL2csIGNociA9PiBgLSR7Y2hyLnRvTG93ZXJDYXNlKCl9YCk7XG59XG5jb25zdCBNYW5pcHVsYXRvciA9IHtcbiAgc2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCBrZXksIHZhbHVlKSB7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYGRhdGEtYnMtJHtub3JtYWxpemVEYXRhS2V5KGtleSl9YCwgdmFsdWUpO1xuICB9LFxuICByZW1vdmVEYXRhQXR0cmlidXRlKGVsZW1lbnQsIGtleSkge1xuICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGBkYXRhLWJzLSR7bm9ybWFsaXplRGF0YUtleShrZXkpfWApO1xuICB9LFxuICBnZXREYXRhQXR0cmlidXRlcyhlbGVtZW50KSB7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB7fTtcbiAgICBjb25zdCBic0tleXMgPSBPYmplY3Qua2V5cyhlbGVtZW50LmRhdGFzZXQpLmZpbHRlcihrZXkgPT4ga2V5LnN0YXJ0c1dpdGgoJ2JzJykgJiYgIWtleS5zdGFydHNXaXRoKCdic0NvbmZpZycpKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBic0tleXMpIHtcbiAgICAgIGxldCBwdXJlS2V5ID0ga2V5LnJlcGxhY2UoL15icy8sICcnKTtcbiAgICAgIHB1cmVLZXkgPSBwdXJlS2V5LmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgcHVyZUtleS5zbGljZSgxKTtcbiAgICAgIGF0dHJpYnV0ZXNbcHVyZUtleV0gPSBub3JtYWxpemVEYXRhKGVsZW1lbnQuZGF0YXNldFtrZXldKTtcbiAgICB9XG4gICAgcmV0dXJuIGF0dHJpYnV0ZXM7XG4gIH0sXG4gIGdldERhdGFBdHRyaWJ1dGUoZWxlbWVudCwga2V5KSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZURhdGEoZWxlbWVudC5nZXRBdHRyaWJ1dGUoYGRhdGEtYnMtJHtub3JtYWxpemVEYXRhS2V5KGtleSl9YCkpO1xuICB9XG59O1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9jb25maWcuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIENvbmZpZyB7XG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgaGF2ZSB0byBpbXBsZW1lbnQgdGhlIHN0YXRpYyBtZXRob2QgXCJOQU1FXCIsIGZvciBlYWNoIGNvbXBvbmVudCEnKTtcbiAgfVxuICBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgIGNvbmZpZyA9IHRoaXMuX21lcmdlQ29uZmlnT2JqKGNvbmZpZyk7XG4gICAgY29uZmlnID0gdGhpcy5fY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpO1xuICAgIHRoaXMuX3R5cGVDaGVja0NvbmZpZyhjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbiAgX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBfbWVyZ2VDb25maWdPYmooY29uZmlnLCBlbGVtZW50KSB7XG4gICAgY29uc3QganNvbkNvbmZpZyA9IGlzRWxlbWVudChlbGVtZW50KSA/IE1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGUoZWxlbWVudCwgJ2NvbmZpZycpIDoge307IC8vIHRyeSB0byBwYXJzZVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuY29uc3RydWN0b3IuRGVmYXVsdCxcbiAgICAgIC4uLih0eXBlb2YganNvbkNvbmZpZyA9PT0gJ29iamVjdCcgPyBqc29uQ29uZmlnIDoge30pLFxuICAgICAgLi4uKGlzRWxlbWVudChlbGVtZW50KSA/IE1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGVzKGVsZW1lbnQpIDoge30pLFxuICAgICAgLi4uKHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnID8gY29uZmlnIDoge30pXG4gICAgfTtcbiAgfVxuICBfdHlwZUNoZWNrQ29uZmlnKGNvbmZpZywgY29uZmlnVHlwZXMgPSB0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRUeXBlKSB7XG4gICAgZm9yIChjb25zdCBbcHJvcGVydHksIGV4cGVjdGVkVHlwZXNdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ1R5cGVzKSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBjb25maWdbcHJvcGVydHldO1xuICAgICAgY29uc3QgdmFsdWVUeXBlID0gaXNFbGVtZW50KHZhbHVlKSA/ICdlbGVtZW50JyA6IHRvVHlwZSh2YWx1ZSk7XG4gICAgICBpZiAoIW5ldyBSZWdFeHAoZXhwZWN0ZWRUeXBlcykudGVzdCh2YWx1ZVR5cGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7dGhpcy5jb25zdHJ1Y3Rvci5OQU1FLnRvVXBwZXJDYXNlKCl9OiBPcHRpb24gXCIke3Byb3BlcnR5fVwiIHByb3ZpZGVkIHR5cGUgXCIke3ZhbHVlVHlwZX1cIiBidXQgZXhwZWN0ZWQgdHlwZSBcIiR7ZXhwZWN0ZWRUeXBlc31cIi5gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGJhc2UtY29tcG9uZW50LmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IFZFUlNJT04gPSAnNS4zLjgnO1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBCYXNlQ29tcG9uZW50IGV4dGVuZHMgQ29uZmlnIHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoKTtcbiAgICBlbGVtZW50ID0gZ2V0RWxlbWVudChlbGVtZW50KTtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgRGF0YS5zZXQodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWSwgdGhpcyk7XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgZGlzcG9zZSgpIHtcbiAgICBEYXRhLnJlbW92ZSh0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZKTtcbiAgICBFdmVudEhhbmRsZXIub2ZmKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuRVZFTlRfS0VZKTtcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkge1xuICAgICAgdGhpc1twcm9wZXJ0eU5hbWVdID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9xdWV1ZUNhbGxiYWNrKGNhbGxiYWNrLCBlbGVtZW50LCBpc0FuaW1hdGVkID0gdHJ1ZSkge1xuICAgIGV4ZWN1dGVBZnRlclRyYW5zaXRpb24oY2FsbGJhY2ssIGVsZW1lbnQsIGlzQW5pbWF0ZWQpO1xuICB9XG4gIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgY29uZmlnID0gdGhpcy5fbWVyZ2VDb25maWdPYmooY29uZmlnLCB0aGlzLl9lbGVtZW50KTtcbiAgICBjb25maWcgPSB0aGlzLl9jb25maWdBZnRlck1lcmdlKGNvbmZpZyk7XG4gICAgdGhpcy5fdHlwZUNoZWNrQ29uZmlnKGNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgZ2V0SW5zdGFuY2UoZWxlbWVudCkge1xuICAgIHJldHVybiBEYXRhLmdldChnZXRFbGVtZW50KGVsZW1lbnQpLCB0aGlzLkRBVEFfS0VZKTtcbiAgfVxuICBzdGF0aWMgZ2V0T3JDcmVhdGVJbnN0YW5jZShlbGVtZW50LCBjb25maWcgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmdldEluc3RhbmNlKGVsZW1lbnQpIHx8IG5ldyB0aGlzKGVsZW1lbnQsIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnID8gY29uZmlnIDogbnVsbCk7XG4gIH1cbiAgc3RhdGljIGdldCBWRVJTSU9OKCkge1xuICAgIHJldHVybiBWRVJTSU9OO1xuICB9XG4gIHN0YXRpYyBnZXQgREFUQV9LRVkoKSB7XG4gICAgcmV0dXJuIGBicy4ke3RoaXMuTkFNRX1gO1xuICB9XG4gIHN0YXRpYyBnZXQgRVZFTlRfS0VZKCkge1xuICAgIHJldHVybiBgLiR7dGhpcy5EQVRBX0tFWX1gO1xuICB9XG4gIHN0YXRpYyBldmVudE5hbWUobmFtZSkge1xuICAgIHJldHVybiBgJHtuYW1lfSR7dGhpcy5FVkVOVF9LRVl9YDtcbiAgfVxufVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgZG9tL3NlbGVjdG9yLWVuZ2luZS5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmNvbnN0IGdldFNlbGVjdG9yID0gZWxlbWVudCA9PiB7XG4gIGxldCBzZWxlY3RvciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLXRhcmdldCcpO1xuICBpZiAoIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSAnIycpIHtcbiAgICBsZXQgaHJlZkF0dHJpYnV0ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdocmVmJyk7XG5cbiAgICAvLyBUaGUgb25seSB2YWxpZCBjb250ZW50IHRoYXQgY291bGQgZG91YmxlIGFzIGEgc2VsZWN0b3IgYXJlIElEcyBvciBjbGFzc2VzLFxuICAgIC8vIHNvIGV2ZXJ5dGhpbmcgc3RhcnRpbmcgd2l0aCBgI2Agb3IgYC5gLiBJZiBhIFwicmVhbFwiIFVSTCBpcyB1c2VkIGFzIHRoZSBzZWxlY3RvcixcbiAgICAvLyBgZG9jdW1lbnQucXVlcnlTZWxlY3RvcmAgd2lsbCByaWdodGZ1bGx5IGNvbXBsYWluIGl0IGlzIGludmFsaWQuXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMzIyNzNcbiAgICBpZiAoIWhyZWZBdHRyaWJ1dGUgfHwgIWhyZWZBdHRyaWJ1dGUuaW5jbHVkZXMoJyMnKSAmJiAhaHJlZkF0dHJpYnV0ZS5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIEp1c3QgaW4gY2FzZSBzb21lIENNUyBwdXRzIG91dCBhIGZ1bGwgVVJMIHdpdGggdGhlIGFuY2hvciBhcHBlbmRlZFxuICAgIGlmIChocmVmQXR0cmlidXRlLmluY2x1ZGVzKCcjJykgJiYgIWhyZWZBdHRyaWJ1dGUuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICBocmVmQXR0cmlidXRlID0gYCMke2hyZWZBdHRyaWJ1dGUuc3BsaXQoJyMnKVsxXX1gO1xuICAgIH1cbiAgICBzZWxlY3RvciA9IGhyZWZBdHRyaWJ1dGUgJiYgaHJlZkF0dHJpYnV0ZSAhPT0gJyMnID8gaHJlZkF0dHJpYnV0ZS50cmltKCkgOiBudWxsO1xuICB9XG4gIHJldHVybiBzZWxlY3RvciA/IHNlbGVjdG9yLnNwbGl0KCcsJykubWFwKHNlbCA9PiBwYXJzZVNlbGVjdG9yKHNlbCkpLmpvaW4oJywnKSA6IG51bGw7XG59O1xuY29uc3QgU2VsZWN0b3JFbmdpbmUgPSB7XG4gIGZpbmQoc2VsZWN0b3IsIGVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICByZXR1cm4gW10uY29uY2F0KC4uLkVsZW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwuY2FsbChlbGVtZW50LCBzZWxlY3RvcikpO1xuICB9LFxuICBmaW5kT25lKHNlbGVjdG9yLCBlbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgcmV0dXJuIEVsZW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3IuY2FsbChlbGVtZW50LCBzZWxlY3Rvcik7XG4gIH0sXG4gIGNoaWxkcmVuKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdCguLi5lbGVtZW50LmNoaWxkcmVuKS5maWx0ZXIoY2hpbGQgPT4gY2hpbGQubWF0Y2hlcyhzZWxlY3RvcikpO1xuICB9LFxuICBwYXJlbnRzKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgY29uc3QgcGFyZW50cyA9IFtdO1xuICAgIGxldCBhbmNlc3RvciA9IGVsZW1lbnQucGFyZW50Tm9kZS5jbG9zZXN0KHNlbGVjdG9yKTtcbiAgICB3aGlsZSAoYW5jZXN0b3IpIHtcbiAgICAgIHBhcmVudHMucHVzaChhbmNlc3Rvcik7XG4gICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudE5vZGUuY2xvc2VzdChzZWxlY3Rvcik7XG4gICAgfVxuICAgIHJldHVybiBwYXJlbnRzO1xuICB9LFxuICBwcmV2KGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgbGV0IHByZXZpb3VzID0gZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgIHdoaWxlIChwcmV2aW91cykge1xuICAgICAgaWYgKHByZXZpb3VzLm1hdGNoZXMoc2VsZWN0b3IpKSB7XG4gICAgICAgIHJldHVybiBbcHJldmlvdXNdO1xuICAgICAgfVxuICAgICAgcHJldmlvdXMgPSBwcmV2aW91cy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH0sXG4gIC8vIFRPRE86IHRoaXMgaXMgbm93IHVudXNlZDsgcmVtb3ZlIGxhdGVyIGFsb25nIHdpdGggcHJldigpXG4gIG5leHQoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICBsZXQgbmV4dCA9IGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgIHdoaWxlIChuZXh0KSB7XG4gICAgICBpZiAobmV4dC5tYXRjaGVzKHNlbGVjdG9yKSkge1xuICAgICAgICByZXR1cm4gW25leHRdO1xuICAgICAgfVxuICAgICAgbmV4dCA9IG5leHQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH0sXG4gIGZvY3VzYWJsZUNoaWxkcmVuKGVsZW1lbnQpIHtcbiAgICBjb25zdCBmb2N1c2FibGVzID0gWydhJywgJ2J1dHRvbicsICdpbnB1dCcsICd0ZXh0YXJlYScsICdzZWxlY3QnLCAnZGV0YWlscycsICdbdGFiaW5kZXhdJywgJ1tjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdJ10ubWFwKHNlbGVjdG9yID0+IGAke3NlbGVjdG9yfTpub3QoW3RhYmluZGV4Xj1cIi1cIl0pYCkuam9pbignLCcpO1xuICAgIHJldHVybiB0aGlzLmZpbmQoZm9jdXNhYmxlcywgZWxlbWVudCkuZmlsdGVyKGVsID0+ICFpc0Rpc2FibGVkKGVsKSAmJiBpc1Zpc2libGUoZWwpKTtcbiAgfSxcbiAgZ2V0U2VsZWN0b3JGcm9tRWxlbWVudChlbGVtZW50KSB7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihlbGVtZW50KTtcbiAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiBTZWxlY3RvckVuZ2luZS5maW5kT25lKHNlbGVjdG9yKSA/IHNlbGVjdG9yIDogbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG4gIGdldEVsZW1lbnRGcm9tU2VsZWN0b3IoZWxlbWVudCkge1xuICAgIGNvbnN0IHNlbGVjdG9yID0gZ2V0U2VsZWN0b3IoZWxlbWVudCk7XG4gICAgcmV0dXJuIHNlbGVjdG9yID8gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShzZWxlY3RvcikgOiBudWxsO1xuICB9LFxuICBnZXRNdWx0aXBsZUVsZW1lbnRzRnJvbVNlbGVjdG9yKGVsZW1lbnQpIHtcbiAgICBjb25zdCBzZWxlY3RvciA9IGdldFNlbGVjdG9yKGVsZW1lbnQpO1xuICAgIHJldHVybiBzZWxlY3RvciA/IFNlbGVjdG9yRW5naW5lLmZpbmQoc2VsZWN0b3IpIDogW107XG4gIH1cbn07XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL2NvbXBvbmVudC1mdW5jdGlvbnMuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5jb25zdCBlbmFibGVEaXNtaXNzVHJpZ2dlciA9IChjb21wb25lbnQsIG1ldGhvZCA9ICdoaWRlJykgPT4ge1xuICBjb25zdCBjbGlja0V2ZW50ID0gYGNsaWNrLmRpc21pc3Mke2NvbXBvbmVudC5FVkVOVF9LRVl9YDtcbiAgY29uc3QgbmFtZSA9IGNvbXBvbmVudC5OQU1FO1xuICBFdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIGNsaWNrRXZlbnQsIGBbZGF0YS1icy1kaXNtaXNzPVwiJHtuYW1lfVwiXWAsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChbJ0EnLCAnQVJFQSddLmluY2x1ZGVzKHRoaXMudGFnTmFtZSkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGlmIChpc0Rpc2FibGVkKHRoaXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IFNlbGVjdG9yRW5naW5lLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IodGhpcykgfHwgdGhpcy5jbG9zZXN0KGAuJHtuYW1lfWApO1xuICAgIGNvbnN0IGluc3RhbmNlID0gY29tcG9uZW50LmdldE9yQ3JlYXRlSW5zdGFuY2UodGFyZ2V0KTtcblxuICAgIC8vIE1ldGhvZCBhcmd1bWVudCBpcyBsZWZ0LCBmb3IgQWxlcnQgYW5kIG9ubHksIGFzIGl0IGRvZXNuJ3QgaW1wbGVtZW50IHRoZSAnaGlkZScgbWV0aG9kXG4gICAgaW5zdGFuY2VbbWV0aG9kXSgpO1xuICB9KTtcbn07XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBhbGVydC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJGYgPSAnYWxlcnQnO1xuY29uc3QgREFUQV9LRVkkYSA9ICdicy5hbGVydCc7XG5jb25zdCBFVkVOVF9LRVkkYiA9IGAuJHtEQVRBX0tFWSRhfWA7XG5jb25zdCBFVkVOVF9DTE9TRSA9IGBjbG9zZSR7RVZFTlRfS0VZJGJ9YDtcbmNvbnN0IEVWRU5UX0NMT1NFRCA9IGBjbG9zZWQke0VWRU5UX0tFWSRifWA7XG5jb25zdCBDTEFTU19OQU1FX0ZBREUkNSA9ICdmYWRlJztcbmNvbnN0IENMQVNTX05BTUVfU0hPVyQ4ID0gJ3Nob3cnO1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBBbGVydCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRSRmO1xuICB9XG5cbiAgLy8gUHVibGljXG4gIGNsb3NlKCkge1xuICAgIGNvbnN0IGNsb3NlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9DTE9TRSk7XG4gICAgaWYgKGNsb3NlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XJDgpO1xuICAgIGNvbnN0IGlzQW5pbWF0ZWQgPSB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0ZBREUkNSk7XG4gICAgdGhpcy5fcXVldWVDYWxsYmFjaygoKSA9PiB0aGlzLl9kZXN0cm95RWxlbWVudCgpLCB0aGlzLl9lbGVtZW50LCBpc0FuaW1hdGVkKTtcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2Rlc3Ryb3lFbGVtZW50KCkge1xuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7XG4gICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfQ0xPU0VEKTtcbiAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IEFsZXJ0LmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcyk7XG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGFbY29uZmlnXSA9PT0gdW5kZWZpbmVkIHx8IGNvbmZpZy5zdGFydHNXaXRoKCdfJykgfHwgY29uZmlnID09PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYCk7XG4gICAgICB9XG4gICAgICBkYXRhW2NvbmZpZ10odGhpcyk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbmVuYWJsZURpc21pc3NUcmlnZ2VyKEFsZXJ0LCAnY2xvc2UnKTtcblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oQWxlcnQpO1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgYnV0dG9uLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUkZSA9ICdidXR0b24nO1xuY29uc3QgREFUQV9LRVkkOSA9ICdicy5idXR0b24nO1xuY29uc3QgRVZFTlRfS0VZJGEgPSBgLiR7REFUQV9LRVkkOX1gO1xuY29uc3QgREFUQV9BUElfS0VZJDYgPSAnLmRhdGEtYXBpJztcbmNvbnN0IENMQVNTX05BTUVfQUNUSVZFJDMgPSAnYWN0aXZlJztcbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFJDUgPSAnW2RhdGEtYnMtdG9nZ2xlPVwiYnV0dG9uXCJdJztcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJJDYgPSBgY2xpY2ske0VWRU5UX0tFWSRhfSR7REFUQV9BUElfS0VZJDZ9YDtcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgQnV0dG9uIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FJGU7XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgdG9nZ2xlKCkge1xuICAgIC8vIFRvZ2dsZSBjbGFzcyBhbmQgc3luYyB0aGUgYGFyaWEtcHJlc3NlZGAgYXR0cmlidXRlIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgYC50b2dnbGUoKWAgbWV0aG9kXG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShDTEFTU19OQU1FX0FDVElWRSQzKSk7XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBCdXR0b24uZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzKTtcbiAgICAgIGlmIChjb25maWcgPT09ICd0b2dnbGUnKSB7XG4gICAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJJDYsIFNFTEVDVE9SX0RBVEFfVE9HR0xFJDUsIGV2ZW50ID0+IHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgY29uc3QgYnV0dG9uID0gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoU0VMRUNUT1JfREFUQV9UT0dHTEUkNSk7XG4gIGNvbnN0IGRhdGEgPSBCdXR0b24uZ2V0T3JDcmVhdGVJbnN0YW5jZShidXR0b24pO1xuICBkYXRhLnRvZ2dsZSgpO1xufSk7XG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKEJ1dHRvbik7XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL3N3aXBlLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUkZCA9ICdzd2lwZSc7XG5jb25zdCBFVkVOVF9LRVkkOSA9ICcuYnMuc3dpcGUnO1xuY29uc3QgRVZFTlRfVE9VQ0hTVEFSVCA9IGB0b3VjaHN0YXJ0JHtFVkVOVF9LRVkkOX1gO1xuY29uc3QgRVZFTlRfVE9VQ0hNT1ZFID0gYHRvdWNobW92ZSR7RVZFTlRfS0VZJDl9YDtcbmNvbnN0IEVWRU5UX1RPVUNIRU5EID0gYHRvdWNoZW5kJHtFVkVOVF9LRVkkOX1gO1xuY29uc3QgRVZFTlRfUE9JTlRFUkRPV04gPSBgcG9pbnRlcmRvd24ke0VWRU5UX0tFWSQ5fWA7XG5jb25zdCBFVkVOVF9QT0lOVEVSVVAgPSBgcG9pbnRlcnVwJHtFVkVOVF9LRVkkOX1gO1xuY29uc3QgUE9JTlRFUl9UWVBFX1RPVUNIID0gJ3RvdWNoJztcbmNvbnN0IFBPSU5URVJfVFlQRV9QRU4gPSAncGVuJztcbmNvbnN0IENMQVNTX05BTUVfUE9JTlRFUl9FVkVOVCA9ICdwb2ludGVyLWV2ZW50JztcbmNvbnN0IFNXSVBFX1RIUkVTSE9MRCA9IDQwO1xuY29uc3QgRGVmYXVsdCRjID0ge1xuICBlbmRDYWxsYmFjazogbnVsbCxcbiAgbGVmdENhbGxiYWNrOiBudWxsLFxuICByaWdodENhbGxiYWNrOiBudWxsXG59O1xuY29uc3QgRGVmYXVsdFR5cGUkYyA9IHtcbiAgZW5kQ2FsbGJhY2s6ICcoZnVuY3Rpb258bnVsbCknLFxuICBsZWZ0Q2FsbGJhY2s6ICcoZnVuY3Rpb258bnVsbCknLFxuICByaWdodENhbGxiYWNrOiAnKGZ1bmN0aW9ufG51bGwpJ1xufTtcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgU3dpcGUgZXh0ZW5kcyBDb25maWcge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgIGlmICghZWxlbWVudCB8fCAhU3dpcGUuaXNTdXBwb3J0ZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKTtcbiAgICB0aGlzLl9kZWx0YVggPSAwO1xuICAgIHRoaXMuX3N1cHBvcnRQb2ludGVyRXZlbnRzID0gQm9vbGVhbih3aW5kb3cuUG9pbnRlckV2ZW50KTtcbiAgICB0aGlzLl9pbml0RXZlbnRzKCk7XG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdCRjO1xuICB9XG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlJGM7XG4gIH1cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FJGQ7XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgZGlzcG9zZSgpIHtcbiAgICBFdmVudEhhbmRsZXIub2ZmKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0tFWSQ5KTtcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX3N0YXJ0KGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLl9zdXBwb3J0UG9pbnRlckV2ZW50cykge1xuICAgICAgdGhpcy5fZGVsdGFYID0gZXZlbnQudG91Y2hlc1swXS5jbGllbnRYO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZXZlbnRJc1BvaW50ZXJQZW5Ub3VjaChldmVudCkpIHtcbiAgICAgIHRoaXMuX2RlbHRhWCA9IGV2ZW50LmNsaWVudFg7XG4gICAgfVxuICB9XG4gIF9lbmQoZXZlbnQpIHtcbiAgICBpZiAodGhpcy5fZXZlbnRJc1BvaW50ZXJQZW5Ub3VjaChldmVudCkpIHtcbiAgICAgIHRoaXMuX2RlbHRhWCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLl9kZWx0YVg7XG4gICAgfVxuICAgIHRoaXMuX2hhbmRsZVN3aXBlKCk7XG4gICAgZXhlY3V0ZSh0aGlzLl9jb25maWcuZW5kQ2FsbGJhY2spO1xuICB9XG4gIF9tb3ZlKGV2ZW50KSB7XG4gICAgdGhpcy5fZGVsdGFYID0gZXZlbnQudG91Y2hlcyAmJiBldmVudC50b3VjaGVzLmxlbmd0aCA+IDEgPyAwIDogZXZlbnQudG91Y2hlc1swXS5jbGllbnRYIC0gdGhpcy5fZGVsdGFYO1xuICB9XG4gIF9oYW5kbGVTd2lwZSgpIHtcbiAgICBjb25zdCBhYnNEZWx0YVggPSBNYXRoLmFicyh0aGlzLl9kZWx0YVgpO1xuICAgIGlmIChhYnNEZWx0YVggPD0gU1dJUEVfVEhSRVNIT0xEKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IGFic0RlbHRhWCAvIHRoaXMuX2RlbHRhWDtcbiAgICB0aGlzLl9kZWx0YVggPSAwO1xuICAgIGlmICghZGlyZWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV4ZWN1dGUoZGlyZWN0aW9uID4gMCA/IHRoaXMuX2NvbmZpZy5yaWdodENhbGxiYWNrIDogdGhpcy5fY29uZmlnLmxlZnRDYWxsYmFjayk7XG4gIH1cbiAgX2luaXRFdmVudHMoKSB7XG4gICAgaWYgKHRoaXMuX3N1cHBvcnRQb2ludGVyRXZlbnRzKSB7XG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfUE9JTlRFUkRPV04sIGV2ZW50ID0+IHRoaXMuX3N0YXJ0KGV2ZW50KSk7XG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfUE9JTlRFUlVQLCBldmVudCA9PiB0aGlzLl9lbmQoZXZlbnQpKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1BPSU5URVJfRVZFTlQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfVE9VQ0hTVEFSVCwgZXZlbnQgPT4gdGhpcy5fc3RhcnQoZXZlbnQpKTtcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9UT1VDSE1PVkUsIGV2ZW50ID0+IHRoaXMuX21vdmUoZXZlbnQpKTtcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9UT1VDSEVORCwgZXZlbnQgPT4gdGhpcy5fZW5kKGV2ZW50KSk7XG4gICAgfVxuICB9XG4gIF9ldmVudElzUG9pbnRlclBlblRvdWNoKGV2ZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuX3N1cHBvcnRQb2ludGVyRXZlbnRzICYmIChldmVudC5wb2ludGVyVHlwZSA9PT0gUE9JTlRFUl9UWVBFX1BFTiB8fCBldmVudC5wb2ludGVyVHlwZSA9PT0gUE9JTlRFUl9UWVBFX1RPVUNIKTtcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgaXNTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuICdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAwO1xuICB9XG59XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBjYXJvdXNlbC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJGMgPSAnY2Fyb3VzZWwnO1xuY29uc3QgREFUQV9LRVkkOCA9ICdicy5jYXJvdXNlbCc7XG5jb25zdCBFVkVOVF9LRVkkOCA9IGAuJHtEQVRBX0tFWSQ4fWA7XG5jb25zdCBEQVRBX0FQSV9LRVkkNSA9ICcuZGF0YS1hcGknO1xuY29uc3QgQVJST1dfTEVGVF9LRVkkMSA9ICdBcnJvd0xlZnQnO1xuY29uc3QgQVJST1dfUklHSFRfS0VZJDEgPSAnQXJyb3dSaWdodCc7XG5jb25zdCBUT1VDSEVWRU5UX0NPTVBBVF9XQUlUID0gNTAwOyAvLyBUaW1lIGZvciBtb3VzZSBjb21wYXQgZXZlbnRzIHRvIGZpcmUgYWZ0ZXIgdG91Y2hcblxuY29uc3QgT1JERVJfTkVYVCA9ICduZXh0JztcbmNvbnN0IE9SREVSX1BSRVYgPSAncHJldic7XG5jb25zdCBESVJFQ1RJT05fTEVGVCA9ICdsZWZ0JztcbmNvbnN0IERJUkVDVElPTl9SSUdIVCA9ICdyaWdodCc7XG5jb25zdCBFVkVOVF9TTElERSA9IGBzbGlkZSR7RVZFTlRfS0VZJDh9YDtcbmNvbnN0IEVWRU5UX1NMSUQgPSBgc2xpZCR7RVZFTlRfS0VZJDh9YDtcbmNvbnN0IEVWRU5UX0tFWURPV04kMSA9IGBrZXlkb3duJHtFVkVOVF9LRVkkOH1gO1xuY29uc3QgRVZFTlRfTU9VU0VFTlRFUiQxID0gYG1vdXNlZW50ZXIke0VWRU5UX0tFWSQ4fWA7XG5jb25zdCBFVkVOVF9NT1VTRUxFQVZFJDEgPSBgbW91c2VsZWF2ZSR7RVZFTlRfS0VZJDh9YDtcbmNvbnN0IEVWRU5UX0RSQUdfU1RBUlQgPSBgZHJhZ3N0YXJ0JHtFVkVOVF9LRVkkOH1gO1xuY29uc3QgRVZFTlRfTE9BRF9EQVRBX0FQSSQzID0gYGxvYWQke0VWRU5UX0tFWSQ4fSR7REFUQV9BUElfS0VZJDV9YDtcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJJDUgPSBgY2xpY2ske0VWRU5UX0tFWSQ4fSR7REFUQV9BUElfS0VZJDV9YDtcbmNvbnN0IENMQVNTX05BTUVfQ0FST1VTRUwgPSAnY2Fyb3VzZWwnO1xuY29uc3QgQ0xBU1NfTkFNRV9BQ1RJVkUkMiA9ICdhY3RpdmUnO1xuY29uc3QgQ0xBU1NfTkFNRV9TTElERSA9ICdzbGlkZSc7XG5jb25zdCBDTEFTU19OQU1FX0VORCA9ICdjYXJvdXNlbC1pdGVtLWVuZCc7XG5jb25zdCBDTEFTU19OQU1FX1NUQVJUID0gJ2Nhcm91c2VsLWl0ZW0tc3RhcnQnO1xuY29uc3QgQ0xBU1NfTkFNRV9ORVhUID0gJ2Nhcm91c2VsLWl0ZW0tbmV4dCc7XG5jb25zdCBDTEFTU19OQU1FX1BSRVYgPSAnY2Fyb3VzZWwtaXRlbS1wcmV2JztcbmNvbnN0IFNFTEVDVE9SX0FDVElWRSA9ICcuYWN0aXZlJztcbmNvbnN0IFNFTEVDVE9SX0lURU0gPSAnLmNhcm91c2VsLWl0ZW0nO1xuY29uc3QgU0VMRUNUT1JfQUNUSVZFX0lURU0gPSBTRUxFQ1RPUl9BQ1RJVkUgKyBTRUxFQ1RPUl9JVEVNO1xuY29uc3QgU0VMRUNUT1JfSVRFTV9JTUcgPSAnLmNhcm91c2VsLWl0ZW0gaW1nJztcbmNvbnN0IFNFTEVDVE9SX0lORElDQVRPUlMgPSAnLmNhcm91c2VsLWluZGljYXRvcnMnO1xuY29uc3QgU0VMRUNUT1JfREFUQV9TTElERSA9ICdbZGF0YS1icy1zbGlkZV0sIFtkYXRhLWJzLXNsaWRlLXRvXSc7XG5jb25zdCBTRUxFQ1RPUl9EQVRBX1JJREUgPSAnW2RhdGEtYnMtcmlkZT1cImNhcm91c2VsXCJdJztcbmNvbnN0IEtFWV9UT19ESVJFQ1RJT04gPSB7XG4gIFtBUlJPV19MRUZUX0tFWSQxXTogRElSRUNUSU9OX1JJR0hULFxuICBbQVJST1dfUklHSFRfS0VZJDFdOiBESVJFQ1RJT05fTEVGVFxufTtcbmNvbnN0IERlZmF1bHQkYiA9IHtcbiAgaW50ZXJ2YWw6IDUwMDAsXG4gIGtleWJvYXJkOiB0cnVlLFxuICBwYXVzZTogJ2hvdmVyJyxcbiAgcmlkZTogZmFsc2UsXG4gIHRvdWNoOiB0cnVlLFxuICB3cmFwOiB0cnVlXG59O1xuY29uc3QgRGVmYXVsdFR5cGUkYiA9IHtcbiAgaW50ZXJ2YWw6ICcobnVtYmVyfGJvb2xlYW4pJyxcbiAgLy8gVE9ETzp2NiByZW1vdmUgYm9vbGVhbiBzdXBwb3J0XG4gIGtleWJvYXJkOiAnYm9vbGVhbicsXG4gIHBhdXNlOiAnKHN0cmluZ3xib29sZWFuKScsXG4gIHJpZGU6ICcoYm9vbGVhbnxzdHJpbmcpJyxcbiAgdG91Y2g6ICdib29sZWFuJyxcbiAgd3JhcDogJ2Jvb2xlYW4nXG59O1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBDYXJvdXNlbCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpO1xuICAgIHRoaXMuX2ludGVydmFsID0gbnVsbDtcbiAgICB0aGlzLl9hY3RpdmVFbGVtZW50ID0gbnVsbDtcbiAgICB0aGlzLl9pc1NsaWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnRvdWNoVGltZW91dCA9IG51bGw7XG4gICAgdGhpcy5fc3dpcGVIZWxwZXIgPSBudWxsO1xuICAgIHRoaXMuX2luZGljYXRvcnNFbGVtZW50ID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9JTkRJQ0FUT1JTLCB0aGlzLl9lbGVtZW50KTtcbiAgICB0aGlzLl9hZGRFdmVudExpc3RlbmVycygpO1xuICAgIGlmICh0aGlzLl9jb25maWcucmlkZSA9PT0gQ0xBU1NfTkFNRV9DQVJPVVNFTCkge1xuICAgICAgdGhpcy5jeWNsZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0JGI7XG4gIH1cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGUkYjtcbiAgfVxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUUkYztcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBuZXh0KCkge1xuICAgIHRoaXMuX3NsaWRlKE9SREVSX05FWFQpO1xuICB9XG4gIG5leHRXaGVuVmlzaWJsZSgpIHtcbiAgICAvLyBGSVhNRSBUT0RPIHVzZSBgZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlYFxuICAgIC8vIERvbid0IGNhbGwgbmV4dCB3aGVuIHRoZSBwYWdlIGlzbid0IHZpc2libGVcbiAgICAvLyBvciB0aGUgY2Fyb3VzZWwgb3IgaXRzIHBhcmVudCBpc24ndCB2aXNpYmxlXG4gICAgaWYgKCFkb2N1bWVudC5oaWRkZW4gJiYgaXNWaXNpYmxlKHRoaXMuX2VsZW1lbnQpKSB7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICB9XG4gIH1cbiAgcHJldigpIHtcbiAgICB0aGlzLl9zbGlkZShPUkRFUl9QUkVWKTtcbiAgfVxuICBwYXVzZSgpIHtcbiAgICBpZiAodGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICB0cmlnZ2VyVHJhbnNpdGlvbkVuZCh0aGlzLl9lbGVtZW50KTtcbiAgICB9XG4gICAgdGhpcy5fY2xlYXJJbnRlcnZhbCgpO1xuICB9XG4gIGN5Y2xlKCkge1xuICAgIHRoaXMuX2NsZWFySW50ZXJ2YWwoKTtcbiAgICB0aGlzLl91cGRhdGVJbnRlcnZhbCgpO1xuICAgIHRoaXMuX2ludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5uZXh0V2hlblZpc2libGUoKSwgdGhpcy5fY29uZmlnLmludGVydmFsKTtcbiAgfVxuICBfbWF5YmVFbmFibGVDeWNsZSgpIHtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5yaWRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9pc1NsaWRpbmcpIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vbmUodGhpcy5fZWxlbWVudCwgRVZFTlRfU0xJRCwgKCkgPT4gdGhpcy5jeWNsZSgpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jeWNsZSgpO1xuICB9XG4gIHRvKGluZGV4KSB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLl9nZXRJdGVtcygpO1xuICAgIGlmIChpbmRleCA+IGl0ZW1zLmxlbmd0aCAtIDEgfHwgaW5kZXggPCAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9pc1NsaWRpbmcpIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vbmUodGhpcy5fZWxlbWVudCwgRVZFTlRfU0xJRCwgKCkgPT4gdGhpcy50byhpbmRleCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhY3RpdmVJbmRleCA9IHRoaXMuX2dldEl0ZW1JbmRleCh0aGlzLl9nZXRBY3RpdmUoKSk7XG4gICAgaWYgKGFjdGl2ZUluZGV4ID09PSBpbmRleCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvcmRlciA9IGluZGV4ID4gYWN0aXZlSW5kZXggPyBPUkRFUl9ORVhUIDogT1JERVJfUFJFVjtcbiAgICB0aGlzLl9zbGlkZShvcmRlciwgaXRlbXNbaW5kZXhdKTtcbiAgfVxuICBkaXNwb3NlKCkge1xuICAgIGlmICh0aGlzLl9zd2lwZUhlbHBlcikge1xuICAgICAgdGhpcy5fc3dpcGVIZWxwZXIuZGlzcG9zZSgpO1xuICAgIH1cbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9jb25maWdBZnRlck1lcmdlKGNvbmZpZykge1xuICAgIGNvbmZpZy5kZWZhdWx0SW50ZXJ2YWwgPSBjb25maWcuaW50ZXJ2YWw7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBfYWRkRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgaWYgKHRoaXMuX2NvbmZpZy5rZXlib2FyZCkge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0tFWURPV04kMSwgZXZlbnQgPT4gdGhpcy5fa2V5ZG93bihldmVudCkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY29uZmlnLnBhdXNlID09PSAnaG92ZXInKSB7XG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfTU9VU0VFTlRFUiQxLCAoKSA9PiB0aGlzLnBhdXNlKCkpO1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFTEVBVkUkMSwgKCkgPT4gdGhpcy5fbWF5YmVFbmFibGVDeWNsZSgpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NvbmZpZy50b3VjaCAmJiBTd2lwZS5pc1N1cHBvcnRlZCgpKSB7XG4gICAgICB0aGlzLl9hZGRUb3VjaEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuICB9XG4gIF9hZGRUb3VjaEV2ZW50TGlzdGVuZXJzKCkge1xuICAgIGZvciAoY29uc3QgaW1nIG9mIFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfSVRFTV9JTUcsIHRoaXMuX2VsZW1lbnQpKSB7XG4gICAgICBFdmVudEhhbmRsZXIub24oaW1nLCBFVkVOVF9EUkFHX1NUQVJULCBldmVudCA9PiBldmVudC5wcmV2ZW50RGVmYXVsdCgpKTtcbiAgICB9XG4gICAgY29uc3QgZW5kQ2FsbEJhY2sgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fY29uZmlnLnBhdXNlICE9PSAnaG92ZXInKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgaXQncyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlLCBtb3VzZWVudGVyL2xlYXZlIGFyZSBmaXJlZCBhc1xuICAgICAgLy8gcGFydCBvZiB0aGUgbW91c2UgY29tcGF0aWJpbGl0eSBldmVudHMgb24gZmlyc3QgdGFwIC0gdGhlIGNhcm91c2VsXG4gICAgICAvLyB3b3VsZCBzdG9wIGN5Y2xpbmcgdW50aWwgdXNlciB0YXBwZWQgb3V0IG9mIGl0O1xuICAgICAgLy8gaGVyZSwgd2UgbGlzdGVuIGZvciB0b3VjaGVuZCwgZXhwbGljaXRseSBwYXVzZSB0aGUgY2Fyb3VzZWxcbiAgICAgIC8vIChhcyBpZiBpdCdzIHRoZSBzZWNvbmQgdGltZSB3ZSB0YXAgb24gaXQsIG1vdXNlZW50ZXIgY29tcGF0IGV2ZW50XG4gICAgICAvLyBpcyBOT1QgZmlyZWQpIGFuZCBhZnRlciBhIHRpbWVvdXQgKHRvIGFsbG93IGZvciBtb3VzZSBjb21wYXRpYmlsaXR5XG4gICAgICAvLyBldmVudHMgdG8gZmlyZSkgd2UgZXhwbGljaXRseSByZXN0YXJ0IGN5Y2xpbmdcblxuICAgICAgdGhpcy5wYXVzZSgpO1xuICAgICAgaWYgKHRoaXMudG91Y2hUaW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvdWNoVGltZW91dCk7XG4gICAgICB9XG4gICAgICB0aGlzLnRvdWNoVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5fbWF5YmVFbmFibGVDeWNsZSgpLCBUT1VDSEVWRU5UX0NPTVBBVF9XQUlUICsgdGhpcy5fY29uZmlnLmludGVydmFsKTtcbiAgICB9O1xuICAgIGNvbnN0IHN3aXBlQ29uZmlnID0ge1xuICAgICAgbGVmdENhbGxiYWNrOiAoKSA9PiB0aGlzLl9zbGlkZSh0aGlzLl9kaXJlY3Rpb25Ub09yZGVyKERJUkVDVElPTl9MRUZUKSksXG4gICAgICByaWdodENhbGxiYWNrOiAoKSA9PiB0aGlzLl9zbGlkZSh0aGlzLl9kaXJlY3Rpb25Ub09yZGVyKERJUkVDVElPTl9SSUdIVCkpLFxuICAgICAgZW5kQ2FsbGJhY2s6IGVuZENhbGxCYWNrXG4gICAgfTtcbiAgICB0aGlzLl9zd2lwZUhlbHBlciA9IG5ldyBTd2lwZSh0aGlzLl9lbGVtZW50LCBzd2lwZUNvbmZpZyk7XG4gIH1cbiAgX2tleWRvd24oZXZlbnQpIHtcbiAgICBpZiAoL2lucHV0fHRleHRhcmVhL2kudGVzdChldmVudC50YXJnZXQudGFnTmFtZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGlyZWN0aW9uID0gS0VZX1RPX0RJUkVDVElPTltldmVudC5rZXldO1xuICAgIGlmIChkaXJlY3Rpb24pIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLl9zbGlkZSh0aGlzLl9kaXJlY3Rpb25Ub09yZGVyKGRpcmVjdGlvbikpO1xuICAgIH1cbiAgfVxuICBfZ2V0SXRlbUluZGV4KGVsZW1lbnQpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0SXRlbXMoKS5pbmRleE9mKGVsZW1lbnQpO1xuICB9XG4gIF9zZXRBY3RpdmVJbmRpY2F0b3JFbGVtZW50KGluZGV4KSB7XG4gICAgaWYgKCF0aGlzLl9pbmRpY2F0b3JzRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhY3RpdmVJbmRpY2F0b3IgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX0FDVElWRSwgdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQpO1xuICAgIGFjdGl2ZUluZGljYXRvci5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFJDIpO1xuICAgIGFjdGl2ZUluZGljYXRvci5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcpO1xuICAgIGNvbnN0IG5ld0FjdGl2ZUluZGljYXRvciA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoYFtkYXRhLWJzLXNsaWRlLXRvPVwiJHtpbmRleH1cIl1gLCB0aGlzLl9pbmRpY2F0b3JzRWxlbWVudCk7XG4gICAgaWYgKG5ld0FjdGl2ZUluZGljYXRvcikge1xuICAgICAgbmV3QWN0aXZlSW5kaWNhdG9yLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9BQ1RJVkUkMik7XG4gICAgICBuZXdBY3RpdmVJbmRpY2F0b3Iuc2V0QXR0cmlidXRlKCdhcmlhLWN1cnJlbnQnLCAndHJ1ZScpO1xuICAgIH1cbiAgfVxuICBfdXBkYXRlSW50ZXJ2YWwoKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2FjdGl2ZUVsZW1lbnQgfHwgdGhpcy5fZ2V0QWN0aXZlKCk7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGVsZW1lbnRJbnRlcnZhbCA9IE51bWJlci5wYXJzZUludChlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1icy1pbnRlcnZhbCcpLCAxMCk7XG4gICAgdGhpcy5fY29uZmlnLmludGVydmFsID0gZWxlbWVudEludGVydmFsIHx8IHRoaXMuX2NvbmZpZy5kZWZhdWx0SW50ZXJ2YWw7XG4gIH1cbiAgX3NsaWRlKG9yZGVyLCBlbGVtZW50ID0gbnVsbCkge1xuICAgIGlmICh0aGlzLl9pc1NsaWRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IHRoaXMuX2dldEFjdGl2ZSgpO1xuICAgIGNvbnN0IGlzTmV4dCA9IG9yZGVyID09PSBPUkRFUl9ORVhUO1xuICAgIGNvbnN0IG5leHRFbGVtZW50ID0gZWxlbWVudCB8fCBnZXROZXh0QWN0aXZlRWxlbWVudCh0aGlzLl9nZXRJdGVtcygpLCBhY3RpdmVFbGVtZW50LCBpc05leHQsIHRoaXMuX2NvbmZpZy53cmFwKTtcbiAgICBpZiAobmV4dEVsZW1lbnQgPT09IGFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV4dEVsZW1lbnRJbmRleCA9IHRoaXMuX2dldEl0ZW1JbmRleChuZXh0RWxlbWVudCk7XG4gICAgY29uc3QgdHJpZ2dlckV2ZW50ID0gZXZlbnROYW1lID0+IHtcbiAgICAgIHJldHVybiBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBldmVudE5hbWUsIHtcbiAgICAgICAgcmVsYXRlZFRhcmdldDogbmV4dEVsZW1lbnQsXG4gICAgICAgIGRpcmVjdGlvbjogdGhpcy5fb3JkZXJUb0RpcmVjdGlvbihvcmRlciksXG4gICAgICAgIGZyb206IHRoaXMuX2dldEl0ZW1JbmRleChhY3RpdmVFbGVtZW50KSxcbiAgICAgICAgdG86IG5leHRFbGVtZW50SW5kZXhcbiAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3Qgc2xpZGVFdmVudCA9IHRyaWdnZXJFdmVudChFVkVOVF9TTElERSk7XG4gICAgaWYgKHNsaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWFjdGl2ZUVsZW1lbnQgfHwgIW5leHRFbGVtZW50KSB7XG4gICAgICAvLyBTb21lIHdlaXJkbmVzcyBpcyBoYXBwZW5pbmcsIHNvIHdlIGJhaWxcbiAgICAgIC8vIFRPRE86IGNoYW5nZSB0ZXN0cyB0aGF0IHVzZSBlbXB0eSBkaXZzIHRvIGF2b2lkIHRoaXMgY2hlY2tcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaXNDeWNsaW5nID0gQm9vbGVhbih0aGlzLl9pbnRlcnZhbCk7XG4gICAgdGhpcy5wYXVzZSgpO1xuICAgIHRoaXMuX2lzU2xpZGluZyA9IHRydWU7XG4gICAgdGhpcy5fc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudChuZXh0RWxlbWVudEluZGV4KTtcbiAgICB0aGlzLl9hY3RpdmVFbGVtZW50ID0gbmV4dEVsZW1lbnQ7XG4gICAgY29uc3QgZGlyZWN0aW9uYWxDbGFzc05hbWUgPSBpc05leHQgPyBDTEFTU19OQU1FX1NUQVJUIDogQ0xBU1NfTkFNRV9FTkQ7XG4gICAgY29uc3Qgb3JkZXJDbGFzc05hbWUgPSBpc05leHQgPyBDTEFTU19OQU1FX05FWFQgOiBDTEFTU19OQU1FX1BSRVY7XG4gICAgbmV4dEVsZW1lbnQuY2xhc3NMaXN0LmFkZChvcmRlckNsYXNzTmFtZSk7XG4gICAgcmVmbG93KG5leHRFbGVtZW50KTtcbiAgICBhY3RpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoZGlyZWN0aW9uYWxDbGFzc05hbWUpO1xuICAgIG5leHRFbGVtZW50LmNsYXNzTGlzdC5hZGQoZGlyZWN0aW9uYWxDbGFzc05hbWUpO1xuICAgIGNvbnN0IGNvbXBsZXRlQ2FsbEJhY2sgPSAoKSA9PiB7XG4gICAgICBuZXh0RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGRpcmVjdGlvbmFsQ2xhc3NOYW1lLCBvcmRlckNsYXNzTmFtZSk7XG4gICAgICBuZXh0RWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFJDIpO1xuICAgICAgYWN0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFJDIsIG9yZGVyQ2xhc3NOYW1lLCBkaXJlY3Rpb25hbENsYXNzTmFtZSk7XG4gICAgICB0aGlzLl9pc1NsaWRpbmcgPSBmYWxzZTtcbiAgICAgIHRyaWdnZXJFdmVudChFVkVOVF9TTElEKTtcbiAgICB9O1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGVDYWxsQmFjaywgYWN0aXZlRWxlbWVudCwgdGhpcy5faXNBbmltYXRlZCgpKTtcbiAgICBpZiAoaXNDeWNsaW5nKSB7XG4gICAgICB0aGlzLmN5Y2xlKCk7XG4gICAgfVxuICB9XG4gIF9pc0FuaW1hdGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NMSURFKTtcbiAgfVxuICBfZ2V0QWN0aXZlKCkge1xuICAgIHJldHVybiBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX0FDVElWRV9JVEVNLCB0aGlzLl9lbGVtZW50KTtcbiAgfVxuICBfZ2V0SXRlbXMoKSB7XG4gICAgcmV0dXJuIFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfSVRFTSwgdGhpcy5fZWxlbWVudCk7XG4gIH1cbiAgX2NsZWFySW50ZXJ2YWwoKSB7XG4gICAgaWYgKHRoaXMuX2ludGVydmFsKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuX2ludGVydmFsKTtcbiAgICAgIHRoaXMuX2ludGVydmFsID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgX2RpcmVjdGlvblRvT3JkZXIoZGlyZWN0aW9uKSB7XG4gICAgaWYgKGlzUlRMKCkpIHtcbiAgICAgIHJldHVybiBkaXJlY3Rpb24gPT09IERJUkVDVElPTl9MRUZUID8gT1JERVJfUFJFViA6IE9SREVSX05FWFQ7XG4gICAgfVxuICAgIHJldHVybiBkaXJlY3Rpb24gPT09IERJUkVDVElPTl9MRUZUID8gT1JERVJfTkVYVCA6IE9SREVSX1BSRVY7XG4gIH1cbiAgX29yZGVyVG9EaXJlY3Rpb24ob3JkZXIpIHtcbiAgICBpZiAoaXNSVEwoKSkge1xuICAgICAgcmV0dXJuIG9yZGVyID09PSBPUkRFUl9QUkVWID8gRElSRUNUSU9OX0xFRlQgOiBESVJFQ1RJT05fUklHSFQ7XG4gICAgfVxuICAgIHJldHVybiBvcmRlciA9PT0gT1JERVJfUFJFViA/IERJUkVDVElPTl9SSUdIVCA6IERJUkVDVElPTl9MRUZUO1xuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gQ2Fyb3VzZWwuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGRhdGEudG8oY29uZmlnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYCk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YVtjb25maWddKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEkkNSwgU0VMRUNUT1JfREFUQV9TTElERSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGNvbnN0IHRhcmdldCA9IFNlbGVjdG9yRW5naW5lLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IodGhpcyk7XG4gIGlmICghdGFyZ2V0IHx8ICF0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfQ0FST1VTRUwpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIGNvbnN0IGNhcm91c2VsID0gQ2Fyb3VzZWwuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0YXJnZXQpO1xuICBjb25zdCBzbGlkZUluZGV4ID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtc2xpZGUtdG8nKTtcbiAgaWYgKHNsaWRlSW5kZXgpIHtcbiAgICBjYXJvdXNlbC50byhzbGlkZUluZGV4KTtcbiAgICBjYXJvdXNlbC5fbWF5YmVFbmFibGVDeWNsZSgpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoTWFuaXB1bGF0b3IuZ2V0RGF0YUF0dHJpYnV0ZSh0aGlzLCAnc2xpZGUnKSA9PT0gJ25leHQnKSB7XG4gICAgY2Fyb3VzZWwubmV4dCgpO1xuICAgIGNhcm91c2VsLl9tYXliZUVuYWJsZUN5Y2xlKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNhcm91c2VsLnByZXYoKTtcbiAgY2Fyb3VzZWwuX21heWJlRW5hYmxlQ3ljbGUoKTtcbn0pO1xuRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfTE9BRF9EQVRBX0FQSSQzLCAoKSA9PiB7XG4gIGNvbnN0IGNhcm91c2VscyA9IFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfREFUQV9SSURFKTtcbiAgZm9yIChjb25zdCBjYXJvdXNlbCBvZiBjYXJvdXNlbHMpIHtcbiAgICBDYXJvdXNlbC5nZXRPckNyZWF0ZUluc3RhbmNlKGNhcm91c2VsKTtcbiAgfVxufSk7XG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKENhcm91c2VsKTtcblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGNvbGxhcHNlLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUkYiA9ICdjb2xsYXBzZSc7XG5jb25zdCBEQVRBX0tFWSQ3ID0gJ2JzLmNvbGxhcHNlJztcbmNvbnN0IEVWRU5UX0tFWSQ3ID0gYC4ke0RBVEFfS0VZJDd9YDtcbmNvbnN0IERBVEFfQVBJX0tFWSQ0ID0gJy5kYXRhLWFwaSc7XG5jb25zdCBFVkVOVF9TSE9XJDYgPSBgc2hvdyR7RVZFTlRfS0VZJDd9YDtcbmNvbnN0IEVWRU5UX1NIT1dOJDYgPSBgc2hvd24ke0VWRU5UX0tFWSQ3fWA7XG5jb25zdCBFVkVOVF9ISURFJDYgPSBgaGlkZSR7RVZFTlRfS0VZJDd9YDtcbmNvbnN0IEVWRU5UX0hJRERFTiQ2ID0gYGhpZGRlbiR7RVZFTlRfS0VZJDd9YDtcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJJDQgPSBgY2xpY2ske0VWRU5UX0tFWSQ3fSR7REFUQV9BUElfS0VZJDR9YDtcbmNvbnN0IENMQVNTX05BTUVfU0hPVyQ3ID0gJ3Nob3cnO1xuY29uc3QgQ0xBU1NfTkFNRV9DT0xMQVBTRSA9ICdjb2xsYXBzZSc7XG5jb25zdCBDTEFTU19OQU1FX0NPTExBUFNJTkcgPSAnY29sbGFwc2luZyc7XG5jb25zdCBDTEFTU19OQU1FX0NPTExBUFNFRCA9ICdjb2xsYXBzZWQnO1xuY29uc3QgQ0xBU1NfTkFNRV9ERUVQRVJfQ0hJTERSRU4gPSBgOnNjb3BlIC4ke0NMQVNTX05BTUVfQ09MTEFQU0V9IC4ke0NMQVNTX05BTUVfQ09MTEFQU0V9YDtcbmNvbnN0IENMQVNTX05BTUVfSE9SSVpPTlRBTCA9ICdjb2xsYXBzZS1ob3Jpem9udGFsJztcbmNvbnN0IFdJRFRIID0gJ3dpZHRoJztcbmNvbnN0IEhFSUdIVCA9ICdoZWlnaHQnO1xuY29uc3QgU0VMRUNUT1JfQUNUSVZFUyA9ICcuY29sbGFwc2Uuc2hvdywgLmNvbGxhcHNlLmNvbGxhcHNpbmcnO1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUkNCA9ICdbZGF0YS1icy10b2dnbGU9XCJjb2xsYXBzZVwiXSc7XG5jb25zdCBEZWZhdWx0JGEgPSB7XG4gIHBhcmVudDogbnVsbCxcbiAgdG9nZ2xlOiB0cnVlXG59O1xuY29uc3QgRGVmYXVsdFR5cGUkYSA9IHtcbiAgcGFyZW50OiAnKG51bGx8ZWxlbWVudCknLFxuICB0b2dnbGU6ICdib29sZWFuJ1xufTtcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgQ29sbGFwc2UgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKTtcbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICB0aGlzLl90cmlnZ2VyQXJyYXkgPSBbXTtcbiAgICBjb25zdCB0b2dnbGVMaXN0ID0gU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9EQVRBX1RPR0dMRSQ0KTtcbiAgICBmb3IgKGNvbnN0IGVsZW0gb2YgdG9nZ2xlTGlzdCkge1xuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBTZWxlY3RvckVuZ2luZS5nZXRTZWxlY3RvckZyb21FbGVtZW50KGVsZW0pO1xuICAgICAgY29uc3QgZmlsdGVyRWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmZpbmQoc2VsZWN0b3IpLmZpbHRlcihmb3VuZEVsZW1lbnQgPT4gZm91bmRFbGVtZW50ID09PSB0aGlzLl9lbGVtZW50KTtcbiAgICAgIGlmIChzZWxlY3RvciAhPT0gbnVsbCAmJiBmaWx0ZXJFbGVtZW50Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLl90cmlnZ2VyQXJyYXkucHVzaChlbGVtKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5faW5pdGlhbGl6ZUNoaWxkcmVuKCk7XG4gICAgaWYgKCF0aGlzLl9jb25maWcucGFyZW50KSB7XG4gICAgICB0aGlzLl9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3ModGhpcy5fdHJpZ2dlckFycmF5LCB0aGlzLl9pc1Nob3duKCkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY29uZmlnLnRvZ2dsZSkge1xuICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICB9XG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdCRhO1xuICB9XG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlJGE7XG4gIH1cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FJGI7XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgdG9nZ2xlKCkge1xuICAgIGlmICh0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNob3coKTtcbiAgICB9XG4gIH1cbiAgc2hvdygpIHtcbiAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uaW5nIHx8IHRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgYWN0aXZlQ2hpbGRyZW4gPSBbXTtcblxuICAgIC8vIGZpbmQgYWN0aXZlIGNoaWxkcmVuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5wYXJlbnQpIHtcbiAgICAgIGFjdGl2ZUNoaWxkcmVuID0gdGhpcy5fZ2V0Rmlyc3RMZXZlbENoaWxkcmVuKFNFTEVDVE9SX0FDVElWRVMpLmZpbHRlcihlbGVtZW50ID0+IGVsZW1lbnQgIT09IHRoaXMuX2VsZW1lbnQpLm1hcChlbGVtZW50ID0+IENvbGxhcHNlLmdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCwge1xuICAgICAgICB0b2dnbGU6IGZhbHNlXG4gICAgICB9KSk7XG4gICAgfVxuICAgIGlmIChhY3RpdmVDaGlsZHJlbi5sZW5ndGggJiYgYWN0aXZlQ2hpbGRyZW5bMF0uX2lzVHJhbnNpdGlvbmluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzdGFydEV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPVyQ2KTtcbiAgICBpZiAoc3RhcnRFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgYWN0aXZlSW5zdGFuY2Ugb2YgYWN0aXZlQ2hpbGRyZW4pIHtcbiAgICAgIGFjdGl2ZUluc3RhbmNlLmhpZGUoKTtcbiAgICB9XG4gICAgY29uc3QgZGltZW5zaW9uID0gdGhpcy5fZ2V0RGltZW5zaW9uKCk7XG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQ09MTEFQU0UpO1xuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0NPTExBUFNJTkcpO1xuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9IDA7XG4gICAgdGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRoaXMuX3RyaWdnZXJBcnJheSwgdHJ1ZSk7XG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQ09MTEFQU0lORyk7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9DT0xMQVBTRSwgQ0xBU1NfTkFNRV9TSE9XJDcpO1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gJyc7XG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XTiQ2KTtcbiAgICB9O1xuICAgIGNvbnN0IGNhcGl0YWxpemVkRGltZW5zaW9uID0gZGltZW5zaW9uWzBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoMSk7XG4gICAgY29uc3Qgc2Nyb2xsU2l6ZSA9IGBzY3JvbGwke2NhcGl0YWxpemVkRGltZW5zaW9ufWA7XG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgdGhpcy5fZWxlbWVudCwgdHJ1ZSk7XG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gYCR7dGhpcy5fZWxlbWVudFtzY3JvbGxTaXplXX1weGA7XG4gIH1cbiAgaGlkZSgpIHtcbiAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uaW5nIHx8ICF0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3RhcnRFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREUkNik7XG4gICAgaWYgKHN0YXJ0RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkaW1lbnNpb24gPSB0aGlzLl9nZXREaW1lbnNpb24oKTtcbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSBgJHt0aGlzLl9lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2RpbWVuc2lvbl19cHhgO1xuICAgIHJlZmxvdyh0aGlzLl9lbGVtZW50KTtcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9DT0xMQVBTSU5HKTtcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9DT0xMQVBTRSwgQ0xBU1NfTkFNRV9TSE9XJDcpO1xuICAgIGZvciAoY29uc3QgdHJpZ2dlciBvZiB0aGlzLl90cmlnZ2VyQXJyYXkpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKHRyaWdnZXIpO1xuICAgICAgaWYgKGVsZW1lbnQgJiYgIXRoaXMuX2lzU2hvd24oZWxlbWVudCkpIHtcbiAgICAgICAgdGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKFt0cmlnZ2VyXSwgZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSB0cnVlO1xuICAgIGNvbnN0IGNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9DT0xMQVBTSU5HKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0NPTExBUFNFKTtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJRERFTiQ2KTtcbiAgICB9O1xuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9ICcnO1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMuX2VsZW1lbnQsIHRydWUpO1xuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfaXNTaG93bihlbGVtZW50ID0gdGhpcy5fZWxlbWVudCkge1xuICAgIHJldHVybiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NIT1ckNyk7XG4gIH1cbiAgX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKSB7XG4gICAgY29uZmlnLnRvZ2dsZSA9IEJvb2xlYW4oY29uZmlnLnRvZ2dsZSk7IC8vIENvZXJjZSBzdHJpbmcgdmFsdWVzXG4gICAgY29uZmlnLnBhcmVudCA9IGdldEVsZW1lbnQoY29uZmlnLnBhcmVudCk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBfZ2V0RGltZW5zaW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0hPUklaT05UQUwpID8gV0lEVEggOiBIRUlHSFQ7XG4gIH1cbiAgX2luaXRpYWxpemVDaGlsZHJlbigpIHtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5wYXJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLl9nZXRGaXJzdExldmVsQ2hpbGRyZW4oU0VMRUNUT1JfREFUQV9UT0dHTEUkNCk7XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGNoaWxkcmVuKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZCA9IFNlbGVjdG9yRW5naW5lLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IoZWxlbWVudCk7XG4gICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgdGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKFtlbGVtZW50XSwgdGhpcy5faXNTaG93bihzZWxlY3RlZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBfZ2V0Rmlyc3RMZXZlbENoaWxkcmVuKHNlbGVjdG9yKSB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBTZWxlY3RvckVuZ2luZS5maW5kKENMQVNTX05BTUVfREVFUEVSX0NISUxEUkVOLCB0aGlzLl9jb25maWcucGFyZW50KTtcbiAgICAvLyByZW1vdmUgY2hpbGRyZW4gaWYgZ3JlYXRlciBkZXB0aFxuICAgIHJldHVybiBTZWxlY3RvckVuZ2luZS5maW5kKHNlbGVjdG9yLCB0aGlzLl9jb25maWcucGFyZW50KS5maWx0ZXIoZWxlbWVudCA9PiAhY2hpbGRyZW4uaW5jbHVkZXMoZWxlbWVudCkpO1xuICB9XG4gIF9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3ModHJpZ2dlckFycmF5LCBpc09wZW4pIHtcbiAgICBpZiAoIXRyaWdnZXJBcnJheS5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRyaWdnZXJBcnJheSkge1xuICAgICAgZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKENMQVNTX05BTUVfQ09MTEFQU0VELCAhaXNPcGVuKTtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgaXNPcGVuKTtcbiAgICB9XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICBjb25zdCBfY29uZmlnID0ge307XG4gICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnICYmIC9zaG93fGhpZGUvLnRlc3QoY29uZmlnKSkge1xuICAgICAgX2NvbmZpZy50b2dnbGUgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gQ29sbGFwc2UuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBfY29uZmlnKTtcbiAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgICB9XG4gICAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJJDQsIFNFTEVDVE9SX0RBVEFfVE9HR0xFJDQsIGZ1bmN0aW9uIChldmVudCkge1xuICAvLyBwcmV2ZW50RGVmYXVsdCBvbmx5IGZvciA8YT4gZWxlbWVudHMgKHdoaWNoIGNoYW5nZSB0aGUgVVJMKSBub3QgaW5zaWRlIHRoZSBjb2xsYXBzaWJsZSBlbGVtZW50XG4gIGlmIChldmVudC50YXJnZXQudGFnTmFtZSA9PT0gJ0EnIHx8IGV2ZW50LmRlbGVnYXRlVGFyZ2V0ICYmIGV2ZW50LmRlbGVnYXRlVGFyZ2V0LnRhZ05hbWUgPT09ICdBJykge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIFNlbGVjdG9yRW5naW5lLmdldE11bHRpcGxlRWxlbWVudHNGcm9tU2VsZWN0b3IodGhpcykpIHtcbiAgICBDb2xsYXBzZS5nZXRPckNyZWF0ZUluc3RhbmNlKGVsZW1lbnQsIHtcbiAgICAgIHRvZ2dsZTogZmFsc2VcbiAgICB9KS50b2dnbGUoKTtcbiAgfVxufSk7XG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKENvbGxhcHNlKTtcblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGRyb3Bkb3duLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUkYSA9ICdkcm9wZG93bic7XG5jb25zdCBEQVRBX0tFWSQ2ID0gJ2JzLmRyb3Bkb3duJztcbmNvbnN0IEVWRU5UX0tFWSQ2ID0gYC4ke0RBVEFfS0VZJDZ9YDtcbmNvbnN0IERBVEFfQVBJX0tFWSQzID0gJy5kYXRhLWFwaSc7XG5jb25zdCBFU0NBUEVfS0VZJDIgPSAnRXNjYXBlJztcbmNvbnN0IFRBQl9LRVkkMSA9ICdUYWInO1xuY29uc3QgQVJST1dfVVBfS0VZJDEgPSAnQXJyb3dVcCc7XG5jb25zdCBBUlJPV19ET1dOX0tFWSQxID0gJ0Fycm93RG93bic7XG5jb25zdCBSSUdIVF9NT1VTRV9CVVRUT04gPSAyOyAvLyBNb3VzZUV2ZW50LmJ1dHRvbiB2YWx1ZSBmb3IgdGhlIHNlY29uZGFyeSBidXR0b24sIHVzdWFsbHkgdGhlIHJpZ2h0IGJ1dHRvblxuXG5jb25zdCBFVkVOVF9ISURFJDUgPSBgaGlkZSR7RVZFTlRfS0VZJDZ9YDtcbmNvbnN0IEVWRU5UX0hJRERFTiQ1ID0gYGhpZGRlbiR7RVZFTlRfS0VZJDZ9YDtcbmNvbnN0IEVWRU5UX1NIT1ckNSA9IGBzaG93JHtFVkVOVF9LRVkkNn1gO1xuY29uc3QgRVZFTlRfU0hPV04kNSA9IGBzaG93biR7RVZFTlRfS0VZJDZ9YDtcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJJDMgPSBgY2xpY2ske0VWRU5UX0tFWSQ2fSR7REFUQV9BUElfS0VZJDN9YDtcbmNvbnN0IEVWRU5UX0tFWURPV05fREFUQV9BUEkgPSBga2V5ZG93biR7RVZFTlRfS0VZJDZ9JHtEQVRBX0FQSV9LRVkkM31gO1xuY29uc3QgRVZFTlRfS0VZVVBfREFUQV9BUEkgPSBga2V5dXAke0VWRU5UX0tFWSQ2fSR7REFUQV9BUElfS0VZJDN9YDtcbmNvbnN0IENMQVNTX05BTUVfU0hPVyQ2ID0gJ3Nob3cnO1xuY29uc3QgQ0xBU1NfTkFNRV9EUk9QVVAgPSAnZHJvcHVwJztcbmNvbnN0IENMQVNTX05BTUVfRFJPUEVORCA9ICdkcm9wZW5kJztcbmNvbnN0IENMQVNTX05BTUVfRFJPUFNUQVJUID0gJ2Ryb3BzdGFydCc7XG5jb25zdCBDTEFTU19OQU1FX0RST1BVUF9DRU5URVIgPSAnZHJvcHVwLWNlbnRlcic7XG5jb25zdCBDTEFTU19OQU1FX0RST1BET1dOX0NFTlRFUiA9ICdkcm9wZG93bi1jZW50ZXInO1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUkMyA9ICdbZGF0YS1icy10b2dnbGU9XCJkcm9wZG93blwiXTpub3QoLmRpc2FibGVkKTpub3QoOmRpc2FibGVkKSc7XG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRV9TSE9XTiA9IGAke1NFTEVDVE9SX0RBVEFfVE9HR0xFJDN9LiR7Q0xBU1NfTkFNRV9TSE9XJDZ9YDtcbmNvbnN0IFNFTEVDVE9SX01FTlUgPSAnLmRyb3Bkb3duLW1lbnUnO1xuY29uc3QgU0VMRUNUT1JfTkFWQkFSID0gJy5uYXZiYXInO1xuY29uc3QgU0VMRUNUT1JfTkFWQkFSX05BViA9ICcubmF2YmFyLW5hdic7XG5jb25zdCBTRUxFQ1RPUl9WSVNJQkxFX0lURU1TID0gJy5kcm9wZG93bi1tZW51IC5kcm9wZG93bi1pdGVtOm5vdCguZGlzYWJsZWQpOm5vdCg6ZGlzYWJsZWQpJztcbmNvbnN0IFBMQUNFTUVOVF9UT1AgPSBpc1JUTCgpID8gJ3RvcC1lbmQnIDogJ3RvcC1zdGFydCc7XG5jb25zdCBQTEFDRU1FTlRfVE9QRU5EID0gaXNSVEwoKSA/ICd0b3Atc3RhcnQnIDogJ3RvcC1lbmQnO1xuY29uc3QgUExBQ0VNRU5UX0JPVFRPTSA9IGlzUlRMKCkgPyAnYm90dG9tLWVuZCcgOiAnYm90dG9tLXN0YXJ0JztcbmNvbnN0IFBMQUNFTUVOVF9CT1RUT01FTkQgPSBpc1JUTCgpID8gJ2JvdHRvbS1zdGFydCcgOiAnYm90dG9tLWVuZCc7XG5jb25zdCBQTEFDRU1FTlRfUklHSFQgPSBpc1JUTCgpID8gJ2xlZnQtc3RhcnQnIDogJ3JpZ2h0LXN0YXJ0JztcbmNvbnN0IFBMQUNFTUVOVF9MRUZUID0gaXNSVEwoKSA/ICdyaWdodC1zdGFydCcgOiAnbGVmdC1zdGFydCc7XG5jb25zdCBQTEFDRU1FTlRfVE9QQ0VOVEVSID0gJ3RvcCc7XG5jb25zdCBQTEFDRU1FTlRfQk9UVE9NQ0VOVEVSID0gJ2JvdHRvbSc7XG5jb25zdCBEZWZhdWx0JDkgPSB7XG4gIGF1dG9DbG9zZTogdHJ1ZSxcbiAgYm91bmRhcnk6ICdjbGlwcGluZ1BhcmVudHMnLFxuICBkaXNwbGF5OiAnZHluYW1pYycsXG4gIG9mZnNldDogWzAsIDJdLFxuICBwb3BwZXJDb25maWc6IG51bGwsXG4gIHJlZmVyZW5jZTogJ3RvZ2dsZSdcbn07XG5jb25zdCBEZWZhdWx0VHlwZSQ5ID0ge1xuICBhdXRvQ2xvc2U6ICcoYm9vbGVhbnxzdHJpbmcpJyxcbiAgYm91bmRhcnk6ICcoc3RyaW5nfGVsZW1lbnQpJyxcbiAgZGlzcGxheTogJ3N0cmluZycsXG4gIG9mZnNldDogJyhhcnJheXxzdHJpbmd8ZnVuY3Rpb24pJyxcbiAgcG9wcGVyQ29uZmlnOiAnKG51bGx8b2JqZWN0fGZ1bmN0aW9uKScsXG4gIHJlZmVyZW5jZTogJyhzdHJpbmd8ZWxlbWVudHxvYmplY3QpJ1xufTtcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgRHJvcGRvd24gZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKTtcbiAgICB0aGlzLl9wb3BwZXIgPSBudWxsO1xuICAgIHRoaXMuX3BhcmVudCA9IHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZTsgLy8gZHJvcGRvd24gd3JhcHBlclxuICAgIC8vIFRPRE86IHY2IHJldmVydCAjMzcwMTEgJiBjaGFuZ2UgbWFya3VwIGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS9kb2NzLzUuMy9mb3Jtcy9pbnB1dC1ncm91cC9cbiAgICB0aGlzLl9tZW51ID0gU2VsZWN0b3JFbmdpbmUubmV4dCh0aGlzLl9lbGVtZW50LCBTRUxFQ1RPUl9NRU5VKVswXSB8fCBTZWxlY3RvckVuZ2luZS5wcmV2KHRoaXMuX2VsZW1lbnQsIFNFTEVDVE9SX01FTlUpWzBdIHx8IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfTUVOVSwgdGhpcy5fcGFyZW50KTtcbiAgICB0aGlzLl9pbk5hdmJhciA9IHRoaXMuX2RldGVjdE5hdmJhcigpO1xuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHQkOTtcbiAgfVxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZSQ5O1xuICB9XG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRSRhO1xuICB9XG5cbiAgLy8gUHVibGljXG4gIHRvZ2dsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNTaG93bigpID8gdGhpcy5oaWRlKCkgOiB0aGlzLnNob3coKTtcbiAgfVxuICBzaG93KCkge1xuICAgIGlmIChpc0Rpc2FibGVkKHRoaXMuX2VsZW1lbnQpIHx8IHRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0ge1xuICAgICAgcmVsYXRlZFRhcmdldDogdGhpcy5fZWxlbWVudFxuICAgIH07XG4gICAgY29uc3Qgc2hvd0V2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPVyQ1LCByZWxhdGVkVGFyZ2V0KTtcbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fY3JlYXRlUG9wcGVyKCk7XG5cbiAgICAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgYWRkIGV4dHJhXG4gICAgLy8gZW1wdHkgbW91c2VvdmVyIGxpc3RlbmVycyB0byB0aGUgYm9keSdzIGltbWVkaWF0ZSBjaGlsZHJlbjtcbiAgICAvLyBvbmx5IG5lZWRlZCBiZWNhdXNlIG9mIGJyb2tlbiBldmVudCBkZWxlZ2F0aW9uIG9uIGlPU1xuICAgIC8vIGh0dHBzOi8vd3d3LnF1aXJrc21vZGUub3JnL2Jsb2cvYXJjaGl2ZXMvMjAxNC8wMi9tb3VzZV9ldmVudF9idWIuaHRtbFxuICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgIXRoaXMuX3BhcmVudC5jbG9zZXN0KFNFTEVDVE9SX05BVkJBUl9OQVYpKSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgW10uY29uY2F0KC4uLmRvY3VtZW50LmJvZHkuY2hpbGRyZW4pKSB7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vbihlbGVtZW50LCAnbW91c2VvdmVyJywgbm9vcCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2VsZW1lbnQuZm9jdXMoKTtcbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIHRydWUpO1xuICAgIHRoaXMuX21lbnUuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1ckNik7XG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVyQ2KTtcbiAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XTiQ1LCByZWxhdGVkVGFyZ2V0KTtcbiAgfVxuICBoaWRlKCkge1xuICAgIGlmIChpc0Rpc2FibGVkKHRoaXMuX2VsZW1lbnQpIHx8ICF0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IHtcbiAgICAgIHJlbGF0ZWRUYXJnZXQ6IHRoaXMuX2VsZW1lbnRcbiAgICB9O1xuICAgIHRoaXMuX2NvbXBsZXRlSGlkZShyZWxhdGVkVGFyZ2V0KTtcbiAgfVxuICBkaXNwb3NlKCkge1xuICAgIGlmICh0aGlzLl9wb3BwZXIpIHtcbiAgICAgIHRoaXMuX3BvcHBlci5kZXN0cm95KCk7XG4gICAgfVxuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgfVxuICB1cGRhdGUoKSB7XG4gICAgdGhpcy5faW5OYXZiYXIgPSB0aGlzLl9kZXRlY3ROYXZiYXIoKTtcbiAgICBpZiAodGhpcy5fcG9wcGVyKSB7XG4gICAgICB0aGlzLl9wb3BwZXIudXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfY29tcGxldGVIaWRlKHJlbGF0ZWRUYXJnZXQpIHtcbiAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFJDUsIHJlbGF0ZWRUYXJnZXQpO1xuICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHRoaXMgaXMgYSB0b3VjaC1lbmFibGVkIGRldmljZSB3ZSByZW1vdmUgdGhlIGV4dHJhXG4gICAgLy8gZW1wdHkgbW91c2VvdmVyIGxpc3RlbmVycyB3ZSBhZGRlZCBmb3IgaU9TIHN1cHBvcnRcbiAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgW10uY29uY2F0KC4uLmRvY3VtZW50LmJvZHkuY2hpbGRyZW4pKSB7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vZmYoZWxlbWVudCwgJ21vdXNlb3ZlcicsIG5vb3ApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5fcG9wcGVyKSB7XG4gICAgICB0aGlzLl9wb3BwZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgICB0aGlzLl9tZW51LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XJDYpO1xuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1ckNik7XG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTtcbiAgICBNYW5pcHVsYXRvci5yZW1vdmVEYXRhQXR0cmlidXRlKHRoaXMuX21lbnUsICdwb3BwZXInKTtcbiAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURERU4kNSwgcmVsYXRlZFRhcmdldCk7XG4gIH1cbiAgX2dldENvbmZpZyhjb25maWcpIHtcbiAgICBjb25maWcgPSBzdXBlci5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgaWYgKHR5cGVvZiBjb25maWcucmVmZXJlbmNlID09PSAnb2JqZWN0JyAmJiAhaXNFbGVtZW50KGNvbmZpZy5yZWZlcmVuY2UpICYmIHR5cGVvZiBjb25maWcucmVmZXJlbmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gUG9wcGVyIHZpcnR1YWwgZWxlbWVudHMgcmVxdWlyZSBhIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBtZXRob2RcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7TkFNRSRhLnRvVXBwZXJDYXNlKCl9OiBPcHRpb24gXCJyZWZlcmVuY2VcIiBwcm92aWRlZCB0eXBlIFwib2JqZWN0XCIgd2l0aG91dCBhIHJlcXVpcmVkIFwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0XCIgbWV0aG9kLmApO1xuICAgIH1cbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG4gIF9jcmVhdGVQb3BwZXIoKSB7XG4gICAgaWYgKHR5cGVvZiBQb3BwZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCb290c3RyYXBcXCdzIGRyb3Bkb3ducyByZXF1aXJlIFBvcHBlciAoaHR0cHM6Ly9wb3BwZXIuanMub3JnL2RvY3MvdjIvKScpO1xuICAgIH1cbiAgICBsZXQgcmVmZXJlbmNlRWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG4gICAgaWYgKHRoaXMuX2NvbmZpZy5yZWZlcmVuY2UgPT09ICdwYXJlbnQnKSB7XG4gICAgICByZWZlcmVuY2VFbGVtZW50ID0gdGhpcy5fcGFyZW50O1xuICAgIH0gZWxzZSBpZiAoaXNFbGVtZW50KHRoaXMuX2NvbmZpZy5yZWZlcmVuY2UpKSB7XG4gICAgICByZWZlcmVuY2VFbGVtZW50ID0gZ2V0RWxlbWVudCh0aGlzLl9jb25maWcucmVmZXJlbmNlKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLl9jb25maWcucmVmZXJlbmNlID09PSAnb2JqZWN0Jykge1xuICAgICAgcmVmZXJlbmNlRWxlbWVudCA9IHRoaXMuX2NvbmZpZy5yZWZlcmVuY2U7XG4gICAgfVxuICAgIGNvbnN0IHBvcHBlckNvbmZpZyA9IHRoaXMuX2dldFBvcHBlckNvbmZpZygpO1xuICAgIHRoaXMuX3BvcHBlciA9IFBvcHBlci5jcmVhdGVQb3BwZXIocmVmZXJlbmNlRWxlbWVudCwgdGhpcy5fbWVudSwgcG9wcGVyQ29uZmlnKTtcbiAgfVxuICBfaXNTaG93bigpIHtcbiAgICByZXR1cm4gdGhpcy5fbWVudS5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TSE9XJDYpO1xuICB9XG4gIF9nZXRQbGFjZW1lbnQoKSB7XG4gICAgY29uc3QgcGFyZW50RHJvcGRvd24gPSB0aGlzLl9wYXJlbnQ7XG4gICAgaWYgKHBhcmVudERyb3Bkb3duLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0RST1BFTkQpKSB7XG4gICAgICByZXR1cm4gUExBQ0VNRU5UX1JJR0hUO1xuICAgIH1cbiAgICBpZiAocGFyZW50RHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRFJPUFNUQVJUKSkge1xuICAgICAgcmV0dXJuIFBMQUNFTUVOVF9MRUZUO1xuICAgIH1cbiAgICBpZiAocGFyZW50RHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRFJPUFVQX0NFTlRFUikpIHtcbiAgICAgIHJldHVybiBQTEFDRU1FTlRfVE9QQ0VOVEVSO1xuICAgIH1cbiAgICBpZiAocGFyZW50RHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRFJPUERPV05fQ0VOVEVSKSkge1xuICAgICAgcmV0dXJuIFBMQUNFTUVOVF9CT1RUT01DRU5URVI7XG4gICAgfVxuXG4gICAgLy8gV2UgbmVlZCB0byB0cmltIHRoZSB2YWx1ZSBiZWNhdXNlIGN1c3RvbSBwcm9wZXJ0aWVzIGNhbiBhbHNvIGluY2x1ZGUgc3BhY2VzXG4gICAgY29uc3QgaXNFbmQgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMuX21lbnUpLmdldFByb3BlcnR5VmFsdWUoJy0tYnMtcG9zaXRpb24nKS50cmltKCkgPT09ICdlbmQnO1xuICAgIGlmIChwYXJlbnREcm9wZG93bi5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9EUk9QVVApKSB7XG4gICAgICByZXR1cm4gaXNFbmQgPyBQTEFDRU1FTlRfVE9QRU5EIDogUExBQ0VNRU5UX1RPUDtcbiAgICB9XG4gICAgcmV0dXJuIGlzRW5kID8gUExBQ0VNRU5UX0JPVFRPTUVORCA6IFBMQUNFTUVOVF9CT1RUT007XG4gIH1cbiAgX2RldGVjdE5hdmJhcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5jbG9zZXN0KFNFTEVDVE9SX05BVkJBUikgIT09IG51bGw7XG4gIH1cbiAgX2dldE9mZnNldCgpIHtcbiAgICBjb25zdCB7XG4gICAgICBvZmZzZXRcbiAgICB9ID0gdGhpcy5fY29uZmlnO1xuICAgIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG9mZnNldC5zcGxpdCgnLCcpLm1hcCh2YWx1ZSA9PiBOdW1iZXIucGFyc2VJbnQodmFsdWUsIDEwKSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gcG9wcGVyRGF0YSA9PiBvZmZzZXQocG9wcGVyRGF0YSwgdGhpcy5fZWxlbWVudCk7XG4gICAgfVxuICAgIHJldHVybiBvZmZzZXQ7XG4gIH1cbiAgX2dldFBvcHBlckNvbmZpZygpIHtcbiAgICBjb25zdCBkZWZhdWx0QnNQb3BwZXJDb25maWcgPSB7XG4gICAgICBwbGFjZW1lbnQ6IHRoaXMuX2dldFBsYWNlbWVudCgpLFxuICAgICAgbW9kaWZpZXJzOiBbe1xuICAgICAgICBuYW1lOiAncHJldmVudE92ZXJmbG93JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGJvdW5kYXJ5OiB0aGlzLl9jb25maWcuYm91bmRhcnlcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBuYW1lOiAnb2Zmc2V0JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG9mZnNldDogdGhpcy5fZ2V0T2Zmc2V0KClcbiAgICAgICAgfVxuICAgICAgfV1cbiAgICB9O1xuXG4gICAgLy8gRGlzYWJsZSBQb3BwZXIgaWYgd2UgaGF2ZSBhIHN0YXRpYyBkaXNwbGF5IG9yIERyb3Bkb3duIGlzIGluIE5hdmJhclxuICAgIGlmICh0aGlzLl9pbk5hdmJhciB8fCB0aGlzLl9jb25maWcuZGlzcGxheSA9PT0gJ3N0YXRpYycpIHtcbiAgICAgIE1hbmlwdWxhdG9yLnNldERhdGFBdHRyaWJ1dGUodGhpcy5fbWVudSwgJ3BvcHBlcicsICdzdGF0aWMnKTsgLy8gVE9ETzogdjYgcmVtb3ZlXG4gICAgICBkZWZhdWx0QnNQb3BwZXJDb25maWcubW9kaWZpZXJzID0gW3tcbiAgICAgICAgbmFtZTogJ2FwcGx5U3R5bGVzJyxcbiAgICAgICAgZW5hYmxlZDogZmFsc2VcbiAgICAgIH1dO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmYXVsdEJzUG9wcGVyQ29uZmlnLFxuICAgICAgLi4uZXhlY3V0ZSh0aGlzLl9jb25maWcucG9wcGVyQ29uZmlnLCBbdW5kZWZpbmVkLCBkZWZhdWx0QnNQb3BwZXJDb25maWddKVxuICAgIH07XG4gIH1cbiAgX3NlbGVjdE1lbnVJdGVtKHtcbiAgICBrZXksXG4gICAgdGFyZ2V0XG4gIH0pIHtcbiAgICBjb25zdCBpdGVtcyA9IFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfVklTSUJMRV9JVEVNUywgdGhpcy5fbWVudSkuZmlsdGVyKGVsZW1lbnQgPT4gaXNWaXNpYmxlKGVsZW1lbnQpKTtcbiAgICBpZiAoIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGlmIHRhcmdldCBpc24ndCBpbmNsdWRlZCBpbiBpdGVtcyAoZS5nLiB3aGVuIGV4cGFuZGluZyB0aGUgZHJvcGRvd24pXG4gICAgLy8gYWxsb3cgY3ljbGluZyB0byBnZXQgdGhlIGxhc3QgaXRlbSBpbiBjYXNlIGtleSBlcXVhbHMgQVJST1dfVVBfS0VZXG4gICAgZ2V0TmV4dEFjdGl2ZUVsZW1lbnQoaXRlbXMsIHRhcmdldCwga2V5ID09PSBBUlJPV19ET1dOX0tFWSQxLCAhaXRlbXMuaW5jbHVkZXModGFyZ2V0KSkuZm9jdXMoKTtcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IERyb3Bkb3duLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKTtcbiAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKTtcbiAgICAgIH1cbiAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgIH0pO1xuICB9XG4gIHN0YXRpYyBjbGVhck1lbnVzKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gUklHSFRfTU9VU0VfQlVUVE9OIHx8IGV2ZW50LnR5cGUgPT09ICdrZXl1cCcgJiYgZXZlbnQua2V5ICE9PSBUQUJfS0VZJDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3BlblRvZ2dsZXMgPSBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfVE9HR0xFX1NIT1dOKTtcbiAgICBmb3IgKGNvbnN0IHRvZ2dsZSBvZiBvcGVuVG9nZ2xlcykge1xuICAgICAgY29uc3QgY29udGV4dCA9IERyb3Bkb3duLmdldEluc3RhbmNlKHRvZ2dsZSk7XG4gICAgICBpZiAoIWNvbnRleHQgfHwgY29udGV4dC5fY29uZmlnLmF1dG9DbG9zZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBjb21wb3NlZFBhdGggPSBldmVudC5jb21wb3NlZFBhdGgoKTtcbiAgICAgIGNvbnN0IGlzTWVudVRhcmdldCA9IGNvbXBvc2VkUGF0aC5pbmNsdWRlcyhjb250ZXh0Ll9tZW51KTtcbiAgICAgIGlmIChjb21wb3NlZFBhdGguaW5jbHVkZXMoY29udGV4dC5fZWxlbWVudCkgfHwgY29udGV4dC5fY29uZmlnLmF1dG9DbG9zZSA9PT0gJ2luc2lkZScgJiYgIWlzTWVudVRhcmdldCB8fCBjb250ZXh0Ll9jb25maWcuYXV0b0Nsb3NlID09PSAnb3V0c2lkZScgJiYgaXNNZW51VGFyZ2V0KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBUYWIgbmF2aWdhdGlvbiB0aHJvdWdoIHRoZSBkcm9wZG93biBtZW51IG9yIGV2ZW50cyBmcm9tIGNvbnRhaW5lZCBpbnB1dHMgc2hvdWxkbid0IGNsb3NlIHRoZSBtZW51XG4gICAgICBpZiAoY29udGV4dC5fbWVudS5jb250YWlucyhldmVudC50YXJnZXQpICYmIChldmVudC50eXBlID09PSAna2V5dXAnICYmIGV2ZW50LmtleSA9PT0gVEFCX0tFWSQxIHx8IC9pbnB1dHxzZWxlY3R8b3B0aW9ufHRleHRhcmVhfGZvcm0vaS50ZXN0KGV2ZW50LnRhcmdldC50YWdOYW1lKSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0ge1xuICAgICAgICByZWxhdGVkVGFyZ2V0OiBjb250ZXh0Ll9lbGVtZW50XG4gICAgICB9O1xuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdjbGljaycpIHtcbiAgICAgICAgcmVsYXRlZFRhcmdldC5jbGlja0V2ZW50ID0gZXZlbnQ7XG4gICAgICB9XG4gICAgICBjb250ZXh0Ll9jb21wbGV0ZUhpZGUocmVsYXRlZFRhcmdldCk7XG4gICAgfVxuICB9XG4gIHN0YXRpYyBkYXRhQXBpS2V5ZG93bkhhbmRsZXIoZXZlbnQpIHtcbiAgICAvLyBJZiBub3QgYW4gVVAgfCBET1dOIHwgRVNDQVBFIGtleSA9PiBub3QgYSBkcm9wZG93biBjb21tYW5kXG4gICAgLy8gSWYgaW5wdXQvdGV4dGFyZWEgJiYgaWYga2V5IGlzIG90aGVyIHRoYW4gRVNDQVBFID0+IG5vdCBhIGRyb3Bkb3duIGNvbW1hbmRcblxuICAgIGNvbnN0IGlzSW5wdXQgPSAvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGV2ZW50LnRhcmdldC50YWdOYW1lKTtcbiAgICBjb25zdCBpc0VzY2FwZUV2ZW50ID0gZXZlbnQua2V5ID09PSBFU0NBUEVfS0VZJDI7XG4gICAgY29uc3QgaXNVcE9yRG93bkV2ZW50ID0gW0FSUk9XX1VQX0tFWSQxLCBBUlJPV19ET1dOX0tFWSQxXS5pbmNsdWRlcyhldmVudC5rZXkpO1xuICAgIGlmICghaXNVcE9yRG93bkV2ZW50ICYmICFpc0VzY2FwZUV2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc0lucHV0ICYmICFpc0VzY2FwZUV2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAvLyBUT0RPOiB2NiByZXZlcnQgIzM3MDExICYgY2hhbmdlIG1hcmt1cCBodHRwczovL2dldGJvb3RzdHJhcC5jb20vZG9jcy81LjMvZm9ybXMvaW5wdXQtZ3JvdXAvXG4gICAgY29uc3QgZ2V0VG9nZ2xlQnV0dG9uID0gdGhpcy5tYXRjaGVzKFNFTEVDVE9SX0RBVEFfVE9HR0xFJDMpID8gdGhpcyA6IFNlbGVjdG9yRW5naW5lLnByZXYodGhpcywgU0VMRUNUT1JfREFUQV9UT0dHTEUkMylbMF0gfHwgU2VsZWN0b3JFbmdpbmUubmV4dCh0aGlzLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQzKVswXSB8fCBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX0RBVEFfVE9HR0xFJDMsIGV2ZW50LmRlbGVnYXRlVGFyZ2V0LnBhcmVudE5vZGUpO1xuICAgIGNvbnN0IGluc3RhbmNlID0gRHJvcGRvd24uZ2V0T3JDcmVhdGVJbnN0YW5jZShnZXRUb2dnbGVCdXR0b24pO1xuICAgIGlmIChpc1VwT3JEb3duRXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgaW5zdGFuY2Uuc2hvdygpO1xuICAgICAgaW5zdGFuY2UuX3NlbGVjdE1lbnVJdGVtKGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGluc3RhbmNlLl9pc1Nob3duKCkpIHtcbiAgICAgIC8vIGVsc2UgaXMgZXNjYXBlIGFuZCB3ZSBjaGVjayBpZiBpdCBpcyBzaG93blxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBpbnN0YW5jZS5oaWRlKCk7XG4gICAgICBnZXRUb2dnbGVCdXR0b24uZm9jdXMoKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfS0VZRE9XTl9EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUkMywgRHJvcGRvd24uZGF0YUFwaUtleWRvd25IYW5kbGVyKTtcbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfS0VZRE9XTl9EQVRBX0FQSSwgU0VMRUNUT1JfTUVOVSwgRHJvcGRvd24uZGF0YUFwaUtleWRvd25IYW5kbGVyKTtcbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEkkMywgRHJvcGRvd24uY2xlYXJNZW51cyk7XG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWVVQX0RBVEFfQVBJLCBEcm9wZG93bi5jbGVhck1lbnVzKTtcbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEkkMywgU0VMRUNUT1JfREFUQV9UT0dHTEUkMywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIERyb3Bkb3duLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcykudG9nZ2xlKCk7XG59KTtcblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oRHJvcGRvd24pO1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9iYWNrZHJvcC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJDkgPSAnYmFja2Ryb3AnO1xuY29uc3QgQ0xBU1NfTkFNRV9GQURFJDQgPSAnZmFkZSc7XG5jb25zdCBDTEFTU19OQU1FX1NIT1ckNSA9ICdzaG93JztcbmNvbnN0IEVWRU5UX01PVVNFRE9XTiA9IGBtb3VzZWRvd24uYnMuJHtOQU1FJDl9YDtcbmNvbnN0IERlZmF1bHQkOCA9IHtcbiAgY2xhc3NOYW1lOiAnbW9kYWwtYmFja2Ryb3AnLFxuICBjbGlja0NhbGxiYWNrOiBudWxsLFxuICBpc0FuaW1hdGVkOiBmYWxzZSxcbiAgaXNWaXNpYmxlOiB0cnVlLFxuICAvLyBpZiBmYWxzZSwgd2UgdXNlIHRoZSBiYWNrZHJvcCBoZWxwZXIgd2l0aG91dCBhZGRpbmcgYW55IGVsZW1lbnQgdG8gdGhlIGRvbVxuICByb290RWxlbWVudDogJ2JvZHknIC8vIGdpdmUgdGhlIGNob2ljZSB0byBwbGFjZSBiYWNrZHJvcCB1bmRlciBkaWZmZXJlbnQgZWxlbWVudHNcbn07XG5jb25zdCBEZWZhdWx0VHlwZSQ4ID0ge1xuICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICBjbGlja0NhbGxiYWNrOiAnKGZ1bmN0aW9ufG51bGwpJyxcbiAgaXNBbmltYXRlZDogJ2Jvb2xlYW4nLFxuICBpc1Zpc2libGU6ICdib29sZWFuJyxcbiAgcm9vdEVsZW1lbnQ6ICcoZWxlbWVudHxzdHJpbmcpJ1xufTtcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgQmFja2Ryb3AgZXh0ZW5kcyBDb25maWcge1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpO1xuICAgIHRoaXMuX2lzQXBwZW5kZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0JDg7XG4gIH1cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGUkODtcbiAgfVxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUUkOTtcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBzaG93KGNhbGxiYWNrKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcuaXNWaXNpYmxlKSB7XG4gICAgICBleGVjdXRlKGNhbGxiYWNrKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fYXBwZW5kKCk7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2dldEVsZW1lbnQoKTtcbiAgICBpZiAodGhpcy5fY29uZmlnLmlzQW5pbWF0ZWQpIHtcbiAgICAgIHJlZmxvdyhlbGVtZW50KTtcbiAgICB9XG4gICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVyQ1KTtcbiAgICB0aGlzLl9lbXVsYXRlQW5pbWF0aW9uKCgpID0+IHtcbiAgICAgIGV4ZWN1dGUoY2FsbGJhY2spO1xuICAgIH0pO1xuICB9XG4gIGhpZGUoY2FsbGJhY2spIHtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5pc1Zpc2libGUpIHtcbiAgICAgIGV4ZWN1dGUoY2FsbGJhY2spO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9nZXRFbGVtZW50KCkuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1ckNSk7XG4gICAgdGhpcy5fZW11bGF0ZUFuaW1hdGlvbigoKSA9PiB7XG4gICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgIGV4ZWN1dGUoY2FsbGJhY2spO1xuICAgIH0pO1xuICB9XG4gIGRpc3Bvc2UoKSB7XG4gICAgaWYgKCF0aGlzLl9pc0FwcGVuZGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudCwgRVZFTlRfTU9VU0VET1dOKTtcbiAgICB0aGlzLl9lbGVtZW50LnJlbW92ZSgpO1xuICAgIHRoaXMuX2lzQXBwZW5kZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2dldEVsZW1lbnQoKSB7XG4gICAgaWYgKCF0aGlzLl9lbGVtZW50KSB7XG4gICAgICBjb25zdCBiYWNrZHJvcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgYmFja2Ryb3AuY2xhc3NOYW1lID0gdGhpcy5fY29uZmlnLmNsYXNzTmFtZTtcbiAgICAgIGlmICh0aGlzLl9jb25maWcuaXNBbmltYXRlZCkge1xuICAgICAgICBiYWNrZHJvcC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfRkFERSQ0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBiYWNrZHJvcDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7XG4gIH1cbiAgX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKSB7XG4gICAgLy8gdXNlIGdldEVsZW1lbnQoKSB3aXRoIHRoZSBkZWZhdWx0IFwiYm9keVwiIHRvIGdldCBhIGZyZXNoIEVsZW1lbnQgb24gZWFjaCBpbnN0YW50aWF0aW9uXG4gICAgY29uZmlnLnJvb3RFbGVtZW50ID0gZ2V0RWxlbWVudChjb25maWcucm9vdEVsZW1lbnQpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbiAgX2FwcGVuZCgpIHtcbiAgICBpZiAodGhpcy5faXNBcHBlbmRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZ2V0RWxlbWVudCgpO1xuICAgIHRoaXMuX2NvbmZpZy5yb290RWxlbWVudC5hcHBlbmQoZWxlbWVudCk7XG4gICAgRXZlbnRIYW5kbGVyLm9uKGVsZW1lbnQsIEVWRU5UX01PVVNFRE9XTiwgKCkgPT4ge1xuICAgICAgZXhlY3V0ZSh0aGlzLl9jb25maWcuY2xpY2tDYWxsYmFjayk7XG4gICAgfSk7XG4gICAgdGhpcy5faXNBcHBlbmRlZCA9IHRydWU7XG4gIH1cbiAgX2VtdWxhdGVBbmltYXRpb24oY2FsbGJhY2spIHtcbiAgICBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uKGNhbGxiYWNrLCB0aGlzLl9nZXRFbGVtZW50KCksIHRoaXMuX2NvbmZpZy5pc0FuaW1hdGVkKTtcbiAgfVxufVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9mb2N1c3RyYXAuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSQ4ID0gJ2ZvY3VzdHJhcCc7XG5jb25zdCBEQVRBX0tFWSQ1ID0gJ2JzLmZvY3VzdHJhcCc7XG5jb25zdCBFVkVOVF9LRVkkNSA9IGAuJHtEQVRBX0tFWSQ1fWA7XG5jb25zdCBFVkVOVF9GT0NVU0lOJDIgPSBgZm9jdXNpbiR7RVZFTlRfS0VZJDV9YDtcbmNvbnN0IEVWRU5UX0tFWURPV05fVEFCID0gYGtleWRvd24udGFiJHtFVkVOVF9LRVkkNX1gO1xuY29uc3QgVEFCX0tFWSA9ICdUYWInO1xuY29uc3QgVEFCX05BVl9GT1JXQVJEID0gJ2ZvcndhcmQnO1xuY29uc3QgVEFCX05BVl9CQUNLV0FSRCA9ICdiYWNrd2FyZCc7XG5jb25zdCBEZWZhdWx0JDcgPSB7XG4gIGF1dG9mb2N1czogdHJ1ZSxcbiAgdHJhcEVsZW1lbnQ6IG51bGwgLy8gVGhlIGVsZW1lbnQgdG8gdHJhcCBmb2N1cyBpbnNpZGUgb2Zcbn07XG5jb25zdCBEZWZhdWx0VHlwZSQ3ID0ge1xuICBhdXRvZm9jdXM6ICdib29sZWFuJyxcbiAgdHJhcEVsZW1lbnQ6ICdlbGVtZW50J1xufTtcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgRm9jdXNUcmFwIGV4dGVuZHMgQ29uZmlnIHtcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKTtcbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuX2xhc3RUYWJOYXZEaXJlY3Rpb24gPSBudWxsO1xuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHQkNztcbiAgfVxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZSQ3O1xuICB9XG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRSQ4O1xuICB9XG5cbiAgLy8gUHVibGljXG4gIGFjdGl2YXRlKCkge1xuICAgIGlmICh0aGlzLl9pc0FjdGl2ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY29uZmlnLmF1dG9mb2N1cykge1xuICAgICAgdGhpcy5fY29uZmlnLnRyYXBFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICAgIEV2ZW50SGFuZGxlci5vZmYoZG9jdW1lbnQsIEVWRU5UX0tFWSQ1KTsgLy8gZ3VhcmQgYWdhaW5zdCBpbmZpbml0ZSBmb2N1cyBsb29wXG4gICAgRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9GT0NVU0lOJDIsIGV2ZW50ID0+IHRoaXMuX2hhbmRsZUZvY3VzaW4oZXZlbnQpKTtcbiAgICBFdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWURPV05fVEFCLCBldmVudCA9PiB0aGlzLl9oYW5kbGVLZXlkb3duKGV2ZW50KSk7XG4gICAgdGhpcy5faXNBY3RpdmUgPSB0cnVlO1xuICB9XG4gIGRlYWN0aXZhdGUoKSB7XG4gICAgaWYgKCF0aGlzLl9pc0FjdGl2ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuICAgIEV2ZW50SGFuZGxlci5vZmYoZG9jdW1lbnQsIEVWRU5UX0tFWSQ1KTtcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2hhbmRsZUZvY3VzaW4oZXZlbnQpIHtcbiAgICBjb25zdCB7XG4gICAgICB0cmFwRWxlbWVudFxuICAgIH0gPSB0aGlzLl9jb25maWc7XG4gICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gZG9jdW1lbnQgfHwgZXZlbnQudGFyZ2V0ID09PSB0cmFwRWxlbWVudCB8fCB0cmFwRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGVsZW1lbnRzID0gU2VsZWN0b3JFbmdpbmUuZm9jdXNhYmxlQ2hpbGRyZW4odHJhcEVsZW1lbnQpO1xuICAgIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRyYXBFbGVtZW50LmZvY3VzKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9sYXN0VGFiTmF2RGlyZWN0aW9uID09PSBUQUJfTkFWX0JBQ0tXQVJEKSB7XG4gICAgICBlbGVtZW50c1tlbGVtZW50cy5sZW5ndGggLSAxXS5mb2N1cygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50c1swXS5mb2N1cygpO1xuICAgIH1cbiAgfVxuICBfaGFuZGxlS2V5ZG93bihldmVudCkge1xuICAgIGlmIChldmVudC5rZXkgIT09IFRBQl9LRVkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fbGFzdFRhYk5hdkRpcmVjdGlvbiA9IGV2ZW50LnNoaWZ0S2V5ID8gVEFCX05BVl9CQUNLV0FSRCA6IFRBQl9OQVZfRk9SV0FSRDtcbiAgfVxufVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9zY3JvbGxCYXIuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgU0VMRUNUT1JfRklYRURfQ09OVEVOVCA9ICcuZml4ZWQtdG9wLCAuZml4ZWQtYm90dG9tLCAuaXMtZml4ZWQsIC5zdGlja3ktdG9wJztcbmNvbnN0IFNFTEVDVE9SX1NUSUNLWV9DT05URU5UID0gJy5zdGlja3ktdG9wJztcbmNvbnN0IFBST1BFUlRZX1BBRERJTkcgPSAncGFkZGluZy1yaWdodCc7XG5jb25zdCBQUk9QRVJUWV9NQVJHSU4gPSAnbWFyZ2luLXJpZ2h0JztcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgU2Nyb2xsQmFySGVscGVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fZWxlbWVudCA9IGRvY3VtZW50LmJvZHk7XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgZ2V0V2lkdGgoKSB7XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvdy9pbm5lcldpZHRoI3VzYWdlX25vdGVzXG4gICAgY29uc3QgZG9jdW1lbnRXaWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICByZXR1cm4gTWF0aC5hYnMod2luZG93LmlubmVyV2lkdGggLSBkb2N1bWVudFdpZHRoKTtcbiAgfVxuICBoaWRlKCkge1xuICAgIGNvbnN0IHdpZHRoID0gdGhpcy5nZXRXaWR0aCgpO1xuICAgIHRoaXMuX2Rpc2FibGVPdmVyRmxvdygpO1xuICAgIC8vIGdpdmUgcGFkZGluZyB0byBlbGVtZW50IHRvIGJhbGFuY2UgdGhlIGhpZGRlbiBzY3JvbGxiYXIgd2lkdGhcbiAgICB0aGlzLl9zZXRFbGVtZW50QXR0cmlidXRlcyh0aGlzLl9lbGVtZW50LCBQUk9QRVJUWV9QQURESU5HLCBjYWxjdWxhdGVkVmFsdWUgPT4gY2FsY3VsYXRlZFZhbHVlICsgd2lkdGgpO1xuICAgIC8vIHRyaWNrOiBXZSBhZGp1c3QgcG9zaXRpdmUgcGFkZGluZ1JpZ2h0IGFuZCBuZWdhdGl2ZSBtYXJnaW5SaWdodCB0byBzdGlja3ktdG9wIGVsZW1lbnRzIHRvIGtlZXAgc2hvd2luZyBmdWxsd2lkdGhcbiAgICB0aGlzLl9zZXRFbGVtZW50QXR0cmlidXRlcyhTRUxFQ1RPUl9GSVhFRF9DT05URU5ULCBQUk9QRVJUWV9QQURESU5HLCBjYWxjdWxhdGVkVmFsdWUgPT4gY2FsY3VsYXRlZFZhbHVlICsgd2lkdGgpO1xuICAgIHRoaXMuX3NldEVsZW1lbnRBdHRyaWJ1dGVzKFNFTEVDVE9SX1NUSUNLWV9DT05URU5ULCBQUk9QRVJUWV9NQVJHSU4sIGNhbGN1bGF0ZWRWYWx1ZSA9PiBjYWxjdWxhdGVkVmFsdWUgLSB3aWR0aCk7XG4gIH1cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5fcmVzZXRFbGVtZW50QXR0cmlidXRlcyh0aGlzLl9lbGVtZW50LCAnb3ZlcmZsb3cnKTtcbiAgICB0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQsIFBST1BFUlRZX1BBRERJTkcpO1xuICAgIHRoaXMuX3Jlc2V0RWxlbWVudEF0dHJpYnV0ZXMoU0VMRUNUT1JfRklYRURfQ09OVEVOVCwgUFJPUEVSVFlfUEFERElORyk7XG4gICAgdGhpcy5fcmVzZXRFbGVtZW50QXR0cmlidXRlcyhTRUxFQ1RPUl9TVElDS1lfQ09OVEVOVCwgUFJPUEVSVFlfTUFSR0lOKTtcbiAgfVxuICBpc092ZXJmbG93aW5nKCkge1xuICAgIHJldHVybiB0aGlzLmdldFdpZHRoKCkgPiAwO1xuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfZGlzYWJsZU92ZXJGbG93KCkge1xuICAgIHRoaXMuX3NhdmVJbml0aWFsQXR0cmlidXRlKHRoaXMuX2VsZW1lbnQsICdvdmVyZmxvdycpO1xuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgfVxuICBfc2V0RWxlbWVudEF0dHJpYnV0ZXMoc2VsZWN0b3IsIHN0eWxlUHJvcGVydHksIGNhbGxiYWNrKSB7XG4gICAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSB0aGlzLmdldFdpZHRoKCk7XG4gICAgY29uc3QgbWFuaXB1bGF0aW9uQ2FsbEJhY2sgPSBlbGVtZW50ID0+IHtcbiAgICAgIGlmIChlbGVtZW50ICE9PSB0aGlzLl9lbGVtZW50ICYmIHdpbmRvdy5pbm5lcldpZHRoID4gZWxlbWVudC5jbGllbnRXaWR0aCArIHNjcm9sbGJhcldpZHRoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3NhdmVJbml0aWFsQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHkpO1xuICAgICAgY29uc3QgY2FsY3VsYXRlZFZhbHVlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShzdHlsZVByb3BlcnR5KTtcbiAgICAgIGVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoc3R5bGVQcm9wZXJ0eSwgYCR7Y2FsbGJhY2soTnVtYmVyLnBhcnNlRmxvYXQoY2FsY3VsYXRlZFZhbHVlKSl9cHhgKTtcbiAgICB9O1xuICAgIHRoaXMuX2FwcGx5TWFuaXB1bGF0aW9uQ2FsbGJhY2soc2VsZWN0b3IsIG1hbmlwdWxhdGlvbkNhbGxCYWNrKTtcbiAgfVxuICBfc2F2ZUluaXRpYWxBdHRyaWJ1dGUoZWxlbWVudCwgc3R5bGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IGFjdHVhbFZhbHVlID0gZWxlbWVudC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKHN0eWxlUHJvcGVydHkpO1xuICAgIGlmIChhY3R1YWxWYWx1ZSkge1xuICAgICAgTWFuaXB1bGF0b3Iuc2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCBzdHlsZVByb3BlcnR5LCBhY3R1YWxWYWx1ZSk7XG4gICAgfVxuICB9XG4gIF9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKHNlbGVjdG9yLCBzdHlsZVByb3BlcnR5KSB7XG4gICAgY29uc3QgbWFuaXB1bGF0aW9uQ2FsbEJhY2sgPSBlbGVtZW50ID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gTWFuaXB1bGF0b3IuZ2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCBzdHlsZVByb3BlcnR5KTtcbiAgICAgIC8vIFdlIG9ubHkgd2FudCB0byByZW1vdmUgdGhlIHByb3BlcnR5IGlmIHRoZSB2YWx1ZSBpcyBgbnVsbGA7IHRoZSB2YWx1ZSBjYW4gYWxzbyBiZSB6ZXJvXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eShzdHlsZVByb3BlcnR5KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgTWFuaXB1bGF0b3IucmVtb3ZlRGF0YUF0dHJpYnV0ZShlbGVtZW50LCBzdHlsZVByb3BlcnR5KTtcbiAgICAgIGVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoc3R5bGVQcm9wZXJ0eSwgdmFsdWUpO1xuICAgIH07XG4gICAgdGhpcy5fYXBwbHlNYW5pcHVsYXRpb25DYWxsYmFjayhzZWxlY3RvciwgbWFuaXB1bGF0aW9uQ2FsbEJhY2spO1xuICB9XG4gIF9hcHBseU1hbmlwdWxhdGlvbkNhbGxiYWNrKHNlbGVjdG9yLCBjYWxsQmFjaykge1xuICAgIGlmIChpc0VsZW1lbnQoc2VsZWN0b3IpKSB7XG4gICAgICBjYWxsQmFjayhzZWxlY3Rvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc2VsIG9mIFNlbGVjdG9yRW5naW5lLmZpbmQoc2VsZWN0b3IsIHRoaXMuX2VsZW1lbnQpKSB7XG4gICAgICBjYWxsQmFjayhzZWwpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgbW9kYWwuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSQ3ID0gJ21vZGFsJztcbmNvbnN0IERBVEFfS0VZJDQgPSAnYnMubW9kYWwnO1xuY29uc3QgRVZFTlRfS0VZJDQgPSBgLiR7REFUQV9LRVkkNH1gO1xuY29uc3QgREFUQV9BUElfS0VZJDIgPSAnLmRhdGEtYXBpJztcbmNvbnN0IEVTQ0FQRV9LRVkkMSA9ICdFc2NhcGUnO1xuY29uc3QgRVZFTlRfSElERSQ0ID0gYGhpZGUke0VWRU5UX0tFWSQ0fWA7XG5jb25zdCBFVkVOVF9ISURFX1BSRVZFTlRFRCQxID0gYGhpZGVQcmV2ZW50ZWQke0VWRU5UX0tFWSQ0fWA7XG5jb25zdCBFVkVOVF9ISURERU4kNCA9IGBoaWRkZW4ke0VWRU5UX0tFWSQ0fWA7XG5jb25zdCBFVkVOVF9TSE9XJDQgPSBgc2hvdyR7RVZFTlRfS0VZJDR9YDtcbmNvbnN0IEVWRU5UX1NIT1dOJDQgPSBgc2hvd24ke0VWRU5UX0tFWSQ0fWA7XG5jb25zdCBFVkVOVF9SRVNJWkUkMSA9IGByZXNpemUke0VWRU5UX0tFWSQ0fWA7XG5jb25zdCBFVkVOVF9DTElDS19ESVNNSVNTID0gYGNsaWNrLmRpc21pc3Mke0VWRU5UX0tFWSQ0fWA7XG5jb25zdCBFVkVOVF9NT1VTRURPV05fRElTTUlTUyA9IGBtb3VzZWRvd24uZGlzbWlzcyR7RVZFTlRfS0VZJDR9YDtcbmNvbnN0IEVWRU5UX0tFWURPV05fRElTTUlTUyQxID0gYGtleWRvd24uZGlzbWlzcyR7RVZFTlRfS0VZJDR9YDtcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJJDIgPSBgY2xpY2ske0VWRU5UX0tFWSQ0fSR7REFUQV9BUElfS0VZJDJ9YDtcbmNvbnN0IENMQVNTX05BTUVfT1BFTiA9ICdtb2RhbC1vcGVuJztcbmNvbnN0IENMQVNTX05BTUVfRkFERSQzID0gJ2ZhZGUnO1xuY29uc3QgQ0xBU1NfTkFNRV9TSE9XJDQgPSAnc2hvdyc7XG5jb25zdCBDTEFTU19OQU1FX1NUQVRJQyA9ICdtb2RhbC1zdGF0aWMnO1xuY29uc3QgT1BFTl9TRUxFQ1RPUiQxID0gJy5tb2RhbC5zaG93JztcbmNvbnN0IFNFTEVDVE9SX0RJQUxPRyA9ICcubW9kYWwtZGlhbG9nJztcbmNvbnN0IFNFTEVDVE9SX01PREFMX0JPRFkgPSAnLm1vZGFsLWJvZHknO1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUkMiA9ICdbZGF0YS1icy10b2dnbGU9XCJtb2RhbFwiXSc7XG5jb25zdCBEZWZhdWx0JDYgPSB7XG4gIGJhY2tkcm9wOiB0cnVlLFxuICBmb2N1czogdHJ1ZSxcbiAga2V5Ym9hcmQ6IHRydWVcbn07XG5jb25zdCBEZWZhdWx0VHlwZSQ2ID0ge1xuICBiYWNrZHJvcDogJyhib29sZWFufHN0cmluZyknLFxuICBmb2N1czogJ2Jvb2xlYW4nLFxuICBrZXlib2FyZDogJ2Jvb2xlYW4nXG59O1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBNb2RhbCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpO1xuICAgIHRoaXMuX2RpYWxvZyA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfRElBTE9HLCB0aGlzLl9lbGVtZW50KTtcbiAgICB0aGlzLl9iYWNrZHJvcCA9IHRoaXMuX2luaXRpYWxpemVCYWNrRHJvcCgpO1xuICAgIHRoaXMuX2ZvY3VzdHJhcCA9IHRoaXMuX2luaXRpYWxpemVGb2N1c1RyYXAoKTtcbiAgICB0aGlzLl9pc1Nob3duID0gZmFsc2U7XG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICAgdGhpcy5fc2Nyb2xsQmFyID0gbmV3IFNjcm9sbEJhckhlbHBlcigpO1xuICAgIHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKCk7XG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdCQ2O1xuICB9XG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlJDY7XG4gIH1cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FJDc7XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgdG9nZ2xlKHJlbGF0ZWRUYXJnZXQpIHtcbiAgICByZXR1cm4gdGhpcy5faXNTaG93biA/IHRoaXMuaGlkZSgpIDogdGhpcy5zaG93KHJlbGF0ZWRUYXJnZXQpO1xuICB9XG4gIHNob3cocmVsYXRlZFRhcmdldCkge1xuICAgIGlmICh0aGlzLl9pc1Nob3duIHx8IHRoaXMuX2lzVHJhbnNpdGlvbmluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XJDQsIHtcbiAgICAgIHJlbGF0ZWRUYXJnZXRcbiAgICB9KTtcbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5faXNTaG93biA9IHRydWU7XG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZTtcbiAgICB0aGlzLl9zY3JvbGxCYXIuaGlkZSgpO1xuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX09QRU4pO1xuICAgIHRoaXMuX2FkanVzdERpYWxvZygpO1xuICAgIHRoaXMuX2JhY2tkcm9wLnNob3coKCkgPT4gdGhpcy5fc2hvd0VsZW1lbnQocmVsYXRlZFRhcmdldCkpO1xuICB9XG4gIGhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLl9pc1Nob3duIHx8IHRoaXMuX2lzVHJhbnNpdGlvbmluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFJDQpO1xuICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9pc1Nob3duID0gZmFsc2U7XG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZTtcbiAgICB0aGlzLl9mb2N1c3RyYXAuZGVhY3RpdmF0ZSgpO1xuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1ckNCk7XG4gICAgdGhpcy5fcXVldWVDYWxsYmFjaygoKSA9PiB0aGlzLl9oaWRlTW9kYWwoKSwgdGhpcy5fZWxlbWVudCwgdGhpcy5faXNBbmltYXRlZCgpKTtcbiAgfVxuICBkaXNwb3NlKCkge1xuICAgIEV2ZW50SGFuZGxlci5vZmYod2luZG93LCBFVkVOVF9LRVkkNCk7XG4gICAgRXZlbnRIYW5kbGVyLm9mZih0aGlzLl9kaWFsb2csIEVWRU5UX0tFWSQ0KTtcbiAgICB0aGlzLl9iYWNrZHJvcC5kaXNwb3NlKCk7XG4gICAgdGhpcy5fZm9jdXN0cmFwLmRlYWN0aXZhdGUoKTtcbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cbiAgaGFuZGxlVXBkYXRlKCkge1xuICAgIHRoaXMuX2FkanVzdERpYWxvZygpO1xuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfaW5pdGlhbGl6ZUJhY2tEcm9wKCkge1xuICAgIHJldHVybiBuZXcgQmFja2Ryb3Aoe1xuICAgICAgaXNWaXNpYmxlOiBCb29sZWFuKHRoaXMuX2NvbmZpZy5iYWNrZHJvcCksXG4gICAgICAvLyAnc3RhdGljJyBvcHRpb24gd2lsbCBiZSB0cmFuc2xhdGVkIHRvIHRydWUsIGFuZCBib29sZWFucyB3aWxsIGtlZXAgdGhlaXIgdmFsdWUsXG4gICAgICBpc0FuaW1hdGVkOiB0aGlzLl9pc0FuaW1hdGVkKClcbiAgICB9KTtcbiAgfVxuICBfaW5pdGlhbGl6ZUZvY3VzVHJhcCgpIHtcbiAgICByZXR1cm4gbmV3IEZvY3VzVHJhcCh7XG4gICAgICB0cmFwRWxlbWVudDogdGhpcy5fZWxlbWVudFxuICAgIH0pO1xuICB9XG4gIF9zaG93RWxlbWVudChyZWxhdGVkVGFyZ2V0KSB7XG4gICAgLy8gdHJ5IHRvIGFwcGVuZCBkeW5hbWljIG1vZGFsXG4gICAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKHRoaXMuX2VsZW1lbnQpKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZCh0aGlzLl9lbGVtZW50KTtcbiAgICB9XG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nKTtcbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1tb2RhbCcsIHRydWUpO1xuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2RpYWxvZycpO1xuICAgIHRoaXMuX2VsZW1lbnQuc2Nyb2xsVG9wID0gMDtcbiAgICBjb25zdCBtb2RhbEJvZHkgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX01PREFMX0JPRFksIHRoaXMuX2RpYWxvZyk7XG4gICAgaWYgKG1vZGFsQm9keSkge1xuICAgICAgbW9kYWxCb2R5LnNjcm9sbFRvcCA9IDA7XG4gICAgfVxuICAgIHJlZmxvdyh0aGlzLl9lbGVtZW50KTtcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XJDQpO1xuICAgIGNvbnN0IHRyYW5zaXRpb25Db21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9jb25maWcuZm9jdXMpIHtcbiAgICAgICAgdGhpcy5fZm9jdXN0cmFwLmFjdGl2YXRlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1dOJDQsIHtcbiAgICAgICAgcmVsYXRlZFRhcmdldFxuICAgICAgfSk7XG4gICAgfTtcbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKHRyYW5zaXRpb25Db21wbGV0ZSwgdGhpcy5fZGlhbG9nLCB0aGlzLl9pc0FuaW1hdGVkKCkpO1xuICB9XG4gIF9hZGRFdmVudExpc3RlbmVycygpIHtcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZRE9XTl9ESVNNSVNTJDEsIGV2ZW50ID0+IHtcbiAgICAgIGlmIChldmVudC5rZXkgIT09IEVTQ0FQRV9LRVkkMSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fY29uZmlnLmtleWJvYXJkKSB7XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uKCk7XG4gICAgfSk7XG4gICAgRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfUkVTSVpFJDEsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9pc1Nob3duICYmICF0aGlzLl9pc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgICAgdGhpcy5fYWRqdXN0RGlhbG9nKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFRE9XTl9ESVNNSVNTLCBldmVudCA9PiB7XG4gICAgICAvLyBhIGJhZCB0cmljayB0byBzZWdyZWdhdGUgY2xpY2tzIHRoYXQgbWF5IHN0YXJ0IGluc2lkZSBkaWFsb2cgYnV0IGVuZCBvdXRzaWRlLCBhbmQgYXZvaWQgbGlzdGVuIHRvIHNjcm9sbGJhciBjbGlja3NcbiAgICAgIEV2ZW50SGFuZGxlci5vbmUodGhpcy5fZWxlbWVudCwgRVZFTlRfQ0xJQ0tfRElTTUlTUywgZXZlbnQyID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2VsZW1lbnQgIT09IGV2ZW50LnRhcmdldCB8fCB0aGlzLl9lbGVtZW50ICE9PSBldmVudDIudGFyZ2V0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jb25maWcuYmFja2Ryb3AgPT09ICdzdGF0aWMnKSB7XG4gICAgICAgICAgdGhpcy5fdHJpZ2dlckJhY2tkcm9wVHJhbnNpdGlvbigpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fY29uZmlnLmJhY2tkcm9wKSB7XG4gICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIF9oaWRlTW9kYWwoKSB7XG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsIHRydWUpO1xuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLW1vZGFsJyk7XG4gICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3JvbGUnKTtcbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9iYWNrZHJvcC5oaWRlKCgpID0+IHtcbiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX09QRU4pO1xuICAgICAgdGhpcy5fcmVzZXRBZGp1c3RtZW50cygpO1xuICAgICAgdGhpcy5fc2Nyb2xsQmFyLnJlc2V0KCk7XG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURERU4kNCk7XG4gICAgfSk7XG4gIH1cbiAgX2lzQW5pbWF0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRkFERSQzKTtcbiAgfVxuICBfdHJpZ2dlckJhY2tkcm9wVHJhbnNpdGlvbigpIHtcbiAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFX1BSRVZFTlRFRCQxKTtcbiAgICBpZiAoaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaXNNb2RhbE92ZXJmbG93aW5nID0gdGhpcy5fZWxlbWVudC5zY3JvbGxIZWlnaHQgPiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgIGNvbnN0IGluaXRpYWxPdmVyZmxvd1kgPSB0aGlzLl9lbGVtZW50LnN0eWxlLm92ZXJmbG93WTtcbiAgICAvLyByZXR1cm4gaWYgdGhlIGZvbGxvd2luZyBiYWNrZ3JvdW5kIHRyYW5zaXRpb24gaGFzbid0IHlldCBjb21wbGV0ZWRcbiAgICBpZiAoaW5pdGlhbE92ZXJmbG93WSA9PT0gJ2hpZGRlbicgfHwgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TVEFUSUMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghaXNNb2RhbE92ZXJmbG93aW5nKSB7XG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nO1xuICAgIH1cbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TVEFUSUMpO1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU1RBVElDKTtcbiAgICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9IGluaXRpYWxPdmVyZmxvd1k7XG4gICAgICB9LCB0aGlzLl9kaWFsb2cpO1xuICAgIH0sIHRoaXMuX2RpYWxvZyk7XG4gICAgdGhpcy5fZWxlbWVudC5mb2N1cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgdXNlZCB0byBoYW5kbGUgb3ZlcmZsb3dpbmcgbW9kYWxzXG4gICAqL1xuXG4gIF9hZGp1c3REaWFsb2coKSB7XG4gICAgY29uc3QgaXNNb2RhbE92ZXJmbG93aW5nID0gdGhpcy5fZWxlbWVudC5zY3JvbGxIZWlnaHQgPiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgIGNvbnN0IHNjcm9sbGJhcldpZHRoID0gdGhpcy5fc2Nyb2xsQmFyLmdldFdpZHRoKCk7XG4gICAgY29uc3QgaXNCb2R5T3ZlcmZsb3dpbmcgPSBzY3JvbGxiYXJXaWR0aCA+IDA7XG4gICAgaWYgKGlzQm9keU92ZXJmbG93aW5nICYmICFpc01vZGFsT3ZlcmZsb3dpbmcpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0gaXNSVEwoKSA/ICdwYWRkaW5nTGVmdCcgOiAncGFkZGluZ1JpZ2h0JztcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbcHJvcGVydHldID0gYCR7c2Nyb2xsYmFyV2lkdGh9cHhgO1xuICAgIH1cbiAgICBpZiAoIWlzQm9keU92ZXJmbG93aW5nICYmIGlzTW9kYWxPdmVyZmxvd2luZykge1xuICAgICAgY29uc3QgcHJvcGVydHkgPSBpc1JUTCgpID8gJ3BhZGRpbmdSaWdodCcgOiAncGFkZGluZ0xlZnQnO1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtwcm9wZXJ0eV0gPSBgJHtzY3JvbGxiYXJXaWR0aH1weGA7XG4gICAgfVxuICB9XG4gIF9yZXNldEFkanVzdG1lbnRzKCkge1xuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ0xlZnQgPSAnJztcbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnBhZGRpbmdSaWdodCA9ICcnO1xuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnLCByZWxhdGVkVGFyZ2V0KSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gTW9kYWwuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgfVxuICAgICAgZGF0YVtjb25maWddKHJlbGF0ZWRUYXJnZXQpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJJDIsIFNFTEVDVE9SX0RBVEFfVE9HR0xFJDIsIGZ1bmN0aW9uIChldmVudCkge1xuICBjb25zdCB0YXJnZXQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKHRoaXMpO1xuICBpZiAoWydBJywgJ0FSRUEnXS5pbmNsdWRlcyh0aGlzLnRhZ05hbWUpKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuICBFdmVudEhhbmRsZXIub25lKHRhcmdldCwgRVZFTlRfU0hPVyQ0LCBzaG93RXZlbnQgPT4ge1xuICAgIGlmIChzaG93RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgLy8gb25seSByZWdpc3RlciBmb2N1cyByZXN0b3JlciBpZiBtb2RhbCB3aWxsIGFjdHVhbGx5IGdldCBzaG93blxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBFdmVudEhhbmRsZXIub25lKHRhcmdldCwgRVZFTlRfSElEREVOJDQsICgpID0+IHtcbiAgICAgIGlmIChpc1Zpc2libGUodGhpcykpIHtcbiAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICAvLyBhdm9pZCBjb25mbGljdCB3aGVuIGNsaWNraW5nIG1vZGFsIHRvZ2dsZXIgd2hpbGUgYW5vdGhlciBvbmUgaXMgb3BlblxuICBjb25zdCBhbHJlYWR5T3BlbiA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoT1BFTl9TRUxFQ1RPUiQxKTtcbiAgaWYgKGFscmVhZHlPcGVuKSB7XG4gICAgTW9kYWwuZ2V0SW5zdGFuY2UoYWxyZWFkeU9wZW4pLmhpZGUoKTtcbiAgfVxuICBjb25zdCBkYXRhID0gTW9kYWwuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0YXJnZXQpO1xuICBkYXRhLnRvZ2dsZSh0aGlzKTtcbn0pO1xuZW5hYmxlRGlzbWlzc1RyaWdnZXIoTW9kYWwpO1xuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihNb2RhbCk7XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBvZmZjYW52YXMuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSQ2ID0gJ29mZmNhbnZhcyc7XG5jb25zdCBEQVRBX0tFWSQzID0gJ2JzLm9mZmNhbnZhcyc7XG5jb25zdCBFVkVOVF9LRVkkMyA9IGAuJHtEQVRBX0tFWSQzfWA7XG5jb25zdCBEQVRBX0FQSV9LRVkkMSA9ICcuZGF0YS1hcGknO1xuY29uc3QgRVZFTlRfTE9BRF9EQVRBX0FQSSQyID0gYGxvYWQke0VWRU5UX0tFWSQzfSR7REFUQV9BUElfS0VZJDF9YDtcbmNvbnN0IEVTQ0FQRV9LRVkgPSAnRXNjYXBlJztcbmNvbnN0IENMQVNTX05BTUVfU0hPVyQzID0gJ3Nob3cnO1xuY29uc3QgQ0xBU1NfTkFNRV9TSE9XSU5HJDEgPSAnc2hvd2luZyc7XG5jb25zdCBDTEFTU19OQU1FX0hJRElORyA9ICdoaWRpbmcnO1xuY29uc3QgQ0xBU1NfTkFNRV9CQUNLRFJPUCA9ICdvZmZjYW52YXMtYmFja2Ryb3AnO1xuY29uc3QgT1BFTl9TRUxFQ1RPUiA9ICcub2ZmY2FudmFzLnNob3cnO1xuY29uc3QgRVZFTlRfU0hPVyQzID0gYHNob3cke0VWRU5UX0tFWSQzfWA7XG5jb25zdCBFVkVOVF9TSE9XTiQzID0gYHNob3duJHtFVkVOVF9LRVkkM31gO1xuY29uc3QgRVZFTlRfSElERSQzID0gYGhpZGUke0VWRU5UX0tFWSQzfWA7XG5jb25zdCBFVkVOVF9ISURFX1BSRVZFTlRFRCA9IGBoaWRlUHJldmVudGVkJHtFVkVOVF9LRVkkM31gO1xuY29uc3QgRVZFTlRfSElEREVOJDMgPSBgaGlkZGVuJHtFVkVOVF9LRVkkM31gO1xuY29uc3QgRVZFTlRfUkVTSVpFID0gYHJlc2l6ZSR7RVZFTlRfS0VZJDN9YDtcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJJDEgPSBgY2xpY2ske0VWRU5UX0tFWSQzfSR7REFUQV9BUElfS0VZJDF9YDtcbmNvbnN0IEVWRU5UX0tFWURPV05fRElTTUlTUyA9IGBrZXlkb3duLmRpc21pc3Mke0VWRU5UX0tFWSQzfWA7XG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQxID0gJ1tkYXRhLWJzLXRvZ2dsZT1cIm9mZmNhbnZhc1wiXSc7XG5jb25zdCBEZWZhdWx0JDUgPSB7XG4gIGJhY2tkcm9wOiB0cnVlLFxuICBrZXlib2FyZDogdHJ1ZSxcbiAgc2Nyb2xsOiBmYWxzZVxufTtcbmNvbnN0IERlZmF1bHRUeXBlJDUgPSB7XG4gIGJhY2tkcm9wOiAnKGJvb2xlYW58c3RyaW5nKScsXG4gIGtleWJvYXJkOiAnYm9vbGVhbicsXG4gIHNjcm9sbDogJ2Jvb2xlYW4nXG59O1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBPZmZjYW52YXMgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKTtcbiAgICB0aGlzLl9pc1Nob3duID0gZmFsc2U7XG4gICAgdGhpcy5fYmFja2Ryb3AgPSB0aGlzLl9pbml0aWFsaXplQmFja0Ryb3AoKTtcbiAgICB0aGlzLl9mb2N1c3RyYXAgPSB0aGlzLl9pbml0aWFsaXplRm9jdXNUcmFwKCk7XG4gICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0JDU7XG4gIH1cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGUkNTtcbiAgfVxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUUkNjtcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICB0b2dnbGUocmVsYXRlZFRhcmdldCkge1xuICAgIHJldHVybiB0aGlzLl9pc1Nob3duID8gdGhpcy5oaWRlKCkgOiB0aGlzLnNob3cocmVsYXRlZFRhcmdldCk7XG4gIH1cbiAgc2hvdyhyZWxhdGVkVGFyZ2V0KSB7XG4gICAgaWYgKHRoaXMuX2lzU2hvd24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2hvd0V2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPVyQzLCB7XG4gICAgICByZWxhdGVkVGFyZ2V0XG4gICAgfSk7XG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2lzU2hvd24gPSB0cnVlO1xuICAgIHRoaXMuX2JhY2tkcm9wLnNob3coKTtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5zY3JvbGwpIHtcbiAgICAgIG5ldyBTY3JvbGxCYXJIZWxwZXIoKS5oaWRlKCk7XG4gICAgfVxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLW1vZGFsJywgdHJ1ZSk7XG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnZGlhbG9nJyk7XG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPV0lORyQxKTtcbiAgICBjb25zdCBjb21wbGV0ZUNhbGxCYWNrID0gKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9jb25maWcuc2Nyb2xsIHx8IHRoaXMuX2NvbmZpZy5iYWNrZHJvcCkge1xuICAgICAgICB0aGlzLl9mb2N1c3RyYXAuYWN0aXZhdGUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1ckMyk7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XSU5HJDEpO1xuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPV04kMywge1xuICAgICAgICByZWxhdGVkVGFyZ2V0XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGVDYWxsQmFjaywgdGhpcy5fZWxlbWVudCwgdHJ1ZSk7XG4gIH1cbiAgaGlkZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzU2hvd24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERSQzKTtcbiAgICBpZiAoaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fZm9jdXN0cmFwLmRlYWN0aXZhdGUoKTtcbiAgICB0aGlzLl9lbGVtZW50LmJsdXIoKTtcbiAgICB0aGlzLl9pc1Nob3duID0gZmFsc2U7XG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfSElESU5HKTtcbiAgICB0aGlzLl9iYWNrZHJvcC5oaWRlKCk7XG4gICAgY29uc3QgY29tcGxldGVDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1ckMywgQ0xBU1NfTkFNRV9ISURJTkcpO1xuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdyb2xlJyk7XG4gICAgICBpZiAoIXRoaXMuX2NvbmZpZy5zY3JvbGwpIHtcbiAgICAgICAgbmV3IFNjcm9sbEJhckhlbHBlcigpLnJlc2V0KCk7XG4gICAgICB9XG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURERU4kMyk7XG4gICAgfTtcbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlQ2FsbGJhY2ssIHRoaXMuX2VsZW1lbnQsIHRydWUpO1xuICB9XG4gIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5fYmFja2Ryb3AuZGlzcG9zZSgpO1xuICAgIHRoaXMuX2ZvY3VzdHJhcC5kZWFjdGl2YXRlKCk7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfaW5pdGlhbGl6ZUJhY2tEcm9wKCkge1xuICAgIGNvbnN0IGNsaWNrQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fY29uZmlnLmJhY2tkcm9wID09PSAnc3RhdGljJykge1xuICAgICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFX1BSRVZFTlRFRCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgIH07XG5cbiAgICAvLyAnc3RhdGljJyBvcHRpb24gd2lsbCBiZSB0cmFuc2xhdGVkIHRvIHRydWUsIGFuZCBib29sZWFucyB3aWxsIGtlZXAgdGhlaXIgdmFsdWVcbiAgICBjb25zdCBpc1Zpc2libGUgPSBCb29sZWFuKHRoaXMuX2NvbmZpZy5iYWNrZHJvcCk7XG4gICAgcmV0dXJuIG5ldyBCYWNrZHJvcCh7XG4gICAgICBjbGFzc05hbWU6IENMQVNTX05BTUVfQkFDS0RST1AsXG4gICAgICBpc1Zpc2libGUsXG4gICAgICBpc0FuaW1hdGVkOiB0cnVlLFxuICAgICAgcm9vdEVsZW1lbnQ6IHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZSxcbiAgICAgIGNsaWNrQ2FsbGJhY2s6IGlzVmlzaWJsZSA/IGNsaWNrQ2FsbGJhY2sgOiBudWxsXG4gICAgfSk7XG4gIH1cbiAgX2luaXRpYWxpemVGb2N1c1RyYXAoKSB7XG4gICAgcmV0dXJuIG5ldyBGb2N1c1RyYXAoe1xuICAgICAgdHJhcEVsZW1lbnQ6IHRoaXMuX2VsZW1lbnRcbiAgICB9KTtcbiAgfVxuICBfYWRkRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0tFWURPV05fRElTTUlTUywgZXZlbnQgPT4ge1xuICAgICAgaWYgKGV2ZW50LmtleSAhPT0gRVNDQVBFX0tFWSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fY29uZmlnLmtleWJvYXJkKSB7XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFX1BSRVZFTlRFRCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBPZmZjYW52YXMuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgfVxuICAgICAgZGF0YVtjb25maWddKHRoaXMpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJJDEsIFNFTEVDVE9SX0RBVEFfVE9HR0xFJDEsIGZ1bmN0aW9uIChldmVudCkge1xuICBjb25zdCB0YXJnZXQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKHRoaXMpO1xuICBpZiAoWydBJywgJ0FSRUEnXS5pbmNsdWRlcyh0aGlzLnRhZ05hbWUpKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuICBpZiAoaXNEaXNhYmxlZCh0aGlzKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBFdmVudEhhbmRsZXIub25lKHRhcmdldCwgRVZFTlRfSElEREVOJDMsICgpID0+IHtcbiAgICAvLyBmb2N1cyBvbiB0cmlnZ2VyIHdoZW4gaXQgaXMgY2xvc2VkXG4gICAgaWYgKGlzVmlzaWJsZSh0aGlzKSkge1xuICAgICAgdGhpcy5mb2N1cygpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gYXZvaWQgY29uZmxpY3Qgd2hlbiBjbGlja2luZyBhIHRvZ2dsZXIgb2YgYW4gb2ZmY2FudmFzLCB3aGlsZSBhbm90aGVyIGlzIG9wZW5cbiAgY29uc3QgYWxyZWFkeU9wZW4gPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKE9QRU5fU0VMRUNUT1IpO1xuICBpZiAoYWxyZWFkeU9wZW4gJiYgYWxyZWFkeU9wZW4gIT09IHRhcmdldCkge1xuICAgIE9mZmNhbnZhcy5nZXRJbnN0YW5jZShhbHJlYWR5T3BlbikuaGlkZSgpO1xuICB9XG4gIGNvbnN0IGRhdGEgPSBPZmZjYW52YXMuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0YXJnZXQpO1xuICBkYXRhLnRvZ2dsZSh0aGlzKTtcbn0pO1xuRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfTE9BRF9EQVRBX0FQSSQyLCAoKSA9PiB7XG4gIGZvciAoY29uc3Qgc2VsZWN0b3Igb2YgU2VsZWN0b3JFbmdpbmUuZmluZChPUEVOX1NFTEVDVE9SKSkge1xuICAgIE9mZmNhbnZhcy5nZXRPckNyZWF0ZUluc3RhbmNlKHNlbGVjdG9yKS5zaG93KCk7XG4gIH1cbn0pO1xuRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfUkVTSVpFLCAoKSA9PiB7XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBTZWxlY3RvckVuZ2luZS5maW5kKCdbYXJpYS1tb2RhbF1bY2xhc3MqPXNob3ddW2NsYXNzKj1vZmZjYW52YXMtXScpKSB7XG4gICAgaWYgKGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24gIT09ICdmaXhlZCcpIHtcbiAgICAgIE9mZmNhbnZhcy5nZXRPckNyZWF0ZUluc3RhbmNlKGVsZW1lbnQpLmhpZGUoKTtcbiAgICB9XG4gIH1cbn0pO1xuZW5hYmxlRGlzbWlzc1RyaWdnZXIoT2ZmY2FudmFzKTtcblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oT2ZmY2FudmFzKTtcblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHV0aWwvc2FuaXRpemVyLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuLy8ganMtZG9jcy1zdGFydCBhbGxvdy1saXN0XG5jb25zdCBBUklBX0FUVFJJQlVURV9QQVRURVJOID0gL15hcmlhLVtcXHctXSokL2k7XG5jb25zdCBEZWZhdWx0QWxsb3dsaXN0ID0ge1xuICAvLyBHbG9iYWwgYXR0cmlidXRlcyBhbGxvd2VkIG9uIGFueSBzdXBwbGllZCBlbGVtZW50IGJlbG93LlxuICAnKic6IFsnY2xhc3MnLCAnZGlyJywgJ2lkJywgJ2xhbmcnLCAncm9sZScsIEFSSUFfQVRUUklCVVRFX1BBVFRFUk5dLFxuICBhOiBbJ3RhcmdldCcsICdocmVmJywgJ3RpdGxlJywgJ3JlbCddLFxuICBhcmVhOiBbXSxcbiAgYjogW10sXG4gIGJyOiBbXSxcbiAgY29sOiBbXSxcbiAgY29kZTogW10sXG4gIGRkOiBbXSxcbiAgZGl2OiBbXSxcbiAgZGw6IFtdLFxuICBkdDogW10sXG4gIGVtOiBbXSxcbiAgaHI6IFtdLFxuICBoMTogW10sXG4gIGgyOiBbXSxcbiAgaDM6IFtdLFxuICBoNDogW10sXG4gIGg1OiBbXSxcbiAgaDY6IFtdLFxuICBpOiBbXSxcbiAgaW1nOiBbJ3NyYycsICdzcmNzZXQnLCAnYWx0JywgJ3RpdGxlJywgJ3dpZHRoJywgJ2hlaWdodCddLFxuICBsaTogW10sXG4gIG9sOiBbXSxcbiAgcDogW10sXG4gIHByZTogW10sXG4gIHM6IFtdLFxuICBzbWFsbDogW10sXG4gIHNwYW46IFtdLFxuICBzdWI6IFtdLFxuICBzdXA6IFtdLFxuICBzdHJvbmc6IFtdLFxuICB1OiBbXSxcbiAgdWw6IFtdXG59O1xuLy8ganMtZG9jcy1lbmQgYWxsb3ctbGlzdFxuXG5jb25zdCB1cmlBdHRyaWJ1dGVzID0gbmV3IFNldChbJ2JhY2tncm91bmQnLCAnY2l0ZScsICdocmVmJywgJ2l0ZW10eXBlJywgJ2xvbmdkZXNjJywgJ3Bvc3RlcicsICdzcmMnLCAneGxpbms6aHJlZiddKTtcblxuLyoqXG4gKiBBIHBhdHRlcm4gdGhhdCByZWNvZ25pemVzIFVSTHMgdGhhdCBhcmUgc2FmZSB3cnQuIFhTUyBpbiBVUkwgbmF2aWdhdGlvblxuICogY29udGV4dHMuXG4gKlxuICogU2hvdXQtb3V0IHRvIEFuZ3VsYXIgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iLzE1LjIuOC9wYWNrYWdlcy9jb3JlL3NyYy9zYW5pdGl6YXRpb24vdXJsX3Nhbml0aXplci50cyNMMzhcbiAqL1xuY29uc3QgU0FGRV9VUkxfUEFUVEVSTiA9IC9eKD8hamF2YXNjcmlwdDopKD86W2EtejAtOSsuLV0rOnxbXiY6Lz8jXSooPzpbLz8jXXwkKSkvaTtcbmNvbnN0IGFsbG93ZWRBdHRyaWJ1dGUgPSAoYXR0cmlidXRlLCBhbGxvd2VkQXR0cmlidXRlTGlzdCkgPT4ge1xuICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChhbGxvd2VkQXR0cmlidXRlTGlzdC5pbmNsdWRlcyhhdHRyaWJ1dGVOYW1lKSkge1xuICAgIGlmICh1cmlBdHRyaWJ1dGVzLmhhcyhhdHRyaWJ1dGVOYW1lKSkge1xuICAgICAgcmV0dXJuIEJvb2xlYW4oU0FGRV9VUkxfUEFUVEVSTi50ZXN0KGF0dHJpYnV0ZS5ub2RlVmFsdWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBDaGVjayBpZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB2YWxpZGF0ZXMgdGhlIGF0dHJpYnV0ZS5cbiAgcmV0dXJuIGFsbG93ZWRBdHRyaWJ1dGVMaXN0LmZpbHRlcihhdHRyaWJ1dGVSZWdleCA9PiBhdHRyaWJ1dGVSZWdleCBpbnN0YW5jZW9mIFJlZ0V4cCkuc29tZShyZWdleCA9PiByZWdleC50ZXN0KGF0dHJpYnV0ZU5hbWUpKTtcbn07XG5mdW5jdGlvbiBzYW5pdGl6ZUh0bWwodW5zYWZlSHRtbCwgYWxsb3dMaXN0LCBzYW5pdGl6ZUZ1bmN0aW9uKSB7XG4gIGlmICghdW5zYWZlSHRtbC5sZW5ndGgpIHtcbiAgICByZXR1cm4gdW5zYWZlSHRtbDtcbiAgfVxuICBpZiAoc2FuaXRpemVGdW5jdGlvbiAmJiB0eXBlb2Ygc2FuaXRpemVGdW5jdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBzYW5pdGl6ZUZ1bmN0aW9uKHVuc2FmZUh0bWwpO1xuICB9XG4gIGNvbnN0IGRvbVBhcnNlciA9IG5ldyB3aW5kb3cuRE9NUGFyc2VyKCk7XG4gIGNvbnN0IGNyZWF0ZWREb2N1bWVudCA9IGRvbVBhcnNlci5wYXJzZUZyb21TdHJpbmcodW5zYWZlSHRtbCwgJ3RleHQvaHRtbCcpO1xuICBjb25zdCBlbGVtZW50cyA9IFtdLmNvbmNhdCguLi5jcmVhdGVkRG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yQWxsKCcqJykpO1xuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICBjb25zdCBlbGVtZW50TmFtZSA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIU9iamVjdC5rZXlzKGFsbG93TGlzdCkuaW5jbHVkZXMoZWxlbWVudE5hbWUpKSB7XG4gICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZUxpc3QgPSBbXS5jb25jYXQoLi4uZWxlbWVudC5hdHRyaWJ1dGVzKTtcbiAgICBjb25zdCBhbGxvd2VkQXR0cmlidXRlcyA9IFtdLmNvbmNhdChhbGxvd0xpc3RbJyonXSB8fCBbXSwgYWxsb3dMaXN0W2VsZW1lbnROYW1lXSB8fCBbXSk7XG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlTGlzdCkge1xuICAgICAgaWYgKCFhbGxvd2VkQXR0cmlidXRlKGF0dHJpYnV0ZSwgYWxsb3dlZEF0dHJpYnV0ZXMpKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZS5ub2RlTmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBjcmVhdGVkRG9jdW1lbnQuYm9keS5pbm5lckhUTUw7XG59XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL3RlbXBsYXRlLWZhY3RvcnkuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSQ1ID0gJ1RlbXBsYXRlRmFjdG9yeSc7XG5jb25zdCBEZWZhdWx0JDQgPSB7XG4gIGFsbG93TGlzdDogRGVmYXVsdEFsbG93bGlzdCxcbiAgY29udGVudDoge30sXG4gIC8vIHsgc2VsZWN0b3IgOiB0ZXh0ICwgIHNlbGVjdG9yMiA6IHRleHQyICwgfVxuICBleHRyYUNsYXNzOiAnJyxcbiAgaHRtbDogZmFsc2UsXG4gIHNhbml0aXplOiB0cnVlLFxuICBzYW5pdGl6ZUZuOiBudWxsLFxuICB0ZW1wbGF0ZTogJzxkaXY+PC9kaXY+J1xufTtcbmNvbnN0IERlZmF1bHRUeXBlJDQgPSB7XG4gIGFsbG93TGlzdDogJ29iamVjdCcsXG4gIGNvbnRlbnQ6ICdvYmplY3QnLFxuICBleHRyYUNsYXNzOiAnKHN0cmluZ3xmdW5jdGlvbiknLFxuICBodG1sOiAnYm9vbGVhbicsXG4gIHNhbml0aXplOiAnYm9vbGVhbicsXG4gIHNhbml0aXplRm46ICcobnVsbHxmdW5jdGlvbiknLFxuICB0ZW1wbGF0ZTogJ3N0cmluZydcbn07XG5jb25zdCBEZWZhdWx0Q29udGVudFR5cGUgPSB7XG4gIGVudHJ5OiAnKHN0cmluZ3xlbGVtZW50fGZ1bmN0aW9ufG51bGwpJyxcbiAgc2VsZWN0b3I6ICcoc3RyaW5nfGVsZW1lbnQpJ1xufTtcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgVGVtcGxhdGVGYWN0b3J5IGV4dGVuZHMgQ29uZmlnIHtcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKTtcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0JDQ7XG4gIH1cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGUkNDtcbiAgfVxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUUkNTtcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBnZXRDb250ZW50KCkge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuX2NvbmZpZy5jb250ZW50KS5tYXAoY29uZmlnID0+IHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKGNvbmZpZykpLmZpbHRlcihCb29sZWFuKTtcbiAgfVxuICBoYXNDb250ZW50KCkge1xuICAgIHJldHVybiB0aGlzLmdldENvbnRlbnQoKS5sZW5ndGggPiAwO1xuICB9XG4gIGNoYW5nZUNvbnRlbnQoY29udGVudCkge1xuICAgIHRoaXMuX2NoZWNrQ29udGVudChjb250ZW50KTtcbiAgICB0aGlzLl9jb25maWcuY29udGVudCA9IHtcbiAgICAgIC4uLnRoaXMuX2NvbmZpZy5jb250ZW50LFxuICAgICAgLi4uY29udGVudFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgdG9IdG1sKCkge1xuICAgIGNvbnN0IHRlbXBsYXRlV3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRlbXBsYXRlV3JhcHBlci5pbm5lckhUTUwgPSB0aGlzLl9tYXliZVNhbml0aXplKHRoaXMuX2NvbmZpZy50ZW1wbGF0ZSk7XG4gICAgZm9yIChjb25zdCBbc2VsZWN0b3IsIHRleHRdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuX2NvbmZpZy5jb250ZW50KSkge1xuICAgICAgdGhpcy5fc2V0Q29udGVudCh0ZW1wbGF0ZVdyYXBwZXIsIHRleHQsIHNlbGVjdG9yKTtcbiAgICB9XG4gICAgY29uc3QgdGVtcGxhdGUgPSB0ZW1wbGF0ZVdyYXBwZXIuY2hpbGRyZW5bMF07XG4gICAgY29uc3QgZXh0cmFDbGFzcyA9IHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKHRoaXMuX2NvbmZpZy5leHRyYUNsYXNzKTtcbiAgICBpZiAoZXh0cmFDbGFzcykge1xuICAgICAgdGVtcGxhdGUuY2xhc3NMaXN0LmFkZCguLi5leHRyYUNsYXNzLnNwbGl0KCcgJykpO1xuICAgIH1cbiAgICByZXR1cm4gdGVtcGxhdGU7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF90eXBlQ2hlY2tDb25maWcoY29uZmlnKSB7XG4gICAgc3VwZXIuX3R5cGVDaGVja0NvbmZpZyhjb25maWcpO1xuICAgIHRoaXMuX2NoZWNrQ29udGVudChjb25maWcuY29udGVudCk7XG4gIH1cbiAgX2NoZWNrQ29udGVudChhcmcpIHtcbiAgICBmb3IgKGNvbnN0IFtzZWxlY3RvciwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoYXJnKSkge1xuICAgICAgc3VwZXIuX3R5cGVDaGVja0NvbmZpZyh7XG4gICAgICAgIHNlbGVjdG9yLFxuICAgICAgICBlbnRyeTogY29udGVudFxuICAgICAgfSwgRGVmYXVsdENvbnRlbnRUeXBlKTtcbiAgICB9XG4gIH1cbiAgX3NldENvbnRlbnQodGVtcGxhdGUsIGNvbnRlbnQsIHNlbGVjdG9yKSB7XG4gICAgY29uc3QgdGVtcGxhdGVFbGVtZW50ID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShzZWxlY3RvciwgdGVtcGxhdGUpO1xuICAgIGlmICghdGVtcGxhdGVFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnRlbnQgPSB0aGlzLl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbihjb250ZW50KTtcbiAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgIHRlbXBsYXRlRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGlzRWxlbWVudChjb250ZW50KSkge1xuICAgICAgdGhpcy5fcHV0RWxlbWVudEluVGVtcGxhdGUoZ2V0RWxlbWVudChjb250ZW50KSwgdGVtcGxhdGVFbGVtZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NvbmZpZy5odG1sKSB7XG4gICAgICB0ZW1wbGF0ZUVsZW1lbnQuaW5uZXJIVE1MID0gdGhpcy5fbWF5YmVTYW5pdGl6ZShjb250ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGVtcGxhdGVFbGVtZW50LnRleHRDb250ZW50ID0gY29udGVudDtcbiAgfVxuICBfbWF5YmVTYW5pdGl6ZShhcmcpIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnLnNhbml0aXplID8gc2FuaXRpemVIdG1sKGFyZywgdGhpcy5fY29uZmlnLmFsbG93TGlzdCwgdGhpcy5fY29uZmlnLnNhbml0aXplRm4pIDogYXJnO1xuICB9XG4gIF9yZXNvbHZlUG9zc2libGVGdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gZXhlY3V0ZShhcmcsIFt1bmRlZmluZWQsIHRoaXNdKTtcbiAgfVxuICBfcHV0RWxlbWVudEluVGVtcGxhdGUoZWxlbWVudCwgdGVtcGxhdGVFbGVtZW50KSB7XG4gICAgaWYgKHRoaXMuX2NvbmZpZy5odG1sKSB7XG4gICAgICB0ZW1wbGF0ZUVsZW1lbnQuaW5uZXJIVE1MID0gJyc7XG4gICAgICB0ZW1wbGF0ZUVsZW1lbnQuYXBwZW5kKGVsZW1lbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0ZW1wbGF0ZUVsZW1lbnQudGV4dENvbnRlbnQgPSBlbGVtZW50LnRleHRDb250ZW50O1xuICB9XG59XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB0b29sdGlwLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUkNCA9ICd0b29sdGlwJztcbmNvbnN0IERJU0FMTE9XRURfQVRUUklCVVRFUyA9IG5ldyBTZXQoWydzYW5pdGl6ZScsICdhbGxvd0xpc3QnLCAnc2FuaXRpemVGbiddKTtcbmNvbnN0IENMQVNTX05BTUVfRkFERSQyID0gJ2ZhZGUnO1xuY29uc3QgQ0xBU1NfTkFNRV9NT0RBTCA9ICdtb2RhbCc7XG5jb25zdCBDTEFTU19OQU1FX1NIT1ckMiA9ICdzaG93JztcbmNvbnN0IFNFTEVDVE9SX1RPT0xUSVBfSU5ORVIgPSAnLnRvb2x0aXAtaW5uZXInO1xuY29uc3QgU0VMRUNUT1JfTU9EQUwgPSBgLiR7Q0xBU1NfTkFNRV9NT0RBTH1gO1xuY29uc3QgRVZFTlRfTU9EQUxfSElERSA9ICdoaWRlLmJzLm1vZGFsJztcbmNvbnN0IFRSSUdHRVJfSE9WRVIgPSAnaG92ZXInO1xuY29uc3QgVFJJR0dFUl9GT0NVUyA9ICdmb2N1cyc7XG5jb25zdCBUUklHR0VSX0NMSUNLID0gJ2NsaWNrJztcbmNvbnN0IFRSSUdHRVJfTUFOVUFMID0gJ21hbnVhbCc7XG5jb25zdCBFVkVOVF9ISURFJDIgPSAnaGlkZSc7XG5jb25zdCBFVkVOVF9ISURERU4kMiA9ICdoaWRkZW4nO1xuY29uc3QgRVZFTlRfU0hPVyQyID0gJ3Nob3cnO1xuY29uc3QgRVZFTlRfU0hPV04kMiA9ICdzaG93bic7XG5jb25zdCBFVkVOVF9JTlNFUlRFRCA9ICdpbnNlcnRlZCc7XG5jb25zdCBFVkVOVF9DTElDSyQxID0gJ2NsaWNrJztcbmNvbnN0IEVWRU5UX0ZPQ1VTSU4kMSA9ICdmb2N1c2luJztcbmNvbnN0IEVWRU5UX0ZPQ1VTT1VUJDEgPSAnZm9jdXNvdXQnO1xuY29uc3QgRVZFTlRfTU9VU0VFTlRFUiA9ICdtb3VzZWVudGVyJztcbmNvbnN0IEVWRU5UX01PVVNFTEVBVkUgPSAnbW91c2VsZWF2ZSc7XG5jb25zdCBBdHRhY2htZW50TWFwID0ge1xuICBBVVRPOiAnYXV0bycsXG4gIFRPUDogJ3RvcCcsXG4gIFJJR0hUOiBpc1JUTCgpID8gJ2xlZnQnIDogJ3JpZ2h0JyxcbiAgQk9UVE9NOiAnYm90dG9tJyxcbiAgTEVGVDogaXNSVEwoKSA/ICdyaWdodCcgOiAnbGVmdCdcbn07XG5jb25zdCBEZWZhdWx0JDMgPSB7XG4gIGFsbG93TGlzdDogRGVmYXVsdEFsbG93bGlzdCxcbiAgYW5pbWF0aW9uOiB0cnVlLFxuICBib3VuZGFyeTogJ2NsaXBwaW5nUGFyZW50cycsXG4gIGNvbnRhaW5lcjogZmFsc2UsXG4gIGN1c3RvbUNsYXNzOiAnJyxcbiAgZGVsYXk6IDAsXG4gIGZhbGxiYWNrUGxhY2VtZW50czogWyd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnXSxcbiAgaHRtbDogZmFsc2UsXG4gIG9mZnNldDogWzAsIDZdLFxuICBwbGFjZW1lbnQ6ICd0b3AnLFxuICBwb3BwZXJDb25maWc6IG51bGwsXG4gIHNhbml0aXplOiB0cnVlLFxuICBzYW5pdGl6ZUZuOiBudWxsLFxuICBzZWxlY3RvcjogZmFsc2UsXG4gIHRlbXBsYXRlOiAnPGRpdiBjbGFzcz1cInRvb2x0aXBcIiByb2xlPVwidG9vbHRpcFwiPicgKyAnPGRpdiBjbGFzcz1cInRvb2x0aXAtYXJyb3dcIj48L2Rpdj4nICsgJzxkaXYgY2xhc3M9XCJ0b29sdGlwLWlubmVyXCI+PC9kaXY+JyArICc8L2Rpdj4nLFxuICB0aXRsZTogJycsXG4gIHRyaWdnZXI6ICdob3ZlciBmb2N1cydcbn07XG5jb25zdCBEZWZhdWx0VHlwZSQzID0ge1xuICBhbGxvd0xpc3Q6ICdvYmplY3QnLFxuICBhbmltYXRpb246ICdib29sZWFuJyxcbiAgYm91bmRhcnk6ICcoc3RyaW5nfGVsZW1lbnQpJyxcbiAgY29udGFpbmVyOiAnKHN0cmluZ3xlbGVtZW50fGJvb2xlYW4pJyxcbiAgY3VzdG9tQ2xhc3M6ICcoc3RyaW5nfGZ1bmN0aW9uKScsXG4gIGRlbGF5OiAnKG51bWJlcnxvYmplY3QpJyxcbiAgZmFsbGJhY2tQbGFjZW1lbnRzOiAnYXJyYXknLFxuICBodG1sOiAnYm9vbGVhbicsXG4gIG9mZnNldDogJyhhcnJheXxzdHJpbmd8ZnVuY3Rpb24pJyxcbiAgcGxhY2VtZW50OiAnKHN0cmluZ3xmdW5jdGlvbiknLFxuICBwb3BwZXJDb25maWc6ICcobnVsbHxvYmplY3R8ZnVuY3Rpb24pJyxcbiAgc2FuaXRpemU6ICdib29sZWFuJyxcbiAgc2FuaXRpemVGbjogJyhudWxsfGZ1bmN0aW9uKScsXG4gIHNlbGVjdG9yOiAnKHN0cmluZ3xib29sZWFuKScsXG4gIHRlbXBsYXRlOiAnc3RyaW5nJyxcbiAgdGl0bGU6ICcoc3RyaW5nfGVsZW1lbnR8ZnVuY3Rpb24pJyxcbiAgdHJpZ2dlcjogJ3N0cmluZydcbn07XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIFRvb2x0aXAgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgaWYgKHR5cGVvZiBQb3BwZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCb290c3RyYXBcXCdzIHRvb2x0aXBzIHJlcXVpcmUgUG9wcGVyIChodHRwczovL3BvcHBlci5qcy5vcmcvZG9jcy92Mi8pJyk7XG4gICAgfVxuICAgIHN1cGVyKGVsZW1lbnQsIGNvbmZpZyk7XG5cbiAgICAvLyBQcml2YXRlXG4gICAgdGhpcy5faXNFbmFibGVkID0gdHJ1ZTtcbiAgICB0aGlzLl90aW1lb3V0ID0gMDtcbiAgICB0aGlzLl9pc0hvdmVyZWQgPSBudWxsO1xuICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXIgPSB7fTtcbiAgICB0aGlzLl9wb3BwZXIgPSBudWxsO1xuICAgIHRoaXMuX3RlbXBsYXRlRmFjdG9yeSA9IG51bGw7XG4gICAgdGhpcy5fbmV3Q29udGVudCA9IG51bGw7XG5cbiAgICAvLyBQcm90ZWN0ZWRcbiAgICB0aGlzLnRpcCA9IG51bGw7XG4gICAgdGhpcy5fc2V0TGlzdGVuZXJzKCk7XG4gICAgaWYgKCF0aGlzLl9jb25maWcuc2VsZWN0b3IpIHtcbiAgICAgIHRoaXMuX2ZpeFRpdGxlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHQkMztcbiAgfVxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZSQzO1xuICB9XG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRSQ0O1xuICB9XG5cbiAgLy8gUHVibGljXG4gIGVuYWJsZSgpIHtcbiAgICB0aGlzLl9pc0VuYWJsZWQgPSB0cnVlO1xuICB9XG4gIGRpc2FibGUoKSB7XG4gICAgdGhpcy5faXNFbmFibGVkID0gZmFsc2U7XG4gIH1cbiAgdG9nZ2xlRW5hYmxlZCgpIHtcbiAgICB0aGlzLl9pc0VuYWJsZWQgPSAhdGhpcy5faXNFbmFibGVkO1xuICB9XG4gIHRvZ2dsZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5faXNTaG93bigpKSB7XG4gICAgICB0aGlzLl9sZWF2ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9lbnRlcigpO1xuICB9XG4gIGRpc3Bvc2UoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpO1xuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudC5jbG9zZXN0KFNFTEVDVE9SX01PREFMKSwgRVZFTlRfTU9EQUxfSElERSwgdGhpcy5faGlkZU1vZGFsSGFuZGxlcik7XG4gICAgaWYgKHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJykpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsIHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJykpO1xuICAgIH1cbiAgICB0aGlzLl9kaXNwb3NlUG9wcGVyKCk7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG4gIHNob3coKSB7XG4gICAgaWYgKHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSB1c2Ugc2hvdyBvbiB2aXNpYmxlIGVsZW1lbnRzJyk7XG4gICAgfVxuICAgIGlmICghKHRoaXMuX2lzV2l0aENvbnRlbnQoKSAmJiB0aGlzLl9pc0VuYWJsZWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX1NIT1ckMikpO1xuICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSBmaW5kU2hhZG93Um9vdCh0aGlzLl9lbGVtZW50KTtcbiAgICBjb25zdCBpc0luVGhlRG9tID0gKHNoYWRvd1Jvb3QgfHwgdGhpcy5fZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuY29udGFpbnModGhpcy5fZWxlbWVudCk7XG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkIHx8ICFpc0luVGhlRG9tKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVE9ETzogdjYgcmVtb3ZlIHRoaXMgb3IgbWFrZSBpdCBvcHRpb25hbFxuICAgIHRoaXMuX2Rpc3Bvc2VQb3BwZXIoKTtcbiAgICBjb25zdCB0aXAgPSB0aGlzLl9nZXRUaXBFbGVtZW50KCk7XG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknLCB0aXAuZ2V0QXR0cmlidXRlKCdpZCcpKTtcbiAgICBjb25zdCB7XG4gICAgICBjb250YWluZXJcbiAgICB9ID0gdGhpcy5fY29uZmlnO1xuICAgIGlmICghdGhpcy5fZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jb250YWlucyh0aGlzLnRpcCkpIHtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmQodGlwKTtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0lOU0VSVEVEKSk7XG4gICAgfVxuICAgIHRoaXMuX3BvcHBlciA9IHRoaXMuX2NyZWF0ZVBvcHBlcih0aXApO1xuICAgIHRpcC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVyQyKTtcblxuICAgIC8vIElmIHRoaXMgaXMgYSB0b3VjaC1lbmFibGVkIGRldmljZSB3ZSBhZGQgZXh0cmFcbiAgICAvLyBlbXB0eSBtb3VzZW92ZXIgbGlzdGVuZXJzIHRvIHRoZSBib2R5J3MgaW1tZWRpYXRlIGNoaWxkcmVuO1xuICAgIC8vIG9ubHkgbmVlZGVkIGJlY2F1c2Ugb2YgYnJva2VuIGV2ZW50IGRlbGVnYXRpb24gb24gaU9TXG4gICAgLy8gaHR0cHM6Ly93d3cucXVpcmtzbW9kZS5vcmcvYmxvZy9hcmNoaXZlcy8yMDE0LzAyL21vdXNlX2V2ZW50X2J1Yi5odG1sXG4gICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKSkge1xuICAgICAgICBFdmVudEhhbmRsZXIub24oZWxlbWVudCwgJ21vdXNlb3ZlcicsIG5vb3ApO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX1NIT1dOJDIpKTtcbiAgICAgIGlmICh0aGlzLl9pc0hvdmVyZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX2xlYXZlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9pc0hvdmVyZWQgPSBmYWxzZTtcbiAgICB9O1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMudGlwLCB0aGlzLl9pc0FuaW1hdGVkKCkpO1xuICB9XG4gIGhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfSElERSQyKSk7XG4gICAgaWYgKGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRpcCA9IHRoaXMuX2dldFRpcEVsZW1lbnQoKTtcbiAgICB0aXAuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1ckMik7XG5cbiAgICAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgcmVtb3ZlIHRoZSBleHRyYVxuICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgd2UgYWRkZWQgZm9yIGlPUyBzdXBwb3J0XG4gICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKSkge1xuICAgICAgICBFdmVudEhhbmRsZXIub2ZmKGVsZW1lbnQsICdtb3VzZW92ZXInLCBub29wKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fYWN0aXZlVHJpZ2dlcltUUklHR0VSX0NMSUNLXSA9IGZhbHNlO1xuICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVFJJR0dFUl9GT0NVU10gPSBmYWxzZTtcbiAgICB0aGlzLl9hY3RpdmVUcmlnZ2VyW1RSSUdHRVJfSE9WRVJdID0gZmFsc2U7XG4gICAgdGhpcy5faXNIb3ZlcmVkID0gbnVsbDsgLy8gaXQgaXMgYSB0cmljayB0byBzdXBwb3J0IG1hbnVhbCB0cmlnZ2VyaW5nXG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9pc1dpdGhBY3RpdmVUcmlnZ2VyKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLl9pc0hvdmVyZWQpIHtcbiAgICAgICAgdGhpcy5fZGlzcG9zZVBvcHBlcigpO1xuICAgICAgfVxuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknKTtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0hJRERFTiQyKSk7XG4gICAgfTtcbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCB0aGlzLnRpcCwgdGhpcy5faXNBbmltYXRlZCgpKTtcbiAgfVxuICB1cGRhdGUoKSB7XG4gICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgdGhpcy5fcG9wcGVyLnVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFByb3RlY3RlZFxuICBfaXNXaXRoQ29udGVudCgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLl9nZXRUaXRsZSgpKTtcbiAgfVxuICBfZ2V0VGlwRWxlbWVudCgpIHtcbiAgICBpZiAoIXRoaXMudGlwKSB7XG4gICAgICB0aGlzLnRpcCA9IHRoaXMuX2NyZWF0ZVRpcEVsZW1lbnQodGhpcy5fbmV3Q29udGVudCB8fCB0aGlzLl9nZXRDb250ZW50Rm9yVGVtcGxhdGUoKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRpcDtcbiAgfVxuICBfY3JlYXRlVGlwRWxlbWVudChjb250ZW50KSB7XG4gICAgY29uc3QgdGlwID0gdGhpcy5fZ2V0VGVtcGxhdGVGYWN0b3J5KGNvbnRlbnQpLnRvSHRtbCgpO1xuXG4gICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgY2hlY2sgaW4gdjZcbiAgICBpZiAoIXRpcCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRpcC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfRkFERSQyLCBDTEFTU19OQU1FX1NIT1ckMik7XG4gICAgLy8gVE9ETzogdjYgdGhlIGZvbGxvd2luZyBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBDU1Mgb25seVxuICAgIHRpcC5jbGFzc0xpc3QuYWRkKGBicy0ke3RoaXMuY29uc3RydWN0b3IuTkFNRX0tYXV0b2ApO1xuICAgIGNvbnN0IHRpcElkID0gZ2V0VUlEKHRoaXMuY29uc3RydWN0b3IuTkFNRSkudG9TdHJpbmcoKTtcbiAgICB0aXAuc2V0QXR0cmlidXRlKCdpZCcsIHRpcElkKTtcbiAgICBpZiAodGhpcy5faXNBbmltYXRlZCgpKSB7XG4gICAgICB0aXAuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0ZBREUkMik7XG4gICAgfVxuICAgIHJldHVybiB0aXA7XG4gIH1cbiAgc2V0Q29udGVudChjb250ZW50KSB7XG4gICAgdGhpcy5fbmV3Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgaWYgKHRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgdGhpcy5fZGlzcG9zZVBvcHBlcigpO1xuICAgICAgdGhpcy5zaG93KCk7XG4gICAgfVxuICB9XG4gIF9nZXRUZW1wbGF0ZUZhY3RvcnkoY29udGVudCkge1xuICAgIGlmICh0aGlzLl90ZW1wbGF0ZUZhY3RvcnkpIHtcbiAgICAgIHRoaXMuX3RlbXBsYXRlRmFjdG9yeS5jaGFuZ2VDb250ZW50KGNvbnRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90ZW1wbGF0ZUZhY3RvcnkgPSBuZXcgVGVtcGxhdGVGYWN0b3J5KHtcbiAgICAgICAgLi4udGhpcy5fY29uZmlnLFxuICAgICAgICAvLyB0aGUgYGNvbnRlbnRgIHZhciBoYXMgdG8gYmUgYWZ0ZXIgYHRoaXMuX2NvbmZpZ2BcbiAgICAgICAgLy8gdG8gb3ZlcnJpZGUgY29uZmlnLmNvbnRlbnQgaW4gY2FzZSBvZiBwb3BvdmVyXG4gICAgICAgIGNvbnRlbnQsXG4gICAgICAgIGV4dHJhQ2xhc3M6IHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKHRoaXMuX2NvbmZpZy5jdXN0b21DbGFzcylcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGVGYWN0b3J5O1xuICB9XG4gIF9nZXRDb250ZW50Rm9yVGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFtTRUxFQ1RPUl9UT09MVElQX0lOTkVSXTogdGhpcy5fZ2V0VGl0bGUoKVxuICAgIH07XG4gIH1cbiAgX2dldFRpdGxlKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbih0aGlzLl9jb25maWcudGl0bGUpIHx8IHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJyk7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9pbml0aWFsaXplT25EZWxlZ2F0ZWRUYXJnZXQoZXZlbnQpIHtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5nZXRPckNyZWF0ZUluc3RhbmNlKGV2ZW50LmRlbGVnYXRlVGFyZ2V0LCB0aGlzLl9nZXREZWxlZ2F0ZUNvbmZpZygpKTtcbiAgfVxuICBfaXNBbmltYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnLmFuaW1hdGlvbiB8fCB0aGlzLnRpcCAmJiB0aGlzLnRpcC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9GQURFJDIpO1xuICB9XG4gIF9pc1Nob3duKCkge1xuICAgIHJldHVybiB0aGlzLnRpcCAmJiB0aGlzLnRpcC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TSE9XJDIpO1xuICB9XG4gIF9jcmVhdGVQb3BwZXIodGlwKSB7XG4gICAgY29uc3QgcGxhY2VtZW50ID0gZXhlY3V0ZSh0aGlzLl9jb25maWcucGxhY2VtZW50LCBbdGhpcywgdGlwLCB0aGlzLl9lbGVtZW50XSk7XG4gICAgY29uc3QgYXR0YWNobWVudCA9IEF0dGFjaG1lbnRNYXBbcGxhY2VtZW50LnRvVXBwZXJDYXNlKCldO1xuICAgIHJldHVybiBQb3BwZXIuY3JlYXRlUG9wcGVyKHRoaXMuX2VsZW1lbnQsIHRpcCwgdGhpcy5fZ2V0UG9wcGVyQ29uZmlnKGF0dGFjaG1lbnQpKTtcbiAgfVxuICBfZ2V0T2Zmc2V0KCkge1xuICAgIGNvbnN0IHtcbiAgICAgIG9mZnNldFxuICAgIH0gPSB0aGlzLl9jb25maWc7XG4gICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gb2Zmc2V0LnNwbGl0KCcsJykubWFwKHZhbHVlID0+IE51bWJlci5wYXJzZUludCh2YWx1ZSwgMTApKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBwb3BwZXJEYXRhID0+IG9mZnNldChwb3BwZXJEYXRhLCB0aGlzLl9lbGVtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIG9mZnNldDtcbiAgfVxuICBfcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGV4ZWN1dGUoYXJnLCBbdGhpcy5fZWxlbWVudCwgdGhpcy5fZWxlbWVudF0pO1xuICB9XG4gIF9nZXRQb3BwZXJDb25maWcoYXR0YWNobWVudCkge1xuICAgIGNvbnN0IGRlZmF1bHRCc1BvcHBlckNvbmZpZyA9IHtcbiAgICAgIHBsYWNlbWVudDogYXR0YWNobWVudCxcbiAgICAgIG1vZGlmaWVyczogW3tcbiAgICAgICAgbmFtZTogJ2ZsaXAnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgZmFsbGJhY2tQbGFjZW1lbnRzOiB0aGlzLl9jb25maWcuZmFsbGJhY2tQbGFjZW1lbnRzXG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgbmFtZTogJ29mZnNldCcsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBvZmZzZXQ6IHRoaXMuX2dldE9mZnNldCgpXG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBib3VuZGFyeTogdGhpcy5fY29uZmlnLmJvdW5kYXJ5XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgbmFtZTogJ2Fycm93JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGVsZW1lbnQ6IGAuJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUV9LWFycm93YFxuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIG5hbWU6ICdwcmVTZXRQbGFjZW1lbnQnLFxuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICBwaGFzZTogJ2JlZm9yZU1haW4nLFxuICAgICAgICBmbjogZGF0YSA9PiB7XG4gICAgICAgICAgLy8gUHJlLXNldCBQb3BwZXIncyBwbGFjZW1lbnQgYXR0cmlidXRlIGluIG9yZGVyIHRvIHJlYWQgdGhlIGFycm93IHNpemVzIHByb3Blcmx5LlxuICAgICAgICAgIC8vIE90aGVyd2lzZSwgUG9wcGVyIG1peGVzIHVwIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGRpbWVuc2lvbnMgc2luY2UgdGhlIGluaXRpYWwgYXJyb3cgc3R5bGUgaXMgZm9yIHRvcCBwbGFjZW1lbnRcbiAgICAgICAgICB0aGlzLl9nZXRUaXBFbGVtZW50KCkuc2V0QXR0cmlidXRlKCdkYXRhLXBvcHBlci1wbGFjZW1lbnQnLCBkYXRhLnN0YXRlLnBsYWNlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1dXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmYXVsdEJzUG9wcGVyQ29uZmlnLFxuICAgICAgLi4uZXhlY3V0ZSh0aGlzLl9jb25maWcucG9wcGVyQ29uZmlnLCBbdW5kZWZpbmVkLCBkZWZhdWx0QnNQb3BwZXJDb25maWddKVxuICAgIH07XG4gIH1cbiAgX3NldExpc3RlbmVycygpIHtcbiAgICBjb25zdCB0cmlnZ2VycyA9IHRoaXMuX2NvbmZpZy50cmlnZ2VyLnNwbGl0KCcgJyk7XG4gICAgZm9yIChjb25zdCB0cmlnZ2VyIG9mIHRyaWdnZXJzKSB7XG4gICAgICBpZiAodHJpZ2dlciA9PT0gJ2NsaWNrJykge1xuICAgICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfQ0xJQ0skMSksIHRoaXMuX2NvbmZpZy5zZWxlY3RvciwgZXZlbnQgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9pbml0aWFsaXplT25EZWxlZ2F0ZWRUYXJnZXQoZXZlbnQpO1xuICAgICAgICAgIGNvbnRleHQuX2FjdGl2ZVRyaWdnZXJbVFJJR0dFUl9DTElDS10gPSAhKGNvbnRleHQuX2lzU2hvd24oKSAmJiBjb250ZXh0Ll9hY3RpdmVUcmlnZ2VyW1RSSUdHRVJfQ0xJQ0tdKTtcbiAgICAgICAgICBjb250ZXh0LnRvZ2dsZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodHJpZ2dlciAhPT0gVFJJR0dFUl9NQU5VQUwpIHtcbiAgICAgICAgY29uc3QgZXZlbnRJbiA9IHRyaWdnZXIgPT09IFRSSUdHRVJfSE9WRVIgPyB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9NT1VTRUVOVEVSKSA6IHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0ZPQ1VTSU4kMSk7XG4gICAgICAgIGNvbnN0IGV2ZW50T3V0ID0gdHJpZ2dlciA9PT0gVFJJR0dFUl9IT1ZFUiA/IHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX01PVVNFTEVBVkUpIDogdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfRk9DVVNPVVQkMSk7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBldmVudEluLCB0aGlzLl9jb25maWcuc2VsZWN0b3IsIGV2ZW50ID0+IHtcbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5faW5pdGlhbGl6ZU9uRGVsZWdhdGVkVGFyZ2V0KGV2ZW50KTtcbiAgICAgICAgICBjb250ZXh0Ll9hY3RpdmVUcmlnZ2VyW2V2ZW50LnR5cGUgPT09ICdmb2N1c2luJyA/IFRSSUdHRVJfRk9DVVMgOiBUUklHR0VSX0hPVkVSXSA9IHRydWU7XG4gICAgICAgICAgY29udGV4dC5fZW50ZXIoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBldmVudE91dCwgdGhpcy5fY29uZmlnLnNlbGVjdG9yLCBldmVudCA9PiB7XG4gICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuX2luaXRpYWxpemVPbkRlbGVnYXRlZFRhcmdldChldmVudCk7XG4gICAgICAgICAgY29udGV4dC5fYWN0aXZlVHJpZ2dlcltldmVudC50eXBlID09PSAnZm9jdXNvdXQnID8gVFJJR0dFUl9GT0NVUyA6IFRSSUdHRVJfSE9WRVJdID0gY29udGV4dC5fZWxlbWVudC5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KTtcbiAgICAgICAgICBjb250ZXh0Ll9sZWF2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5faGlkZU1vZGFsSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9lbGVtZW50KSB7XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgfVxuICAgIH07XG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQuY2xvc2VzdChTRUxFQ1RPUl9NT0RBTCksIEVWRU5UX01PREFMX0hJREUsIHRoaXMuX2hpZGVNb2RhbEhhbmRsZXIpO1xuICB9XG4gIF9maXhUaXRsZSgpIHtcbiAgICBjb25zdCB0aXRsZSA9IHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCd0aXRsZScpO1xuICAgIGlmICghdGl0bGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpICYmICF0aGlzLl9lbGVtZW50LnRleHRDb250ZW50LnRyaW0oKSkge1xuICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCB0aXRsZSk7XG4gICAgfVxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJywgdGl0bGUpOyAvLyBETyBOT1QgVVNFIElULiBJcyBvbmx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCd0aXRsZScpO1xuICB9XG4gIF9lbnRlcigpIHtcbiAgICBpZiAodGhpcy5faXNTaG93bigpIHx8IHRoaXMuX2lzSG92ZXJlZCkge1xuICAgICAgdGhpcy5faXNIb3ZlcmVkID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5faXNIb3ZlcmVkID0gdHJ1ZTtcbiAgICB0aGlzLl9zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9pc0hvdmVyZWQpIHtcbiAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICB9XG4gICAgfSwgdGhpcy5fY29uZmlnLmRlbGF5LnNob3cpO1xuICB9XG4gIF9sZWF2ZSgpIHtcbiAgICBpZiAodGhpcy5faXNXaXRoQWN0aXZlVHJpZ2dlcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2lzSG92ZXJlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3NldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9pc0hvdmVyZWQpIHtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICB9XG4gICAgfSwgdGhpcy5fY29uZmlnLmRlbGF5LmhpZGUpO1xuICB9XG4gIF9zZXRUaW1lb3V0KGhhbmRsZXIsIHRpbWVvdXQpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7XG4gICAgdGhpcy5fdGltZW91dCA9IHNldFRpbWVvdXQoaGFuZGxlciwgdGltZW91dCk7XG4gIH1cbiAgX2lzV2l0aEFjdGl2ZVRyaWdnZXIoKSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5fYWN0aXZlVHJpZ2dlcikuaW5jbHVkZXModHJ1ZSk7XG4gIH1cbiAgX2dldENvbmZpZyhjb25maWcpIHtcbiAgICBjb25zdCBkYXRhQXR0cmlidXRlcyA9IE1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQpO1xuICAgIGZvciAoY29uc3QgZGF0YUF0dHJpYnV0ZSBvZiBPYmplY3Qua2V5cyhkYXRhQXR0cmlidXRlcykpIHtcbiAgICAgIGlmIChESVNBTExPV0VEX0FUVFJJQlVURVMuaGFzKGRhdGFBdHRyaWJ1dGUpKSB7XG4gICAgICAgIGRlbGV0ZSBkYXRhQXR0cmlidXRlc1tkYXRhQXR0cmlidXRlXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uZmlnID0ge1xuICAgICAgLi4uZGF0YUF0dHJpYnV0ZXMsXG4gICAgICAuLi4odHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgJiYgY29uZmlnID8gY29uZmlnIDoge30pXG4gICAgfTtcbiAgICBjb25maWcgPSB0aGlzLl9tZXJnZUNvbmZpZ09iaihjb25maWcpO1xuICAgIGNvbmZpZyA9IHRoaXMuX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKTtcbiAgICB0aGlzLl90eXBlQ2hlY2tDb25maWcoY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG4gIF9jb25maWdBZnRlck1lcmdlKGNvbmZpZykge1xuICAgIGNvbmZpZy5jb250YWluZXIgPSBjb25maWcuY29udGFpbmVyID09PSBmYWxzZSA/IGRvY3VtZW50LmJvZHkgOiBnZXRFbGVtZW50KGNvbmZpZy5jb250YWluZXIpO1xuICAgIGlmICh0eXBlb2YgY29uZmlnLmRlbGF5ID09PSAnbnVtYmVyJykge1xuICAgICAgY29uZmlnLmRlbGF5ID0ge1xuICAgICAgICBzaG93OiBjb25maWcuZGVsYXksXG4gICAgICAgIGhpZGU6IGNvbmZpZy5kZWxheVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb25maWcudGl0bGUgPT09ICdudW1iZXInKSB7XG4gICAgICBjb25maWcudGl0bGUgPSBjb25maWcudGl0bGUudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb25maWcuY29udGVudCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGNvbmZpZy5jb250ZW50ID0gY29uZmlnLmNvbnRlbnQudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBfZ2V0RGVsZWdhdGVDb25maWcoKSB7XG4gICAgY29uc3QgY29uZmlnID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5fY29uZmlnKSkge1xuICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFtrZXldICE9PSB2YWx1ZSkge1xuICAgICAgICBjb25maWdba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25maWcuc2VsZWN0b3IgPSBmYWxzZTtcbiAgICBjb25maWcudHJpZ2dlciA9ICdtYW51YWwnO1xuXG4gICAgLy8gSW4gdGhlIGZ1dHVyZSBjYW4gYmUgcmVwbGFjZWQgd2l0aDpcbiAgICAvLyBjb25zdCBrZXlzV2l0aERpZmZlcmVudFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuX2NvbmZpZykuZmlsdGVyKGVudHJ5ID0+IHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFtlbnRyeVswXV0gIT09IHRoaXMuX2NvbmZpZ1tlbnRyeVswXV0pXG4gICAgLy8gYE9iamVjdC5mcm9tRW50cmllcyhrZXlzV2l0aERpZmZlcmVudFZhbHVlcylgXG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBfZGlzcG9zZVBvcHBlcigpIHtcbiAgICBpZiAodGhpcy5fcG9wcGVyKSB7XG4gICAgICB0aGlzLl9wb3BwZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5fcG9wcGVyID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMudGlwKSB7XG4gICAgICB0aGlzLnRpcC5yZW1vdmUoKTtcbiAgICAgIHRoaXMudGlwID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBUb29sdGlwLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKTtcbiAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKTtcbiAgICAgIH1cbiAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKFRvb2x0aXApO1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgcG9wb3Zlci5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJDMgPSAncG9wb3Zlcic7XG5jb25zdCBTRUxFQ1RPUl9USVRMRSA9ICcucG9wb3Zlci1oZWFkZXInO1xuY29uc3QgU0VMRUNUT1JfQ09OVEVOVCA9ICcucG9wb3Zlci1ib2R5JztcbmNvbnN0IERlZmF1bHQkMiA9IHtcbiAgLi4uVG9vbHRpcC5EZWZhdWx0LFxuICBjb250ZW50OiAnJyxcbiAgb2Zmc2V0OiBbMCwgOF0sXG4gIHBsYWNlbWVudDogJ3JpZ2h0JyxcbiAgdGVtcGxhdGU6ICc8ZGl2IGNsYXNzPVwicG9wb3ZlclwiIHJvbGU9XCJ0b29sdGlwXCI+JyArICc8ZGl2IGNsYXNzPVwicG9wb3Zlci1hcnJvd1wiPjwvZGl2PicgKyAnPGgzIGNsYXNzPVwicG9wb3Zlci1oZWFkZXJcIj48L2gzPicgKyAnPGRpdiBjbGFzcz1cInBvcG92ZXItYm9keVwiPjwvZGl2PicgKyAnPC9kaXY+JyxcbiAgdHJpZ2dlcjogJ2NsaWNrJ1xufTtcbmNvbnN0IERlZmF1bHRUeXBlJDIgPSB7XG4gIC4uLlRvb2x0aXAuRGVmYXVsdFR5cGUsXG4gIGNvbnRlbnQ6ICcobnVsbHxzdHJpbmd8ZWxlbWVudHxmdW5jdGlvbiknXG59O1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBQb3BvdmVyIGV4dGVuZHMgVG9vbHRpcCB7XG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0JDI7XG4gIH1cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGUkMjtcbiAgfVxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUUkMztcbiAgfVxuXG4gIC8vIE92ZXJyaWRlc1xuICBfaXNXaXRoQ29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0VGl0bGUoKSB8fCB0aGlzLl9nZXRDb250ZW50KCk7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9nZXRDb250ZW50Rm9yVGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFtTRUxFQ1RPUl9USVRMRV06IHRoaXMuX2dldFRpdGxlKCksXG4gICAgICBbU0VMRUNUT1JfQ09OVEVOVF06IHRoaXMuX2dldENvbnRlbnQoKVxuICAgIH07XG4gIH1cbiAgX2dldENvbnRlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKHRoaXMuX2NvbmZpZy5jb250ZW50KTtcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFBvcG92ZXIuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgfVxuICAgICAgZGF0YVtjb25maWddKCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oUG9wb3Zlcik7XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBzY3JvbGxzcHkuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSQyID0gJ3Njcm9sbHNweSc7XG5jb25zdCBEQVRBX0tFWSQyID0gJ2JzLnNjcm9sbHNweSc7XG5jb25zdCBFVkVOVF9LRVkkMiA9IGAuJHtEQVRBX0tFWSQyfWA7XG5jb25zdCBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJztcbmNvbnN0IEVWRU5UX0FDVElWQVRFID0gYGFjdGl2YXRlJHtFVkVOVF9LRVkkMn1gO1xuY29uc3QgRVZFTlRfQ0xJQ0sgPSBgY2xpY2ske0VWRU5UX0tFWSQyfWA7XG5jb25zdCBFVkVOVF9MT0FEX0RBVEFfQVBJJDEgPSBgbG9hZCR7RVZFTlRfS0VZJDJ9JHtEQVRBX0FQSV9LRVl9YDtcbmNvbnN0IENMQVNTX05BTUVfRFJPUERPV05fSVRFTSA9ICdkcm9wZG93bi1pdGVtJztcbmNvbnN0IENMQVNTX05BTUVfQUNUSVZFJDEgPSAnYWN0aXZlJztcbmNvbnN0IFNFTEVDVE9SX0RBVEFfU1BZID0gJ1tkYXRhLWJzLXNweT1cInNjcm9sbFwiXSc7XG5jb25zdCBTRUxFQ1RPUl9UQVJHRVRfTElOS1MgPSAnW2hyZWZdJztcbmNvbnN0IFNFTEVDVE9SX05BVl9MSVNUX0dST1VQID0gJy5uYXYsIC5saXN0LWdyb3VwJztcbmNvbnN0IFNFTEVDVE9SX05BVl9MSU5LUyA9ICcubmF2LWxpbmsnO1xuY29uc3QgU0VMRUNUT1JfTkFWX0lURU1TID0gJy5uYXYtaXRlbSc7XG5jb25zdCBTRUxFQ1RPUl9MSVNUX0lURU1TID0gJy5saXN0LWdyb3VwLWl0ZW0nO1xuY29uc3QgU0VMRUNUT1JfTElOS19JVEVNUyA9IGAke1NFTEVDVE9SX05BVl9MSU5LU30sICR7U0VMRUNUT1JfTkFWX0lURU1TfSA+ICR7U0VMRUNUT1JfTkFWX0xJTktTfSwgJHtTRUxFQ1RPUl9MSVNUX0lURU1TfWA7XG5jb25zdCBTRUxFQ1RPUl9EUk9QRE9XTiA9ICcuZHJvcGRvd24nO1xuY29uc3QgU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFJDEgPSAnLmRyb3Bkb3duLXRvZ2dsZSc7XG5jb25zdCBEZWZhdWx0JDEgPSB7XG4gIG9mZnNldDogbnVsbCxcbiAgLy8gVE9ETzogdjYgQGRlcHJlY2F0ZWQsIGtlZXAgaXQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnNcbiAgcm9vdE1hcmdpbjogJzBweCAwcHggLTI1JScsXG4gIHNtb290aFNjcm9sbDogZmFsc2UsXG4gIHRhcmdldDogbnVsbCxcbiAgdGhyZXNob2xkOiBbMC4xLCAwLjUsIDFdXG59O1xuY29uc3QgRGVmYXVsdFR5cGUkMSA9IHtcbiAgb2Zmc2V0OiAnKG51bWJlcnxudWxsKScsXG4gIC8vIFRPRE8gdjYgQGRlcHJlY2F0ZWQsIGtlZXAgaXQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnNcbiAgcm9vdE1hcmdpbjogJ3N0cmluZycsXG4gIHNtb290aFNjcm9sbDogJ2Jvb2xlYW4nLFxuICB0YXJnZXQ6ICdlbGVtZW50JyxcbiAgdGhyZXNob2xkOiAnYXJyYXknXG59O1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBTY3JvbGxTcHkgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKTtcblxuICAgIC8vIHRoaXMuX2VsZW1lbnQgaXMgdGhlIG9ic2VydmFibGVzQ29udGFpbmVyIGFuZCBjb25maWcudGFyZ2V0IHRoZSBtZW51IGxpbmtzIHdyYXBwZXJcbiAgICB0aGlzLl90YXJnZXRMaW5rcyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLl9vYnNlcnZhYmxlU2VjdGlvbnMgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5fcm9vdEVsZW1lbnQgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMuX2VsZW1lbnQpLm92ZXJmbG93WSA9PT0gJ3Zpc2libGUnID8gbnVsbCA6IHRoaXMuX2VsZW1lbnQ7XG4gICAgdGhpcy5fYWN0aXZlVGFyZ2V0ID0gbnVsbDtcbiAgICB0aGlzLl9vYnNlcnZlciA9IG51bGw7XG4gICAgdGhpcy5fcHJldmlvdXNTY3JvbGxEYXRhID0ge1xuICAgICAgdmlzaWJsZUVudHJ5VG9wOiAwLFxuICAgICAgcGFyZW50U2Nyb2xsVG9wOiAwXG4gICAgfTtcbiAgICB0aGlzLnJlZnJlc2goKTsgLy8gaW5pdGlhbGl6ZVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHQkMTtcbiAgfVxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZSQxO1xuICB9XG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRSQyO1xuICB9XG5cbiAgLy8gUHVibGljXG4gIHJlZnJlc2goKSB7XG4gICAgdGhpcy5faW5pdGlhbGl6ZVRhcmdldHNBbmRPYnNlcnZhYmxlcygpO1xuICAgIHRoaXMuX21heWJlRW5hYmxlU21vb3RoU2Nyb2xsKCk7XG4gICAgaWYgKHRoaXMuX29ic2VydmVyKSB7XG4gICAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX29ic2VydmVyID0gdGhpcy5fZ2V0TmV3T2JzZXJ2ZXIoKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHRoaXMuX29ic2VydmFibGVTZWN0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgdGhpcy5fb2JzZXJ2ZXIub2JzZXJ2ZShzZWN0aW9uKTtcbiAgICB9XG4gIH1cbiAgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICAvLyBUT0RPOiBvbiB2NiB0YXJnZXQgc2hvdWxkIGJlIGdpdmVuIGV4cGxpY2l0bHkgJiByZW1vdmUgdGhlIHt0YXJnZXQ6ICdzcy10YXJnZXQnfSBjYXNlXG4gICAgY29uZmlnLnRhcmdldCA9IGdldEVsZW1lbnQoY29uZmlnLnRhcmdldCkgfHwgZG9jdW1lbnQuYm9keTtcblxuICAgIC8vIFRPRE86IHY2IE9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnMuIFVzZSByb290TWFyZ2luIG9ubHlcbiAgICBjb25maWcucm9vdE1hcmdpbiA9IGNvbmZpZy5vZmZzZXQgPyBgJHtjb25maWcub2Zmc2V0fXB4IDBweCAtMzAlYCA6IGNvbmZpZy5yb290TWFyZ2luO1xuICAgIGlmICh0eXBlb2YgY29uZmlnLnRocmVzaG9sZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbmZpZy50aHJlc2hvbGQgPSBjb25maWcudGhyZXNob2xkLnNwbGl0KCcsJykubWFwKHZhbHVlID0+IE51bWJlci5wYXJzZUZsb2F0KHZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG4gIH1cbiAgX21heWJlRW5hYmxlU21vb3RoU2Nyb2xsKCkge1xuICAgIGlmICghdGhpcy5fY29uZmlnLnNtb290aFNjcm9sbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHVucmVnaXN0ZXIgYW55IHByZXZpb3VzIGxpc3RlbmVyc1xuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fY29uZmlnLnRhcmdldCwgRVZFTlRfQ0xJQ0spO1xuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9jb25maWcudGFyZ2V0LCBFVkVOVF9DTElDSywgU0VMRUNUT1JfVEFSR0VUX0xJTktTLCBldmVudCA9PiB7XG4gICAgICBjb25zdCBvYnNlcnZhYmxlU2VjdGlvbiA9IHRoaXMuX29ic2VydmFibGVTZWN0aW9ucy5nZXQoZXZlbnQudGFyZ2V0Lmhhc2gpO1xuICAgICAgaWYgKG9ic2VydmFibGVTZWN0aW9uKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLl9yb290RWxlbWVudCB8fCB3aW5kb3c7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IG9ic2VydmFibGVTZWN0aW9uLm9mZnNldFRvcCAtIHRoaXMuX2VsZW1lbnQub2Zmc2V0VG9wO1xuICAgICAgICBpZiAocm9vdC5zY3JvbGxUbykge1xuICAgICAgICAgIHJvb3Quc2Nyb2xsVG8oe1xuICAgICAgICAgICAgdG9wOiBoZWlnaHQsXG4gICAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCdcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaHJvbWUgNjAgZG9lc24ndCBzdXBwb3J0IGBzY3JvbGxUb2BcbiAgICAgICAgcm9vdC5zY3JvbGxUb3AgPSBoZWlnaHQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgX2dldE5ld09ic2VydmVyKCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICByb290OiB0aGlzLl9yb290RWxlbWVudCxcbiAgICAgIHRocmVzaG9sZDogdGhpcy5fY29uZmlnLnRocmVzaG9sZCxcbiAgICAgIHJvb3RNYXJnaW46IHRoaXMuX2NvbmZpZy5yb290TWFyZ2luXG4gICAgfTtcbiAgICByZXR1cm4gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGVudHJpZXMgPT4gdGhpcy5fb2JzZXJ2ZXJDYWxsYmFjayhlbnRyaWVzKSwgb3B0aW9ucyk7XG4gIH1cblxuICAvLyBUaGUgbG9naWMgb2Ygc2VsZWN0aW9uXG4gIF9vYnNlcnZlckNhbGxiYWNrKGVudHJpZXMpIHtcbiAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gZW50cnkgPT4gdGhpcy5fdGFyZ2V0TGlua3MuZ2V0KGAjJHtlbnRyeS50YXJnZXQuaWR9YCk7XG4gICAgY29uc3QgYWN0aXZhdGUgPSBlbnRyeSA9PiB7XG4gICAgICB0aGlzLl9wcmV2aW91c1Njcm9sbERhdGEudmlzaWJsZUVudHJ5VG9wID0gZW50cnkudGFyZ2V0Lm9mZnNldFRvcDtcbiAgICAgIHRoaXMuX3Byb2Nlc3ModGFyZ2V0RWxlbWVudChlbnRyeSkpO1xuICAgIH07XG4gICAgY29uc3QgcGFyZW50U2Nyb2xsVG9wID0gKHRoaXMuX3Jvb3RFbGVtZW50IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuc2Nyb2xsVG9wO1xuICAgIGNvbnN0IHVzZXJTY3JvbGxzRG93biA9IHBhcmVudFNjcm9sbFRvcCA+PSB0aGlzLl9wcmV2aW91c1Njcm9sbERhdGEucGFyZW50U2Nyb2xsVG9wO1xuICAgIHRoaXMuX3ByZXZpb3VzU2Nyb2xsRGF0YS5wYXJlbnRTY3JvbGxUb3AgPSBwYXJlbnRTY3JvbGxUb3A7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBpZiAoIWVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZVRhcmdldCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2NsZWFyQWN0aXZlQ2xhc3ModGFyZ2V0RWxlbWVudChlbnRyeSkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVudHJ5SXNMb3dlclRoYW5QcmV2aW91cyA9IGVudHJ5LnRhcmdldC5vZmZzZXRUb3AgPj0gdGhpcy5fcHJldmlvdXNTY3JvbGxEYXRhLnZpc2libGVFbnRyeVRvcDtcbiAgICAgIC8vIGlmIHdlIGFyZSBzY3JvbGxpbmcgZG93biwgcGljayB0aGUgYmlnZ2VyIG9mZnNldFRvcFxuICAgICAgaWYgKHVzZXJTY3JvbGxzRG93biAmJiBlbnRyeUlzTG93ZXJUaGFuUHJldmlvdXMpIHtcbiAgICAgICAgYWN0aXZhdGUoZW50cnkpO1xuICAgICAgICAvLyBpZiBwYXJlbnQgaXNuJ3Qgc2Nyb2xsZWQsIGxldCdzIGtlZXAgdGhlIGZpcnN0IHZpc2libGUgaXRlbSwgYnJlYWtpbmcgdGhlIGl0ZXJhdGlvblxuICAgICAgICBpZiAoIXBhcmVudFNjcm9sbFRvcCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgd2UgYXJlIHNjcm9sbGluZyB1cCwgcGljayB0aGUgc21hbGxlc3Qgb2Zmc2V0VG9wXG4gICAgICBpZiAoIXVzZXJTY3JvbGxzRG93biAmJiAhZW50cnlJc0xvd2VyVGhhblByZXZpb3VzKSB7XG4gICAgICAgIGFjdGl2YXRlKGVudHJ5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgX2luaXRpYWxpemVUYXJnZXRzQW5kT2JzZXJ2YWJsZXMoKSB7XG4gICAgdGhpcy5fdGFyZ2V0TGlua3MgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5fb2JzZXJ2YWJsZVNlY3Rpb25zID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IHRhcmdldExpbmtzID0gU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9UQVJHRVRfTElOS1MsIHRoaXMuX2NvbmZpZy50YXJnZXQpO1xuICAgIGZvciAoY29uc3QgYW5jaG9yIG9mIHRhcmdldExpbmtzKSB7XG4gICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgYW5jaG9yIGhhcyBhbiBpZCBhbmQgaXMgbm90IGRpc2FibGVkXG4gICAgICBpZiAoIWFuY2hvci5oYXNoIHx8IGlzRGlzYWJsZWQoYW5jaG9yKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9ic2VydmFibGVTZWN0aW9uID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShkZWNvZGVVUkkoYW5jaG9yLmhhc2gpLCB0aGlzLl9lbGVtZW50KTtcblxuICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIG9ic2VydmFibGVTZWN0aW9uIGV4aXN0cyAmIGlzIHZpc2libGVcbiAgICAgIGlmIChpc1Zpc2libGUob2JzZXJ2YWJsZVNlY3Rpb24pKSB7XG4gICAgICAgIHRoaXMuX3RhcmdldExpbmtzLnNldChkZWNvZGVVUkkoYW5jaG9yLmhhc2gpLCBhbmNob3IpO1xuICAgICAgICB0aGlzLl9vYnNlcnZhYmxlU2VjdGlvbnMuc2V0KGFuY2hvci5oYXNoLCBvYnNlcnZhYmxlU2VjdGlvbik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIF9wcm9jZXNzKHRhcmdldCkge1xuICAgIGlmICh0aGlzLl9hY3RpdmVUYXJnZXQgPT09IHRhcmdldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jbGVhckFjdGl2ZUNsYXNzKHRoaXMuX2NvbmZpZy50YXJnZXQpO1xuICAgIHRoaXMuX2FjdGl2ZVRhcmdldCA9IHRhcmdldDtcbiAgICB0YXJnZXQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSQxKTtcbiAgICB0aGlzLl9hY3RpdmF0ZVBhcmVudHModGFyZ2V0KTtcbiAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9BQ1RJVkFURSwge1xuICAgICAgcmVsYXRlZFRhcmdldDogdGFyZ2V0XG4gICAgfSk7XG4gIH1cbiAgX2FjdGl2YXRlUGFyZW50cyh0YXJnZXQpIHtcbiAgICAvLyBBY3RpdmF0ZSBkcm9wZG93biBwYXJlbnRzXG4gICAgaWYgKHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9EUk9QRE9XTl9JVEVNKSkge1xuICAgICAgU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUkMSwgdGFyZ2V0LmNsb3Nlc3QoU0VMRUNUT1JfRFJPUERPV04pKS5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFJDEpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGxpc3RHcm91cCBvZiBTZWxlY3RvckVuZ2luZS5wYXJlbnRzKHRhcmdldCwgU0VMRUNUT1JfTkFWX0xJU1RfR1JPVVApKSB7XG4gICAgICAvLyBTZXQgdHJpZ2dlcmVkIGxpbmtzIHBhcmVudHMgYXMgYWN0aXZlXG4gICAgICAvLyBXaXRoIGJvdGggPHVsPiBhbmQgPG5hdj4gbWFya3VwIGEgcGFyZW50IGlzIHRoZSBwcmV2aW91cyBzaWJsaW5nIG9mIGFueSBuYXYgYW5jZXN0b3JcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBTZWxlY3RvckVuZ2luZS5wcmV2KGxpc3RHcm91cCwgU0VMRUNUT1JfTElOS19JVEVNUykpIHtcbiAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFJDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBfY2xlYXJBY3RpdmVDbGFzcyhwYXJlbnQpIHtcbiAgICBwYXJlbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSQxKTtcbiAgICBjb25zdCBhY3RpdmVOb2RlcyA9IFNlbGVjdG9yRW5naW5lLmZpbmQoYCR7U0VMRUNUT1JfVEFSR0VUX0xJTktTfS4ke0NMQVNTX05BTUVfQUNUSVZFJDF9YCwgcGFyZW50KTtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgYWN0aXZlTm9kZXMpIHtcbiAgICAgIG5vZGUuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSQxKTtcbiAgICB9XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBTY3JvbGxTcHkuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgfVxuICAgICAgZGF0YVtjb25maWddKCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbih3aW5kb3csIEVWRU5UX0xPQURfREFUQV9BUEkkMSwgKCkgPT4ge1xuICBmb3IgKGNvbnN0IHNweSBvZiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfU1BZKSkge1xuICAgIFNjcm9sbFNweS5nZXRPckNyZWF0ZUluc3RhbmNlKHNweSk7XG4gIH1cbn0pO1xuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihTY3JvbGxTcHkpO1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdGFiLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUkMSA9ICd0YWInO1xuY29uc3QgREFUQV9LRVkkMSA9ICdicy50YWInO1xuY29uc3QgRVZFTlRfS0VZJDEgPSBgLiR7REFUQV9LRVkkMX1gO1xuY29uc3QgRVZFTlRfSElERSQxID0gYGhpZGUke0VWRU5UX0tFWSQxfWA7XG5jb25zdCBFVkVOVF9ISURERU4kMSA9IGBoaWRkZW4ke0VWRU5UX0tFWSQxfWA7XG5jb25zdCBFVkVOVF9TSE9XJDEgPSBgc2hvdyR7RVZFTlRfS0VZJDF9YDtcbmNvbnN0IEVWRU5UX1NIT1dOJDEgPSBgc2hvd24ke0VWRU5UX0tFWSQxfWA7XG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSA9IGBjbGljayR7RVZFTlRfS0VZJDF9YDtcbmNvbnN0IEVWRU5UX0tFWURPV04gPSBga2V5ZG93biR7RVZFTlRfS0VZJDF9YDtcbmNvbnN0IEVWRU5UX0xPQURfREFUQV9BUEkgPSBgbG9hZCR7RVZFTlRfS0VZJDF9YDtcbmNvbnN0IEFSUk9XX0xFRlRfS0VZID0gJ0Fycm93TGVmdCc7XG5jb25zdCBBUlJPV19SSUdIVF9LRVkgPSAnQXJyb3dSaWdodCc7XG5jb25zdCBBUlJPV19VUF9LRVkgPSAnQXJyb3dVcCc7XG5jb25zdCBBUlJPV19ET1dOX0tFWSA9ICdBcnJvd0Rvd24nO1xuY29uc3QgSE9NRV9LRVkgPSAnSG9tZSc7XG5jb25zdCBFTkRfS0VZID0gJ0VuZCc7XG5jb25zdCBDTEFTU19OQU1FX0FDVElWRSA9ICdhY3RpdmUnO1xuY29uc3QgQ0xBU1NfTkFNRV9GQURFJDEgPSAnZmFkZSc7XG5jb25zdCBDTEFTU19OQU1FX1NIT1ckMSA9ICdzaG93JztcbmNvbnN0IENMQVNTX0RST1BET1dOID0gJ2Ryb3Bkb3duJztcbmNvbnN0IFNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSA9ICcuZHJvcGRvd24tdG9nZ2xlJztcbmNvbnN0IFNFTEVDVE9SX0RST1BET1dOX01FTlUgPSAnLmRyb3Bkb3duLW1lbnUnO1xuY29uc3QgTk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRSA9IGA6bm90KCR7U0VMRUNUT1JfRFJPUERPV05fVE9HR0xFfSlgO1xuY29uc3QgU0VMRUNUT1JfVEFCX1BBTkVMID0gJy5saXN0LWdyb3VwLCAubmF2LCBbcm9sZT1cInRhYmxpc3RcIl0nO1xuY29uc3QgU0VMRUNUT1JfT1VURVIgPSAnLm5hdi1pdGVtLCAubGlzdC1ncm91cC1pdGVtJztcbmNvbnN0IFNFTEVDVE9SX0lOTkVSID0gYC5uYXYtbGluayR7Tk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRX0sIC5saXN0LWdyb3VwLWl0ZW0ke05PVF9TRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEV9LCBbcm9sZT1cInRhYlwiXSR7Tk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRX1gO1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUgPSAnW2RhdGEtYnMtdG9nZ2xlPVwidGFiXCJdLCBbZGF0YS1icy10b2dnbGU9XCJwaWxsXCJdLCBbZGF0YS1icy10b2dnbGU9XCJsaXN0XCJdJzsgLy8gVE9ETzogY291bGQgb25seSBiZSBgdGFiYCBpbiB2NlxuY29uc3QgU0VMRUNUT1JfSU5ORVJfRUxFTSA9IGAke1NFTEVDVE9SX0lOTkVSfSwgJHtTRUxFQ1RPUl9EQVRBX1RPR0dMRX1gO1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEVfQUNUSVZFID0gYC4ke0NMQVNTX05BTUVfQUNUSVZFfVtkYXRhLWJzLXRvZ2dsZT1cInRhYlwiXSwgLiR7Q0xBU1NfTkFNRV9BQ1RJVkV9W2RhdGEtYnMtdG9nZ2xlPVwicGlsbFwiXSwgLiR7Q0xBU1NfTkFNRV9BQ1RJVkV9W2RhdGEtYnMtdG9nZ2xlPVwibGlzdFwiXWA7XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIFRhYiBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50KSB7XG4gICAgc3VwZXIoZWxlbWVudCk7XG4gICAgdGhpcy5fcGFyZW50ID0gdGhpcy5fZWxlbWVudC5jbG9zZXN0KFNFTEVDVE9SX1RBQl9QQU5FTCk7XG4gICAgaWYgKCF0aGlzLl9wYXJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICAgIC8vIFRPRE86IHNob3VsZCB0aHJvdyBleGNlcHRpb24gaW4gdjZcbiAgICAgIC8vIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7ZWxlbWVudC5vdXRlckhUTUx9IGhhcyBub3QgYSB2YWxpZCBwYXJlbnQgJHtTRUxFQ1RPUl9JTk5FUl9FTEVNfWApXG4gICAgfVxuXG4gICAgLy8gU2V0IHVwIGluaXRpYWwgYXJpYSBhdHRyaWJ1dGVzXG4gICAgdGhpcy5fc2V0SW5pdGlhbEF0dHJpYnV0ZXModGhpcy5fcGFyZW50LCB0aGlzLl9nZXRDaGlsZHJlbigpKTtcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZRE9XTiwgZXZlbnQgPT4gdGhpcy5fa2V5ZG93bihldmVudCkpO1xuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUUkMTtcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBzaG93KCkge1xuICAgIC8vIFNob3dzIHRoaXMgZWxlbSBhbmQgZGVhY3RpdmF0ZSB0aGUgYWN0aXZlIHNpYmxpbmcgaWYgZXhpc3RzXG4gICAgY29uc3QgaW5uZXJFbGVtID0gdGhpcy5fZWxlbWVudDtcbiAgICBpZiAodGhpcy5fZWxlbUlzQWN0aXZlKGlubmVyRWxlbSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTZWFyY2ggZm9yIGFjdGl2ZSB0YWIgb24gc2FtZSBwYXJlbnQgdG8gZGVhY3RpdmF0ZSBpdFxuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuX2dldEFjdGl2ZUVsZW0oKTtcbiAgICBjb25zdCBoaWRlRXZlbnQgPSBhY3RpdmUgPyBFdmVudEhhbmRsZXIudHJpZ2dlcihhY3RpdmUsIEVWRU5UX0hJREUkMSwge1xuICAgICAgcmVsYXRlZFRhcmdldDogaW5uZXJFbGVtXG4gICAgfSkgOiBudWxsO1xuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKGlubmVyRWxlbSwgRVZFTlRfU0hPVyQxLCB7XG4gICAgICByZWxhdGVkVGFyZ2V0OiBhY3RpdmVcbiAgICB9KTtcbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgfHwgaGlkZUV2ZW50ICYmIGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2RlYWN0aXZhdGUoYWN0aXZlLCBpbm5lckVsZW0pO1xuICAgIHRoaXMuX2FjdGl2YXRlKGlubmVyRWxlbSwgYWN0aXZlKTtcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2FjdGl2YXRlKGVsZW1lbnQsIHJlbGF0ZWRFbGVtKSB7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSk7XG4gICAgdGhpcy5fYWN0aXZhdGUoU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3RvcihlbGVtZW50KSk7IC8vIFNlYXJjaCBhbmQgYWN0aXZhdGUvc2hvdyB0aGUgcHJvcGVyIHNlY3Rpb25cblxuICAgIGNvbnN0IGNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdyb2xlJykgIT09ICd0YWInKSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1ckMSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpO1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCB0cnVlKTtcbiAgICAgIHRoaXMuX3RvZ2dsZURyb3BEb3duKGVsZW1lbnQsIHRydWUpO1xuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIoZWxlbWVudCwgRVZFTlRfU0hPV04kMSwge1xuICAgICAgICByZWxhdGVkVGFyZ2V0OiByZWxhdGVkRWxlbVxuICAgICAgfSk7XG4gICAgfTtcbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCBlbGVtZW50LCBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0ZBREUkMSkpO1xuICB9XG4gIF9kZWFjdGl2YXRlKGVsZW1lbnQsIHJlbGF0ZWRFbGVtKSB7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSk7XG4gICAgZWxlbWVudC5ibHVyKCk7XG4gICAgdGhpcy5fZGVhY3RpdmF0ZShTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKGVsZW1lbnQpKTsgLy8gU2VhcmNoIGFuZCBkZWFjdGl2YXRlIHRoZSBzaG93biBzZWN0aW9uIHRvb1xuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSAhPT0gJ3RhYicpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVyQxKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCBmYWxzZSk7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKTtcbiAgICAgIHRoaXMuX3RvZ2dsZURyb3BEb3duKGVsZW1lbnQsIGZhbHNlKTtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKGVsZW1lbnQsIEVWRU5UX0hJRERFTiQxLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHJlbGF0ZWRFbGVtXG4gICAgICB9KTtcbiAgICB9O1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIGVsZW1lbnQsIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRkFERSQxKSk7XG4gIH1cbiAgX2tleWRvd24oZXZlbnQpIHtcbiAgICBpZiAoIVtBUlJPV19MRUZUX0tFWSwgQVJST1dfUklHSFRfS0VZLCBBUlJPV19VUF9LRVksIEFSUk9XX0RPV05fS0VZLCBIT01FX0tFWSwgRU5EX0tFWV0uaW5jbHVkZXMoZXZlbnQua2V5KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgLy8gc3RvcFByb3BhZ2F0aW9uL3ByZXZlbnREZWZhdWx0IGJvdGggYWRkZWQgdG8gc3VwcG9ydCB1cC9kb3duIGtleXMgd2l0aG91dCBzY3JvbGxpbmcgdGhlIHBhZ2VcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5fZ2V0Q2hpbGRyZW4oKS5maWx0ZXIoZWxlbWVudCA9PiAhaXNEaXNhYmxlZChlbGVtZW50KSk7XG4gICAgbGV0IG5leHRBY3RpdmVFbGVtZW50O1xuICAgIGlmIChbSE9NRV9LRVksIEVORF9LRVldLmluY2x1ZGVzKGV2ZW50LmtleSkpIHtcbiAgICAgIG5leHRBY3RpdmVFbGVtZW50ID0gY2hpbGRyZW5bZXZlbnQua2V5ID09PSBIT01FX0tFWSA/IDAgOiBjaGlsZHJlbi5sZW5ndGggLSAxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaXNOZXh0ID0gW0FSUk9XX1JJR0hUX0tFWSwgQVJST1dfRE9XTl9LRVldLmluY2x1ZGVzKGV2ZW50LmtleSk7XG4gICAgICBuZXh0QWN0aXZlRWxlbWVudCA9IGdldE5leHRBY3RpdmVFbGVtZW50KGNoaWxkcmVuLCBldmVudC50YXJnZXQsIGlzTmV4dCwgdHJ1ZSk7XG4gICAgfVxuICAgIGlmIChuZXh0QWN0aXZlRWxlbWVudCkge1xuICAgICAgbmV4dEFjdGl2ZUVsZW1lbnQuZm9jdXMoe1xuICAgICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIFRhYi5nZXRPckNyZWF0ZUluc3RhbmNlKG5leHRBY3RpdmVFbGVtZW50KS5zaG93KCk7XG4gICAgfVxuICB9XG4gIF9nZXRDaGlsZHJlbigpIHtcbiAgICAvLyBjb2xsZWN0aW9uIG9mIGlubmVyIGVsZW1lbnRzXG4gICAgcmV0dXJuIFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfSU5ORVJfRUxFTSwgdGhpcy5fcGFyZW50KTtcbiAgfVxuICBfZ2V0QWN0aXZlRWxlbSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0Q2hpbGRyZW4oKS5maW5kKGNoaWxkID0+IHRoaXMuX2VsZW1Jc0FjdGl2ZShjaGlsZCkpIHx8IG51bGw7XG4gIH1cbiAgX3NldEluaXRpYWxBdHRyaWJ1dGVzKHBhcmVudCwgY2hpbGRyZW4pIHtcbiAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyhwYXJlbnQsICdyb2xlJywgJ3RhYmxpc3QnKTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICB0aGlzLl9zZXRJbml0aWFsQXR0cmlidXRlc09uQ2hpbGQoY2hpbGQpO1xuICAgIH1cbiAgfVxuICBfc2V0SW5pdGlhbEF0dHJpYnV0ZXNPbkNoaWxkKGNoaWxkKSB7XG4gICAgY2hpbGQgPSB0aGlzLl9nZXRJbm5lckVsZW1lbnQoY2hpbGQpO1xuICAgIGNvbnN0IGlzQWN0aXZlID0gdGhpcy5fZWxlbUlzQWN0aXZlKGNoaWxkKTtcbiAgICBjb25zdCBvdXRlckVsZW0gPSB0aGlzLl9nZXRPdXRlckVsZW1lbnQoY2hpbGQpO1xuICAgIGNoaWxkLnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsIGlzQWN0aXZlKTtcbiAgICBpZiAob3V0ZXJFbGVtICE9PSBjaGlsZCkge1xuICAgICAgdGhpcy5fc2V0QXR0cmlidXRlSWZOb3RFeGlzdHMob3V0ZXJFbGVtLCAncm9sZScsICdwcmVzZW50YXRpb24nKTtcbiAgICB9XG4gICAgaWYgKCFpc0FjdGl2ZSkge1xuICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICctMScpO1xuICAgIH1cbiAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyhjaGlsZCwgJ3JvbGUnLCAndGFiJyk7XG5cbiAgICAvLyBzZXQgYXR0cmlidXRlcyB0byB0aGUgcmVsYXRlZCBwYW5lbCB0b29cbiAgICB0aGlzLl9zZXRJbml0aWFsQXR0cmlidXRlc09uVGFyZ2V0UGFuZWwoY2hpbGQpO1xuICB9XG4gIF9zZXRJbml0aWFsQXR0cmlidXRlc09uVGFyZ2V0UGFuZWwoY2hpbGQpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKGNoaWxkKTtcbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyh0YXJnZXQsICdyb2xlJywgJ3RhYnBhbmVsJyk7XG4gICAgaWYgKGNoaWxkLmlkKSB7XG4gICAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyh0YXJnZXQsICdhcmlhLWxhYmVsbGVkYnknLCBgJHtjaGlsZC5pZH1gKTtcbiAgICB9XG4gIH1cbiAgX3RvZ2dsZURyb3BEb3duKGVsZW1lbnQsIG9wZW4pIHtcbiAgICBjb25zdCBvdXRlckVsZW0gPSB0aGlzLl9nZXRPdXRlckVsZW1lbnQoZWxlbWVudCk7XG4gICAgaWYgKCFvdXRlckVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX0RST1BET1dOKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0b2dnbGUgPSAoc2VsZWN0b3IsIGNsYXNzTmFtZSkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoc2VsZWN0b3IsIG91dGVyRWxlbSk7XG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoY2xhc3NOYW1lLCBvcGVuKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRvZ2dsZShTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUsIENMQVNTX05BTUVfQUNUSVZFKTtcbiAgICB0b2dnbGUoU0VMRUNUT1JfRFJPUERPV05fTUVOVSwgQ0xBU1NfTkFNRV9TSE9XJDEpO1xuICAgIG91dGVyRWxlbS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBvcGVuKTtcbiAgfVxuICBfc2V0QXR0cmlidXRlSWZOb3RFeGlzdHMoZWxlbWVudCwgYXR0cmlidXRlLCB2YWx1ZSkge1xuICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlKSkge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIF9lbGVtSXNBY3RpdmUoZWxlbSkge1xuICAgIHJldHVybiBlbGVtLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0FDVElWRSk7XG4gIH1cblxuICAvLyBUcnkgdG8gZ2V0IHRoZSBpbm5lciBlbGVtZW50ICh1c3VhbGx5IHRoZSAubmF2LWxpbmspXG4gIF9nZXRJbm5lckVsZW1lbnQoZWxlbSkge1xuICAgIHJldHVybiBlbGVtLm1hdGNoZXMoU0VMRUNUT1JfSU5ORVJfRUxFTSkgPyBlbGVtIDogU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9JTk5FUl9FTEVNLCBlbGVtKTtcbiAgfVxuXG4gIC8vIFRyeSB0byBnZXQgdGhlIG91dGVyIGVsZW1lbnQgKHVzdWFsbHkgdGhlIC5uYXYtaXRlbSlcbiAgX2dldE91dGVyRWxlbWVudChlbGVtKSB7XG4gICAgcmV0dXJuIGVsZW0uY2xvc2VzdChTRUxFQ1RPUl9PVVRFUikgfHwgZWxlbTtcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFRhYi5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMpO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgfVxuICAgICAgZGF0YVtjb25maWddKCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEksIFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgaWYgKFsnQScsICdBUkVBJ10uaW5jbHVkZXModGhpcy50YWdOYW1lKSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbiAgaWYgKGlzRGlzYWJsZWQodGhpcykpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgVGFiLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcykuc2hvdygpO1xufSk7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBvbiBmb2N1c1xuICovXG5FdmVudEhhbmRsZXIub24od2luZG93LCBFVkVOVF9MT0FEX0RBVEFfQVBJLCAoKSA9PiB7XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfVE9HR0xFX0FDVElWRSkpIHtcbiAgICBUYWIuZ2V0T3JDcmVhdGVJbnN0YW5jZShlbGVtZW50KTtcbiAgfVxufSk7XG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihUYWIpO1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdG9hc3QuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICd0b2FzdCc7XG5jb25zdCBEQVRBX0tFWSA9ICdicy50b2FzdCc7XG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YDtcbmNvbnN0IEVWRU5UX01PVVNFT1ZFUiA9IGBtb3VzZW92ZXIke0VWRU5UX0tFWX1gO1xuY29uc3QgRVZFTlRfTU9VU0VPVVQgPSBgbW91c2VvdXQke0VWRU5UX0tFWX1gO1xuY29uc3QgRVZFTlRfRk9DVVNJTiA9IGBmb2N1c2luJHtFVkVOVF9LRVl9YDtcbmNvbnN0IEVWRU5UX0ZPQ1VTT1VUID0gYGZvY3Vzb3V0JHtFVkVOVF9LRVl9YDtcbmNvbnN0IEVWRU5UX0hJREUgPSBgaGlkZSR7RVZFTlRfS0VZfWA7XG5jb25zdCBFVkVOVF9ISURERU4gPSBgaGlkZGVuJHtFVkVOVF9LRVl9YDtcbmNvbnN0IEVWRU5UX1NIT1cgPSBgc2hvdyR7RVZFTlRfS0VZfWA7XG5jb25zdCBFVkVOVF9TSE9XTiA9IGBzaG93biR7RVZFTlRfS0VZfWA7XG5jb25zdCBDTEFTU19OQU1FX0ZBREUgPSAnZmFkZSc7XG5jb25zdCBDTEFTU19OQU1FX0hJREUgPSAnaGlkZSc7IC8vIEBkZXByZWNhdGVkIC0ga2VwdCBoZXJlIG9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5jb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdyc7XG5jb25zdCBDTEFTU19OQU1FX1NIT1dJTkcgPSAnc2hvd2luZyc7XG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgYW5pbWF0aW9uOiAnYm9vbGVhbicsXG4gIGF1dG9oaWRlOiAnYm9vbGVhbicsXG4gIGRlbGF5OiAnbnVtYmVyJ1xufTtcbmNvbnN0IERlZmF1bHQgPSB7XG4gIGFuaW1hdGlvbjogdHJ1ZSxcbiAgYXV0b2hpZGU6IHRydWUsXG4gIGRlbGF5OiA1MDAwXG59O1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBUb2FzdCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpO1xuICAgIHRoaXMuX3RpbWVvdXQgPSBudWxsO1xuICAgIHRoaXMuX2hhc01vdXNlSW50ZXJhY3Rpb24gPSBmYWxzZTtcbiAgICB0aGlzLl9oYXNLZXlib2FyZEludGVyYWN0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5fc2V0TGlzdGVuZXJzKCk7XG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdDtcbiAgfVxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZTtcbiAgfVxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUU7XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgc2hvdygpIHtcbiAgICBjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XKTtcbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fY2xlYXJUaW1lb3V0KCk7XG4gICAgaWYgKHRoaXMuX2NvbmZpZy5hbmltYXRpb24pIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0ZBREUpO1xuICAgIH1cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1dJTkcpO1xuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPV04pO1xuICAgICAgdGhpcy5fbWF5YmVTY2hlZHVsZUhpZGUoKTtcbiAgICB9O1xuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0hJREUpOyAvLyBAZGVwcmVjYXRlZFxuICAgIHJlZmxvdyh0aGlzLl9lbGVtZW50KTtcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XLCBDTEFTU19OQU1FX1NIT1dJTkcpO1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMuX2VsZW1lbnQsIHRoaXMuX2NvbmZpZy5hbmltYXRpb24pO1xuICB9XG4gIGhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLmlzU2hvd24oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFKTtcbiAgICBpZiAoaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9ISURFKTsgLy8gQGRlcHJlY2F0ZWRcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1dJTkcsIENMQVNTX05BTUVfU0hPVyk7XG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURERU4pO1xuICAgIH07XG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPV0lORyk7XG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgdGhpcy5fZWxlbWVudCwgdGhpcy5fY29uZmlnLmFuaW1hdGlvbik7XG4gIH1cbiAgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9jbGVhclRpbWVvdXQoKTtcbiAgICBpZiAodGhpcy5pc1Nob3duKCkpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpO1xuICAgIH1cbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cbiAgaXNTaG93bigpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TSE9XKTtcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX21heWJlU2NoZWR1bGVIaWRlKCkge1xuICAgIGlmICghdGhpcy5fY29uZmlnLmF1dG9oaWRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9oYXNNb3VzZUludGVyYWN0aW9uIHx8IHRoaXMuX2hhc0tleWJvYXJkSW50ZXJhY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfSwgdGhpcy5fY29uZmlnLmRlbGF5KTtcbiAgfVxuICBfb25JbnRlcmFjdGlvbihldmVudCwgaXNJbnRlcmFjdGluZykge1xuICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgY2FzZSAnbW91c2VvdmVyJzpcbiAgICAgIGNhc2UgJ21vdXNlb3V0JzpcbiAgICAgICAge1xuICAgICAgICAgIHRoaXMuX2hhc01vdXNlSW50ZXJhY3Rpb24gPSBpc0ludGVyYWN0aW5nO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICBjYXNlICdmb2N1c2luJzpcbiAgICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICAgICAge1xuICAgICAgICAgIHRoaXMuX2hhc0tleWJvYXJkSW50ZXJhY3Rpb24gPSBpc0ludGVyYWN0aW5nO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0ludGVyYWN0aW5nKSB7XG4gICAgICB0aGlzLl9jbGVhclRpbWVvdXQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV4dEVsZW1lbnQgPSBldmVudC5yZWxhdGVkVGFyZ2V0O1xuICAgIGlmICh0aGlzLl9lbGVtZW50ID09PSBuZXh0RWxlbWVudCB8fCB0aGlzLl9lbGVtZW50LmNvbnRhaW5zKG5leHRFbGVtZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9tYXliZVNjaGVkdWxlSGlkZSgpO1xuICB9XG4gIF9zZXRMaXN0ZW5lcnMoKSB7XG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFT1ZFUiwgZXZlbnQgPT4gdGhpcy5fb25JbnRlcmFjdGlvbihldmVudCwgdHJ1ZSkpO1xuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9NT1VTRU9VVCwgZXZlbnQgPT4gdGhpcy5fb25JbnRlcmFjdGlvbihldmVudCwgZmFsc2UpKTtcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfRk9DVVNJTiwgZXZlbnQgPT4gdGhpcy5fb25JbnRlcmFjdGlvbihldmVudCwgdHJ1ZSkpO1xuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9GT0NVU09VVCwgZXZlbnQgPT4gdGhpcy5fb25JbnRlcmFjdGlvbihldmVudCwgZmFsc2UpKTtcbiAgfVxuICBfY2xlYXJUaW1lb3V0KCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KTtcbiAgICB0aGlzLl90aW1lb3V0ID0gbnVsbDtcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFRvYXN0LmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKTtcbiAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgICB9XG4gICAgICAgIGRhdGFbY29uZmlnXSh0aGlzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuZW5hYmxlRGlzbWlzc1RyaWdnZXIoVG9hc3QpO1xuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihUb2FzdCk7XG5cbmV4cG9ydCB7IEFsZXJ0LCBCdXR0b24sIENhcm91c2VsLCBDb2xsYXBzZSwgRHJvcGRvd24sIE1vZGFsLCBPZmZjYW52YXMsIFBvcG92ZXIsIFNjcm9sbFNweSwgVGFiLCBUb2FzdCwgVG9vbHRpcCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Ym9vdHN0cmFwLmVzbS5qcy5tYXBcbiIsIi8qIVxuICogVG9hc3RpZnkganMgMS4xMi4wXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXB2YXJ1bi90b2FzdGlmeS1qc1xuICogQGxpY2Vuc2UgTUlUIGxpY2Vuc2VkXG4gKlxuICogQ29weXJpZ2h0IChDKSAyMDE4IFZhcnVuIEEgUFxuICovXG4oZnVuY3Rpb24ocm9vdCwgZmFjdG9yeSkge1xuICBpZiAodHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICB9IGVsc2Uge1xuICAgIHJvb3QuVG9hc3RpZnkgPSBmYWN0b3J5KCk7XG4gIH1cbn0pKHRoaXMsIGZ1bmN0aW9uKGdsb2JhbCkge1xuICAvLyBPYmplY3QgaW5pdGlhbGl6YXRpb25cbiAgdmFyIFRvYXN0aWZ5ID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgLy8gUmV0dXJuaW5nIGEgbmV3IGluaXQgb2JqZWN0XG4gICAgICByZXR1cm4gbmV3IFRvYXN0aWZ5LmxpYi5pbml0KG9wdGlvbnMpO1xuICAgIH0sXG4gICAgLy8gTGlicmFyeSB2ZXJzaW9uXG4gICAgdmVyc2lvbiA9IFwiMS4xMi4wXCI7XG5cbiAgLy8gU2V0IHRoZSBkZWZhdWx0IGdsb2JhbCBvcHRpb25zXG4gIFRvYXN0aWZ5LmRlZmF1bHRzID0ge1xuICAgIG9sZGVzdEZpcnN0OiB0cnVlLFxuICAgIHRleHQ6IFwiVG9hc3RpZnkgaXMgYXdlc29tZSFcIixcbiAgICBub2RlOiB1bmRlZmluZWQsXG4gICAgZHVyYXRpb246IDMwMDAsXG4gICAgc2VsZWN0b3I6IHVuZGVmaW5lZCxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gKCkge1xuICAgIH0sXG4gICAgZGVzdGluYXRpb246IHVuZGVmaW5lZCxcbiAgICBuZXdXaW5kb3c6IGZhbHNlLFxuICAgIGNsb3NlOiBmYWxzZSxcbiAgICBncmF2aXR5OiBcInRvYXN0aWZ5LXRvcFwiLFxuICAgIHBvc2l0aW9uTGVmdDogZmFsc2UsXG4gICAgcG9zaXRpb246ICcnLFxuICAgIGJhY2tncm91bmRDb2xvcjogJycsXG4gICAgYXZhdGFyOiBcIlwiLFxuICAgIGNsYXNzTmFtZTogXCJcIixcbiAgICBzdG9wT25Gb2N1czogdHJ1ZSxcbiAgICBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgfSxcbiAgICBvZmZzZXQ6IHt4OiAwLCB5OiAwfSxcbiAgICBlc2NhcGVNYXJrdXA6IHRydWUsXG4gICAgYXJpYUxpdmU6ICdwb2xpdGUnLFxuICAgIHN0eWxlOiB7YmFja2dyb3VuZDogJyd9XG4gIH07XG5cbiAgLy8gRGVmaW5pbmcgdGhlIHByb3RvdHlwZSBvZiB0aGUgb2JqZWN0XG4gIFRvYXN0aWZ5LmxpYiA9IFRvYXN0aWZ5LnByb3RvdHlwZSA9IHtcbiAgICB0b2FzdGlmeTogdmVyc2lvbixcblxuICAgIGNvbnN0cnVjdG9yOiBUb2FzdGlmeSxcblxuICAgIC8vIEluaXRpYWxpemluZyB0aGUgb2JqZWN0IHdpdGggcmVxdWlyZWQgcGFyYW1ldGVyc1xuICAgIGluaXQ6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgIC8vIFZlcmlmeWluZyBhbmQgdmFsaWRhdGluZyB0aGUgaW5wdXQgb2JqZWN0XG4gICAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGluZyB0aGUgb3B0aW9ucyBvYmplY3RcbiAgICAgIHRoaXMub3B0aW9ucyA9IHt9O1xuXG4gICAgICB0aGlzLnRvYXN0RWxlbWVudCA9IG51bGw7XG5cbiAgICAgIC8vIFZhbGlkYXRpbmcgdGhlIG9wdGlvbnNcbiAgICAgIHRoaXMub3B0aW9ucy50ZXh0ID0gb3B0aW9ucy50ZXh0IHx8IFRvYXN0aWZ5LmRlZmF1bHRzLnRleHQ7IC8vIERpc3BsYXkgbWVzc2FnZVxuICAgICAgdGhpcy5vcHRpb25zLm5vZGUgPSBvcHRpb25zLm5vZGUgfHwgVG9hc3RpZnkuZGVmYXVsdHMubm9kZTsgIC8vIERpc3BsYXkgY29udGVudCBhcyBub2RlXG4gICAgICB0aGlzLm9wdGlvbnMuZHVyYXRpb24gPSBvcHRpb25zLmR1cmF0aW9uID09PSAwID8gMCA6IG9wdGlvbnMuZHVyYXRpb24gfHwgVG9hc3RpZnkuZGVmYXVsdHMuZHVyYXRpb247IC8vIERpc3BsYXkgZHVyYXRpb25cbiAgICAgIHRoaXMub3B0aW9ucy5zZWxlY3RvciA9IG9wdGlvbnMuc2VsZWN0b3IgfHwgVG9hc3RpZnkuZGVmYXVsdHMuc2VsZWN0b3I7IC8vIFBhcmVudCBzZWxlY3RvclxuICAgICAgdGhpcy5vcHRpb25zLmNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjayB8fCBUb2FzdGlmeS5kZWZhdWx0cy5jYWxsYmFjazsgLy8gQ2FsbGJhY2sgYWZ0ZXIgZGlzcGxheVxuICAgICAgdGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uID0gb3B0aW9ucy5kZXN0aW5hdGlvbiB8fCBUb2FzdGlmeS5kZWZhdWx0cy5kZXN0aW5hdGlvbjsgLy8gT24tY2xpY2sgZGVzdGluYXRpb25cbiAgICAgIHRoaXMub3B0aW9ucy5uZXdXaW5kb3cgPSBvcHRpb25zLm5ld1dpbmRvdyB8fCBUb2FzdGlmeS5kZWZhdWx0cy5uZXdXaW5kb3c7IC8vIE9wZW4gZGVzdGluYXRpb24gaW4gbmV3IHdpbmRvd1xuICAgICAgdGhpcy5vcHRpb25zLmNsb3NlID0gb3B0aW9ucy5jbG9zZSB8fCBUb2FzdGlmeS5kZWZhdWx0cy5jbG9zZTsgLy8gU2hvdyB0b2FzdCBjbG9zZSBpY29uXG4gICAgICB0aGlzLm9wdGlvbnMuZ3Jhdml0eSA9IG9wdGlvbnMuZ3Jhdml0eSA9PT0gXCJib3R0b21cIiA/IFwidG9hc3RpZnktYm90dG9tXCIgOiBUb2FzdGlmeS5kZWZhdWx0cy5ncmF2aXR5OyAvLyB0b2FzdCBwb3NpdGlvbiAtIHRvcCBvciBib3R0b21cbiAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbkxlZnQgPSBvcHRpb25zLnBvc2l0aW9uTGVmdCB8fCBUb2FzdGlmeS5kZWZhdWx0cy5wb3NpdGlvbkxlZnQ7IC8vIHRvYXN0IHBvc2l0aW9uIC0gbGVmdCBvciByaWdodFxuICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uID0gb3B0aW9ucy5wb3NpdGlvbiB8fCBUb2FzdGlmeS5kZWZhdWx0cy5wb3NpdGlvbjsgLy8gdG9hc3QgcG9zaXRpb24gLSBsZWZ0IG9yIHJpZ2h0XG4gICAgICB0aGlzLm9wdGlvbnMuYmFja2dyb3VuZENvbG9yID0gb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IgfHwgVG9hc3RpZnkuZGVmYXVsdHMuYmFja2dyb3VuZENvbG9yOyAvLyB0b2FzdCBiYWNrZ3JvdW5kIGNvbG9yXG4gICAgICB0aGlzLm9wdGlvbnMuYXZhdGFyID0gb3B0aW9ucy5hdmF0YXIgfHwgVG9hc3RpZnkuZGVmYXVsdHMuYXZhdGFyOyAvLyBpbWcgZWxlbWVudCBzcmMgLSB1cmwgb3IgYSBwYXRoXG4gICAgICB0aGlzLm9wdGlvbnMuY2xhc3NOYW1lID0gb3B0aW9ucy5jbGFzc05hbWUgfHwgVG9hc3RpZnkuZGVmYXVsdHMuY2xhc3NOYW1lOyAvLyBhZGRpdGlvbmFsIGNsYXNzIG5hbWVzIGZvciB0aGUgdG9hc3RcbiAgICAgIHRoaXMub3B0aW9ucy5zdG9wT25Gb2N1cyA9IG9wdGlvbnMuc3RvcE9uRm9jdXMgPT09IHVuZGVmaW5lZCA/IFRvYXN0aWZ5LmRlZmF1bHRzLnN0b3BPbkZvY3VzIDogb3B0aW9ucy5zdG9wT25Gb2N1czsgLy8gc3RvcCB0aW1lb3V0IG9uIGZvY3VzXG4gICAgICB0aGlzLm9wdGlvbnMub25DbGljayA9IG9wdGlvbnMub25DbGljayB8fCBUb2FzdGlmeS5kZWZhdWx0cy5vbkNsaWNrOyAvLyBDYWxsYmFjayBhZnRlciBjbGlja1xuICAgICAgdGhpcy5vcHRpb25zLm9mZnNldCA9IG9wdGlvbnMub2Zmc2V0IHx8IFRvYXN0aWZ5LmRlZmF1bHRzLm9mZnNldDsgLy8gdG9hc3Qgb2Zmc2V0XG4gICAgICB0aGlzLm9wdGlvbnMuZXNjYXBlTWFya3VwID0gb3B0aW9ucy5lc2NhcGVNYXJrdXAgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZXNjYXBlTWFya3VwIDogVG9hc3RpZnkuZGVmYXVsdHMuZXNjYXBlTWFya3VwO1xuICAgICAgdGhpcy5vcHRpb25zLmFyaWFMaXZlID0gb3B0aW9ucy5hcmlhTGl2ZSB8fCBUb2FzdGlmeS5kZWZhdWx0cy5hcmlhTGl2ZTtcbiAgICAgIHRoaXMub3B0aW9ucy5zdHlsZSA9IG9wdGlvbnMuc3R5bGUgfHwgVG9hc3RpZnkuZGVmYXVsdHMuc3R5bGU7XG4gICAgICBpZihvcHRpb25zLmJhY2tncm91bmRDb2xvcikge1xuICAgICAgICB0aGlzLm9wdGlvbnMuc3R5bGUuYmFja2dyb3VuZCA9IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXR1cm5pbmcgdGhlIGN1cnJlbnQgb2JqZWN0IGZvciBjaGFpbmluZyBmdW5jdGlvbnNcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZGluZyB0aGUgRE9NIGVsZW1lbnRcbiAgICBidWlsZFRvYXN0OiBmdW5jdGlvbigpIHtcbiAgICAgIC8vIFZhbGlkYXRpbmcgaWYgdGhlIG9wdGlvbnMgYXJlIGRlZmluZWRcbiAgICAgIGlmICghdGhpcy5vcHRpb25zKSB7XG4gICAgICAgIHRocm93IFwiVG9hc3RpZnkgaXMgbm90IGluaXRpYWxpemVkXCI7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0aW5nIHRoZSBET00gb2JqZWN0XG4gICAgICB2YXIgZGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBkaXZFbGVtZW50LmNsYXNzTmFtZSA9IFwidG9hc3RpZnkgb24gXCIgKyB0aGlzLm9wdGlvbnMuY2xhc3NOYW1lO1xuXG4gICAgICAvLyBQb3NpdGlvbmluZyB0b2FzdCB0byBsZWZ0IG9yIHJpZ2h0IG9yIGNlbnRlclxuICAgICAgaWYgKCEhdGhpcy5vcHRpb25zLnBvc2l0aW9uKSB7XG4gICAgICAgIGRpdkVsZW1lbnQuY2xhc3NOYW1lICs9IFwiIHRvYXN0aWZ5LVwiICsgdGhpcy5vcHRpb25zLnBvc2l0aW9uO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVG8gYmUgZGVwcmVjaWF0ZWQgaW4gZnVydGhlciB2ZXJzaW9uc1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBvc2l0aW9uTGVmdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGRpdkVsZW1lbnQuY2xhc3NOYW1lICs9IFwiIHRvYXN0aWZ5LWxlZnRcIjtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1Byb3BlcnR5IGBwb3NpdGlvbkxlZnRgIHdpbGwgYmUgZGVwcmVjaWF0ZWQgaW4gZnVydGhlciB2ZXJzaW9ucy4gUGxlYXNlIHVzZSBgcG9zaXRpb25gIGluc3RlYWQuJylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEZWZhdWx0IHBvc2l0aW9uXG4gICAgICAgICAgZGl2RWxlbWVudC5jbGFzc05hbWUgKz0gXCIgdG9hc3RpZnktcmlnaHRcIjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBc3NpZ25pbmcgZ3Jhdml0eSBvZiBlbGVtZW50XG4gICAgICBkaXZFbGVtZW50LmNsYXNzTmFtZSArPSBcIiBcIiArIHRoaXMub3B0aW9ucy5ncmF2aXR5O1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmJhY2tncm91bmRDb2xvcikge1xuICAgICAgICAvLyBUaGlzIGlzIGJlaW5nIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgdXNpbmcgdGhlIHN0eWxlIEhUTUwgRE9NIHByb3BlcnR5XG4gICAgICAgIGNvbnNvbGUud2FybignREVQUkVDQVRJT04gTk9USUNFOiBcImJhY2tncm91bmRDb2xvclwiIGlzIGJlaW5nIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdGhlIFwic3R5bGUuYmFja2dyb3VuZFwiIHByb3BlcnR5LicpO1xuICAgICAgfVxuXG4gICAgICAvLyBMb29wIHRocm91Z2ggb3VyIHN0eWxlIG9iamVjdCBhbmQgYXBwbHkgc3R5bGVzIHRvIGRpdkVsZW1lbnRcbiAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMub3B0aW9ucy5zdHlsZSkge1xuICAgICAgICBkaXZFbGVtZW50LnN0eWxlW3Byb3BlcnR5XSA9IHRoaXMub3B0aW9ucy5zdHlsZVtwcm9wZXJ0eV07XG4gICAgICB9XG5cbiAgICAgIC8vIEFubm91bmNlIHRoZSB0b2FzdCB0byBzY3JlZW4gcmVhZGVyc1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5hcmlhTGl2ZSkge1xuICAgICAgICBkaXZFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1saXZlJywgdGhpcy5vcHRpb25zLmFyaWFMaXZlKVxuICAgICAgfVxuXG4gICAgICAvLyBBZGRpbmcgdGhlIHRvYXN0IG1lc3NhZ2Uvbm9kZVxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5ub2RlICYmIHRoaXMub3B0aW9ucy5ub2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgdmFsaWQgbm9kZSwgd2UgaW5zZXJ0IGl0XG4gICAgICAgIGRpdkVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5vcHRpb25zLm5vZGUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVzY2FwZU1hcmt1cCkge1xuICAgICAgICAgIGRpdkVsZW1lbnQuaW5uZXJUZXh0ID0gdGhpcy5vcHRpb25zLnRleHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGl2RWxlbWVudC5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMudGV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXZhdGFyICE9PSBcIlwiKSB7XG4gICAgICAgICAgdmFyIGF2YXRhckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuICAgICAgICAgIGF2YXRhckVsZW1lbnQuc3JjID0gdGhpcy5vcHRpb25zLmF2YXRhcjtcblxuICAgICAgICAgIGF2YXRhckVsZW1lbnQuY2xhc3NOYW1lID0gXCJ0b2FzdGlmeS1hdmF0YXJcIjtcblxuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucG9zaXRpb24gPT0gXCJsZWZ0XCIgfHwgdGhpcy5vcHRpb25zLnBvc2l0aW9uTGVmdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgLy8gQWRkaW5nIGNsb3NlIGljb24gb24gdGhlIGxlZnQgb2YgY29udGVudFxuICAgICAgICAgICAgZGl2RWxlbWVudC5hcHBlbmRDaGlsZChhdmF0YXJFbGVtZW50KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQWRkaW5nIGNsb3NlIGljb24gb24gdGhlIHJpZ2h0IG9mIGNvbnRlbnRcbiAgICAgICAgICAgIGRpdkVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYWZ0ZXJiZWdpblwiLCBhdmF0YXJFbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQWRkaW5nIGEgY2xvc2UgaWNvbiB0byB0aGUgdG9hc3RcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2xvc2UgPT09IHRydWUpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgc3BhbiBmb3IgY2xvc2UgZWxlbWVudFxuICAgICAgICB2YXIgY2xvc2VFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgY2xvc2VFbGVtZW50LnR5cGUgPSBcImJ1dHRvblwiO1xuICAgICAgICBjbG9zZUVsZW1lbnQuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBcIkNsb3NlXCIpO1xuICAgICAgICBjbG9zZUVsZW1lbnQuY2xhc3NOYW1lID0gXCJ0b2FzdC1jbG9zZVwiO1xuICAgICAgICBjbG9zZUVsZW1lbnQuaW5uZXJIVE1MID0gXCImIzEwMDA2O1wiO1xuXG4gICAgICAgIC8vIFRyaWdnZXJpbmcgdGhlIHJlbW92YWwgb2YgdG9hc3QgZnJvbSBET00gb24gY2xvc2UgY2xpY2tcbiAgICAgICAgY2xvc2VFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgXCJjbGlja1wiLFxuICAgICAgICAgIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRWxlbWVudCh0aGlzLnRvYXN0RWxlbWVudCk7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudG9hc3RFbGVtZW50LnRpbWVPdXRWYWx1ZSk7XG4gICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG5cbiAgICAgICAgLy9DYWxjdWxhdGluZyBzY3JlZW4gd2lkdGhcbiAgICAgICAgdmFyIHdpZHRoID0gd2luZG93LmlubmVyV2lkdGggPiAwID8gd2luZG93LmlubmVyV2lkdGggOiBzY3JlZW4ud2lkdGg7XG5cbiAgICAgICAgLy8gQWRkaW5nIHRoZSBjbG9zZSBpY29uIHRvIHRoZSB0b2FzdCBlbGVtZW50XG4gICAgICAgIC8vIERpc3BsYXkgb24gdGhlIHJpZ2h0IGlmIHNjcmVlbiB3aWR0aCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMzYwcHhcbiAgICAgICAgaWYgKCh0aGlzLm9wdGlvbnMucG9zaXRpb24gPT0gXCJsZWZ0XCIgfHwgdGhpcy5vcHRpb25zLnBvc2l0aW9uTGVmdCA9PT0gdHJ1ZSkgJiYgd2lkdGggPiAzNjApIHtcbiAgICAgICAgICAvLyBBZGRpbmcgY2xvc2UgaWNvbiBvbiB0aGUgbGVmdCBvZiBjb250ZW50XG4gICAgICAgICAgZGl2RWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoXCJhZnRlcmJlZ2luXCIsIGNsb3NlRWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQWRkaW5nIGNsb3NlIGljb24gb24gdGhlIHJpZ2h0IG9mIGNvbnRlbnRcbiAgICAgICAgICBkaXZFbGVtZW50LmFwcGVuZENoaWxkKGNsb3NlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYXIgdGltZW91dCB3aGlsZSB0b2FzdCBpcyBmb2N1c2VkXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnN0b3BPbkZvY3VzICYmIHRoaXMub3B0aW9ucy5kdXJhdGlvbiA+IDApIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICAvLyBzdG9wIGNvdW50ZG93blxuICAgICAgICBkaXZFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgXCJtb3VzZW92ZXJcIixcbiAgICAgICAgICBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChkaXZFbGVtZW50LnRpbWVPdXRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICAgIC8vIGFkZCBiYWNrIHRoZSB0aW1lb3V0XG4gICAgICAgIGRpdkVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICBcIm1vdXNlbGVhdmVcIixcbiAgICAgICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGRpdkVsZW1lbnQudGltZU91dFZhbHVlID0gd2luZG93LnNldFRpbWVvdXQoXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgdG9hc3QgZnJvbSBET01cbiAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZUVsZW1lbnQoZGl2RWxlbWVudCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kdXJhdGlvblxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvLyBBZGRpbmcgYW4gb24tY2xpY2sgZGVzdGluYXRpb24gcGF0aFxuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuZGVzdGluYXRpb24gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgZGl2RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgIFwiY2xpY2tcIixcbiAgICAgICAgICBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5ld1dpbmRvdyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICB3aW5kb3cub3Blbih0aGlzLm9wdGlvbnMuZGVzdGluYXRpb24sIFwiX2JsYW5rXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uID0gdGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5vbkNsaWNrID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5kZXN0aW5hdGlvbiA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBkaXZFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgXCJjbGlja1wiLFxuICAgICAgICAgIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vbkNsaWNrKCk7XG4gICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZGluZyBvZmZzZXRcbiAgICAgIGlmKHR5cGVvZiB0aGlzLm9wdGlvbnMub2Zmc2V0ID09PSBcIm9iamVjdFwiKSB7XG5cbiAgICAgICAgdmFyIHggPSBnZXRBeGlzT2Zmc2V0QVZhbHVlKFwieFwiLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICB2YXIgeSA9IGdldEF4aXNPZmZzZXRBVmFsdWUoXCJ5XCIsIHRoaXMub3B0aW9ucyk7XG5cbiAgICAgICAgdmFyIHhPZmZzZXQgPSB0aGlzLm9wdGlvbnMucG9zaXRpb24gPT0gXCJsZWZ0XCIgPyB4IDogXCItXCIgKyB4O1xuICAgICAgICB2YXIgeU9mZnNldCA9IHRoaXMub3B0aW9ucy5ncmF2aXR5ID09IFwidG9hc3RpZnktdG9wXCIgPyB5IDogXCItXCIgKyB5O1xuXG4gICAgICAgIGRpdkVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gXCJ0cmFuc2xhdGUoXCIgKyB4T2Zmc2V0ICsgXCIsXCIgKyB5T2Zmc2V0ICsgXCIpXCI7XG5cbiAgICAgIH1cblxuICAgICAgLy8gUmV0dXJuaW5nIHRoZSBnZW5lcmF0ZWQgZWxlbWVudFxuICAgICAgcmV0dXJuIGRpdkVsZW1lbnQ7XG4gICAgfSxcblxuICAgIC8vIERpc3BsYXlpbmcgdGhlIHRvYXN0XG4gICAgc2hvd1RvYXN0OiBmdW5jdGlvbigpIHtcbiAgICAgIC8vIENyZWF0aW5nIHRoZSBET00gb2JqZWN0IGZvciB0aGUgdG9hc3RcbiAgICAgIHRoaXMudG9hc3RFbGVtZW50ID0gdGhpcy5idWlsZFRvYXN0KCk7XG5cbiAgICAgIC8vIEdldHRpbmcgdGhlIHJvb3QgZWxlbWVudCB0byB3aXRoIHRoZSB0b2FzdCBuZWVkcyB0byBiZSBhZGRlZFxuICAgICAgdmFyIHJvb3RFbGVtZW50O1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuc2VsZWN0b3IgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm9wdGlvbnMuc2VsZWN0b3IpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuc2VsZWN0b3IgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCAodHlwZW9mIFNoYWRvd1Jvb3QgIT09ICd1bmRlZmluZWQnICYmIHRoaXMub3B0aW9ucy5zZWxlY3RvciBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpKSB7XG4gICAgICAgIHJvb3RFbGVtZW50ID0gdGhpcy5vcHRpb25zLnNlbGVjdG9yO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0aW5nIGlmIHJvb3QgZWxlbWVudCBpcyBwcmVzZW50IGluIERPTVxuICAgICAgaWYgKCFyb290RWxlbWVudCkge1xuICAgICAgICB0aHJvdyBcIlJvb3QgZWxlbWVudCBpcyBub3QgZGVmaW5lZFwiO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGRpbmcgdGhlIERPTSBlbGVtZW50XG4gICAgICB2YXIgZWxlbWVudFRvSW5zZXJ0ID0gVG9hc3RpZnkuZGVmYXVsdHMub2xkZXN0Rmlyc3QgPyByb290RWxlbWVudC5maXJzdENoaWxkIDogcm9vdEVsZW1lbnQubGFzdENoaWxkO1xuICAgICAgcm9vdEVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRoaXMudG9hc3RFbGVtZW50LCBlbGVtZW50VG9JbnNlcnQpO1xuXG4gICAgICAvLyBSZXBvc2l0aW9uaW5nIHRoZSB0b2FzdHMgaW4gY2FzZSBtdWx0aXBsZSB0b2FzdHMgYXJlIHByZXNlbnRcbiAgICAgIFRvYXN0aWZ5LnJlcG9zaXRpb24oKTtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5kdXJhdGlvbiA+IDApIHtcbiAgICAgICAgdGhpcy50b2FzdEVsZW1lbnQudGltZU91dFZhbHVlID0gd2luZG93LnNldFRpbWVvdXQoXG4gICAgICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHRvYXN0IGZyb20gRE9NXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUVsZW1lbnQodGhpcy50b2FzdEVsZW1lbnQpO1xuICAgICAgICAgIH0uYmluZCh0aGlzKSxcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuZHVyYXRpb25cbiAgICAgICAgKTsgLy8gQmluZGluZyBgdGhpc2AgZm9yIGZ1bmN0aW9uIGludm9jYXRpb25cbiAgICAgIH1cblxuICAgICAgLy8gU3VwcG9ydGluZyBmdW5jdGlvbiBjaGFpbmluZ1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIGhpZGVUb2FzdDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy50b2FzdEVsZW1lbnQudGltZU91dFZhbHVlKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvYXN0RWxlbWVudC50aW1lT3V0VmFsdWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5yZW1vdmVFbGVtZW50KHRoaXMudG9hc3RFbGVtZW50KTtcbiAgICB9LFxuXG4gICAgLy8gUmVtb3ZpbmcgdGhlIGVsZW1lbnQgZnJvbSB0aGUgRE9NXG4gICAgcmVtb3ZlRWxlbWVudDogZnVuY3Rpb24odG9hc3RFbGVtZW50KSB7XG4gICAgICAvLyBIaWRpbmcgdGhlIGVsZW1lbnRcbiAgICAgIC8vIHRvYXN0RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwib25cIik7XG4gICAgICB0b2FzdEVsZW1lbnQuY2xhc3NOYW1lID0gdG9hc3RFbGVtZW50LmNsYXNzTmFtZS5yZXBsYWNlKFwiIG9uXCIsIFwiXCIpO1xuXG4gICAgICAvLyBSZW1vdmluZyB0aGUgZWxlbWVudCBmcm9tIERPTSBhZnRlciB0cmFuc2l0aW9uIGVuZFxuICAgICAgd2luZG93LnNldFRpbWVvdXQoXG4gICAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIC8vIHJlbW92ZSBvcHRpb25zIG5vZGUgaWYgYW55XG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5ub2RlICYmIHRoaXMub3B0aW9ucy5ub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5ub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5vcHRpb25zLm5vZGUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZWxlbWVudCBmcm9tIHRoZSBET00sIG9ubHkgd2hlbiB0aGUgcGFyZW50IG5vZGUgd2FzIG5vdCByZW1vdmVkIGJlZm9yZS5cbiAgICAgICAgICBpZiAodG9hc3RFbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRvYXN0RWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRvYXN0RWxlbWVudCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2FsbGluZyB0aGUgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICAgICAgICB0aGlzLm9wdGlvbnMuY2FsbGJhY2suY2FsbCh0b2FzdEVsZW1lbnQpO1xuXG4gICAgICAgICAgLy8gUmVwb3NpdGlvbmluZyB0aGUgdG9hc3RzIGFnYWluXG4gICAgICAgICAgVG9hc3RpZnkucmVwb3NpdGlvbigpO1xuICAgICAgICB9LmJpbmQodGhpcyksXG4gICAgICAgIDQwMFxuICAgICAgKTsgLy8gQmluZGluZyBgdGhpc2AgZm9yIGZ1bmN0aW9uIGludm9jYXRpb25cbiAgICB9LFxuICB9O1xuXG4gIC8vIFBvc2l0aW9uaW5nIHRoZSB0b2FzdHMgb24gdGhlIERPTVxuICBUb2FzdGlmeS5yZXBvc2l0aW9uID0gZnVuY3Rpb24oKSB7XG5cbiAgICAvLyBUb3AgbWFyZ2lucyB3aXRoIGdyYXZpdHlcbiAgICB2YXIgdG9wTGVmdE9mZnNldFNpemUgPSB7XG4gICAgICB0b3A6IDE1LFxuICAgICAgYm90dG9tOiAxNSxcbiAgICB9O1xuICAgIHZhciB0b3BSaWdodE9mZnNldFNpemUgPSB7XG4gICAgICB0b3A6IDE1LFxuICAgICAgYm90dG9tOiAxNSxcbiAgICB9O1xuICAgIHZhciBvZmZzZXRTaXplID0ge1xuICAgICAgdG9wOiAxNSxcbiAgICAgIGJvdHRvbTogMTUsXG4gICAgfTtcblxuICAgIC8vIEdldCBhbGwgdG9hc3QgbWVzc2FnZXMgb24gdGhlIERPTVxuICAgIHZhciBhbGxUb2FzdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwidG9hc3RpZnlcIik7XG5cbiAgICB2YXIgY2xhc3NVc2VkO1xuXG4gICAgLy8gTW9kaWZ5aW5nIHRoZSBwb3NpdGlvbiBvZiBlYWNoIHRvYXN0IGVsZW1lbnRcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbFRvYXN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gR2V0dGluZyB0aGUgYXBwbGllZCBncmF2aXR5XG4gICAgICBpZiAoY29udGFpbnNDbGFzcyhhbGxUb2FzdHNbaV0sIFwidG9hc3RpZnktdG9wXCIpID09PSB0cnVlKSB7XG4gICAgICAgIGNsYXNzVXNlZCA9IFwidG9hc3RpZnktdG9wXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGFzc1VzZWQgPSBcInRvYXN0aWZ5LWJvdHRvbVwiO1xuICAgICAgfVxuXG4gICAgICB2YXIgaGVpZ2h0ID0gYWxsVG9hc3RzW2ldLm9mZnNldEhlaWdodDtcbiAgICAgIGNsYXNzVXNlZCA9IGNsYXNzVXNlZC5zdWJzdHIoOSwgY2xhc3NVc2VkLmxlbmd0aC0xKVxuICAgICAgLy8gU3BhY2luZyBiZXR3ZWVuIHRvYXN0c1xuICAgICAgdmFyIG9mZnNldCA9IDE1O1xuXG4gICAgICB2YXIgd2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aCA+IDAgPyB3aW5kb3cuaW5uZXJXaWR0aCA6IHNjcmVlbi53aWR0aDtcblxuICAgICAgLy8gU2hvdyB0b2FzdCBpbiBjZW50ZXIgaWYgc2NyZWVuIHdpdGggbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDM2MHB4XG4gICAgICBpZiAod2lkdGggPD0gMzYwKSB7XG4gICAgICAgIC8vIFNldHRpbmcgdGhlIHBvc2l0aW9uXG4gICAgICAgIGFsbFRvYXN0c1tpXS5zdHlsZVtjbGFzc1VzZWRdID0gb2Zmc2V0U2l6ZVtjbGFzc1VzZWRdICsgXCJweFwiO1xuXG4gICAgICAgIG9mZnNldFNpemVbY2xhc3NVc2VkXSArPSBoZWlnaHQgKyBvZmZzZXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY29udGFpbnNDbGFzcyhhbGxUb2FzdHNbaV0sIFwidG9hc3RpZnktbGVmdFwiKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIC8vIFNldHRpbmcgdGhlIHBvc2l0aW9uXG4gICAgICAgICAgYWxsVG9hc3RzW2ldLnN0eWxlW2NsYXNzVXNlZF0gPSB0b3BMZWZ0T2Zmc2V0U2l6ZVtjbGFzc1VzZWRdICsgXCJweFwiO1xuXG4gICAgICAgICAgdG9wTGVmdE9mZnNldFNpemVbY2xhc3NVc2VkXSArPSBoZWlnaHQgKyBvZmZzZXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2V0dGluZyB0aGUgcG9zaXRpb25cbiAgICAgICAgICBhbGxUb2FzdHNbaV0uc3R5bGVbY2xhc3NVc2VkXSA9IHRvcFJpZ2h0T2Zmc2V0U2l6ZVtjbGFzc1VzZWRdICsgXCJweFwiO1xuXG4gICAgICAgICAgdG9wUmlnaHRPZmZzZXRTaXplW2NsYXNzVXNlZF0gKz0gaGVpZ2h0ICsgb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3VwcG9ydGluZyBmdW5jdGlvbiBjaGFpbmluZ1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgb2Zmc2V0LlxuICBmdW5jdGlvbiBnZXRBeGlzT2Zmc2V0QVZhbHVlKGF4aXMsIG9wdGlvbnMpIHtcblxuICAgIGlmKG9wdGlvbnMub2Zmc2V0W2F4aXNdKSB7XG4gICAgICBpZihpc05hTihvcHRpb25zLm9mZnNldFtheGlzXSkpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMub2Zmc2V0W2F4aXNdO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLm9mZnNldFtheGlzXSArICdweCc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuICcwcHgnO1xuXG4gIH1cblxuICBmdW5jdGlvbiBjb250YWluc0NsYXNzKGVsZW0sIHlvdXJDbGFzcykge1xuICAgIGlmICghZWxlbSB8fCB0eXBlb2YgeW91ckNsYXNzICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGVsZW0uY2xhc3NOYW1lICYmXG4gICAgICBlbGVtLmNsYXNzTmFtZVxuICAgICAgICAudHJpbSgpXG4gICAgICAgIC5zcGxpdCgvXFxzKy9naSlcbiAgICAgICAgLmluZGV4T2YoeW91ckNsYXNzKSA+IC0xXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNldHRpbmcgdXAgdGhlIHByb3RvdHlwZSBmb3IgdGhlIGluaXQgb2JqZWN0XG4gIFRvYXN0aWZ5LmxpYi5pbml0LnByb3RvdHlwZSA9IFRvYXN0aWZ5LmxpYjtcblxuICAvLyBSZXR1cm5pbmcgdGhlIFRvYXN0aWZ5IGZ1bmN0aW9uIHRvIGJlIGFzc2lnbmVkIHRvIHRoZSB3aW5kb3cgb2JqZWN0L21vZHVsZVxuICByZXR1cm4gVG9hc3RpZnk7XG59KTtcbiIsImltcG9ydCBUb2FzdGlmeSBmcm9tICd0b2FzdGlmeS1qcyc7IC8vIGRhcyBNb2R1bCB3aXJkIHZvbiBub2RlX21vZHVsZXMgYXVzZ2VsZXNlbiB1bmQgZ2VidW5kbGV0LiBGdW5rdGlvbmllcnQgbnVyIG1pdCBKUy1CdW5kbGVyXG5cbmNvbnN0IFRvYXN0ID0gKHRleHQ6IHN0cmluZyA9ICcnLCB2YXJpYW50OiBzdHJpbmcgPSAncHJpbWFyeScpID0+IHtcbiAgY29uc3QgZ2V0Q29sb3JCeU5hbWUgPSAodmFyaWFudDogc3RyaW5nID0gJycpOiBzdHJpbmcgPT4ge1xuICAgIGxldCBjb2xvcjtcbiAgICBzd2l0Y2ggKHZhcmlhbnQudHJpbSgpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgJ3ByaW1hcnknOlxuICAgICAgICBjb2xvciA9ICcjMGQ2ZWZkJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzZWNvbmRhcnknOlxuICAgICAgICBjb2xvciA9ICcjNmM3NTdkJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd3YXJuaW5nJzpcbiAgICAgICAgY29sb3IgPSAnI2ZmYzcyMCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc3VjY2Vzcyc6XG4gICAgICAgIGNvbG9yID0gJyMxMzY1M2YnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2luZm8nOlxuICAgICAgICBjb2xvciA9ICcjMjVjZmYyJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICBjYXNlICdkYW5nZXInOlxuICAgICAgICBjb2xvciA9ICcjYTUyODM0JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdsaWdodCc6XG4gICAgICAgIGNvbG9yID0gJyNiYWJiYmMnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2RhcmsnOlxuICAgICAgICBjb2xvciA9ICcjMzczYjNlJztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnNvbGUud2FybigndmFyaWFudCBub3QgZm91bmQnKTtcbiAgICAgICAgY29sb3IgPSAnd2hpdGUnO1xuICAgIH1cbiAgICByZXR1cm4gY29sb3I7XG4gIH07XG5cbiAgY29uc3Qgc2hvdyA9ICgpOiB2b2lkID0+IHtcbiAgICBUb2FzdGlmeSh7XG4gICAgICB0ZXh0OiB0ZXh0LFxuICAgICAgZHVyYXRpb246IDIwMDAsXG4gICAgICBjbGFzc05hbWU6IHZhcmlhbnQsXG4gICAgICBncmF2aXR5OiAndG9wJywgLy8gYHRvcGAgb3IgYGJvdHRvbWBcbiAgICAgIHBvc2l0aW9uOiAnY2VudGVyJywgLy8gYGxlZnRgLCBgY2VudGVyYCBvciBgcmlnaHRgXG4gICAgICBzdG9wT25Gb2N1czogdHJ1ZSwgLy8gUHJldmVudHMgZGlzbWlzc2luZyBvZiB0b2FzdCBvbiBob3ZlclxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgYmFja2dyb3VuZDogZ2V0Q29sb3JCeU5hbWUodmFyaWFudCksXG4gICAgICB9LFxuICAgIH0pLnNob3dUb2FzdCgpO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgc2hvdyxcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFRvYXN0O1xuIiwiLy8gR2VuZXJpc2NoZSBIZWxmZXJmdW5rdGlvbiB6dW0gU2VsZWt0aWVyZW4gdm9uIEVsZW1lbnQgbWl0IMOcYmVycHLDvGZ1bmcsIG9iIGRhcyBFbGVtZW50IGV4aXN0aWVydFxuZXhwb3J0IGNvbnN0IHF1ZXJ5U2VsZWN0b3JUeXBlZCA9IDxUIGV4dGVuZHMgSFRNTEVsZW1lbnQ+KFxuICBzZWxlY3Rvcjogc3RyaW5nLFxuICBwYXJlbnQ6IEVsZW1lbnQgfCBEb2N1bWVudCA9IGRvY3VtZW50LFxuKTogVCA9PiB7XG4gIGNvbnN0IGVsZW1lbnQgPSBwYXJlbnQucXVlcnlTZWxlY3RvcjxUPihzZWxlY3Rvcik7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCB3aXRoIHNlbGVjdG9yIFwiJHtzZWxlY3Rvcn1cIiBub3QgZm91bmQuYCk7XG4gIH1cbiAgcmV0dXJuIGVsZW1lbnQ7XG59O1xuXG4vLyBIZWxmZXJmdW5rdGlvbiBhdXMgalF1ZXJ5ICh5b3VtaWdodG5vdGpxdWVyeSlcbmV4cG9ydCBjb25zdCBwYXJlbnRzID0gKGVsOiBIVE1MRWxlbWVudCwgc2VsZWN0b3I/OiBzdHJpbmcpOiBIVE1MRWxlbWVudFtdID0+IHtcbiAgY29uc3QgcGFyZW50czogSFRNTEVsZW1lbnRbXSA9IFtdO1xuICBsZXQgY3VycmVudEVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBlbDtcbiAgd2hpbGUgKChjdXJyZW50RWwgPSBjdXJyZW50RWwucGFyZW50RWxlbWVudCkgJiYgY3VycmVudEVsICE9PSBudWxsICYmIGN1cnJlbnRFbCAhPT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgaWYgKCFzZWxlY3RvciB8fCBjdXJyZW50RWwubWF0Y2hlcyhzZWxlY3RvcikpIHBhcmVudHMucHVzaChjdXJyZW50RWwgYXMgSFRNTEVsZW1lbnQpO1xuICB9XG4gIHJldHVybiBwYXJlbnRzO1xufTtcbiIsImltcG9ydCB7IE1vZGFsIH0gZnJvbSAnYm9vdHN0cmFwJzsgLy8gb2huZSBQZmFkYW5nYWJlIChNb2R1bCBhdXNsZXNlbiBhdXMgbm9kZV9tb2R1bGVzKSBmdW5rdGlvbmllcnQgbnVyIG1pdCBKUy1CdW5kbGVyIChlc2J1aWxkLCByb2xsdXAgJiBjby4pXG5pbXBvcnQgVG9hc3QgZnJvbSAnLi9Ub2FzdCc7XG5pbXBvcnQgeyBxdWVyeVNlbGVjdG9yVHlwZWQsIHBhcmVudHMgfSBmcm9tICcuLi91dGlscy9oZWxwZXJzJztcblxuLy8gaW1wb3J0ICogYXMgYm9vdHN0cmFwIGZyb20gJ2Jvb3RzdHJhcCc7XG4vLyBpbXBvcnQgJ2Jvb3RzdHJhcCc7XG5cbi8vIGltcG9ydCAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9ib290c3RyYXBANS4zLjgvZGlzdC9qcy9ib290c3RyYXAuYnVuZGxlLm1pbi5qcyc7IC8vIHfDvHJkZSBhdWNoIG9obmUgQnVuZGxlciBmdW5rdGlvbmllcmVuXG4vLyBpbXBvcnQgJy4uLy4uLy4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvZGlzdC9qcy9ib290c3RyYXAuZXNtLmpzJzsgLy8gd8O8cmRlIGF1Y2ggb2huZSBCdW5kbGVyIGZ1bmt0aW9uaWVyZW5cblxuaW50ZXJmYWNlIERPTSB7XG4gIG1vZHVsZTogSFRNTEVsZW1lbnQ7XG4gIHRhYmxlOiBIVE1MVGFibGVFbGVtZW50O1xuICB0Qm9keTogSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ7XG4gIGlucHV0TmFtZTogSFRNTElucHV0RWxlbWVudDtcbiAgaW5wdXRQcmljZTogSFRNTElucHV0RWxlbWVudDtcbiAgYnRuQWRkOiBIVE1MQnV0dG9uRWxlbWVudDtcbiAgdGVtcGxhdGVSb3c6IEhUTUxUZW1wbGF0ZUVsZW1lbnQ7XG4gIGJ0blNhdmU6IEhUTUxCdXR0b25FbGVtZW50O1xuICBidG5SZXNldDogSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gIG1vZGFsRWRpdDogSFRNTERpdkVsZW1lbnQ7XG4gIGZvcm1FZGl0OiBIVE1MRm9ybUVsZW1lbnQ7XG4gIGlucHV0RWRpdE5hbWU6IEhUTUxJbnB1dEVsZW1lbnQ7XG4gIGlucHV0RWRpdFByaWNlOiBIVE1MSW5wdXRFbGVtZW50O1xuICBpbnB1dEVkaXRJZDogSFRNTElucHV0RWxlbWVudDtcbiAgaW5wdXRFZGl0UG9zaXRpb246IEhUTUxJbnB1dEVsZW1lbnQ7XG4gIGJ0blVwZGF0ZTogSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gIG1vZGFsRGVsZXRlOiBIVE1MRGl2RWxlbWVudDtcbiAgcHJvZHVjdE5hbWU6IEhUTUxEaXZFbGVtZW50O1xuICBidG5Db25maXJtRGVsZXRlOiBIVE1MQnV0dG9uRWxlbWVudDtcbn1cblxuaW50ZXJmYWNlIFByb2R1Y3Qge1xuICBfaWQ/OiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgcHJpY2U6IG51bWJlcjtcbiAgcG9zaXRpb24/OiBudW1iZXI7XG59XG5cbi8vIEZhY3RvcnkgRnVuY3Rpb25cbmNvbnN0IFByb2R1Y3RNYW5hZ2VyID0gKGVsPzogSFRNTEVsZW1lbnQpID0+IHtcbiAgLy8gPT09IERPTSAmIFZBUlMgPT09PT09PVxuXG4gIGNvbnN0IEJBU0VfVVJMID0gJ2h0dHA6Ly8xMjcuMC4wLjE6ODAwMCc7XG5cbiAgY29uc3QgbW9kdWxlID0gZWwgfHwgcXVlcnlTZWxlY3RvclR5cGVkKCcucHJvZHVjdC1tYW5hZ2VyJyk7XG5cbiAgaWYgKCFtb2R1bGUpIHJldHVybjtcblxuICBjb25zdCBET006IERPTSA9IHtcbiAgICBtb2R1bGUsXG4gICAgdGFibGU6IHF1ZXJ5U2VsZWN0b3JUeXBlZDxIVE1MVGFibGVFbGVtZW50PignLnRhYmxlLXByb2R1Y3RzJywgbW9kdWxlKSxcbiAgICB0Qm9keTogcXVlcnlTZWxlY3RvclR5cGVkPEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50PigndGJvZHknLCBtb2R1bGUpLFxuICAgIGlucHV0TmFtZTogcXVlcnlTZWxlY3RvclR5cGVkPEhUTUxJbnB1dEVsZW1lbnQ+KCcuaW5wdXQtcHJvZHVjdC1uYW1lJywgbW9kdWxlKSxcbiAgICBpbnB1dFByaWNlOiBxdWVyeVNlbGVjdG9yVHlwZWQ8SFRNTElucHV0RWxlbWVudD4oJy5pbnB1dC1wcm9kdWN0LXByaWNlJywgbW9kdWxlKSxcbiAgICBidG5BZGQ6IHF1ZXJ5U2VsZWN0b3JUeXBlZDxIVE1MQnV0dG9uRWxlbWVudD4oJy5idXR0b24tcHJvZHVjdC1hZGQnLCBtb2R1bGUpLFxuICAgIHRlbXBsYXRlUm93OiBxdWVyeVNlbGVjdG9yVHlwZWQ8SFRNTFRlbXBsYXRlRWxlbWVudD4oJy50ZW1wbGF0ZS1yb3cnLCBtb2R1bGUpLFxuXG4gICAgLy8gTmF2IEFjdGlvbnNcbiAgICBidG5TYXZlOiBxdWVyeVNlbGVjdG9yVHlwZWQ8SFRNTEJ1dHRvbkVsZW1lbnQ+KCcuYnV0dG9uLXByb2R1Y3RzLXNhdmUnLCBtb2R1bGUpLFxuICAgIGJ0blJlc2V0OiBxdWVyeVNlbGVjdG9yVHlwZWQ8SFRNTEJ1dHRvbkVsZW1lbnQ+KCcuYnV0dG9uLXByb2R1Y3RzLXJlc2V0JywgbW9kdWxlKSxcblxuICAgIC8vIE1vZGFsIEVkaXRcbiAgICBtb2RhbEVkaXQ6IHF1ZXJ5U2VsZWN0b3JUeXBlZDxIVE1MRGl2RWxlbWVudD4oJy5tb2RhbC1lZGl0JywgbW9kdWxlKSxcbiAgICBmb3JtRWRpdDogcXVlcnlTZWxlY3RvclR5cGVkPEhUTUxGb3JtRWxlbWVudD4oJy5mb3JtLXByb2R1Y3QtZWRpdCcsIG1vZHVsZSksXG4gICAgaW5wdXRFZGl0TmFtZTogcXVlcnlTZWxlY3RvclR5cGVkPEhUTUxJbnB1dEVsZW1lbnQ+KCcuaW5wdXQtZWRpdC1uYW1lJywgbW9kdWxlKSxcbiAgICBpbnB1dEVkaXRQcmljZTogcXVlcnlTZWxlY3RvclR5cGVkPEhUTUxJbnB1dEVsZW1lbnQ+KCcuaW5wdXQtZWRpdC1wcmljZScsIG1vZHVsZSksXG4gICAgaW5wdXRFZGl0SWQ6IHF1ZXJ5U2VsZWN0b3JUeXBlZDxIVE1MSW5wdXRFbGVtZW50PignLmlucHV0LWVkaXQtaWQnLCBtb2R1bGUpLFxuICAgIGlucHV0RWRpdFBvc2l0aW9uOiBxdWVyeVNlbGVjdG9yVHlwZWQ8SFRNTElucHV0RWxlbWVudD4oJy5pbnB1dC1lZGl0LXBvc2l0aW9uJywgbW9kdWxlKSxcbiAgICBidG5VcGRhdGU6IHF1ZXJ5U2VsZWN0b3JUeXBlZDxIVE1MQnV0dG9uRWxlbWVudD4oJy5idXR0b24tcHJvZHVjdC11cGRhdGUnLCBtb2R1bGUpLFxuXG4gICAgLy8gTW9kYWwgRGVsZXRlXG4gICAgbW9kYWxEZWxldGU6IHF1ZXJ5U2VsZWN0b3JUeXBlZDxIVE1MRGl2RWxlbWVudD4oJy5tb2RhbC1kZWxldGUnLCBtb2R1bGUpLFxuICAgIHByb2R1Y3ROYW1lOiBxdWVyeVNlbGVjdG9yVHlwZWQ8SFRNTERpdkVsZW1lbnQ+KCdzdHJvbmcucHJvZHVjdC1uYW1lJywgbW9kdWxlKSxcbiAgICBidG5Db25maXJtRGVsZXRlOiBxdWVyeVNlbGVjdG9yVHlwZWQ8SFRNTEJ1dHRvbkVsZW1lbnQ+KCcuYnV0dG9uLWNvbmZpcm0tZGVsZXRlJywgbW9kdWxlKSxcbiAgfTtcblxuICBjb25zb2xlLmxvZyhET00pO1xuICBjb25zdCBic01vZGFsRWRpdCA9IG5ldyBNb2RhbChET00ubW9kYWxFZGl0LCB7XG4gICAgYmFja2Ryb3A6ICdzdGF0aWMnLCAvLyB0cnVlXG4gICAga2V5Ym9hcmQ6IHRydWUsXG4gIH0pO1xuXG4gIGNvbnN0IGJzTW9kYWxEZWxldGUgPSBuZXcgTW9kYWwoRE9NLm1vZGFsRGVsZXRlLCB7XG4gICAgYmFja2Ryb3A6ICdzdGF0aWMnLCAvLyB0cnVlXG4gICAga2V5Ym9hcmQ6IHRydWUsXG4gIH0pO1xuXG4gIC8vID09PSBJTklUID09PT09PT09PT09PT1cbiAgY29uc3QgaW5pdCA9ICgpID0+IHtcbiAgICBjb25zb2xlLmxvZygnaW5pdCcpO1xuICAgIC8vIEZ1bmt0aW9uYXVmcnVmZSB6dSBiZWdpbm4gZGVyIEFud2VuZHVuZ1xuICAgIGluaXRQcm9kdWN0cygpO1xuXG4gICAgLy8gRXZlbnQtTGF1c2NoZXIgenUgYmVnaW5uIGRlciBBbndlbmR1bmdcbiAgICBET00uYnRuUmVzZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvbkNsaWNrUmVzZXQpO1xuICAgIERPTS5idG5TYXZlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25DbGlja1NhdmUpO1xuXG4gICAgRE9NLmJ0bkFkZC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9uQ2xpY2tBZGQpO1xuICAgIERPTS5idG5BZGQuZGlzYWJsZWQgPSB0cnVlO1xuICAgIERPTS5idG5Db25maXJtRGVsZXRlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25DbGlja0NvbmZpcm1EZWxldGUpO1xuICAgIERPTS5mb3JtRWRpdC5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCBvblN1Ym1pdEVkaXQpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIG9uS2V5VXApO1xuICB9O1xuXG4gIC8vID09PSBFVkVOVEhBTkRMRVIgPT09PT1cbiAgY29uc3Qgb25LZXlVcCA9ICgpID0+IHtcbiAgICAvLyBpZiAoRE9NLmlucHV0TmFtZS52YWx1ZSA9PT0gJycgJiYgRE9NLmlucHV0UHJpY2UudmFsdWUgPT09ICcnKSB7XG4gICAgLy8gICBET00uYnRuQWRkLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAvLyB9IGVsc2Uge1xuICAgIC8vICAgRE9NLmJ0bkFkZC5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIC8vIH1cbiAgICBET00uYnRuQWRkLmRpc2FibGVkID0gKERPTS5pbnB1dE5hbWUudmFsdWUgPT09ICcnIHx8IERPTS5pbnB1dFByaWNlLnZhbHVlID09PSAnJyk7IC8vIHByZXR0aWVyLWlnbm9yZVxuICB9O1xuXG4gIGNvbnN0IG9uQ2xpY2tSZXNldCA9IChlOiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICBjb25zdCBidG5FbCA9IGUuY3VycmVudFRhcmdldDtcblxuICAgIC8vIGFzeW5jIHByb2Nlc3NcbiAgICByZXNldFByb2R1Y3RzKCkudGhlbigoZGF0YSkgPT4ge1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBUb2FzdChkYXRhLm1zZywgJ3N1Y2Nlc3MnKS5zaG93KCk7XG4gICAgICAgIGxvYWRQcm9kdWN0cygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IG9uQ2xpY2tTYXZlID0gKGU6IFBvaW50ZXJFdmVudCkgPT4ge1xuICAgIGNvbnN0IGJ0bkVsID0gZS5jdXJyZW50VGFyZ2V0IGFzIEhUTUxCdXR0b25FbGVtZW50O1xuICAgIGNvbnN0IGljb24gPSBidG5FbC5xdWVyeVNlbGVjdG9yKCdpJykgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBpY29uLmNsYXNzTGlzdC5hZGQoJ2ZhLWplbGxvJyk7XG5cbiAgICAvLyBhc3luYyBwcm9jZXNzXG4gICAgc2F2ZVByb2R1Y3RzKCkudGhlbigoZGF0YSkgPT4ge1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpY29uLmNsYXNzTGlzdC5yZW1vdmUoJ2ZhLWplbGxvJyk7XG4gICAgICAgIH0sIDUwMCk7XG4gICAgICAgIFRvYXN0KGRhdGEubXNnLCAnc3VjY2VzcycpLnNob3coKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBvblN1Ym1pdEVkaXQgPSAoZTogU3VibWl0RXZlbnQpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7IC8vIFN0YW5kYXJkdmVyaGFsdGVuIHVudGVyYmluZGVuIChGb3JtdWxhciBuaWNodCBhbiBhY3Rpb24gdmVyc2VuZGVuKVxuXG4gICAgLy8gY29uc29sZS5sb2coT2JqZWN0LmVudHJpZXMobmV3IEZvcm1EYXRhKERPTS5mb3JtRWRpdCkpKTtcblxuICAgIGNvbnN0IHByb2R1Y3QgPSB7XG4gICAgICBuYW1lOiBET00uaW5wdXRFZGl0TmFtZS52YWx1ZSxcbiAgICAgIHByaWNlOiBOdW1iZXIoRE9NLmlucHV0RWRpdFByaWNlLnZhbHVlKSxcbiAgICAgIF9pZDogRE9NLmlucHV0RWRpdElkLnZhbHVlLFxuICAgICAgcG9zaXRpb246IERPTS5pbnB1dEVkaXRQb3NpdGlvbi52YWx1ZSxcbiAgICB9O1xuXG4gICAgLy8gdXBkYXRlIGFzeW5jIHByb2Nlc3NcbiAgICBxdWVyeVNlbGVjdG9yVHlwZWQoJ2knLCBET00uYnRuVXBkYXRlKS5jbGFzc0xpc3QuYWRkKCdmYS1zcGluJyk7XG4gICAgdXBkYXRlUHJvZHVjdChwcm9kdWN0KS50aGVuKChkYXRhKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhkYXRhKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgVG9hc3QoZGF0YS5tc2csICdzdWNjZXNzJykuc2hvdygpO1xuICAgICAgICBxdWVyeVNlbGVjdG9yVHlwZWQoJ2knLCBET00uYnRuVXBkYXRlKS5jbGFzc0xpc3QucmVtb3ZlKCdmYS1zcGluJyk7XG4gICAgICAgIGxvYWRQcm9kdWN0cygpOyAvLyBBbGwgUHJvZHVrdGUgYXVzbGVzZW5cbiAgICAgICAgcmVzZXRGaWVsZHMoKTtcbiAgICAgICAgYnNNb2RhbEVkaXQuaGlkZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgVG9hc3QoZGF0YS5tc2csICdlcnJvcicpLnNob3coKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBvbkNsaWNrQWRkID0gKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKCdjbGljaycpO1xuXG4gICAgY29uc3QgcHJvZHVjdCA9IHtcbiAgICAgIG5hbWU6IERPTS5pbnB1dE5hbWUudmFsdWUsXG4gICAgICBwcmljZTogTnVtYmVyKERPTS5pbnB1dFByaWNlLnZhbHVlKSxcbiAgICB9O1xuXG4gICAgY3JlYXRlUHJvZHVjdChwcm9kdWN0KS50aGVuKChkYXRhKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhkYXRhKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ2FkZCcpO1xuICAgICAgICBUb2FzdChkYXRhLm1zZywgJ3N1Y2Nlc3MnKS5zaG93KCk7XG4gICAgICAgIGxvYWRQcm9kdWN0cygpO1xuICAgICAgICByZXNldEZpZWxkcygpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gYWRkUHJvZHVjdChwcm9kdWN0KTtcblxuICAgIGRpc2FibGVOb25GdW5jdGlvbmFsQnV0dG9ucygpO1xuICB9O1xuXG4gIGNvbnN0IG9uQ2xpY2tFZGl0ID0gKGU6IFBvaW50ZXJFdmVudCkgPT4ge1xuICAgIGNvbnN0IGJ0bkVsID0gZS5jdXJyZW50VGFyZ2V0IGFzIEhUTUxCdXR0b25FbGVtZW50O1xuICAgIGNvbnN0IGN1cnJlbnRSb3cgPSBwYXJlbnRzKGJ0bkVsLCAndHInKVswXTtcbiAgICBjb25zdCBpZDogc3RyaW5nID0gU3RyaW5nKGN1cnJlbnRSb3cuZGF0YXNldC5pZCk7XG5cbiAgICAvLyBhc3luYyBmZXRjaFxuICAgIGdldFByb2R1Y3QoaWQpLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKGRhdGEpO1xuICAgICAgc2hvd01vZGFsRWRpdChkYXRhKTtcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBvbkNsaWNrUmVtb3ZlID0gKGU6IFBvaW50ZXJFdmVudCkgPT4ge1xuICAgIGNvbnN0IGJ0bkVsID0gZS5jdXJyZW50VGFyZ2V0IGFzIEhUTUxCdXR0b25FbGVtZW50O1xuICAgIGNvbnN0IGN1cnJlbnRSb3cgPSBwYXJlbnRzKGJ0bkVsLCAndHInKVswXTtcbiAgICBjb25zdCBpZCA9IGN1cnJlbnRSb3cuZGF0YXNldC5pZDtcblxuICAgIGNvbnN0IHByb2R1Y3ROYW1lID0gcXVlcnlTZWxlY3RvclR5cGVkPEhUTUxUYWJsZUNlbGxFbGVtZW50PignLnRkLW5hbWUnLCBjdXJyZW50Um93KS50ZXh0Q29udGVudC50cmltKCk7XG5cbiAgICBET00uYnRuQ29uZmlybURlbGV0ZS5kYXRhc2V0LmlkID0gaWQ7XG4gICAgRE9NLnByb2R1Y3ROYW1lLnRleHRDb250ZW50ID0gcHJvZHVjdE5hbWU7XG5cbiAgICAvLyBhc3luYyBmZXRjaFxuICAgIC8vIGRlbGV0ZVByb2R1Y3QoaWQpLnRoZW4oKGRhdGEpID0+IHtcbiAgICAvLyAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAvLyAgICAgVG9hc3QoZGF0YS5tc2csICdzdWNjZXNzJykuc2hvdygpO1xuICAgIC8vICAgICBjb25zb2xlLmxvZygnZGVsZXRlOiBzdWNjZXNzJywgZGF0YSk7XG4gICAgLy8gICAgIGxvYWRQcm9kdWN0cygpO1xuICAgIC8vICAgfSBlbHNlIHtcbiAgICAvLyAgICAgVG9hc3QoZGF0YS5tc2csICdlcnJvcicpLnNob3coKTtcbiAgICAvLyAgICAgY29uc29sZS5lcnJvcihkYXRhKTtcbiAgICAvLyAgIH1cbiAgICAvLyB9KTtcbiAgfTtcblxuICBjb25zdCBvbkNsaWNrQ29uZmlybURlbGV0ZSA9IChlOiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICBjb25zdCBidG5FbCA9IGUuY3VycmVudFRhcmdldCBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgICBjb25zdCBpZDogc3RyaW5nID0gU3RyaW5nKGJ0bkVsLmRhdGFzZXQuaWQpO1xuXG4gICAgLy8gYXN5bmMgZmV0Y2hcbiAgICBkZWxldGVQcm9kdWN0KGlkKS50aGVuKChkYXRhKSA9PiB7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIFRvYXN0KGRhdGEubXNnLCAnc3VjY2VzcycpLnNob3coKTtcbiAgICAgICAgYnNNb2RhbERlbGV0ZS5oaWRlKCk7XG4gICAgICAgIGxvYWRQcm9kdWN0cygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgVG9hc3QoZGF0YS5tc2csICdlcnJvcicpLnNob3coKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihkYXRhKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBvbkNsaWNrTW92ZVVwID0gKGU6IFBvaW50ZXJFdmVudCkgPT4ge1xuICAgIGNvbnN0IGJ0bkVsID0gZS5jdXJyZW50VGFyZ2V0IGFzIEhUTUxCdXR0b25FbGVtZW50O1xuICAgIC8vIGNvbnN0IGN1cnJlbnRSb3dFbCA9IGJ0bkVsLnBhcmVudE5vZGUucGFyZW50Tm9kZTsgLy8gYWt0dWVsbGUgWmVpbGUgKHRyKSBtaXQgZGVtIEJ1dHRvblxuICAgIGNvbnN0IGN1cnJlbnRSb3dFbCA9IHBhcmVudHMoYnRuRWwsICd0cicpWzBdO1xuXG4gICAgLy8gUGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocmVmZXJlbmNlRWxlbWVudCwgdGFyZ2V0RWxlbWVudClcbiAgICAvLyBET00udEJvZHkuaW5zZXJ0QmVmb3JlKGN1cnJlbnRSb3dFbCwgY3VycmVudFJvd0VsLnByZXZpb3VzRWxlbWVudFNpYmxpbmcpO1xuXG4gICAgLy8gdGFyZ2V0RWxlbWVudC5iZWZvcmUocmVmZXJlbmNlRWxlbWVudClcbiAgICBjdXJyZW50Um93RWwucHJldmlvdXNFbGVtZW50U2libGluZyEuYmVmb3JlKGN1cnJlbnRSb3dFbCk7XG5cbiAgICBjb25zb2xlLmxvZygnbW92ZSB1cCcpO1xuICAgIGRpc2FibGVOb25GdW5jdGlvbmFsQnV0dG9ucygpO1xuICB9O1xuXG4gIGNvbnN0IG9uQ2xpY2tNb3ZlRG93biA9IChlOiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICBjb25zdCBidG5FbCA9IGUuY3VycmVudFRhcmdldCBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgICAvLyBjb25zdCBjdXJyZW50Um93RWwgPSBidG5FbC5wYXJlbnROb2RlLnBhcmVudE5vZGU7IC8vIGFrdHVlbGxlIFplaWxlICh0cikgbWl0IGRlbSBCdXR0b25cbiAgICBjb25zdCBjdXJyZW50Um93RWwgPSBwYXJlbnRzKGJ0bkVsLCAndHInKVswXTtcblxuICAgIC8vIFBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHJlZmVyZW5jZUVsZW1lbnQsIHRhcmdldEVsZW1lbnQpXG4gICAgLy8gRE9NLnRCb2R5Lmluc2VydEJlZm9yZShjdXJyZW50Um93RWwsIGN1cnJlbnRSb3dFbC5uZXh0RWxlbWVudFNpYmxpbmcubmV4dEVsZW1lbnRTaWJsaW5nKTtcblxuICAgIC8vIHRhcmdldEVsZW1lbnQuYWZ0ZXIocmVmZXJlbmNlRWxlbWVudClcbiAgICBjdXJyZW50Um93RWwubmV4dEVsZW1lbnRTaWJsaW5nIS5hZnRlcihjdXJyZW50Um93RWwpO1xuXG4gICAgY29uc29sZS5sb2coJ21vdmUgZG93bicpO1xuICAgIGRpc2FibGVOb25GdW5jdGlvbmFsQnV0dG9ucygpO1xuICB9O1xuXG4gIC8vIERyYWcgJ24gRHJvcCBFdmVudEhhbmRsZXJcbiAgY29uc3Qgb25Nb3VzZURvd25EcmFnID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICBjb25zdCBidG5FbCA9IGUuY3VycmVudFRhcmdldCBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgICBjb25zdCBjdXJyZW50Um93RWwgPSBwYXJlbnRzKGJ0bkVsLCAndHInKVswXTtcbiAgICBjdXJyZW50Um93RWwuZHJhZ2dhYmxlID0gdHJ1ZTtcbiAgfTtcblxuICBjb25zdCBvbk1vdXNlVXBEcmFnID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICBjb25zdCBidG5FbCA9IGUuY3VycmVudFRhcmdldCBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgICBjb25zdCBjdXJyZW50Um93RWwgPSBwYXJlbnRzKGJ0bkVsLCAndHInKVswXTtcbiAgICBjdXJyZW50Um93RWwuZHJhZ2dhYmxlID0gZmFsc2U7XG4gIH07XG5cbiAgY29uc3Qgb25EcmFnU3RhcnQgPSAoZTogRHJhZ0V2ZW50KSA9PiB7XG4gICAgY29uc29sZS5sb2coJ0RyYWdFdmVudDogJywgZSk7XG4gICAgY29uc3QgY3VycmVudFJvd0VsID0gZS5jdXJyZW50VGFyZ2V0IGFzIEhUTUxUYWJsZVJvd0VsZW1lbnQ7IC8vIHRyIDwtIGFrdHVlbGxlIFplaWUsIGRpZSBiZXdlZ3Qgd2lyZFxuICAgIGNvbnN0IGlkeDogbnVtYmVyID0gWy4uLmN1cnJlbnRSb3dFbC5wYXJlbnROb2RlIS5jaGlsZHJlbl0uaW5kZXhPZihjdXJyZW50Um93RWwpO1xuXG4gICAgZS5kYXRhVHJhbnNmZXI/LnNldERhdGEoJ3RleHQvcGxhaW4nLCBTdHJpbmcoaWR4KSk7XG4gICAgLy8gZS5kYXRhVHJhbnNmZXIuc2V0RGF0YSgnYXBwbGljYXRpb24vanNvbicsIEpTT04uc3RyaW5naWZ5KHtpZHgsIG5hbWU6IHNvdXJjZUVsZW1lbnR9KSk7XG4gICAgY29uc29sZS5sb2coJ3RyIGluZGV4OicsIGlkeCk7XG4gIH07XG5cbiAgY29uc3Qgb25EcmFnT3ZlciA9IChlOiBEcmFnRXZlbnQpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7IC8vIFdJQ0hUSUchIFNvbnN0IGZ1bmt0aW9uaWVydCBkcm9wIEV2ZW50SGFuZGxlciBuaWNodC5cbiAgfTtcblxuICBjb25zdCBvbkRyb3AgPSAoZTogRHJhZ0V2ZW50KSA9PiB7XG4gICAgY29uc3QgY3VycmVudFJvd0VsID0gZS5jdXJyZW50VGFyZ2V0IGFzIEhUTUxUYWJsZVJvd0VsZW1lbnQ7IC8vIHRyIDwtIFppZWx6ZWlsZSwgYXVmIGRpZSBnZWRyb3BwdCB3aXJkLlxuICAgIGNvbnN0IHRhcmdldElkeCA9IFsuLi5jdXJyZW50Um93RWwucGFyZW50Tm9kZSEuY2hpbGRyZW5dLmluZGV4T2YoY3VycmVudFJvd0VsKTtcbiAgICBjb25zdCBzb3VyY2VJZHg6IG51bWJlciA9IHBhcnNlSW50KGUuZGF0YVRyYW5zZmVyPy5nZXREYXRhKCd0ZXh0L3BsYWluJykgfHwgJzAnKTtcbiAgICAvLyAgY29uc3QgeyBzb3VyY2VJZHggfSA9IEpTT04ucGFyc2UoZS5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgnYXBwbGljYXRpb24vanNvbicpKTtcblxuICAgIGNvbnNvbGUubG9nKHsgdGFyZ2V0SWR4LCBzb3VyY2VJZHggfSk7XG5cbiAgICAvLyBHdWFyZCB3ZW5uIEVsZW1lbnQgYXVmIHNpY2ggc2VsYnN0IGxvc2dlbGFzc2VuIHd1cmRlLCBhYmJydWNoXG4gICAgaWYgKHNvdXJjZUlkeCA9PT0gdGFyZ2V0SWR4KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZHJhZ2dlZEVsID0gRE9NLnRCb2R5LnF1ZXJ5U2VsZWN0b3IoYHRyOm50aC1jaGlsZCgke3NvdXJjZUlkeCArIDF9KWApIGFzIEhUTUxUYWJsZVJvd0VsZW1lbnQ7XG4gICAgLy8gY29uc3QgZHJhZ2dlZEVsID0gRE9NLnRCb2R5LmNoaWxkcmVuW3NvdXJjZUlkeF1cblxuICAgIC8vIFZlcnNjaGllYmUgZGFzIEVsZW1lbnQgaW0gRE9NXG4gICAgaWYgKHNvdXJjZUlkeCA+IHRhcmdldElkeCkge1xuICAgICAgY3VycmVudFJvd0VsLmJlZm9yZShkcmFnZ2VkRWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50Um93RWwuYWZ0ZXIoZHJhZ2dlZEVsKTtcbiAgICB9XG5cbiAgICBkaXNhYmxlTm9uRnVuY3Rpb25hbEJ1dHRvbnMoKTtcbiAgfTtcblxuICAvLyA9PT0gWEhSL0ZFVENIID09PT09PT09XG5cbiAgLy8gSFRUUCAtIE1ldGhvZGUgLSBQQVRDSFxuICAvLyByZXNldCBwcm9kdWN0c1xuICBjb25zdCByZXNldFByb2R1Y3RzID0gYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke0JBU0VfVVJMfS9hcGkvcHJvZHVjdHMvcmVzZXRgLCB7XG4gICAgICAgIG1ldGhvZDogJ1BBVENIJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcmVzZXQ6IHRydWUgfSksXG4gICAgICB9KTsgLy8gSFRUUCBSZXF1ZXN0IFVSTFxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZldGNoIHdlbnQgd3JvbmcuJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpOyAvLyBIVFRQLVJlc3BvbnNlXG5cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBUb2FzdChlcnJvci5tZXNzYWdlLCAnZXJyb3InKS5zaG93KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBUb2FzdCgnQW4gdW5rbm93biBlcnJvciBvY2N1cnJlZC4nLCAnZXJyb3InKS5zaG93KCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH1cbiAgfTtcblxuICAvLyBIVFRQIC0gTWV0aG9kZSAtIFBBVENIXG4gIC8vIHNhdmUgcHJvZHVjdHNcbiAgY29uc3Qgc2F2ZVByb2R1Y3RzID0gYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke0JBU0VfVVJMfS9hcGkvcHJvZHVjdHMvc2F2ZWAsIHtcbiAgICAgICAgbWV0aG9kOiAnUEFUQ0gnLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzYXZlOiB0cnVlIH0pLFxuICAgICAgfSk7IC8vIEhUVFAgUmVxdWVzdCBVUkxcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGZXRjaCB3ZW50IHdyb25nLicpO1xuICAgICAgfVxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTsgLy8gSFRUUC1SZXNwb25zZVxuXG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgVG9hc3QoZXJyb3IubWVzc2FnZSwgJ2Vycm9yJykuc2hvdygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgVG9hc3QoJ0FuIHVua25vd24gZXJyb3Igb2NjdXJyZWQuJywgJ2Vycm9yJykuc2hvdygpO1xuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9XG4gIH07XG5cbiAgLy8gSFRUUCAtIE1ldGhvZGUgLSBQT1NUXG4gIC8vIChDKVJVRCAtIGNyZWF0ZVxuICAvLyBCUkUoQSlEIC0gYWRkIC0gbmV1ZXMgUHJvZHVrdCBoaW56dWbDvGdlblxuICBjb25zdCBjcmVhdGVQcm9kdWN0ID0gYXN5bmMgKHByb2R1Y3Q6IFByb2R1Y3QpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtCQVNFX1VSTH0vYXBpL3Byb2R1Y3RzYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHByb2R1Y3QpLFxuICAgICAgfSk7IC8vIEhUVFAgUmVxdWVzdCBVUkxcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGZXRjaCB3ZW50IHdyb25nLicpO1xuICAgICAgfVxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTsgLy8gSFRUUC1SZXNwb25zZVxuXG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgVG9hc3QoZXJyb3IubWVzc2FnZSwgJ2Vycm9yJykuc2hvdygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgVG9hc3QoJ0FuIHVua25vd24gZXJyb3Igb2NjdXJyZWQuJywgJ2Vycm9yJykuc2hvdygpO1xuICAgICAgfVxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfVxuICB9O1xuXG4gIC8vIEhUVFAgLSBNZXRob2RlIC0gR0VUXG4gIC8vIEMoUilVRCAtIFJlYWRcbiAgLy8gKEIpUkVBRCAtIEJyb3dzZSAtIGF1c2xlc2VuIGFsbGVyIFByb2R1a3RlXG4gIGNvbnN0IGdldFByb2R1Y3RzID0gYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke0JBU0VfVVJMfS9hcGkvcHJvZHVjdHNgKTsgLy8gSFRUUCBSZXF1ZXN0IFVSTFxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZldGNoIHdlbnQgd3JvbmcuJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpOyAvLyBIVFRQLVJlc3BvbnNlXG5cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQW4gdW5rbm93biBlcnJvciBvY2N1cnJlZC4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9XG4gIH07XG5cbiAgLy8gSFRUUCAtIE1ldGhvZGUgLSBHRVRcbiAgLy8gQyhSKVVEIC0gUmVhZFxuICAvLyBCKFIpRUFEIC0gUmVhZCAtIGF1c2xlc2VuIGVpbmVzIFByb2R1a3RzXG4gIGNvbnN0IGdldFByb2R1Y3QgPSBhc3luYyAoaWQ6IHN0cmluZykgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke0JBU0VfVVJMfS9hcGkvcHJvZHVjdHMvJHtpZH1gKTsgLy8gSFRUUCBSZXF1ZXN0IFVSTFxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZldGNoIHdlbnQgd3JvbmcuJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpOyAvLyBIVFRQLVJlc3BvbnNlXG5cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQW4gdW5rbm93biBlcnJvciBvY2N1cnJlZC4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9XG4gIH07XG5cbiAgLy8gSFRUUCAtIE1ldGhvZGUgLSBQVVRcbiAgLy8gQ1IoVSlEIC0gdXBkYXRlXG4gIC8vIEJSKEUpQUQgLSBlZGl0IC0gUHJvZHVrdCBha3R1YWxpc2llcmVuXG4gIGNvbnN0IHVwZGF0ZVByb2R1Y3QgPSBhc3luYyAocHJvZHVjdDogYW55KSA9PiB7XG4gICAgLy8gVE9ETzogVHlwaXNpZXJ1bmcgdmVyYmVzc2VyblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke0JBU0VfVVJMfS9hcGkvcHJvZHVjdHNgLCB7XG4gICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwcm9kdWN0KSxcbiAgICAgIH0pOyAvLyBIVFRQIFJlcXVlc3QgVVJMXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmV0Y2ggd2VudCB3cm9uZy4nKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7IC8vIEhUVFAtUmVzcG9uc2VcblxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IubWVzc2FnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdBbiB1bmtub3duIGVycm9yIG9jY3VycmVkLicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH1cbiAgfTtcblxuICAvLyBIVFRQIC0gTWV0aG9kZSAtIERFTEVURVxuICAvLyBDUlUoRCkgLSBkZWxldGVcbiAgLy8gQlJFQShEKSAtIGRlbGV0ZSAtIFByb2R1a3QgbMO2c2NoZW5cbiAgY29uc3QgZGVsZXRlUHJvZHVjdCA9IGFzeW5jIChpZDogc3RyaW5nKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7QkFTRV9VUkx9L2FwaS9wcm9kdWN0cy8ke2lkfWAsIHtcbiAgICAgICAgbWV0aG9kOiAnREVMRVRFJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH0sXG4gICAgICB9KTsgLy8gSFRUUCBSZXF1ZXN0IFVSTFxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZldGNoIHdlbnQgd3JvbmcuJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfVxuICB9O1xuXG4gIC8vID09PSBGVU5DVElPTlMgPT09PT09PT1cblxuICBjb25zdCBpbml0UHJvZHVjdHMgPSAoKSA9PiB7XG4gICAgZ2V0UHJvZHVjdHMoKS50aGVuKChwcm9kdWN0czogUHJvZHVjdFtdKSA9PiB7XG4gICAgICBwcm9kdWN0cy5mb3JFYWNoKChwcm9kdWN0OiBQcm9kdWN0KSA9PiB7XG4gICAgICAgIGFkZFByb2R1Y3QocHJvZHVjdCk7XG4gICAgICB9KTtcbiAgICAgIFRvYXN0KCdJbml0IHByb2R1Y3RzJykuc2hvdygpO1xuICAgICAgZGlzYWJsZU5vbkZ1bmN0aW9uYWxCdXR0b25zKCk7XG4gICAgfSk7XG5cbiAgICAvLyBQUk9EVUNUUy5mb3JFYWNoKChwcm9kdWN0KSA9PiB7XG4gICAgLy8gICBhZGRQcm9kdWN0KHByb2R1Y3QpO1xuICAgIC8vIH0pO1xuICAgIC8vZGlzYWJsZU5vbkZ1bmN0aW9uYWxCdXR0b25zKCk7XG4gICAgLy8gUFJPRFVDVFMuZm9yRWFjaChhZGRQcm9kdWN0KTtcbiAgfTtcblxuICBjb25zdCBsb2FkUHJvZHVjdHMgPSAoKSA9PiB7XG4gICAgRE9NLnRCb2R5LmlubmVySFRNTCA9ICcnO1xuICAgIGdldFByb2R1Y3RzKCkudGhlbigoZGF0YTogUHJvZHVjdFtdKSA9PiB7XG4gICAgICBkYXRhLmZvckVhY2goKHByb2R1Y3Q6IFByb2R1Y3QpID0+IHtcbiAgICAgICAgYWRkUHJvZHVjdChwcm9kdWN0KTtcbiAgICAgIH0pO1xuICAgICAgZGlzYWJsZU5vbkZ1bmN0aW9uYWxCdXR0b25zKCk7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgYWRkUHJvZHVjdCA9IChwcm9kdWN0OiBQcm9kdWN0KSA9PiB7XG4gICAgY29uc3QgeyBuYW1lLCBwcmljZSwgX2lkOiBpZCwgcG9zaXRpb24gfSA9IHByb2R1Y3Q7XG5cbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kZS9kb2NzL1dlYi9BUEkvSFRNTFRlbXBsYXRlRWxlbWVudC9jb250ZW50XG4gICAgY29uc3QgdHJFbCA9IERPTS50ZW1wbGF0ZVJvdy5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkPy5jbG9uZU5vZGUodHJ1ZSkgYXMgSFRNTFRhYmxlUm93RWxlbWVudDtcblxuICAgIGNvbnN0IHRkTmFtZUVsID0gcXVlcnlTZWxlY3RvclR5cGVkPEhUTUxUYWJsZUNlbGxFbGVtZW50PignLnRkLW5hbWUnLCB0ckVsKTtcbiAgICBjb25zdCB0ZFByaWNlRWwgPSBxdWVyeVNlbGVjdG9yVHlwZWQ8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+KCcudGQtcHJpY2UnLCB0ckVsKTtcbiAgICBjb25zdCBidG5SZW1vdmVFbCA9IHF1ZXJ5U2VsZWN0b3JUeXBlZDxIVE1MQnV0dG9uRWxlbWVudD4oJy5idXR0b24tcHJvZHVjdC1yZW1vdmUnLCB0ckVsKTtcbiAgICBjb25zdCBidG5Nb3ZlVXBFbCA9IHF1ZXJ5U2VsZWN0b3JUeXBlZDxIVE1MQnV0dG9uRWxlbWVudD4oJy5idXR0b24tcHJvZHVjdC1tb3ZlLXVwJywgdHJFbCk7XG4gICAgY29uc3QgYnRuTW92ZURvd25FbCA9IHF1ZXJ5U2VsZWN0b3JUeXBlZDxIVE1MQnV0dG9uRWxlbWVudD4oJy5idXR0b24tcHJvZHVjdC1tb3ZlLWRvd24nLCB0ckVsKTtcblxuICAgIGNvbnN0IGJ0bkRyYWdFbCA9IHF1ZXJ5U2VsZWN0b3JUeXBlZDxIVE1MQnV0dG9uRWxlbWVudD4oJy5idXR0b24tZHJhZycsIHRyRWwpO1xuICAgIGNvbnN0IGJ0bkVkaXRFbCA9IHF1ZXJ5U2VsZWN0b3JUeXBlZDxIVE1MQnV0dG9uRWxlbWVudD4oJy5idXR0b24tcHJvZHVjdC1lZGl0JywgdHJFbCk7XG5cbiAgICB0ZE5hbWVFbC50ZXh0Q29udGVudCA9IFN0cmluZyhuYW1lKTtcbiAgICB0ZFByaWNlRWwudGV4dENvbnRlbnQgPSBTdHJpbmcocHJpY2UpO1xuXG4gICAgYnRuRWRpdEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25DbGlja0VkaXQpO1xuICAgIGJ0blJlbW92ZUVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25DbGlja1JlbW92ZSk7XG4gICAgYnRuTW92ZVVwRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvbkNsaWNrTW92ZVVwKTtcbiAgICBidG5Nb3ZlRG93bkVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25DbGlja01vdmVEb3duKTtcblxuICAgIC8vIERyYWcgJ24gRHJvcCBFdmVudHNcbiAgICBidG5EcmFnRWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgb25Nb3VzZURvd25EcmFnKTtcbiAgICBidG5EcmFnRWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcERyYWcpO1xuXG4gICAgdHJFbC5hZGRFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCBvbkRyYWdTdGFydCk7XG4gICAgdHJFbC5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIG9uRHJhZ092ZXIpO1xuICAgIHRyRWwuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIG9uRHJvcCk7XG5cbiAgICB0ckVsLmRhdGFzZXQuaWQgPSBpZDsgLy8gPHRyIGRhdGEtaWQ9XCIuLi5cIiA+Li4uPC90cj5cbiAgICB0ckVsLmRhdGFzZXQucG9zaXRpb24gPSBTdHJpbmcocG9zaXRpb24pOyAvLyA8dHIgZGF0YS1wb3NpdGlvbj1cIi4uLlwiID4uLi48L3RyPlxuXG4gICAgRE9NLnRCb2R5LmFwcGVuZENoaWxkKHRyRWwpOyAvLyBJbSBET00gaGluenVmw7xnZW5cbiAgfTtcblxuICBjb25zdCBzaG93TW9kYWxFZGl0ID0gKHByb2R1Y3Q6IFByb2R1Y3QpID0+IHtcbiAgICBjb25zdCB7IG5hbWUgPSAnJywgcHJpY2UgPSAwLCBfaWQ6IGlkLCBwb3NpdGlvbiB9ID0gcHJvZHVjdDtcblxuICAgIERPTS5pbnB1dEVkaXROYW1lLnZhbHVlID0gbmFtZTtcbiAgICBET00uaW5wdXRFZGl0UHJpY2UudmFsdWUgPSBTdHJpbmcocHJpY2UpO1xuXG4gICAgRE9NLmlucHV0RWRpdElkLnZhbHVlID0gU3RyaW5nKGlkKTtcbiAgICBET00uaW5wdXRFZGl0UG9zaXRpb24udmFsdWUgPSBTdHJpbmcocG9zaXRpb24pO1xuICB9O1xuXG4gIGNvbnN0IHJlc2V0RmllbGRzID0gKCkgPT4ge1xuICAgIERPTS5idG5BZGQuZGlzYWJsZWQgPSB0cnVlO1xuICAgIERPTS5pbnB1dFByaWNlLnZhbHVlID0gJyc7XG4gICAgRE9NLmlucHV0TmFtZS52YWx1ZSA9ICcnO1xuXG4gICAgRE9NLmZvcm1FZGl0LnJlc2V0KCk7XG4gIH07XG5cbiAgY29uc3QgZGlzYWJsZU5vbkZ1bmN0aW9uYWxCdXR0b25zID0gKCkgPT4ge1xuICAgIEFycmF5LmZyb20oRE9NLnRCb2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RyJykpLmZvckVhY2goKHRyKSA9PiB7XG4gICAgICBjb25zdCBidG5Nb3ZlVXAgPSBxdWVyeVNlbGVjdG9yVHlwZWQ8SFRNTEJ1dHRvbkVsZW1lbnQ+KCcuYnV0dG9uLXByb2R1Y3QtbW92ZS11cCcsIHRyKTtcbiAgICAgIGNvbnN0IGJ0bk1vdmVEb3duID0gcXVlcnlTZWxlY3RvclR5cGVkPEhUTUxCdXR0b25FbGVtZW50PignLmJ1dHRvbi1wcm9kdWN0LW1vdmUtZG93bicsIHRyKTtcblxuICAgICAgYnRuTW92ZVVwLmRpc2FibGVkID0gIXRyLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgICBidG5Nb3ZlRG93bi5kaXNhYmxlZCA9ICF0ci5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgfSk7XG4gIH07XG5cbiAgaW5pdCgpO1xuXG4gIHJldHVybiB7XG4gICAgaW5pdCxcbiAgICBpbml0UHJvZHVjdHMsXG4gICAgcmVzZXRGaWVsZHMsXG4gIH07XG59O1xuXG4vLyBGcmVpZ2FiZSBmw7xyIGltcG9ydFxuZXhwb3J0IGRlZmF1bHQgUHJvZHVjdE1hbmFnZXI7XG4iLCJmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7IHdyaXRhYmxlOiBmYWxzZSB9KTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbi8qIVxuICogU3BsaWRlLmpzXG4gKiBWZXJzaW9uICA6IDQuMS40XG4gKiBMaWNlbnNlICA6IE1JVFxuICogQ29weXJpZ2h0OiAyMDIyIE5hb3Rvc2hpIEZ1aml0YVxuICovXG52YXIgTUVESUFfUFJFRkVSU19SRURVQ0VEX01PVElPTiA9IFwiKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSlcIjtcbnZhciBDUkVBVEVEID0gMTtcbnZhciBNT1VOVEVEID0gMjtcbnZhciBJRExFID0gMztcbnZhciBNT1ZJTkcgPSA0O1xudmFyIFNDUk9MTElORyA9IDU7XG52YXIgRFJBR0dJTkcgPSA2O1xudmFyIERFU1RST1lFRCA9IDc7XG52YXIgU1RBVEVTID0ge1xuICBDUkVBVEVEOiBDUkVBVEVELFxuICBNT1VOVEVEOiBNT1VOVEVELFxuICBJRExFOiBJRExFLFxuICBNT1ZJTkc6IE1PVklORyxcbiAgU0NST0xMSU5HOiBTQ1JPTExJTkcsXG4gIERSQUdHSU5HOiBEUkFHR0lORyxcbiAgREVTVFJPWUVEOiBERVNUUk9ZRURcbn07XG5cbmZ1bmN0aW9uIGVtcHR5KGFycmF5KSB7XG4gIGFycmF5Lmxlbmd0aCA9IDA7XG59XG5cbmZ1bmN0aW9uIHNsaWNlKGFycmF5TGlrZSwgc3RhcnQsIGVuZCkge1xuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJyYXlMaWtlLCBzdGFydCwgZW5kKTtcbn1cblxuZnVuY3Rpb24gYXBwbHkoZnVuYykge1xuICByZXR1cm4gZnVuYy5iaW5kLmFwcGx5KGZ1bmMsIFtudWxsXS5jb25jYXQoc2xpY2UoYXJndW1lbnRzLCAxKSkpO1xufVxuXG52YXIgbmV4dFRpY2sgPSBzZXRUaW1lb3V0O1xuXG52YXIgbm9vcCA9IGZ1bmN0aW9uIG5vb3AoKSB7fTtcblxuZnVuY3Rpb24gcmFmKGZ1bmMpIHtcbiAgcmV0dXJuIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jKTtcbn1cblxuZnVuY3Rpb24gdHlwZU9mKHR5cGUsIHN1YmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBzdWJqZWN0ID09PSB0eXBlO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdChzdWJqZWN0KSB7XG4gIHJldHVybiAhaXNOdWxsKHN1YmplY3QpICYmIHR5cGVPZihcIm9iamVjdFwiLCBzdWJqZWN0KTtcbn1cblxudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xudmFyIGlzRnVuY3Rpb24gPSBhcHBseSh0eXBlT2YsIFwiZnVuY3Rpb25cIik7XG52YXIgaXNTdHJpbmcgPSBhcHBseSh0eXBlT2YsIFwic3RyaW5nXCIpO1xudmFyIGlzVW5kZWZpbmVkID0gYXBwbHkodHlwZU9mLCBcInVuZGVmaW5lZFwiKTtcblxuZnVuY3Rpb24gaXNOdWxsKHN1YmplY3QpIHtcbiAgcmV0dXJuIHN1YmplY3QgPT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIGlzSFRNTEVsZW1lbnQoc3ViamVjdCkge1xuICB0cnkge1xuICAgIHJldHVybiBzdWJqZWN0IGluc3RhbmNlb2YgKHN1YmplY3Qub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3cpLkhUTUxFbGVtZW50O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvQXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIGlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xufVxuXG5mdW5jdGlvbiBmb3JFYWNoKHZhbHVlcywgaXRlcmF0ZWUpIHtcbiAgdG9BcnJheSh2YWx1ZXMpLmZvckVhY2goaXRlcmF0ZWUpO1xufVxuXG5mdW5jdGlvbiBpbmNsdWRlcyhhcnJheSwgdmFsdWUpIHtcbiAgcmV0dXJuIGFycmF5LmluZGV4T2YodmFsdWUpID4gLTE7XG59XG5cbmZ1bmN0aW9uIHB1c2goYXJyYXksIGl0ZW1zKSB7XG4gIGFycmF5LnB1c2guYXBwbHkoYXJyYXksIHRvQXJyYXkoaXRlbXMpKTtcbiAgcmV0dXJuIGFycmF5O1xufVxuXG5mdW5jdGlvbiB0b2dnbGVDbGFzcyhlbG0sIGNsYXNzZXMsIGFkZCkge1xuICBpZiAoZWxtKSB7XG4gICAgZm9yRWFjaChjbGFzc2VzLCBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgZWxtLmNsYXNzTGlzdFthZGQgPyBcImFkZFwiIDogXCJyZW1vdmVcIl0obmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkQ2xhc3MoZWxtLCBjbGFzc2VzKSB7XG4gIHRvZ2dsZUNsYXNzKGVsbSwgaXNTdHJpbmcoY2xhc3NlcykgPyBjbGFzc2VzLnNwbGl0KFwiIFwiKSA6IGNsYXNzZXMsIHRydWUpO1xufVxuXG5mdW5jdGlvbiBhcHBlbmQocGFyZW50LCBjaGlsZHJlbikge1xuICBmb3JFYWNoKGNoaWxkcmVuLCBwYXJlbnQuYXBwZW5kQ2hpbGQuYmluZChwYXJlbnQpKTtcbn1cblxuZnVuY3Rpb24gYmVmb3JlKG5vZGVzLCByZWYpIHtcbiAgZm9yRWFjaChub2RlcywgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICB2YXIgcGFyZW50ID0gKHJlZiB8fCBub2RlKS5wYXJlbnROb2RlO1xuXG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShub2RlLCByZWYpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXMoZWxtLCBzZWxlY3Rvcikge1xuICByZXR1cm4gaXNIVE1MRWxlbWVudChlbG0pICYmIChlbG1bXCJtc01hdGNoZXNTZWxlY3RvclwiXSB8fCBlbG0ubWF0Y2hlcykuY2FsbChlbG0sIHNlbGVjdG9yKTtcbn1cblxuZnVuY3Rpb24gY2hpbGRyZW4ocGFyZW50LCBzZWxlY3Rvcikge1xuICB2YXIgY2hpbGRyZW4yID0gcGFyZW50ID8gc2xpY2UocGFyZW50LmNoaWxkcmVuKSA6IFtdO1xuICByZXR1cm4gc2VsZWN0b3IgPyBjaGlsZHJlbjIuZmlsdGVyKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBtYXRjaGVzKGNoaWxkLCBzZWxlY3Rvcik7XG4gIH0pIDogY2hpbGRyZW4yO1xufVxuXG5mdW5jdGlvbiBjaGlsZChwYXJlbnQsIHNlbGVjdG9yKSB7XG4gIHJldHVybiBzZWxlY3RvciA/IGNoaWxkcmVuKHBhcmVudCwgc2VsZWN0b3IpWzBdIDogcGFyZW50LmZpcnN0RWxlbWVudENoaWxkO1xufVxuXG52YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzO1xuXG5mdW5jdGlvbiBmb3JPd24ob2JqZWN0LCBpdGVyYXRlZSwgcmlnaHQpIHtcbiAgaWYgKG9iamVjdCkge1xuICAgIChyaWdodCA/IG93bktleXMob2JqZWN0KS5yZXZlcnNlKCkgOiBvd25LZXlzKG9iamVjdCkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAga2V5ICE9PSBcIl9fcHJvdG9fX1wiICYmIGl0ZXJhdGVlKG9iamVjdFtrZXldLCBrZXkpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG9iamVjdDtcbn1cblxuZnVuY3Rpb24gYXNzaWduKG9iamVjdCkge1xuICBzbGljZShhcmd1bWVudHMsIDEpLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgIGZvck93bihzb3VyY2UsIGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICBvYmplY3Rba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIG9iamVjdDtcbn1cblxuZnVuY3Rpb24gbWVyZ2Uob2JqZWN0KSB7XG4gIHNsaWNlKGFyZ3VtZW50cywgMSkuZm9yRWFjaChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgZm9yT3duKHNvdXJjZSwgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBvYmplY3Rba2V5XSA9IHZhbHVlLnNsaWNlKCk7XG4gICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICBvYmplY3Rba2V5XSA9IG1lcmdlKHt9LCBpc09iamVjdChvYmplY3Rba2V5XSkgPyBvYmplY3Rba2V5XSA6IHt9LCB2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIG9iamVjdDtcbn1cblxuZnVuY3Rpb24gb21pdChvYmplY3QsIGtleXMpIHtcbiAgZm9yRWFjaChrZXlzIHx8IG93bktleXMob2JqZWN0KSwgZnVuY3Rpb24gKGtleSkge1xuICAgIGRlbGV0ZSBvYmplY3Rba2V5XTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUF0dHJpYnV0ZShlbG1zLCBhdHRycykge1xuICBmb3JFYWNoKGVsbXMsIGZ1bmN0aW9uIChlbG0pIHtcbiAgICBmb3JFYWNoKGF0dHJzLCBmdW5jdGlvbiAoYXR0cikge1xuICAgICAgZWxtICYmIGVsbS5yZW1vdmVBdHRyaWJ1dGUoYXR0cik7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGUoZWxtcywgYXR0cnMsIHZhbHVlKSB7XG4gIGlmIChpc09iamVjdChhdHRycykpIHtcbiAgICBmb3JPd24oYXR0cnMsIGZ1bmN0aW9uICh2YWx1ZTIsIG5hbWUpIHtcbiAgICAgIHNldEF0dHJpYnV0ZShlbG1zLCBuYW1lLCB2YWx1ZTIpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGZvckVhY2goZWxtcywgZnVuY3Rpb24gKGVsbSkge1xuICAgICAgaXNOdWxsKHZhbHVlKSB8fCB2YWx1ZSA9PT0gXCJcIiA/IHJlbW92ZUF0dHJpYnV0ZShlbG0sIGF0dHJzKSA6IGVsbS5zZXRBdHRyaWJ1dGUoYXR0cnMsIFN0cmluZyh2YWx1ZSkpO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZSh0YWcsIGF0dHJzLCBwYXJlbnQpIHtcbiAgdmFyIGVsbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcblxuICBpZiAoYXR0cnMpIHtcbiAgICBpc1N0cmluZyhhdHRycykgPyBhZGRDbGFzcyhlbG0sIGF0dHJzKSA6IHNldEF0dHJpYnV0ZShlbG0sIGF0dHJzKTtcbiAgfVxuXG4gIHBhcmVudCAmJiBhcHBlbmQocGFyZW50LCBlbG0pO1xuICByZXR1cm4gZWxtO1xufVxuXG5mdW5jdGlvbiBzdHlsZShlbG0sIHByb3AsIHZhbHVlKSB7XG4gIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZShlbG0pW3Byb3BdO1xuICB9XG5cbiAgaWYgKCFpc051bGwodmFsdWUpKSB7XG4gICAgZWxtLnN0eWxlW3Byb3BdID0gXCJcIiArIHZhbHVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpc3BsYXkoZWxtLCBkaXNwbGF5Mikge1xuICBzdHlsZShlbG0sIFwiZGlzcGxheVwiLCBkaXNwbGF5Mik7XG59XG5cbmZ1bmN0aW9uIGZvY3VzKGVsbSkge1xuICBlbG1bXCJzZXRBY3RpdmVcIl0gJiYgZWxtW1wic2V0QWN0aXZlXCJdKCkgfHwgZWxtLmZvY3VzKHtcbiAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRBdHRyaWJ1dGUoZWxtLCBhdHRyKSB7XG4gIHJldHVybiBlbG0uZ2V0QXR0cmlidXRlKGF0dHIpO1xufVxuXG5mdW5jdGlvbiBoYXNDbGFzcyhlbG0sIGNsYXNzTmFtZSkge1xuICByZXR1cm4gZWxtICYmIGVsbS5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKTtcbn1cblxuZnVuY3Rpb24gcmVjdCh0YXJnZXQpIHtcbiAgcmV0dXJuIHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlKG5vZGVzKSB7XG4gIGZvckVhY2gobm9kZXMsIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgaWYgKG5vZGUgJiYgbm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcGFyc2VIdG1sKGh0bWwpIHtcbiAgcmV0dXJuIGNoaWxkKG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoaHRtbCwgXCJ0ZXh0L2h0bWxcIikuYm9keSk7XG59XG5cbmZ1bmN0aW9uIHByZXZlbnQoZSwgc3RvcFByb3BhZ2F0aW9uKSB7XG4gIGUucHJldmVudERlZmF1bHQoKTtcblxuICBpZiAoc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHF1ZXJ5KHBhcmVudCwgc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHBhcmVudCAmJiBwYXJlbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG59XG5cbmZ1bmN0aW9uIHF1ZXJ5QWxsKHBhcmVudCwgc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHNlbGVjdG9yID8gc2xpY2UocGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpKSA6IFtdO1xufVxuXG5mdW5jdGlvbiByZW1vdmVDbGFzcyhlbG0sIGNsYXNzZXMpIHtcbiAgdG9nZ2xlQ2xhc3MoZWxtLCBjbGFzc2VzLCBmYWxzZSk7XG59XG5cbmZ1bmN0aW9uIHRpbWVPZihlKSB7XG4gIHJldHVybiBlLnRpbWVTdGFtcDtcbn1cblxuZnVuY3Rpb24gdW5pdCh2YWx1ZSkge1xuICByZXR1cm4gaXNTdHJpbmcodmFsdWUpID8gdmFsdWUgOiB2YWx1ZSA/IHZhbHVlICsgXCJweFwiIDogXCJcIjtcbn1cblxudmFyIFBST0pFQ1RfQ09ERSA9IFwic3BsaWRlXCI7XG52YXIgREFUQV9BVFRSSUJVVEUgPSBcImRhdGEtXCIgKyBQUk9KRUNUX0NPREU7XG5cbmZ1bmN0aW9uIGFzc2VydChjb25kaXRpb24sIG1lc3NhZ2UpIHtcbiAgaWYgKCFjb25kaXRpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJbXCIgKyBQUk9KRUNUX0NPREUgKyBcIl0gXCIgKyAobWVzc2FnZSB8fCBcIlwiKSk7XG4gIH1cbn1cblxudmFyIG1pbiA9IE1hdGgubWluLFxuICAgIG1heCA9IE1hdGgubWF4LFxuICAgIGZsb29yID0gTWF0aC5mbG9vcixcbiAgICBjZWlsID0gTWF0aC5jZWlsLFxuICAgIGFicyA9IE1hdGguYWJzO1xuXG5mdW5jdGlvbiBhcHByb3hpbWF0ZWx5RXF1YWwoeCwgeSwgZXBzaWxvbikge1xuICByZXR1cm4gYWJzKHggLSB5KSA8IGVwc2lsb247XG59XG5cbmZ1bmN0aW9uIGJldHdlZW4obnVtYmVyLCB4LCB5LCBleGNsdXNpdmUpIHtcbiAgdmFyIG1pbmltdW0gPSBtaW4oeCwgeSk7XG4gIHZhciBtYXhpbXVtID0gbWF4KHgsIHkpO1xuICByZXR1cm4gZXhjbHVzaXZlID8gbWluaW11bSA8IG51bWJlciAmJiBudW1iZXIgPCBtYXhpbXVtIDogbWluaW11bSA8PSBudW1iZXIgJiYgbnVtYmVyIDw9IG1heGltdW07XG59XG5cbmZ1bmN0aW9uIGNsYW1wKG51bWJlciwgeCwgeSkge1xuICB2YXIgbWluaW11bSA9IG1pbih4LCB5KTtcbiAgdmFyIG1heGltdW0gPSBtYXgoeCwgeSk7XG4gIHJldHVybiBtaW4obWF4KG1pbmltdW0sIG51bWJlciksIG1heGltdW0pO1xufVxuXG5mdW5jdGlvbiBzaWduKHgpIHtcbiAgcmV0dXJuICsoeCA+IDApIC0gKyh4IDwgMCk7XG59XG5cbmZ1bmN0aW9uIGNhbWVsVG9LZWJhYihzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCBcIiQxLSQyXCIpLnRvTG93ZXJDYXNlKCk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdChzdHJpbmcsIHJlcGxhY2VtZW50cykge1xuICBmb3JFYWNoKHJlcGxhY2VtZW50cywgZnVuY3Rpb24gKHJlcGxhY2VtZW50KSB7XG4gICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoXCIlc1wiLCBcIlwiICsgcmVwbGFjZW1lbnQpO1xuICB9KTtcbiAgcmV0dXJuIHN0cmluZztcbn1cblxuZnVuY3Rpb24gcGFkKG51bWJlcikge1xuICByZXR1cm4gbnVtYmVyIDwgMTAgPyBcIjBcIiArIG51bWJlciA6IFwiXCIgKyBudW1iZXI7XG59XG5cbnZhciBpZHMgPSB7fTtcblxuZnVuY3Rpb24gdW5pcXVlSWQocHJlZml4KSB7XG4gIHJldHVybiBcIlwiICsgcHJlZml4ICsgcGFkKGlkc1twcmVmaXhdID0gKGlkc1twcmVmaXhdIHx8IDApICsgMSk7XG59XG5cbmZ1bmN0aW9uIEV2ZW50QmluZGVyKCkge1xuICB2YXIgbGlzdGVuZXJzID0gW107XG5cbiAgZnVuY3Rpb24gYmluZCh0YXJnZXRzLCBldmVudHMsIGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gICAgZm9yRWFjaEV2ZW50KHRhcmdldHMsIGV2ZW50cywgZnVuY3Rpb24gKHRhcmdldCwgZXZlbnQsIG5hbWVzcGFjZSkge1xuICAgICAgdmFyIGlzRXZlbnRUYXJnZXQgPSAoXCJhZGRFdmVudExpc3RlbmVyXCIgaW4gdGFyZ2V0KTtcbiAgICAgIHZhciByZW1vdmVyID0gaXNFdmVudFRhcmdldCA/IHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyLmJpbmQodGFyZ2V0LCBldmVudCwgY2FsbGJhY2ssIG9wdGlvbnMpIDogdGFyZ2V0W1wicmVtb3ZlTGlzdGVuZXJcIl0uYmluZCh0YXJnZXQsIGNhbGxiYWNrKTtcbiAgICAgIGlzRXZlbnRUYXJnZXQgPyB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgY2FsbGJhY2ssIG9wdGlvbnMpIDogdGFyZ2V0W1wiYWRkTGlzdGVuZXJcIl0oY2FsbGJhY2spO1xuICAgICAgbGlzdGVuZXJzLnB1c2goW3RhcmdldCwgZXZlbnQsIG5hbWVzcGFjZSwgY2FsbGJhY2ssIHJlbW92ZXJdKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVuYmluZCh0YXJnZXRzLCBldmVudHMsIGNhbGxiYWNrKSB7XG4gICAgZm9yRWFjaEV2ZW50KHRhcmdldHMsIGV2ZW50cywgZnVuY3Rpb24gKHRhcmdldCwgZXZlbnQsIG5hbWVzcGFjZSkge1xuICAgICAgbGlzdGVuZXJzID0gbGlzdGVuZXJzLmZpbHRlcihmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKGxpc3RlbmVyWzBdID09PSB0YXJnZXQgJiYgbGlzdGVuZXJbMV0gPT09IGV2ZW50ICYmIGxpc3RlbmVyWzJdID09PSBuYW1lc3BhY2UgJiYgKCFjYWxsYmFjayB8fCBsaXN0ZW5lclszXSA9PT0gY2FsbGJhY2spKSB7XG4gICAgICAgICAgbGlzdGVuZXJbNF0oKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZGlzcGF0Y2godGFyZ2V0LCB0eXBlLCBkZXRhaWwpIHtcbiAgICB2YXIgZTtcbiAgICB2YXIgYnViYmxlcyA9IHRydWU7XG5cbiAgICBpZiAodHlwZW9mIEN1c3RvbUV2ZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGUgPSBuZXcgQ3VzdG9tRXZlbnQodHlwZSwge1xuICAgICAgICBidWJibGVzOiBidWJibGVzLFxuICAgICAgICBkZXRhaWw6IGRldGFpbFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGUgPSBkb2N1bWVudC5jcmVhdGVFdmVudChcIkN1c3RvbUV2ZW50XCIpO1xuICAgICAgZS5pbml0Q3VzdG9tRXZlbnQodHlwZSwgYnViYmxlcywgZmFsc2UsIGRldGFpbCk7XG4gICAgfVxuXG4gICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQoZSk7XG4gICAgcmV0dXJuIGU7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JFYWNoRXZlbnQodGFyZ2V0cywgZXZlbnRzLCBpdGVyYXRlZSkge1xuICAgIGZvckVhY2godGFyZ2V0cywgZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgdGFyZ2V0ICYmIGZvckVhY2goZXZlbnRzLCBmdW5jdGlvbiAoZXZlbnRzMikge1xuICAgICAgICBldmVudHMyLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGZ1bmN0aW9uIChldmVudE5TKSB7XG4gICAgICAgICAgdmFyIGZyYWdtZW50ID0gZXZlbnROUy5zcGxpdChcIi5cIik7XG4gICAgICAgICAgaXRlcmF0ZWUodGFyZ2V0LCBmcmFnbWVudFswXSwgZnJhZ21lbnRbMV0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICBsaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgZGF0YVs0XSgpO1xuICAgIH0pO1xuICAgIGVtcHR5KGxpc3RlbmVycyk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJpbmQ6IGJpbmQsXG4gICAgdW5iaW5kOiB1bmJpbmQsXG4gICAgZGlzcGF0Y2g6IGRpc3BhdGNoLFxuICAgIGRlc3Ryb3k6IGRlc3Ryb3lcbiAgfTtcbn1cblxudmFyIEVWRU5UX01PVU5URUQgPSBcIm1vdW50ZWRcIjtcbnZhciBFVkVOVF9SRUFEWSA9IFwicmVhZHlcIjtcbnZhciBFVkVOVF9NT1ZFID0gXCJtb3ZlXCI7XG52YXIgRVZFTlRfTU9WRUQgPSBcIm1vdmVkXCI7XG52YXIgRVZFTlRfQ0xJQ0sgPSBcImNsaWNrXCI7XG52YXIgRVZFTlRfQUNUSVZFID0gXCJhY3RpdmVcIjtcbnZhciBFVkVOVF9JTkFDVElWRSA9IFwiaW5hY3RpdmVcIjtcbnZhciBFVkVOVF9WSVNJQkxFID0gXCJ2aXNpYmxlXCI7XG52YXIgRVZFTlRfSElEREVOID0gXCJoaWRkZW5cIjtcbnZhciBFVkVOVF9SRUZSRVNIID0gXCJyZWZyZXNoXCI7XG52YXIgRVZFTlRfVVBEQVRFRCA9IFwidXBkYXRlZFwiO1xudmFyIEVWRU5UX1JFU0laRSA9IFwicmVzaXplXCI7XG52YXIgRVZFTlRfUkVTSVpFRCA9IFwicmVzaXplZFwiO1xudmFyIEVWRU5UX0RSQUcgPSBcImRyYWdcIjtcbnZhciBFVkVOVF9EUkFHR0lORyA9IFwiZHJhZ2dpbmdcIjtcbnZhciBFVkVOVF9EUkFHR0VEID0gXCJkcmFnZ2VkXCI7XG52YXIgRVZFTlRfU0NST0xMID0gXCJzY3JvbGxcIjtcbnZhciBFVkVOVF9TQ1JPTExFRCA9IFwic2Nyb2xsZWRcIjtcbnZhciBFVkVOVF9PVkVSRkxPVyA9IFwib3ZlcmZsb3dcIjtcbnZhciBFVkVOVF9ERVNUUk9ZID0gXCJkZXN0cm95XCI7XG52YXIgRVZFTlRfQVJST1dTX01PVU5URUQgPSBcImFycm93czptb3VudGVkXCI7XG52YXIgRVZFTlRfQVJST1dTX1VQREFURUQgPSBcImFycm93czp1cGRhdGVkXCI7XG52YXIgRVZFTlRfUEFHSU5BVElPTl9NT1VOVEVEID0gXCJwYWdpbmF0aW9uOm1vdW50ZWRcIjtcbnZhciBFVkVOVF9QQUdJTkFUSU9OX1VQREFURUQgPSBcInBhZ2luYXRpb246dXBkYXRlZFwiO1xudmFyIEVWRU5UX05BVklHQVRJT05fTU9VTlRFRCA9IFwibmF2aWdhdGlvbjptb3VudGVkXCI7XG52YXIgRVZFTlRfQVVUT1BMQVlfUExBWSA9IFwiYXV0b3BsYXk6cGxheVwiO1xudmFyIEVWRU5UX0FVVE9QTEFZX1BMQVlJTkcgPSBcImF1dG9wbGF5OnBsYXlpbmdcIjtcbnZhciBFVkVOVF9BVVRPUExBWV9QQVVTRSA9IFwiYXV0b3BsYXk6cGF1c2VcIjtcbnZhciBFVkVOVF9MQVpZTE9BRF9MT0FERUQgPSBcImxhenlsb2FkOmxvYWRlZFwiO1xudmFyIEVWRU5UX1NMSURFX0tFWURPV04gPSBcInNrXCI7XG52YXIgRVZFTlRfU0hJRlRFRCA9IFwic2hcIjtcbnZhciBFVkVOVF9FTkRfSU5ERVhfQ0hBTkdFRCA9IFwiZWlcIjtcblxuZnVuY3Rpb24gRXZlbnRJbnRlcmZhY2UoU3BsaWRlMikge1xuICB2YXIgYnVzID0gU3BsaWRlMiA/IFNwbGlkZTIuZXZlbnQuYnVzIDogZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICB2YXIgYmluZGVyID0gRXZlbnRCaW5kZXIoKTtcblxuICBmdW5jdGlvbiBvbihldmVudHMsIGNhbGxiYWNrKSB7XG4gICAgYmluZGVyLmJpbmQoYnVzLCB0b0FycmF5KGV2ZW50cykuam9pbihcIiBcIiksIGZ1bmN0aW9uIChlKSB7XG4gICAgICBjYWxsYmFjay5hcHBseShjYWxsYmFjaywgaXNBcnJheShlLmRldGFpbCkgPyBlLmRldGFpbCA6IFtdKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGVtaXQoZXZlbnQpIHtcbiAgICBiaW5kZXIuZGlzcGF0Y2goYnVzLCBldmVudCwgc2xpY2UoYXJndW1lbnRzLCAxKSk7XG4gIH1cblxuICBpZiAoU3BsaWRlMikge1xuICAgIFNwbGlkZTIuZXZlbnQub24oRVZFTlRfREVTVFJPWSwgYmluZGVyLmRlc3Ryb3kpO1xuICB9XG5cbiAgcmV0dXJuIGFzc2lnbihiaW5kZXIsIHtcbiAgICBidXM6IGJ1cyxcbiAgICBvbjogb24sXG4gICAgb2ZmOiBhcHBseShiaW5kZXIudW5iaW5kLCBidXMpLFxuICAgIGVtaXQ6IGVtaXRcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIFJlcXVlc3RJbnRlcnZhbChpbnRlcnZhbCwgb25JbnRlcnZhbCwgb25VcGRhdGUsIGxpbWl0KSB7XG4gIHZhciBub3cgPSBEYXRlLm5vdztcbiAgdmFyIHN0YXJ0VGltZTtcbiAgdmFyIHJhdGUgPSAwO1xuICB2YXIgaWQ7XG4gIHZhciBwYXVzZWQgPSB0cnVlO1xuICB2YXIgY291bnQgPSAwO1xuXG4gIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICBpZiAoIXBhdXNlZCkge1xuICAgICAgcmF0ZSA9IGludGVydmFsID8gbWluKChub3coKSAtIHN0YXJ0VGltZSkgLyBpbnRlcnZhbCwgMSkgOiAxO1xuICAgICAgb25VcGRhdGUgJiYgb25VcGRhdGUocmF0ZSk7XG5cbiAgICAgIGlmIChyYXRlID49IDEpIHtcbiAgICAgICAgb25JbnRlcnZhbCgpO1xuICAgICAgICBzdGFydFRpbWUgPSBub3coKTtcblxuICAgICAgICBpZiAobGltaXQgJiYgKytjb3VudCA+PSBsaW1pdCkge1xuICAgICAgICAgIHJldHVybiBwYXVzZSgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlkID0gcmFmKHVwZGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3RhcnQocmVzdW1lKSB7XG4gICAgcmVzdW1lIHx8IGNhbmNlbCgpO1xuICAgIHN0YXJ0VGltZSA9IG5vdygpIC0gKHJlc3VtZSA/IHJhdGUgKiBpbnRlcnZhbCA6IDApO1xuICAgIHBhdXNlZCA9IGZhbHNlO1xuICAgIGlkID0gcmFmKHVwZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBwYXVzZSgpIHtcbiAgICBwYXVzZWQgPSB0cnVlO1xuICB9XG5cbiAgZnVuY3Rpb24gcmV3aW5kKCkge1xuICAgIHN0YXJ0VGltZSA9IG5vdygpO1xuICAgIHJhdGUgPSAwO1xuXG4gICAgaWYgKG9uVXBkYXRlKSB7XG4gICAgICBvblVwZGF0ZShyYXRlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgaWQgJiYgY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWQpO1xuICAgIHJhdGUgPSAwO1xuICAgIGlkID0gMDtcbiAgICBwYXVzZWQgPSB0cnVlO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0KHRpbWUpIHtcbiAgICBpbnRlcnZhbCA9IHRpbWU7XG4gIH1cblxuICBmdW5jdGlvbiBpc1BhdXNlZCgpIHtcbiAgICByZXR1cm4gcGF1c2VkO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydDogc3RhcnQsXG4gICAgcmV3aW5kOiByZXdpbmQsXG4gICAgcGF1c2U6IHBhdXNlLFxuICAgIGNhbmNlbDogY2FuY2VsLFxuICAgIHNldDogc2V0LFxuICAgIGlzUGF1c2VkOiBpc1BhdXNlZFxuICB9O1xufVxuXG5mdW5jdGlvbiBTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgdmFyIHN0YXRlID0gaW5pdGlhbFN0YXRlO1xuXG4gIGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgIHN0YXRlID0gdmFsdWU7XG4gIH1cblxuICBmdW5jdGlvbiBpcyhzdGF0ZXMpIHtcbiAgICByZXR1cm4gaW5jbHVkZXModG9BcnJheShzdGF0ZXMpLCBzdGF0ZSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHNldDogc2V0LFxuICAgIGlzOiBpc1xuICB9O1xufVxuXG5mdW5jdGlvbiBUaHJvdHRsZShmdW5jLCBkdXJhdGlvbikge1xuICB2YXIgaW50ZXJ2YWwgPSBSZXF1ZXN0SW50ZXJ2YWwoZHVyYXRpb24gfHwgMCwgZnVuYywgbnVsbCwgMSk7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaW50ZXJ2YWwuaXNQYXVzZWQoKSAmJiBpbnRlcnZhbC5zdGFydCgpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBNZWRpYShTcGxpZGUyLCBDb21wb25lbnRzMiwgb3B0aW9ucykge1xuICB2YXIgc3RhdGUgPSBTcGxpZGUyLnN0YXRlO1xuICB2YXIgYnJlYWtwb2ludHMgPSBvcHRpb25zLmJyZWFrcG9pbnRzIHx8IHt9O1xuICB2YXIgcmVkdWNlZE1vdGlvbiA9IG9wdGlvbnMucmVkdWNlZE1vdGlvbiB8fCB7fTtcbiAgdmFyIGJpbmRlciA9IEV2ZW50QmluZGVyKCk7XG4gIHZhciBxdWVyaWVzID0gW107XG5cbiAgZnVuY3Rpb24gc2V0dXAoKSB7XG4gICAgdmFyIGlzTWluID0gb3B0aW9ucy5tZWRpYVF1ZXJ5ID09PSBcIm1pblwiO1xuICAgIG93bktleXMoYnJlYWtwb2ludHMpLnNvcnQoZnVuY3Rpb24gKG4sIG0pIHtcbiAgICAgIHJldHVybiBpc01pbiA/ICtuIC0gK20gOiArbSAtICtuO1xuICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgcmVnaXN0ZXIoYnJlYWtwb2ludHNba2V5XSwgXCIoXCIgKyAoaXNNaW4gPyBcIm1pblwiIDogXCJtYXhcIikgKyBcIi13aWR0aDpcIiArIGtleSArIFwicHgpXCIpO1xuICAgIH0pO1xuICAgIHJlZ2lzdGVyKHJlZHVjZWRNb3Rpb24sIE1FRElBX1BSRUZFUlNfUkVEVUNFRF9NT1RJT04pO1xuICAgIHVwZGF0ZSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVzdHJveShjb21wbGV0ZWx5KSB7XG4gICAgaWYgKGNvbXBsZXRlbHkpIHtcbiAgICAgIGJpbmRlci5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVnaXN0ZXIob3B0aW9uczIsIHF1ZXJ5KSB7XG4gICAgdmFyIHF1ZXJ5TGlzdCA9IG1hdGNoTWVkaWEocXVlcnkpO1xuICAgIGJpbmRlci5iaW5kKHF1ZXJ5TGlzdCwgXCJjaGFuZ2VcIiwgdXBkYXRlKTtcbiAgICBxdWVyaWVzLnB1c2goW29wdGlvbnMyLCBxdWVyeUxpc3RdKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICB2YXIgZGVzdHJveWVkID0gc3RhdGUuaXMoREVTVFJPWUVEKTtcbiAgICB2YXIgZGlyZWN0aW9uID0gb3B0aW9ucy5kaXJlY3Rpb247XG4gICAgdmFyIG1lcmdlZCA9IHF1ZXJpZXMucmVkdWNlKGZ1bmN0aW9uIChtZXJnZWQyLCBlbnRyeSkge1xuICAgICAgcmV0dXJuIG1lcmdlKG1lcmdlZDIsIGVudHJ5WzFdLm1hdGNoZXMgPyBlbnRyeVswXSA6IHt9KTtcbiAgICB9LCB7fSk7XG4gICAgb21pdChvcHRpb25zKTtcbiAgICBzZXQobWVyZ2VkKTtcblxuICAgIGlmIChvcHRpb25zLmRlc3Ryb3kpIHtcbiAgICAgIFNwbGlkZTIuZGVzdHJveShvcHRpb25zLmRlc3Ryb3kgPT09IFwiY29tcGxldGVseVwiKTtcbiAgICB9IGVsc2UgaWYgKGRlc3Ryb3llZCkge1xuICAgICAgZGVzdHJveSh0cnVlKTtcbiAgICAgIFNwbGlkZTIubW91bnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGlyZWN0aW9uICE9PSBvcHRpb25zLmRpcmVjdGlvbiAmJiBTcGxpZGUyLnJlZnJlc2goKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWR1Y2UoZW5hYmxlKSB7XG4gICAgaWYgKG1hdGNoTWVkaWEoTUVESUFfUFJFRkVSU19SRURVQ0VEX01PVElPTikubWF0Y2hlcykge1xuICAgICAgZW5hYmxlID8gbWVyZ2Uob3B0aW9ucywgcmVkdWNlZE1vdGlvbikgOiBvbWl0KG9wdGlvbnMsIG93bktleXMocmVkdWNlZE1vdGlvbikpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNldChvcHRzLCBiYXNlLCBub3RpZnkpIHtcbiAgICBtZXJnZShvcHRpb25zLCBvcHRzKTtcbiAgICBiYXNlICYmIG1lcmdlKE9iamVjdC5nZXRQcm90b3R5cGVPZihvcHRpb25zKSwgb3B0cyk7XG5cbiAgICBpZiAobm90aWZ5IHx8ICFzdGF0ZS5pcyhDUkVBVEVEKSkge1xuICAgICAgU3BsaWRlMi5lbWl0KEVWRU5UX1VQREFURUQsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2V0dXA6IHNldHVwLFxuICAgIGRlc3Ryb3k6IGRlc3Ryb3ksXG4gICAgcmVkdWNlOiByZWR1Y2UsXG4gICAgc2V0OiBzZXRcbiAgfTtcbn1cblxudmFyIEFSUk9XID0gXCJBcnJvd1wiO1xudmFyIEFSUk9XX0xFRlQgPSBBUlJPVyArIFwiTGVmdFwiO1xudmFyIEFSUk9XX1JJR0hUID0gQVJST1cgKyBcIlJpZ2h0XCI7XG52YXIgQVJST1dfVVAgPSBBUlJPVyArIFwiVXBcIjtcbnZhciBBUlJPV19ET1dOID0gQVJST1cgKyBcIkRvd25cIjtcbnZhciBMVFIgPSBcImx0clwiO1xudmFyIFJUTCA9IFwicnRsXCI7XG52YXIgVFRCID0gXCJ0dGJcIjtcbnZhciBPUklFTlRBVElPTl9NQVAgPSB7XG4gIHdpZHRoOiBbXCJoZWlnaHRcIl0sXG4gIGxlZnQ6IFtcInRvcFwiLCBcInJpZ2h0XCJdLFxuICByaWdodDogW1wiYm90dG9tXCIsIFwibGVmdFwiXSxcbiAgeDogW1wieVwiXSxcbiAgWDogW1wiWVwiXSxcbiAgWTogW1wiWFwiXSxcbiAgQXJyb3dMZWZ0OiBbQVJST1dfVVAsIEFSUk9XX1JJR0hUXSxcbiAgQXJyb3dSaWdodDogW0FSUk9XX0RPV04sIEFSUk9XX0xFRlRdXG59O1xuXG5mdW5jdGlvbiBEaXJlY3Rpb24oU3BsaWRlMiwgQ29tcG9uZW50czIsIG9wdGlvbnMpIHtcbiAgZnVuY3Rpb24gcmVzb2x2ZShwcm9wLCBheGlzT25seSwgZGlyZWN0aW9uKSB7XG4gICAgZGlyZWN0aW9uID0gZGlyZWN0aW9uIHx8IG9wdGlvbnMuZGlyZWN0aW9uO1xuICAgIHZhciBpbmRleCA9IGRpcmVjdGlvbiA9PT0gUlRMICYmICFheGlzT25seSA/IDEgOiBkaXJlY3Rpb24gPT09IFRUQiA/IDAgOiAtMTtcbiAgICByZXR1cm4gT1JJRU5UQVRJT05fTUFQW3Byb3BdICYmIE9SSUVOVEFUSU9OX01BUFtwcm9wXVtpbmRleF0gfHwgcHJvcC5yZXBsYWNlKC93aWR0aHxsZWZ0fHJpZ2h0L2ksIGZ1bmN0aW9uIChtYXRjaCwgb2Zmc2V0KSB7XG4gICAgICB2YXIgcmVwbGFjZW1lbnQgPSBPUklFTlRBVElPTl9NQVBbbWF0Y2gudG9Mb3dlckNhc2UoKV1baW5kZXhdIHx8IG1hdGNoO1xuICAgICAgcmV0dXJuIG9mZnNldCA+IDAgPyByZXBsYWNlbWVudC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHJlcGxhY2VtZW50LnNsaWNlKDEpIDogcmVwbGFjZW1lbnQ7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBvcmllbnQodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgKiAob3B0aW9ucy5kaXJlY3Rpb24gPT09IFJUTCA/IDEgOiAtMSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHJlc29sdmU6IHJlc29sdmUsXG4gICAgb3JpZW50OiBvcmllbnRcbiAgfTtcbn1cblxudmFyIFJPTEUgPSBcInJvbGVcIjtcbnZhciBUQUJfSU5ERVggPSBcInRhYmluZGV4XCI7XG52YXIgRElTQUJMRUQgPSBcImRpc2FibGVkXCI7XG52YXIgQVJJQV9QUkVGSVggPSBcImFyaWEtXCI7XG52YXIgQVJJQV9DT05UUk9MUyA9IEFSSUFfUFJFRklYICsgXCJjb250cm9sc1wiO1xudmFyIEFSSUFfQ1VSUkVOVCA9IEFSSUFfUFJFRklYICsgXCJjdXJyZW50XCI7XG52YXIgQVJJQV9TRUxFQ1RFRCA9IEFSSUFfUFJFRklYICsgXCJzZWxlY3RlZFwiO1xudmFyIEFSSUFfTEFCRUwgPSBBUklBX1BSRUZJWCArIFwibGFiZWxcIjtcbnZhciBBUklBX0xBQkVMTEVEQlkgPSBBUklBX1BSRUZJWCArIFwibGFiZWxsZWRieVwiO1xudmFyIEFSSUFfSElEREVOID0gQVJJQV9QUkVGSVggKyBcImhpZGRlblwiO1xudmFyIEFSSUFfT1JJRU5UQVRJT04gPSBBUklBX1BSRUZJWCArIFwib3JpZW50YXRpb25cIjtcbnZhciBBUklBX1JPTEVERVNDUklQVElPTiA9IEFSSUFfUFJFRklYICsgXCJyb2xlZGVzY3JpcHRpb25cIjtcbnZhciBBUklBX0xJVkUgPSBBUklBX1BSRUZJWCArIFwibGl2ZVwiO1xudmFyIEFSSUFfQlVTWSA9IEFSSUFfUFJFRklYICsgXCJidXN5XCI7XG52YXIgQVJJQV9BVE9NSUMgPSBBUklBX1BSRUZJWCArIFwiYXRvbWljXCI7XG52YXIgQUxMX0FUVFJJQlVURVMgPSBbUk9MRSwgVEFCX0lOREVYLCBESVNBQkxFRCwgQVJJQV9DT05UUk9MUywgQVJJQV9DVVJSRU5ULCBBUklBX0xBQkVMLCBBUklBX0xBQkVMTEVEQlksIEFSSUFfSElEREVOLCBBUklBX09SSUVOVEFUSU9OLCBBUklBX1JPTEVERVNDUklQVElPTl07XG52YXIgQ0xBU1NfUFJFRklYID0gUFJPSkVDVF9DT0RFICsgXCJfX1wiO1xudmFyIFNUQVRVU19DTEFTU19QUkVGSVggPSBcImlzLVwiO1xudmFyIENMQVNTX1JPT1QgPSBQUk9KRUNUX0NPREU7XG52YXIgQ0xBU1NfVFJBQ0sgPSBDTEFTU19QUkVGSVggKyBcInRyYWNrXCI7XG52YXIgQ0xBU1NfTElTVCA9IENMQVNTX1BSRUZJWCArIFwibGlzdFwiO1xudmFyIENMQVNTX1NMSURFID0gQ0xBU1NfUFJFRklYICsgXCJzbGlkZVwiO1xudmFyIENMQVNTX0NMT05FID0gQ0xBU1NfU0xJREUgKyBcIi0tY2xvbmVcIjtcbnZhciBDTEFTU19DT05UQUlORVIgPSBDTEFTU19TTElERSArIFwiX19jb250YWluZXJcIjtcbnZhciBDTEFTU19BUlJPV1MgPSBDTEFTU19QUkVGSVggKyBcImFycm93c1wiO1xudmFyIENMQVNTX0FSUk9XID0gQ0xBU1NfUFJFRklYICsgXCJhcnJvd1wiO1xudmFyIENMQVNTX0FSUk9XX1BSRVYgPSBDTEFTU19BUlJPVyArIFwiLS1wcmV2XCI7XG52YXIgQ0xBU1NfQVJST1dfTkVYVCA9IENMQVNTX0FSUk9XICsgXCItLW5leHRcIjtcbnZhciBDTEFTU19QQUdJTkFUSU9OID0gQ0xBU1NfUFJFRklYICsgXCJwYWdpbmF0aW9uXCI7XG52YXIgQ0xBU1NfUEFHSU5BVElPTl9QQUdFID0gQ0xBU1NfUEFHSU5BVElPTiArIFwiX19wYWdlXCI7XG52YXIgQ0xBU1NfUFJPR1JFU1MgPSBDTEFTU19QUkVGSVggKyBcInByb2dyZXNzXCI7XG52YXIgQ0xBU1NfUFJPR1JFU1NfQkFSID0gQ0xBU1NfUFJPR1JFU1MgKyBcIl9fYmFyXCI7XG52YXIgQ0xBU1NfVE9HR0xFID0gQ0xBU1NfUFJFRklYICsgXCJ0b2dnbGVcIjtcbnZhciBDTEFTU19UT0dHTEVfUExBWSA9IENMQVNTX1RPR0dMRSArIFwiX19wbGF5XCI7XG52YXIgQ0xBU1NfVE9HR0xFX1BBVVNFID0gQ0xBU1NfVE9HR0xFICsgXCJfX3BhdXNlXCI7XG52YXIgQ0xBU1NfU1BJTk5FUiA9IENMQVNTX1BSRUZJWCArIFwic3Bpbm5lclwiO1xudmFyIENMQVNTX1NSID0gQ0xBU1NfUFJFRklYICsgXCJzclwiO1xudmFyIENMQVNTX0lOSVRJQUxJWkVEID0gU1RBVFVTX0NMQVNTX1BSRUZJWCArIFwiaW5pdGlhbGl6ZWRcIjtcbnZhciBDTEFTU19BQ1RJVkUgPSBTVEFUVVNfQ0xBU1NfUFJFRklYICsgXCJhY3RpdmVcIjtcbnZhciBDTEFTU19QUkVWID0gU1RBVFVTX0NMQVNTX1BSRUZJWCArIFwicHJldlwiO1xudmFyIENMQVNTX05FWFQgPSBTVEFUVVNfQ0xBU1NfUFJFRklYICsgXCJuZXh0XCI7XG52YXIgQ0xBU1NfVklTSUJMRSA9IFNUQVRVU19DTEFTU19QUkVGSVggKyBcInZpc2libGVcIjtcbnZhciBDTEFTU19MT0FESU5HID0gU1RBVFVTX0NMQVNTX1BSRUZJWCArIFwibG9hZGluZ1wiO1xudmFyIENMQVNTX0ZPQ1VTX0lOID0gU1RBVFVTX0NMQVNTX1BSRUZJWCArIFwiZm9jdXMtaW5cIjtcbnZhciBDTEFTU19PVkVSRkxPVyA9IFNUQVRVU19DTEFTU19QUkVGSVggKyBcIm92ZXJmbG93XCI7XG52YXIgU1RBVFVTX0NMQVNTRVMgPSBbQ0xBU1NfQUNUSVZFLCBDTEFTU19WSVNJQkxFLCBDTEFTU19QUkVWLCBDTEFTU19ORVhULCBDTEFTU19MT0FESU5HLCBDTEFTU19GT0NVU19JTiwgQ0xBU1NfT1ZFUkZMT1ddO1xudmFyIENMQVNTRVMgPSB7XG4gIHNsaWRlOiBDTEFTU19TTElERSxcbiAgY2xvbmU6IENMQVNTX0NMT05FLFxuICBhcnJvd3M6IENMQVNTX0FSUk9XUyxcbiAgYXJyb3c6IENMQVNTX0FSUk9XLFxuICBwcmV2OiBDTEFTU19BUlJPV19QUkVWLFxuICBuZXh0OiBDTEFTU19BUlJPV19ORVhULFxuICBwYWdpbmF0aW9uOiBDTEFTU19QQUdJTkFUSU9OLFxuICBwYWdlOiBDTEFTU19QQUdJTkFUSU9OX1BBR0UsXG4gIHNwaW5uZXI6IENMQVNTX1NQSU5ORVJcbn07XG5cbmZ1bmN0aW9uIGNsb3Nlc3QoZnJvbSwgc2VsZWN0b3IpIHtcbiAgaWYgKGlzRnVuY3Rpb24oZnJvbS5jbG9zZXN0KSkge1xuICAgIHJldHVybiBmcm9tLmNsb3Nlc3Qoc2VsZWN0b3IpO1xuICB9XG5cbiAgdmFyIGVsbSA9IGZyb207XG5cbiAgd2hpbGUgKGVsbSAmJiBlbG0ubm9kZVR5cGUgPT09IDEpIHtcbiAgICBpZiAobWF0Y2hlcyhlbG0sIHNlbGVjdG9yKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgZWxtID0gZWxtLnBhcmVudEVsZW1lbnQ7XG4gIH1cblxuICByZXR1cm4gZWxtO1xufVxuXG52YXIgRlJJQ1RJT04gPSA1O1xudmFyIExPR19JTlRFUlZBTCA9IDIwMDtcbnZhciBQT0lOVEVSX0RPV05fRVZFTlRTID0gXCJ0b3VjaHN0YXJ0IG1vdXNlZG93blwiO1xudmFyIFBPSU5URVJfTU9WRV9FVkVOVFMgPSBcInRvdWNobW92ZSBtb3VzZW1vdmVcIjtcbnZhciBQT0lOVEVSX1VQX0VWRU5UUyA9IFwidG91Y2hlbmQgdG91Y2hjYW5jZWwgbW91c2V1cCBjbGlja1wiO1xuXG5mdW5jdGlvbiBFbGVtZW50cyhTcGxpZGUyLCBDb21wb25lbnRzMiwgb3B0aW9ucykge1xuICB2YXIgX0V2ZW50SW50ZXJmYWNlID0gRXZlbnRJbnRlcmZhY2UoU3BsaWRlMiksXG4gICAgICBvbiA9IF9FdmVudEludGVyZmFjZS5vbixcbiAgICAgIGJpbmQgPSBfRXZlbnRJbnRlcmZhY2UuYmluZDtcblxuICB2YXIgcm9vdCA9IFNwbGlkZTIucm9vdDtcbiAgdmFyIGkxOG4gPSBvcHRpb25zLmkxOG47XG4gIHZhciBlbGVtZW50cyA9IHt9O1xuICB2YXIgc2xpZGVzID0gW107XG4gIHZhciByb290Q2xhc3NlcyA9IFtdO1xuICB2YXIgdHJhY2tDbGFzc2VzID0gW107XG4gIHZhciB0cmFjaztcbiAgdmFyIGxpc3Q7XG4gIHZhciBpc1VzaW5nS2V5O1xuXG4gIGZ1bmN0aW9uIHNldHVwKCkge1xuICAgIGNvbGxlY3QoKTtcbiAgICBpbml0KCk7XG4gICAgdXBkYXRlKCk7XG4gIH1cblxuICBmdW5jdGlvbiBtb3VudCgpIHtcbiAgICBvbihFVkVOVF9SRUZSRVNILCBkZXN0cm95KTtcbiAgICBvbihFVkVOVF9SRUZSRVNILCBzZXR1cCk7XG4gICAgb24oRVZFTlRfVVBEQVRFRCwgdXBkYXRlKTtcbiAgICBiaW5kKGRvY3VtZW50LCBQT0lOVEVSX0RPV05fRVZFTlRTICsgXCIga2V5ZG93blwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaXNVc2luZ0tleSA9IGUudHlwZSA9PT0gXCJrZXlkb3duXCI7XG4gICAgfSwge1xuICAgICAgY2FwdHVyZTogdHJ1ZVxuICAgIH0pO1xuICAgIGJpbmQocm9vdCwgXCJmb2N1c2luXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRvZ2dsZUNsYXNzKHJvb3QsIENMQVNTX0ZPQ1VTX0lOLCAhIWlzVXNpbmdLZXkpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVzdHJveShjb21wbGV0ZWx5KSB7XG4gICAgdmFyIGF0dHJzID0gQUxMX0FUVFJJQlVURVMuY29uY2F0KFwic3R5bGVcIik7XG4gICAgZW1wdHkoc2xpZGVzKTtcbiAgICByZW1vdmVDbGFzcyhyb290LCByb290Q2xhc3Nlcyk7XG4gICAgcmVtb3ZlQ2xhc3ModHJhY2ssIHRyYWNrQ2xhc3Nlcyk7XG4gICAgcmVtb3ZlQXR0cmlidXRlKFt0cmFjaywgbGlzdF0sIGF0dHJzKTtcbiAgICByZW1vdmVBdHRyaWJ1dGUocm9vdCwgY29tcGxldGVseSA/IGF0dHJzIDogW1wic3R5bGVcIiwgQVJJQV9ST0xFREVTQ1JJUFRJT05dKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICByZW1vdmVDbGFzcyhyb290LCByb290Q2xhc3Nlcyk7XG4gICAgcmVtb3ZlQ2xhc3ModHJhY2ssIHRyYWNrQ2xhc3Nlcyk7XG4gICAgcm9vdENsYXNzZXMgPSBnZXRDbGFzc2VzKENMQVNTX1JPT1QpO1xuICAgIHRyYWNrQ2xhc3NlcyA9IGdldENsYXNzZXMoQ0xBU1NfVFJBQ0spO1xuICAgIGFkZENsYXNzKHJvb3QsIHJvb3RDbGFzc2VzKTtcbiAgICBhZGRDbGFzcyh0cmFjaywgdHJhY2tDbGFzc2VzKTtcbiAgICBzZXRBdHRyaWJ1dGUocm9vdCwgQVJJQV9MQUJFTCwgb3B0aW9ucy5sYWJlbCk7XG4gICAgc2V0QXR0cmlidXRlKHJvb3QsIEFSSUFfTEFCRUxMRURCWSwgb3B0aW9ucy5sYWJlbGxlZGJ5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbGxlY3QoKSB7XG4gICAgdHJhY2sgPSBmaW5kKFwiLlwiICsgQ0xBU1NfVFJBQ0spO1xuICAgIGxpc3QgPSBjaGlsZCh0cmFjaywgXCIuXCIgKyBDTEFTU19MSVNUKTtcbiAgICBhc3NlcnQodHJhY2sgJiYgbGlzdCwgXCJBIHRyYWNrL2xpc3QgZWxlbWVudCBpcyBtaXNzaW5nLlwiKTtcbiAgICBwdXNoKHNsaWRlcywgY2hpbGRyZW4obGlzdCwgXCIuXCIgKyBDTEFTU19TTElERSArIFwiOm5vdCguXCIgKyBDTEFTU19DTE9ORSArIFwiKVwiKSk7XG4gICAgZm9yT3duKHtcbiAgICAgIGFycm93czogQ0xBU1NfQVJST1dTLFxuICAgICAgcGFnaW5hdGlvbjogQ0xBU1NfUEFHSU5BVElPTixcbiAgICAgIHByZXY6IENMQVNTX0FSUk9XX1BSRVYsXG4gICAgICBuZXh0OiBDTEFTU19BUlJPV19ORVhULFxuICAgICAgYmFyOiBDTEFTU19QUk9HUkVTU19CQVIsXG4gICAgICB0b2dnbGU6IENMQVNTX1RPR0dMRVxuICAgIH0sIGZ1bmN0aW9uIChjbGFzc05hbWUsIGtleSkge1xuICAgICAgZWxlbWVudHNba2V5XSA9IGZpbmQoXCIuXCIgKyBjbGFzc05hbWUpO1xuICAgIH0pO1xuICAgIGFzc2lnbihlbGVtZW50cywge1xuICAgICAgcm9vdDogcm9vdCxcbiAgICAgIHRyYWNrOiB0cmFjayxcbiAgICAgIGxpc3Q6IGxpc3QsXG4gICAgICBzbGlkZXM6IHNsaWRlc1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICB2YXIgaWQgPSByb290LmlkIHx8IHVuaXF1ZUlkKFBST0pFQ1RfQ09ERSk7XG4gICAgdmFyIHJvbGUgPSBvcHRpb25zLnJvbGU7XG4gICAgcm9vdC5pZCA9IGlkO1xuICAgIHRyYWNrLmlkID0gdHJhY2suaWQgfHwgaWQgKyBcIi10cmFja1wiO1xuICAgIGxpc3QuaWQgPSBsaXN0LmlkIHx8IGlkICsgXCItbGlzdFwiO1xuXG4gICAgaWYgKCFnZXRBdHRyaWJ1dGUocm9vdCwgUk9MRSkgJiYgcm9vdC50YWdOYW1lICE9PSBcIlNFQ1RJT05cIiAmJiByb2xlKSB7XG4gICAgICBzZXRBdHRyaWJ1dGUocm9vdCwgUk9MRSwgcm9sZSk7XG4gICAgfVxuXG4gICAgc2V0QXR0cmlidXRlKHJvb3QsIEFSSUFfUk9MRURFU0NSSVBUSU9OLCBpMThuLmNhcm91c2VsKTtcbiAgICBzZXRBdHRyaWJ1dGUobGlzdCwgUk9MRSwgXCJwcmVzZW50YXRpb25cIik7XG4gIH1cblxuICBmdW5jdGlvbiBmaW5kKHNlbGVjdG9yKSB7XG4gICAgdmFyIGVsbSA9IHF1ZXJ5KHJvb3QsIHNlbGVjdG9yKTtcbiAgICByZXR1cm4gZWxtICYmIGNsb3Nlc3QoZWxtLCBcIi5cIiArIENMQVNTX1JPT1QpID09PSByb290ID8gZWxtIDogdm9pZCAwO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0Q2xhc3NlcyhiYXNlKSB7XG4gICAgcmV0dXJuIFtiYXNlICsgXCItLVwiICsgb3B0aW9ucy50eXBlLCBiYXNlICsgXCItLVwiICsgb3B0aW9ucy5kaXJlY3Rpb24sIG9wdGlvbnMuZHJhZyAmJiBiYXNlICsgXCItLWRyYWdnYWJsZVwiLCBvcHRpb25zLmlzTmF2aWdhdGlvbiAmJiBiYXNlICsgXCItLW5hdlwiLCBiYXNlID09PSBDTEFTU19ST09UICYmIENMQVNTX0FDVElWRV07XG4gIH1cblxuICByZXR1cm4gYXNzaWduKGVsZW1lbnRzLCB7XG4gICAgc2V0dXA6IHNldHVwLFxuICAgIG1vdW50OiBtb3VudCxcbiAgICBkZXN0cm95OiBkZXN0cm95XG4gIH0pO1xufVxuXG52YXIgU0xJREUgPSBcInNsaWRlXCI7XG52YXIgTE9PUCA9IFwibG9vcFwiO1xudmFyIEZBREUgPSBcImZhZGVcIjtcblxuZnVuY3Rpb24gU2xpZGUkMShTcGxpZGUyLCBpbmRleCwgc2xpZGVJbmRleCwgc2xpZGUpIHtcbiAgdmFyIGV2ZW50ID0gRXZlbnRJbnRlcmZhY2UoU3BsaWRlMik7XG4gIHZhciBvbiA9IGV2ZW50Lm9uLFxuICAgICAgZW1pdCA9IGV2ZW50LmVtaXQsXG4gICAgICBiaW5kID0gZXZlbnQuYmluZDtcbiAgdmFyIENvbXBvbmVudHMgPSBTcGxpZGUyLkNvbXBvbmVudHMsXG4gICAgICByb290ID0gU3BsaWRlMi5yb290LFxuICAgICAgb3B0aW9ucyA9IFNwbGlkZTIub3B0aW9ucztcbiAgdmFyIGlzTmF2aWdhdGlvbiA9IG9wdGlvbnMuaXNOYXZpZ2F0aW9uLFxuICAgICAgdXBkYXRlT25Nb3ZlID0gb3B0aW9ucy51cGRhdGVPbk1vdmUsXG4gICAgICBpMThuID0gb3B0aW9ucy5pMThuLFxuICAgICAgcGFnaW5hdGlvbiA9IG9wdGlvbnMucGFnaW5hdGlvbixcbiAgICAgIHNsaWRlRm9jdXMgPSBvcHRpb25zLnNsaWRlRm9jdXM7XG4gIHZhciByZXNvbHZlID0gQ29tcG9uZW50cy5EaXJlY3Rpb24ucmVzb2x2ZTtcbiAgdmFyIHN0eWxlcyA9IGdldEF0dHJpYnV0ZShzbGlkZSwgXCJzdHlsZVwiKTtcbiAgdmFyIGxhYmVsID0gZ2V0QXR0cmlidXRlKHNsaWRlLCBBUklBX0xBQkVMKTtcbiAgdmFyIGlzQ2xvbmUgPSBzbGlkZUluZGV4ID4gLTE7XG4gIHZhciBjb250YWluZXIgPSBjaGlsZChzbGlkZSwgXCIuXCIgKyBDTEFTU19DT05UQUlORVIpO1xuICB2YXIgZGVzdHJveWVkO1xuXG4gIGZ1bmN0aW9uIG1vdW50KCkge1xuICAgIGlmICghaXNDbG9uZSkge1xuICAgICAgc2xpZGUuaWQgPSByb290LmlkICsgXCItc2xpZGVcIiArIHBhZChpbmRleCArIDEpO1xuICAgICAgc2V0QXR0cmlidXRlKHNsaWRlLCBST0xFLCBwYWdpbmF0aW9uID8gXCJ0YWJwYW5lbFwiIDogXCJncm91cFwiKTtcbiAgICAgIHNldEF0dHJpYnV0ZShzbGlkZSwgQVJJQV9ST0xFREVTQ1JJUFRJT04sIGkxOG4uc2xpZGUpO1xuICAgICAgc2V0QXR0cmlidXRlKHNsaWRlLCBBUklBX0xBQkVMLCBsYWJlbCB8fCBmb3JtYXQoaTE4bi5zbGlkZUxhYmVsLCBbaW5kZXggKyAxLCBTcGxpZGUyLmxlbmd0aF0pKTtcbiAgICB9XG5cbiAgICBsaXN0ZW4oKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxpc3RlbigpIHtcbiAgICBiaW5kKHNsaWRlLCBcImNsaWNrXCIsIGFwcGx5KGVtaXQsIEVWRU5UX0NMSUNLLCBzZWxmKSk7XG4gICAgYmluZChzbGlkZSwgXCJrZXlkb3duXCIsIGFwcGx5KGVtaXQsIEVWRU5UX1NMSURFX0tFWURPV04sIHNlbGYpKTtcbiAgICBvbihbRVZFTlRfTU9WRUQsIEVWRU5UX1NISUZURUQsIEVWRU5UX1NDUk9MTEVEXSwgdXBkYXRlKTtcbiAgICBvbihFVkVOVF9OQVZJR0FUSU9OX01PVU5URUQsIGluaXROYXZpZ2F0aW9uKTtcblxuICAgIGlmICh1cGRhdGVPbk1vdmUpIHtcbiAgICAgIG9uKEVWRU5UX01PVkUsIG9uTW92ZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICBkZXN0cm95ZWQgPSB0cnVlO1xuICAgIGV2ZW50LmRlc3Ryb3koKTtcbiAgICByZW1vdmVDbGFzcyhzbGlkZSwgU1RBVFVTX0NMQVNTRVMpO1xuICAgIHJlbW92ZUF0dHJpYnV0ZShzbGlkZSwgQUxMX0FUVFJJQlVURVMpO1xuICAgIHNldEF0dHJpYnV0ZShzbGlkZSwgXCJzdHlsZVwiLCBzdHlsZXMpO1xuICAgIHNldEF0dHJpYnV0ZShzbGlkZSwgQVJJQV9MQUJFTCwgbGFiZWwgfHwgXCJcIik7XG4gIH1cblxuICBmdW5jdGlvbiBpbml0TmF2aWdhdGlvbigpIHtcbiAgICB2YXIgY29udHJvbHMgPSBTcGxpZGUyLnNwbGlkZXMubWFwKGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgIHZhciBTbGlkZTIgPSB0YXJnZXQuc3BsaWRlLkNvbXBvbmVudHMuU2xpZGVzLmdldEF0KGluZGV4KTtcbiAgICAgIHJldHVybiBTbGlkZTIgPyBTbGlkZTIuc2xpZGUuaWQgOiBcIlwiO1xuICAgIH0pLmpvaW4oXCIgXCIpO1xuICAgIHNldEF0dHJpYnV0ZShzbGlkZSwgQVJJQV9MQUJFTCwgZm9ybWF0KGkxOG4uc2xpZGVYLCAoaXNDbG9uZSA/IHNsaWRlSW5kZXggOiBpbmRleCkgKyAxKSk7XG4gICAgc2V0QXR0cmlidXRlKHNsaWRlLCBBUklBX0NPTlRST0xTLCBjb250cm9scyk7XG4gICAgc2V0QXR0cmlidXRlKHNsaWRlLCBST0xFLCBzbGlkZUZvY3VzID8gXCJidXR0b25cIiA6IFwiXCIpO1xuICAgIHNsaWRlRm9jdXMgJiYgcmVtb3ZlQXR0cmlidXRlKHNsaWRlLCBBUklBX1JPTEVERVNDUklQVElPTik7XG4gIH1cblxuICBmdW5jdGlvbiBvbk1vdmUoKSB7XG4gICAgaWYgKCFkZXN0cm95ZWQpIHtcbiAgICAgIHVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICBpZiAoIWRlc3Ryb3llZCkge1xuICAgICAgdmFyIGN1cnIgPSBTcGxpZGUyLmluZGV4O1xuICAgICAgdXBkYXRlQWN0aXZpdHkoKTtcbiAgICAgIHVwZGF0ZVZpc2liaWxpdHkoKTtcbiAgICAgIHRvZ2dsZUNsYXNzKHNsaWRlLCBDTEFTU19QUkVWLCBpbmRleCA9PT0gY3VyciAtIDEpO1xuICAgICAgdG9nZ2xlQ2xhc3Moc2xpZGUsIENMQVNTX05FWFQsIGluZGV4ID09PSBjdXJyICsgMSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlQWN0aXZpdHkoKSB7XG4gICAgdmFyIGFjdGl2ZSA9IGlzQWN0aXZlKCk7XG5cbiAgICBpZiAoYWN0aXZlICE9PSBoYXNDbGFzcyhzbGlkZSwgQ0xBU1NfQUNUSVZFKSkge1xuICAgICAgdG9nZ2xlQ2xhc3Moc2xpZGUsIENMQVNTX0FDVElWRSwgYWN0aXZlKTtcbiAgICAgIHNldEF0dHJpYnV0ZShzbGlkZSwgQVJJQV9DVVJSRU5ULCBpc05hdmlnYXRpb24gJiYgYWN0aXZlIHx8IFwiXCIpO1xuICAgICAgZW1pdChhY3RpdmUgPyBFVkVOVF9BQ1RJVkUgOiBFVkVOVF9JTkFDVElWRSwgc2VsZik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlVmlzaWJpbGl0eSgpIHtcbiAgICB2YXIgdmlzaWJsZSA9IGlzVmlzaWJsZSgpO1xuICAgIHZhciBoaWRkZW4gPSAhdmlzaWJsZSAmJiAoIWlzQWN0aXZlKCkgfHwgaXNDbG9uZSk7XG5cbiAgICBpZiAoIVNwbGlkZTIuc3RhdGUuaXMoW01PVklORywgU0NST0xMSU5HXSkpIHtcbiAgICAgIHNldEF0dHJpYnV0ZShzbGlkZSwgQVJJQV9ISURERU4sIGhpZGRlbiB8fCBcIlwiKTtcbiAgICB9XG5cbiAgICBzZXRBdHRyaWJ1dGUocXVlcnlBbGwoc2xpZGUsIG9wdGlvbnMuZm9jdXNhYmxlTm9kZXMgfHwgXCJcIiksIFRBQl9JTkRFWCwgaGlkZGVuID8gLTEgOiBcIlwiKTtcblxuICAgIGlmIChzbGlkZUZvY3VzKSB7XG4gICAgICBzZXRBdHRyaWJ1dGUoc2xpZGUsIFRBQl9JTkRFWCwgaGlkZGVuID8gLTEgOiAwKTtcbiAgICB9XG5cbiAgICBpZiAodmlzaWJsZSAhPT0gaGFzQ2xhc3Moc2xpZGUsIENMQVNTX1ZJU0lCTEUpKSB7XG4gICAgICB0b2dnbGVDbGFzcyhzbGlkZSwgQ0xBU1NfVklTSUJMRSwgdmlzaWJsZSk7XG4gICAgICBlbWl0KHZpc2libGUgPyBFVkVOVF9WSVNJQkxFIDogRVZFTlRfSElEREVOLCBzZWxmKTtcbiAgICB9XG5cbiAgICBpZiAoIXZpc2libGUgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gc2xpZGUpIHtcbiAgICAgIHZhciBTbGlkZTIgPSBDb21wb25lbnRzLlNsaWRlcy5nZXRBdChTcGxpZGUyLmluZGV4KTtcbiAgICAgIFNsaWRlMiAmJiBmb2N1cyhTbGlkZTIuc2xpZGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0eWxlJDEocHJvcCwgdmFsdWUsIHVzZUNvbnRhaW5lcikge1xuICAgIHN0eWxlKHVzZUNvbnRhaW5lciAmJiBjb250YWluZXIgfHwgc2xpZGUsIHByb3AsIHZhbHVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzQWN0aXZlKCkge1xuICAgIHZhciBjdXJyID0gU3BsaWRlMi5pbmRleDtcbiAgICByZXR1cm4gY3VyciA9PT0gaW5kZXggfHwgb3B0aW9ucy5jbG9uZVN0YXR1cyAmJiBjdXJyID09PSBzbGlkZUluZGV4O1xuICB9XG5cbiAgZnVuY3Rpb24gaXNWaXNpYmxlKCkge1xuICAgIGlmIChTcGxpZGUyLmlzKEZBREUpKSB7XG4gICAgICByZXR1cm4gaXNBY3RpdmUoKTtcbiAgICB9XG5cbiAgICB2YXIgdHJhY2tSZWN0ID0gcmVjdChDb21wb25lbnRzLkVsZW1lbnRzLnRyYWNrKTtcbiAgICB2YXIgc2xpZGVSZWN0ID0gcmVjdChzbGlkZSk7XG4gICAgdmFyIGxlZnQgPSByZXNvbHZlKFwibGVmdFwiLCB0cnVlKTtcbiAgICB2YXIgcmlnaHQgPSByZXNvbHZlKFwicmlnaHRcIiwgdHJ1ZSk7XG4gICAgcmV0dXJuIGZsb29yKHRyYWNrUmVjdFtsZWZ0XSkgPD0gY2VpbChzbGlkZVJlY3RbbGVmdF0pICYmIGZsb29yKHNsaWRlUmVjdFtyaWdodF0pIDw9IGNlaWwodHJhY2tSZWN0W3JpZ2h0XSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc1dpdGhpbihmcm9tLCBkaXN0YW5jZSkge1xuICAgIHZhciBkaWZmID0gYWJzKGZyb20gLSBpbmRleCk7XG5cbiAgICBpZiAoIWlzQ2xvbmUgJiYgKG9wdGlvbnMucmV3aW5kIHx8IFNwbGlkZTIuaXMoTE9PUCkpKSB7XG4gICAgICBkaWZmID0gbWluKGRpZmYsIFNwbGlkZTIubGVuZ3RoIC0gZGlmZik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpZmYgPD0gZGlzdGFuY2U7XG4gIH1cblxuICB2YXIgc2VsZiA9IHtcbiAgICBpbmRleDogaW5kZXgsXG4gICAgc2xpZGVJbmRleDogc2xpZGVJbmRleCxcbiAgICBzbGlkZTogc2xpZGUsXG4gICAgY29udGFpbmVyOiBjb250YWluZXIsXG4gICAgaXNDbG9uZTogaXNDbG9uZSxcbiAgICBtb3VudDogbW91bnQsXG4gICAgZGVzdHJveTogZGVzdHJveSxcbiAgICB1cGRhdGU6IHVwZGF0ZSxcbiAgICBzdHlsZTogc3R5bGUkMSxcbiAgICBpc1dpdGhpbjogaXNXaXRoaW5cbiAgfTtcbiAgcmV0dXJuIHNlbGY7XG59XG5cbmZ1bmN0aW9uIFNsaWRlcyhTcGxpZGUyLCBDb21wb25lbnRzMiwgb3B0aW9ucykge1xuICB2YXIgX0V2ZW50SW50ZXJmYWNlMiA9IEV2ZW50SW50ZXJmYWNlKFNwbGlkZTIpLFxuICAgICAgb24gPSBfRXZlbnRJbnRlcmZhY2UyLm9uLFxuICAgICAgZW1pdCA9IF9FdmVudEludGVyZmFjZTIuZW1pdCxcbiAgICAgIGJpbmQgPSBfRXZlbnRJbnRlcmZhY2UyLmJpbmQ7XG5cbiAgdmFyIF9Db21wb25lbnRzMiRFbGVtZW50cyA9IENvbXBvbmVudHMyLkVsZW1lbnRzLFxuICAgICAgc2xpZGVzID0gX0NvbXBvbmVudHMyJEVsZW1lbnRzLnNsaWRlcyxcbiAgICAgIGxpc3QgPSBfQ29tcG9uZW50czIkRWxlbWVudHMubGlzdDtcbiAgdmFyIFNsaWRlczIgPSBbXTtcblxuICBmdW5jdGlvbiBtb3VudCgpIHtcbiAgICBpbml0KCk7XG4gICAgb24oRVZFTlRfUkVGUkVTSCwgZGVzdHJveSk7XG4gICAgb24oRVZFTlRfUkVGUkVTSCwgaW5pdCk7XG4gIH1cblxuICBmdW5jdGlvbiBpbml0KCkge1xuICAgIHNsaWRlcy5mb3JFYWNoKGZ1bmN0aW9uIChzbGlkZSwgaW5kZXgpIHtcbiAgICAgIHJlZ2lzdGVyKHNsaWRlLCBpbmRleCwgLTEpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICBmb3JFYWNoJDEoZnVuY3Rpb24gKFNsaWRlMikge1xuICAgICAgU2xpZGUyLmRlc3Ryb3koKTtcbiAgICB9KTtcbiAgICBlbXB0eShTbGlkZXMyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICBmb3JFYWNoJDEoZnVuY3Rpb24gKFNsaWRlMikge1xuICAgICAgU2xpZGUyLnVwZGF0ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVnaXN0ZXIoc2xpZGUsIGluZGV4LCBzbGlkZUluZGV4KSB7XG4gICAgdmFyIG9iamVjdCA9IFNsaWRlJDEoU3BsaWRlMiwgaW5kZXgsIHNsaWRlSW5kZXgsIHNsaWRlKTtcbiAgICBvYmplY3QubW91bnQoKTtcbiAgICBTbGlkZXMyLnB1c2gob2JqZWN0KTtcbiAgICBTbGlkZXMyLnNvcnQoZnVuY3Rpb24gKFNsaWRlMSwgU2xpZGUyKSB7XG4gICAgICByZXR1cm4gU2xpZGUxLmluZGV4IC0gU2xpZGUyLmluZGV4O1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0KGV4Y2x1ZGVDbG9uZXMpIHtcbiAgICByZXR1cm4gZXhjbHVkZUNsb25lcyA/IGZpbHRlcihmdW5jdGlvbiAoU2xpZGUyKSB7XG4gICAgICByZXR1cm4gIVNsaWRlMi5pc0Nsb25lO1xuICAgIH0pIDogU2xpZGVzMjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEluKHBhZ2UpIHtcbiAgICB2YXIgQ29udHJvbGxlciA9IENvbXBvbmVudHMyLkNvbnRyb2xsZXI7XG4gICAgdmFyIGluZGV4ID0gQ29udHJvbGxlci50b0luZGV4KHBhZ2UpO1xuICAgIHZhciBtYXggPSBDb250cm9sbGVyLmhhc0ZvY3VzKCkgPyAxIDogb3B0aW9ucy5wZXJQYWdlO1xuICAgIHJldHVybiBmaWx0ZXIoZnVuY3Rpb24gKFNsaWRlMikge1xuICAgICAgcmV0dXJuIGJldHdlZW4oU2xpZGUyLmluZGV4LCBpbmRleCwgaW5kZXggKyBtYXggLSAxKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEF0KGluZGV4KSB7XG4gICAgcmV0dXJuIGZpbHRlcihpbmRleClbMF07XG4gIH1cblxuICBmdW5jdGlvbiBhZGQoaXRlbXMsIGluZGV4KSB7XG4gICAgZm9yRWFjaChpdGVtcywgZnVuY3Rpb24gKHNsaWRlKSB7XG4gICAgICBpZiAoaXNTdHJpbmcoc2xpZGUpKSB7XG4gICAgICAgIHNsaWRlID0gcGFyc2VIdG1sKHNsaWRlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzSFRNTEVsZW1lbnQoc2xpZGUpKSB7XG4gICAgICAgIHZhciByZWYgPSBzbGlkZXNbaW5kZXhdO1xuICAgICAgICByZWYgPyBiZWZvcmUoc2xpZGUsIHJlZikgOiBhcHBlbmQobGlzdCwgc2xpZGUpO1xuICAgICAgICBhZGRDbGFzcyhzbGlkZSwgb3B0aW9ucy5jbGFzc2VzLnNsaWRlKTtcbiAgICAgICAgb2JzZXJ2ZUltYWdlcyhzbGlkZSwgYXBwbHkoZW1pdCwgRVZFTlRfUkVTSVpFKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZW1pdChFVkVOVF9SRUZSRVNIKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZSQxKG1hdGNoZXIpIHtcbiAgICByZW1vdmUoZmlsdGVyKG1hdGNoZXIpLm1hcChmdW5jdGlvbiAoU2xpZGUyKSB7XG4gICAgICByZXR1cm4gU2xpZGUyLnNsaWRlO1xuICAgIH0pKTtcbiAgICBlbWl0KEVWRU5UX1JFRlJFU0gpO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9yRWFjaCQxKGl0ZXJhdGVlLCBleGNsdWRlQ2xvbmVzKSB7XG4gICAgZ2V0KGV4Y2x1ZGVDbG9uZXMpLmZvckVhY2goaXRlcmF0ZWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gZmlsdGVyKG1hdGNoZXIpIHtcbiAgICByZXR1cm4gU2xpZGVzMi5maWx0ZXIoaXNGdW5jdGlvbihtYXRjaGVyKSA/IG1hdGNoZXIgOiBmdW5jdGlvbiAoU2xpZGUyKSB7XG4gICAgICByZXR1cm4gaXNTdHJpbmcobWF0Y2hlcikgPyBtYXRjaGVzKFNsaWRlMi5zbGlkZSwgbWF0Y2hlcikgOiBpbmNsdWRlcyh0b0FycmF5KG1hdGNoZXIpLCBTbGlkZTIuaW5kZXgpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gc3R5bGUocHJvcCwgdmFsdWUsIHVzZUNvbnRhaW5lcikge1xuICAgIGZvckVhY2gkMShmdW5jdGlvbiAoU2xpZGUyKSB7XG4gICAgICBTbGlkZTIuc3R5bGUocHJvcCwgdmFsdWUsIHVzZUNvbnRhaW5lcik7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBvYnNlcnZlSW1hZ2VzKGVsbSwgY2FsbGJhY2spIHtcbiAgICB2YXIgaW1hZ2VzID0gcXVlcnlBbGwoZWxtLCBcImltZ1wiKTtcbiAgICB2YXIgbGVuZ3RoID0gaW1hZ2VzLmxlbmd0aDtcblxuICAgIGlmIChsZW5ndGgpIHtcbiAgICAgIGltYWdlcy5mb3JFYWNoKGZ1bmN0aW9uIChpbWcpIHtcbiAgICAgICAgYmluZChpbWcsIFwibG9hZCBlcnJvclwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCEgLS1sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldExlbmd0aChleGNsdWRlQ2xvbmVzKSB7XG4gICAgcmV0dXJuIGV4Y2x1ZGVDbG9uZXMgPyBzbGlkZXMubGVuZ3RoIDogU2xpZGVzMi5sZW5ndGg7XG4gIH1cblxuICBmdW5jdGlvbiBpc0Vub3VnaCgpIHtcbiAgICByZXR1cm4gU2xpZGVzMi5sZW5ndGggPiBvcHRpb25zLnBlclBhZ2U7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1vdW50OiBtb3VudCxcbiAgICBkZXN0cm95OiBkZXN0cm95LFxuICAgIHVwZGF0ZTogdXBkYXRlLFxuICAgIHJlZ2lzdGVyOiByZWdpc3RlcixcbiAgICBnZXQ6IGdldCxcbiAgICBnZXRJbjogZ2V0SW4sXG4gICAgZ2V0QXQ6IGdldEF0LFxuICAgIGFkZDogYWRkLFxuICAgIHJlbW92ZTogcmVtb3ZlJDEsXG4gICAgZm9yRWFjaDogZm9yRWFjaCQxLFxuICAgIGZpbHRlcjogZmlsdGVyLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICBnZXRMZW5ndGg6IGdldExlbmd0aCxcbiAgICBpc0Vub3VnaDogaXNFbm91Z2hcbiAgfTtcbn1cblxuZnVuY3Rpb24gTGF5b3V0KFNwbGlkZTIsIENvbXBvbmVudHMyLCBvcHRpb25zKSB7XG4gIHZhciBfRXZlbnRJbnRlcmZhY2UzID0gRXZlbnRJbnRlcmZhY2UoU3BsaWRlMiksXG4gICAgICBvbiA9IF9FdmVudEludGVyZmFjZTMub24sXG4gICAgICBiaW5kID0gX0V2ZW50SW50ZXJmYWNlMy5iaW5kLFxuICAgICAgZW1pdCA9IF9FdmVudEludGVyZmFjZTMuZW1pdDtcblxuICB2YXIgU2xpZGVzID0gQ29tcG9uZW50czIuU2xpZGVzO1xuICB2YXIgcmVzb2x2ZSA9IENvbXBvbmVudHMyLkRpcmVjdGlvbi5yZXNvbHZlO1xuICB2YXIgX0NvbXBvbmVudHMyJEVsZW1lbnRzMiA9IENvbXBvbmVudHMyLkVsZW1lbnRzLFxuICAgICAgcm9vdCA9IF9Db21wb25lbnRzMiRFbGVtZW50czIucm9vdCxcbiAgICAgIHRyYWNrID0gX0NvbXBvbmVudHMyJEVsZW1lbnRzMi50cmFjayxcbiAgICAgIGxpc3QgPSBfQ29tcG9uZW50czIkRWxlbWVudHMyLmxpc3Q7XG4gIHZhciBnZXRBdCA9IFNsaWRlcy5nZXRBdCxcbiAgICAgIHN0eWxlU2xpZGVzID0gU2xpZGVzLnN0eWxlO1xuICB2YXIgdmVydGljYWw7XG4gIHZhciByb290UmVjdDtcbiAgdmFyIG92ZXJmbG93O1xuXG4gIGZ1bmN0aW9uIG1vdW50KCkge1xuICAgIGluaXQoKTtcbiAgICBiaW5kKHdpbmRvdywgXCJyZXNpemUgbG9hZFwiLCBUaHJvdHRsZShhcHBseShlbWl0LCBFVkVOVF9SRVNJWkUpKSk7XG4gICAgb24oW0VWRU5UX1VQREFURUQsIEVWRU5UX1JFRlJFU0hdLCBpbml0KTtcbiAgICBvbihFVkVOVF9SRVNJWkUsIHJlc2l6ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBpbml0KCkge1xuICAgIHZlcnRpY2FsID0gb3B0aW9ucy5kaXJlY3Rpb24gPT09IFRUQjtcbiAgICBzdHlsZShyb290LCBcIm1heFdpZHRoXCIsIHVuaXQob3B0aW9ucy53aWR0aCkpO1xuICAgIHN0eWxlKHRyYWNrLCByZXNvbHZlKFwicGFkZGluZ0xlZnRcIiksIGNzc1BhZGRpbmcoZmFsc2UpKTtcbiAgICBzdHlsZSh0cmFjaywgcmVzb2x2ZShcInBhZGRpbmdSaWdodFwiKSwgY3NzUGFkZGluZyh0cnVlKSk7XG4gICAgcmVzaXplKHRydWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzaXplKGZvcmNlKSB7XG4gICAgdmFyIG5ld1JlY3QgPSByZWN0KHJvb3QpO1xuXG4gICAgaWYgKGZvcmNlIHx8IHJvb3RSZWN0LndpZHRoICE9PSBuZXdSZWN0LndpZHRoIHx8IHJvb3RSZWN0LmhlaWdodCAhPT0gbmV3UmVjdC5oZWlnaHQpIHtcbiAgICAgIHN0eWxlKHRyYWNrLCBcImhlaWdodFwiLCBjc3NUcmFja0hlaWdodCgpKTtcbiAgICAgIHN0eWxlU2xpZGVzKHJlc29sdmUoXCJtYXJnaW5SaWdodFwiKSwgdW5pdChvcHRpb25zLmdhcCkpO1xuICAgICAgc3R5bGVTbGlkZXMoXCJ3aWR0aFwiLCBjc3NTbGlkZVdpZHRoKCkpO1xuICAgICAgc3R5bGVTbGlkZXMoXCJoZWlnaHRcIiwgY3NzU2xpZGVIZWlnaHQoKSwgdHJ1ZSk7XG4gICAgICByb290UmVjdCA9IG5ld1JlY3Q7XG4gICAgICBlbWl0KEVWRU5UX1JFU0laRUQpO1xuXG4gICAgICBpZiAob3ZlcmZsb3cgIT09IChvdmVyZmxvdyA9IGlzT3ZlcmZsb3coKSkpIHtcbiAgICAgICAgdG9nZ2xlQ2xhc3Mocm9vdCwgQ0xBU1NfT1ZFUkZMT1csIG92ZXJmbG93KTtcbiAgICAgICAgZW1pdChFVkVOVF9PVkVSRkxPVywgb3ZlcmZsb3cpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNzc1BhZGRpbmcocmlnaHQpIHtcbiAgICB2YXIgcGFkZGluZyA9IG9wdGlvbnMucGFkZGluZztcbiAgICB2YXIgcHJvcCA9IHJlc29sdmUocmlnaHQgPyBcInJpZ2h0XCIgOiBcImxlZnRcIik7XG4gICAgcmV0dXJuIHBhZGRpbmcgJiYgdW5pdChwYWRkaW5nW3Byb3BdIHx8IChpc09iamVjdChwYWRkaW5nKSA/IDAgOiBwYWRkaW5nKSkgfHwgXCIwcHhcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNzc1RyYWNrSGVpZ2h0KCkge1xuICAgIHZhciBoZWlnaHQgPSBcIlwiO1xuXG4gICAgaWYgKHZlcnRpY2FsKSB7XG4gICAgICBoZWlnaHQgPSBjc3NIZWlnaHQoKTtcbiAgICAgIGFzc2VydChoZWlnaHQsIFwiaGVpZ2h0IG9yIGhlaWdodFJhdGlvIGlzIG1pc3NpbmcuXCIpO1xuICAgICAgaGVpZ2h0ID0gXCJjYWxjKFwiICsgaGVpZ2h0ICsgXCIgLSBcIiArIGNzc1BhZGRpbmcoZmFsc2UpICsgXCIgLSBcIiArIGNzc1BhZGRpbmcodHJ1ZSkgKyBcIilcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gaGVpZ2h0O1xuICB9XG5cbiAgZnVuY3Rpb24gY3NzSGVpZ2h0KCkge1xuICAgIHJldHVybiB1bml0KG9wdGlvbnMuaGVpZ2h0IHx8IHJlY3QobGlzdCkud2lkdGggKiBvcHRpb25zLmhlaWdodFJhdGlvKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNzc1NsaWRlV2lkdGgoKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuYXV0b1dpZHRoID8gbnVsbCA6IHVuaXQob3B0aW9ucy5maXhlZFdpZHRoKSB8fCAodmVydGljYWwgPyBcIlwiIDogY3NzU2xpZGVTaXplKCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3NzU2xpZGVIZWlnaHQoKSB7XG4gICAgcmV0dXJuIHVuaXQob3B0aW9ucy5maXhlZEhlaWdodCkgfHwgKHZlcnRpY2FsID8gb3B0aW9ucy5hdXRvSGVpZ2h0ID8gbnVsbCA6IGNzc1NsaWRlU2l6ZSgpIDogY3NzSGVpZ2h0KCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3NzU2xpZGVTaXplKCkge1xuICAgIHZhciBnYXAgPSB1bml0KG9wdGlvbnMuZ2FwKTtcbiAgICByZXR1cm4gXCJjYWxjKCgxMDAlXCIgKyAoZ2FwICYmIFwiICsgXCIgKyBnYXApICsgXCIpL1wiICsgKG9wdGlvbnMucGVyUGFnZSB8fCAxKSArIChnYXAgJiYgXCIgLSBcIiArIGdhcCkgKyBcIilcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxpc3RTaXplKCkge1xuICAgIHJldHVybiByZWN0KGxpc3QpW3Jlc29sdmUoXCJ3aWR0aFwiKV07XG4gIH1cblxuICBmdW5jdGlvbiBzbGlkZVNpemUoaW5kZXgsIHdpdGhvdXRHYXApIHtcbiAgICB2YXIgU2xpZGUgPSBnZXRBdChpbmRleCB8fCAwKTtcbiAgICByZXR1cm4gU2xpZGUgPyByZWN0KFNsaWRlLnNsaWRlKVtyZXNvbHZlKFwid2lkdGhcIildICsgKHdpdGhvdXRHYXAgPyAwIDogZ2V0R2FwKCkpIDogMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdGFsU2l6ZShpbmRleCwgd2l0aG91dEdhcCkge1xuICAgIHZhciBTbGlkZSA9IGdldEF0KGluZGV4KTtcblxuICAgIGlmIChTbGlkZSkge1xuICAgICAgdmFyIHJpZ2h0ID0gcmVjdChTbGlkZS5zbGlkZSlbcmVzb2x2ZShcInJpZ2h0XCIpXTtcbiAgICAgIHZhciBsZWZ0ID0gcmVjdChsaXN0KVtyZXNvbHZlKFwibGVmdFwiKV07XG4gICAgICByZXR1cm4gYWJzKHJpZ2h0IC0gbGVmdCkgKyAod2l0aG91dEdhcCA/IDAgOiBnZXRHYXAoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBmdW5jdGlvbiBzbGlkZXJTaXplKHdpdGhvdXRHYXApIHtcbiAgICByZXR1cm4gdG90YWxTaXplKFNwbGlkZTIubGVuZ3RoIC0gMSkgLSB0b3RhbFNpemUoMCkgKyBzbGlkZVNpemUoMCwgd2l0aG91dEdhcCk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRHYXAoKSB7XG4gICAgdmFyIFNsaWRlID0gZ2V0QXQoMCk7XG4gICAgcmV0dXJuIFNsaWRlICYmIHBhcnNlRmxvYXQoc3R5bGUoU2xpZGUuc2xpZGUsIHJlc29sdmUoXCJtYXJnaW5SaWdodFwiKSkpIHx8IDA7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRQYWRkaW5nKHJpZ2h0KSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoc3R5bGUodHJhY2ssIHJlc29sdmUoXCJwYWRkaW5nXCIgKyAocmlnaHQgPyBcIlJpZ2h0XCIgOiBcIkxlZnRcIikpKSkgfHwgMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzT3ZlcmZsb3coKSB7XG4gICAgcmV0dXJuIFNwbGlkZTIuaXMoRkFERSkgfHwgc2xpZGVyU2l6ZSh0cnVlKSA+IGxpc3RTaXplKCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1vdW50OiBtb3VudCxcbiAgICByZXNpemU6IHJlc2l6ZSxcbiAgICBsaXN0U2l6ZTogbGlzdFNpemUsXG4gICAgc2xpZGVTaXplOiBzbGlkZVNpemUsXG4gICAgc2xpZGVyU2l6ZTogc2xpZGVyU2l6ZSxcbiAgICB0b3RhbFNpemU6IHRvdGFsU2l6ZSxcbiAgICBnZXRQYWRkaW5nOiBnZXRQYWRkaW5nLFxuICAgIGlzT3ZlcmZsb3c6IGlzT3ZlcmZsb3dcbiAgfTtcbn1cblxudmFyIE1VTFRJUExJRVIgPSAyO1xuXG5mdW5jdGlvbiBDbG9uZXMoU3BsaWRlMiwgQ29tcG9uZW50czIsIG9wdGlvbnMpIHtcbiAgdmFyIGV2ZW50ID0gRXZlbnRJbnRlcmZhY2UoU3BsaWRlMik7XG4gIHZhciBvbiA9IGV2ZW50Lm9uO1xuICB2YXIgRWxlbWVudHMgPSBDb21wb25lbnRzMi5FbGVtZW50cyxcbiAgICAgIFNsaWRlcyA9IENvbXBvbmVudHMyLlNsaWRlcztcbiAgdmFyIHJlc29sdmUgPSBDb21wb25lbnRzMi5EaXJlY3Rpb24ucmVzb2x2ZTtcbiAgdmFyIGNsb25lcyA9IFtdO1xuICB2YXIgY2xvbmVDb3VudDtcblxuICBmdW5jdGlvbiBtb3VudCgpIHtcbiAgICBvbihFVkVOVF9SRUZSRVNILCByZW1vdW50KTtcbiAgICBvbihbRVZFTlRfVVBEQVRFRCwgRVZFTlRfUkVTSVpFXSwgb2JzZXJ2ZSk7XG5cbiAgICBpZiAoY2xvbmVDb3VudCA9IGNvbXB1dGVDbG9uZUNvdW50KCkpIHtcbiAgICAgIGdlbmVyYXRlKGNsb25lQ291bnQpO1xuICAgICAgQ29tcG9uZW50czIuTGF5b3V0LnJlc2l6ZSh0cnVlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZW1vdW50KCkge1xuICAgIGRlc3Ryb3koKTtcbiAgICBtb3VudCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICByZW1vdmUoY2xvbmVzKTtcbiAgICBlbXB0eShjbG9uZXMpO1xuICAgIGV2ZW50LmRlc3Ryb3koKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9ic2VydmUoKSB7XG4gICAgdmFyIGNvdW50ID0gY29tcHV0ZUNsb25lQ291bnQoKTtcblxuICAgIGlmIChjbG9uZUNvdW50ICE9PSBjb3VudCkge1xuICAgICAgaWYgKGNsb25lQ291bnQgPCBjb3VudCB8fCAhY291bnQpIHtcbiAgICAgICAgZXZlbnQuZW1pdChFVkVOVF9SRUZSRVNIKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZW5lcmF0ZShjb3VudCkge1xuICAgIHZhciBzbGlkZXMgPSBTbGlkZXMuZ2V0KCkuc2xpY2UoKTtcbiAgICB2YXIgbGVuZ3RoID0gc2xpZGVzLmxlbmd0aDtcblxuICAgIGlmIChsZW5ndGgpIHtcbiAgICAgIHdoaWxlIChzbGlkZXMubGVuZ3RoIDwgY291bnQpIHtcbiAgICAgICAgcHVzaChzbGlkZXMsIHNsaWRlcyk7XG4gICAgICB9XG5cbiAgICAgIHB1c2goc2xpZGVzLnNsaWNlKC1jb3VudCksIHNsaWRlcy5zbGljZSgwLCBjb3VudCkpLmZvckVhY2goZnVuY3Rpb24gKFNsaWRlLCBpbmRleCkge1xuICAgICAgICB2YXIgaXNIZWFkID0gaW5kZXggPCBjb3VudDtcbiAgICAgICAgdmFyIGNsb25lID0gY2xvbmVEZWVwKFNsaWRlLnNsaWRlLCBpbmRleCk7XG4gICAgICAgIGlzSGVhZCA/IGJlZm9yZShjbG9uZSwgc2xpZGVzWzBdLnNsaWRlKSA6IGFwcGVuZChFbGVtZW50cy5saXN0LCBjbG9uZSk7XG4gICAgICAgIHB1c2goY2xvbmVzLCBjbG9uZSk7XG4gICAgICAgIFNsaWRlcy5yZWdpc3RlcihjbG9uZSwgaW5kZXggLSBjb3VudCArIChpc0hlYWQgPyAwIDogbGVuZ3RoKSwgU2xpZGUuaW5kZXgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2xvbmVEZWVwKGVsbSwgaW5kZXgpIHtcbiAgICB2YXIgY2xvbmUgPSBlbG0uY2xvbmVOb2RlKHRydWUpO1xuICAgIGFkZENsYXNzKGNsb25lLCBvcHRpb25zLmNsYXNzZXMuY2xvbmUpO1xuICAgIGNsb25lLmlkID0gU3BsaWRlMi5yb290LmlkICsgXCItY2xvbmVcIiArIHBhZChpbmRleCArIDEpO1xuICAgIHJldHVybiBjbG9uZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXB1dGVDbG9uZUNvdW50KCkge1xuICAgIHZhciBjbG9uZXMyID0gb3B0aW9ucy5jbG9uZXM7XG5cbiAgICBpZiAoIVNwbGlkZTIuaXMoTE9PUCkpIHtcbiAgICAgIGNsb25lczIgPSAwO1xuICAgIH0gZWxzZSBpZiAoaXNVbmRlZmluZWQoY2xvbmVzMikpIHtcbiAgICAgIHZhciBmaXhlZFNpemUgPSBvcHRpb25zW3Jlc29sdmUoXCJmaXhlZFdpZHRoXCIpXSAmJiBDb21wb25lbnRzMi5MYXlvdXQuc2xpZGVTaXplKDApO1xuICAgICAgdmFyIGZpeGVkQ291bnQgPSBmaXhlZFNpemUgJiYgY2VpbChyZWN0KEVsZW1lbnRzLnRyYWNrKVtyZXNvbHZlKFwid2lkdGhcIildIC8gZml4ZWRTaXplKTtcbiAgICAgIGNsb25lczIgPSBmaXhlZENvdW50IHx8IG9wdGlvbnNbcmVzb2x2ZShcImF1dG9XaWR0aFwiKV0gJiYgU3BsaWRlMi5sZW5ndGggfHwgb3B0aW9ucy5wZXJQYWdlICogTVVMVElQTElFUjtcbiAgICB9XG5cbiAgICByZXR1cm4gY2xvbmVzMjtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbW91bnQ6IG1vdW50LFxuICAgIGRlc3Ryb3k6IGRlc3Ryb3lcbiAgfTtcbn1cblxuZnVuY3Rpb24gTW92ZShTcGxpZGUyLCBDb21wb25lbnRzMiwgb3B0aW9ucykge1xuICB2YXIgX0V2ZW50SW50ZXJmYWNlNCA9IEV2ZW50SW50ZXJmYWNlKFNwbGlkZTIpLFxuICAgICAgb24gPSBfRXZlbnRJbnRlcmZhY2U0Lm9uLFxuICAgICAgZW1pdCA9IF9FdmVudEludGVyZmFjZTQuZW1pdDtcblxuICB2YXIgc2V0ID0gU3BsaWRlMi5zdGF0ZS5zZXQ7XG4gIHZhciBfQ29tcG9uZW50czIkTGF5b3V0ID0gQ29tcG9uZW50czIuTGF5b3V0LFxuICAgICAgc2xpZGVTaXplID0gX0NvbXBvbmVudHMyJExheW91dC5zbGlkZVNpemUsXG4gICAgICBnZXRQYWRkaW5nID0gX0NvbXBvbmVudHMyJExheW91dC5nZXRQYWRkaW5nLFxuICAgICAgdG90YWxTaXplID0gX0NvbXBvbmVudHMyJExheW91dC50b3RhbFNpemUsXG4gICAgICBsaXN0U2l6ZSA9IF9Db21wb25lbnRzMiRMYXlvdXQubGlzdFNpemUsXG4gICAgICBzbGlkZXJTaXplID0gX0NvbXBvbmVudHMyJExheW91dC5zbGlkZXJTaXplO1xuICB2YXIgX0NvbXBvbmVudHMyJERpcmVjdGlvID0gQ29tcG9uZW50czIuRGlyZWN0aW9uLFxuICAgICAgcmVzb2x2ZSA9IF9Db21wb25lbnRzMiREaXJlY3Rpby5yZXNvbHZlLFxuICAgICAgb3JpZW50ID0gX0NvbXBvbmVudHMyJERpcmVjdGlvLm9yaWVudDtcbiAgdmFyIF9Db21wb25lbnRzMiRFbGVtZW50czMgPSBDb21wb25lbnRzMi5FbGVtZW50cyxcbiAgICAgIGxpc3QgPSBfQ29tcG9uZW50czIkRWxlbWVudHMzLmxpc3QsXG4gICAgICB0cmFjayA9IF9Db21wb25lbnRzMiRFbGVtZW50czMudHJhY2s7XG4gIHZhciBUcmFuc2l0aW9uO1xuXG4gIGZ1bmN0aW9uIG1vdW50KCkge1xuICAgIFRyYW5zaXRpb24gPSBDb21wb25lbnRzMi5UcmFuc2l0aW9uO1xuICAgIG9uKFtFVkVOVF9NT1VOVEVELCBFVkVOVF9SRVNJWkVELCBFVkVOVF9VUERBVEVELCBFVkVOVF9SRUZSRVNIXSwgcmVwb3NpdGlvbik7XG4gIH1cblxuICBmdW5jdGlvbiByZXBvc2l0aW9uKCkge1xuICAgIGlmICghQ29tcG9uZW50czIuQ29udHJvbGxlci5pc0J1c3koKSkge1xuICAgICAgQ29tcG9uZW50czIuU2Nyb2xsLmNhbmNlbCgpO1xuICAgICAganVtcChTcGxpZGUyLmluZGV4KTtcbiAgICAgIENvbXBvbmVudHMyLlNsaWRlcy51cGRhdGUoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtb3ZlKGRlc3QsIGluZGV4LCBwcmV2LCBjYWxsYmFjaykge1xuICAgIGlmIChkZXN0ICE9PSBpbmRleCAmJiBjYW5TaGlmdChkZXN0ID4gcHJldikpIHtcbiAgICAgIGNhbmNlbCgpO1xuICAgICAgdHJhbnNsYXRlKHNoaWZ0KGdldFBvc2l0aW9uKCksIGRlc3QgPiBwcmV2KSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgc2V0KE1PVklORyk7XG4gICAgZW1pdChFVkVOVF9NT1ZFLCBpbmRleCwgcHJldiwgZGVzdCk7XG4gICAgVHJhbnNpdGlvbi5zdGFydChpbmRleCwgZnVuY3Rpb24gKCkge1xuICAgICAgc2V0KElETEUpO1xuICAgICAgZW1pdChFVkVOVF9NT1ZFRCwgaW5kZXgsIHByZXYsIGRlc3QpO1xuICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGp1bXAoaW5kZXgpIHtcbiAgICB0cmFuc2xhdGUodG9Qb3NpdGlvbihpbmRleCwgdHJ1ZSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNsYXRlKHBvc2l0aW9uLCBwcmV2ZW50TG9vcCkge1xuICAgIGlmICghU3BsaWRlMi5pcyhGQURFKSkge1xuICAgICAgdmFyIGRlc3RpbmF0aW9uID0gcHJldmVudExvb3AgPyBwb3NpdGlvbiA6IGxvb3AocG9zaXRpb24pO1xuICAgICAgc3R5bGUobGlzdCwgXCJ0cmFuc2Zvcm1cIiwgXCJ0cmFuc2xhdGVcIiArIHJlc29sdmUoXCJYXCIpICsgXCIoXCIgKyBkZXN0aW5hdGlvbiArIFwicHgpXCIpO1xuICAgICAgcG9zaXRpb24gIT09IGRlc3RpbmF0aW9uICYmIGVtaXQoRVZFTlRfU0hJRlRFRCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbG9vcChwb3NpdGlvbikge1xuICAgIGlmIChTcGxpZGUyLmlzKExPT1ApKSB7XG4gICAgICB2YXIgaW5kZXggPSB0b0luZGV4KHBvc2l0aW9uKTtcbiAgICAgIHZhciBleGNlZWRlZE1heCA9IGluZGV4ID4gQ29tcG9uZW50czIuQ29udHJvbGxlci5nZXRFbmQoKTtcbiAgICAgIHZhciBleGNlZWRlZE1pbiA9IGluZGV4IDwgMDtcblxuICAgICAgaWYgKGV4Y2VlZGVkTWluIHx8IGV4Y2VlZGVkTWF4KSB7XG4gICAgICAgIHBvc2l0aW9uID0gc2hpZnQocG9zaXRpb24sIGV4Y2VlZGVkTWF4KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH1cblxuICBmdW5jdGlvbiBzaGlmdChwb3NpdGlvbiwgYmFja3dhcmRzKSB7XG4gICAgdmFyIGV4Y2VzcyA9IHBvc2l0aW9uIC0gZ2V0TGltaXQoYmFja3dhcmRzKTtcbiAgICB2YXIgc2l6ZSA9IHNsaWRlclNpemUoKTtcbiAgICBwb3NpdGlvbiAtPSBvcmllbnQoc2l6ZSAqIChjZWlsKGFicyhleGNlc3MpIC8gc2l6ZSkgfHwgMSkpICogKGJhY2t3YXJkcyA/IDEgOiAtMSk7XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsKCkge1xuICAgIHRyYW5zbGF0ZShnZXRQb3NpdGlvbigpLCB0cnVlKTtcbiAgICBUcmFuc2l0aW9uLmNhbmNlbCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gdG9JbmRleChwb3NpdGlvbikge1xuICAgIHZhciBTbGlkZXMgPSBDb21wb25lbnRzMi5TbGlkZXMuZ2V0KCk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgbWluRGlzdGFuY2UgPSBJbmZpbml0eTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgU2xpZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc2xpZGVJbmRleCA9IFNsaWRlc1tpXS5pbmRleDtcbiAgICAgIHZhciBkaXN0YW5jZSA9IGFicyh0b1Bvc2l0aW9uKHNsaWRlSW5kZXgsIHRydWUpIC0gcG9zaXRpb24pO1xuXG4gICAgICBpZiAoZGlzdGFuY2UgPD0gbWluRGlzdGFuY2UpIHtcbiAgICAgICAgbWluRGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgaW5kZXggPSBzbGlkZUluZGV4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgZnVuY3Rpb24gdG9Qb3NpdGlvbihpbmRleCwgdHJpbW1pbmcpIHtcbiAgICB2YXIgcG9zaXRpb24gPSBvcmllbnQodG90YWxTaXplKGluZGV4IC0gMSkgLSBvZmZzZXQoaW5kZXgpKTtcbiAgICByZXR1cm4gdHJpbW1pbmcgPyB0cmltKHBvc2l0aW9uKSA6IHBvc2l0aW9uO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UG9zaXRpb24oKSB7XG4gICAgdmFyIGxlZnQgPSByZXNvbHZlKFwibGVmdFwiKTtcbiAgICByZXR1cm4gcmVjdChsaXN0KVtsZWZ0XSAtIHJlY3QodHJhY2spW2xlZnRdICsgb3JpZW50KGdldFBhZGRpbmcoZmFsc2UpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyaW0ocG9zaXRpb24pIHtcbiAgICBpZiAob3B0aW9ucy50cmltU3BhY2UgJiYgU3BsaWRlMi5pcyhTTElERSkpIHtcbiAgICAgIHBvc2l0aW9uID0gY2xhbXAocG9zaXRpb24sIDAsIG9yaWVudChzbGlkZXJTaXplKHRydWUpIC0gbGlzdFNpemUoKSkpO1xuICAgIH1cblxuICAgIHJldHVybiBwb3NpdGlvbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9mZnNldChpbmRleCkge1xuICAgIHZhciBmb2N1cyA9IG9wdGlvbnMuZm9jdXM7XG4gICAgcmV0dXJuIGZvY3VzID09PSBcImNlbnRlclwiID8gKGxpc3RTaXplKCkgLSBzbGlkZVNpemUoaW5kZXgsIHRydWUpKSAvIDIgOiArZm9jdXMgKiBzbGlkZVNpemUoaW5kZXgpIHx8IDA7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRMaW1pdChtYXgpIHtcbiAgICByZXR1cm4gdG9Qb3NpdGlvbihtYXggPyBDb21wb25lbnRzMi5Db250cm9sbGVyLmdldEVuZCgpIDogMCwgISFvcHRpb25zLnRyaW1TcGFjZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjYW5TaGlmdChiYWNrd2FyZHMpIHtcbiAgICB2YXIgc2hpZnRlZCA9IG9yaWVudChzaGlmdChnZXRQb3NpdGlvbigpLCBiYWNrd2FyZHMpKTtcbiAgICByZXR1cm4gYmFja3dhcmRzID8gc2hpZnRlZCA+PSAwIDogc2hpZnRlZCA8PSBsaXN0W3Jlc29sdmUoXCJzY3JvbGxXaWR0aFwiKV0gLSByZWN0KHRyYWNrKVtyZXNvbHZlKFwid2lkdGhcIildO1xuICB9XG5cbiAgZnVuY3Rpb24gZXhjZWVkZWRMaW1pdChtYXgsIHBvc2l0aW9uKSB7XG4gICAgcG9zaXRpb24gPSBpc1VuZGVmaW5lZChwb3NpdGlvbikgPyBnZXRQb3NpdGlvbigpIDogcG9zaXRpb247XG4gICAgdmFyIGV4Y2VlZGVkTWluID0gbWF4ICE9PSB0cnVlICYmIG9yaWVudChwb3NpdGlvbikgPCBvcmllbnQoZ2V0TGltaXQoZmFsc2UpKTtcbiAgICB2YXIgZXhjZWVkZWRNYXggPSBtYXggIT09IGZhbHNlICYmIG9yaWVudChwb3NpdGlvbikgPiBvcmllbnQoZ2V0TGltaXQodHJ1ZSkpO1xuICAgIHJldHVybiBleGNlZWRlZE1pbiB8fCBleGNlZWRlZE1heDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbW91bnQ6IG1vdW50LFxuICAgIG1vdmU6IG1vdmUsXG4gICAganVtcDoganVtcCxcbiAgICB0cmFuc2xhdGU6IHRyYW5zbGF0ZSxcbiAgICBzaGlmdDogc2hpZnQsXG4gICAgY2FuY2VsOiBjYW5jZWwsXG4gICAgdG9JbmRleDogdG9JbmRleCxcbiAgICB0b1Bvc2l0aW9uOiB0b1Bvc2l0aW9uLFxuICAgIGdldFBvc2l0aW9uOiBnZXRQb3NpdGlvbixcbiAgICBnZXRMaW1pdDogZ2V0TGltaXQsXG4gICAgZXhjZWVkZWRMaW1pdDogZXhjZWVkZWRMaW1pdCxcbiAgICByZXBvc2l0aW9uOiByZXBvc2l0aW9uXG4gIH07XG59XG5cbmZ1bmN0aW9uIENvbnRyb2xsZXIoU3BsaWRlMiwgQ29tcG9uZW50czIsIG9wdGlvbnMpIHtcbiAgdmFyIF9FdmVudEludGVyZmFjZTUgPSBFdmVudEludGVyZmFjZShTcGxpZGUyKSxcbiAgICAgIG9uID0gX0V2ZW50SW50ZXJmYWNlNS5vbixcbiAgICAgIGVtaXQgPSBfRXZlbnRJbnRlcmZhY2U1LmVtaXQ7XG5cbiAgdmFyIE1vdmUgPSBDb21wb25lbnRzMi5Nb3ZlO1xuICB2YXIgZ2V0UG9zaXRpb24gPSBNb3ZlLmdldFBvc2l0aW9uLFxuICAgICAgZ2V0TGltaXQgPSBNb3ZlLmdldExpbWl0LFxuICAgICAgdG9Qb3NpdGlvbiA9IE1vdmUudG9Qb3NpdGlvbjtcbiAgdmFyIF9Db21wb25lbnRzMiRTbGlkZXMgPSBDb21wb25lbnRzMi5TbGlkZXMsXG4gICAgICBpc0Vub3VnaCA9IF9Db21wb25lbnRzMiRTbGlkZXMuaXNFbm91Z2gsXG4gICAgICBnZXRMZW5ndGggPSBfQ29tcG9uZW50czIkU2xpZGVzLmdldExlbmd0aDtcbiAgdmFyIG9taXRFbmQgPSBvcHRpb25zLm9taXRFbmQ7XG4gIHZhciBpc0xvb3AgPSBTcGxpZGUyLmlzKExPT1ApO1xuICB2YXIgaXNTbGlkZSA9IFNwbGlkZTIuaXMoU0xJREUpO1xuICB2YXIgZ2V0TmV4dCA9IGFwcGx5KGdldEFkamFjZW50LCBmYWxzZSk7XG4gIHZhciBnZXRQcmV2ID0gYXBwbHkoZ2V0QWRqYWNlbnQsIHRydWUpO1xuICB2YXIgY3VyckluZGV4ID0gb3B0aW9ucy5zdGFydCB8fCAwO1xuICB2YXIgZW5kSW5kZXg7XG4gIHZhciBwcmV2SW5kZXggPSBjdXJySW5kZXg7XG4gIHZhciBzbGlkZUNvdW50O1xuICB2YXIgcGVyTW92ZTtcbiAgdmFyIHBlclBhZ2U7XG5cbiAgZnVuY3Rpb24gbW91bnQoKSB7XG4gICAgaW5pdCgpO1xuICAgIG9uKFtFVkVOVF9VUERBVEVELCBFVkVOVF9SRUZSRVNILCBFVkVOVF9FTkRfSU5ERVhfQ0hBTkdFRF0sIGluaXQpO1xuICAgIG9uKEVWRU5UX1JFU0laRUQsIG9uUmVzaXplZCk7XG4gIH1cblxuICBmdW5jdGlvbiBpbml0KCkge1xuICAgIHNsaWRlQ291bnQgPSBnZXRMZW5ndGgodHJ1ZSk7XG4gICAgcGVyTW92ZSA9IG9wdGlvbnMucGVyTW92ZTtcbiAgICBwZXJQYWdlID0gb3B0aW9ucy5wZXJQYWdlO1xuICAgIGVuZEluZGV4ID0gZ2V0RW5kKCk7XG4gICAgdmFyIGluZGV4ID0gY2xhbXAoY3VyckluZGV4LCAwLCBvbWl0RW5kID8gZW5kSW5kZXggOiBzbGlkZUNvdW50IC0gMSk7XG5cbiAgICBpZiAoaW5kZXggIT09IGN1cnJJbmRleCkge1xuICAgICAgY3VyckluZGV4ID0gaW5kZXg7XG4gICAgICBNb3ZlLnJlcG9zaXRpb24oKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvblJlc2l6ZWQoKSB7XG4gICAgaWYgKGVuZEluZGV4ICE9PSBnZXRFbmQoKSkge1xuICAgICAgZW1pdChFVkVOVF9FTkRfSU5ERVhfQ0hBTkdFRCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ28oY29udHJvbCwgYWxsb3dTYW1lSW5kZXgsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFpc0J1c3koKSkge1xuICAgICAgdmFyIGRlc3QgPSBwYXJzZShjb250cm9sKTtcbiAgICAgIHZhciBpbmRleCA9IGxvb3AoZGVzdCk7XG5cbiAgICAgIGlmIChpbmRleCA+IC0xICYmIChhbGxvd1NhbWVJbmRleCB8fCBpbmRleCAhPT0gY3VyckluZGV4KSkge1xuICAgICAgICBzZXRJbmRleChpbmRleCk7XG4gICAgICAgIE1vdmUubW92ZShkZXN0LCBpbmRleCwgcHJldkluZGV4LCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2Nyb2xsKGRlc3RpbmF0aW9uLCBkdXJhdGlvbiwgc25hcCwgY2FsbGJhY2spIHtcbiAgICBDb21wb25lbnRzMi5TY3JvbGwuc2Nyb2xsKGRlc3RpbmF0aW9uLCBkdXJhdGlvbiwgc25hcCwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGluZGV4ID0gbG9vcChNb3ZlLnRvSW5kZXgoZ2V0UG9zaXRpb24oKSkpO1xuICAgICAgc2V0SW5kZXgob21pdEVuZCA/IG1pbihpbmRleCwgZW5kSW5kZXgpIDogaW5kZXgpO1xuICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlKGNvbnRyb2wpIHtcbiAgICB2YXIgaW5kZXggPSBjdXJySW5kZXg7XG5cbiAgICBpZiAoaXNTdHJpbmcoY29udHJvbCkpIHtcbiAgICAgIHZhciBfcmVmID0gY29udHJvbC5tYXRjaCgvKFsrXFwtPD5dKShcXGQrKT8vKSB8fCBbXSxcbiAgICAgICAgICBpbmRpY2F0b3IgPSBfcmVmWzFdLFxuICAgICAgICAgIG51bWJlciA9IF9yZWZbMl07XG5cbiAgICAgIGlmIChpbmRpY2F0b3IgPT09IFwiK1wiIHx8IGluZGljYXRvciA9PT0gXCItXCIpIHtcbiAgICAgICAgaW5kZXggPSBjb21wdXRlRGVzdEluZGV4KGN1cnJJbmRleCArICsoXCJcIiArIGluZGljYXRvciArICgrbnVtYmVyIHx8IDEpKSwgY3VyckluZGV4KTtcbiAgICAgIH0gZWxzZSBpZiAoaW5kaWNhdG9yID09PSBcIj5cIikge1xuICAgICAgICBpbmRleCA9IG51bWJlciA/IHRvSW5kZXgoK251bWJlcikgOiBnZXROZXh0KHRydWUpO1xuICAgICAgfSBlbHNlIGlmIChpbmRpY2F0b3IgPT09IFwiPFwiKSB7XG4gICAgICAgIGluZGV4ID0gZ2V0UHJldih0cnVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5kZXggPSBpc0xvb3AgPyBjb250cm9sIDogY2xhbXAoY29udHJvbCwgMCwgZW5kSW5kZXgpO1xuICAgIH1cblxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEFkamFjZW50KHByZXYsIGRlc3RpbmF0aW9uKSB7XG4gICAgdmFyIG51bWJlciA9IHBlck1vdmUgfHwgKGhhc0ZvY3VzKCkgPyAxIDogcGVyUGFnZSk7XG4gICAgdmFyIGRlc3QgPSBjb21wdXRlRGVzdEluZGV4KGN1cnJJbmRleCArIG51bWJlciAqIChwcmV2ID8gLTEgOiAxKSwgY3VyckluZGV4LCAhKHBlck1vdmUgfHwgaGFzRm9jdXMoKSkpO1xuXG4gICAgaWYgKGRlc3QgPT09IC0xICYmIGlzU2xpZGUpIHtcbiAgICAgIGlmICghYXBwcm94aW1hdGVseUVxdWFsKGdldFBvc2l0aW9uKCksIGdldExpbWl0KCFwcmV2KSwgMSkpIHtcbiAgICAgICAgcmV0dXJuIHByZXYgPyAwIDogZW5kSW5kZXg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlc3RpbmF0aW9uID8gZGVzdCA6IGxvb3AoZGVzdCk7XG4gIH1cblxuICBmdW5jdGlvbiBjb21wdXRlRGVzdEluZGV4KGRlc3QsIGZyb20sIHNuYXBQYWdlKSB7XG4gICAgaWYgKGlzRW5vdWdoKCkgfHwgaGFzRm9jdXMoKSkge1xuICAgICAgdmFyIGluZGV4ID0gY29tcHV0ZU1vdmFibGVEZXN0SW5kZXgoZGVzdCk7XG5cbiAgICAgIGlmIChpbmRleCAhPT0gZGVzdCkge1xuICAgICAgICBmcm9tID0gZGVzdDtcbiAgICAgICAgZGVzdCA9IGluZGV4O1xuICAgICAgICBzbmFwUGFnZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGVzdCA8IDAgfHwgZGVzdCA+IGVuZEluZGV4KSB7XG4gICAgICAgIGlmICghcGVyTW92ZSAmJiAoYmV0d2VlbigwLCBkZXN0LCBmcm9tLCB0cnVlKSB8fCBiZXR3ZWVuKGVuZEluZGV4LCBmcm9tLCBkZXN0LCB0cnVlKSkpIHtcbiAgICAgICAgICBkZXN0ID0gdG9JbmRleCh0b1BhZ2UoZGVzdCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChpc0xvb3ApIHtcbiAgICAgICAgICAgIGRlc3QgPSBzbmFwUGFnZSA/IGRlc3QgPCAwID8gLShzbGlkZUNvdW50ICUgcGVyUGFnZSB8fCBwZXJQYWdlKSA6IHNsaWRlQ291bnQgOiBkZXN0O1xuICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5yZXdpbmQpIHtcbiAgICAgICAgICAgIGRlc3QgPSBkZXN0IDwgMCA/IGVuZEluZGV4IDogMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVzdCA9IC0xO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHNuYXBQYWdlICYmIGRlc3QgIT09IGZyb20pIHtcbiAgICAgICAgICBkZXN0ID0gdG9JbmRleCh0b1BhZ2UoZnJvbSkgKyAoZGVzdCA8IGZyb20gPyAtMSA6IDEpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkZXN0ID0gLTE7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlc3Q7XG4gIH1cblxuICBmdW5jdGlvbiBjb21wdXRlTW92YWJsZURlc3RJbmRleChkZXN0KSB7XG4gICAgaWYgKGlzU2xpZGUgJiYgb3B0aW9ucy50cmltU3BhY2UgPT09IFwibW92ZVwiICYmIGRlc3QgIT09IGN1cnJJbmRleCkge1xuICAgICAgdmFyIHBvc2l0aW9uID0gZ2V0UG9zaXRpb24oKTtcblxuICAgICAgd2hpbGUgKHBvc2l0aW9uID09PSB0b1Bvc2l0aW9uKGRlc3QsIHRydWUpICYmIGJldHdlZW4oZGVzdCwgMCwgU3BsaWRlMi5sZW5ndGggLSAxLCAhb3B0aW9ucy5yZXdpbmQpKSB7XG4gICAgICAgIGRlc3QgPCBjdXJySW5kZXggPyAtLWRlc3QgOiArK2Rlc3Q7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlc3Q7XG4gIH1cblxuICBmdW5jdGlvbiBsb29wKGluZGV4KSB7XG4gICAgcmV0dXJuIGlzTG9vcCA/IChpbmRleCArIHNsaWRlQ291bnQpICUgc2xpZGVDb3VudCB8fCAwIDogaW5kZXg7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRFbmQoKSB7XG4gICAgdmFyIGVuZCA9IHNsaWRlQ291bnQgLSAoaGFzRm9jdXMoKSB8fCBpc0xvb3AgJiYgcGVyTW92ZSA/IDEgOiBwZXJQYWdlKTtcblxuICAgIHdoaWxlIChvbWl0RW5kICYmIGVuZC0tID4gMCkge1xuICAgICAgaWYgKHRvUG9zaXRpb24oc2xpZGVDb3VudCAtIDEsIHRydWUpICE9PSB0b1Bvc2l0aW9uKGVuZCwgdHJ1ZSkpIHtcbiAgICAgICAgZW5kKys7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbGFtcChlbmQsIDAsIHNsaWRlQ291bnQgLSAxKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvSW5kZXgocGFnZSkge1xuICAgIHJldHVybiBjbGFtcChoYXNGb2N1cygpID8gcGFnZSA6IHBlclBhZ2UgKiBwYWdlLCAwLCBlbmRJbmRleCk7XG4gIH1cblxuICBmdW5jdGlvbiB0b1BhZ2UoaW5kZXgpIHtcbiAgICByZXR1cm4gaGFzRm9jdXMoKSA/IG1pbihpbmRleCwgZW5kSW5kZXgpIDogZmxvb3IoKGluZGV4ID49IGVuZEluZGV4ID8gc2xpZGVDb3VudCAtIDEgOiBpbmRleCkgLyBwZXJQYWdlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvRGVzdChkZXN0aW5hdGlvbikge1xuICAgIHZhciBjbG9zZXN0ID0gTW92ZS50b0luZGV4KGRlc3RpbmF0aW9uKTtcbiAgICByZXR1cm4gaXNTbGlkZSA/IGNsYW1wKGNsb3Nlc3QsIDAsIGVuZEluZGV4KSA6IGNsb3Nlc3Q7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRJbmRleChpbmRleCkge1xuICAgIGlmIChpbmRleCAhPT0gY3VyckluZGV4KSB7XG4gICAgICBwcmV2SW5kZXggPSBjdXJySW5kZXg7XG4gICAgICBjdXJySW5kZXggPSBpbmRleDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRJbmRleChwcmV2KSB7XG4gICAgcmV0dXJuIHByZXYgPyBwcmV2SW5kZXggOiBjdXJySW5kZXg7XG4gIH1cblxuICBmdW5jdGlvbiBoYXNGb2N1cygpIHtcbiAgICByZXR1cm4gIWlzVW5kZWZpbmVkKG9wdGlvbnMuZm9jdXMpIHx8IG9wdGlvbnMuaXNOYXZpZ2F0aW9uO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNCdXN5KCkge1xuICAgIHJldHVybiBTcGxpZGUyLnN0YXRlLmlzKFtNT1ZJTkcsIFNDUk9MTElOR10pICYmICEhb3B0aW9ucy53YWl0Rm9yVHJhbnNpdGlvbjtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbW91bnQ6IG1vdW50LFxuICAgIGdvOiBnbyxcbiAgICBzY3JvbGw6IHNjcm9sbCxcbiAgICBnZXROZXh0OiBnZXROZXh0LFxuICAgIGdldFByZXY6IGdldFByZXYsXG4gICAgZ2V0QWRqYWNlbnQ6IGdldEFkamFjZW50LFxuICAgIGdldEVuZDogZ2V0RW5kLFxuICAgIHNldEluZGV4OiBzZXRJbmRleCxcbiAgICBnZXRJbmRleDogZ2V0SW5kZXgsXG4gICAgdG9JbmRleDogdG9JbmRleCxcbiAgICB0b1BhZ2U6IHRvUGFnZSxcbiAgICB0b0Rlc3Q6IHRvRGVzdCxcbiAgICBoYXNGb2N1czogaGFzRm9jdXMsXG4gICAgaXNCdXN5OiBpc0J1c3lcbiAgfTtcbn1cblxudmFyIFhNTF9OQU1FX1NQQUNFID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiO1xudmFyIFBBVEggPSBcIm0xNS41IDAuOTMyLTQuMyA0LjM4IDE0LjUgMTQuNi0xNC41IDE0LjUgNC4zIDQuNCAxNC42LTE0LjYgNC40LTQuMy00LjQtNC40LTE0LjYtMTQuNnpcIjtcbnZhciBTSVpFID0gNDA7XG5cbmZ1bmN0aW9uIEFycm93cyhTcGxpZGUyLCBDb21wb25lbnRzMiwgb3B0aW9ucykge1xuICB2YXIgZXZlbnQgPSBFdmVudEludGVyZmFjZShTcGxpZGUyKTtcbiAgdmFyIG9uID0gZXZlbnQub24sXG4gICAgICBiaW5kID0gZXZlbnQuYmluZCxcbiAgICAgIGVtaXQgPSBldmVudC5lbWl0O1xuICB2YXIgY2xhc3NlcyA9IG9wdGlvbnMuY2xhc3NlcyxcbiAgICAgIGkxOG4gPSBvcHRpb25zLmkxOG47XG4gIHZhciBFbGVtZW50cyA9IENvbXBvbmVudHMyLkVsZW1lbnRzLFxuICAgICAgQ29udHJvbGxlciA9IENvbXBvbmVudHMyLkNvbnRyb2xsZXI7XG4gIHZhciBwbGFjZWhvbGRlciA9IEVsZW1lbnRzLmFycm93cyxcbiAgICAgIHRyYWNrID0gRWxlbWVudHMudHJhY2s7XG4gIHZhciB3cmFwcGVyID0gcGxhY2Vob2xkZXI7XG4gIHZhciBwcmV2ID0gRWxlbWVudHMucHJldjtcbiAgdmFyIG5leHQgPSBFbGVtZW50cy5uZXh0O1xuICB2YXIgY3JlYXRlZDtcbiAgdmFyIHdyYXBwZXJDbGFzc2VzO1xuICB2YXIgYXJyb3dzID0ge307XG5cbiAgZnVuY3Rpb24gbW91bnQoKSB7XG4gICAgaW5pdCgpO1xuICAgIG9uKEVWRU5UX1VQREFURUQsIHJlbW91bnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3VudCgpIHtcbiAgICBkZXN0cm95KCk7XG4gICAgbW91bnQoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgdmFyIGVuYWJsZWQgPSBvcHRpb25zLmFycm93cztcblxuICAgIGlmIChlbmFibGVkICYmICEocHJldiAmJiBuZXh0KSkge1xuICAgICAgY3JlYXRlQXJyb3dzKCk7XG4gICAgfVxuXG4gICAgaWYgKHByZXYgJiYgbmV4dCkge1xuICAgICAgYXNzaWduKGFycm93cywge1xuICAgICAgICBwcmV2OiBwcmV2LFxuICAgICAgICBuZXh0OiBuZXh0XG4gICAgICB9KTtcbiAgICAgIGRpc3BsYXkod3JhcHBlciwgZW5hYmxlZCA/IFwiXCIgOiBcIm5vbmVcIik7XG4gICAgICBhZGRDbGFzcyh3cmFwcGVyLCB3cmFwcGVyQ2xhc3NlcyA9IENMQVNTX0FSUk9XUyArIFwiLS1cIiArIG9wdGlvbnMuZGlyZWN0aW9uKTtcblxuICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgbGlzdGVuKCk7XG4gICAgICAgIHVwZGF0ZSgpO1xuICAgICAgICBzZXRBdHRyaWJ1dGUoW3ByZXYsIG5leHRdLCBBUklBX0NPTlRST0xTLCB0cmFjay5pZCk7XG4gICAgICAgIGVtaXQoRVZFTlRfQVJST1dTX01PVU5URUQsIHByZXYsIG5leHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgZXZlbnQuZGVzdHJveSgpO1xuICAgIHJlbW92ZUNsYXNzKHdyYXBwZXIsIHdyYXBwZXJDbGFzc2VzKTtcblxuICAgIGlmIChjcmVhdGVkKSB7XG4gICAgICByZW1vdmUocGxhY2Vob2xkZXIgPyBbcHJldiwgbmV4dF0gOiB3cmFwcGVyKTtcbiAgICAgIHByZXYgPSBuZXh0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVtb3ZlQXR0cmlidXRlKFtwcmV2LCBuZXh0XSwgQUxMX0FUVFJJQlVURVMpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGxpc3RlbigpIHtcbiAgICBvbihbRVZFTlRfTU9VTlRFRCwgRVZFTlRfTU9WRUQsIEVWRU5UX1JFRlJFU0gsIEVWRU5UX1NDUk9MTEVELCBFVkVOVF9FTkRfSU5ERVhfQ0hBTkdFRF0sIHVwZGF0ZSk7XG4gICAgYmluZChuZXh0LCBcImNsaWNrXCIsIGFwcGx5KGdvLCBcIj5cIikpO1xuICAgIGJpbmQocHJldiwgXCJjbGlja1wiLCBhcHBseShnbywgXCI8XCIpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdvKGNvbnRyb2wpIHtcbiAgICBDb250cm9sbGVyLmdvKGNvbnRyb2wsIHRydWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQXJyb3dzKCkge1xuICAgIHdyYXBwZXIgPSBwbGFjZWhvbGRlciB8fCBjcmVhdGUoXCJkaXZcIiwgY2xhc3Nlcy5hcnJvd3MpO1xuICAgIHByZXYgPSBjcmVhdGVBcnJvdyh0cnVlKTtcbiAgICBuZXh0ID0gY3JlYXRlQXJyb3coZmFsc2UpO1xuICAgIGNyZWF0ZWQgPSB0cnVlO1xuICAgIGFwcGVuZCh3cmFwcGVyLCBbcHJldiwgbmV4dF0pO1xuICAgICFwbGFjZWhvbGRlciAmJiBiZWZvcmUod3JhcHBlciwgdHJhY2spO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQXJyb3cocHJldjIpIHtcbiAgICB2YXIgYXJyb3cgPSBcIjxidXR0b24gY2xhc3M9XFxcIlwiICsgY2xhc3Nlcy5hcnJvdyArIFwiIFwiICsgKHByZXYyID8gY2xhc3Nlcy5wcmV2IDogY2xhc3Nlcy5uZXh0KSArIFwiXFxcIiB0eXBlPVxcXCJidXR0b25cXFwiPjxzdmcgeG1sbnM9XFxcIlwiICsgWE1MX05BTUVfU1BBQ0UgKyBcIlxcXCIgdmlld0JveD1cXFwiMCAwIFwiICsgU0laRSArIFwiIFwiICsgU0laRSArIFwiXFxcIiB3aWR0aD1cXFwiXCIgKyBTSVpFICsgXCJcXFwiIGhlaWdodD1cXFwiXCIgKyBTSVpFICsgXCJcXFwiIGZvY3VzYWJsZT1cXFwiZmFsc2VcXFwiPjxwYXRoIGQ9XFxcIlwiICsgKG9wdGlvbnMuYXJyb3dQYXRoIHx8IFBBVEgpICsgXCJcXFwiIC8+XCI7XG4gICAgcmV0dXJuIHBhcnNlSHRtbChhcnJvdyk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGUoKSB7XG4gICAgaWYgKHByZXYgJiYgbmV4dCkge1xuICAgICAgdmFyIGluZGV4ID0gU3BsaWRlMi5pbmRleDtcbiAgICAgIHZhciBwcmV2SW5kZXggPSBDb250cm9sbGVyLmdldFByZXYoKTtcbiAgICAgIHZhciBuZXh0SW5kZXggPSBDb250cm9sbGVyLmdldE5leHQoKTtcbiAgICAgIHZhciBwcmV2TGFiZWwgPSBwcmV2SW5kZXggPiAtMSAmJiBpbmRleCA8IHByZXZJbmRleCA/IGkxOG4ubGFzdCA6IGkxOG4ucHJldjtcbiAgICAgIHZhciBuZXh0TGFiZWwgPSBuZXh0SW5kZXggPiAtMSAmJiBpbmRleCA+IG5leHRJbmRleCA/IGkxOG4uZmlyc3QgOiBpMThuLm5leHQ7XG4gICAgICBwcmV2LmRpc2FibGVkID0gcHJldkluZGV4IDwgMDtcbiAgICAgIG5leHQuZGlzYWJsZWQgPSBuZXh0SW5kZXggPCAwO1xuICAgICAgc2V0QXR0cmlidXRlKHByZXYsIEFSSUFfTEFCRUwsIHByZXZMYWJlbCk7XG4gICAgICBzZXRBdHRyaWJ1dGUobmV4dCwgQVJJQV9MQUJFTCwgbmV4dExhYmVsKTtcbiAgICAgIGVtaXQoRVZFTlRfQVJST1dTX1VQREFURUQsIHByZXYsIG5leHQsIHByZXZJbmRleCwgbmV4dEluZGV4KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFycm93czogYXJyb3dzLFxuICAgIG1vdW50OiBtb3VudCxcbiAgICBkZXN0cm95OiBkZXN0cm95LFxuICAgIHVwZGF0ZTogdXBkYXRlXG4gIH07XG59XG5cbnZhciBJTlRFUlZBTF9EQVRBX0FUVFJJQlVURSA9IERBVEFfQVRUUklCVVRFICsgXCItaW50ZXJ2YWxcIjtcblxuZnVuY3Rpb24gQXV0b3BsYXkoU3BsaWRlMiwgQ29tcG9uZW50czIsIG9wdGlvbnMpIHtcbiAgdmFyIF9FdmVudEludGVyZmFjZTYgPSBFdmVudEludGVyZmFjZShTcGxpZGUyKSxcbiAgICAgIG9uID0gX0V2ZW50SW50ZXJmYWNlNi5vbixcbiAgICAgIGJpbmQgPSBfRXZlbnRJbnRlcmZhY2U2LmJpbmQsXG4gICAgICBlbWl0ID0gX0V2ZW50SW50ZXJmYWNlNi5lbWl0O1xuXG4gIHZhciBpbnRlcnZhbCA9IFJlcXVlc3RJbnRlcnZhbChvcHRpb25zLmludGVydmFsLCBTcGxpZGUyLmdvLmJpbmQoU3BsaWRlMiwgXCI+XCIpLCBvbkFuaW1hdGlvbkZyYW1lKTtcbiAgdmFyIGlzUGF1c2VkID0gaW50ZXJ2YWwuaXNQYXVzZWQ7XG4gIHZhciBFbGVtZW50cyA9IENvbXBvbmVudHMyLkVsZW1lbnRzLFxuICAgICAgX0NvbXBvbmVudHMyJEVsZW1lbnRzNCA9IENvbXBvbmVudHMyLkVsZW1lbnRzLFxuICAgICAgcm9vdCA9IF9Db21wb25lbnRzMiRFbGVtZW50czQucm9vdCxcbiAgICAgIHRvZ2dsZSA9IF9Db21wb25lbnRzMiRFbGVtZW50czQudG9nZ2xlO1xuICB2YXIgYXV0b3BsYXkgPSBvcHRpb25zLmF1dG9wbGF5O1xuICB2YXIgaG92ZXJlZDtcbiAgdmFyIGZvY3VzZWQ7XG4gIHZhciBzdG9wcGVkID0gYXV0b3BsYXkgPT09IFwicGF1c2VcIjtcblxuICBmdW5jdGlvbiBtb3VudCgpIHtcbiAgICBpZiAoYXV0b3BsYXkpIHtcbiAgICAgIGxpc3RlbigpO1xuICAgICAgdG9nZ2xlICYmIHNldEF0dHJpYnV0ZSh0b2dnbGUsIEFSSUFfQ09OVFJPTFMsIEVsZW1lbnRzLnRyYWNrLmlkKTtcbiAgICAgIHN0b3BwZWQgfHwgcGxheSgpO1xuICAgICAgdXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbGlzdGVuKCkge1xuICAgIGlmIChvcHRpb25zLnBhdXNlT25Ib3Zlcikge1xuICAgICAgYmluZChyb290LCBcIm1vdXNlZW50ZXIgbW91c2VsZWF2ZVwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBob3ZlcmVkID0gZS50eXBlID09PSBcIm1vdXNlZW50ZXJcIjtcbiAgICAgICAgYXV0b1RvZ2dsZSgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucGF1c2VPbkZvY3VzKSB7XG4gICAgICBiaW5kKHJvb3QsIFwiZm9jdXNpbiBmb2N1c291dFwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBmb2N1c2VkID0gZS50eXBlID09PSBcImZvY3VzaW5cIjtcbiAgICAgICAgYXV0b1RvZ2dsZSgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRvZ2dsZSkge1xuICAgICAgYmluZCh0b2dnbGUsIFwiY2xpY2tcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBzdG9wcGVkID8gcGxheSgpIDogcGF1c2UodHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBvbihbRVZFTlRfTU9WRSwgRVZFTlRfU0NST0xMLCBFVkVOVF9SRUZSRVNIXSwgaW50ZXJ2YWwucmV3aW5kKTtcbiAgICBvbihFVkVOVF9NT1ZFLCBvbk1vdmUpO1xuICB9XG5cbiAgZnVuY3Rpb24gcGxheSgpIHtcbiAgICBpZiAoaXNQYXVzZWQoKSAmJiBDb21wb25lbnRzMi5TbGlkZXMuaXNFbm91Z2goKSkge1xuICAgICAgaW50ZXJ2YWwuc3RhcnQoIW9wdGlvbnMucmVzZXRQcm9ncmVzcyk7XG4gICAgICBmb2N1c2VkID0gaG92ZXJlZCA9IHN0b3BwZWQgPSBmYWxzZTtcbiAgICAgIHVwZGF0ZSgpO1xuICAgICAgZW1pdChFVkVOVF9BVVRPUExBWV9QTEFZKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwYXVzZShzdG9wKSB7XG4gICAgaWYgKHN0b3AgPT09IHZvaWQgMCkge1xuICAgICAgc3RvcCA9IHRydWU7XG4gICAgfVxuXG4gICAgc3RvcHBlZCA9ICEhc3RvcDtcbiAgICB1cGRhdGUoKTtcblxuICAgIGlmICghaXNQYXVzZWQoKSkge1xuICAgICAgaW50ZXJ2YWwucGF1c2UoKTtcbiAgICAgIGVtaXQoRVZFTlRfQVVUT1BMQVlfUEFVU0UpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGF1dG9Ub2dnbGUoKSB7XG4gICAgaWYgKCFzdG9wcGVkKSB7XG4gICAgICBob3ZlcmVkIHx8IGZvY3VzZWQgPyBwYXVzZShmYWxzZSkgOiBwbGF5KCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgIGlmICh0b2dnbGUpIHtcbiAgICAgIHRvZ2dsZUNsYXNzKHRvZ2dsZSwgQ0xBU1NfQUNUSVZFLCAhc3RvcHBlZCk7XG4gICAgICBzZXRBdHRyaWJ1dGUodG9nZ2xlLCBBUklBX0xBQkVMLCBvcHRpb25zLmkxOG5bc3RvcHBlZCA/IFwicGxheVwiIDogXCJwYXVzZVwiXSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25BbmltYXRpb25GcmFtZShyYXRlKSB7XG4gICAgdmFyIGJhciA9IEVsZW1lbnRzLmJhcjtcbiAgICBiYXIgJiYgc3R5bGUoYmFyLCBcIndpZHRoXCIsIHJhdGUgKiAxMDAgKyBcIiVcIik7XG4gICAgZW1pdChFVkVOVF9BVVRPUExBWV9QTEFZSU5HLCByYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uTW92ZShpbmRleCkge1xuICAgIHZhciBTbGlkZSA9IENvbXBvbmVudHMyLlNsaWRlcy5nZXRBdChpbmRleCk7XG4gICAgaW50ZXJ2YWwuc2V0KFNsaWRlICYmICtnZXRBdHRyaWJ1dGUoU2xpZGUuc2xpZGUsIElOVEVSVkFMX0RBVEFfQVRUUklCVVRFKSB8fCBvcHRpb25zLmludGVydmFsKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbW91bnQ6IG1vdW50LFxuICAgIGRlc3Ryb3k6IGludGVydmFsLmNhbmNlbCxcbiAgICBwbGF5OiBwbGF5LFxuICAgIHBhdXNlOiBwYXVzZSxcbiAgICBpc1BhdXNlZDogaXNQYXVzZWRcbiAgfTtcbn1cblxuZnVuY3Rpb24gQ292ZXIoU3BsaWRlMiwgQ29tcG9uZW50czIsIG9wdGlvbnMpIHtcbiAgdmFyIF9FdmVudEludGVyZmFjZTcgPSBFdmVudEludGVyZmFjZShTcGxpZGUyKSxcbiAgICAgIG9uID0gX0V2ZW50SW50ZXJmYWNlNy5vbjtcblxuICBmdW5jdGlvbiBtb3VudCgpIHtcbiAgICBpZiAob3B0aW9ucy5jb3Zlcikge1xuICAgICAgb24oRVZFTlRfTEFaWUxPQURfTE9BREVELCBhcHBseSh0b2dnbGUsIHRydWUpKTtcbiAgICAgIG9uKFtFVkVOVF9NT1VOVEVELCBFVkVOVF9VUERBVEVELCBFVkVOVF9SRUZSRVNIXSwgYXBwbHkoY292ZXIsIHRydWUpKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjb3Zlcihjb3ZlcjIpIHtcbiAgICBDb21wb25lbnRzMi5TbGlkZXMuZm9yRWFjaChmdW5jdGlvbiAoU2xpZGUpIHtcbiAgICAgIHZhciBpbWcgPSBjaGlsZChTbGlkZS5jb250YWluZXIgfHwgU2xpZGUuc2xpZGUsIFwiaW1nXCIpO1xuXG4gICAgICBpZiAoaW1nICYmIGltZy5zcmMpIHtcbiAgICAgICAgdG9nZ2xlKGNvdmVyMiwgaW1nLCBTbGlkZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiB0b2dnbGUoY292ZXIyLCBpbWcsIFNsaWRlKSB7XG4gICAgU2xpZGUuc3R5bGUoXCJiYWNrZ3JvdW5kXCIsIGNvdmVyMiA/IFwiY2VudGVyL2NvdmVyIG5vLXJlcGVhdCB1cmwoXFxcIlwiICsgaW1nLnNyYyArIFwiXFxcIilcIiA6IFwiXCIsIHRydWUpO1xuICAgIGRpc3BsYXkoaW1nLCBjb3ZlcjIgPyBcIm5vbmVcIiA6IFwiXCIpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtb3VudDogbW91bnQsXG4gICAgZGVzdHJveTogYXBwbHkoY292ZXIsIGZhbHNlKVxuICB9O1xufVxuXG52YXIgQk9VTkNFX0RJRkZfVEhSRVNIT0xEID0gMTA7XG52YXIgQk9VTkNFX0RVUkFUSU9OID0gNjAwO1xudmFyIEZSSUNUSU9OX0ZBQ1RPUiA9IDAuNjtcbnZhciBCQVNFX1ZFTE9DSVRZID0gMS41O1xudmFyIE1JTl9EVVJBVElPTiA9IDgwMDtcblxuZnVuY3Rpb24gU2Nyb2xsKFNwbGlkZTIsIENvbXBvbmVudHMyLCBvcHRpb25zKSB7XG4gIHZhciBfRXZlbnRJbnRlcmZhY2U4ID0gRXZlbnRJbnRlcmZhY2UoU3BsaWRlMiksXG4gICAgICBvbiA9IF9FdmVudEludGVyZmFjZTgub24sXG4gICAgICBlbWl0ID0gX0V2ZW50SW50ZXJmYWNlOC5lbWl0O1xuXG4gIHZhciBzZXQgPSBTcGxpZGUyLnN0YXRlLnNldDtcbiAgdmFyIE1vdmUgPSBDb21wb25lbnRzMi5Nb3ZlO1xuICB2YXIgZ2V0UG9zaXRpb24gPSBNb3ZlLmdldFBvc2l0aW9uLFxuICAgICAgZ2V0TGltaXQgPSBNb3ZlLmdldExpbWl0LFxuICAgICAgZXhjZWVkZWRMaW1pdCA9IE1vdmUuZXhjZWVkZWRMaW1pdCxcbiAgICAgIHRyYW5zbGF0ZSA9IE1vdmUudHJhbnNsYXRlO1xuICB2YXIgaXNTbGlkZSA9IFNwbGlkZTIuaXMoU0xJREUpO1xuICB2YXIgaW50ZXJ2YWw7XG4gIHZhciBjYWxsYmFjaztcbiAgdmFyIGZyaWN0aW9uID0gMTtcblxuICBmdW5jdGlvbiBtb3VudCgpIHtcbiAgICBvbihFVkVOVF9NT1ZFLCBjbGVhcik7XG4gICAgb24oW0VWRU5UX1VQREFURUQsIEVWRU5UX1JFRlJFU0hdLCBjYW5jZWwpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2Nyb2xsKGRlc3RpbmF0aW9uLCBkdXJhdGlvbiwgc25hcCwgb25TY3JvbGxlZCwgbm9Db25zdHJhaW4pIHtcbiAgICB2YXIgZnJvbSA9IGdldFBvc2l0aW9uKCk7XG4gICAgY2xlYXIoKTtcblxuICAgIGlmIChzbmFwICYmICghaXNTbGlkZSB8fCAhZXhjZWVkZWRMaW1pdCgpKSkge1xuICAgICAgdmFyIHNpemUgPSBDb21wb25lbnRzMi5MYXlvdXQuc2xpZGVyU2l6ZSgpO1xuICAgICAgdmFyIG9mZnNldCA9IHNpZ24oZGVzdGluYXRpb24pICogc2l6ZSAqIGZsb29yKGFicyhkZXN0aW5hdGlvbikgLyBzaXplKSB8fCAwO1xuICAgICAgZGVzdGluYXRpb24gPSBNb3ZlLnRvUG9zaXRpb24oQ29tcG9uZW50czIuQ29udHJvbGxlci50b0Rlc3QoZGVzdGluYXRpb24gJSBzaXplKSkgKyBvZmZzZXQ7XG4gICAgfVxuXG4gICAgdmFyIG5vRGlzdGFuY2UgPSBhcHByb3hpbWF0ZWx5RXF1YWwoZnJvbSwgZGVzdGluYXRpb24sIDEpO1xuICAgIGZyaWN0aW9uID0gMTtcbiAgICBkdXJhdGlvbiA9IG5vRGlzdGFuY2UgPyAwIDogZHVyYXRpb24gfHwgbWF4KGFicyhkZXN0aW5hdGlvbiAtIGZyb20pIC8gQkFTRV9WRUxPQ0lUWSwgTUlOX0RVUkFUSU9OKTtcbiAgICBjYWxsYmFjayA9IG9uU2Nyb2xsZWQ7XG4gICAgaW50ZXJ2YWwgPSBSZXF1ZXN0SW50ZXJ2YWwoZHVyYXRpb24sIG9uRW5kLCBhcHBseSh1cGRhdGUsIGZyb20sIGRlc3RpbmF0aW9uLCBub0NvbnN0cmFpbiksIDEpO1xuICAgIHNldChTQ1JPTExJTkcpO1xuICAgIGVtaXQoRVZFTlRfU0NST0xMKTtcbiAgICBpbnRlcnZhbC5zdGFydCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25FbmQoKSB7XG4gICAgc2V0KElETEUpO1xuICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgZW1pdChFVkVOVF9TQ1JPTExFRCk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGUoZnJvbSwgdG8sIG5vQ29uc3RyYWluLCByYXRlKSB7XG4gICAgdmFyIHBvc2l0aW9uID0gZ2V0UG9zaXRpb24oKTtcbiAgICB2YXIgdGFyZ2V0ID0gZnJvbSArICh0byAtIGZyb20pICogZWFzaW5nKHJhdGUpO1xuICAgIHZhciBkaWZmID0gKHRhcmdldCAtIHBvc2l0aW9uKSAqIGZyaWN0aW9uO1xuICAgIHRyYW5zbGF0ZShwb3NpdGlvbiArIGRpZmYpO1xuXG4gICAgaWYgKGlzU2xpZGUgJiYgIW5vQ29uc3RyYWluICYmIGV4Y2VlZGVkTGltaXQoKSkge1xuICAgICAgZnJpY3Rpb24gKj0gRlJJQ1RJT05fRkFDVE9SO1xuXG4gICAgICBpZiAoYWJzKGRpZmYpIDwgQk9VTkNFX0RJRkZfVEhSRVNIT0xEKSB7XG4gICAgICAgIHNjcm9sbChnZXRMaW1pdChleGNlZWRlZExpbWl0KHRydWUpKSwgQk9VTkNFX0RVUkFUSU9OLCBmYWxzZSwgY2FsbGJhY2ssIHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgIGlmIChpbnRlcnZhbCkge1xuICAgICAgaW50ZXJ2YWwuY2FuY2VsKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsKCkge1xuICAgIGlmIChpbnRlcnZhbCAmJiAhaW50ZXJ2YWwuaXNQYXVzZWQoKSkge1xuICAgICAgY2xlYXIoKTtcbiAgICAgIG9uRW5kKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZWFzaW5nKHQpIHtcbiAgICB2YXIgZWFzaW5nRnVuYyA9IG9wdGlvbnMuZWFzaW5nRnVuYztcbiAgICByZXR1cm4gZWFzaW5nRnVuYyA/IGVhc2luZ0Z1bmModCkgOiAxIC0gTWF0aC5wb3coMSAtIHQsIDQpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtb3VudDogbW91bnQsXG4gICAgZGVzdHJveTogY2xlYXIsXG4gICAgc2Nyb2xsOiBzY3JvbGwsXG4gICAgY2FuY2VsOiBjYW5jZWxcbiAgfTtcbn1cblxudmFyIFNDUk9MTF9MSVNURU5FUl9PUFRJT05TID0ge1xuICBwYXNzaXZlOiBmYWxzZSxcbiAgY2FwdHVyZTogdHJ1ZVxufTtcblxuZnVuY3Rpb24gRHJhZyhTcGxpZGUyLCBDb21wb25lbnRzMiwgb3B0aW9ucykge1xuICB2YXIgX0V2ZW50SW50ZXJmYWNlOSA9IEV2ZW50SW50ZXJmYWNlKFNwbGlkZTIpLFxuICAgICAgb24gPSBfRXZlbnRJbnRlcmZhY2U5Lm9uLFxuICAgICAgZW1pdCA9IF9FdmVudEludGVyZmFjZTkuZW1pdCxcbiAgICAgIGJpbmQgPSBfRXZlbnRJbnRlcmZhY2U5LmJpbmQsXG4gICAgICB1bmJpbmQgPSBfRXZlbnRJbnRlcmZhY2U5LnVuYmluZDtcblxuICB2YXIgc3RhdGUgPSBTcGxpZGUyLnN0YXRlO1xuICB2YXIgTW92ZSA9IENvbXBvbmVudHMyLk1vdmUsXG4gICAgICBTY3JvbGwgPSBDb21wb25lbnRzMi5TY3JvbGwsXG4gICAgICBDb250cm9sbGVyID0gQ29tcG9uZW50czIuQ29udHJvbGxlcixcbiAgICAgIHRyYWNrID0gQ29tcG9uZW50czIuRWxlbWVudHMudHJhY2ssXG4gICAgICByZWR1Y2UgPSBDb21wb25lbnRzMi5NZWRpYS5yZWR1Y2U7XG4gIHZhciBfQ29tcG9uZW50czIkRGlyZWN0aW8yID0gQ29tcG9uZW50czIuRGlyZWN0aW9uLFxuICAgICAgcmVzb2x2ZSA9IF9Db21wb25lbnRzMiREaXJlY3RpbzIucmVzb2x2ZSxcbiAgICAgIG9yaWVudCA9IF9Db21wb25lbnRzMiREaXJlY3RpbzIub3JpZW50O1xuICB2YXIgZ2V0UG9zaXRpb24gPSBNb3ZlLmdldFBvc2l0aW9uLFxuICAgICAgZXhjZWVkZWRMaW1pdCA9IE1vdmUuZXhjZWVkZWRMaW1pdDtcbiAgdmFyIGJhc2VQb3NpdGlvbjtcbiAgdmFyIGJhc2VFdmVudDtcbiAgdmFyIHByZXZCYXNlRXZlbnQ7XG4gIHZhciBpc0ZyZWU7XG4gIHZhciBkcmFnZ2luZztcbiAgdmFyIGV4Y2VlZGVkID0gZmFsc2U7XG4gIHZhciBjbGlja1ByZXZlbnRlZDtcbiAgdmFyIGRpc2FibGVkO1xuICB2YXIgdGFyZ2V0O1xuXG4gIGZ1bmN0aW9uIG1vdW50KCkge1xuICAgIGJpbmQodHJhY2ssIFBPSU5URVJfTU9WRV9FVkVOVFMsIG5vb3AsIFNDUk9MTF9MSVNURU5FUl9PUFRJT05TKTtcbiAgICBiaW5kKHRyYWNrLCBQT0lOVEVSX1VQX0VWRU5UUywgbm9vcCwgU0NST0xMX0xJU1RFTkVSX09QVElPTlMpO1xuICAgIGJpbmQodHJhY2ssIFBPSU5URVJfRE9XTl9FVkVOVFMsIG9uUG9pbnRlckRvd24sIFNDUk9MTF9MSVNURU5FUl9PUFRJT05TKTtcbiAgICBiaW5kKHRyYWNrLCBcImNsaWNrXCIsIG9uQ2xpY2ssIHtcbiAgICAgIGNhcHR1cmU6IHRydWVcbiAgICB9KTtcbiAgICBiaW5kKHRyYWNrLCBcImRyYWdzdGFydFwiLCBwcmV2ZW50KTtcbiAgICBvbihbRVZFTlRfTU9VTlRFRCwgRVZFTlRfVVBEQVRFRF0sIGluaXQpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICB2YXIgZHJhZyA9IG9wdGlvbnMuZHJhZztcbiAgICBkaXNhYmxlKCFkcmFnKTtcbiAgICBpc0ZyZWUgPSBkcmFnID09PSBcImZyZWVcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uUG9pbnRlckRvd24oZSkge1xuICAgIGNsaWNrUHJldmVudGVkID0gZmFsc2U7XG5cbiAgICBpZiAoIWRpc2FibGVkKSB7XG4gICAgICB2YXIgaXNUb3VjaCA9IGlzVG91Y2hFdmVudChlKTtcblxuICAgICAgaWYgKGlzRHJhZ2dhYmxlKGUudGFyZ2V0KSAmJiAoaXNUb3VjaCB8fCAhZS5idXR0b24pKSB7XG4gICAgICAgIGlmICghQ29udHJvbGxlci5pc0J1c3koKSkge1xuICAgICAgICAgIHRhcmdldCA9IGlzVG91Y2ggPyB0cmFjayA6IHdpbmRvdztcbiAgICAgICAgICBkcmFnZ2luZyA9IHN0YXRlLmlzKFtNT1ZJTkcsIFNDUk9MTElOR10pO1xuICAgICAgICAgIHByZXZCYXNlRXZlbnQgPSBudWxsO1xuICAgICAgICAgIGJpbmQodGFyZ2V0LCBQT0lOVEVSX01PVkVfRVZFTlRTLCBvblBvaW50ZXJNb3ZlLCBTQ1JPTExfTElTVEVORVJfT1BUSU9OUyk7XG4gICAgICAgICAgYmluZCh0YXJnZXQsIFBPSU5URVJfVVBfRVZFTlRTLCBvblBvaW50ZXJVcCwgU0NST0xMX0xJU1RFTkVSX09QVElPTlMpO1xuICAgICAgICAgIE1vdmUuY2FuY2VsKCk7XG4gICAgICAgICAgU2Nyb2xsLmNhbmNlbCgpO1xuICAgICAgICAgIHNhdmUoZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmVudChlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uUG9pbnRlck1vdmUoZSkge1xuICAgIGlmICghc3RhdGUuaXMoRFJBR0dJTkcpKSB7XG4gICAgICBzdGF0ZS5zZXQoRFJBR0dJTkcpO1xuICAgICAgZW1pdChFVkVOVF9EUkFHKTtcbiAgICB9XG5cbiAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XG4gICAgICBpZiAoZHJhZ2dpbmcpIHtcbiAgICAgICAgTW92ZS50cmFuc2xhdGUoYmFzZVBvc2l0aW9uICsgY29uc3RyYWluKGRpZmZDb29yZChlKSkpO1xuICAgICAgICB2YXIgZXhwaXJlZCA9IGRpZmZUaW1lKGUpID4gTE9HX0lOVEVSVkFMO1xuICAgICAgICB2YXIgaGFzRXhjZWVkZWQgPSBleGNlZWRlZCAhPT0gKGV4Y2VlZGVkID0gZXhjZWVkZWRMaW1pdCgpKTtcblxuICAgICAgICBpZiAoZXhwaXJlZCB8fCBoYXNFeGNlZWRlZCkge1xuICAgICAgICAgIHNhdmUoZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjbGlja1ByZXZlbnRlZCA9IHRydWU7XG4gICAgICAgIGVtaXQoRVZFTlRfRFJBR0dJTkcpO1xuICAgICAgICBwcmV2ZW50KGUpO1xuICAgICAgfSBlbHNlIGlmIChpc1NsaWRlckRpcmVjdGlvbihlKSkge1xuICAgICAgICBkcmFnZ2luZyA9IHNob3VsZFN0YXJ0KGUpO1xuICAgICAgICBwcmV2ZW50KGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uUG9pbnRlclVwKGUpIHtcbiAgICBpZiAoc3RhdGUuaXMoRFJBR0dJTkcpKSB7XG4gICAgICBzdGF0ZS5zZXQoSURMRSk7XG4gICAgICBlbWl0KEVWRU5UX0RSQUdHRUQpO1xuICAgIH1cblxuICAgIGlmIChkcmFnZ2luZykge1xuICAgICAgbW92ZShlKTtcbiAgICAgIHByZXZlbnQoZSk7XG4gICAgfVxuXG4gICAgdW5iaW5kKHRhcmdldCwgUE9JTlRFUl9NT1ZFX0VWRU5UUywgb25Qb2ludGVyTW92ZSk7XG4gICAgdW5iaW5kKHRhcmdldCwgUE9JTlRFUl9VUF9FVkVOVFMsIG9uUG9pbnRlclVwKTtcbiAgICBkcmFnZ2luZyA9IGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gb25DbGljayhlKSB7XG4gICAgaWYgKCFkaXNhYmxlZCAmJiBjbGlja1ByZXZlbnRlZCkge1xuICAgICAgcHJldmVudChlLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzYXZlKGUpIHtcbiAgICBwcmV2QmFzZUV2ZW50ID0gYmFzZUV2ZW50O1xuICAgIGJhc2VFdmVudCA9IGU7XG4gICAgYmFzZVBvc2l0aW9uID0gZ2V0UG9zaXRpb24oKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdmUoZSkge1xuICAgIHZhciB2ZWxvY2l0eSA9IGNvbXB1dGVWZWxvY2l0eShlKTtcbiAgICB2YXIgZGVzdGluYXRpb24gPSBjb21wdXRlRGVzdGluYXRpb24odmVsb2NpdHkpO1xuICAgIHZhciByZXdpbmQgPSBvcHRpb25zLnJld2luZCAmJiBvcHRpb25zLnJld2luZEJ5RHJhZztcbiAgICByZWR1Y2UoZmFsc2UpO1xuXG4gICAgaWYgKGlzRnJlZSkge1xuICAgICAgQ29udHJvbGxlci5zY3JvbGwoZGVzdGluYXRpb24sIDAsIG9wdGlvbnMuc25hcCk7XG4gICAgfSBlbHNlIGlmIChTcGxpZGUyLmlzKEZBREUpKSB7XG4gICAgICBDb250cm9sbGVyLmdvKG9yaWVudChzaWduKHZlbG9jaXR5KSkgPCAwID8gcmV3aW5kID8gXCI8XCIgOiBcIi1cIiA6IHJld2luZCA/IFwiPlwiIDogXCIrXCIpO1xuICAgIH0gZWxzZSBpZiAoU3BsaWRlMi5pcyhTTElERSkgJiYgZXhjZWVkZWQgJiYgcmV3aW5kKSB7XG4gICAgICBDb250cm9sbGVyLmdvKGV4Y2VlZGVkTGltaXQodHJ1ZSkgPyBcIj5cIiA6IFwiPFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgQ29udHJvbGxlci5nbyhDb250cm9sbGVyLnRvRGVzdChkZXN0aW5hdGlvbiksIHRydWUpO1xuICAgIH1cblxuICAgIHJlZHVjZSh0cnVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3VsZFN0YXJ0KGUpIHtcbiAgICB2YXIgdGhyZXNob2xkcyA9IG9wdGlvbnMuZHJhZ01pblRocmVzaG9sZDtcbiAgICB2YXIgaXNPYmogPSBpc09iamVjdCh0aHJlc2hvbGRzKTtcbiAgICB2YXIgbW91c2UgPSBpc09iaiAmJiB0aHJlc2hvbGRzLm1vdXNlIHx8IDA7XG4gICAgdmFyIHRvdWNoID0gKGlzT2JqID8gdGhyZXNob2xkcy50b3VjaCA6ICt0aHJlc2hvbGRzKSB8fCAxMDtcbiAgICByZXR1cm4gYWJzKGRpZmZDb29yZChlKSkgPiAoaXNUb3VjaEV2ZW50KGUpID8gdG91Y2ggOiBtb3VzZSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc1NsaWRlckRpcmVjdGlvbihlKSB7XG4gICAgcmV0dXJuIGFicyhkaWZmQ29vcmQoZSkpID4gYWJzKGRpZmZDb29yZChlLCB0cnVlKSk7XG4gIH1cblxuICBmdW5jdGlvbiBjb21wdXRlVmVsb2NpdHkoZSkge1xuICAgIGlmIChTcGxpZGUyLmlzKExPT1ApIHx8ICFleGNlZWRlZCkge1xuICAgICAgdmFyIHRpbWUgPSBkaWZmVGltZShlKTtcblxuICAgICAgaWYgKHRpbWUgJiYgdGltZSA8IExPR19JTlRFUlZBTCkge1xuICAgICAgICByZXR1cm4gZGlmZkNvb3JkKGUpIC8gdGltZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXB1dGVEZXN0aW5hdGlvbih2ZWxvY2l0eSkge1xuICAgIHJldHVybiBnZXRQb3NpdGlvbigpICsgc2lnbih2ZWxvY2l0eSkgKiBtaW4oYWJzKHZlbG9jaXR5KSAqIChvcHRpb25zLmZsaWNrUG93ZXIgfHwgNjAwKSwgaXNGcmVlID8gSW5maW5pdHkgOiBDb21wb25lbnRzMi5MYXlvdXQubGlzdFNpemUoKSAqIChvcHRpb25zLmZsaWNrTWF4UGFnZXMgfHwgMSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGlmZkNvb3JkKGUsIG9ydGhvZ29uYWwpIHtcbiAgICByZXR1cm4gY29vcmRPZihlLCBvcnRob2dvbmFsKSAtIGNvb3JkT2YoZ2V0QmFzZUV2ZW50KGUpLCBvcnRob2dvbmFsKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRpZmZUaW1lKGUpIHtcbiAgICByZXR1cm4gdGltZU9mKGUpIC0gdGltZU9mKGdldEJhc2VFdmVudChlKSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRCYXNlRXZlbnQoZSkge1xuICAgIHJldHVybiBiYXNlRXZlbnQgPT09IGUgJiYgcHJldkJhc2VFdmVudCB8fCBiYXNlRXZlbnQ7XG4gIH1cblxuICBmdW5jdGlvbiBjb29yZE9mKGUsIG9ydGhvZ29uYWwpIHtcbiAgICByZXR1cm4gKGlzVG91Y2hFdmVudChlKSA/IGUuY2hhbmdlZFRvdWNoZXNbMF0gOiBlKVtcInBhZ2VcIiArIHJlc29sdmUob3J0aG9nb25hbCA/IFwiWVwiIDogXCJYXCIpXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnN0cmFpbihkaWZmKSB7XG4gICAgcmV0dXJuIGRpZmYgLyAoZXhjZWVkZWQgJiYgU3BsaWRlMi5pcyhTTElERSkgPyBGUklDVElPTiA6IDEpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNEcmFnZ2FibGUodGFyZ2V0Mikge1xuICAgIHZhciBub0RyYWcgPSBvcHRpb25zLm5vRHJhZztcbiAgICByZXR1cm4gIW1hdGNoZXModGFyZ2V0MiwgXCIuXCIgKyBDTEFTU19QQUdJTkFUSU9OX1BBR0UgKyBcIiwgLlwiICsgQ0xBU1NfQVJST1cpICYmICghbm9EcmFnIHx8ICFtYXRjaGVzKHRhcmdldDIsIG5vRHJhZykpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNUb3VjaEV2ZW50KGUpIHtcbiAgICByZXR1cm4gdHlwZW9mIFRvdWNoRXZlbnQgIT09IFwidW5kZWZpbmVkXCIgJiYgZSBpbnN0YW5jZW9mIFRvdWNoRXZlbnQ7XG4gIH1cblxuICBmdW5jdGlvbiBpc0RyYWdnaW5nKCkge1xuICAgIHJldHVybiBkcmFnZ2luZztcbiAgfVxuXG4gIGZ1bmN0aW9uIGRpc2FibGUodmFsdWUpIHtcbiAgICBkaXNhYmxlZCA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtb3VudDogbW91bnQsXG4gICAgZGlzYWJsZTogZGlzYWJsZSxcbiAgICBpc0RyYWdnaW5nOiBpc0RyYWdnaW5nXG4gIH07XG59XG5cbnZhciBOT1JNQUxJWkFUSU9OX01BUCA9IHtcbiAgU3BhY2ViYXI6IFwiIFwiLFxuICBSaWdodDogQVJST1dfUklHSFQsXG4gIExlZnQ6IEFSUk9XX0xFRlQsXG4gIFVwOiBBUlJPV19VUCxcbiAgRG93bjogQVJST1dfRE9XTlxufTtcblxuZnVuY3Rpb24gbm9ybWFsaXplS2V5KGtleSkge1xuICBrZXkgPSBpc1N0cmluZyhrZXkpID8ga2V5IDoga2V5LmtleTtcbiAgcmV0dXJuIE5PUk1BTElaQVRJT05fTUFQW2tleV0gfHwga2V5O1xufVxuXG52YXIgS0VZQk9BUkRfRVZFTlQgPSBcImtleWRvd25cIjtcblxuZnVuY3Rpb24gS2V5Ym9hcmQoU3BsaWRlMiwgQ29tcG9uZW50czIsIG9wdGlvbnMpIHtcbiAgdmFyIF9FdmVudEludGVyZmFjZTEwID0gRXZlbnRJbnRlcmZhY2UoU3BsaWRlMiksXG4gICAgICBvbiA9IF9FdmVudEludGVyZmFjZTEwLm9uLFxuICAgICAgYmluZCA9IF9FdmVudEludGVyZmFjZTEwLmJpbmQsXG4gICAgICB1bmJpbmQgPSBfRXZlbnRJbnRlcmZhY2UxMC51bmJpbmQ7XG5cbiAgdmFyIHJvb3QgPSBTcGxpZGUyLnJvb3Q7XG4gIHZhciByZXNvbHZlID0gQ29tcG9uZW50czIuRGlyZWN0aW9uLnJlc29sdmU7XG4gIHZhciB0YXJnZXQ7XG4gIHZhciBkaXNhYmxlZDtcblxuICBmdW5jdGlvbiBtb3VudCgpIHtcbiAgICBpbml0KCk7XG4gICAgb24oRVZFTlRfVVBEQVRFRCwgZGVzdHJveSk7XG4gICAgb24oRVZFTlRfVVBEQVRFRCwgaW5pdCk7XG4gICAgb24oRVZFTlRfTU9WRSwgb25Nb3ZlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgdmFyIGtleWJvYXJkID0gb3B0aW9ucy5rZXlib2FyZDtcblxuICAgIGlmIChrZXlib2FyZCkge1xuICAgICAgdGFyZ2V0ID0ga2V5Ym9hcmQgPT09IFwiZ2xvYmFsXCIgPyB3aW5kb3cgOiByb290O1xuICAgICAgYmluZCh0YXJnZXQsIEtFWUJPQVJEX0VWRU5ULCBvbktleWRvd24pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgdW5iaW5kKHRhcmdldCwgS0VZQk9BUkRfRVZFTlQpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGlzYWJsZSh2YWx1ZSkge1xuICAgIGRpc2FibGVkID0gdmFsdWU7XG4gIH1cblxuICBmdW5jdGlvbiBvbk1vdmUoKSB7XG4gICAgdmFyIF9kaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgIGRpc2FibGVkID0gdHJ1ZTtcbiAgICBuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICBkaXNhYmxlZCA9IF9kaXNhYmxlZDtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uS2V5ZG93bihlKSB7XG4gICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgdmFyIGtleSA9IG5vcm1hbGl6ZUtleShlKTtcblxuICAgICAgaWYgKGtleSA9PT0gcmVzb2x2ZShBUlJPV19MRUZUKSkge1xuICAgICAgICBTcGxpZGUyLmdvKFwiPFwiKTtcbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSByZXNvbHZlKEFSUk9XX1JJR0hUKSkge1xuICAgICAgICBTcGxpZGUyLmdvKFwiPlwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1vdW50OiBtb3VudCxcbiAgICBkZXN0cm95OiBkZXN0cm95LFxuICAgIGRpc2FibGU6IGRpc2FibGVcbiAgfTtcbn1cblxudmFyIFNSQ19EQVRBX0FUVFJJQlVURSA9IERBVEFfQVRUUklCVVRFICsgXCItbGF6eVwiO1xudmFyIFNSQ1NFVF9EQVRBX0FUVFJJQlVURSA9IFNSQ19EQVRBX0FUVFJJQlVURSArIFwiLXNyY3NldFwiO1xudmFyIElNQUdFX1NFTEVDVE9SID0gXCJbXCIgKyBTUkNfREFUQV9BVFRSSUJVVEUgKyBcIl0sIFtcIiArIFNSQ1NFVF9EQVRBX0FUVFJJQlVURSArIFwiXVwiO1xuXG5mdW5jdGlvbiBMYXp5TG9hZChTcGxpZGUyLCBDb21wb25lbnRzMiwgb3B0aW9ucykge1xuICB2YXIgX0V2ZW50SW50ZXJmYWNlMTEgPSBFdmVudEludGVyZmFjZShTcGxpZGUyKSxcbiAgICAgIG9uID0gX0V2ZW50SW50ZXJmYWNlMTEub24sXG4gICAgICBvZmYgPSBfRXZlbnRJbnRlcmZhY2UxMS5vZmYsXG4gICAgICBiaW5kID0gX0V2ZW50SW50ZXJmYWNlMTEuYmluZCxcbiAgICAgIGVtaXQgPSBfRXZlbnRJbnRlcmZhY2UxMS5lbWl0O1xuXG4gIHZhciBpc1NlcXVlbnRpYWwgPSBvcHRpb25zLmxhenlMb2FkID09PSBcInNlcXVlbnRpYWxcIjtcbiAgdmFyIGV2ZW50cyA9IFtFVkVOVF9NT1ZFRCwgRVZFTlRfU0NST0xMRURdO1xuICB2YXIgZW50cmllcyA9IFtdO1xuXG4gIGZ1bmN0aW9uIG1vdW50KCkge1xuICAgIGlmIChvcHRpb25zLmxhenlMb2FkKSB7XG4gICAgICBpbml0KCk7XG4gICAgICBvbihFVkVOVF9SRUZSRVNILCBpbml0KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbml0KCkge1xuICAgIGVtcHR5KGVudHJpZXMpO1xuICAgIHJlZ2lzdGVyKCk7XG5cbiAgICBpZiAoaXNTZXF1ZW50aWFsKSB7XG4gICAgICBsb2FkTmV4dCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvZmYoZXZlbnRzKTtcbiAgICAgIG9uKGV2ZW50cywgY2hlY2spO1xuICAgICAgY2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWdpc3RlcigpIHtcbiAgICBDb21wb25lbnRzMi5TbGlkZXMuZm9yRWFjaChmdW5jdGlvbiAoU2xpZGUpIHtcbiAgICAgIHF1ZXJ5QWxsKFNsaWRlLnNsaWRlLCBJTUFHRV9TRUxFQ1RPUikuZm9yRWFjaChmdW5jdGlvbiAoaW1nKSB7XG4gICAgICAgIHZhciBzcmMgPSBnZXRBdHRyaWJ1dGUoaW1nLCBTUkNfREFUQV9BVFRSSUJVVEUpO1xuICAgICAgICB2YXIgc3Jjc2V0ID0gZ2V0QXR0cmlidXRlKGltZywgU1JDU0VUX0RBVEFfQVRUUklCVVRFKTtcblxuICAgICAgICBpZiAoc3JjICE9PSBpbWcuc3JjIHx8IHNyY3NldCAhPT0gaW1nLnNyY3NldCkge1xuICAgICAgICAgIHZhciBjbGFzc05hbWUgPSBvcHRpb25zLmNsYXNzZXMuc3Bpbm5lcjtcbiAgICAgICAgICB2YXIgcGFyZW50ID0gaW1nLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgdmFyIHNwaW5uZXIgPSBjaGlsZChwYXJlbnQsIFwiLlwiICsgY2xhc3NOYW1lKSB8fCBjcmVhdGUoXCJzcGFuXCIsIGNsYXNzTmFtZSwgcGFyZW50KTtcbiAgICAgICAgICBlbnRyaWVzLnB1c2goW2ltZywgU2xpZGUsIHNwaW5uZXJdKTtcbiAgICAgICAgICBpbWcuc3JjIHx8IGRpc3BsYXkoaW1nLCBcIm5vbmVcIik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gY2hlY2soKSB7XG4gICAgZW50cmllcyA9IGVudHJpZXMuZmlsdGVyKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICB2YXIgZGlzdGFuY2UgPSBvcHRpb25zLnBlclBhZ2UgKiAoKG9wdGlvbnMucHJlbG9hZFBhZ2VzIHx8IDEpICsgMSkgLSAxO1xuICAgICAgcmV0dXJuIGRhdGFbMV0uaXNXaXRoaW4oU3BsaWRlMi5pbmRleCwgZGlzdGFuY2UpID8gbG9hZChkYXRhKSA6IHRydWU7XG4gICAgfSk7XG4gICAgZW50cmllcy5sZW5ndGggfHwgb2ZmKGV2ZW50cyk7XG4gIH1cblxuICBmdW5jdGlvbiBsb2FkKGRhdGEpIHtcbiAgICB2YXIgaW1nID0gZGF0YVswXTtcbiAgICBhZGRDbGFzcyhkYXRhWzFdLnNsaWRlLCBDTEFTU19MT0FESU5HKTtcbiAgICBiaW5kKGltZywgXCJsb2FkIGVycm9yXCIsIGFwcGx5KG9uTG9hZCwgZGF0YSkpO1xuICAgIHNldEF0dHJpYnV0ZShpbWcsIFwic3JjXCIsIGdldEF0dHJpYnV0ZShpbWcsIFNSQ19EQVRBX0FUVFJJQlVURSkpO1xuICAgIHNldEF0dHJpYnV0ZShpbWcsIFwic3Jjc2V0XCIsIGdldEF0dHJpYnV0ZShpbWcsIFNSQ1NFVF9EQVRBX0FUVFJJQlVURSkpO1xuICAgIHJlbW92ZUF0dHJpYnV0ZShpbWcsIFNSQ19EQVRBX0FUVFJJQlVURSk7XG4gICAgcmVtb3ZlQXR0cmlidXRlKGltZywgU1JDU0VUX0RBVEFfQVRUUklCVVRFKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uTG9hZChkYXRhLCBlKSB7XG4gICAgdmFyIGltZyA9IGRhdGFbMF0sXG4gICAgICAgIFNsaWRlID0gZGF0YVsxXTtcbiAgICByZW1vdmVDbGFzcyhTbGlkZS5zbGlkZSwgQ0xBU1NfTE9BRElORyk7XG5cbiAgICBpZiAoZS50eXBlICE9PSBcImVycm9yXCIpIHtcbiAgICAgIHJlbW92ZShkYXRhWzJdKTtcbiAgICAgIGRpc3BsYXkoaW1nLCBcIlwiKTtcbiAgICAgIGVtaXQoRVZFTlRfTEFaWUxPQURfTE9BREVELCBpbWcsIFNsaWRlKTtcbiAgICAgIGVtaXQoRVZFTlRfUkVTSVpFKTtcbiAgICB9XG5cbiAgICBpc1NlcXVlbnRpYWwgJiYgbG9hZE5leHQoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvYWROZXh0KCkge1xuICAgIGVudHJpZXMubGVuZ3RoICYmIGxvYWQoZW50cmllcy5zaGlmdCgpKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbW91bnQ6IG1vdW50LFxuICAgIGRlc3Ryb3k6IGFwcGx5KGVtcHR5LCBlbnRyaWVzKSxcbiAgICBjaGVjazogY2hlY2tcbiAgfTtcbn1cblxuZnVuY3Rpb24gUGFnaW5hdGlvbihTcGxpZGUyLCBDb21wb25lbnRzMiwgb3B0aW9ucykge1xuICB2YXIgZXZlbnQgPSBFdmVudEludGVyZmFjZShTcGxpZGUyKTtcbiAgdmFyIG9uID0gZXZlbnQub24sXG4gICAgICBlbWl0ID0gZXZlbnQuZW1pdCxcbiAgICAgIGJpbmQgPSBldmVudC5iaW5kO1xuICB2YXIgU2xpZGVzID0gQ29tcG9uZW50czIuU2xpZGVzLFxuICAgICAgRWxlbWVudHMgPSBDb21wb25lbnRzMi5FbGVtZW50cyxcbiAgICAgIENvbnRyb2xsZXIgPSBDb21wb25lbnRzMi5Db250cm9sbGVyO1xuICB2YXIgaGFzRm9jdXMgPSBDb250cm9sbGVyLmhhc0ZvY3VzLFxuICAgICAgZ2V0SW5kZXggPSBDb250cm9sbGVyLmdldEluZGV4LFxuICAgICAgZ28gPSBDb250cm9sbGVyLmdvO1xuICB2YXIgcmVzb2x2ZSA9IENvbXBvbmVudHMyLkRpcmVjdGlvbi5yZXNvbHZlO1xuICB2YXIgcGxhY2Vob2xkZXIgPSBFbGVtZW50cy5wYWdpbmF0aW9uO1xuICB2YXIgaXRlbXMgPSBbXTtcbiAgdmFyIGxpc3Q7XG4gIHZhciBwYWdpbmF0aW9uQ2xhc3NlcztcblxuICBmdW5jdGlvbiBtb3VudCgpIHtcbiAgICBkZXN0cm95KCk7XG4gICAgb24oW0VWRU5UX1VQREFURUQsIEVWRU5UX1JFRlJFU0gsIEVWRU5UX0VORF9JTkRFWF9DSEFOR0VEXSwgbW91bnQpO1xuICAgIHZhciBlbmFibGVkID0gb3B0aW9ucy5wYWdpbmF0aW9uO1xuICAgIHBsYWNlaG9sZGVyICYmIGRpc3BsYXkocGxhY2Vob2xkZXIsIGVuYWJsZWQgPyBcIlwiIDogXCJub25lXCIpO1xuXG4gICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgIG9uKFtFVkVOVF9NT1ZFLCBFVkVOVF9TQ1JPTEwsIEVWRU5UX1NDUk9MTEVEXSwgdXBkYXRlKTtcbiAgICAgIGNyZWF0ZVBhZ2luYXRpb24oKTtcbiAgICAgIHVwZGF0ZSgpO1xuICAgICAgZW1pdChFVkVOVF9QQUdJTkFUSU9OX01PVU5URUQsIHtcbiAgICAgICAgbGlzdDogbGlzdCxcbiAgICAgICAgaXRlbXM6IGl0ZW1zXG4gICAgICB9LCBnZXRBdChTcGxpZGUyLmluZGV4KSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICBpZiAobGlzdCkge1xuICAgICAgcmVtb3ZlKHBsYWNlaG9sZGVyID8gc2xpY2UobGlzdC5jaGlsZHJlbikgOiBsaXN0KTtcbiAgICAgIHJlbW92ZUNsYXNzKGxpc3QsIHBhZ2luYXRpb25DbGFzc2VzKTtcbiAgICAgIGVtcHR5KGl0ZW1zKTtcbiAgICAgIGxpc3QgPSBudWxsO1xuICAgIH1cblxuICAgIGV2ZW50LmRlc3Ryb3koKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVBhZ2luYXRpb24oKSB7XG4gICAgdmFyIGxlbmd0aCA9IFNwbGlkZTIubGVuZ3RoO1xuICAgIHZhciBjbGFzc2VzID0gb3B0aW9ucy5jbGFzc2VzLFxuICAgICAgICBpMThuID0gb3B0aW9ucy5pMThuLFxuICAgICAgICBwZXJQYWdlID0gb3B0aW9ucy5wZXJQYWdlO1xuICAgIHZhciBtYXggPSBoYXNGb2N1cygpID8gQ29udHJvbGxlci5nZXRFbmQoKSArIDEgOiBjZWlsKGxlbmd0aCAvIHBlclBhZ2UpO1xuICAgIGxpc3QgPSBwbGFjZWhvbGRlciB8fCBjcmVhdGUoXCJ1bFwiLCBjbGFzc2VzLnBhZ2luYXRpb24sIEVsZW1lbnRzLnRyYWNrLnBhcmVudEVsZW1lbnQpO1xuICAgIGFkZENsYXNzKGxpc3QsIHBhZ2luYXRpb25DbGFzc2VzID0gQ0xBU1NfUEFHSU5BVElPTiArIFwiLS1cIiArIGdldERpcmVjdGlvbigpKTtcbiAgICBzZXRBdHRyaWJ1dGUobGlzdCwgUk9MRSwgXCJ0YWJsaXN0XCIpO1xuICAgIHNldEF0dHJpYnV0ZShsaXN0LCBBUklBX0xBQkVMLCBpMThuLnNlbGVjdCk7XG4gICAgc2V0QXR0cmlidXRlKGxpc3QsIEFSSUFfT1JJRU5UQVRJT04sIGdldERpcmVjdGlvbigpID09PSBUVEIgPyBcInZlcnRpY2FsXCIgOiBcIlwiKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWF4OyBpKyspIHtcbiAgICAgIHZhciBsaSA9IGNyZWF0ZShcImxpXCIsIG51bGwsIGxpc3QpO1xuICAgICAgdmFyIGJ1dHRvbiA9IGNyZWF0ZShcImJ1dHRvblwiLCB7XG4gICAgICAgIGNsYXNzOiBjbGFzc2VzLnBhZ2UsXG4gICAgICAgIHR5cGU6IFwiYnV0dG9uXCJcbiAgICAgIH0sIGxpKTtcbiAgICAgIHZhciBjb250cm9scyA9IFNsaWRlcy5nZXRJbihpKS5tYXAoZnVuY3Rpb24gKFNsaWRlKSB7XG4gICAgICAgIHJldHVybiBTbGlkZS5zbGlkZS5pZDtcbiAgICAgIH0pO1xuICAgICAgdmFyIHRleHQgPSAhaGFzRm9jdXMoKSAmJiBwZXJQYWdlID4gMSA/IGkxOG4ucGFnZVggOiBpMThuLnNsaWRlWDtcbiAgICAgIGJpbmQoYnV0dG9uLCBcImNsaWNrXCIsIGFwcGx5KG9uQ2xpY2ssIGkpKTtcblxuICAgICAgaWYgKG9wdGlvbnMucGFnaW5hdGlvbktleWJvYXJkKSB7XG4gICAgICAgIGJpbmQoYnV0dG9uLCBcImtleWRvd25cIiwgYXBwbHkob25LZXlkb3duLCBpKSk7XG4gICAgICB9XG5cbiAgICAgIHNldEF0dHJpYnV0ZShsaSwgUk9MRSwgXCJwcmVzZW50YXRpb25cIik7XG4gICAgICBzZXRBdHRyaWJ1dGUoYnV0dG9uLCBST0xFLCBcInRhYlwiKTtcbiAgICAgIHNldEF0dHJpYnV0ZShidXR0b24sIEFSSUFfQ09OVFJPTFMsIGNvbnRyb2xzLmpvaW4oXCIgXCIpKTtcbiAgICAgIHNldEF0dHJpYnV0ZShidXR0b24sIEFSSUFfTEFCRUwsIGZvcm1hdCh0ZXh0LCBpICsgMSkpO1xuICAgICAgc2V0QXR0cmlidXRlKGJ1dHRvbiwgVEFCX0lOREVYLCAtMSk7XG4gICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgbGk6IGxpLFxuICAgICAgICBidXR0b246IGJ1dHRvbixcbiAgICAgICAgcGFnZTogaVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25DbGljayhwYWdlKSB7XG4gICAgZ28oXCI+XCIgKyBwYWdlLCB0cnVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uS2V5ZG93bihwYWdlLCBlKSB7XG4gICAgdmFyIGxlbmd0aCA9IGl0ZW1zLmxlbmd0aDtcbiAgICB2YXIga2V5ID0gbm9ybWFsaXplS2V5KGUpO1xuICAgIHZhciBkaXIgPSBnZXREaXJlY3Rpb24oKTtcbiAgICB2YXIgbmV4dFBhZ2UgPSAtMTtcblxuICAgIGlmIChrZXkgPT09IHJlc29sdmUoQVJST1dfUklHSFQsIGZhbHNlLCBkaXIpKSB7XG4gICAgICBuZXh0UGFnZSA9ICsrcGFnZSAlIGxlbmd0aDtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gcmVzb2x2ZShBUlJPV19MRUZULCBmYWxzZSwgZGlyKSkge1xuICAgICAgbmV4dFBhZ2UgPSAoLS1wYWdlICsgbGVuZ3RoKSAlIGxlbmd0aDtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJIb21lXCIpIHtcbiAgICAgIG5leHRQYWdlID0gMDtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJFbmRcIikge1xuICAgICAgbmV4dFBhZ2UgPSBsZW5ndGggLSAxO1xuICAgIH1cblxuICAgIHZhciBpdGVtID0gaXRlbXNbbmV4dFBhZ2VdO1xuXG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIGZvY3VzKGl0ZW0uYnV0dG9uKTtcbiAgICAgIGdvKFwiPlwiICsgbmV4dFBhZ2UpO1xuICAgICAgcHJldmVudChlLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXREaXJlY3Rpb24oKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMucGFnaW5hdGlvbkRpcmVjdGlvbiB8fCBvcHRpb25zLmRpcmVjdGlvbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEF0KGluZGV4KSB7XG4gICAgcmV0dXJuIGl0ZW1zW0NvbnRyb2xsZXIudG9QYWdlKGluZGV4KV07XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGUoKSB7XG4gICAgdmFyIHByZXYgPSBnZXRBdChnZXRJbmRleCh0cnVlKSk7XG4gICAgdmFyIGN1cnIgPSBnZXRBdChnZXRJbmRleCgpKTtcblxuICAgIGlmIChwcmV2KSB7XG4gICAgICB2YXIgYnV0dG9uID0gcHJldi5idXR0b247XG4gICAgICByZW1vdmVDbGFzcyhidXR0b24sIENMQVNTX0FDVElWRSk7XG4gICAgICByZW1vdmVBdHRyaWJ1dGUoYnV0dG9uLCBBUklBX1NFTEVDVEVEKTtcbiAgICAgIHNldEF0dHJpYnV0ZShidXR0b24sIFRBQl9JTkRFWCwgLTEpO1xuICAgIH1cblxuICAgIGlmIChjdXJyKSB7XG4gICAgICB2YXIgX2J1dHRvbiA9IGN1cnIuYnV0dG9uO1xuICAgICAgYWRkQ2xhc3MoX2J1dHRvbiwgQ0xBU1NfQUNUSVZFKTtcbiAgICAgIHNldEF0dHJpYnV0ZShfYnV0dG9uLCBBUklBX1NFTEVDVEVELCB0cnVlKTtcbiAgICAgIHNldEF0dHJpYnV0ZShfYnV0dG9uLCBUQUJfSU5ERVgsIFwiXCIpO1xuICAgIH1cblxuICAgIGVtaXQoRVZFTlRfUEFHSU5BVElPTl9VUERBVEVELCB7XG4gICAgICBsaXN0OiBsaXN0LFxuICAgICAgaXRlbXM6IGl0ZW1zXG4gICAgfSwgcHJldiwgY3Vycik7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGl0ZW1zOiBpdGVtcyxcbiAgICBtb3VudDogbW91bnQsXG4gICAgZGVzdHJveTogZGVzdHJveSxcbiAgICBnZXRBdDogZ2V0QXQsXG4gICAgdXBkYXRlOiB1cGRhdGVcbiAgfTtcbn1cblxudmFyIFRSSUdHRVJfS0VZUyA9IFtcIiBcIiwgXCJFbnRlclwiXTtcblxuZnVuY3Rpb24gU3luYyhTcGxpZGUyLCBDb21wb25lbnRzMiwgb3B0aW9ucykge1xuICB2YXIgaXNOYXZpZ2F0aW9uID0gb3B0aW9ucy5pc05hdmlnYXRpb24sXG4gICAgICBzbGlkZUZvY3VzID0gb3B0aW9ucy5zbGlkZUZvY3VzO1xuICB2YXIgZXZlbnRzID0gW107XG5cbiAgZnVuY3Rpb24gbW91bnQoKSB7XG4gICAgU3BsaWRlMi5zcGxpZGVzLmZvckVhY2goZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgaWYgKCF0YXJnZXQuaXNQYXJlbnQpIHtcbiAgICAgICAgc3luYyhTcGxpZGUyLCB0YXJnZXQuc3BsaWRlKTtcbiAgICAgICAgc3luYyh0YXJnZXQuc3BsaWRlLCBTcGxpZGUyKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChpc05hdmlnYXRpb24pIHtcbiAgICAgIG5hdmlnYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICBldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LmRlc3Ryb3koKTtcbiAgICB9KTtcbiAgICBlbXB0eShldmVudHMpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3VudCgpIHtcbiAgICBkZXN0cm95KCk7XG4gICAgbW91bnQoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN5bmMoc3BsaWRlLCB0YXJnZXQpIHtcbiAgICB2YXIgZXZlbnQgPSBFdmVudEludGVyZmFjZShzcGxpZGUpO1xuICAgIGV2ZW50Lm9uKEVWRU5UX01PVkUsIGZ1bmN0aW9uIChpbmRleCwgcHJldiwgZGVzdCkge1xuICAgICAgdGFyZ2V0LmdvKHRhcmdldC5pcyhMT09QKSA/IGRlc3QgOiBpbmRleCk7XG4gICAgfSk7XG4gICAgZXZlbnRzLnB1c2goZXZlbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gbmF2aWdhdGUoKSB7XG4gICAgdmFyIGV2ZW50ID0gRXZlbnRJbnRlcmZhY2UoU3BsaWRlMik7XG4gICAgdmFyIG9uID0gZXZlbnQub247XG4gICAgb24oRVZFTlRfQ0xJQ0ssIG9uQ2xpY2spO1xuICAgIG9uKEVWRU5UX1NMSURFX0tFWURPV04sIG9uS2V5ZG93bik7XG4gICAgb24oW0VWRU5UX01PVU5URUQsIEVWRU5UX1VQREFURURdLCB1cGRhdGUpO1xuICAgIGV2ZW50cy5wdXNoKGV2ZW50KTtcbiAgICBldmVudC5lbWl0KEVWRU5UX05BVklHQVRJT05fTU9VTlRFRCwgU3BsaWRlMi5zcGxpZGVzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICBzZXRBdHRyaWJ1dGUoQ29tcG9uZW50czIuRWxlbWVudHMubGlzdCwgQVJJQV9PUklFTlRBVElPTiwgb3B0aW9ucy5kaXJlY3Rpb24gPT09IFRUQiA/IFwidmVydGljYWxcIiA6IFwiXCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25DbGljayhTbGlkZSkge1xuICAgIFNwbGlkZTIuZ28oU2xpZGUuaW5kZXgpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25LZXlkb3duKFNsaWRlLCBlKSB7XG4gICAgaWYgKGluY2x1ZGVzKFRSSUdHRVJfS0VZUywgbm9ybWFsaXplS2V5KGUpKSkge1xuICAgICAgb25DbGljayhTbGlkZSk7XG4gICAgICBwcmV2ZW50KGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2V0dXA6IGFwcGx5KENvbXBvbmVudHMyLk1lZGlhLnNldCwge1xuICAgICAgc2xpZGVGb2N1czogaXNVbmRlZmluZWQoc2xpZGVGb2N1cykgPyBpc05hdmlnYXRpb24gOiBzbGlkZUZvY3VzXG4gICAgfSwgdHJ1ZSksXG4gICAgbW91bnQ6IG1vdW50LFxuICAgIGRlc3Ryb3k6IGRlc3Ryb3ksXG4gICAgcmVtb3VudDogcmVtb3VudFxuICB9O1xufVxuXG5mdW5jdGlvbiBXaGVlbChTcGxpZGUyLCBDb21wb25lbnRzMiwgb3B0aW9ucykge1xuICB2YXIgX0V2ZW50SW50ZXJmYWNlMTIgPSBFdmVudEludGVyZmFjZShTcGxpZGUyKSxcbiAgICAgIGJpbmQgPSBfRXZlbnRJbnRlcmZhY2UxMi5iaW5kO1xuXG4gIHZhciBsYXN0VGltZSA9IDA7XG5cbiAgZnVuY3Rpb24gbW91bnQoKSB7XG4gICAgaWYgKG9wdGlvbnMud2hlZWwpIHtcbiAgICAgIGJpbmQoQ29tcG9uZW50czIuRWxlbWVudHMudHJhY2ssIFwid2hlZWxcIiwgb25XaGVlbCwgU0NST0xMX0xJU1RFTkVSX09QVElPTlMpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uV2hlZWwoZSkge1xuICAgIGlmIChlLmNhbmNlbGFibGUpIHtcbiAgICAgIHZhciBkZWx0YVkgPSBlLmRlbHRhWTtcbiAgICAgIHZhciBiYWNrd2FyZHMgPSBkZWx0YVkgPCAwO1xuICAgICAgdmFyIHRpbWVTdGFtcCA9IHRpbWVPZihlKTtcblxuICAgICAgdmFyIF9taW4gPSBvcHRpb25zLndoZWVsTWluVGhyZXNob2xkIHx8IDA7XG5cbiAgICAgIHZhciBzbGVlcCA9IG9wdGlvbnMud2hlZWxTbGVlcCB8fCAwO1xuXG4gICAgICBpZiAoYWJzKGRlbHRhWSkgPiBfbWluICYmIHRpbWVTdGFtcCAtIGxhc3RUaW1lID4gc2xlZXApIHtcbiAgICAgICAgU3BsaWRlMi5nbyhiYWNrd2FyZHMgPyBcIjxcIiA6IFwiPlwiKTtcbiAgICAgICAgbGFzdFRpbWUgPSB0aW1lU3RhbXA7XG4gICAgICB9XG5cbiAgICAgIHNob3VsZFByZXZlbnQoYmFja3dhcmRzKSAmJiBwcmV2ZW50KGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3VsZFByZXZlbnQoYmFja3dhcmRzKSB7XG4gICAgcmV0dXJuICFvcHRpb25zLnJlbGVhc2VXaGVlbCB8fCBTcGxpZGUyLnN0YXRlLmlzKE1PVklORykgfHwgQ29tcG9uZW50czIuQ29udHJvbGxlci5nZXRBZGphY2VudChiYWNrd2FyZHMpICE9PSAtMTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbW91bnQ6IG1vdW50XG4gIH07XG59XG5cbnZhciBTUl9SRU1PVkFMX0RFTEFZID0gOTA7XG5cbmZ1bmN0aW9uIExpdmUoU3BsaWRlMiwgQ29tcG9uZW50czIsIG9wdGlvbnMpIHtcbiAgdmFyIF9FdmVudEludGVyZmFjZTEzID0gRXZlbnRJbnRlcmZhY2UoU3BsaWRlMiksXG4gICAgICBvbiA9IF9FdmVudEludGVyZmFjZTEzLm9uO1xuXG4gIHZhciB0cmFjayA9IENvbXBvbmVudHMyLkVsZW1lbnRzLnRyYWNrO1xuICB2YXIgZW5hYmxlZCA9IG9wdGlvbnMubGl2ZSAmJiAhb3B0aW9ucy5pc05hdmlnYXRpb247XG4gIHZhciBzciA9IGNyZWF0ZShcInNwYW5cIiwgQ0xBU1NfU1IpO1xuICB2YXIgaW50ZXJ2YWwgPSBSZXF1ZXN0SW50ZXJ2YWwoU1JfUkVNT1ZBTF9ERUxBWSwgYXBwbHkodG9nZ2xlLCBmYWxzZSkpO1xuXG4gIGZ1bmN0aW9uIG1vdW50KCkge1xuICAgIGlmIChlbmFibGVkKSB7XG4gICAgICBkaXNhYmxlKCFDb21wb25lbnRzMi5BdXRvcGxheS5pc1BhdXNlZCgpKTtcbiAgICAgIHNldEF0dHJpYnV0ZSh0cmFjaywgQVJJQV9BVE9NSUMsIHRydWUpO1xuICAgICAgc3IudGV4dENvbnRlbnQgPSBcIlxcdTIwMjZcIjtcbiAgICAgIG9uKEVWRU5UX0FVVE9QTEFZX1BMQVksIGFwcGx5KGRpc2FibGUsIHRydWUpKTtcbiAgICAgIG9uKEVWRU5UX0FVVE9QTEFZX1BBVVNFLCBhcHBseShkaXNhYmxlLCBmYWxzZSkpO1xuICAgICAgb24oW0VWRU5UX01PVkVELCBFVkVOVF9TQ1JPTExFRF0sIGFwcGx5KHRvZ2dsZSwgdHJ1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRvZ2dsZShhY3RpdmUpIHtcbiAgICBzZXRBdHRyaWJ1dGUodHJhY2ssIEFSSUFfQlVTWSwgYWN0aXZlKTtcblxuICAgIGlmIChhY3RpdmUpIHtcbiAgICAgIGFwcGVuZCh0cmFjaywgc3IpO1xuICAgICAgaW50ZXJ2YWwuc3RhcnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVtb3ZlKHNyKTtcbiAgICAgIGludGVydmFsLmNhbmNlbCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgcmVtb3ZlQXR0cmlidXRlKHRyYWNrLCBbQVJJQV9MSVZFLCBBUklBX0FUT01JQywgQVJJQV9CVVNZXSk7XG4gICAgcmVtb3ZlKHNyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRpc2FibGUoZGlzYWJsZWQpIHtcbiAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgc2V0QXR0cmlidXRlKHRyYWNrLCBBUklBX0xJVkUsIGRpc2FibGVkID8gXCJvZmZcIiA6IFwicG9saXRlXCIpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbW91bnQ6IG1vdW50LFxuICAgIGRpc2FibGU6IGRpc2FibGUsXG4gICAgZGVzdHJveTogZGVzdHJveVxuICB9O1xufVxuXG52YXIgQ29tcG9uZW50Q29uc3RydWN0b3JzID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICBfX3Byb3RvX186IG51bGwsXG4gIE1lZGlhOiBNZWRpYSxcbiAgRGlyZWN0aW9uOiBEaXJlY3Rpb24sXG4gIEVsZW1lbnRzOiBFbGVtZW50cyxcbiAgU2xpZGVzOiBTbGlkZXMsXG4gIExheW91dDogTGF5b3V0LFxuICBDbG9uZXM6IENsb25lcyxcbiAgTW92ZTogTW92ZSxcbiAgQ29udHJvbGxlcjogQ29udHJvbGxlcixcbiAgQXJyb3dzOiBBcnJvd3MsXG4gIEF1dG9wbGF5OiBBdXRvcGxheSxcbiAgQ292ZXI6IENvdmVyLFxuICBTY3JvbGw6IFNjcm9sbCxcbiAgRHJhZzogRHJhZyxcbiAgS2V5Ym9hcmQ6IEtleWJvYXJkLFxuICBMYXp5TG9hZDogTGF6eUxvYWQsXG4gIFBhZ2luYXRpb246IFBhZ2luYXRpb24sXG4gIFN5bmM6IFN5bmMsXG4gIFdoZWVsOiBXaGVlbCxcbiAgTGl2ZTogTGl2ZVxufSk7XG52YXIgSTE4TiA9IHtcbiAgcHJldjogXCJQcmV2aW91cyBzbGlkZVwiLFxuICBuZXh0OiBcIk5leHQgc2xpZGVcIixcbiAgZmlyc3Q6IFwiR28gdG8gZmlyc3Qgc2xpZGVcIixcbiAgbGFzdDogXCJHbyB0byBsYXN0IHNsaWRlXCIsXG4gIHNsaWRlWDogXCJHbyB0byBzbGlkZSAlc1wiLFxuICBwYWdlWDogXCJHbyB0byBwYWdlICVzXCIsXG4gIHBsYXk6IFwiU3RhcnQgYXV0b3BsYXlcIixcbiAgcGF1c2U6IFwiUGF1c2UgYXV0b3BsYXlcIixcbiAgY2Fyb3VzZWw6IFwiY2Fyb3VzZWxcIixcbiAgc2xpZGU6IFwic2xpZGVcIixcbiAgc2VsZWN0OiBcIlNlbGVjdCBhIHNsaWRlIHRvIHNob3dcIixcbiAgc2xpZGVMYWJlbDogXCIlcyBvZiAlc1wiXG59O1xudmFyIERFRkFVTFRTID0ge1xuICB0eXBlOiBcInNsaWRlXCIsXG4gIHJvbGU6IFwicmVnaW9uXCIsXG4gIHNwZWVkOiA0MDAsXG4gIHBlclBhZ2U6IDEsXG4gIGNsb25lU3RhdHVzOiB0cnVlLFxuICBhcnJvd3M6IHRydWUsXG4gIHBhZ2luYXRpb246IHRydWUsXG4gIHBhZ2luYXRpb25LZXlib2FyZDogdHJ1ZSxcbiAgaW50ZXJ2YWw6IDVlMyxcbiAgcGF1c2VPbkhvdmVyOiB0cnVlLFxuICBwYXVzZU9uRm9jdXM6IHRydWUsXG4gIHJlc2V0UHJvZ3Jlc3M6IHRydWUsXG4gIGVhc2luZzogXCJjdWJpYy1iZXppZXIoMC4yNSwgMSwgMC41LCAxKVwiLFxuICBkcmFnOiB0cnVlLFxuICBkaXJlY3Rpb246IFwibHRyXCIsXG4gIHRyaW1TcGFjZTogdHJ1ZSxcbiAgZm9jdXNhYmxlTm9kZXM6IFwiYSwgYnV0dG9uLCB0ZXh0YXJlYSwgaW5wdXQsIHNlbGVjdCwgaWZyYW1lXCIsXG4gIGxpdmU6IHRydWUsXG4gIGNsYXNzZXM6IENMQVNTRVMsXG4gIGkxOG46IEkxOE4sXG4gIHJlZHVjZWRNb3Rpb246IHtcbiAgICBzcGVlZDogMCxcbiAgICByZXdpbmRTcGVlZDogMCxcbiAgICBhdXRvcGxheTogXCJwYXVzZVwiXG4gIH1cbn07XG5cbmZ1bmN0aW9uIEZhZGUoU3BsaWRlMiwgQ29tcG9uZW50czIsIG9wdGlvbnMpIHtcbiAgdmFyIFNsaWRlcyA9IENvbXBvbmVudHMyLlNsaWRlcztcblxuICBmdW5jdGlvbiBtb3VudCgpIHtcbiAgICBFdmVudEludGVyZmFjZShTcGxpZGUyKS5vbihbRVZFTlRfTU9VTlRFRCwgRVZFTlRfUkVGUkVTSF0sIGluaXQpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICBTbGlkZXMuZm9yRWFjaChmdW5jdGlvbiAoU2xpZGUpIHtcbiAgICAgIFNsaWRlLnN0eWxlKFwidHJhbnNmb3JtXCIsIFwidHJhbnNsYXRlWCgtXCIgKyAxMDAgKiBTbGlkZS5pbmRleCArIFwiJSlcIik7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBzdGFydChpbmRleCwgZG9uZSkge1xuICAgIFNsaWRlcy5zdHlsZShcInRyYW5zaXRpb25cIiwgXCJvcGFjaXR5IFwiICsgb3B0aW9ucy5zcGVlZCArIFwibXMgXCIgKyBvcHRpb25zLmVhc2luZyk7XG4gICAgbmV4dFRpY2soZG9uZSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1vdW50OiBtb3VudCxcbiAgICBzdGFydDogc3RhcnQsXG4gICAgY2FuY2VsOiBub29wXG4gIH07XG59XG5cbmZ1bmN0aW9uIFNsaWRlKFNwbGlkZTIsIENvbXBvbmVudHMyLCBvcHRpb25zKSB7XG4gIHZhciBNb3ZlID0gQ29tcG9uZW50czIuTW92ZSxcbiAgICAgIENvbnRyb2xsZXIgPSBDb21wb25lbnRzMi5Db250cm9sbGVyLFxuICAgICAgU2Nyb2xsID0gQ29tcG9uZW50czIuU2Nyb2xsO1xuICB2YXIgbGlzdCA9IENvbXBvbmVudHMyLkVsZW1lbnRzLmxpc3Q7XG4gIHZhciB0cmFuc2l0aW9uID0gYXBwbHkoc3R5bGUsIGxpc3QsIFwidHJhbnNpdGlvblwiKTtcbiAgdmFyIGVuZENhbGxiYWNrO1xuXG4gIGZ1bmN0aW9uIG1vdW50KCkge1xuICAgIEV2ZW50SW50ZXJmYWNlKFNwbGlkZTIpLmJpbmQobGlzdCwgXCJ0cmFuc2l0aW9uZW5kXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoZS50YXJnZXQgPT09IGxpc3QgJiYgZW5kQ2FsbGJhY2spIHtcbiAgICAgICAgY2FuY2VsKCk7XG4gICAgICAgIGVuZENhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBzdGFydChpbmRleCwgZG9uZSkge1xuICAgIHZhciBkZXN0aW5hdGlvbiA9IE1vdmUudG9Qb3NpdGlvbihpbmRleCwgdHJ1ZSk7XG4gICAgdmFyIHBvc2l0aW9uID0gTW92ZS5nZXRQb3NpdGlvbigpO1xuICAgIHZhciBzcGVlZCA9IGdldFNwZWVkKGluZGV4KTtcblxuICAgIGlmIChhYnMoZGVzdGluYXRpb24gLSBwb3NpdGlvbikgPj0gMSAmJiBzcGVlZCA+PSAxKSB7XG4gICAgICBpZiAob3B0aW9ucy51c2VTY3JvbGwpIHtcbiAgICAgICAgU2Nyb2xsLnNjcm9sbChkZXN0aW5hdGlvbiwgc3BlZWQsIGZhbHNlLCBkb25lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyYW5zaXRpb24oXCJ0cmFuc2Zvcm0gXCIgKyBzcGVlZCArIFwibXMgXCIgKyBvcHRpb25zLmVhc2luZyk7XG4gICAgICAgIE1vdmUudHJhbnNsYXRlKGRlc3RpbmF0aW9uLCB0cnVlKTtcbiAgICAgICAgZW5kQ2FsbGJhY2sgPSBkb25lO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBNb3ZlLmp1bXAoaW5kZXgpO1xuICAgICAgZG9uZSgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICB0cmFuc2l0aW9uKFwiXCIpO1xuICAgIFNjcm9sbC5jYW5jZWwoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFNwZWVkKGluZGV4KSB7XG4gICAgdmFyIHJld2luZFNwZWVkID0gb3B0aW9ucy5yZXdpbmRTcGVlZDtcblxuICAgIGlmIChTcGxpZGUyLmlzKFNMSURFKSAmJiByZXdpbmRTcGVlZCkge1xuICAgICAgdmFyIHByZXYgPSBDb250cm9sbGVyLmdldEluZGV4KHRydWUpO1xuICAgICAgdmFyIGVuZCA9IENvbnRyb2xsZXIuZ2V0RW5kKCk7XG5cbiAgICAgIGlmIChwcmV2ID09PSAwICYmIGluZGV4ID49IGVuZCB8fCBwcmV2ID49IGVuZCAmJiBpbmRleCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gcmV3aW5kU3BlZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGlvbnMuc3BlZWQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1vdW50OiBtb3VudCxcbiAgICBzdGFydDogc3RhcnQsXG4gICAgY2FuY2VsOiBjYW5jZWxcbiAgfTtcbn1cblxudmFyIF9TcGxpZGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBfU3BsaWRlKHRhcmdldCwgb3B0aW9ucykge1xuICAgIHRoaXMuZXZlbnQgPSBFdmVudEludGVyZmFjZSgpO1xuICAgIHRoaXMuQ29tcG9uZW50cyA9IHt9O1xuICAgIHRoaXMuc3RhdGUgPSBTdGF0ZShDUkVBVEVEKTtcbiAgICB0aGlzLnNwbGlkZXMgPSBbXTtcbiAgICB0aGlzLl9vID0ge307XG4gICAgdGhpcy5fRSA9IHt9O1xuICAgIHZhciByb290ID0gaXNTdHJpbmcodGFyZ2V0KSA/IHF1ZXJ5KGRvY3VtZW50LCB0YXJnZXQpIDogdGFyZ2V0O1xuICAgIGFzc2VydChyb290LCByb290ICsgXCIgaXMgaW52YWxpZC5cIik7XG4gICAgdGhpcy5yb290ID0gcm9vdDtcbiAgICBvcHRpb25zID0gbWVyZ2Uoe1xuICAgICAgbGFiZWw6IGdldEF0dHJpYnV0ZShyb290LCBBUklBX0xBQkVMKSB8fCBcIlwiLFxuICAgICAgbGFiZWxsZWRieTogZ2V0QXR0cmlidXRlKHJvb3QsIEFSSUFfTEFCRUxMRURCWSkgfHwgXCJcIlxuICAgIH0sIERFRkFVTFRTLCBfU3BsaWRlLmRlZmF1bHRzLCBvcHRpb25zIHx8IHt9KTtcblxuICAgIHRyeSB7XG4gICAgICBtZXJnZShvcHRpb25zLCBKU09OLnBhcnNlKGdldEF0dHJpYnV0ZShyb290LCBEQVRBX0FUVFJJQlVURSkpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBhc3NlcnQoZmFsc2UsIFwiSW52YWxpZCBKU09OXCIpO1xuICAgIH1cblxuICAgIHRoaXMuX28gPSBPYmplY3QuY3JlYXRlKG1lcmdlKHt9LCBvcHRpb25zKSk7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gX1NwbGlkZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLm1vdW50ID0gZnVuY3Rpb24gbW91bnQoRXh0ZW5zaW9ucywgVHJhbnNpdGlvbikge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgc3RhdGUgPSB0aGlzLnN0YXRlLFxuICAgICAgICBDb21wb25lbnRzMiA9IHRoaXMuQ29tcG9uZW50cztcbiAgICBhc3NlcnQoc3RhdGUuaXMoW0NSRUFURUQsIERFU1RST1lFRF0pLCBcIkFscmVhZHkgbW91bnRlZCFcIik7XG4gICAgc3RhdGUuc2V0KENSRUFURUQpO1xuICAgIHRoaXMuX0MgPSBDb21wb25lbnRzMjtcbiAgICB0aGlzLl9UID0gVHJhbnNpdGlvbiB8fCB0aGlzLl9UIHx8ICh0aGlzLmlzKEZBREUpID8gRmFkZSA6IFNsaWRlKTtcbiAgICB0aGlzLl9FID0gRXh0ZW5zaW9ucyB8fCB0aGlzLl9FO1xuICAgIHZhciBDb25zdHJ1Y3RvcnMgPSBhc3NpZ24oe30sIENvbXBvbmVudENvbnN0cnVjdG9ycywgdGhpcy5fRSwge1xuICAgICAgVHJhbnNpdGlvbjogdGhpcy5fVFxuICAgIH0pO1xuICAgIGZvck93bihDb25zdHJ1Y3RvcnMsIGZ1bmN0aW9uIChDb21wb25lbnQsIGtleSkge1xuICAgICAgdmFyIGNvbXBvbmVudCA9IENvbXBvbmVudChfdGhpcywgQ29tcG9uZW50czIsIF90aGlzLl9vKTtcbiAgICAgIENvbXBvbmVudHMyW2tleV0gPSBjb21wb25lbnQ7XG4gICAgICBjb21wb25lbnQuc2V0dXAgJiYgY29tcG9uZW50LnNldHVwKCk7XG4gICAgfSk7XG4gICAgZm9yT3duKENvbXBvbmVudHMyLCBmdW5jdGlvbiAoY29tcG9uZW50KSB7XG4gICAgICBjb21wb25lbnQubW91bnQgJiYgY29tcG9uZW50Lm1vdW50KCk7XG4gICAgfSk7XG4gICAgdGhpcy5lbWl0KEVWRU5UX01PVU5URUQpO1xuICAgIGFkZENsYXNzKHRoaXMucm9vdCwgQ0xBU1NfSU5JVElBTElaRUQpO1xuICAgIHN0YXRlLnNldChJRExFKTtcbiAgICB0aGlzLmVtaXQoRVZFTlRfUkVBRFkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIF9wcm90by5zeW5jID0gZnVuY3Rpb24gc3luYyhzcGxpZGUpIHtcbiAgICB0aGlzLnNwbGlkZXMucHVzaCh7XG4gICAgICBzcGxpZGU6IHNwbGlkZVxuICAgIH0pO1xuICAgIHNwbGlkZS5zcGxpZGVzLnB1c2goe1xuICAgICAgc3BsaWRlOiB0aGlzLFxuICAgICAgaXNQYXJlbnQ6IHRydWVcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnN0YXRlLmlzKElETEUpKSB7XG4gICAgICB0aGlzLl9DLlN5bmMucmVtb3VudCgpO1xuXG4gICAgICBzcGxpZGUuQ29tcG9uZW50cy5TeW5jLnJlbW91bnQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBfcHJvdG8uZ28gPSBmdW5jdGlvbiBnbyhjb250cm9sKSB7XG4gICAgdGhpcy5fQy5Db250cm9sbGVyLmdvKGNvbnRyb2wpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgX3Byb3RvLm9uID0gZnVuY3Rpb24gb24oZXZlbnRzLCBjYWxsYmFjaykge1xuICAgIHRoaXMuZXZlbnQub24oZXZlbnRzLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgX3Byb3RvLm9mZiA9IGZ1bmN0aW9uIG9mZihldmVudHMpIHtcbiAgICB0aGlzLmV2ZW50Lm9mZihldmVudHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIF9wcm90by5lbWl0ID0gZnVuY3Rpb24gZW1pdChldmVudCkge1xuICAgIHZhciBfdGhpcyRldmVudDtcblxuICAgIChfdGhpcyRldmVudCA9IHRoaXMuZXZlbnQpLmVtaXQuYXBwbHkoX3RoaXMkZXZlbnQsIFtldmVudF0uY29uY2F0KHNsaWNlKGFyZ3VtZW50cywgMSkpKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIF9wcm90by5hZGQgPSBmdW5jdGlvbiBhZGQoc2xpZGVzLCBpbmRleCkge1xuICAgIHRoaXMuX0MuU2xpZGVzLmFkZChzbGlkZXMsIGluZGV4KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIF9wcm90by5yZW1vdmUgPSBmdW5jdGlvbiByZW1vdmUobWF0Y2hlcikge1xuICAgIHRoaXMuX0MuU2xpZGVzLnJlbW92ZShtYXRjaGVyKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIF9wcm90by5pcyA9IGZ1bmN0aW9uIGlzKHR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5fby50eXBlID09PSB0eXBlO1xuICB9O1xuXG4gIF9wcm90by5yZWZyZXNoID0gZnVuY3Rpb24gcmVmcmVzaCgpIHtcbiAgICB0aGlzLmVtaXQoRVZFTlRfUkVGUkVTSCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgX3Byb3RvLmRlc3Ryb3kgPSBmdW5jdGlvbiBkZXN0cm95KGNvbXBsZXRlbHkpIHtcbiAgICBpZiAoY29tcGxldGVseSA9PT0gdm9pZCAwKSB7XG4gICAgICBjb21wbGV0ZWx5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgZXZlbnQgPSB0aGlzLmV2ZW50LFxuICAgICAgICBzdGF0ZSA9IHRoaXMuc3RhdGU7XG5cbiAgICBpZiAoc3RhdGUuaXMoQ1JFQVRFRCkpIHtcbiAgICAgIEV2ZW50SW50ZXJmYWNlKHRoaXMpLm9uKEVWRU5UX1JFQURZLCB0aGlzLmRlc3Ryb3kuYmluZCh0aGlzLCBjb21wbGV0ZWx5KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvck93bih0aGlzLl9DLCBmdW5jdGlvbiAoY29tcG9uZW50KSB7XG4gICAgICAgIGNvbXBvbmVudC5kZXN0cm95ICYmIGNvbXBvbmVudC5kZXN0cm95KGNvbXBsZXRlbHkpO1xuICAgICAgfSwgdHJ1ZSk7XG4gICAgICBldmVudC5lbWl0KEVWRU5UX0RFU1RST1kpO1xuICAgICAgZXZlbnQuZGVzdHJveSgpO1xuICAgICAgY29tcGxldGVseSAmJiBlbXB0eSh0aGlzLnNwbGlkZXMpO1xuICAgICAgc3RhdGUuc2V0KERFU1RST1lFRCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzKF9TcGxpZGUsIFt7XG4gICAga2V5OiBcIm9wdGlvbnNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9vO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQob3B0aW9ucykge1xuICAgICAgdGhpcy5fQy5NZWRpYS5zZXQob3B0aW9ucywgdHJ1ZSwgdHJ1ZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImxlbmd0aFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX0MuU2xpZGVzLmdldExlbmd0aCh0cnVlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW5kZXhcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9DLkNvbnRyb2xsZXIuZ2V0SW5kZXgoKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gX1NwbGlkZTtcbn0oKTtcblxudmFyIFNwbGlkZSA9IF9TcGxpZGU7XG5TcGxpZGUuZGVmYXVsdHMgPSB7fTtcblNwbGlkZS5TVEFURVMgPSBTVEFURVM7XG52YXIgQ0xBU1NfUkVOREVSRUQgPSBcImlzLXJlbmRlcmVkXCI7XG52YXIgUkVOREVSRVJfREVGQVVMVF9DT05GSUcgPSB7XG4gIGxpc3RUYWc6IFwidWxcIixcbiAgc2xpZGVUYWc6IFwibGlcIlxufTtcblxudmFyIFN0eWxlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU3R5bGUoaWQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLnN0eWxlcyA9IHt9O1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICB9XG5cbiAgdmFyIF9wcm90bzIgPSBTdHlsZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvMi5ydWxlID0gZnVuY3Rpb24gcnVsZShzZWxlY3RvciwgcHJvcCwgdmFsdWUsIGJyZWFrcG9pbnQpIHtcbiAgICBicmVha3BvaW50ID0gYnJlYWtwb2ludCB8fCBcImRlZmF1bHRcIjtcbiAgICB2YXIgc2VsZWN0b3JzID0gdGhpcy5zdHlsZXNbYnJlYWtwb2ludF0gPSB0aGlzLnN0eWxlc1ticmVha3BvaW50XSB8fCB7fTtcbiAgICB2YXIgc3R5bGVzID0gc2VsZWN0b3JzW3NlbGVjdG9yXSA9IHNlbGVjdG9yc1tzZWxlY3Rvcl0gfHwge307XG4gICAgc3R5bGVzW3Byb3BdID0gdmFsdWU7XG4gIH07XG5cbiAgX3Byb3RvMi5idWlsZCA9IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdmFyIGNzcyA9IFwiXCI7XG5cbiAgICBpZiAodGhpcy5zdHlsZXMuZGVmYXVsdCkge1xuICAgICAgY3NzICs9IHRoaXMuYnVpbGRTZWxlY3RvcnModGhpcy5zdHlsZXMuZGVmYXVsdCk7XG4gICAgfVxuXG4gICAgT2JqZWN0LmtleXModGhpcy5zdHlsZXMpLnNvcnQoZnVuY3Rpb24gKG4sIG0pIHtcbiAgICAgIHJldHVybiBfdGhpczIub3B0aW9ucy5tZWRpYVF1ZXJ5ID09PSBcIm1pblwiID8gK24gLSArbSA6ICttIC0gK247XG4gICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoYnJlYWtwb2ludCkge1xuICAgICAgaWYgKGJyZWFrcG9pbnQgIT09IFwiZGVmYXVsdFwiKSB7XG4gICAgICAgIGNzcyArPSBcIkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IFwiICsgYnJlYWtwb2ludCArIFwicHgpIHtcIjtcbiAgICAgICAgY3NzICs9IF90aGlzMi5idWlsZFNlbGVjdG9ycyhfdGhpczIuc3R5bGVzW2JyZWFrcG9pbnRdKTtcbiAgICAgICAgY3NzICs9IFwifVwiO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjc3M7XG4gIH07XG5cbiAgX3Byb3RvMi5idWlsZFNlbGVjdG9ycyA9IGZ1bmN0aW9uIGJ1aWxkU2VsZWN0b3JzKHNlbGVjdG9ycykge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgdmFyIGNzcyA9IFwiXCI7XG4gICAgZm9yT3duKHNlbGVjdG9ycywgZnVuY3Rpb24gKHN0eWxlcywgc2VsZWN0b3IpIHtcbiAgICAgIHNlbGVjdG9yID0gKFwiI1wiICsgX3RoaXMzLmlkICsgXCIgXCIgKyBzZWxlY3RvcikudHJpbSgpO1xuICAgICAgY3NzICs9IHNlbGVjdG9yICsgXCIge1wiO1xuICAgICAgZm9yT3duKHN0eWxlcywgZnVuY3Rpb24gKHZhbHVlLCBwcm9wKSB7XG4gICAgICAgIGlmICh2YWx1ZSB8fCB2YWx1ZSA9PT0gMCkge1xuICAgICAgICAgIGNzcyArPSBwcm9wICsgXCI6IFwiICsgdmFsdWUgKyBcIjtcIjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjc3MgKz0gXCJ9XCI7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNzcztcbiAgfTtcblxuICByZXR1cm4gU3R5bGU7XG59KCk7XG5cbnZhciBTcGxpZGVSZW5kZXJlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFNwbGlkZVJlbmRlcmVyKGNvbnRlbnRzLCBvcHRpb25zLCBjb25maWcsIGRlZmF1bHRzKSB7XG4gICAgdGhpcy5zbGlkZXMgPSBbXTtcbiAgICB0aGlzLm9wdGlvbnMgPSB7fTtcbiAgICB0aGlzLmJyZWFrcG9pbnRzID0gW107XG4gICAgbWVyZ2UoREVGQVVMVFMsIGRlZmF1bHRzIHx8IHt9KTtcbiAgICBtZXJnZShtZXJnZSh0aGlzLm9wdGlvbnMsIERFRkFVTFRTKSwgb3B0aW9ucyB8fCB7fSk7XG4gICAgdGhpcy5jb250ZW50cyA9IGNvbnRlbnRzO1xuICAgIHRoaXMuY29uZmlnID0gYXNzaWduKHt9LCBSRU5ERVJFUl9ERUZBVUxUX0NPTkZJRywgY29uZmlnIHx8IHt9KTtcbiAgICB0aGlzLmlkID0gdGhpcy5jb25maWcuaWQgfHwgdW5pcXVlSWQoXCJzcGxpZGVcIik7XG4gICAgdGhpcy5TdHlsZSA9IG5ldyBTdHlsZSh0aGlzLmlkLCB0aGlzLm9wdGlvbnMpO1xuICAgIHRoaXMuRGlyZWN0aW9uID0gRGlyZWN0aW9uKG51bGwsIG51bGwsIHRoaXMub3B0aW9ucyk7XG4gICAgYXNzZXJ0KHRoaXMuY29udGVudHMubGVuZ3RoLCBcIlByb3ZpZGUgYXQgbGVhc3QgMSBjb250ZW50LlwiKTtcbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuXG4gIFNwbGlkZVJlbmRlcmVyLmNsZWFuID0gZnVuY3Rpb24gY2xlYW4oc3BsaWRlKSB7XG4gICAgdmFyIF9FdmVudEludGVyZmFjZTE0ID0gRXZlbnRJbnRlcmZhY2Uoc3BsaWRlKSxcbiAgICAgICAgb24gPSBfRXZlbnRJbnRlcmZhY2UxNC5vbjtcblxuICAgIHZhciByb290ID0gc3BsaWRlLnJvb3Q7XG4gICAgdmFyIGNsb25lcyA9IHF1ZXJ5QWxsKHJvb3QsIFwiLlwiICsgQ0xBU1NfQ0xPTkUpO1xuICAgIG9uKEVWRU5UX01PVU5URUQsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlbW92ZShjaGlsZChyb290LCBcInN0eWxlXCIpKTtcbiAgICB9KTtcbiAgICByZW1vdmUoY2xvbmVzKTtcbiAgfTtcblxuICB2YXIgX3Byb3RvMyA9IFNwbGlkZVJlbmRlcmVyLnByb3RvdHlwZTtcblxuICBfcHJvdG8zLmluaXQgPSBmdW5jdGlvbiBpbml0KCkge1xuICAgIHRoaXMucGFyc2VCcmVha3BvaW50cygpO1xuICAgIHRoaXMuaW5pdFNsaWRlcygpO1xuICAgIHRoaXMucmVnaXN0ZXJSb290U3R5bGVzKCk7XG4gICAgdGhpcy5yZWdpc3RlclRyYWNrU3R5bGVzKCk7XG4gICAgdGhpcy5yZWdpc3RlclNsaWRlU3R5bGVzKCk7XG4gICAgdGhpcy5yZWdpc3Rlckxpc3RTdHlsZXMoKTtcbiAgfTtcblxuICBfcHJvdG8zLmluaXRTbGlkZXMgPSBmdW5jdGlvbiBpbml0U2xpZGVzKCkge1xuICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgcHVzaCh0aGlzLnNsaWRlcywgdGhpcy5jb250ZW50cy5tYXAoZnVuY3Rpb24gKGNvbnRlbnQsIGluZGV4KSB7XG4gICAgICBjb250ZW50ID0gaXNTdHJpbmcoY29udGVudCkgPyB7XG4gICAgICAgIGh0bWw6IGNvbnRlbnRcbiAgICAgIH0gOiBjb250ZW50O1xuICAgICAgY29udGVudC5zdHlsZXMgPSBjb250ZW50LnN0eWxlcyB8fCB7fTtcbiAgICAgIGNvbnRlbnQuYXR0cnMgPSBjb250ZW50LmF0dHJzIHx8IHt9O1xuXG4gICAgICBfdGhpczQuY292ZXIoY29udGVudCk7XG5cbiAgICAgIHZhciBjbGFzc2VzID0gX3RoaXM0Lm9wdGlvbnMuY2xhc3Nlcy5zbGlkZSArIFwiIFwiICsgKGluZGV4ID09PSAwID8gQ0xBU1NfQUNUSVZFIDogXCJcIik7XG4gICAgICBhc3NpZ24oY29udGVudC5hdHRycywge1xuICAgICAgICBjbGFzczogKGNsYXNzZXMgKyBcIiBcIiArIChjb250ZW50LmF0dHJzLmNsYXNzIHx8IFwiXCIpKS50cmltKCksXG4gICAgICAgIHN0eWxlOiBfdGhpczQuYnVpbGRTdHlsZXMoY29udGVudC5zdHlsZXMpXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH0pKTtcblxuICAgIGlmICh0aGlzLmlzTG9vcCgpKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlQ2xvbmVzKHRoaXMuc2xpZGVzKTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvMy5yZWdpc3RlclJvb3RTdHlsZXMgPSBmdW5jdGlvbiByZWdpc3RlclJvb3RTdHlsZXMoKSB7XG4gICAgdmFyIF90aGlzNSA9IHRoaXM7XG5cbiAgICB0aGlzLmJyZWFrcG9pbnRzLmZvckVhY2goZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICB2YXIgd2lkdGggPSBfcmVmMlswXSxcbiAgICAgICAgICBvcHRpb25zID0gX3JlZjJbMV07XG5cbiAgICAgIF90aGlzNS5TdHlsZS5ydWxlKFwiIFwiLCBcIm1heC13aWR0aFwiLCB1bml0KG9wdGlvbnMud2lkdGgpLCB3aWR0aCk7XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvMy5yZWdpc3RlclRyYWNrU3R5bGVzID0gZnVuY3Rpb24gcmVnaXN0ZXJUcmFja1N0eWxlcygpIHtcbiAgICB2YXIgX3RoaXM2ID0gdGhpcztcblxuICAgIHZhciBTdHlsZTIgPSB0aGlzLlN0eWxlO1xuICAgIHZhciBzZWxlY3RvciA9IFwiLlwiICsgQ0xBU1NfVFJBQ0s7XG4gICAgdGhpcy5icmVha3BvaW50cy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgdmFyIHdpZHRoID0gX3JlZjNbMF0sXG4gICAgICAgICAgb3B0aW9ucyA9IF9yZWYzWzFdO1xuICAgICAgU3R5bGUyLnJ1bGUoc2VsZWN0b3IsIF90aGlzNi5yZXNvbHZlKFwicGFkZGluZ0xlZnRcIiksIF90aGlzNi5jc3NQYWRkaW5nKG9wdGlvbnMsIGZhbHNlKSwgd2lkdGgpO1xuICAgICAgU3R5bGUyLnJ1bGUoc2VsZWN0b3IsIF90aGlzNi5yZXNvbHZlKFwicGFkZGluZ1JpZ2h0XCIpLCBfdGhpczYuY3NzUGFkZGluZyhvcHRpb25zLCB0cnVlKSwgd2lkdGgpO1xuICAgICAgU3R5bGUyLnJ1bGUoc2VsZWN0b3IsIFwiaGVpZ2h0XCIsIF90aGlzNi5jc3NUcmFja0hlaWdodChvcHRpb25zKSwgd2lkdGgpO1xuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90bzMucmVnaXN0ZXJMaXN0U3R5bGVzID0gZnVuY3Rpb24gcmVnaXN0ZXJMaXN0U3R5bGVzKCkge1xuICAgIHZhciBfdGhpczcgPSB0aGlzO1xuXG4gICAgdmFyIFN0eWxlMiA9IHRoaXMuU3R5bGU7XG4gICAgdmFyIHNlbGVjdG9yID0gXCIuXCIgKyBDTEFTU19MSVNUO1xuICAgIHRoaXMuYnJlYWtwb2ludHMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjQpIHtcbiAgICAgIHZhciB3aWR0aCA9IF9yZWY0WzBdLFxuICAgICAgICAgIG9wdGlvbnMgPSBfcmVmNFsxXTtcbiAgICAgIFN0eWxlMi5ydWxlKHNlbGVjdG9yLCBcInRyYW5zZm9ybVwiLCBfdGhpczcuYnVpbGRUcmFuc2xhdGUob3B0aW9ucyksIHdpZHRoKTtcblxuICAgICAgaWYgKCFfdGhpczcuY3NzU2xpZGVIZWlnaHQob3B0aW9ucykpIHtcbiAgICAgICAgU3R5bGUyLnJ1bGUoc2VsZWN0b3IsIFwiYXNwZWN0LXJhdGlvXCIsIF90aGlzNy5jc3NBc3BlY3RSYXRpbyhvcHRpb25zKSwgd2lkdGgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90bzMucmVnaXN0ZXJTbGlkZVN0eWxlcyA9IGZ1bmN0aW9uIHJlZ2lzdGVyU2xpZGVTdHlsZXMoKSB7XG4gICAgdmFyIF90aGlzOCA9IHRoaXM7XG5cbiAgICB2YXIgU3R5bGUyID0gdGhpcy5TdHlsZTtcbiAgICB2YXIgc2VsZWN0b3IgPSBcIi5cIiArIENMQVNTX1NMSURFO1xuICAgIHRoaXMuYnJlYWtwb2ludHMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjUpIHtcbiAgICAgIHZhciB3aWR0aCA9IF9yZWY1WzBdLFxuICAgICAgICAgIG9wdGlvbnMgPSBfcmVmNVsxXTtcbiAgICAgIFN0eWxlMi5ydWxlKHNlbGVjdG9yLCBcIndpZHRoXCIsIF90aGlzOC5jc3NTbGlkZVdpZHRoKG9wdGlvbnMpLCB3aWR0aCk7XG4gICAgICBTdHlsZTIucnVsZShzZWxlY3RvciwgXCJoZWlnaHRcIiwgX3RoaXM4LmNzc1NsaWRlSGVpZ2h0KG9wdGlvbnMpIHx8IFwiMTAwJVwiLCB3aWR0aCk7XG4gICAgICBTdHlsZTIucnVsZShzZWxlY3RvciwgX3RoaXM4LnJlc29sdmUoXCJtYXJnaW5SaWdodFwiKSwgdW5pdChvcHRpb25zLmdhcCkgfHwgXCIwcHhcIiwgd2lkdGgpO1xuICAgICAgU3R5bGUyLnJ1bGUoc2VsZWN0b3IgKyBcIiA+IGltZ1wiLCBcImRpc3BsYXlcIiwgb3B0aW9ucy5jb3ZlciA/IFwibm9uZVwiIDogXCJpbmxpbmVcIiwgd2lkdGgpO1xuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90bzMuYnVpbGRUcmFuc2xhdGUgPSBmdW5jdGlvbiBidWlsZFRyYW5zbGF0ZShvcHRpb25zKSB7XG4gICAgdmFyIF90aGlzJERpcmVjdGlvbiA9IHRoaXMuRGlyZWN0aW9uLFxuICAgICAgICByZXNvbHZlID0gX3RoaXMkRGlyZWN0aW9uLnJlc29sdmUsXG4gICAgICAgIG9yaWVudCA9IF90aGlzJERpcmVjdGlvbi5vcmllbnQ7XG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgIHZhbHVlcy5wdXNoKHRoaXMuY3NzT2Zmc2V0Q2xvbmVzKG9wdGlvbnMpKTtcbiAgICB2YWx1ZXMucHVzaCh0aGlzLmNzc09mZnNldEdhcHMob3B0aW9ucykpO1xuXG4gICAgaWYgKHRoaXMuaXNDZW50ZXIob3B0aW9ucykpIHtcbiAgICAgIHZhbHVlcy5wdXNoKHRoaXMuYnVpbGRDc3NWYWx1ZShvcmllbnQoLTUwKSwgXCIlXCIpKTtcbiAgICAgIHZhbHVlcy5wdXNoLmFwcGx5KHZhbHVlcywgdGhpcy5jc3NPZmZzZXRDZW50ZXIob3B0aW9ucykpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXMuZmlsdGVyKEJvb2xlYW4pLm1hcChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBcInRyYW5zbGF0ZVwiICsgcmVzb2x2ZShcIlhcIikgKyBcIihcIiArIHZhbHVlICsgXCIpXCI7XG4gICAgfSkuam9pbihcIiBcIik7XG4gIH07XG5cbiAgX3Byb3RvMy5jc3NPZmZzZXRDbG9uZXMgPSBmdW5jdGlvbiBjc3NPZmZzZXRDbG9uZXMob3B0aW9ucykge1xuICAgIHZhciBfdGhpcyREaXJlY3Rpb24yID0gdGhpcy5EaXJlY3Rpb24sXG4gICAgICAgIHJlc29sdmUgPSBfdGhpcyREaXJlY3Rpb24yLnJlc29sdmUsXG4gICAgICAgIG9yaWVudCA9IF90aGlzJERpcmVjdGlvbjIub3JpZW50O1xuICAgIHZhciBjbG9uZUNvdW50ID0gdGhpcy5nZXRDbG9uZUNvdW50KCk7XG5cbiAgICBpZiAodGhpcy5pc0ZpeGVkV2lkdGgob3B0aW9ucykpIHtcbiAgICAgIHZhciBfdGhpcyRwYXJzZUNzc1ZhbHVlID0gdGhpcy5wYXJzZUNzc1ZhbHVlKG9wdGlvbnNbcmVzb2x2ZShcImZpeGVkV2lkdGhcIildKSxcbiAgICAgICAgICB2YWx1ZSA9IF90aGlzJHBhcnNlQ3NzVmFsdWUudmFsdWUsXG4gICAgICAgICAgdW5pdDIgPSBfdGhpcyRwYXJzZUNzc1ZhbHVlLnVuaXQ7XG5cbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkQ3NzVmFsdWUob3JpZW50KHZhbHVlKSAqIGNsb25lQ291bnQsIHVuaXQyKTtcbiAgICB9XG5cbiAgICB2YXIgcGVyY2VudCA9IDEwMCAqIGNsb25lQ291bnQgLyBvcHRpb25zLnBlclBhZ2U7XG4gICAgcmV0dXJuIG9yaWVudChwZXJjZW50KSArIFwiJVwiO1xuICB9O1xuXG4gIF9wcm90bzMuY3NzT2Zmc2V0Q2VudGVyID0gZnVuY3Rpb24gY3NzT2Zmc2V0Q2VudGVyKG9wdGlvbnMpIHtcbiAgICB2YXIgX3RoaXMkRGlyZWN0aW9uMyA9IHRoaXMuRGlyZWN0aW9uLFxuICAgICAgICByZXNvbHZlID0gX3RoaXMkRGlyZWN0aW9uMy5yZXNvbHZlLFxuICAgICAgICBvcmllbnQgPSBfdGhpcyREaXJlY3Rpb24zLm9yaWVudDtcblxuICAgIGlmICh0aGlzLmlzRml4ZWRXaWR0aChvcHRpb25zKSkge1xuICAgICAgdmFyIF90aGlzJHBhcnNlQ3NzVmFsdWUyID0gdGhpcy5wYXJzZUNzc1ZhbHVlKG9wdGlvbnNbcmVzb2x2ZShcImZpeGVkV2lkdGhcIildKSxcbiAgICAgICAgICB2YWx1ZSA9IF90aGlzJHBhcnNlQ3NzVmFsdWUyLnZhbHVlLFxuICAgICAgICAgIHVuaXQyID0gX3RoaXMkcGFyc2VDc3NWYWx1ZTIudW5pdDtcblxuICAgICAgcmV0dXJuIFt0aGlzLmJ1aWxkQ3NzVmFsdWUob3JpZW50KHZhbHVlIC8gMiksIHVuaXQyKV07XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgIHZhciBwZXJQYWdlID0gb3B0aW9ucy5wZXJQYWdlLFxuICAgICAgICBnYXAgPSBvcHRpb25zLmdhcDtcbiAgICB2YWx1ZXMucHVzaChvcmllbnQoNTAgLyBwZXJQYWdlKSArIFwiJVwiKTtcblxuICAgIGlmIChnYXApIHtcbiAgICAgIHZhciBfdGhpcyRwYXJzZUNzc1ZhbHVlMyA9IHRoaXMucGFyc2VDc3NWYWx1ZShnYXApLFxuICAgICAgICAgIF92YWx1ZSA9IF90aGlzJHBhcnNlQ3NzVmFsdWUzLnZhbHVlLFxuICAgICAgICAgIF91bml0ID0gX3RoaXMkcGFyc2VDc3NWYWx1ZTMudW5pdDtcblxuICAgICAgdmFyIGdhcE9mZnNldCA9IChfdmFsdWUgLyBwZXJQYWdlIC0gX3ZhbHVlKSAvIDI7XG4gICAgICB2YWx1ZXMucHVzaCh0aGlzLmJ1aWxkQ3NzVmFsdWUob3JpZW50KGdhcE9mZnNldCksIF91bml0KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfTtcblxuICBfcHJvdG8zLmNzc09mZnNldEdhcHMgPSBmdW5jdGlvbiBjc3NPZmZzZXRHYXBzKG9wdGlvbnMpIHtcbiAgICB2YXIgY2xvbmVDb3VudCA9IHRoaXMuZ2V0Q2xvbmVDb3VudCgpO1xuXG4gICAgaWYgKGNsb25lQ291bnQgJiYgb3B0aW9ucy5nYXApIHtcbiAgICAgIHZhciBvcmllbnQgPSB0aGlzLkRpcmVjdGlvbi5vcmllbnQ7XG5cbiAgICAgIHZhciBfdGhpcyRwYXJzZUNzc1ZhbHVlNCA9IHRoaXMucGFyc2VDc3NWYWx1ZShvcHRpb25zLmdhcCksXG4gICAgICAgICAgdmFsdWUgPSBfdGhpcyRwYXJzZUNzc1ZhbHVlNC52YWx1ZSxcbiAgICAgICAgICB1bml0MiA9IF90aGlzJHBhcnNlQ3NzVmFsdWU0LnVuaXQ7XG5cbiAgICAgIGlmICh0aGlzLmlzRml4ZWRXaWR0aChvcHRpb25zKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZENzc1ZhbHVlKG9yaWVudCh2YWx1ZSAqIGNsb25lQ291bnQpLCB1bml0Mik7XG4gICAgICB9XG5cbiAgICAgIHZhciBwZXJQYWdlID0gb3B0aW9ucy5wZXJQYWdlO1xuICAgICAgdmFyIGdhcHMgPSBjbG9uZUNvdW50IC8gcGVyUGFnZTtcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkQ3NzVmFsdWUob3JpZW50KGdhcHMgKiB2YWx1ZSksIHVuaXQyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gXCJcIjtcbiAgfTtcblxuICBfcHJvdG8zLnJlc29sdmUgPSBmdW5jdGlvbiByZXNvbHZlKHByb3ApIHtcbiAgICByZXR1cm4gY2FtZWxUb0tlYmFiKHRoaXMuRGlyZWN0aW9uLnJlc29sdmUocHJvcCkpO1xuICB9O1xuXG4gIF9wcm90bzMuY3NzUGFkZGluZyA9IGZ1bmN0aW9uIGNzc1BhZGRpbmcob3B0aW9ucywgcmlnaHQpIHtcbiAgICB2YXIgcGFkZGluZyA9IG9wdGlvbnMucGFkZGluZztcbiAgICB2YXIgcHJvcCA9IHRoaXMuRGlyZWN0aW9uLnJlc29sdmUocmlnaHQgPyBcInJpZ2h0XCIgOiBcImxlZnRcIiwgdHJ1ZSk7XG4gICAgcmV0dXJuIHBhZGRpbmcgJiYgdW5pdChwYWRkaW5nW3Byb3BdIHx8IChpc09iamVjdChwYWRkaW5nKSA/IDAgOiBwYWRkaW5nKSkgfHwgXCIwcHhcIjtcbiAgfTtcblxuICBfcHJvdG8zLmNzc1RyYWNrSGVpZ2h0ID0gZnVuY3Rpb24gY3NzVHJhY2tIZWlnaHQob3B0aW9ucykge1xuICAgIHZhciBoZWlnaHQgPSBcIlwiO1xuXG4gICAgaWYgKHRoaXMuaXNWZXJ0aWNhbCgpKSB7XG4gICAgICBoZWlnaHQgPSB0aGlzLmNzc0hlaWdodChvcHRpb25zKTtcbiAgICAgIGFzc2VydChoZWlnaHQsICdcImhlaWdodFwiIGlzIG1pc3NpbmcuJyk7XG4gICAgICBoZWlnaHQgPSBcImNhbGMoXCIgKyBoZWlnaHQgKyBcIiAtIFwiICsgdGhpcy5jc3NQYWRkaW5nKG9wdGlvbnMsIGZhbHNlKSArIFwiIC0gXCIgKyB0aGlzLmNzc1BhZGRpbmcob3B0aW9ucywgdHJ1ZSkgKyBcIilcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gaGVpZ2h0O1xuICB9O1xuXG4gIF9wcm90bzMuY3NzSGVpZ2h0ID0gZnVuY3Rpb24gY3NzSGVpZ2h0KG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdW5pdChvcHRpb25zLmhlaWdodCk7XG4gIH07XG5cbiAgX3Byb3RvMy5jc3NTbGlkZVdpZHRoID0gZnVuY3Rpb24gY3NzU2xpZGVXaWR0aChvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuYXV0b1dpZHRoID8gXCJcIiA6IHVuaXQob3B0aW9ucy5maXhlZFdpZHRoKSB8fCAodGhpcy5pc1ZlcnRpY2FsKCkgPyBcIlwiIDogdGhpcy5jc3NTbGlkZVNpemUob3B0aW9ucykpO1xuICB9O1xuXG4gIF9wcm90bzMuY3NzU2xpZGVIZWlnaHQgPSBmdW5jdGlvbiBjc3NTbGlkZUhlaWdodChvcHRpb25zKSB7XG4gICAgcmV0dXJuIHVuaXQob3B0aW9ucy5maXhlZEhlaWdodCkgfHwgKHRoaXMuaXNWZXJ0aWNhbCgpID8gb3B0aW9ucy5hdXRvSGVpZ2h0ID8gXCJcIiA6IHRoaXMuY3NzU2xpZGVTaXplKG9wdGlvbnMpIDogdGhpcy5jc3NIZWlnaHQob3B0aW9ucykpO1xuICB9O1xuXG4gIF9wcm90bzMuY3NzU2xpZGVTaXplID0gZnVuY3Rpb24gY3NzU2xpZGVTaXplKG9wdGlvbnMpIHtcbiAgICB2YXIgZ2FwID0gdW5pdChvcHRpb25zLmdhcCk7XG4gICAgcmV0dXJuIFwiY2FsYygoMTAwJVwiICsgKGdhcCAmJiBcIiArIFwiICsgZ2FwKSArIFwiKS9cIiArIChvcHRpb25zLnBlclBhZ2UgfHwgMSkgKyAoZ2FwICYmIFwiIC0gXCIgKyBnYXApICsgXCIpXCI7XG4gIH07XG5cbiAgX3Byb3RvMy5jc3NBc3BlY3RSYXRpbyA9IGZ1bmN0aW9uIGNzc0FzcGVjdFJhdGlvKG9wdGlvbnMpIHtcbiAgICB2YXIgaGVpZ2h0UmF0aW8gPSBvcHRpb25zLmhlaWdodFJhdGlvO1xuICAgIHJldHVybiBoZWlnaHRSYXRpbyA/IFwiXCIgKyAxIC8gaGVpZ2h0UmF0aW8gOiBcIlwiO1xuICB9O1xuXG4gIF9wcm90bzMuYnVpbGRDc3NWYWx1ZSA9IGZ1bmN0aW9uIGJ1aWxkQ3NzVmFsdWUodmFsdWUsIHVuaXQyKSB7XG4gICAgcmV0dXJuIFwiXCIgKyB2YWx1ZSArIHVuaXQyO1xuICB9O1xuXG4gIF9wcm90bzMucGFyc2VDc3NWYWx1ZSA9IGZ1bmN0aW9uIHBhcnNlQ3NzVmFsdWUodmFsdWUpIHtcbiAgICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICB2YXIgbnVtYmVyID0gcGFyc2VGbG9hdCh2YWx1ZSkgfHwgMDtcbiAgICAgIHZhciB1bml0MiA9IHZhbHVlLnJlcGxhY2UoL1xcZCooXFwuXFxkKik/LywgXCJcIikgfHwgXCJweFwiO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IG51bWJlcixcbiAgICAgICAgdW5pdDogdW5pdDJcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIHVuaXQ6IFwicHhcIlxuICAgIH07XG4gIH07XG5cbiAgX3Byb3RvMy5wYXJzZUJyZWFrcG9pbnRzID0gZnVuY3Rpb24gcGFyc2VCcmVha3BvaW50cygpIHtcbiAgICB2YXIgX3RoaXM5ID0gdGhpcztcblxuICAgIHZhciBicmVha3BvaW50cyA9IHRoaXMub3B0aW9ucy5icmVha3BvaW50cztcbiAgICB0aGlzLmJyZWFrcG9pbnRzLnB1c2goW1wiZGVmYXVsdFwiLCB0aGlzLm9wdGlvbnNdKTtcblxuICAgIGlmIChicmVha3BvaW50cykge1xuICAgICAgZm9yT3duKGJyZWFrcG9pbnRzLCBmdW5jdGlvbiAob3B0aW9ucywgd2lkdGgpIHtcbiAgICAgICAgX3RoaXM5LmJyZWFrcG9pbnRzLnB1c2goW3dpZHRoLCBtZXJnZShtZXJnZSh7fSwgX3RoaXM5Lm9wdGlvbnMpLCBvcHRpb25zKV0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90bzMuaXNGaXhlZFdpZHRoID0gZnVuY3Rpb24gaXNGaXhlZFdpZHRoKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gISFvcHRpb25zW3RoaXMuRGlyZWN0aW9uLnJlc29sdmUoXCJmaXhlZFdpZHRoXCIpXTtcbiAgfTtcblxuICBfcHJvdG8zLmlzTG9vcCA9IGZ1bmN0aW9uIGlzTG9vcCgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnR5cGUgPT09IExPT1A7XG4gIH07XG5cbiAgX3Byb3RvMy5pc0NlbnRlciA9IGZ1bmN0aW9uIGlzQ2VudGVyKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5mb2N1cyA9PT0gXCJjZW50ZXJcIikge1xuICAgICAgaWYgKHRoaXMuaXNMb29wKCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMudHlwZSA9PT0gU0xJREUpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLm9wdGlvbnMudHJpbVNwYWNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBfcHJvdG8zLmlzVmVydGljYWwgPSBmdW5jdGlvbiBpc1ZlcnRpY2FsKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZGlyZWN0aW9uID09PSBUVEI7XG4gIH07XG5cbiAgX3Byb3RvMy5idWlsZENsYXNzZXMgPSBmdW5jdGlvbiBidWlsZENsYXNzZXMoKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgcmV0dXJuIFtDTEFTU19ST09ULCBDTEFTU19ST09UICsgXCItLVwiICsgb3B0aW9ucy50eXBlLCBDTEFTU19ST09UICsgXCItLVwiICsgb3B0aW9ucy5kaXJlY3Rpb24sIG9wdGlvbnMuZHJhZyAmJiBDTEFTU19ST09UICsgXCItLWRyYWdnYWJsZVwiLCBvcHRpb25zLmlzTmF2aWdhdGlvbiAmJiBDTEFTU19ST09UICsgXCItLW5hdlwiLCBDTEFTU19BQ1RJVkUsICF0aGlzLmNvbmZpZy5oaWRkZW4gJiYgQ0xBU1NfUkVOREVSRURdLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIFwiKTtcbiAgfTtcblxuICBfcHJvdG8zLmJ1aWxkQXR0cnMgPSBmdW5jdGlvbiBidWlsZEF0dHJzKGF0dHJzKSB7XG4gICAgdmFyIGF0dHIgPSBcIlwiO1xuICAgIGZvck93bihhdHRycywgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIGF0dHIgKz0gdmFsdWUgPyBcIiBcIiArIGNhbWVsVG9LZWJhYihrZXkpICsgXCI9XFxcIlwiICsgdmFsdWUgKyBcIlxcXCJcIiA6IFwiXCI7XG4gICAgfSk7XG4gICAgcmV0dXJuIGF0dHIudHJpbSgpO1xuICB9O1xuXG4gIF9wcm90bzMuYnVpbGRTdHlsZXMgPSBmdW5jdGlvbiBidWlsZFN0eWxlcyhzdHlsZXMpIHtcbiAgICB2YXIgc3R5bGUgPSBcIlwiO1xuICAgIGZvck93bihzdHlsZXMsIGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICBzdHlsZSArPSBcIiBcIiArIGNhbWVsVG9LZWJhYihrZXkpICsgXCI6XCIgKyB2YWx1ZSArIFwiO1wiO1xuICAgIH0pO1xuICAgIHJldHVybiBzdHlsZS50cmltKCk7XG4gIH07XG5cbiAgX3Byb3RvMy5yZW5kZXJTbGlkZXMgPSBmdW5jdGlvbiByZW5kZXJTbGlkZXMoKSB7XG4gICAgdmFyIF90aGlzMTAgPSB0aGlzO1xuXG4gICAgdmFyIHRhZyA9IHRoaXMuY29uZmlnLnNsaWRlVGFnO1xuICAgIHJldHVybiB0aGlzLnNsaWRlcy5tYXAoZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgICAgIHJldHVybiBcIjxcIiArIHRhZyArIFwiIFwiICsgX3RoaXMxMC5idWlsZEF0dHJzKGNvbnRlbnQuYXR0cnMpICsgXCI+XCIgKyAoY29udGVudC5odG1sIHx8IFwiXCIpICsgXCI8L1wiICsgdGFnICsgXCI+XCI7XG4gICAgfSkuam9pbihcIlwiKTtcbiAgfTtcblxuICBfcHJvdG8zLmNvdmVyID0gZnVuY3Rpb24gY292ZXIoY29udGVudCkge1xuICAgIHZhciBzdHlsZXMgPSBjb250ZW50LnN0eWxlcyxcbiAgICAgICAgX2NvbnRlbnQkaHRtbCA9IGNvbnRlbnQuaHRtbCxcbiAgICAgICAgaHRtbCA9IF9jb250ZW50JGh0bWwgPT09IHZvaWQgMCA/IFwiXCIgOiBfY29udGVudCRodG1sO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jb3ZlciAmJiAhdGhpcy5vcHRpb25zLmxhenlMb2FkKSB7XG4gICAgICB2YXIgc3JjID0gaHRtbC5tYXRjaCgvPGltZy4qP3NyY1xccyo9XFxzKihbJ1wiXSkoLis/KVxcMS4qPz4vKTtcblxuICAgICAgaWYgKHNyYyAmJiBzcmNbMl0pIHtcbiAgICAgICAgc3R5bGVzLmJhY2tncm91bmQgPSBcImNlbnRlci9jb3ZlciBuby1yZXBlYXQgdXJsKCdcIiArIHNyY1syXSArIFwiJylcIjtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvMy5nZW5lcmF0ZUNsb25lcyA9IGZ1bmN0aW9uIGdlbmVyYXRlQ2xvbmVzKGNvbnRlbnRzKSB7XG4gICAgdmFyIGNsYXNzZXMgPSB0aGlzLm9wdGlvbnMuY2xhc3NlcztcbiAgICB2YXIgY291bnQgPSB0aGlzLmdldENsb25lQ291bnQoKTtcbiAgICB2YXIgc2xpZGVzID0gY29udGVudHMuc2xpY2UoKTtcblxuICAgIHdoaWxlIChzbGlkZXMubGVuZ3RoIDwgY291bnQpIHtcbiAgICAgIHB1c2goc2xpZGVzLCBzbGlkZXMpO1xuICAgIH1cblxuICAgIHB1c2goc2xpZGVzLnNsaWNlKC1jb3VudCkucmV2ZXJzZSgpLCBzbGlkZXMuc2xpY2UoMCwgY291bnQpKS5mb3JFYWNoKGZ1bmN0aW9uIChjb250ZW50LCBpbmRleCkge1xuICAgICAgdmFyIGF0dHJzID0gYXNzaWduKHt9LCBjb250ZW50LmF0dHJzLCB7XG4gICAgICAgIGNsYXNzOiBjb250ZW50LmF0dHJzLmNsYXNzICsgXCIgXCIgKyBjbGFzc2VzLmNsb25lXG4gICAgICB9KTtcbiAgICAgIHZhciBjbG9uZSA9IGFzc2lnbih7fSwgY29udGVudCwge1xuICAgICAgICBhdHRyczogYXR0cnNcbiAgICAgIH0pO1xuICAgICAgaW5kZXggPCBjb3VudCA/IGNvbnRlbnRzLnVuc2hpZnQoY2xvbmUpIDogY29udGVudHMucHVzaChjbG9uZSk7XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvMy5nZXRDbG9uZUNvdW50ID0gZnVuY3Rpb24gZ2V0Q2xvbmVDb3VudCgpIHtcbiAgICBpZiAodGhpcy5pc0xvb3AoKSkge1xuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAgIGlmIChvcHRpb25zLmNsb25lcykge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5jbG9uZXM7XG4gICAgICB9XG5cbiAgICAgIHZhciBwZXJQYWdlID0gbWF4LmFwcGx5KHZvaWQgMCwgdGhpcy5icmVha3BvaW50cy5tYXAoZnVuY3Rpb24gKF9yZWY2KSB7XG4gICAgICAgIHZhciBvcHRpb25zMiA9IF9yZWY2WzFdO1xuICAgICAgICByZXR1cm4gb3B0aW9uczIucGVyUGFnZTtcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybiBwZXJQYWdlICogKChvcHRpb25zLmZsaWNrTWF4UGFnZXMgfHwgMSkgKyAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfTtcblxuICBfcHJvdG8zLnJlbmRlckFycm93cyA9IGZ1bmN0aW9uIHJlbmRlckFycm93cygpIHtcbiAgICB2YXIgaHRtbCA9IFwiXCI7XG4gICAgaHRtbCArPSBcIjxkaXYgY2xhc3M9XFxcIlwiICsgdGhpcy5vcHRpb25zLmNsYXNzZXMuYXJyb3dzICsgXCJcXFwiPlwiO1xuICAgIGh0bWwgKz0gdGhpcy5yZW5kZXJBcnJvdyh0cnVlKTtcbiAgICBodG1sICs9IHRoaXMucmVuZGVyQXJyb3coZmFsc2UpO1xuICAgIGh0bWwgKz0gXCI8L2Rpdj5cIjtcbiAgICByZXR1cm4gaHRtbDtcbiAgfTtcblxuICBfcHJvdG8zLnJlbmRlckFycm93ID0gZnVuY3Rpb24gcmVuZGVyQXJyb3cocHJldikge1xuICAgIHZhciBfdGhpcyRvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICBjbGFzc2VzID0gX3RoaXMkb3B0aW9ucy5jbGFzc2VzLFxuICAgICAgICBpMThuID0gX3RoaXMkb3B0aW9ucy5pMThuO1xuICAgIHZhciBhdHRycyA9IHtcbiAgICAgIGNsYXNzOiBjbGFzc2VzLmFycm93ICsgXCIgXCIgKyAocHJldiA/IGNsYXNzZXMucHJldiA6IGNsYXNzZXMubmV4dCksXG4gICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgYXJpYUxhYmVsOiBwcmV2ID8gaTE4bi5wcmV2IDogaTE4bi5uZXh0XG4gICAgfTtcbiAgICByZXR1cm4gXCI8YnV0dG9uIFwiICsgdGhpcy5idWlsZEF0dHJzKGF0dHJzKSArIFwiPjxzdmcgeG1sbnM9XFxcIlwiICsgWE1MX05BTUVfU1BBQ0UgKyBcIlxcXCIgdmlld0JveD1cXFwiMCAwIFwiICsgU0laRSArIFwiIFwiICsgU0laRSArIFwiXFxcIiB3aWR0aD1cXFwiXCIgKyBTSVpFICsgXCJcXFwiIGhlaWdodD1cXFwiXCIgKyBTSVpFICsgXCJcXFwiPjxwYXRoIGQ9XFxcIlwiICsgKHRoaXMub3B0aW9ucy5hcnJvd1BhdGggfHwgUEFUSCkgKyBcIlxcXCIgLz48L3N2Zz48L2J1dHRvbj5cIjtcbiAgfTtcblxuICBfcHJvdG8zLmh0bWwgPSBmdW5jdGlvbiBodG1sKCkge1xuICAgIHZhciBfdGhpcyRjb25maWcgPSB0aGlzLmNvbmZpZyxcbiAgICAgICAgcm9vdENsYXNzID0gX3RoaXMkY29uZmlnLnJvb3RDbGFzcyxcbiAgICAgICAgbGlzdFRhZyA9IF90aGlzJGNvbmZpZy5saXN0VGFnLFxuICAgICAgICBhcnJvd3MgPSBfdGhpcyRjb25maWcuYXJyb3dzLFxuICAgICAgICBiZWZvcmVUcmFjayA9IF90aGlzJGNvbmZpZy5iZWZvcmVUcmFjayxcbiAgICAgICAgYWZ0ZXJUcmFjayA9IF90aGlzJGNvbmZpZy5hZnRlclRyYWNrLFxuICAgICAgICBzbGlkZXIgPSBfdGhpcyRjb25maWcuc2xpZGVyLFxuICAgICAgICBiZWZvcmVTbGlkZXIgPSBfdGhpcyRjb25maWcuYmVmb3JlU2xpZGVyLFxuICAgICAgICBhZnRlclNsaWRlciA9IF90aGlzJGNvbmZpZy5hZnRlclNsaWRlcjtcbiAgICB2YXIgaHRtbCA9IFwiXCI7XG4gICAgaHRtbCArPSBcIjxkaXYgaWQ9XFxcIlwiICsgdGhpcy5pZCArIFwiXFxcIiBjbGFzcz1cXFwiXCIgKyB0aGlzLmJ1aWxkQ2xhc3NlcygpICsgXCIgXCIgKyAocm9vdENsYXNzIHx8IFwiXCIpICsgXCJcXFwiPlwiO1xuICAgIGh0bWwgKz0gXCI8c3R5bGU+XCIgKyB0aGlzLlN0eWxlLmJ1aWxkKCkgKyBcIjwvc3R5bGU+XCI7XG5cbiAgICBpZiAoc2xpZGVyKSB7XG4gICAgICBodG1sICs9IGJlZm9yZVNsaWRlciB8fCBcIlwiO1xuICAgICAgaHRtbCArPSBcIjxkaXYgY2xhc3M9XFxcInNwbGlkZV9fc2xpZGVyXFxcIj5cIjtcbiAgICB9XG5cbiAgICBodG1sICs9IGJlZm9yZVRyYWNrIHx8IFwiXCI7XG5cbiAgICBpZiAoYXJyb3dzKSB7XG4gICAgICBodG1sICs9IHRoaXMucmVuZGVyQXJyb3dzKCk7XG4gICAgfVxuXG4gICAgaHRtbCArPSBcIjxkaXYgY2xhc3M9XFxcInNwbGlkZV9fdHJhY2tcXFwiPlwiO1xuICAgIGh0bWwgKz0gXCI8XCIgKyBsaXN0VGFnICsgXCIgY2xhc3M9XFxcInNwbGlkZV9fbGlzdFxcXCI+XCI7XG4gICAgaHRtbCArPSB0aGlzLnJlbmRlclNsaWRlcygpO1xuICAgIGh0bWwgKz0gXCI8L1wiICsgbGlzdFRhZyArIFwiPlwiO1xuICAgIGh0bWwgKz0gXCI8L2Rpdj5cIjtcbiAgICBodG1sICs9IGFmdGVyVHJhY2sgfHwgXCJcIjtcblxuICAgIGlmIChzbGlkZXIpIHtcbiAgICAgIGh0bWwgKz0gXCI8L2Rpdj5cIjtcbiAgICAgIGh0bWwgKz0gYWZ0ZXJTbGlkZXIgfHwgXCJcIjtcbiAgICB9XG5cbiAgICBodG1sICs9IFwiPC9kaXY+XCI7XG4gICAgcmV0dXJuIGh0bWw7XG4gIH07XG5cbiAgcmV0dXJuIFNwbGlkZVJlbmRlcmVyO1xufSgpO1xuXG5leHBvcnQgeyBDTEFTU0VTLCBDTEFTU19BQ1RJVkUsIENMQVNTX0FSUk9XLCBDTEFTU19BUlJPV1MsIENMQVNTX0FSUk9XX05FWFQsIENMQVNTX0FSUk9XX1BSRVYsIENMQVNTX0NMT05FLCBDTEFTU19DT05UQUlORVIsIENMQVNTX0ZPQ1VTX0lOLCBDTEFTU19JTklUSUFMSVpFRCwgQ0xBU1NfTElTVCwgQ0xBU1NfTE9BRElORywgQ0xBU1NfTkVYVCwgQ0xBU1NfT1ZFUkZMT1csIENMQVNTX1BBR0lOQVRJT04sIENMQVNTX1BBR0lOQVRJT05fUEFHRSwgQ0xBU1NfUFJFViwgQ0xBU1NfUFJPR1JFU1MsIENMQVNTX1BST0dSRVNTX0JBUiwgQ0xBU1NfUk9PVCwgQ0xBU1NfU0xJREUsIENMQVNTX1NQSU5ORVIsIENMQVNTX1NSLCBDTEFTU19UT0dHTEUsIENMQVNTX1RPR0dMRV9QQVVTRSwgQ0xBU1NfVE9HR0xFX1BMQVksIENMQVNTX1RSQUNLLCBDTEFTU19WSVNJQkxFLCBERUZBVUxUUywgRVZFTlRfQUNUSVZFLCBFVkVOVF9BUlJPV1NfTU9VTlRFRCwgRVZFTlRfQVJST1dTX1VQREFURUQsIEVWRU5UX0FVVE9QTEFZX1BBVVNFLCBFVkVOVF9BVVRPUExBWV9QTEFZLCBFVkVOVF9BVVRPUExBWV9QTEFZSU5HLCBFVkVOVF9DTElDSywgRVZFTlRfREVTVFJPWSwgRVZFTlRfRFJBRywgRVZFTlRfRFJBR0dFRCwgRVZFTlRfRFJBR0dJTkcsIEVWRU5UX0VORF9JTkRFWF9DSEFOR0VELCBFVkVOVF9ISURERU4sIEVWRU5UX0lOQUNUSVZFLCBFVkVOVF9MQVpZTE9BRF9MT0FERUQsIEVWRU5UX01PVU5URUQsIEVWRU5UX01PVkUsIEVWRU5UX01PVkVELCBFVkVOVF9OQVZJR0FUSU9OX01PVU5URUQsIEVWRU5UX09WRVJGTE9XLCBFVkVOVF9QQUdJTkFUSU9OX01PVU5URUQsIEVWRU5UX1BBR0lOQVRJT05fVVBEQVRFRCwgRVZFTlRfUkVBRFksIEVWRU5UX1JFRlJFU0gsIEVWRU5UX1JFU0laRSwgRVZFTlRfUkVTSVpFRCwgRVZFTlRfU0NST0xMLCBFVkVOVF9TQ1JPTExFRCwgRVZFTlRfU0hJRlRFRCwgRVZFTlRfU0xJREVfS0VZRE9XTiwgRVZFTlRfVVBEQVRFRCwgRVZFTlRfVklTSUJMRSwgRXZlbnRCaW5kZXIsIEV2ZW50SW50ZXJmYWNlLCBGQURFLCBMT09QLCBMVFIsIFJUTCwgUmVxdWVzdEludGVydmFsLCBTTElERSwgU1RBVFVTX0NMQVNTRVMsIFNwbGlkZSwgU3BsaWRlUmVuZGVyZXIsIFN0YXRlLCBUVEIsIFRocm90dGxlLCBTcGxpZGUgYXMgZGVmYXVsdCB9O1xuIiwiLy8gaW1wb3J0ICdib290c3RyYXAnOyAvLyBvaG5lIFBmYWRhbmdhYmUgKE1vZHVsIGF1c2xlc2VuIGF1cyBub2RlX21vZHVsZXMpIGZ1bmt0aW9uaWVydCBudXIgbWl0IEpTLUJ1bmRsZXIgKGVzYnVpbGQsIHJvbGx1cCAmIGNvLilcblxuaW1wb3J0IFByb2R1Y3RNYW5hZ2VyIGZyb20gJy4vbW9kdWxlcy9Qcm9kdWN0TWFuYWdlcic7IC8vIERhdGVpZW5kdW5nIGthbm4gd2VnZ2VsYXNzZW4gd2VyZGVuLCB3ZW5uIGVpbiBCdW5kbGVyIGVpbmdlc2V0enQgd2lyZCAoZXNidWlsZCwgd2VicGFjaywgcm9sbHVwLCBldGMuKVxuaW1wb3J0IFNwbGlkZSBmcm9tICdAc3BsaWRlanMvc3BsaWRlJztcblxuKCgpID0+IHtcbiAgLy8gPT09IERPTSAmIFZBUlMgPT09PT09PVxuICBjb25zdCBET00gPSB7fTtcblxuICAvLyA9PT0gSU5JVCA9PT09PT09PT09PT09XG4gIGNvbnN0IGluaXQgPSAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coJ2luaXQhIScpO1xuICAgIHJvdXRlcigpO1xuICB9O1xuXG4gIC8vID09PSBFVkVOVEhBTkRMRVIgPT09PT1cblxuICAvLyA9PT0gWEhSL0ZFVENIID09PT09PT09XG5cbiAgLy8gPT09IEZVTkNUSU9OUyA9PT09PT09PVxuICBjb25zdCByb3V0ZXIgPSAoKSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTtcblxuICAgIGNvbnNvbGUubG9nKHBhdGgpO1xuXG4gICAgc3dpdGNoIChwYXRoKSB7XG4gICAgICBjYXNlICcvJzpcbiAgICAgIGNhc2UgJy9pbmRleC5odG1sJzpcbiAgICAgICAgY29uc29sZS5sb2coJ0hPTUUnKTtcbiAgICAgICAgY29uc3Qgc3BsaWRlciA9IG5ldyBTcGxpZGUoJy5zcGxpZGUnLCB7XG4gICAgICAgICAgdHlwZTogJ2xvb3AnLFxuICAgICAgICAgIGZpeGVkSGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgYXV0b0hlaWdodDogdHJ1ZSxcbiAgICAgICAgfSkubW91bnQoKTtcblxuICAgICAgICAvLyBudXIgU2tyaXB0ZSwgZGllIGbDvHIgSG9tZSByZWxldmFudCBhdXNmw7xocmVuXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnL3Byb2plY3RzL3Byb2R1Y3QtbWFuYWdlci5odG1sJzpcbiAgICAgICAgY29uc29sZS5sb2coJ1BST0RVQ1RfTUFOQUdFUicpO1xuICAgICAgICBjb25zdCBwbSA9IFByb2R1Y3RNYW5hZ2VyKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc29sZS53YXJuKCdQYWdlIG5vdCBmb3VuZCcpO1xuICAgIH1cbiAgfTtcblxuICBpbml0KCk7XG59KSgpO1xuIl0sIm5hbWVzIjpbInRvcCIsImJvdHRvbSIsInJpZ2h0IiwibGVmdCIsImF1dG8iLCJiYXNlUGxhY2VtZW50cyIsInN0YXJ0IiwiZW5kIiwiY2xpcHBpbmdQYXJlbnRzIiwidmlld3BvcnQiLCJwb3BwZXIiLCJyZWZlcmVuY2UiLCJ2YXJpYXRpb25QbGFjZW1lbnRzIiwicmVkdWNlIiwiYWNjIiwicGxhY2VtZW50IiwiY29uY2F0IiwicGxhY2VtZW50cyIsImJlZm9yZVJlYWQiLCJyZWFkIiwiYWZ0ZXJSZWFkIiwiYmVmb3JlTWFpbiIsIm1haW4iLCJhZnRlck1haW4iLCJiZWZvcmVXcml0ZSIsIndyaXRlIiwiYWZ0ZXJXcml0ZSIsIm1vZGlmaWVyUGhhc2VzIiwiZ2V0Tm9kZU5hbWUiLCJlbGVtZW50Iiwibm9kZU5hbWUiLCJ0b0xvd2VyQ2FzZSIsImdldFdpbmRvdyIsIm5vZGUiLCJ3aW5kb3ciLCJ0b1N0cmluZyIsIm93bmVyRG9jdW1lbnQiLCJkZWZhdWx0VmlldyIsImlzRWxlbWVudCIsIk93bkVsZW1lbnQiLCJFbGVtZW50IiwiaXNIVE1MRWxlbWVudCIsIkhUTUxFbGVtZW50IiwiaXNTaGFkb3dSb290IiwiU2hhZG93Um9vdCIsImFwcGx5U3R5bGVzIiwiX3JlZiIsInN0YXRlIiwiT2JqZWN0Iiwia2V5cyIsImVsZW1lbnRzIiwiZm9yRWFjaCIsIm5hbWUiLCJzdHlsZSIsInN0eWxlcyIsImF0dHJpYnV0ZXMiLCJhc3NpZ24iLCJ2YWx1ZSIsInJlbW92ZUF0dHJpYnV0ZSIsInNldEF0dHJpYnV0ZSIsImVmZmVjdCIsIl9yZWYyIiwiaW5pdGlhbFN0eWxlcyIsInBvc2l0aW9uIiwib3B0aW9ucyIsInN0cmF0ZWd5IiwibWFyZ2luIiwiYXJyb3ciLCJzdHlsZVByb3BlcnRpZXMiLCJoYXNPd25Qcm9wZXJ0eSIsInByb3BlcnR5IiwiYXR0cmlidXRlIiwiZW5hYmxlZCIsInBoYXNlIiwiZm4iLCJyZXF1aXJlcyIsImdldEJhc2VQbGFjZW1lbnQiLCJzcGxpdCIsIm1heCIsIk1hdGgiLCJtaW4iLCJyb3VuZCIsImdldFVBU3RyaW5nIiwidWFEYXRhIiwibmF2aWdhdG9yIiwidXNlckFnZW50RGF0YSIsImJyYW5kcyIsIkFycmF5IiwiaXNBcnJheSIsIm1hcCIsIml0ZW0iLCJicmFuZCIsInZlcnNpb24iLCJqb2luIiwidXNlckFnZW50IiwiaXNMYXlvdXRWaWV3cG9ydCIsInRlc3QiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJpbmNsdWRlU2NhbGUiLCJpc0ZpeGVkU3RyYXRlZ3kiLCJjbGllbnRSZWN0Iiwic2NhbGVYIiwic2NhbGVZIiwib2Zmc2V0V2lkdGgiLCJ3aWR0aCIsIm9mZnNldEhlaWdodCIsImhlaWdodCIsInZpc3VhbFZpZXdwb3J0IiwiYWRkVmlzdWFsT2Zmc2V0cyIsIngiLCJvZmZzZXRMZWZ0IiwieSIsIm9mZnNldFRvcCIsImdldExheW91dFJlY3QiLCJhYnMiLCJjb250YWlucyIsInBhcmVudCIsImNoaWxkIiwicm9vdE5vZGUiLCJnZXRSb290Tm9kZSIsIm5leHQiLCJpc1NhbWVOb2RlIiwicGFyZW50Tm9kZSIsImhvc3QiLCJnZXRDb21wdXRlZFN0eWxlIiwiaXNUYWJsZUVsZW1lbnQiLCJpbmRleE9mIiwiZ2V0RG9jdW1lbnRFbGVtZW50IiwiZG9jdW1lbnQiLCJkb2N1bWVudEVsZW1lbnQiLCJnZXRQYXJlbnROb2RlIiwiYXNzaWduZWRTbG90IiwiZ2V0VHJ1ZU9mZnNldFBhcmVudCIsIm9mZnNldFBhcmVudCIsImdldENvbnRhaW5pbmdCbG9jayIsImlzRmlyZWZveCIsImlzSUUiLCJlbGVtZW50Q3NzIiwiY3VycmVudE5vZGUiLCJjc3MiLCJ0cmFuc2Zvcm0iLCJwZXJzcGVjdGl2ZSIsImNvbnRhaW4iLCJ3aWxsQ2hhbmdlIiwiZmlsdGVyIiwiZ2V0T2Zmc2V0UGFyZW50IiwiZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50Iiwid2l0aGluIiwibWF0aE1heCIsIm1hdGhNaW4iLCJ3aXRoaW5NYXhDbGFtcCIsInYiLCJnZXRGcmVzaFNpZGVPYmplY3QiLCJtZXJnZVBhZGRpbmdPYmplY3QiLCJwYWRkaW5nT2JqZWN0IiwiZXhwYW5kVG9IYXNoTWFwIiwiaGFzaE1hcCIsImtleSIsInRvUGFkZGluZ09iamVjdCIsInBhZGRpbmciLCJyZWN0cyIsIl9zdGF0ZSRtb2RpZmllcnNEYXRhJCIsImFycm93RWxlbWVudCIsInBvcHBlck9mZnNldHMiLCJtb2RpZmllcnNEYXRhIiwiYmFzZVBsYWNlbWVudCIsImF4aXMiLCJpc1ZlcnRpY2FsIiwibGVuIiwiYXJyb3dSZWN0IiwibWluUHJvcCIsIm1heFByb3AiLCJlbmREaWZmIiwic3RhcnREaWZmIiwiYXJyb3dPZmZzZXRQYXJlbnQiLCJjbGllbnRTaXplIiwiY2xpZW50SGVpZ2h0IiwiY2xpZW50V2lkdGgiLCJjZW50ZXJUb1JlZmVyZW5jZSIsImNlbnRlciIsIm9mZnNldCIsImF4aXNQcm9wIiwiY2VudGVyT2Zmc2V0IiwiX29wdGlvbnMkZWxlbWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJyZXF1aXJlc0lmRXhpc3RzIiwiZ2V0VmFyaWF0aW9uIiwidW5zZXRTaWRlcyIsInJvdW5kT2Zmc2V0c0J5RFBSIiwid2luIiwiZHByIiwiZGV2aWNlUGl4ZWxSYXRpbyIsIm1hcFRvU3R5bGVzIiwiX09iamVjdCRhc3NpZ24yIiwicG9wcGVyUmVjdCIsInZhcmlhdGlvbiIsIm9mZnNldHMiLCJncHVBY2NlbGVyYXRpb24iLCJhZGFwdGl2ZSIsInJvdW5kT2Zmc2V0cyIsImlzRml4ZWQiLCJfb2Zmc2V0cyR4IiwiX29mZnNldHMkeSIsIl9yZWYzIiwiaGFzWCIsImhhc1kiLCJzaWRlWCIsInNpZGVZIiwiaGVpZ2h0UHJvcCIsIndpZHRoUHJvcCIsIm9mZnNldFkiLCJvZmZzZXRYIiwiY29tbW9uU3R5bGVzIiwiX3JlZjQiLCJfT2JqZWN0JGFzc2lnbiIsImNvbXB1dGVTdHlsZXMiLCJfcmVmNSIsIl9vcHRpb25zJGdwdUFjY2VsZXJhdCIsIl9vcHRpb25zJGFkYXB0aXZlIiwiX29wdGlvbnMkcm91bmRPZmZzZXRzIiwiZGF0YSIsInBhc3NpdmUiLCJpbnN0YW5jZSIsIl9vcHRpb25zJHNjcm9sbCIsInNjcm9sbCIsIl9vcHRpb25zJHJlc2l6ZSIsInJlc2l6ZSIsInNjcm9sbFBhcmVudHMiLCJzY3JvbGxQYXJlbnQiLCJhZGRFdmVudExpc3RlbmVyIiwidXBkYXRlIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImhhc2giLCJnZXRPcHBvc2l0ZVBsYWNlbWVudCIsInJlcGxhY2UiLCJtYXRjaGVkIiwiZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQiLCJnZXRXaW5kb3dTY3JvbGwiLCJzY3JvbGxMZWZ0IiwicGFnZVhPZmZzZXQiLCJzY3JvbGxUb3AiLCJwYWdlWU9mZnNldCIsImdldFdpbmRvd1Njcm9sbEJhclgiLCJnZXRWaWV3cG9ydFJlY3QiLCJodG1sIiwibGF5b3V0Vmlld3BvcnQiLCJnZXREb2N1bWVudFJlY3QiLCJfZWxlbWVudCRvd25lckRvY3VtZW4iLCJ3aW5TY3JvbGwiLCJib2R5Iiwic2Nyb2xsV2lkdGgiLCJzY3JvbGxIZWlnaHQiLCJkaXJlY3Rpb24iLCJpc1Njcm9sbFBhcmVudCIsIl9nZXRDb21wdXRlZFN0eWxlIiwib3ZlcmZsb3ciLCJvdmVyZmxvd1giLCJvdmVyZmxvd1kiLCJnZXRTY3JvbGxQYXJlbnQiLCJsaXN0U2Nyb2xsUGFyZW50cyIsImxpc3QiLCJpc0JvZHkiLCJ0YXJnZXQiLCJ1cGRhdGVkTGlzdCIsInJlY3RUb0NsaWVudFJlY3QiLCJyZWN0IiwiZ2V0SW5uZXJCb3VuZGluZ0NsaWVudFJlY3QiLCJjbGllbnRUb3AiLCJjbGllbnRMZWZ0IiwiZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUiLCJjbGlwcGluZ1BhcmVudCIsImdldENsaXBwaW5nUGFyZW50cyIsImNhbkVzY2FwZUNsaXBwaW5nIiwiY2xpcHBlckVsZW1lbnQiLCJnZXRDbGlwcGluZ1JlY3QiLCJib3VuZGFyeSIsInJvb3RCb3VuZGFyeSIsIm1haW5DbGlwcGluZ1BhcmVudHMiLCJmaXJzdENsaXBwaW5nUGFyZW50IiwiY2xpcHBpbmdSZWN0IiwiYWNjUmVjdCIsImNvbXB1dGVPZmZzZXRzIiwiY29tbW9uWCIsImNvbW1vblkiLCJtYWluQXhpcyIsImRldGVjdE92ZXJmbG93IiwiX29wdGlvbnMiLCJfb3B0aW9ucyRwbGFjZW1lbnQiLCJfb3B0aW9ucyRzdHJhdGVneSIsIl9vcHRpb25zJGJvdW5kYXJ5IiwiX29wdGlvbnMkcm9vdEJvdW5kYXJ5IiwiX29wdGlvbnMkZWxlbWVudENvbnRlIiwiZWxlbWVudENvbnRleHQiLCJfb3B0aW9ucyRhbHRCb3VuZGFyeSIsImFsdEJvdW5kYXJ5IiwiX29wdGlvbnMkcGFkZGluZyIsImFsdENvbnRleHQiLCJjbGlwcGluZ0NsaWVudFJlY3QiLCJjb250ZXh0RWxlbWVudCIsInJlZmVyZW5jZUNsaWVudFJlY3QiLCJwb3BwZXJDbGllbnRSZWN0IiwiZWxlbWVudENsaWVudFJlY3QiLCJvdmVyZmxvd09mZnNldHMiLCJvZmZzZXREYXRhIiwibXVsdGlwbHkiLCJjb21wdXRlQXV0b1BsYWNlbWVudCIsImZsaXBWYXJpYXRpb25zIiwiX29wdGlvbnMkYWxsb3dlZEF1dG9QIiwiYWxsb3dlZEF1dG9QbGFjZW1lbnRzIiwiYWxsUGxhY2VtZW50cyIsImFsbG93ZWRQbGFjZW1lbnRzIiwibGVuZ3RoIiwib3ZlcmZsb3dzIiwic29ydCIsImEiLCJiIiwiZ2V0RXhwYW5kZWRGYWxsYmFja1BsYWNlbWVudHMiLCJvcHBvc2l0ZVBsYWNlbWVudCIsImZsaXAiLCJfc2tpcCIsIl9vcHRpb25zJG1haW5BeGlzIiwiY2hlY2tNYWluQXhpcyIsIl9vcHRpb25zJGFsdEF4aXMiLCJhbHRBeGlzIiwiY2hlY2tBbHRBeGlzIiwic3BlY2lmaWVkRmFsbGJhY2tQbGFjZW1lbnRzIiwiZmFsbGJhY2tQbGFjZW1lbnRzIiwiX29wdGlvbnMkZmxpcFZhcmlhdGlvIiwicHJlZmVycmVkUGxhY2VtZW50IiwiaXNCYXNlUGxhY2VtZW50IiwicmVmZXJlbmNlUmVjdCIsImNoZWNrc01hcCIsIk1hcCIsIm1ha2VGYWxsYmFja0NoZWNrcyIsImZpcnN0Rml0dGluZ1BsYWNlbWVudCIsImkiLCJfYmFzZVBsYWNlbWVudCIsImlzU3RhcnRWYXJpYXRpb24iLCJtYWluVmFyaWF0aW9uU2lkZSIsImFsdFZhcmlhdGlvblNpZGUiLCJjaGVja3MiLCJwdXNoIiwiZXZlcnkiLCJjaGVjayIsInNldCIsIm51bWJlck9mQ2hlY2tzIiwiX2xvb3AiLCJfaSIsImZpdHRpbmdQbGFjZW1lbnQiLCJmaW5kIiwiZ2V0Iiwic2xpY2UiLCJfcmV0IiwicmVzZXQiLCJnZXRTaWRlT2Zmc2V0cyIsInByZXZlbnRlZE9mZnNldHMiLCJpc0FueVNpZGVGdWxseUNsaXBwZWQiLCJzb21lIiwic2lkZSIsImhpZGUiLCJwcmV2ZW50T3ZlcmZsb3ciLCJyZWZlcmVuY2VPdmVyZmxvdyIsInBvcHBlckFsdE92ZXJmbG93IiwicmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzIiwicG9wcGVyRXNjYXBlT2Zmc2V0cyIsImlzUmVmZXJlbmNlSGlkZGVuIiwiaGFzUG9wcGVyRXNjYXBlZCIsImRpc3RhbmNlQW5kU2tpZGRpbmdUb1hZIiwiaW52ZXJ0RGlzdGFuY2UiLCJza2lkZGluZyIsImRpc3RhbmNlIiwiX29wdGlvbnMkb2Zmc2V0IiwiX2RhdGEkc3RhdGUkcGxhY2VtZW50IiwiZ2V0QWx0QXhpcyIsIl9vcHRpb25zJHRldGhlciIsInRldGhlciIsIl9vcHRpb25zJHRldGhlck9mZnNldCIsInRldGhlck9mZnNldCIsInRldGhlck9mZnNldFZhbHVlIiwibm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlIiwib2Zmc2V0TW9kaWZpZXJTdGF0ZSIsIl9vZmZzZXRNb2RpZmllclN0YXRlJCIsIm1haW5TaWRlIiwiYWx0U2lkZSIsImFkZGl0aXZlIiwibWluTGVuIiwibWF4TGVuIiwiYXJyb3dQYWRkaW5nT2JqZWN0IiwiYXJyb3dQYWRkaW5nTWluIiwiYXJyb3dQYWRkaW5nTWF4IiwiYXJyb3dMZW4iLCJtaW5PZmZzZXQiLCJtYXhPZmZzZXQiLCJjbGllbnRPZmZzZXQiLCJvZmZzZXRNb2RpZmllclZhbHVlIiwidGV0aGVyTWluIiwidGV0aGVyTWF4IiwicHJldmVudGVkT2Zmc2V0IiwiX29mZnNldE1vZGlmaWVyU3RhdGUkMiIsIl9tYWluU2lkZSIsIl9hbHRTaWRlIiwiX29mZnNldCIsIl9sZW4iLCJfbWluIiwiX21heCIsImlzT3JpZ2luU2lkZSIsIl9vZmZzZXRNb2RpZmllclZhbHVlIiwiX3RldGhlck1pbiIsIl90ZXRoZXJNYXgiLCJfcHJldmVudGVkT2Zmc2V0IiwiZ2V0SFRNTEVsZW1lbnRTY3JvbGwiLCJnZXROb2RlU2Nyb2xsIiwiaXNFbGVtZW50U2NhbGVkIiwiZ2V0Q29tcG9zaXRlUmVjdCIsImVsZW1lbnRPclZpcnR1YWxFbGVtZW50IiwiaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQiLCJvZmZzZXRQYXJlbnRJc1NjYWxlZCIsIm9yZGVyIiwibW9kaWZpZXJzIiwidmlzaXRlZCIsIlNldCIsInJlc3VsdCIsIm1vZGlmaWVyIiwiYWRkIiwiZGVwIiwiaGFzIiwiZGVwTW9kaWZpZXIiLCJvcmRlck1vZGlmaWVycyIsIm9yZGVyZWRNb2RpZmllcnMiLCJkZWJvdW5jZSIsInBlbmRpbmciLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJ1bmRlZmluZWQiLCJtZXJnZUJ5TmFtZSIsIm1lcmdlZCIsImN1cnJlbnQiLCJleGlzdGluZyIsIkRFRkFVTFRfT1BUSU9OUyIsImFyZVZhbGlkRWxlbWVudHMiLCJhcmd1bWVudHMiLCJhcmdzIiwiX2tleSIsInBvcHBlckdlbmVyYXRvciIsImdlbmVyYXRvck9wdGlvbnMiLCJfZ2VuZXJhdG9yT3B0aW9ucyIsIl9nZW5lcmF0b3JPcHRpb25zJGRlZiIsImRlZmF1bHRNb2RpZmllcnMiLCJfZ2VuZXJhdG9yT3B0aW9ucyRkZWYyIiwiZGVmYXVsdE9wdGlvbnMiLCJjcmVhdGVQb3BwZXIiLCJlZmZlY3RDbGVhbnVwRm5zIiwiaXNEZXN0cm95ZWQiLCJzZXRPcHRpb25zIiwic2V0T3B0aW9uc0FjdGlvbiIsImNsZWFudXBNb2RpZmllckVmZmVjdHMiLCJtIiwicnVuTW9kaWZpZXJFZmZlY3RzIiwiZm9yY2VVcGRhdGUiLCJfc3RhdGUkZWxlbWVudHMiLCJpbmRleCIsIl9zdGF0ZSRvcmRlcmVkTW9kaWZpZSIsIl9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIiLCJkZXN0cm95Iiwib25GaXJzdFVwZGF0ZSIsIl9yZWYkb3B0aW9ucyIsImNsZWFudXBGbiIsIm5vb3BGbiIsImV2ZW50TGlzdGVuZXJzIiwiZWxlbWVudE1hcCIsIkRhdGEiLCJpbnN0YW5jZU1hcCIsInNpemUiLCJjb25zb2xlIiwiZXJyb3IiLCJmcm9tIiwicmVtb3ZlIiwiZGVsZXRlIiwicm9vdCIsImZhY3RvcnkiLCJtb2R1bGUiLCJleHBvcnRzIiwiVG9hc3RpZnkiLCJ0aGlzIiwiZ2xvYmFsIiwibGliIiwiaW5pdCIsImRlZmF1bHRzIiwib2xkZXN0Rmlyc3QiLCJ0ZXh0IiwiZHVyYXRpb24iLCJzZWxlY3RvciIsImNhbGxiYWNrIiwiZGVzdGluYXRpb24iLCJuZXdXaW5kb3ciLCJjbG9zZSIsImdyYXZpdHkiLCJwb3NpdGlvbkxlZnQiLCJiYWNrZ3JvdW5kQ29sb3IiLCJhdmF0YXIiLCJjbGFzc05hbWUiLCJzdG9wT25Gb2N1cyIsIm9uQ2xpY2siLCJlc2NhcGVNYXJrdXAiLCJhcmlhTGl2ZSIsImJhY2tncm91bmQiLCJwcm90b3R5cGUiLCJ0b2FzdGlmeSIsImNvbnN0cnVjdG9yIiwidG9hc3RFbGVtZW50IiwiYnVpbGRUb2FzdCIsImRpdkVsZW1lbnQiLCJjcmVhdGVFbGVtZW50Iiwid2FybiIsIm5vZGVUeXBlIiwiTm9kZSIsIkVMRU1FTlRfTk9ERSIsImFwcGVuZENoaWxkIiwiaW5uZXJUZXh0IiwiaW5uZXJIVE1MIiwiYXZhdGFyRWxlbWVudCIsInNyYyIsImluc2VydEFkamFjZW50RWxlbWVudCIsImNsb3NlRWxlbWVudCIsInR5cGUiLCJldmVudCIsInN0b3BQcm9wYWdhdGlvbiIsInJlbW92ZUVsZW1lbnQiLCJjbGVhclRpbWVvdXQiLCJ0aW1lT3V0VmFsdWUiLCJiaW5kIiwiaW5uZXJXaWR0aCIsInNjcmVlbiIsInNlbGYiLCJzZXRUaW1lb3V0Iiwib3BlbiIsImxvY2F0aW9uIiwiZ2V0QXhpc09mZnNldEFWYWx1ZSIsInhPZmZzZXQiLCJ5T2Zmc2V0Iiwic2hvd1RvYXN0Iiwicm9vdEVsZW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImVsZW1lbnRUb0luc2VydCIsImZpcnN0Q2hpbGQiLCJsYXN0Q2hpbGQiLCJpbnNlcnRCZWZvcmUiLCJyZXBvc2l0aW9uIiwiaGlkZVRvYXN0IiwicmVtb3ZlQ2hpbGQiLCJjYWxsIiwidG9wTGVmdE9mZnNldFNpemUiLCJ0b3BSaWdodE9mZnNldFNpemUiLCJvZmZzZXRTaXplIiwiYWxsVG9hc3RzIiwiZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSIsImNsYXNzVXNlZCIsImNvbnRhaW5zQ2xhc3MiLCJzdWJzdHIiLCJpc05hTiIsImVsZW0iLCJ5b3VyQ2xhc3MiLCJ0cmltIiwiVG9hc3QiLCJ2YXJpYW50IiwiZ2V0Q29sb3JCeU5hbWUiLCJjb2xvciIsInNob3ciLCJxdWVyeVNlbGVjdG9yVHlwZWQiLCJFcnJvciIsInBhcmVudHMiLCJlbCIsImN1cnJlbnRFbCIsInBhcmVudEVsZW1lbnQiLCJtYXRjaGVzIiwiUHJvZHVjdE1hbmFnZXIiLCJCQVNFX1VSTCIsIkRPTSIsInRhYmxlIiwidEJvZHkiLCJpbnB1dE5hbWUiLCJpbnB1dFByaWNlIiwiYnRuQWRkIiwidGVtcGxhdGVSb3ciLCJidG5TYXZlIiwiYnRuUmVzZXQiLCJtb2RhbEVkaXQiLCJmb3JtRWRpdCIsImlucHV0RWRpdE5hbWUiLCJpbnB1dEVkaXRQcmljZSIsImlucHV0RWRpdElkIiwiaW5wdXRFZGl0UG9zaXRpb24iLCJidG5VcGRhdGUiLCJtb2RhbERlbGV0ZSIsInByb2R1Y3ROYW1lIiwiYnRuQ29uZmlybURlbGV0ZSIsImxvZyIsImJzTW9kYWxFZGl0IiwiTW9kYWwiLCJiYWNrZHJvcCIsImtleWJvYXJkIiwiYnNNb2RhbERlbGV0ZSIsImluaXRQcm9kdWN0cyIsIm9uQ2xpY2tSZXNldCIsIm9uQ2xpY2tTYXZlIiwib25DbGlja0FkZCIsImRpc2FibGVkIiwib25DbGlja0NvbmZpcm1EZWxldGUiLCJvblN1Ym1pdEVkaXQiLCJvbktleVVwIiwiZSIsImN1cnJlbnRUYXJnZXQiLCJyZXNldFByb2R1Y3RzIiwic3VjY2VzcyIsIm1zZyIsImxvYWRQcm9kdWN0cyIsImJ0bkVsIiwiaWNvbiIsImNsYXNzTGlzdCIsInNhdmVQcm9kdWN0cyIsInByZXZlbnREZWZhdWx0IiwicHJvZHVjdCIsInByaWNlIiwiTnVtYmVyIiwiX2lkIiwidXBkYXRlUHJvZHVjdCIsInJlc2V0RmllbGRzIiwiY3JlYXRlUHJvZHVjdCIsImRpc2FibGVOb25GdW5jdGlvbmFsQnV0dG9ucyIsIm9uQ2xpY2tFZGl0IiwiY3VycmVudFJvdyIsImlkIiwiU3RyaW5nIiwiZGF0YXNldCIsImdldFByb2R1Y3QiLCJzaG93TW9kYWxFZGl0Iiwib25DbGlja1JlbW92ZSIsInRleHRDb250ZW50IiwiZGVsZXRlUHJvZHVjdCIsIm9uQ2xpY2tNb3ZlVXAiLCJjdXJyZW50Um93RWwiLCJwcmV2aW91c0VsZW1lbnRTaWJsaW5nIiwiYmVmb3JlIiwib25DbGlja01vdmVEb3duIiwibmV4dEVsZW1lbnRTaWJsaW5nIiwiYWZ0ZXIiLCJvbk1vdXNlRG93bkRyYWciLCJkcmFnZ2FibGUiLCJvbk1vdXNlVXBEcmFnIiwib25EcmFnU3RhcnQiLCJpZHgiLCJjaGlsZHJlbiIsImRhdGFUcmFuc2ZlciIsInNldERhdGEiLCJvbkRyYWdPdmVyIiwib25Ecm9wIiwidGFyZ2V0SWR4Iiwic291cmNlSWR4IiwicGFyc2VJbnQiLCJnZXREYXRhIiwiZHJhZ2dlZEVsIiwicmVzcG9uc2UiLCJmZXRjaCIsIm1ldGhvZCIsImhlYWRlcnMiLCJKU09OIiwic3RyaW5naWZ5Iiwib2siLCJqc29uIiwibWVzc2FnZSIsInNhdmUiLCJnZXRQcm9kdWN0cyIsInByb2R1Y3RzIiwiYWRkUHJvZHVjdCIsInRyRWwiLCJjb250ZW50IiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJjbG9uZU5vZGUiLCJ0ZE5hbWVFbCIsInRkUHJpY2VFbCIsImJ0blJlbW92ZUVsIiwiYnRuTW92ZVVwRWwiLCJidG5Nb3ZlRG93bkVsIiwiYnRuRHJhZ0VsIiwiYnRuRWRpdEVsIiwicXVlcnlTZWxlY3RvckFsbCIsInRyIiwiYnRuTW92ZVVwIiwiYnRuTW92ZURvd24iLCJfZGVmaW5lUHJvcGVydGllcyIsInByb3BzIiwiZGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImRlZmluZVByb3BlcnR5IiwiX2NyZWF0ZUNsYXNzIiwiQ29uc3RydWN0b3IiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJNRURJQV9QUkVGRVJTX1JFRFVDRURfTU9USU9OIiwiQ1JFQVRFRCIsIk1PVU5URUQiLCJJRExFIiwiTU9WSU5HIiwiU0NST0xMSU5HIiwiRFJBR0dJTkciLCJERVNUUk9ZRUQiLCJTVEFURVMiLCJlbXB0eSIsImFycmF5IiwiYXJyYXlMaWtlIiwiYXBwbHkiLCJmdW5jIiwibmV4dFRpY2siLCJub29wIiwicmFmIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwidHlwZU9mIiwic3ViamVjdCIsImlzT2JqZWN0IiwiaXNOdWxsIiwiaXNGdW5jdGlvbiIsImlzU3RyaW5nIiwiaXNVbmRlZmluZWQiLCJ0b0FycmF5IiwidmFsdWVzIiwiaXRlcmF0ZWUiLCJpbmNsdWRlcyIsIml0ZW1zIiwidG9nZ2xlQ2xhc3MiLCJlbG0iLCJjbGFzc2VzIiwiYWRkQ2xhc3MiLCJhcHBlbmQiLCJub2RlcyIsInJlZiIsImNoaWxkcmVuMiIsIm93bktleXMiLCJmb3JPd24iLCJvYmplY3QiLCJyZXZlcnNlIiwic291cmNlIiwibWVyZ2UiLCJvbWl0IiwiZWxtcyIsImF0dHJzIiwiYXR0ciIsInZhbHVlMiIsImNyZWF0ZSIsInRhZyIsInByb3AiLCJkaXNwbGF5IiwiZGlzcGxheTIiLCJmb2N1cyIsInByZXZlbnRTY3JvbGwiLCJnZXRBdHRyaWJ1dGUiLCJoYXNDbGFzcyIsInBhcnNlSHRtbCIsIkRPTVBhcnNlciIsInBhcnNlRnJvbVN0cmluZyIsInByZXZlbnQiLCJzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24iLCJxdWVyeSIsInF1ZXJ5QWxsIiwicmVtb3ZlQ2xhc3MiLCJ0aW1lT2YiLCJ0aW1lU3RhbXAiLCJ1bml0IiwiUFJPSkVDVF9DT0RFIiwiREFUQV9BVFRSSUJVVEUiLCJhc3NlcnQiLCJjb25kaXRpb24iLCJmbG9vciIsImNlaWwiLCJhcHByb3hpbWF0ZWx5RXF1YWwiLCJlcHNpbG9uIiwiYmV0d2VlbiIsIm51bWJlciIsImV4Y2x1c2l2ZSIsIm1pbmltdW0iLCJtYXhpbXVtIiwiY2xhbXAiLCJzaWduIiwiZm9ybWF0Iiwic3RyaW5nIiwicmVwbGFjZW1lbnRzIiwicmVwbGFjZW1lbnQiLCJwYWQiLCJpZHMiLCJ1bmlxdWVJZCIsInByZWZpeCIsIkV2ZW50QmluZGVyIiwibGlzdGVuZXJzIiwidGFyZ2V0cyIsImV2ZW50cyIsImZvckVhY2hFdmVudCIsIm5hbWVzcGFjZSIsImlzRXZlbnRUYXJnZXQiLCJyZW1vdmVyIiwidW5iaW5kIiwibGlzdGVuZXIiLCJkaXNwYXRjaCIsImRldGFpbCIsImJ1YmJsZXMiLCJDdXN0b21FdmVudCIsImNyZWF0ZUV2ZW50IiwiaW5pdEN1c3RvbUV2ZW50IiwiZGlzcGF0Y2hFdmVudCIsImV2ZW50czIiLCJldmVudE5TIiwiZnJhZ21lbnQiLCJFVkVOVF9NT1VOVEVEIiwiRVZFTlRfUkVBRFkiLCJFVkVOVF9NT1ZFIiwiRVZFTlRfTU9WRUQiLCJFVkVOVF9DTElDSyIsIkVWRU5UX0FDVElWRSIsIkVWRU5UX0lOQUNUSVZFIiwiRVZFTlRfVklTSUJMRSIsIkVWRU5UX0hJRERFTiIsIkVWRU5UX1JFRlJFU0giLCJFVkVOVF9VUERBVEVEIiwiRVZFTlRfUkVTSVpFIiwiRVZFTlRfUkVTSVpFRCIsIkVWRU5UX0RSQUciLCJFVkVOVF9EUkFHR0lORyIsIkVWRU5UX0RSQUdHRUQiLCJFVkVOVF9TQ1JPTEwiLCJFVkVOVF9TQ1JPTExFRCIsIkVWRU5UX09WRVJGTE9XIiwiRVZFTlRfREVTVFJPWSIsIkVWRU5UX0FSUk9XU19NT1VOVEVEIiwiRVZFTlRfQVJST1dTX1VQREFURUQiLCJFVkVOVF9QQUdJTkFUSU9OX01PVU5URUQiLCJFVkVOVF9QQUdJTkFUSU9OX1VQREFURUQiLCJFVkVOVF9OQVZJR0FUSU9OX01PVU5URUQiLCJFVkVOVF9BVVRPUExBWV9QTEFZIiwiRVZFTlRfQVVUT1BMQVlfUExBWUlORyIsIkVWRU5UX0FVVE9QTEFZX1BBVVNFIiwiRVZFTlRfTEFaWUxPQURfTE9BREVEIiwiRVZFTlRfU0xJREVfS0VZRE9XTiIsIkVWRU5UX1NISUZURUQiLCJFVkVOVF9FTkRfSU5ERVhfQ0hBTkdFRCIsIkV2ZW50SW50ZXJmYWNlIiwiU3BsaWRlMiIsImJ1cyIsImNyZWF0ZURvY3VtZW50RnJhZ21lbnQiLCJiaW5kZXIiLCJvbiIsImVtaXQiLCJvZmYiLCJSZXF1ZXN0SW50ZXJ2YWwiLCJpbnRlcnZhbCIsIm9uSW50ZXJ2YWwiLCJvblVwZGF0ZSIsImxpbWl0Iiwibm93IiwiRGF0ZSIsInN0YXJ0VGltZSIsInJhdGUiLCJwYXVzZWQiLCJjb3VudCIsInBhdXNlIiwicmVzdW1lIiwiY2FuY2VsIiwicmV3aW5kIiwiY2FuY2VsQW5pbWF0aW9uRnJhbWUiLCJ0aW1lIiwiaXNQYXVzZWQiLCJTdGF0ZSIsImluaXRpYWxTdGF0ZSIsImlzIiwic3RhdGVzIiwiVGhyb3R0bGUiLCJNZWRpYSIsIkNvbXBvbmVudHMyIiwiYnJlYWtwb2ludHMiLCJyZWR1Y2VkTW90aW9uIiwicXVlcmllcyIsInNldHVwIiwiaXNNaW4iLCJtZWRpYVF1ZXJ5IiwibiIsInJlZ2lzdGVyIiwiY29tcGxldGVseSIsIm9wdGlvbnMyIiwicXVlcnlMaXN0IiwibWF0Y2hNZWRpYSIsImRlc3Ryb3llZCIsIm1lcmdlZDIiLCJlbnRyeSIsIm1vdW50IiwicmVmcmVzaCIsImVuYWJsZSIsIm9wdHMiLCJiYXNlIiwibm90aWZ5IiwiZ2V0UHJvdG90eXBlT2YiLCJBUlJPVyIsIkFSUk9XX0xFRlQiLCJBUlJPV19SSUdIVCIsIkFSUk9XX1VQIiwiQVJST1dfRE9XTiIsIlJUTCIsIlRUQiIsIk9SSUVOVEFUSU9OX01BUCIsIlgiLCJZIiwiQXJyb3dMZWZ0IiwiQXJyb3dSaWdodCIsIkRpcmVjdGlvbiIsImF4aXNPbmx5IiwibWF0Y2giLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsIm9yaWVudCIsIlJPTEUiLCJUQUJfSU5ERVgiLCJESVNBQkxFRCIsIkFSSUFfUFJFRklYIiwiQVJJQV9DT05UUk9MUyIsIkFSSUFfQ1VSUkVOVCIsIkFSSUFfU0VMRUNURUQiLCJBUklBX0xBQkVMIiwiQVJJQV9MQUJFTExFREJZIiwiQVJJQV9ISURERU4iLCJBUklBX09SSUVOVEFUSU9OIiwiQVJJQV9ST0xFREVTQ1JJUFRJT04iLCJBUklBX0xJVkUiLCJBUklBX0JVU1kiLCJBUklBX0FUT01JQyIsIkFMTF9BVFRSSUJVVEVTIiwiQ0xBU1NfUFJFRklYIiwiU1RBVFVTX0NMQVNTX1BSRUZJWCIsIkNMQVNTX1JPT1QiLCJDTEFTU19UUkFDSyIsIkNMQVNTX0xJU1QiLCJDTEFTU19TTElERSIsIkNMQVNTX0NMT05FIiwiQ0xBU1NfQ09OVEFJTkVSIiwiQ0xBU1NfQVJST1dTIiwiQ0xBU1NfQVJST1ciLCJDTEFTU19BUlJPV19QUkVWIiwiQ0xBU1NfQVJST1dfTkVYVCIsIkNMQVNTX1BBR0lOQVRJT04iLCJDTEFTU19QQUdJTkFUSU9OX1BBR0UiLCJDTEFTU19QUk9HUkVTUyIsIkNMQVNTX1BST0dSRVNTX0JBUiIsIkNMQVNTX1RPR0dMRSIsIkNMQVNTX1NQSU5ORVIiLCJDTEFTU19TUiIsIkNMQVNTX0lOSVRJQUxJWkVEIiwiQ0xBU1NfQUNUSVZFIiwiQ0xBU1NfUFJFViIsIkNMQVNTX05FWFQiLCJDTEFTU19WSVNJQkxFIiwiQ0xBU1NfTE9BRElORyIsIkNMQVNTX0ZPQ1VTX0lOIiwiQ0xBU1NfT1ZFUkZMT1ciLCJTVEFUVVNfQ0xBU1NFUyIsIkNMQVNTRVMiLCJzbGlkZSIsImNsb25lIiwiYXJyb3dzIiwicHJldiIsInBhZ2luYXRpb24iLCJwYWdlIiwic3Bpbm5lciIsImNsb3Nlc3QiLCJGUklDVElPTiIsIkxPR19JTlRFUlZBTCIsIlBPSU5URVJfRE9XTl9FVkVOVFMiLCJQT0lOVEVSX01PVkVfRVZFTlRTIiwiUE9JTlRFUl9VUF9FVkVOVFMiLCJFbGVtZW50cyIsIl9FdmVudEludGVyZmFjZSIsImkxOG4iLCJzbGlkZXMiLCJyb290Q2xhc3NlcyIsInRyYWNrQ2xhc3NlcyIsInRyYWNrIiwiaXNVc2luZ0tleSIsImNvbGxlY3QiLCJjYXB0dXJlIiwiZ2V0Q2xhc3NlcyIsImxhYmVsIiwibGFiZWxsZWRieSIsImJhciIsInRvZ2dsZSIsInJvbGUiLCJ0YWdOYW1lIiwiY2Fyb3VzZWwiLCJkcmFnIiwiaXNOYXZpZ2F0aW9uIiwiU0xJREUiLCJMT09QIiwiRkFERSIsIlNsaWRlJDEiLCJzbGlkZUluZGV4IiwiQ29tcG9uZW50cyIsInVwZGF0ZU9uTW92ZSIsInNsaWRlRm9jdXMiLCJpc0Nsb25lIiwiY29udGFpbmVyIiwic2xpZGVMYWJlbCIsImxpc3RlbiIsImluaXROYXZpZ2F0aW9uIiwib25Nb3ZlIiwiY29udHJvbHMiLCJzcGxpZGVzIiwiU2xpZGUyIiwic3BsaWRlIiwiU2xpZGVzIiwiZ2V0QXQiLCJzbGlkZVgiLCJjdXJyIiwidXBkYXRlQWN0aXZpdHkiLCJ1cGRhdGVWaXNpYmlsaXR5IiwiYWN0aXZlIiwiaXNBY3RpdmUiLCJ2aXNpYmxlIiwiaXNWaXNpYmxlIiwiaGlkZGVuIiwiZm9jdXNhYmxlTm9kZXMiLCJhY3RpdmVFbGVtZW50Iiwic3R5bGUkMSIsInVzZUNvbnRhaW5lciIsImNsb25lU3RhdHVzIiwidHJhY2tSZWN0Iiwic2xpZGVSZWN0IiwiaXNXaXRoaW4iLCJkaWZmIiwiX0V2ZW50SW50ZXJmYWNlMiIsIl9Db21wb25lbnRzMiRFbGVtZW50cyIsIlNsaWRlczIiLCJmb3JFYWNoJDEiLCJTbGlkZTEiLCJleGNsdWRlQ2xvbmVzIiwiZ2V0SW4iLCJDb250cm9sbGVyIiwidG9JbmRleCIsImhhc0ZvY3VzIiwicGVyUGFnZSIsIm9ic2VydmVJbWFnZXMiLCJyZW1vdmUkMSIsIm1hdGNoZXIiLCJpbWFnZXMiLCJpbWciLCJnZXRMZW5ndGgiLCJpc0Vub3VnaCIsIkxheW91dCIsIl9FdmVudEludGVyZmFjZTMiLCJfQ29tcG9uZW50czIkRWxlbWVudHMyIiwic3R5bGVTbGlkZXMiLCJ2ZXJ0aWNhbCIsInJvb3RSZWN0IiwiY3NzUGFkZGluZyIsImZvcmNlIiwibmV3UmVjdCIsImNzc1RyYWNrSGVpZ2h0IiwiZ2FwIiwiY3NzU2xpZGVXaWR0aCIsImNzc1NsaWRlSGVpZ2h0IiwiaXNPdmVyZmxvdyIsImNzc0hlaWdodCIsImhlaWdodFJhdGlvIiwiYXV0b1dpZHRoIiwiZml4ZWRXaWR0aCIsImNzc1NsaWRlU2l6ZSIsImZpeGVkSGVpZ2h0IiwiYXV0b0hlaWdodCIsImxpc3RTaXplIiwic2xpZGVTaXplIiwid2l0aG91dEdhcCIsIlNsaWRlIiwiZ2V0R2FwIiwidG90YWxTaXplIiwic2xpZGVyU2l6ZSIsInBhcnNlRmxvYXQiLCJnZXRQYWRkaW5nIiwiTVVMVElQTElFUiIsIkNsb25lcyIsImNsb25lcyIsImNsb25lQ291bnQiLCJyZW1vdW50Iiwib2JzZXJ2ZSIsImNvbXB1dGVDbG9uZUNvdW50IiwiZ2VuZXJhdGUiLCJpc0hlYWQiLCJjbG9uZURlZXAiLCJjbG9uZXMyIiwiZml4ZWRTaXplIiwiZml4ZWRDb3VudCIsIk1vdmUiLCJfRXZlbnRJbnRlcmZhY2U0IiwiX0NvbXBvbmVudHMyJExheW91dCIsIl9Db21wb25lbnRzMiREaXJlY3RpbyIsIl9Db21wb25lbnRzMiRFbGVtZW50czMiLCJUcmFuc2l0aW9uIiwiaXNCdXN5IiwiU2Nyb2xsIiwianVtcCIsIm1vdmUiLCJkZXN0IiwiY2FuU2hpZnQiLCJ0cmFuc2xhdGUiLCJzaGlmdCIsImdldFBvc2l0aW9uIiwidG9Qb3NpdGlvbiIsInByZXZlbnRMb29wIiwibG9vcCIsImV4Y2VlZGVkTWF4IiwiZ2V0RW5kIiwiZXhjZWVkZWRNaW4iLCJiYWNrd2FyZHMiLCJleGNlc3MiLCJnZXRMaW1pdCIsIm1pbkRpc3RhbmNlIiwiSW5maW5pdHkiLCJ0cmltbWluZyIsInRyaW1TcGFjZSIsInNoaWZ0ZWQiLCJleGNlZWRlZExpbWl0IiwiX0V2ZW50SW50ZXJmYWNlNSIsIl9Db21wb25lbnRzMiRTbGlkZXMiLCJvbWl0RW5kIiwiaXNMb29wIiwiaXNTbGlkZSIsImdldE5leHQiLCJnZXRBZGphY2VudCIsImdldFByZXYiLCJjdXJySW5kZXgiLCJlbmRJbmRleCIsInByZXZJbmRleCIsInNsaWRlQ291bnQiLCJwZXJNb3ZlIiwib25SZXNpemVkIiwiZ28iLCJjb250cm9sIiwiYWxsb3dTYW1lSW5kZXgiLCJwYXJzZSIsInNldEluZGV4Iiwic25hcCIsImluZGljYXRvciIsImNvbXB1dGVEZXN0SW5kZXgiLCJzbmFwUGFnZSIsImNvbXB1dGVNb3ZhYmxlRGVzdEluZGV4IiwidG9QYWdlIiwidG9EZXN0IiwiZ2V0SW5kZXgiLCJ3YWl0Rm9yVHJhbnNpdGlvbiIsIlhNTF9OQU1FX1NQQUNFIiwiUEFUSCIsIlNJWkUiLCJBcnJvd3MiLCJwbGFjZWhvbGRlciIsIndyYXBwZXIiLCJjcmVhdGVkIiwid3JhcHBlckNsYXNzZXMiLCJjcmVhdGVBcnJvd3MiLCJjcmVhdGVBcnJvdyIsInByZXYyIiwiYXJyb3dQYXRoIiwibmV4dEluZGV4IiwicHJldkxhYmVsIiwibGFzdCIsIm5leHRMYWJlbCIsImZpcnN0IiwiSU5URVJWQUxfREFUQV9BVFRSSUJVVEUiLCJBdXRvcGxheSIsIl9FdmVudEludGVyZmFjZTYiLCJvbkFuaW1hdGlvbkZyYW1lIiwiX0NvbXBvbmVudHMyJEVsZW1lbnRzNCIsImF1dG9wbGF5IiwiaG92ZXJlZCIsImZvY3VzZWQiLCJzdG9wcGVkIiwicGxheSIsInBhdXNlT25Ib3ZlciIsImF1dG9Ub2dnbGUiLCJwYXVzZU9uRm9jdXMiLCJyZXNldFByb2dyZXNzIiwic3RvcCIsIkNvdmVyIiwiX0V2ZW50SW50ZXJmYWNlNyIsImNvdmVyIiwiY292ZXIyIiwiQk9VTkNFX0RJRkZfVEhSRVNIT0xEIiwiQk9VTkNFX0RVUkFUSU9OIiwiRlJJQ1RJT05fRkFDVE9SIiwiQkFTRV9WRUxPQ0lUWSIsIk1JTl9EVVJBVElPTiIsIl9FdmVudEludGVyZmFjZTgiLCJmcmljdGlvbiIsImNsZWFyIiwib25TY3JvbGxlZCIsIm5vQ29uc3RyYWluIiwibm9EaXN0YW5jZSIsIm9uRW5kIiwidG8iLCJlYXNpbmciLCJ0IiwiZWFzaW5nRnVuYyIsInBvdyIsIlNDUk9MTF9MSVNURU5FUl9PUFRJT05TIiwiRHJhZyIsIl9FdmVudEludGVyZmFjZTkiLCJfQ29tcG9uZW50czIkRGlyZWN0aW8yIiwiYmFzZVBvc2l0aW9uIiwiYmFzZUV2ZW50IiwicHJldkJhc2VFdmVudCIsImlzRnJlZSIsImRyYWdnaW5nIiwiZXhjZWVkZWQiLCJjbGlja1ByZXZlbnRlZCIsIm9uUG9pbnRlckRvd24iLCJkaXNhYmxlIiwiaXNUb3VjaCIsImlzVG91Y2hFdmVudCIsImlzRHJhZ2dhYmxlIiwiYnV0dG9uIiwib25Qb2ludGVyTW92ZSIsIm9uUG9pbnRlclVwIiwiY2FuY2VsYWJsZSIsImNvbnN0cmFpbiIsImRpZmZDb29yZCIsImV4cGlyZWQiLCJkaWZmVGltZSIsImhhc0V4Y2VlZGVkIiwiaXNTbGlkZXJEaXJlY3Rpb24iLCJzaG91bGRTdGFydCIsInZlbG9jaXR5IiwiY29tcHV0ZVZlbG9jaXR5IiwiY29tcHV0ZURlc3RpbmF0aW9uIiwicmV3aW5kQnlEcmFnIiwidGhyZXNob2xkcyIsImRyYWdNaW5UaHJlc2hvbGQiLCJpc09iaiIsIm1vdXNlIiwidG91Y2giLCJmbGlja1Bvd2VyIiwiZmxpY2tNYXhQYWdlcyIsIm9ydGhvZ29uYWwiLCJjb29yZE9mIiwiZ2V0QmFzZUV2ZW50IiwiY2hhbmdlZFRvdWNoZXMiLCJ0YXJnZXQyIiwibm9EcmFnIiwiVG91Y2hFdmVudCIsImlzRHJhZ2dpbmciLCJOT1JNQUxJWkFUSU9OX01BUCIsIlNwYWNlYmFyIiwiUmlnaHQiLCJMZWZ0IiwiVXAiLCJEb3duIiwibm9ybWFsaXplS2V5IiwiS0VZQk9BUkRfRVZFTlQiLCJLZXlib2FyZCIsIl9FdmVudEludGVyZmFjZTEwIiwib25LZXlkb3duIiwiX2Rpc2FibGVkIiwiU1JDX0RBVEFfQVRUUklCVVRFIiwiU1JDU0VUX0RBVEFfQVRUUklCVVRFIiwiSU1BR0VfU0VMRUNUT1IiLCJMYXp5TG9hZCIsIl9FdmVudEludGVyZmFjZTExIiwiaXNTZXF1ZW50aWFsIiwibGF6eUxvYWQiLCJlbnRyaWVzIiwibG9hZE5leHQiLCJzcmNzZXQiLCJwcmVsb2FkUGFnZXMiLCJsb2FkIiwib25Mb2FkIiwiUGFnaW5hdGlvbiIsInBhZ2luYXRpb25DbGFzc2VzIiwiY3JlYXRlUGFnaW5hdGlvbiIsImdldERpcmVjdGlvbiIsInNlbGVjdCIsImxpIiwiY2xhc3MiLCJwYWdlWCIsInBhZ2luYXRpb25LZXlib2FyZCIsImRpciIsIm5leHRQYWdlIiwicGFnaW5hdGlvbkRpcmVjdGlvbiIsIl9idXR0b24iLCJUUklHR0VSX0tFWVMiLCJTeW5jIiwiaXNQYXJlbnQiLCJzeW5jIiwibmF2aWdhdGUiLCJXaGVlbCIsIl9FdmVudEludGVyZmFjZTEyIiwibGFzdFRpbWUiLCJ3aGVlbCIsIm9uV2hlZWwiLCJkZWx0YVkiLCJ3aGVlbE1pblRocmVzaG9sZCIsInNsZWVwIiwid2hlZWxTbGVlcCIsInNob3VsZFByZXZlbnQiLCJyZWxlYXNlV2hlZWwiLCJTUl9SRU1PVkFMX0RFTEFZIiwiTGl2ZSIsIl9FdmVudEludGVyZmFjZTEzIiwibGl2ZSIsInNyIiwiQ29tcG9uZW50Q29uc3RydWN0b3JzIiwiZnJlZXplIiwiX19wcm90b19fIiwiSTE4TiIsIkRFRkFVTFRTIiwic3BlZWQiLCJyZXdpbmRTcGVlZCIsIkZhZGUiLCJkb25lIiwidHJhbnNpdGlvbiIsImVuZENhbGxiYWNrIiwiZ2V0U3BlZWQiLCJ1c2VTY3JvbGwiLCJfU3BsaWRlIiwiX28iLCJfRSIsIl9wcm90byIsIkV4dGVuc2lvbnMiLCJfdGhpcyIsIl9DIiwiX1QiLCJDb25zdHJ1Y3RvcnMiLCJDb21wb25lbnQiLCJjb21wb25lbnQiLCJfdGhpcyRldmVudCIsIlNwbGlkZSIsInJvdXRlciIsInBhdGgiLCJwYXRobmFtZSJdLCJtYXBwaW5ncyI6Ijs7O01B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R0FBRyxDQUFFLE9BQU8sQ0FDWmlNLEdBQUcsQ0FBRSxTQUFTQSxHQUFHQSxFQUFHLENBQ2xCLE9BQU8sSUFBSSxDQUFDbzlCLEVBQUUsQ0FBQ2pTLFVBQVUsQ0FBQzhHLFFBQVEsRUFBRSxDQUN0QyxDQUNGLENBQUMsQ0FBQyxDQUFDLENBRUgsT0FBTzZLLE9BQU8sQ0FDaEIsQ0FBQyxFQUFFLENBRUgsSUFBSVksTUFBTSxDQUFHWixPQUFPLENBQ3BCWSxNQUFNLENBQUNoMUIsUUFBUSxDQUFHLEVBQUUsQ0FDcEJnMUIsTUFBTSxDQUFDbm5CLE1BQU0sQ0FBR0EsTUFBTTs7RUM5a0dILENBRWxCLElBQU0sQ0FLTCxNQUFNOU4sS0FBT0EsSUFBTSxDQUNqQmIsT0FBQSxDQUFRMkgsSUFBSSxRQUFRLENBQUEsQ0FDcEJvdUIsTUFBQSxFQUFPLENBQ1QsQ0FBQSxDQU9BLE1BQU1BLE9BQVNBLElBQU0sQ0FDbkIsTUFBTUMsSUFBQSxDQUFPeHhDLE9BQU91ZixRQUFBLENBQVNreUIsUUFBQSxDQUU3QmoyQixPQUFBLENBQVEySCxJQUFJcXVCLElBQUksQ0FBQSxDQUVoQixPQUFRQSxJQUFBLEVBQ04sS0FBSyxHQUFBLENBQ0wsS0FBSyxhQUFBLENBQ0hoMkIsT0FBQSxDQUFRMkgsSUFBSSxNQUFNLENBQUEsQ0FDRixJQUFJbXVCLE1BQUEsQ0FBTyxTQUFBLENBQVcsQ0FDcEMzeUIsSUFBQSxDQUFNLE1BQUEsQ0FDTmtpQixXQUFBLENBQWEsTUFBQSxDQUNicjhCLE1BQUEsQ0FBUSxNQUFBLENBQ1JzOEIsVUFBQSxDQUFZLElBQ2QsQ0FBQyxFQUFFbkwsS0FBQSxHQUdILE1BQ0YsS0FBSyxnQ0FBQSxDQUNIbmEsT0FBQSxDQUFRMkgsSUFBSSxpQkFBaUIsQ0FBQSxDQUNsQnJCLGNBQUEsR0FDWCxNQUNGLFFBQ0V0RyxPQUFBLENBQVF3QyxLQUFLLGdCQUFnQixDQUFBLENBQ2pDLENBQ0YsQ0FBQSxDQUVBM0IsSUFBQSxFQUFLLENBQ1AsQ0FBQSxHQUFHOzs7Ozs7IiwieF9nb29nbGVfaWdub3JlTGlzdCI6WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsNTIsNTMsNTQsNTUsNTldfQ==","sourceRoot":"../dev/scripts"} \ No newline at end of file diff --git a/webseite-gulp-ts/frontend/assets/map/bundle.js.map b/webseite-gulp-ts/frontend/assets/map/bundle.js.map deleted file mode 100644 index b4c228e..0000000 --- a/webseite-gulp-ts/frontend/assets/map/bundle.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"../frontend/bundle.js","sources":["node_modules/tslib/tslib.es6.js","node_modules/@popperjs/core/lib/enums.js","node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","node_modules/@popperjs/core/lib/dom-utils/getWindow.js","node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","node_modules/@popperjs/core/lib/modifiers/applyStyles.js","node_modules/@popperjs/core/lib/utils/getBasePlacement.js","node_modules/@popperjs/core/lib/utils/math.js","node_modules/@popperjs/core/lib/utils/userAgent.js","node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","node_modules/@popperjs/core/lib/dom-utils/contains.js","node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","node_modules/@popperjs/core/lib/utils/within.js","node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","node_modules/@popperjs/core/lib/utils/expandToHashMap.js","node_modules/@popperjs/core/lib/modifiers/arrow.js","node_modules/@popperjs/core/lib/utils/getVariation.js","node_modules/@popperjs/core/lib/modifiers/computeStyles.js","node_modules/@popperjs/core/lib/modifiers/eventListeners.js","node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","node_modules/@popperjs/core/lib/utils/rectToClientRect.js","node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","node_modules/@popperjs/core/lib/utils/computeOffsets.js","node_modules/@popperjs/core/lib/utils/detectOverflow.js","node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","node_modules/@popperjs/core/lib/modifiers/flip.js","node_modules/@popperjs/core/lib/modifiers/hide.js","node_modules/@popperjs/core/lib/modifiers/offset.js","node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","node_modules/@popperjs/core/lib/utils/getAltAxis.js","node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","node_modules/@popperjs/core/lib/utils/orderModifiers.js","node_modules/@popperjs/core/lib/utils/debounce.js","node_modules/@popperjs/core/lib/utils/mergeByName.js","node_modules/@popperjs/core/lib/createPopper.js","node_modules/@popperjs/core/lib/popper.js","node_modules/bootstrap/dist/js/bootstrap.esm.js","node_modules/toastify-js/src/toastify.js","dev/scripts/modules/Toast.ts","dev/scripts/utils/helpers.ts","dev/scripts/modules/ProductManager.ts","node_modules/@splidejs/splide/dist/js/splide.esm.js","dev/scripts/main.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n 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;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n 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') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n 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));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n });\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref) {\n var name = _ref.name,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options,\n effect = _ref.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","/*!\n * Bootstrap v5.3.8 (https://getbootstrap.com/)\n * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\nimport * as Popper from '@popperjs/core';\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map();\nconst Data = {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map());\n }\n const instanceMap = elementMap.get(element);\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);\n return;\n }\n instanceMap.set(key, instance);\n },\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null;\n }\n return null;\n },\n remove(element, key) {\n if (!elementMap.has(element)) {\n return;\n }\n const instanceMap = elementMap.get(element);\n instanceMap.delete(key);\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element);\n }\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1000000;\nconst MILLISECONDS_MULTIPLIER = 1000;\nconst TRANSITION_END = 'transitionend';\n\n/**\n * Properly escape IDs selectors to handle weird IDs\n * @param {string} selector\n * @returns {string}\n */\nconst parseSelector = selector => {\n if (selector && window.CSS && window.CSS.escape) {\n // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`);\n }\n return selector;\n};\n\n// Shout-out Angus Croll (https://goo.gl/pxwQGp)\nconst toType = object => {\n if (object === null || object === undefined) {\n return `${object}`;\n }\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase();\n};\n\n/**\n * Public Util API\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID);\n } while (document.getElementById(prefix));\n return prefix;\n};\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0;\n }\n\n // Get transition-duration of the element\n let {\n transitionDuration,\n transitionDelay\n } = window.getComputedStyle(element);\n const floatTransitionDuration = Number.parseFloat(transitionDuration);\n const floatTransitionDelay = Number.parseFloat(transitionDelay);\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0;\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0];\n transitionDelay = transitionDelay.split(',')[0];\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n};\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END));\n};\nconst isElement = object => {\n if (!object || typeof object !== 'object') {\n return false;\n }\n if (typeof object.jquery !== 'undefined') {\n object = object[0];\n }\n return typeof object.nodeType !== 'undefined';\n};\nconst getElement = object => {\n // it's a jQuery object or a node element\n if (isElement(object)) {\n return object.jquery ? object[0] : object;\n }\n if (typeof object === 'string' && object.length > 0) {\n return document.querySelector(parseSelector(object));\n }\n return null;\n};\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false;\n }\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible';\n // Handle `details` element as its content may falsie appear visible when it is closed\n const closedDetails = element.closest('details:not([open])');\n if (!closedDetails) {\n return elementIsVisible;\n }\n if (closedDetails !== element) {\n const summary = element.closest('summary');\n if (summary && summary.parentNode !== closedDetails) {\n return false;\n }\n if (summary === null) {\n return false;\n }\n }\n return elementIsVisible;\n};\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true;\n }\n if (element.classList.contains('disabled')) {\n return true;\n }\n if (typeof element.disabled !== 'undefined') {\n return element.disabled;\n }\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';\n};\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null;\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode();\n return root instanceof ShadowRoot ? root : null;\n }\n if (element instanceof ShadowRoot) {\n return element;\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null;\n }\n return findShadowRoot(element.parentNode);\n};\nconst noop = () => {};\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.harrytheo.com/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n element.offsetHeight; // eslint-disable-line no-unused-expressions\n};\nconst getjQuery = () => {\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return window.jQuery;\n }\n return null;\n};\nconst DOMContentLoadedCallbacks = [];\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n for (const callback of DOMContentLoadedCallbacks) {\n callback();\n }\n });\n }\n DOMContentLoadedCallbacks.push(callback);\n } else {\n callback();\n }\n};\nconst isRTL = () => document.documentElement.dir === 'rtl';\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery();\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME;\n const JQUERY_NO_CONFLICT = $.fn[name];\n $.fn[name] = plugin.jQueryInterface;\n $.fn[name].Constructor = plugin;\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT;\n return plugin.jQueryInterface;\n };\n }\n });\n};\nconst execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n return typeof possibleCallback === 'function' ? possibleCallback.call(...args) : defaultValue;\n};\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback);\n return;\n }\n const durationPadding = 5;\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;\n let called = false;\n const handler = ({\n target\n }) => {\n if (target !== transitionElement) {\n return;\n }\n called = true;\n transitionElement.removeEventListener(TRANSITION_END, handler);\n execute(callback);\n };\n transitionElement.addEventListener(TRANSITION_END, handler);\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement);\n }\n }, emulatedDuration);\n};\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n const listLength = list.length;\n let index = list.indexOf(activeElement);\n\n // if the element does not exist in the list return an element\n // depending on the direction and if cycle is allowed\n if (index === -1) {\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];\n }\n index += shouldGetNext ? 1 : -1;\n if (isCycleAllowed) {\n index = (index + listLength) % listLength;\n }\n return list[Math.max(0, Math.min(index, listLength - 1))];\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/;\nconst stripNameRegex = /\\..*/;\nconst stripUidRegex = /::\\d+$/;\nconst eventRegistry = {}; // Events storage\nlet uidEvent = 1;\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n};\nconst nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);\n\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;\n}\nfunction getElementEvents(element) {\n const uid = makeEventUid(element);\n element.uidEvent = uid;\n eventRegistry[uid] = eventRegistry[uid] || {};\n return eventRegistry[uid];\n}\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n hydrateObj(event, {\n delegateTarget: element\n });\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn);\n }\n return fn.apply(element, [event]);\n };\n}\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector);\n for (let {\n target\n } = event; target && target !== this; target = target.parentNode) {\n for (const domElement of domElements) {\n if (domElement !== target) {\n continue;\n }\n hydrateObj(event, {\n delegateTarget: target\n });\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn);\n }\n return fn.apply(target, [event]);\n }\n }\n };\n}\nfunction findHandler(events, callable, delegationSelector = null) {\n return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector);\n}\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string';\n // TODO: tooltip passes `false` instead of selector, so we need to check\n const callable = isDelegated ? delegationFunction : handler || delegationFunction;\n let typeEvent = getTypeEvent(originalTypeEvent);\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent;\n }\n return [isDelegated, callable, typeEvent];\n}\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return;\n }\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {\n return fn.call(this, event);\n }\n };\n };\n callable = wrapFunction(callable);\n }\n const events = getElementEvents(element);\n const handlers = events[typeEvent] || (events[typeEvent] = {});\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff;\n return;\n }\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''));\n const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);\n fn.delegationSelector = isDelegated ? handler : null;\n fn.callable = callable;\n fn.oneOff = oneOff;\n fn.uidEvent = uid;\n handlers[uid] = fn;\n element.addEventListener(typeEvent, fn, isDelegated);\n}\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector);\n if (!fn) {\n return;\n }\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));\n delete events[typeEvent][fn.uidEvent];\n}\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {};\n for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n }\n }\n}\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '');\n return customEvents[event] || event;\n}\nconst EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false);\n },\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true);\n },\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return;\n }\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n const inNamespace = typeEvent !== originalTypeEvent;\n const events = getElementEvents(element);\n const storeElementEvent = events[typeEvent] || {};\n const isNamespace = originalTypeEvent.startsWith('.');\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return;\n }\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);\n return;\n }\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));\n }\n }\n for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '');\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n }\n }\n },\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null;\n }\n const $ = getjQuery();\n const typeEvent = getTypeEvent(event);\n const inNamespace = event !== typeEvent;\n let jQueryEvent = null;\n let bubbles = true;\n let nativeDispatch = true;\n let defaultPrevented = false;\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args);\n $(element).trigger(jQueryEvent);\n bubbles = !jQueryEvent.isPropagationStopped();\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();\n defaultPrevented = jQueryEvent.isDefaultPrevented();\n }\n const evt = hydrateObj(new Event(event, {\n bubbles,\n cancelable: true\n }), args);\n if (defaultPrevented) {\n evt.preventDefault();\n }\n if (nativeDispatch) {\n element.dispatchEvent(evt);\n }\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault();\n }\n return evt;\n }\n};\nfunction hydrateObj(obj, meta = {}) {\n for (const [key, value] of Object.entries(meta)) {\n try {\n obj[key] = value;\n } catch (_unused) {\n Object.defineProperty(obj, key, {\n configurable: true,\n get() {\n return value;\n }\n });\n }\n }\n return obj;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n if (value === 'true') {\n return true;\n }\n if (value === 'false') {\n return false;\n }\n if (value === Number(value).toString()) {\n return Number(value);\n }\n if (value === '' || value === 'null') {\n return null;\n }\n if (typeof value !== 'string') {\n return value;\n }\n try {\n return JSON.parse(decodeURIComponent(value));\n } catch (_unused) {\n return value;\n }\n}\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);\n}\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);\n },\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);\n },\n getDataAttributes(element) {\n if (!element) {\n return {};\n }\n const attributes = {};\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'));\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '');\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1);\n attributes[pureKey] = normalizeData(element.dataset[key]);\n }\n return attributes;\n },\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {};\n }\n static get DefaultType() {\n return {};\n }\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!');\n }\n _getConfig(config) {\n config = this._mergeConfigObj(config);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n _configAfterMerge(config) {\n return config;\n }\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse\n\n return {\n ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n };\n }\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const [property, expectedTypes] of Object.entries(configTypes)) {\n const value = config[property];\n const valueType = isElement(value) ? 'element' : toType(value);\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`);\n }\n }\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst VERSION = '5.3.8';\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super();\n element = getElement(element);\n if (!element) {\n return;\n }\n this._element = element;\n this._config = this._getConfig(config);\n Data.set(this._element, this.constructor.DATA_KEY, this);\n }\n\n // Public\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY);\n EventHandler.off(this._element, this.constructor.EVENT_KEY);\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null;\n }\n }\n\n // Private\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated);\n }\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n\n // Static\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY);\n }\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);\n }\n static get VERSION() {\n return VERSION;\n }\n static get DATA_KEY() {\n return `bs.${this.NAME}`;\n }\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`;\n }\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target');\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href');\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {\n return null;\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`;\n }\n selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null;\n }\n return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null;\n};\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector));\n },\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector);\n },\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector));\n },\n parents(element, selector) {\n const parents = [];\n let ancestor = element.parentNode.closest(selector);\n while (ancestor) {\n parents.push(ancestor);\n ancestor = ancestor.parentNode.closest(selector);\n }\n return parents;\n },\n prev(element, selector) {\n let previous = element.previousElementSibling;\n while (previous) {\n if (previous.matches(selector)) {\n return [previous];\n }\n previous = previous.previousElementSibling;\n }\n return [];\n },\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling;\n while (next) {\n if (next.matches(selector)) {\n return [next];\n }\n next = next.nextElementSibling;\n }\n return [];\n },\n focusableChildren(element) {\n const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable=\"true\"]'].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',');\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));\n },\n getSelectorFromElement(element) {\n const selector = getSelector(element);\n if (selector) {\n return SelectorEngine.findOne(selector) ? selector : null;\n }\n return null;\n },\n getElementFromSelector(element) {\n const selector = getSelector(element);\n return selector ? SelectorEngine.findOne(selector) : null;\n },\n getMultipleElementsFromSelector(element) {\n const selector = getSelector(element);\n return selector ? SelectorEngine.find(selector) : [];\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`;\n const name = component.NAME;\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n if (isDisabled(this)) {\n return;\n }\n const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`);\n const instance = component.getOrCreateInstance(target);\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]();\n });\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$f = 'alert';\nconst DATA_KEY$a = 'bs.alert';\nconst EVENT_KEY$b = `.${DATA_KEY$a}`;\nconst EVENT_CLOSE = `close${EVENT_KEY$b}`;\nconst EVENT_CLOSED = `closed${EVENT_KEY$b}`;\nconst CLASS_NAME_FADE$5 = 'fade';\nconst CLASS_NAME_SHOW$8 = 'show';\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME$f;\n }\n\n // Public\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);\n if (closeEvent.defaultPrevented) {\n return;\n }\n this._element.classList.remove(CLASS_NAME_SHOW$8);\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated);\n }\n\n // Private\n _destroyElement() {\n this._element.remove();\n EventHandler.trigger(this._element, EVENT_CLOSED);\n this.dispose();\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this);\n if (typeof config !== 'string') {\n return;\n }\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](this);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close');\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$e = 'button';\nconst DATA_KEY$9 = 'bs.button';\nconst EVENT_KEY$a = `.${DATA_KEY$9}`;\nconst DATA_API_KEY$6 = '.data-api';\nconst CLASS_NAME_ACTIVE$3 = 'active';\nconst SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle=\"button\"]';\nconst EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME$e;\n }\n\n // Public\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3));\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this);\n if (config === 'toggle') {\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => {\n event.preventDefault();\n const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);\n const data = Button.getOrCreateInstance(button);\n data.toggle();\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$d = 'swipe';\nconst EVENT_KEY$9 = '.bs.swipe';\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`;\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`;\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`;\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`;\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`;\nconst POINTER_TYPE_TOUCH = 'touch';\nconst POINTER_TYPE_PEN = 'pen';\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event';\nconst SWIPE_THRESHOLD = 40;\nconst Default$c = {\n endCallback: null,\n leftCallback: null,\n rightCallback: null\n};\nconst DefaultType$c = {\n endCallback: '(function|null)',\n leftCallback: '(function|null)',\n rightCallback: '(function|null)'\n};\n\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n constructor(element, config) {\n super();\n this._element = element;\n if (!element || !Swipe.isSupported()) {\n return;\n }\n this._config = this._getConfig(config);\n this._deltaX = 0;\n this._supportPointerEvents = Boolean(window.PointerEvent);\n this._initEvents();\n }\n\n // Getters\n static get Default() {\n return Default$c;\n }\n static get DefaultType() {\n return DefaultType$c;\n }\n static get NAME() {\n return NAME$d;\n }\n\n // Public\n dispose() {\n EventHandler.off(this._element, EVENT_KEY$9);\n }\n\n // Private\n _start(event) {\n if (!this._supportPointerEvents) {\n this._deltaX = event.touches[0].clientX;\n return;\n }\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX;\n }\n }\n _end(event) {\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX - this._deltaX;\n }\n this._handleSwipe();\n execute(this._config.endCallback);\n }\n _move(event) {\n this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX;\n }\n _handleSwipe() {\n const absDeltaX = Math.abs(this._deltaX);\n if (absDeltaX <= SWIPE_THRESHOLD) {\n return;\n }\n const direction = absDeltaX / this._deltaX;\n this._deltaX = 0;\n if (!direction) {\n return;\n }\n execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback);\n }\n _initEvents() {\n if (this._supportPointerEvents) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event));\n EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event));\n this._element.classList.add(CLASS_NAME_POINTER_EVENT);\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event));\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event));\n EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event));\n }\n }\n _eventIsPointerPenTouch(event) {\n return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);\n }\n\n // Static\n static isSupported() {\n return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$c = 'carousel';\nconst DATA_KEY$8 = 'bs.carousel';\nconst EVENT_KEY$8 = `.${DATA_KEY$8}`;\nconst DATA_API_KEY$5 = '.data-api';\nconst ARROW_LEFT_KEY$1 = 'ArrowLeft';\nconst ARROW_RIGHT_KEY$1 = 'ArrowRight';\nconst TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next';\nconst ORDER_PREV = 'prev';\nconst DIRECTION_LEFT = 'left';\nconst DIRECTION_RIGHT = 'right';\nconst EVENT_SLIDE = `slide${EVENT_KEY$8}`;\nconst EVENT_SLID = `slid${EVENT_KEY$8}`;\nconst EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$8}`;\nconst EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$8}`;\nconst EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$8}`;\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY$8}`;\nconst EVENT_LOAD_DATA_API$3 = `load${EVENT_KEY$8}${DATA_API_KEY$5}`;\nconst EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`;\nconst CLASS_NAME_CAROUSEL = 'carousel';\nconst CLASS_NAME_ACTIVE$2 = 'active';\nconst CLASS_NAME_SLIDE = 'slide';\nconst CLASS_NAME_END = 'carousel-item-end';\nconst CLASS_NAME_START = 'carousel-item-start';\nconst CLASS_NAME_NEXT = 'carousel-item-next';\nconst CLASS_NAME_PREV = 'carousel-item-prev';\nconst SELECTOR_ACTIVE = '.active';\nconst SELECTOR_ITEM = '.carousel-item';\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM;\nconst SELECTOR_ITEM_IMG = '.carousel-item img';\nconst SELECTOR_INDICATORS = '.carousel-indicators';\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]';\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY$1]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY$1]: DIRECTION_LEFT\n};\nconst Default$b = {\n interval: 5000,\n keyboard: true,\n pause: 'hover',\n ride: false,\n touch: true,\n wrap: true\n};\nconst DefaultType$b = {\n interval: '(number|boolean)',\n // TODO:v6 remove boolean support\n keyboard: 'boolean',\n pause: '(string|boolean)',\n ride: '(boolean|string)',\n touch: 'boolean',\n wrap: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._interval = null;\n this._activeElement = null;\n this._isSliding = false;\n this.touchTimeout = null;\n this._swipeHelper = null;\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);\n this._addEventListeners();\n if (this._config.ride === CLASS_NAME_CAROUSEL) {\n this.cycle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$b;\n }\n static get DefaultType() {\n return DefaultType$b;\n }\n static get NAME() {\n return NAME$c;\n }\n\n // Public\n next() {\n this._slide(ORDER_NEXT);\n }\n nextWhenVisible() {\n // FIXME TODO use `document.visibilityState`\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next();\n }\n }\n prev() {\n this._slide(ORDER_PREV);\n }\n pause() {\n if (this._isSliding) {\n triggerTransitionEnd(this._element);\n }\n this._clearInterval();\n }\n cycle() {\n this._clearInterval();\n this._updateInterval();\n this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval);\n }\n _maybeEnableCycle() {\n if (!this._config.ride) {\n return;\n }\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.cycle());\n return;\n }\n this.cycle();\n }\n to(index) {\n const items = this._getItems();\n if (index > items.length - 1 || index < 0) {\n return;\n }\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index));\n return;\n }\n const activeIndex = this._getItemIndex(this._getActive());\n if (activeIndex === index) {\n return;\n }\n const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;\n this._slide(order, items[index]);\n }\n dispose() {\n if (this._swipeHelper) {\n this._swipeHelper.dispose();\n }\n super.dispose();\n }\n\n // Private\n _configAfterMerge(config) {\n config.defaultInterval = config.interval;\n return config;\n }\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN$1, event => this._keydown(event));\n }\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER$1, () => this.pause());\n EventHandler.on(this._element, EVENT_MOUSELEAVE$1, () => this._maybeEnableCycle());\n }\n if (this._config.touch && Swipe.isSupported()) {\n this._addTouchEventListeners();\n }\n }\n _addTouchEventListeners() {\n for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault());\n }\n const endCallBack = () => {\n if (this._config.pause !== 'hover') {\n return;\n }\n\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause();\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout);\n }\n this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval);\n };\n const swipeConfig = {\n leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n endCallback: endCallBack\n };\n this._swipeHelper = new Swipe(this._element, swipeConfig);\n }\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return;\n }\n const direction = KEY_TO_DIRECTION[event.key];\n if (direction) {\n event.preventDefault();\n this._slide(this._directionToOrder(direction));\n }\n }\n _getItemIndex(element) {\n return this._getItems().indexOf(element);\n }\n _setActiveIndicatorElement(index) {\n if (!this._indicatorsElement) {\n return;\n }\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement);\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);\n activeIndicator.removeAttribute('aria-current');\n const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement);\n if (newActiveIndicator) {\n newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2);\n newActiveIndicator.setAttribute('aria-current', 'true');\n }\n }\n _updateInterval() {\n const element = this._activeElement || this._getActive();\n if (!element) {\n return;\n }\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);\n this._config.interval = elementInterval || this._config.defaultInterval;\n }\n _slide(order, element = null) {\n if (this._isSliding) {\n return;\n }\n const activeElement = this._getActive();\n const isNext = order === ORDER_NEXT;\n const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap);\n if (nextElement === activeElement) {\n return;\n }\n const nextElementIndex = this._getItemIndex(nextElement);\n const triggerEvent = eventName => {\n return EventHandler.trigger(this._element, eventName, {\n relatedTarget: nextElement,\n direction: this._orderToDirection(order),\n from: this._getItemIndex(activeElement),\n to: nextElementIndex\n });\n };\n const slideEvent = triggerEvent(EVENT_SLIDE);\n if (slideEvent.defaultPrevented) {\n return;\n }\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n // TODO: change tests that use empty divs to avoid this check\n return;\n }\n const isCycling = Boolean(this._interval);\n this.pause();\n this._isSliding = true;\n this._setActiveIndicatorElement(nextElementIndex);\n this._activeElement = nextElement;\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;\n nextElement.classList.add(orderClassName);\n reflow(nextElement);\n activeElement.classList.add(directionalClassName);\n nextElement.classList.add(directionalClassName);\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName);\n nextElement.classList.add(CLASS_NAME_ACTIVE$2);\n activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);\n this._isSliding = false;\n triggerEvent(EVENT_SLID);\n };\n this._queueCallback(completeCallBack, activeElement, this._isAnimated());\n if (isCycling) {\n this.cycle();\n }\n }\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_SLIDE);\n }\n _getActive() {\n return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n }\n _getItems() {\n return SelectorEngine.find(SELECTOR_ITEM, this._element);\n }\n _clearInterval() {\n if (this._interval) {\n clearInterval(this._interval);\n this._interval = null;\n }\n }\n _directionToOrder(direction) {\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;\n }\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;\n }\n _orderToDirection(order) {\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Carousel.getOrCreateInstance(this, config);\n if (typeof config === 'number') {\n data.to(config);\n return;\n }\n if (typeof config === 'string') {\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return;\n }\n event.preventDefault();\n const carousel = Carousel.getOrCreateInstance(target);\n const slideIndex = this.getAttribute('data-bs-slide-to');\n if (slideIndex) {\n carousel.to(slideIndex);\n carousel._maybeEnableCycle();\n return;\n }\n if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n carousel.next();\n carousel._maybeEnableCycle();\n return;\n }\n carousel.prev();\n carousel._maybeEnableCycle();\n});\nEventHandler.on(window, EVENT_LOAD_DATA_API$3, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);\n for (const carousel of carousels) {\n Carousel.getOrCreateInstance(carousel);\n }\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$b = 'collapse';\nconst DATA_KEY$7 = 'bs.collapse';\nconst EVENT_KEY$7 = `.${DATA_KEY$7}`;\nconst DATA_API_KEY$4 = '.data-api';\nconst EVENT_SHOW$6 = `show${EVENT_KEY$7}`;\nconst EVENT_SHOWN$6 = `shown${EVENT_KEY$7}`;\nconst EVENT_HIDE$6 = `hide${EVENT_KEY$7}`;\nconst EVENT_HIDDEN$6 = `hidden${EVENT_KEY$7}`;\nconst EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`;\nconst CLASS_NAME_SHOW$7 = 'show';\nconst CLASS_NAME_COLLAPSE = 'collapse';\nconst CLASS_NAME_COLLAPSING = 'collapsing';\nconst CLASS_NAME_COLLAPSED = 'collapsed';\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal';\nconst WIDTH = 'width';\nconst HEIGHT = 'height';\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';\nconst SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle=\"collapse\"]';\nconst Default$a = {\n parent: null,\n toggle: true\n};\nconst DefaultType$a = {\n parent: '(null|element)',\n toggle: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._isTransitioning = false;\n this._triggerArray = [];\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);\n for (const elem of toggleList) {\n const selector = SelectorEngine.getSelectorFromElement(elem);\n const filterElement = SelectorEngine.find(selector).filter(foundElement => foundElement === this._element);\n if (selector !== null && filterElement.length) {\n this._triggerArray.push(elem);\n }\n }\n this._initializeChildren();\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());\n }\n if (this._config.toggle) {\n this.toggle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$a;\n }\n static get DefaultType() {\n return DefaultType$a;\n }\n static get NAME() {\n return NAME$b;\n }\n\n // Public\n toggle() {\n if (this._isShown()) {\n this.hide();\n } else {\n this.show();\n }\n }\n show() {\n if (this._isTransitioning || this._isShown()) {\n return;\n }\n let activeChildren = [];\n\n // find active children\n if (this._config.parent) {\n activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element => element !== this._element).map(element => Collapse.getOrCreateInstance(element, {\n toggle: false\n }));\n }\n if (activeChildren.length && activeChildren[0]._isTransitioning) {\n return;\n }\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$6);\n if (startEvent.defaultPrevented) {\n return;\n }\n for (const activeInstance of activeChildren) {\n activeInstance.hide();\n }\n const dimension = this._getDimension();\n this._element.classList.remove(CLASS_NAME_COLLAPSE);\n this._element.classList.add(CLASS_NAME_COLLAPSING);\n this._element.style[dimension] = 0;\n this._addAriaAndCollapsedClass(this._triggerArray, true);\n this._isTransitioning = true;\n const complete = () => {\n this._isTransitioning = false;\n this._element.classList.remove(CLASS_NAME_COLLAPSING);\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n this._element.style[dimension] = '';\n EventHandler.trigger(this._element, EVENT_SHOWN$6);\n };\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n const scrollSize = `scroll${capitalizedDimension}`;\n this._queueCallback(complete, this._element, true);\n this._element.style[dimension] = `${this._element[scrollSize]}px`;\n }\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return;\n }\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$6);\n if (startEvent.defaultPrevented) {\n return;\n }\n const dimension = this._getDimension();\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;\n reflow(this._element);\n this._element.classList.add(CLASS_NAME_COLLAPSING);\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n for (const trigger of this._triggerArray) {\n const element = SelectorEngine.getElementFromSelector(trigger);\n if (element && !this._isShown(element)) {\n this._addAriaAndCollapsedClass([trigger], false);\n }\n }\n this._isTransitioning = true;\n const complete = () => {\n this._isTransitioning = false;\n this._element.classList.remove(CLASS_NAME_COLLAPSING);\n this._element.classList.add(CLASS_NAME_COLLAPSE);\n EventHandler.trigger(this._element, EVENT_HIDDEN$6);\n };\n this._element.style[dimension] = '';\n this._queueCallback(complete, this._element, true);\n }\n\n // Private\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW$7);\n }\n _configAfterMerge(config) {\n config.toggle = Boolean(config.toggle); // Coerce string values\n config.parent = getElement(config.parent);\n return config;\n }\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;\n }\n _initializeChildren() {\n if (!this._config.parent) {\n return;\n }\n const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);\n for (const element of children) {\n const selected = SelectorEngine.getElementFromSelector(element);\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected));\n }\n }\n }\n _getFirstLevelChildren(selector) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);\n // remove children if greater depth\n return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element));\n }\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return;\n }\n for (const element of triggerArray) {\n element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);\n element.setAttribute('aria-expanded', isOpen);\n }\n }\n\n // Static\n static jQueryInterface(config) {\n const _config = {};\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false;\n }\n return this.each(function () {\n const data = Collapse.getOrCreateInstance(this, _config);\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) {\n // preventDefault only for
      elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {\n event.preventDefault();\n }\n for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n Collapse.getOrCreateInstance(element, {\n toggle: false\n }).toggle();\n }\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$a = 'dropdown';\nconst DATA_KEY$6 = 'bs.dropdown';\nconst EVENT_KEY$6 = `.${DATA_KEY$6}`;\nconst DATA_API_KEY$3 = '.data-api';\nconst ESCAPE_KEY$2 = 'Escape';\nconst TAB_KEY$1 = 'Tab';\nconst ARROW_UP_KEY$1 = 'ArrowUp';\nconst ARROW_DOWN_KEY$1 = 'ArrowDown';\nconst RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE$5 = `hide${EVENT_KEY$6}`;\nconst EVENT_HIDDEN$5 = `hidden${EVENT_KEY$6}`;\nconst EVENT_SHOW$5 = `show${EVENT_KEY$6}`;\nconst EVENT_SHOWN$5 = `shown${EVENT_KEY$6}`;\nconst EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst CLASS_NAME_SHOW$6 = 'show';\nconst CLASS_NAME_DROPUP = 'dropup';\nconst CLASS_NAME_DROPEND = 'dropend';\nconst CLASS_NAME_DROPSTART = 'dropstart';\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center';\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center';\nconst SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)';\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`;\nconst SELECTOR_MENU = '.dropdown-menu';\nconst SELECTOR_NAVBAR = '.navbar';\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav';\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';\nconst PLACEMENT_TOPCENTER = 'top';\nconst PLACEMENT_BOTTOMCENTER = 'bottom';\nconst Default$9 = {\n autoClose: true,\n boundary: 'clippingParents',\n display: 'dynamic',\n offset: [0, 2],\n popperConfig: null,\n reference: 'toggle'\n};\nconst DefaultType$9 = {\n autoClose: '(boolean|string)',\n boundary: '(string|element)',\n display: 'string',\n offset: '(array|string|function)',\n popperConfig: '(null|object|function)',\n reference: '(string|element|object)'\n};\n\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._popper = null;\n this._parent = this._element.parentNode; // dropdown wrapper\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent);\n this._inNavbar = this._detectNavbar();\n }\n\n // Getters\n static get Default() {\n return Default$9;\n }\n static get DefaultType() {\n return DefaultType$9;\n }\n static get NAME() {\n return NAME$a;\n }\n\n // Public\n toggle() {\n return this._isShown() ? this.hide() : this.show();\n }\n show() {\n if (isDisabled(this._element) || this._isShown()) {\n return;\n }\n const relatedTarget = {\n relatedTarget: this._element\n };\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$5, relatedTarget);\n if (showEvent.defaultPrevented) {\n return;\n }\n this._createPopper();\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop);\n }\n }\n this._element.focus();\n this._element.setAttribute('aria-expanded', true);\n this._menu.classList.add(CLASS_NAME_SHOW$6);\n this._element.classList.add(CLASS_NAME_SHOW$6);\n EventHandler.trigger(this._element, EVENT_SHOWN$5, relatedTarget);\n }\n hide() {\n if (isDisabled(this._element) || !this._isShown()) {\n return;\n }\n const relatedTarget = {\n relatedTarget: this._element\n };\n this._completeHide(relatedTarget);\n }\n dispose() {\n if (this._popper) {\n this._popper.destroy();\n }\n super.dispose();\n }\n update() {\n this._inNavbar = this._detectNavbar();\n if (this._popper) {\n this._popper.update();\n }\n }\n\n // Private\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$5, relatedTarget);\n if (hideEvent.defaultPrevented) {\n return;\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop);\n }\n }\n if (this._popper) {\n this._popper.destroy();\n }\n this._menu.classList.remove(CLASS_NAME_SHOW$6);\n this._element.classList.remove(CLASS_NAME_SHOW$6);\n this._element.setAttribute('aria-expanded', 'false');\n Manipulator.removeDataAttribute(this._menu, 'popper');\n EventHandler.trigger(this._element, EVENT_HIDDEN$5, relatedTarget);\n }\n _getConfig(config) {\n config = super._getConfig(config);\n if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME$a.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`);\n }\n return config;\n }\n _createPopper() {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org/docs/v2/)');\n }\n let referenceElement = this._element;\n if (this._config.reference === 'parent') {\n referenceElement = this._parent;\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference);\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference;\n }\n const popperConfig = this._getPopperConfig();\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig);\n }\n _isShown() {\n return this._menu.classList.contains(CLASS_NAME_SHOW$6);\n }\n _getPlacement() {\n const parentDropdown = this._parent;\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n return PLACEMENT_TOPCENTER;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n return PLACEMENT_BOTTOMCENTER;\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;\n }\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;\n }\n _detectNavbar() {\n return this._element.closest(SELECTOR_NAVBAR) !== null;\n }\n _getOffset() {\n const {\n offset\n } = this._config;\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10));\n }\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element);\n }\n return offset;\n }\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n }, {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n };\n\n // Disable Popper if we have a static display or Dropdown is in Navbar\n if (this._inNavbar || this._config.display === 'static') {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // TODO: v6 remove\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }];\n }\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [undefined, defaultBsPopperConfig])\n };\n }\n _selectMenuItem({\n key,\n target\n }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element));\n if (!items.length) {\n return;\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY$1, !items.includes(target)).focus();\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n static clearMenus(event) {\n if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1) {\n return;\n }\n const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);\n for (const toggle of openToggles) {\n const context = Dropdown.getInstance(toggle);\n if (!context || context._config.autoClose === false) {\n continue;\n }\n const composedPath = event.composedPath();\n const isMenuTarget = composedPath.includes(context._menu);\n if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {\n continue;\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue;\n }\n const relatedTarget = {\n relatedTarget: context._element\n };\n if (event.type === 'click') {\n relatedTarget.clickEvent = event;\n }\n context._completeHide(relatedTarget);\n }\n }\n static dataApiKeydownHandler(event) {\n // If not an UP | DOWN | ESCAPE key => not a dropdown command\n // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n const isInput = /input|textarea/i.test(event.target.tagName);\n const isEscapeEvent = event.key === ESCAPE_KEY$2;\n const isUpOrDownEvent = [ARROW_UP_KEY$1, ARROW_DOWN_KEY$1].includes(event.key);\n if (!isUpOrDownEvent && !isEscapeEvent) {\n return;\n }\n if (isInput && !isEscapeEvent) {\n return;\n }\n event.preventDefault();\n\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3, event.delegateTarget.parentNode);\n const instance = Dropdown.getOrCreateInstance(getToggleButton);\n if (isUpOrDownEvent) {\n event.stopPropagation();\n instance.show();\n instance._selectMenuItem(event);\n return;\n }\n if (instance._isShown()) {\n // else is escape and we check if it is shown\n event.stopPropagation();\n instance.hide();\n getToggleButton.focus();\n }\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);\nEventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);\nEventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {\n event.preventDefault();\n Dropdown.getOrCreateInstance(this).toggle();\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$9 = 'backdrop';\nconst CLASS_NAME_FADE$4 = 'fade';\nconst CLASS_NAME_SHOW$5 = 'show';\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME$9}`;\nconst Default$8 = {\n className: 'modal-backdrop',\n clickCallback: null,\n isAnimated: false,\n isVisible: true,\n // if false, we use the backdrop helper without adding any element to the dom\n rootElement: 'body' // give the choice to place backdrop under different elements\n};\nconst DefaultType$8 = {\n className: 'string',\n clickCallback: '(function|null)',\n isAnimated: 'boolean',\n isVisible: 'boolean',\n rootElement: '(element|string)'\n};\n\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n this._isAppended = false;\n this._element = null;\n }\n\n // Getters\n static get Default() {\n return Default$8;\n }\n static get DefaultType() {\n return DefaultType$8;\n }\n static get NAME() {\n return NAME$9;\n }\n\n // Public\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback);\n return;\n }\n this._append();\n const element = this._getElement();\n if (this._config.isAnimated) {\n reflow(element);\n }\n element.classList.add(CLASS_NAME_SHOW$5);\n this._emulateAnimation(() => {\n execute(callback);\n });\n }\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback);\n return;\n }\n this._getElement().classList.remove(CLASS_NAME_SHOW$5);\n this._emulateAnimation(() => {\n this.dispose();\n execute(callback);\n });\n }\n dispose() {\n if (!this._isAppended) {\n return;\n }\n EventHandler.off(this._element, EVENT_MOUSEDOWN);\n this._element.remove();\n this._isAppended = false;\n }\n\n // Private\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div');\n backdrop.className = this._config.className;\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE$4);\n }\n this._element = backdrop;\n }\n return this._element;\n }\n _configAfterMerge(config) {\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement);\n return config;\n }\n _append() {\n if (this._isAppended) {\n return;\n }\n const element = this._getElement();\n this._config.rootElement.append(element);\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback);\n });\n this._isAppended = true;\n }\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated);\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$8 = 'focustrap';\nconst DATA_KEY$5 = 'bs.focustrap';\nconst EVENT_KEY$5 = `.${DATA_KEY$5}`;\nconst EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$5}`;\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$5}`;\nconst TAB_KEY = 'Tab';\nconst TAB_NAV_FORWARD = 'forward';\nconst TAB_NAV_BACKWARD = 'backward';\nconst Default$7 = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n};\nconst DefaultType$7 = {\n autofocus: 'boolean',\n trapElement: 'element'\n};\n\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n this._isActive = false;\n this._lastTabNavDirection = null;\n }\n\n // Getters\n static get Default() {\n return Default$7;\n }\n static get DefaultType() {\n return DefaultType$7;\n }\n static get NAME() {\n return NAME$8;\n }\n\n // Public\n activate() {\n if (this._isActive) {\n return;\n }\n if (this._config.autofocus) {\n this._config.trapElement.focus();\n }\n EventHandler.off(document, EVENT_KEY$5); // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN$2, event => this._handleFocusin(event));\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));\n this._isActive = true;\n }\n deactivate() {\n if (!this._isActive) {\n return;\n }\n this._isActive = false;\n EventHandler.off(document, EVENT_KEY$5);\n }\n\n // Private\n _handleFocusin(event) {\n const {\n trapElement\n } = this._config;\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return;\n }\n const elements = SelectorEngine.focusableChildren(trapElement);\n if (elements.length === 0) {\n trapElement.focus();\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus();\n } else {\n elements[0].focus();\n }\n }\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return;\n }\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';\nconst SELECTOR_STICKY_CONTENT = '.sticky-top';\nconst PROPERTY_PADDING = 'padding-right';\nconst PROPERTY_MARGIN = 'margin-right';\n\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body;\n }\n\n // Public\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth;\n return Math.abs(window.innerWidth - documentWidth);\n }\n hide() {\n const width = this.getWidth();\n this._disableOverFlow();\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width);\n }\n reset() {\n this._resetElementAttributes(this._element, 'overflow');\n this._resetElementAttributes(this._element, PROPERTY_PADDING);\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);\n }\n isOverflowing() {\n return this.getWidth() > 0;\n }\n\n // Private\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow');\n this._element.style.overflow = 'hidden';\n }\n _setElementAttributes(selector, styleProperty, callback) {\n const scrollbarWidth = this.getWidth();\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return;\n }\n this._saveInitialAttribute(element, styleProperty);\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);\n };\n this._applyManipulationCallback(selector, manipulationCallBack);\n }\n _saveInitialAttribute(element, styleProperty) {\n const actualValue = element.style.getPropertyValue(styleProperty);\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProperty, actualValue);\n }\n }\n _resetElementAttributes(selector, styleProperty) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProperty);\n // We only want to remove the property if the value is `null`; the value can also be zero\n if (value === null) {\n element.style.removeProperty(styleProperty);\n return;\n }\n Manipulator.removeDataAttribute(element, styleProperty);\n element.style.setProperty(styleProperty, value);\n };\n this._applyManipulationCallback(selector, manipulationCallBack);\n }\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector);\n return;\n }\n for (const sel of SelectorEngine.find(selector, this._element)) {\n callBack(sel);\n }\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$7 = 'modal';\nconst DATA_KEY$4 = 'bs.modal';\nconst EVENT_KEY$4 = `.${DATA_KEY$4}`;\nconst DATA_API_KEY$2 = '.data-api';\nconst ESCAPE_KEY$1 = 'Escape';\nconst EVENT_HIDE$4 = `hide${EVENT_KEY$4}`;\nconst EVENT_HIDE_PREVENTED$1 = `hidePrevented${EVENT_KEY$4}`;\nconst EVENT_HIDDEN$4 = `hidden${EVENT_KEY$4}`;\nconst EVENT_SHOW$4 = `show${EVENT_KEY$4}`;\nconst EVENT_SHOWN$4 = `shown${EVENT_KEY$4}`;\nconst EVENT_RESIZE$1 = `resize${EVENT_KEY$4}`;\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$4}`;\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$4}`;\nconst EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$4}`;\nconst EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$4}${DATA_API_KEY$2}`;\nconst CLASS_NAME_OPEN = 'modal-open';\nconst CLASS_NAME_FADE$3 = 'fade';\nconst CLASS_NAME_SHOW$4 = 'show';\nconst CLASS_NAME_STATIC = 'modal-static';\nconst OPEN_SELECTOR$1 = '.modal.show';\nconst SELECTOR_DIALOG = '.modal-dialog';\nconst SELECTOR_MODAL_BODY = '.modal-body';\nconst SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle=\"modal\"]';\nconst Default$6 = {\n backdrop: true,\n focus: true,\n keyboard: true\n};\nconst DefaultType$6 = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n keyboard: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);\n this._backdrop = this._initializeBackDrop();\n this._focustrap = this._initializeFocusTrap();\n this._isShown = false;\n this._isTransitioning = false;\n this._scrollBar = new ScrollBarHelper();\n this._addEventListeners();\n }\n\n // Getters\n static get Default() {\n return Default$6;\n }\n static get DefaultType() {\n return DefaultType$6;\n }\n static get NAME() {\n return NAME$7;\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget);\n }\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, {\n relatedTarget\n });\n if (showEvent.defaultPrevented) {\n return;\n }\n this._isShown = true;\n this._isTransitioning = true;\n this._scrollBar.hide();\n document.body.classList.add(CLASS_NAME_OPEN);\n this._adjustDialog();\n this._backdrop.show(() => this._showElement(relatedTarget));\n }\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4);\n if (hideEvent.defaultPrevented) {\n return;\n }\n this._isShown = false;\n this._isTransitioning = true;\n this._focustrap.deactivate();\n this._element.classList.remove(CLASS_NAME_SHOW$4);\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());\n }\n dispose() {\n EventHandler.off(window, EVENT_KEY$4);\n EventHandler.off(this._dialog, EVENT_KEY$4);\n this._backdrop.dispose();\n this._focustrap.deactivate();\n super.dispose();\n }\n handleUpdate() {\n this._adjustDialog();\n }\n\n // Private\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop),\n // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated()\n });\n }\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n });\n }\n _showElement(relatedTarget) {\n // try to append dynamic modal\n if (!document.body.contains(this._element)) {\n document.body.append(this._element);\n }\n this._element.style.display = 'block';\n this._element.removeAttribute('aria-hidden');\n this._element.setAttribute('aria-modal', true);\n this._element.setAttribute('role', 'dialog');\n this._element.scrollTop = 0;\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);\n if (modalBody) {\n modalBody.scrollTop = 0;\n }\n reflow(this._element);\n this._element.classList.add(CLASS_NAME_SHOW$4);\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate();\n }\n this._isTransitioning = false;\n EventHandler.trigger(this._element, EVENT_SHOWN$4, {\n relatedTarget\n });\n };\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated());\n }\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {\n if (event.key !== ESCAPE_KEY$1) {\n return;\n }\n if (this._config.keyboard) {\n this.hide();\n return;\n }\n this._triggerBackdropTransition();\n });\n EventHandler.on(window, EVENT_RESIZE$1, () => {\n if (this._isShown && !this._isTransitioning) {\n this._adjustDialog();\n }\n });\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n if (this._element !== event.target || this._element !== event2.target) {\n return;\n }\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition();\n return;\n }\n if (this._config.backdrop) {\n this.hide();\n }\n });\n });\n }\n _hideModal() {\n this._element.style.display = 'none';\n this._element.setAttribute('aria-hidden', true);\n this._element.removeAttribute('aria-modal');\n this._element.removeAttribute('role');\n this._isTransitioning = false;\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN);\n this._resetAdjustments();\n this._scrollBar.reset();\n EventHandler.trigger(this._element, EVENT_HIDDEN$4);\n });\n }\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE$3);\n }\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED$1);\n if (hideEvent.defaultPrevented) {\n return;\n }\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n const initialOverflowY = this._element.style.overflowY;\n // return if the following background transition hasn't yet completed\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n return;\n }\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden';\n }\n this._element.classList.add(CLASS_NAME_STATIC);\n this._queueCallback(() => {\n this._element.classList.remove(CLASS_NAME_STATIC);\n this._queueCallback(() => {\n this._element.style.overflowY = initialOverflowY;\n }, this._dialog);\n }, this._dialog);\n this._element.focus();\n }\n\n /**\n * The following methods are used to handle overflowing modals\n */\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n const scrollbarWidth = this._scrollBar.getWidth();\n const isBodyOverflowing = scrollbarWidth > 0;\n if (isBodyOverflowing && !isModalOverflowing) {\n const property = isRTL() ? 'paddingLeft' : 'paddingRight';\n this._element.style[property] = `${scrollbarWidth}px`;\n }\n if (!isBodyOverflowing && isModalOverflowing) {\n const property = isRTL() ? 'paddingRight' : 'paddingLeft';\n this._element.style[property] = `${scrollbarWidth}px`;\n }\n }\n _resetAdjustments() {\n this._element.style.paddingLeft = '';\n this._element.style.paddingRight = '';\n }\n\n // Static\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](relatedTarget);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n EventHandler.one(target, EVENT_SHOW$4, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return;\n }\n EventHandler.one(target, EVENT_HIDDEN$4, () => {\n if (isVisible(this)) {\n this.focus();\n }\n });\n });\n\n // avoid conflict when clicking modal toggler while another one is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);\n if (alreadyOpen) {\n Modal.getInstance(alreadyOpen).hide();\n }\n const data = Modal.getOrCreateInstance(target);\n data.toggle(this);\n});\nenableDismissTrigger(Modal);\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$6 = 'offcanvas';\nconst DATA_KEY$3 = 'bs.offcanvas';\nconst EVENT_KEY$3 = `.${DATA_KEY$3}`;\nconst DATA_API_KEY$1 = '.data-api';\nconst EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$3}${DATA_API_KEY$1}`;\nconst ESCAPE_KEY = 'Escape';\nconst CLASS_NAME_SHOW$3 = 'show';\nconst CLASS_NAME_SHOWING$1 = 'showing';\nconst CLASS_NAME_HIDING = 'hiding';\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop';\nconst OPEN_SELECTOR = '.offcanvas.show';\nconst EVENT_SHOW$3 = `show${EVENT_KEY$3}`;\nconst EVENT_SHOWN$3 = `shown${EVENT_KEY$3}`;\nconst EVENT_HIDE$3 = `hide${EVENT_KEY$3}`;\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$3}`;\nconst EVENT_HIDDEN$3 = `hidden${EVENT_KEY$3}`;\nconst EVENT_RESIZE = `resize${EVENT_KEY$3}`;\nconst EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$3}${DATA_API_KEY$1}`;\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$3}`;\nconst SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle=\"offcanvas\"]';\nconst Default$5 = {\n backdrop: true,\n keyboard: true,\n scroll: false\n};\nconst DefaultType$5 = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n scroll: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._isShown = false;\n this._backdrop = this._initializeBackDrop();\n this._focustrap = this._initializeFocusTrap();\n this._addEventListeners();\n }\n\n // Getters\n static get Default() {\n return Default$5;\n }\n static get DefaultType() {\n return DefaultType$5;\n }\n static get NAME() {\n return NAME$6;\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget);\n }\n show(relatedTarget) {\n if (this._isShown) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {\n relatedTarget\n });\n if (showEvent.defaultPrevented) {\n return;\n }\n this._isShown = true;\n this._backdrop.show();\n if (!this._config.scroll) {\n new ScrollBarHelper().hide();\n }\n this._element.setAttribute('aria-modal', true);\n this._element.setAttribute('role', 'dialog');\n this._element.classList.add(CLASS_NAME_SHOWING$1);\n const completeCallBack = () => {\n if (!this._config.scroll || this._config.backdrop) {\n this._focustrap.activate();\n }\n this._element.classList.add(CLASS_NAME_SHOW$3);\n this._element.classList.remove(CLASS_NAME_SHOWING$1);\n EventHandler.trigger(this._element, EVENT_SHOWN$3, {\n relatedTarget\n });\n };\n this._queueCallback(completeCallBack, this._element, true);\n }\n hide() {\n if (!this._isShown) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);\n if (hideEvent.defaultPrevented) {\n return;\n }\n this._focustrap.deactivate();\n this._element.blur();\n this._isShown = false;\n this._element.classList.add(CLASS_NAME_HIDING);\n this._backdrop.hide();\n const completeCallback = () => {\n this._element.classList.remove(CLASS_NAME_SHOW$3, CLASS_NAME_HIDING);\n this._element.removeAttribute('aria-modal');\n this._element.removeAttribute('role');\n if (!this._config.scroll) {\n new ScrollBarHelper().reset();\n }\n EventHandler.trigger(this._element, EVENT_HIDDEN$3);\n };\n this._queueCallback(completeCallback, this._element, true);\n }\n dispose() {\n this._backdrop.dispose();\n this._focustrap.deactivate();\n super.dispose();\n }\n\n // Private\n _initializeBackDrop() {\n const clickCallback = () => {\n if (this._config.backdrop === 'static') {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n return;\n }\n this.hide();\n };\n\n // 'static' option will be translated to true, and booleans will keep their value\n const isVisible = Boolean(this._config.backdrop);\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: isVisible ? clickCallback : null\n });\n }\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n });\n }\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return;\n }\n if (this._config.keyboard) {\n this.hide();\n return;\n }\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n });\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](this);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n if (isDisabled(this)) {\n return;\n }\n EventHandler.one(target, EVENT_HIDDEN$3, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus();\n }\n });\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);\n if (alreadyOpen && alreadyOpen !== target) {\n Offcanvas.getInstance(alreadyOpen).hide();\n }\n const data = Offcanvas.getOrCreateInstance(target);\n data.toggle(this);\n});\nEventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {\n for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n Offcanvas.getOrCreateInstance(selector).show();\n }\n});\nEventHandler.on(window, EVENT_RESIZE, () => {\n for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n if (getComputedStyle(element).position !== 'fixed') {\n Offcanvas.getOrCreateInstance(element).hide();\n }\n }\n});\nenableDismissTrigger(Offcanvas);\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n// js-docs-start allow-list\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\nconst DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n dd: [],\n div: [],\n dl: [],\n dt: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n};\n// js-docs-end allow-list\n\nconst uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);\n\n/**\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n * contexts.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n */\nconst SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i;\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase();\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue));\n }\n return true;\n }\n\n // Check if a regular expression validates the attribute.\n return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName));\n};\nfunction sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n if (!unsafeHtml.length) {\n return unsafeHtml;\n }\n if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n return sanitizeFunction(unsafeHtml);\n }\n const domParser = new window.DOMParser();\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'));\n for (const element of elements) {\n const elementName = element.nodeName.toLowerCase();\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove();\n continue;\n }\n const attributeList = [].concat(...element.attributes);\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);\n for (const attribute of attributeList) {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName);\n }\n }\n }\n return createdDocument.body.innerHTML;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$5 = 'TemplateFactory';\nconst Default$4 = {\n allowList: DefaultAllowlist,\n content: {},\n // { selector : text , selector2 : text2 , }\n extraClass: '',\n html: false,\n sanitize: true,\n sanitizeFn: null,\n template: '
      '\n};\nconst DefaultType$4 = {\n allowList: 'object',\n content: 'object',\n extraClass: '(string|function)',\n html: 'boolean',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n template: 'string'\n};\nconst DefaultContentType = {\n entry: '(string|element|function|null)',\n selector: '(string|element)'\n};\n\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n }\n\n // Getters\n static get Default() {\n return Default$4;\n }\n static get DefaultType() {\n return DefaultType$4;\n }\n static get NAME() {\n return NAME$5;\n }\n\n // Public\n getContent() {\n return Object.values(this._config.content).map(config => this._resolvePossibleFunction(config)).filter(Boolean);\n }\n hasContent() {\n return this.getContent().length > 0;\n }\n changeContent(content) {\n this._checkContent(content);\n this._config.content = {\n ...this._config.content,\n ...content\n };\n return this;\n }\n toHtml() {\n const templateWrapper = document.createElement('div');\n templateWrapper.innerHTML = this._maybeSanitize(this._config.template);\n for (const [selector, text] of Object.entries(this._config.content)) {\n this._setContent(templateWrapper, text, selector);\n }\n const template = templateWrapper.children[0];\n const extraClass = this._resolvePossibleFunction(this._config.extraClass);\n if (extraClass) {\n template.classList.add(...extraClass.split(' '));\n }\n return template;\n }\n\n // Private\n _typeCheckConfig(config) {\n super._typeCheckConfig(config);\n this._checkContent(config.content);\n }\n _checkContent(arg) {\n for (const [selector, content] of Object.entries(arg)) {\n super._typeCheckConfig({\n selector,\n entry: content\n }, DefaultContentType);\n }\n }\n _setContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template);\n if (!templateElement) {\n return;\n }\n content = this._resolvePossibleFunction(content);\n if (!content) {\n templateElement.remove();\n return;\n }\n if (isElement(content)) {\n this._putElementInTemplate(getElement(content), templateElement);\n return;\n }\n if (this._config.html) {\n templateElement.innerHTML = this._maybeSanitize(content);\n return;\n }\n templateElement.textContent = content;\n }\n _maybeSanitize(arg) {\n return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;\n }\n _resolvePossibleFunction(arg) {\n return execute(arg, [undefined, this]);\n }\n _putElementInTemplate(element, templateElement) {\n if (this._config.html) {\n templateElement.innerHTML = '';\n templateElement.append(element);\n return;\n }\n templateElement.textContent = element.textContent;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$4 = 'tooltip';\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);\nconst CLASS_NAME_FADE$2 = 'fade';\nconst CLASS_NAME_MODAL = 'modal';\nconst CLASS_NAME_SHOW$2 = 'show';\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner';\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;\nconst EVENT_MODAL_HIDE = 'hide.bs.modal';\nconst TRIGGER_HOVER = 'hover';\nconst TRIGGER_FOCUS = 'focus';\nconst TRIGGER_CLICK = 'click';\nconst TRIGGER_MANUAL = 'manual';\nconst EVENT_HIDE$2 = 'hide';\nconst EVENT_HIDDEN$2 = 'hidden';\nconst EVENT_SHOW$2 = 'show';\nconst EVENT_SHOWN$2 = 'shown';\nconst EVENT_INSERTED = 'inserted';\nconst EVENT_CLICK$1 = 'click';\nconst EVENT_FOCUSIN$1 = 'focusin';\nconst EVENT_FOCUSOUT$1 = 'focusout';\nconst EVENT_MOUSEENTER = 'mouseenter';\nconst EVENT_MOUSELEAVE = 'mouseleave';\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n};\nconst Default$3 = {\n allowList: DefaultAllowlist,\n animation: true,\n boundary: 'clippingParents',\n container: false,\n customClass: '',\n delay: 0,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n html: false,\n offset: [0, 6],\n placement: 'top',\n popperConfig: null,\n sanitize: true,\n sanitizeFn: null,\n selector: false,\n template: '
      ' + '
      ' + '
      ' + '
      ',\n title: '',\n trigger: 'hover focus'\n};\nconst DefaultType$3 = {\n allowList: 'object',\n animation: 'boolean',\n boundary: '(string|element)',\n container: '(string|element|boolean)',\n customClass: '(string|function)',\n delay: '(number|object)',\n fallbackPlacements: 'array',\n html: 'boolean',\n offset: '(array|string|function)',\n placement: '(string|function)',\n popperConfig: '(null|object|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n selector: '(string|boolean)',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string'\n};\n\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org/docs/v2/)');\n }\n super(element, config);\n\n // Private\n this._isEnabled = true;\n this._timeout = 0;\n this._isHovered = null;\n this._activeTrigger = {};\n this._popper = null;\n this._templateFactory = null;\n this._newContent = null;\n\n // Protected\n this.tip = null;\n this._setListeners();\n if (!this._config.selector) {\n this._fixTitle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$3;\n }\n static get DefaultType() {\n return DefaultType$3;\n }\n static get NAME() {\n return NAME$4;\n }\n\n // Public\n enable() {\n this._isEnabled = true;\n }\n disable() {\n this._isEnabled = false;\n }\n toggleEnabled() {\n this._isEnabled = !this._isEnabled;\n }\n toggle() {\n if (!this._isEnabled) {\n return;\n }\n if (this._isShown()) {\n this._leave();\n return;\n }\n this._enter();\n }\n dispose() {\n clearTimeout(this._timeout);\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n if (this._element.getAttribute('data-bs-original-title')) {\n this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'));\n }\n this._disposePopper();\n super.dispose();\n }\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements');\n }\n if (!(this._isWithContent() && this._isEnabled)) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW$2));\n const shadowRoot = findShadowRoot(this._element);\n const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element);\n if (showEvent.defaultPrevented || !isInTheDom) {\n return;\n }\n\n // TODO: v6 remove this or make it optional\n this._disposePopper();\n const tip = this._getTipElement();\n this._element.setAttribute('aria-describedby', tip.getAttribute('id'));\n const {\n container\n } = this._config;\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip);\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));\n }\n this._popper = this._createPopper(tip);\n tip.classList.add(CLASS_NAME_SHOW$2);\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop);\n }\n }\n const complete = () => {\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN$2));\n if (this._isHovered === false) {\n this._leave();\n }\n this._isHovered = false;\n };\n this._queueCallback(complete, this.tip, this._isAnimated());\n }\n hide() {\n if (!this._isShown()) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE$2));\n if (hideEvent.defaultPrevented) {\n return;\n }\n const tip = this._getTipElement();\n tip.classList.remove(CLASS_NAME_SHOW$2);\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop);\n }\n }\n this._activeTrigger[TRIGGER_CLICK] = false;\n this._activeTrigger[TRIGGER_FOCUS] = false;\n this._activeTrigger[TRIGGER_HOVER] = false;\n this._isHovered = null; // it is a trick to support manual triggering\n\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return;\n }\n if (!this._isHovered) {\n this._disposePopper();\n }\n this._element.removeAttribute('aria-describedby');\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN$2));\n };\n this._queueCallback(complete, this.tip, this._isAnimated());\n }\n update() {\n if (this._popper) {\n this._popper.update();\n }\n }\n\n // Protected\n _isWithContent() {\n return Boolean(this._getTitle());\n }\n _getTipElement() {\n if (!this.tip) {\n this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());\n }\n return this.tip;\n }\n _createTipElement(content) {\n const tip = this._getTemplateFactory(content).toHtml();\n\n // TODO: remove this check in v6\n if (!tip) {\n return null;\n }\n tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);\n // TODO: v6 the following can be achieved with CSS only\n tip.classList.add(`bs-${this.constructor.NAME}-auto`);\n const tipId = getUID(this.constructor.NAME).toString();\n tip.setAttribute('id', tipId);\n if (this._isAnimated()) {\n tip.classList.add(CLASS_NAME_FADE$2);\n }\n return tip;\n }\n setContent(content) {\n this._newContent = content;\n if (this._isShown()) {\n this._disposePopper();\n this.show();\n }\n }\n _getTemplateFactory(content) {\n if (this._templateFactory) {\n this._templateFactory.changeContent(content);\n } else {\n this._templateFactory = new TemplateFactory({\n ...this._config,\n // the `content` var has to be after `this._config`\n // to override config.content in case of popover\n content,\n extraClass: this._resolvePossibleFunction(this._config.customClass)\n });\n }\n return this._templateFactory;\n }\n _getContentForTemplate() {\n return {\n [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n };\n }\n _getTitle() {\n return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title');\n }\n\n // Private\n _initializeOnDelegatedTarget(event) {\n return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());\n }\n _isAnimated() {\n return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE$2);\n }\n _isShown() {\n return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2);\n }\n _createPopper(tip) {\n const placement = execute(this._config.placement, [this, tip, this._element]);\n const attachment = AttachmentMap[placement.toUpperCase()];\n return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment));\n }\n _getOffset() {\n const {\n offset\n } = this._config;\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10));\n }\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element);\n }\n return offset;\n }\n _resolvePossibleFunction(arg) {\n return execute(arg, [this._element, this._element]);\n }\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [{\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n }, {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }, {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n }, {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n }, {\n name: 'preSetPlacement',\n enabled: true,\n phase: 'beforeMain',\n fn: data => {\n // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n this._getTipElement().setAttribute('data-popper-placement', data.state.placement);\n }\n }]\n };\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [undefined, defaultBsPopperConfig])\n };\n }\n _setListeners() {\n const triggers = this._config.trigger.split(' ');\n for (const trigger of triggers) {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context._activeTrigger[TRIGGER_CLICK] = !(context._isShown() && context._activeTrigger[TRIGGER_CLICK]);\n context.toggle();\n });\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN$1);\n const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT$1);\n EventHandler.on(this._element, eventIn, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;\n context._enter();\n });\n EventHandler.on(this._element, eventOut, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);\n context._leave();\n });\n }\n }\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide();\n }\n };\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n }\n _fixTitle() {\n const title = this._element.getAttribute('title');\n if (!title) {\n return;\n }\n if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n this._element.setAttribute('aria-label', title);\n }\n this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility\n this._element.removeAttribute('title');\n }\n _enter() {\n if (this._isShown() || this._isHovered) {\n this._isHovered = true;\n return;\n }\n this._isHovered = true;\n this._setTimeout(() => {\n if (this._isHovered) {\n this.show();\n }\n }, this._config.delay.show);\n }\n _leave() {\n if (this._isWithActiveTrigger()) {\n return;\n }\n this._isHovered = false;\n this._setTimeout(() => {\n if (!this._isHovered) {\n this.hide();\n }\n }, this._config.delay.hide);\n }\n _setTimeout(handler, timeout) {\n clearTimeout(this._timeout);\n this._timeout = setTimeout(handler, timeout);\n }\n _isWithActiveTrigger() {\n return Object.values(this._activeTrigger).includes(true);\n }\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element);\n for (const dataAttribute of Object.keys(dataAttributes)) {\n if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n delete dataAttributes[dataAttribute];\n }\n }\n config = {\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n };\n config = this._mergeConfigObj(config);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n _configAfterMerge(config) {\n config.container = config.container === false ? document.body : getElement(config.container);\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n };\n }\n if (typeof config.title === 'number') {\n config.title = config.title.toString();\n }\n if (typeof config.content === 'number') {\n config.content = config.content.toString();\n }\n return config;\n }\n _getDelegateConfig() {\n const config = {};\n for (const [key, value] of Object.entries(this._config)) {\n if (this.constructor.Default[key] !== value) {\n config[key] = value;\n }\n }\n config.selector = false;\n config.trigger = 'manual';\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config;\n }\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy();\n this._popper = null;\n }\n if (this.tip) {\n this.tip.remove();\n this.tip = null;\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tooltip);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$3 = 'popover';\nconst SELECTOR_TITLE = '.popover-header';\nconst SELECTOR_CONTENT = '.popover-body';\nconst Default$2 = {\n ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '
      ' + '
      ' + '

      ' + '
      ' + '
      ',\n trigger: 'click'\n};\nconst DefaultType$2 = {\n ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n};\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default$2;\n }\n static get DefaultType() {\n return DefaultType$2;\n }\n static get NAME() {\n return NAME$3;\n }\n\n // Overrides\n _isWithContent() {\n return this._getTitle() || this._getContent();\n }\n\n // Private\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n };\n }\n _getContent() {\n return this._resolvePossibleFunction(this._config.content);\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$2 = 'scrollspy';\nconst DATA_KEY$2 = 'bs.scrollspy';\nconst EVENT_KEY$2 = `.${DATA_KEY$2}`;\nconst DATA_API_KEY = '.data-api';\nconst EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;\nconst EVENT_CLICK = `click${EVENT_KEY$2}`;\nconst EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$2}${DATA_API_KEY}`;\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';\nconst CLASS_NAME_ACTIVE$1 = 'active';\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]';\nconst SELECTOR_TARGET_LINKS = '[href]';\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';\nconst SELECTOR_NAV_LINKS = '.nav-link';\nconst SELECTOR_NAV_ITEMS = '.nav-item';\nconst SELECTOR_LIST_ITEMS = '.list-group-item';\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;\nconst SELECTOR_DROPDOWN = '.dropdown';\nconst SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';\nconst Default$1 = {\n offset: null,\n // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: '0px 0px -25%',\n smoothScroll: false,\n target: null,\n threshold: [0.1, 0.5, 1]\n};\nconst DefaultType$1 = {\n offset: '(number|null)',\n // TODO v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: 'string',\n smoothScroll: 'boolean',\n target: 'element',\n threshold: 'array'\n};\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n\n // this._element is the observablesContainer and config.target the menu links wrapper\n this._targetLinks = new Map();\n this._observableSections = new Map();\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element;\n this._activeTarget = null;\n this._observer = null;\n this._previousScrollData = {\n visibleEntryTop: 0,\n parentScrollTop: 0\n };\n this.refresh(); // initialize\n }\n\n // Getters\n static get Default() {\n return Default$1;\n }\n static get DefaultType() {\n return DefaultType$1;\n }\n static get NAME() {\n return NAME$2;\n }\n\n // Public\n refresh() {\n this._initializeTargetsAndObservables();\n this._maybeEnableSmoothScroll();\n if (this._observer) {\n this._observer.disconnect();\n } else {\n this._observer = this._getNewObserver();\n }\n for (const section of this._observableSections.values()) {\n this._observer.observe(section);\n }\n }\n dispose() {\n this._observer.disconnect();\n super.dispose();\n }\n\n // Private\n _configAfterMerge(config) {\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n config.target = getElement(config.target) || document.body;\n\n // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;\n if (typeof config.threshold === 'string') {\n config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value));\n }\n return config;\n }\n _maybeEnableSmoothScroll() {\n if (!this._config.smoothScroll) {\n return;\n }\n\n // unregister any previous listeners\n EventHandler.off(this._config.target, EVENT_CLICK);\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n const observableSection = this._observableSections.get(event.target.hash);\n if (observableSection) {\n event.preventDefault();\n const root = this._rootElement || window;\n const height = observableSection.offsetTop - this._element.offsetTop;\n if (root.scrollTo) {\n root.scrollTo({\n top: height,\n behavior: 'smooth'\n });\n return;\n }\n\n // Chrome 60 doesn't support `scrollTo`\n root.scrollTop = height;\n }\n });\n }\n _getNewObserver() {\n const options = {\n root: this._rootElement,\n threshold: this._config.threshold,\n rootMargin: this._config.rootMargin\n };\n return new IntersectionObserver(entries => this._observerCallback(entries), options);\n }\n\n // The logic of selection\n _observerCallback(entries) {\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`);\n const activate = entry => {\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop;\n this._process(targetElement(entry));\n };\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;\n this._previousScrollData.parentScrollTop = parentScrollTop;\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n this._activeTarget = null;\n this._clearActiveClass(targetElement(entry));\n continue;\n }\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop;\n // if we are scrolling down, pick the bigger offsetTop\n if (userScrollsDown && entryIsLowerThanPrevious) {\n activate(entry);\n // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n if (!parentScrollTop) {\n return;\n }\n continue;\n }\n\n // if we are scrolling up, pick the smallest offsetTop\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\n activate(entry);\n }\n }\n }\n _initializeTargetsAndObservables() {\n this._targetLinks = new Map();\n this._observableSections = new Map();\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target);\n for (const anchor of targetLinks) {\n // ensure that the anchor has an id and is not disabled\n if (!anchor.hash || isDisabled(anchor)) {\n continue;\n }\n const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element);\n\n // ensure that the observableSection exists & is visible\n if (isVisible(observableSection)) {\n this._targetLinks.set(decodeURI(anchor.hash), anchor);\n this._observableSections.set(anchor.hash, observableSection);\n }\n }\n }\n _process(target) {\n if (this._activeTarget === target) {\n return;\n }\n this._clearActiveClass(this._config.target);\n this._activeTarget = target;\n target.classList.add(CLASS_NAME_ACTIVE$1);\n this._activateParents(target);\n EventHandler.trigger(this._element, EVENT_ACTIVATE, {\n relatedTarget: target\n });\n }\n _activateParents(target) {\n // Activate dropdown parents\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);\n return;\n }\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n // Set triggered links parents as active\n // With both
        and
      ...\n trEl.dataset.position = String(position); // ...\n\n DOM.tBody.appendChild(trEl); // Im DOM hinzufügen\n };\n\n const showModalEdit = (product: Product) => {\n const { name = '', price = 0, _id: id, position } = product;\n\n DOM.inputEditName.value = name;\n DOM.inputEditPrice.value = String(price);\n\n DOM.inputEditId.value = String(id);\n DOM.inputEditPosition.value = String(position);\n };\n\n const resetFields = () => {\n DOM.btnAdd.disabled = true;\n DOM.inputPrice.value = '';\n DOM.inputName.value = '';\n\n DOM.formEdit.reset();\n };\n\n const disableNonFunctionalButtons = () => {\n Array.from(DOM.tBody.querySelectorAll('tr')).forEach((tr) => {\n const btnMoveUp = querySelectorTyped('.button-product-move-up', tr);\n const btnMoveDown = querySelectorTyped('.button-product-move-down', tr);\n\n btnMoveUp.disabled = !tr.previousElementSibling;\n btnMoveDown.disabled = !tr.nextElementSibling;\n });\n };\n\n init();\n\n return {\n init,\n initProducts,\n resetFields,\n };\n};\n\n// Freigabe für import\nexport default ProductManager;\n","function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n/*!\n * Splide.js\n * Version : 4.1.4\n * License : MIT\n * Copyright: 2022 Naotoshi Fujita\n */\nvar MEDIA_PREFERS_REDUCED_MOTION = \"(prefers-reduced-motion: reduce)\";\nvar CREATED = 1;\nvar MOUNTED = 2;\nvar IDLE = 3;\nvar MOVING = 4;\nvar SCROLLING = 5;\nvar DRAGGING = 6;\nvar DESTROYED = 7;\nvar STATES = {\n CREATED: CREATED,\n MOUNTED: MOUNTED,\n IDLE: IDLE,\n MOVING: MOVING,\n SCROLLING: SCROLLING,\n DRAGGING: DRAGGING,\n DESTROYED: DESTROYED\n};\n\nfunction empty(array) {\n array.length = 0;\n}\n\nfunction slice(arrayLike, start, end) {\n return Array.prototype.slice.call(arrayLike, start, end);\n}\n\nfunction apply(func) {\n return func.bind.apply(func, [null].concat(slice(arguments, 1)));\n}\n\nvar nextTick = setTimeout;\n\nvar noop = function noop() {};\n\nfunction raf(func) {\n return requestAnimationFrame(func);\n}\n\nfunction typeOf(type, subject) {\n return typeof subject === type;\n}\n\nfunction isObject(subject) {\n return !isNull(subject) && typeOf(\"object\", subject);\n}\n\nvar isArray = Array.isArray;\nvar isFunction = apply(typeOf, \"function\");\nvar isString = apply(typeOf, \"string\");\nvar isUndefined = apply(typeOf, \"undefined\");\n\nfunction isNull(subject) {\n return subject === null;\n}\n\nfunction isHTMLElement(subject) {\n try {\n return subject instanceof (subject.ownerDocument.defaultView || window).HTMLElement;\n } catch (e) {\n return false;\n }\n}\n\nfunction toArray(value) {\n return isArray(value) ? value : [value];\n}\n\nfunction forEach(values, iteratee) {\n toArray(values).forEach(iteratee);\n}\n\nfunction includes(array, value) {\n return array.indexOf(value) > -1;\n}\n\nfunction push(array, items) {\n array.push.apply(array, toArray(items));\n return array;\n}\n\nfunction toggleClass(elm, classes, add) {\n if (elm) {\n forEach(classes, function (name) {\n if (name) {\n elm.classList[add ? \"add\" : \"remove\"](name);\n }\n });\n }\n}\n\nfunction addClass(elm, classes) {\n toggleClass(elm, isString(classes) ? classes.split(\" \") : classes, true);\n}\n\nfunction append(parent, children) {\n forEach(children, parent.appendChild.bind(parent));\n}\n\nfunction before(nodes, ref) {\n forEach(nodes, function (node) {\n var parent = (ref || node).parentNode;\n\n if (parent) {\n parent.insertBefore(node, ref);\n }\n });\n}\n\nfunction matches(elm, selector) {\n return isHTMLElement(elm) && (elm[\"msMatchesSelector\"] || elm.matches).call(elm, selector);\n}\n\nfunction children(parent, selector) {\n var children2 = parent ? slice(parent.children) : [];\n return selector ? children2.filter(function (child) {\n return matches(child, selector);\n }) : children2;\n}\n\nfunction child(parent, selector) {\n return selector ? children(parent, selector)[0] : parent.firstElementChild;\n}\n\nvar ownKeys = Object.keys;\n\nfunction forOwn(object, iteratee, right) {\n if (object) {\n (right ? ownKeys(object).reverse() : ownKeys(object)).forEach(function (key) {\n key !== \"__proto__\" && iteratee(object[key], key);\n });\n }\n\n return object;\n}\n\nfunction assign(object) {\n slice(arguments, 1).forEach(function (source) {\n forOwn(source, function (value, key) {\n object[key] = source[key];\n });\n });\n return object;\n}\n\nfunction merge(object) {\n slice(arguments, 1).forEach(function (source) {\n forOwn(source, function (value, key) {\n if (isArray(value)) {\n object[key] = value.slice();\n } else if (isObject(value)) {\n object[key] = merge({}, isObject(object[key]) ? object[key] : {}, value);\n } else {\n object[key] = value;\n }\n });\n });\n return object;\n}\n\nfunction omit(object, keys) {\n forEach(keys || ownKeys(object), function (key) {\n delete object[key];\n });\n}\n\nfunction removeAttribute(elms, attrs) {\n forEach(elms, function (elm) {\n forEach(attrs, function (attr) {\n elm && elm.removeAttribute(attr);\n });\n });\n}\n\nfunction setAttribute(elms, attrs, value) {\n if (isObject(attrs)) {\n forOwn(attrs, function (value2, name) {\n setAttribute(elms, name, value2);\n });\n } else {\n forEach(elms, function (elm) {\n isNull(value) || value === \"\" ? removeAttribute(elm, attrs) : elm.setAttribute(attrs, String(value));\n });\n }\n}\n\nfunction create(tag, attrs, parent) {\n var elm = document.createElement(tag);\n\n if (attrs) {\n isString(attrs) ? addClass(elm, attrs) : setAttribute(elm, attrs);\n }\n\n parent && append(parent, elm);\n return elm;\n}\n\nfunction style(elm, prop, value) {\n if (isUndefined(value)) {\n return getComputedStyle(elm)[prop];\n }\n\n if (!isNull(value)) {\n elm.style[prop] = \"\" + value;\n }\n}\n\nfunction display(elm, display2) {\n style(elm, \"display\", display2);\n}\n\nfunction focus(elm) {\n elm[\"setActive\"] && elm[\"setActive\"]() || elm.focus({\n preventScroll: true\n });\n}\n\nfunction getAttribute(elm, attr) {\n return elm.getAttribute(attr);\n}\n\nfunction hasClass(elm, className) {\n return elm && elm.classList.contains(className);\n}\n\nfunction rect(target) {\n return target.getBoundingClientRect();\n}\n\nfunction remove(nodes) {\n forEach(nodes, function (node) {\n if (node && node.parentNode) {\n node.parentNode.removeChild(node);\n }\n });\n}\n\nfunction parseHtml(html) {\n return child(new DOMParser().parseFromString(html, \"text/html\").body);\n}\n\nfunction prevent(e, stopPropagation) {\n e.preventDefault();\n\n if (stopPropagation) {\n e.stopPropagation();\n e.stopImmediatePropagation();\n }\n}\n\nfunction query(parent, selector) {\n return parent && parent.querySelector(selector);\n}\n\nfunction queryAll(parent, selector) {\n return selector ? slice(parent.querySelectorAll(selector)) : [];\n}\n\nfunction removeClass(elm, classes) {\n toggleClass(elm, classes, false);\n}\n\nfunction timeOf(e) {\n return e.timeStamp;\n}\n\nfunction unit(value) {\n return isString(value) ? value : value ? value + \"px\" : \"\";\n}\n\nvar PROJECT_CODE = \"splide\";\nvar DATA_ATTRIBUTE = \"data-\" + PROJECT_CODE;\n\nfunction assert(condition, message) {\n if (!condition) {\n throw new Error(\"[\" + PROJECT_CODE + \"] \" + (message || \"\"));\n }\n}\n\nvar min = Math.min,\n max = Math.max,\n floor = Math.floor,\n ceil = Math.ceil,\n abs = Math.abs;\n\nfunction approximatelyEqual(x, y, epsilon) {\n return abs(x - y) < epsilon;\n}\n\nfunction between(number, x, y, exclusive) {\n var minimum = min(x, y);\n var maximum = max(x, y);\n return exclusive ? minimum < number && number < maximum : minimum <= number && number <= maximum;\n}\n\nfunction clamp(number, x, y) {\n var minimum = min(x, y);\n var maximum = max(x, y);\n return min(max(minimum, number), maximum);\n}\n\nfunction sign(x) {\n return +(x > 0) - +(x < 0);\n}\n\nfunction camelToKebab(string) {\n return string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n}\n\nfunction format(string, replacements) {\n forEach(replacements, function (replacement) {\n string = string.replace(\"%s\", \"\" + replacement);\n });\n return string;\n}\n\nfunction pad(number) {\n return number < 10 ? \"0\" + number : \"\" + number;\n}\n\nvar ids = {};\n\nfunction uniqueId(prefix) {\n return \"\" + prefix + pad(ids[prefix] = (ids[prefix] || 0) + 1);\n}\n\nfunction EventBinder() {\n var listeners = [];\n\n function bind(targets, events, callback, options) {\n forEachEvent(targets, events, function (target, event, namespace) {\n var isEventTarget = (\"addEventListener\" in target);\n var remover = isEventTarget ? target.removeEventListener.bind(target, event, callback, options) : target[\"removeListener\"].bind(target, callback);\n isEventTarget ? target.addEventListener(event, callback, options) : target[\"addListener\"](callback);\n listeners.push([target, event, namespace, callback, remover]);\n });\n }\n\n function unbind(targets, events, callback) {\n forEachEvent(targets, events, function (target, event, namespace) {\n listeners = listeners.filter(function (listener) {\n if (listener[0] === target && listener[1] === event && listener[2] === namespace && (!callback || listener[3] === callback)) {\n listener[4]();\n return false;\n }\n\n return true;\n });\n });\n }\n\n function dispatch(target, type, detail) {\n var e;\n var bubbles = true;\n\n if (typeof CustomEvent === \"function\") {\n e = new CustomEvent(type, {\n bubbles: bubbles,\n detail: detail\n });\n } else {\n e = document.createEvent(\"CustomEvent\");\n e.initCustomEvent(type, bubbles, false, detail);\n }\n\n target.dispatchEvent(e);\n return e;\n }\n\n function forEachEvent(targets, events, iteratee) {\n forEach(targets, function (target) {\n target && forEach(events, function (events2) {\n events2.split(\" \").forEach(function (eventNS) {\n var fragment = eventNS.split(\".\");\n iteratee(target, fragment[0], fragment[1]);\n });\n });\n });\n }\n\n function destroy() {\n listeners.forEach(function (data) {\n data[4]();\n });\n empty(listeners);\n }\n\n return {\n bind: bind,\n unbind: unbind,\n dispatch: dispatch,\n destroy: destroy\n };\n}\n\nvar EVENT_MOUNTED = \"mounted\";\nvar EVENT_READY = \"ready\";\nvar EVENT_MOVE = \"move\";\nvar EVENT_MOVED = \"moved\";\nvar EVENT_CLICK = \"click\";\nvar EVENT_ACTIVE = \"active\";\nvar EVENT_INACTIVE = \"inactive\";\nvar EVENT_VISIBLE = \"visible\";\nvar EVENT_HIDDEN = \"hidden\";\nvar EVENT_REFRESH = \"refresh\";\nvar EVENT_UPDATED = \"updated\";\nvar EVENT_RESIZE = \"resize\";\nvar EVENT_RESIZED = \"resized\";\nvar EVENT_DRAG = \"drag\";\nvar EVENT_DRAGGING = \"dragging\";\nvar EVENT_DRAGGED = \"dragged\";\nvar EVENT_SCROLL = \"scroll\";\nvar EVENT_SCROLLED = \"scrolled\";\nvar EVENT_OVERFLOW = \"overflow\";\nvar EVENT_DESTROY = \"destroy\";\nvar EVENT_ARROWS_MOUNTED = \"arrows:mounted\";\nvar EVENT_ARROWS_UPDATED = \"arrows:updated\";\nvar EVENT_PAGINATION_MOUNTED = \"pagination:mounted\";\nvar EVENT_PAGINATION_UPDATED = \"pagination:updated\";\nvar EVENT_NAVIGATION_MOUNTED = \"navigation:mounted\";\nvar EVENT_AUTOPLAY_PLAY = \"autoplay:play\";\nvar EVENT_AUTOPLAY_PLAYING = \"autoplay:playing\";\nvar EVENT_AUTOPLAY_PAUSE = \"autoplay:pause\";\nvar EVENT_LAZYLOAD_LOADED = \"lazyload:loaded\";\nvar EVENT_SLIDE_KEYDOWN = \"sk\";\nvar EVENT_SHIFTED = \"sh\";\nvar EVENT_END_INDEX_CHANGED = \"ei\";\n\nfunction EventInterface(Splide2) {\n var bus = Splide2 ? Splide2.event.bus : document.createDocumentFragment();\n var binder = EventBinder();\n\n function on(events, callback) {\n binder.bind(bus, toArray(events).join(\" \"), function (e) {\n callback.apply(callback, isArray(e.detail) ? e.detail : []);\n });\n }\n\n function emit(event) {\n binder.dispatch(bus, event, slice(arguments, 1));\n }\n\n if (Splide2) {\n Splide2.event.on(EVENT_DESTROY, binder.destroy);\n }\n\n return assign(binder, {\n bus: bus,\n on: on,\n off: apply(binder.unbind, bus),\n emit: emit\n });\n}\n\nfunction RequestInterval(interval, onInterval, onUpdate, limit) {\n var now = Date.now;\n var startTime;\n var rate = 0;\n var id;\n var paused = true;\n var count = 0;\n\n function update() {\n if (!paused) {\n rate = interval ? min((now() - startTime) / interval, 1) : 1;\n onUpdate && onUpdate(rate);\n\n if (rate >= 1) {\n onInterval();\n startTime = now();\n\n if (limit && ++count >= limit) {\n return pause();\n }\n }\n\n id = raf(update);\n }\n }\n\n function start(resume) {\n resume || cancel();\n startTime = now() - (resume ? rate * interval : 0);\n paused = false;\n id = raf(update);\n }\n\n function pause() {\n paused = true;\n }\n\n function rewind() {\n startTime = now();\n rate = 0;\n\n if (onUpdate) {\n onUpdate(rate);\n }\n }\n\n function cancel() {\n id && cancelAnimationFrame(id);\n rate = 0;\n id = 0;\n paused = true;\n }\n\n function set(time) {\n interval = time;\n }\n\n function isPaused() {\n return paused;\n }\n\n return {\n start: start,\n rewind: rewind,\n pause: pause,\n cancel: cancel,\n set: set,\n isPaused: isPaused\n };\n}\n\nfunction State(initialState) {\n var state = initialState;\n\n function set(value) {\n state = value;\n }\n\n function is(states) {\n return includes(toArray(states), state);\n }\n\n return {\n set: set,\n is: is\n };\n}\n\nfunction Throttle(func, duration) {\n var interval = RequestInterval(duration || 0, func, null, 1);\n return function () {\n interval.isPaused() && interval.start();\n };\n}\n\nfunction Media(Splide2, Components2, options) {\n var state = Splide2.state;\n var breakpoints = options.breakpoints || {};\n var reducedMotion = options.reducedMotion || {};\n var binder = EventBinder();\n var queries = [];\n\n function setup() {\n var isMin = options.mediaQuery === \"min\";\n ownKeys(breakpoints).sort(function (n, m) {\n return isMin ? +n - +m : +m - +n;\n }).forEach(function (key) {\n register(breakpoints[key], \"(\" + (isMin ? \"min\" : \"max\") + \"-width:\" + key + \"px)\");\n });\n register(reducedMotion, MEDIA_PREFERS_REDUCED_MOTION);\n update();\n }\n\n function destroy(completely) {\n if (completely) {\n binder.destroy();\n }\n }\n\n function register(options2, query) {\n var queryList = matchMedia(query);\n binder.bind(queryList, \"change\", update);\n queries.push([options2, queryList]);\n }\n\n function update() {\n var destroyed = state.is(DESTROYED);\n var direction = options.direction;\n var merged = queries.reduce(function (merged2, entry) {\n return merge(merged2, entry[1].matches ? entry[0] : {});\n }, {});\n omit(options);\n set(merged);\n\n if (options.destroy) {\n Splide2.destroy(options.destroy === \"completely\");\n } else if (destroyed) {\n destroy(true);\n Splide2.mount();\n } else {\n direction !== options.direction && Splide2.refresh();\n }\n }\n\n function reduce(enable) {\n if (matchMedia(MEDIA_PREFERS_REDUCED_MOTION).matches) {\n enable ? merge(options, reducedMotion) : omit(options, ownKeys(reducedMotion));\n }\n }\n\n function set(opts, base, notify) {\n merge(options, opts);\n base && merge(Object.getPrototypeOf(options), opts);\n\n if (notify || !state.is(CREATED)) {\n Splide2.emit(EVENT_UPDATED, options);\n }\n }\n\n return {\n setup: setup,\n destroy: destroy,\n reduce: reduce,\n set: set\n };\n}\n\nvar ARROW = \"Arrow\";\nvar ARROW_LEFT = ARROW + \"Left\";\nvar ARROW_RIGHT = ARROW + \"Right\";\nvar ARROW_UP = ARROW + \"Up\";\nvar ARROW_DOWN = ARROW + \"Down\";\nvar LTR = \"ltr\";\nvar RTL = \"rtl\";\nvar TTB = \"ttb\";\nvar ORIENTATION_MAP = {\n width: [\"height\"],\n left: [\"top\", \"right\"],\n right: [\"bottom\", \"left\"],\n x: [\"y\"],\n X: [\"Y\"],\n Y: [\"X\"],\n ArrowLeft: [ARROW_UP, ARROW_RIGHT],\n ArrowRight: [ARROW_DOWN, ARROW_LEFT]\n};\n\nfunction Direction(Splide2, Components2, options) {\n function resolve(prop, axisOnly, direction) {\n direction = direction || options.direction;\n var index = direction === RTL && !axisOnly ? 1 : direction === TTB ? 0 : -1;\n return ORIENTATION_MAP[prop] && ORIENTATION_MAP[prop][index] || prop.replace(/width|left|right/i, function (match, offset) {\n var replacement = ORIENTATION_MAP[match.toLowerCase()][index] || match;\n return offset > 0 ? replacement.charAt(0).toUpperCase() + replacement.slice(1) : replacement;\n });\n }\n\n function orient(value) {\n return value * (options.direction === RTL ? 1 : -1);\n }\n\n return {\n resolve: resolve,\n orient: orient\n };\n}\n\nvar ROLE = \"role\";\nvar TAB_INDEX = \"tabindex\";\nvar DISABLED = \"disabled\";\nvar ARIA_PREFIX = \"aria-\";\nvar ARIA_CONTROLS = ARIA_PREFIX + \"controls\";\nvar ARIA_CURRENT = ARIA_PREFIX + \"current\";\nvar ARIA_SELECTED = ARIA_PREFIX + \"selected\";\nvar ARIA_LABEL = ARIA_PREFIX + \"label\";\nvar ARIA_LABELLEDBY = ARIA_PREFIX + \"labelledby\";\nvar ARIA_HIDDEN = ARIA_PREFIX + \"hidden\";\nvar ARIA_ORIENTATION = ARIA_PREFIX + \"orientation\";\nvar ARIA_ROLEDESCRIPTION = ARIA_PREFIX + \"roledescription\";\nvar ARIA_LIVE = ARIA_PREFIX + \"live\";\nvar ARIA_BUSY = ARIA_PREFIX + \"busy\";\nvar ARIA_ATOMIC = ARIA_PREFIX + \"atomic\";\nvar ALL_ATTRIBUTES = [ROLE, TAB_INDEX, DISABLED, ARIA_CONTROLS, ARIA_CURRENT, ARIA_LABEL, ARIA_LABELLEDBY, ARIA_HIDDEN, ARIA_ORIENTATION, ARIA_ROLEDESCRIPTION];\nvar CLASS_PREFIX = PROJECT_CODE + \"__\";\nvar STATUS_CLASS_PREFIX = \"is-\";\nvar CLASS_ROOT = PROJECT_CODE;\nvar CLASS_TRACK = CLASS_PREFIX + \"track\";\nvar CLASS_LIST = CLASS_PREFIX + \"list\";\nvar CLASS_SLIDE = CLASS_PREFIX + \"slide\";\nvar CLASS_CLONE = CLASS_SLIDE + \"--clone\";\nvar CLASS_CONTAINER = CLASS_SLIDE + \"__container\";\nvar CLASS_ARROWS = CLASS_PREFIX + \"arrows\";\nvar CLASS_ARROW = CLASS_PREFIX + \"arrow\";\nvar CLASS_ARROW_PREV = CLASS_ARROW + \"--prev\";\nvar CLASS_ARROW_NEXT = CLASS_ARROW + \"--next\";\nvar CLASS_PAGINATION = CLASS_PREFIX + \"pagination\";\nvar CLASS_PAGINATION_PAGE = CLASS_PAGINATION + \"__page\";\nvar CLASS_PROGRESS = CLASS_PREFIX + \"progress\";\nvar CLASS_PROGRESS_BAR = CLASS_PROGRESS + \"__bar\";\nvar CLASS_TOGGLE = CLASS_PREFIX + \"toggle\";\nvar CLASS_TOGGLE_PLAY = CLASS_TOGGLE + \"__play\";\nvar CLASS_TOGGLE_PAUSE = CLASS_TOGGLE + \"__pause\";\nvar CLASS_SPINNER = CLASS_PREFIX + \"spinner\";\nvar CLASS_SR = CLASS_PREFIX + \"sr\";\nvar CLASS_INITIALIZED = STATUS_CLASS_PREFIX + \"initialized\";\nvar CLASS_ACTIVE = STATUS_CLASS_PREFIX + \"active\";\nvar CLASS_PREV = STATUS_CLASS_PREFIX + \"prev\";\nvar CLASS_NEXT = STATUS_CLASS_PREFIX + \"next\";\nvar CLASS_VISIBLE = STATUS_CLASS_PREFIX + \"visible\";\nvar CLASS_LOADING = STATUS_CLASS_PREFIX + \"loading\";\nvar CLASS_FOCUS_IN = STATUS_CLASS_PREFIX + \"focus-in\";\nvar CLASS_OVERFLOW = STATUS_CLASS_PREFIX + \"overflow\";\nvar STATUS_CLASSES = [CLASS_ACTIVE, CLASS_VISIBLE, CLASS_PREV, CLASS_NEXT, CLASS_LOADING, CLASS_FOCUS_IN, CLASS_OVERFLOW];\nvar CLASSES = {\n slide: CLASS_SLIDE,\n clone: CLASS_CLONE,\n arrows: CLASS_ARROWS,\n arrow: CLASS_ARROW,\n prev: CLASS_ARROW_PREV,\n next: CLASS_ARROW_NEXT,\n pagination: CLASS_PAGINATION,\n page: CLASS_PAGINATION_PAGE,\n spinner: CLASS_SPINNER\n};\n\nfunction closest(from, selector) {\n if (isFunction(from.closest)) {\n return from.closest(selector);\n }\n\n var elm = from;\n\n while (elm && elm.nodeType === 1) {\n if (matches(elm, selector)) {\n break;\n }\n\n elm = elm.parentElement;\n }\n\n return elm;\n}\n\nvar FRICTION = 5;\nvar LOG_INTERVAL = 200;\nvar POINTER_DOWN_EVENTS = \"touchstart mousedown\";\nvar POINTER_MOVE_EVENTS = \"touchmove mousemove\";\nvar POINTER_UP_EVENTS = \"touchend touchcancel mouseup click\";\n\nfunction Elements(Splide2, Components2, options) {\n var _EventInterface = EventInterface(Splide2),\n on = _EventInterface.on,\n bind = _EventInterface.bind;\n\n var root = Splide2.root;\n var i18n = options.i18n;\n var elements = {};\n var slides = [];\n var rootClasses = [];\n var trackClasses = [];\n var track;\n var list;\n var isUsingKey;\n\n function setup() {\n collect();\n init();\n update();\n }\n\n function mount() {\n on(EVENT_REFRESH, destroy);\n on(EVENT_REFRESH, setup);\n on(EVENT_UPDATED, update);\n bind(document, POINTER_DOWN_EVENTS + \" keydown\", function (e) {\n isUsingKey = e.type === \"keydown\";\n }, {\n capture: true\n });\n bind(root, \"focusin\", function () {\n toggleClass(root, CLASS_FOCUS_IN, !!isUsingKey);\n });\n }\n\n function destroy(completely) {\n var attrs = ALL_ATTRIBUTES.concat(\"style\");\n empty(slides);\n removeClass(root, rootClasses);\n removeClass(track, trackClasses);\n removeAttribute([track, list], attrs);\n removeAttribute(root, completely ? attrs : [\"style\", ARIA_ROLEDESCRIPTION]);\n }\n\n function update() {\n removeClass(root, rootClasses);\n removeClass(track, trackClasses);\n rootClasses = getClasses(CLASS_ROOT);\n trackClasses = getClasses(CLASS_TRACK);\n addClass(root, rootClasses);\n addClass(track, trackClasses);\n setAttribute(root, ARIA_LABEL, options.label);\n setAttribute(root, ARIA_LABELLEDBY, options.labelledby);\n }\n\n function collect() {\n track = find(\".\" + CLASS_TRACK);\n list = child(track, \".\" + CLASS_LIST);\n assert(track && list, \"A track/list element is missing.\");\n push(slides, children(list, \".\" + CLASS_SLIDE + \":not(.\" + CLASS_CLONE + \")\"));\n forOwn({\n arrows: CLASS_ARROWS,\n pagination: CLASS_PAGINATION,\n prev: CLASS_ARROW_PREV,\n next: CLASS_ARROW_NEXT,\n bar: CLASS_PROGRESS_BAR,\n toggle: CLASS_TOGGLE\n }, function (className, key) {\n elements[key] = find(\".\" + className);\n });\n assign(elements, {\n root: root,\n track: track,\n list: list,\n slides: slides\n });\n }\n\n function init() {\n var id = root.id || uniqueId(PROJECT_CODE);\n var role = options.role;\n root.id = id;\n track.id = track.id || id + \"-track\";\n list.id = list.id || id + \"-list\";\n\n if (!getAttribute(root, ROLE) && root.tagName !== \"SECTION\" && role) {\n setAttribute(root, ROLE, role);\n }\n\n setAttribute(root, ARIA_ROLEDESCRIPTION, i18n.carousel);\n setAttribute(list, ROLE, \"presentation\");\n }\n\n function find(selector) {\n var elm = query(root, selector);\n return elm && closest(elm, \".\" + CLASS_ROOT) === root ? elm : void 0;\n }\n\n function getClasses(base) {\n return [base + \"--\" + options.type, base + \"--\" + options.direction, options.drag && base + \"--draggable\", options.isNavigation && base + \"--nav\", base === CLASS_ROOT && CLASS_ACTIVE];\n }\n\n return assign(elements, {\n setup: setup,\n mount: mount,\n destroy: destroy\n });\n}\n\nvar SLIDE = \"slide\";\nvar LOOP = \"loop\";\nvar FADE = \"fade\";\n\nfunction Slide$1(Splide2, index, slideIndex, slide) {\n var event = EventInterface(Splide2);\n var on = event.on,\n emit = event.emit,\n bind = event.bind;\n var Components = Splide2.Components,\n root = Splide2.root,\n options = Splide2.options;\n var isNavigation = options.isNavigation,\n updateOnMove = options.updateOnMove,\n i18n = options.i18n,\n pagination = options.pagination,\n slideFocus = options.slideFocus;\n var resolve = Components.Direction.resolve;\n var styles = getAttribute(slide, \"style\");\n var label = getAttribute(slide, ARIA_LABEL);\n var isClone = slideIndex > -1;\n var container = child(slide, \".\" + CLASS_CONTAINER);\n var destroyed;\n\n function mount() {\n if (!isClone) {\n slide.id = root.id + \"-slide\" + pad(index + 1);\n setAttribute(slide, ROLE, pagination ? \"tabpanel\" : \"group\");\n setAttribute(slide, ARIA_ROLEDESCRIPTION, i18n.slide);\n setAttribute(slide, ARIA_LABEL, label || format(i18n.slideLabel, [index + 1, Splide2.length]));\n }\n\n listen();\n }\n\n function listen() {\n bind(slide, \"click\", apply(emit, EVENT_CLICK, self));\n bind(slide, \"keydown\", apply(emit, EVENT_SLIDE_KEYDOWN, self));\n on([EVENT_MOVED, EVENT_SHIFTED, EVENT_SCROLLED], update);\n on(EVENT_NAVIGATION_MOUNTED, initNavigation);\n\n if (updateOnMove) {\n on(EVENT_MOVE, onMove);\n }\n }\n\n function destroy() {\n destroyed = true;\n event.destroy();\n removeClass(slide, STATUS_CLASSES);\n removeAttribute(slide, ALL_ATTRIBUTES);\n setAttribute(slide, \"style\", styles);\n setAttribute(slide, ARIA_LABEL, label || \"\");\n }\n\n function initNavigation() {\n var controls = Splide2.splides.map(function (target) {\n var Slide2 = target.splide.Components.Slides.getAt(index);\n return Slide2 ? Slide2.slide.id : \"\";\n }).join(\" \");\n setAttribute(slide, ARIA_LABEL, format(i18n.slideX, (isClone ? slideIndex : index) + 1));\n setAttribute(slide, ARIA_CONTROLS, controls);\n setAttribute(slide, ROLE, slideFocus ? \"button\" : \"\");\n slideFocus && removeAttribute(slide, ARIA_ROLEDESCRIPTION);\n }\n\n function onMove() {\n if (!destroyed) {\n update();\n }\n }\n\n function update() {\n if (!destroyed) {\n var curr = Splide2.index;\n updateActivity();\n updateVisibility();\n toggleClass(slide, CLASS_PREV, index === curr - 1);\n toggleClass(slide, CLASS_NEXT, index === curr + 1);\n }\n }\n\n function updateActivity() {\n var active = isActive();\n\n if (active !== hasClass(slide, CLASS_ACTIVE)) {\n toggleClass(slide, CLASS_ACTIVE, active);\n setAttribute(slide, ARIA_CURRENT, isNavigation && active || \"\");\n emit(active ? EVENT_ACTIVE : EVENT_INACTIVE, self);\n }\n }\n\n function updateVisibility() {\n var visible = isVisible();\n var hidden = !visible && (!isActive() || isClone);\n\n if (!Splide2.state.is([MOVING, SCROLLING])) {\n setAttribute(slide, ARIA_HIDDEN, hidden || \"\");\n }\n\n setAttribute(queryAll(slide, options.focusableNodes || \"\"), TAB_INDEX, hidden ? -1 : \"\");\n\n if (slideFocus) {\n setAttribute(slide, TAB_INDEX, hidden ? -1 : 0);\n }\n\n if (visible !== hasClass(slide, CLASS_VISIBLE)) {\n toggleClass(slide, CLASS_VISIBLE, visible);\n emit(visible ? EVENT_VISIBLE : EVENT_HIDDEN, self);\n }\n\n if (!visible && document.activeElement === slide) {\n var Slide2 = Components.Slides.getAt(Splide2.index);\n Slide2 && focus(Slide2.slide);\n }\n }\n\n function style$1(prop, value, useContainer) {\n style(useContainer && container || slide, prop, value);\n }\n\n function isActive() {\n var curr = Splide2.index;\n return curr === index || options.cloneStatus && curr === slideIndex;\n }\n\n function isVisible() {\n if (Splide2.is(FADE)) {\n return isActive();\n }\n\n var trackRect = rect(Components.Elements.track);\n var slideRect = rect(slide);\n var left = resolve(\"left\", true);\n var right = resolve(\"right\", true);\n return floor(trackRect[left]) <= ceil(slideRect[left]) && floor(slideRect[right]) <= ceil(trackRect[right]);\n }\n\n function isWithin(from, distance) {\n var diff = abs(from - index);\n\n if (!isClone && (options.rewind || Splide2.is(LOOP))) {\n diff = min(diff, Splide2.length - diff);\n }\n\n return diff <= distance;\n }\n\n var self = {\n index: index,\n slideIndex: slideIndex,\n slide: slide,\n container: container,\n isClone: isClone,\n mount: mount,\n destroy: destroy,\n update: update,\n style: style$1,\n isWithin: isWithin\n };\n return self;\n}\n\nfunction Slides(Splide2, Components2, options) {\n var _EventInterface2 = EventInterface(Splide2),\n on = _EventInterface2.on,\n emit = _EventInterface2.emit,\n bind = _EventInterface2.bind;\n\n var _Components2$Elements = Components2.Elements,\n slides = _Components2$Elements.slides,\n list = _Components2$Elements.list;\n var Slides2 = [];\n\n function mount() {\n init();\n on(EVENT_REFRESH, destroy);\n on(EVENT_REFRESH, init);\n }\n\n function init() {\n slides.forEach(function (slide, index) {\n register(slide, index, -1);\n });\n }\n\n function destroy() {\n forEach$1(function (Slide2) {\n Slide2.destroy();\n });\n empty(Slides2);\n }\n\n function update() {\n forEach$1(function (Slide2) {\n Slide2.update();\n });\n }\n\n function register(slide, index, slideIndex) {\n var object = Slide$1(Splide2, index, slideIndex, slide);\n object.mount();\n Slides2.push(object);\n Slides2.sort(function (Slide1, Slide2) {\n return Slide1.index - Slide2.index;\n });\n }\n\n function get(excludeClones) {\n return excludeClones ? filter(function (Slide2) {\n return !Slide2.isClone;\n }) : Slides2;\n }\n\n function getIn(page) {\n var Controller = Components2.Controller;\n var index = Controller.toIndex(page);\n var max = Controller.hasFocus() ? 1 : options.perPage;\n return filter(function (Slide2) {\n return between(Slide2.index, index, index + max - 1);\n });\n }\n\n function getAt(index) {\n return filter(index)[0];\n }\n\n function add(items, index) {\n forEach(items, function (slide) {\n if (isString(slide)) {\n slide = parseHtml(slide);\n }\n\n if (isHTMLElement(slide)) {\n var ref = slides[index];\n ref ? before(slide, ref) : append(list, slide);\n addClass(slide, options.classes.slide);\n observeImages(slide, apply(emit, EVENT_RESIZE));\n }\n });\n emit(EVENT_REFRESH);\n }\n\n function remove$1(matcher) {\n remove(filter(matcher).map(function (Slide2) {\n return Slide2.slide;\n }));\n emit(EVENT_REFRESH);\n }\n\n function forEach$1(iteratee, excludeClones) {\n get(excludeClones).forEach(iteratee);\n }\n\n function filter(matcher) {\n return Slides2.filter(isFunction(matcher) ? matcher : function (Slide2) {\n return isString(matcher) ? matches(Slide2.slide, matcher) : includes(toArray(matcher), Slide2.index);\n });\n }\n\n function style(prop, value, useContainer) {\n forEach$1(function (Slide2) {\n Slide2.style(prop, value, useContainer);\n });\n }\n\n function observeImages(elm, callback) {\n var images = queryAll(elm, \"img\");\n var length = images.length;\n\n if (length) {\n images.forEach(function (img) {\n bind(img, \"load error\", function () {\n if (! --length) {\n callback();\n }\n });\n });\n } else {\n callback();\n }\n }\n\n function getLength(excludeClones) {\n return excludeClones ? slides.length : Slides2.length;\n }\n\n function isEnough() {\n return Slides2.length > options.perPage;\n }\n\n return {\n mount: mount,\n destroy: destroy,\n update: update,\n register: register,\n get: get,\n getIn: getIn,\n getAt: getAt,\n add: add,\n remove: remove$1,\n forEach: forEach$1,\n filter: filter,\n style: style,\n getLength: getLength,\n isEnough: isEnough\n };\n}\n\nfunction Layout(Splide2, Components2, options) {\n var _EventInterface3 = EventInterface(Splide2),\n on = _EventInterface3.on,\n bind = _EventInterface3.bind,\n emit = _EventInterface3.emit;\n\n var Slides = Components2.Slides;\n var resolve = Components2.Direction.resolve;\n var _Components2$Elements2 = Components2.Elements,\n root = _Components2$Elements2.root,\n track = _Components2$Elements2.track,\n list = _Components2$Elements2.list;\n var getAt = Slides.getAt,\n styleSlides = Slides.style;\n var vertical;\n var rootRect;\n var overflow;\n\n function mount() {\n init();\n bind(window, \"resize load\", Throttle(apply(emit, EVENT_RESIZE)));\n on([EVENT_UPDATED, EVENT_REFRESH], init);\n on(EVENT_RESIZE, resize);\n }\n\n function init() {\n vertical = options.direction === TTB;\n style(root, \"maxWidth\", unit(options.width));\n style(track, resolve(\"paddingLeft\"), cssPadding(false));\n style(track, resolve(\"paddingRight\"), cssPadding(true));\n resize(true);\n }\n\n function resize(force) {\n var newRect = rect(root);\n\n if (force || rootRect.width !== newRect.width || rootRect.height !== newRect.height) {\n style(track, \"height\", cssTrackHeight());\n styleSlides(resolve(\"marginRight\"), unit(options.gap));\n styleSlides(\"width\", cssSlideWidth());\n styleSlides(\"height\", cssSlideHeight(), true);\n rootRect = newRect;\n emit(EVENT_RESIZED);\n\n if (overflow !== (overflow = isOverflow())) {\n toggleClass(root, CLASS_OVERFLOW, overflow);\n emit(EVENT_OVERFLOW, overflow);\n }\n }\n }\n\n function cssPadding(right) {\n var padding = options.padding;\n var prop = resolve(right ? \"right\" : \"left\");\n return padding && unit(padding[prop] || (isObject(padding) ? 0 : padding)) || \"0px\";\n }\n\n function cssTrackHeight() {\n var height = \"\";\n\n if (vertical) {\n height = cssHeight();\n assert(height, \"height or heightRatio is missing.\");\n height = \"calc(\" + height + \" - \" + cssPadding(false) + \" - \" + cssPadding(true) + \")\";\n }\n\n return height;\n }\n\n function cssHeight() {\n return unit(options.height || rect(list).width * options.heightRatio);\n }\n\n function cssSlideWidth() {\n return options.autoWidth ? null : unit(options.fixedWidth) || (vertical ? \"\" : cssSlideSize());\n }\n\n function cssSlideHeight() {\n return unit(options.fixedHeight) || (vertical ? options.autoHeight ? null : cssSlideSize() : cssHeight());\n }\n\n function cssSlideSize() {\n var gap = unit(options.gap);\n return \"calc((100%\" + (gap && \" + \" + gap) + \")/\" + (options.perPage || 1) + (gap && \" - \" + gap) + \")\";\n }\n\n function listSize() {\n return rect(list)[resolve(\"width\")];\n }\n\n function slideSize(index, withoutGap) {\n var Slide = getAt(index || 0);\n return Slide ? rect(Slide.slide)[resolve(\"width\")] + (withoutGap ? 0 : getGap()) : 0;\n }\n\n function totalSize(index, withoutGap) {\n var Slide = getAt(index);\n\n if (Slide) {\n var right = rect(Slide.slide)[resolve(\"right\")];\n var left = rect(list)[resolve(\"left\")];\n return abs(right - left) + (withoutGap ? 0 : getGap());\n }\n\n return 0;\n }\n\n function sliderSize(withoutGap) {\n return totalSize(Splide2.length - 1) - totalSize(0) + slideSize(0, withoutGap);\n }\n\n function getGap() {\n var Slide = getAt(0);\n return Slide && parseFloat(style(Slide.slide, resolve(\"marginRight\"))) || 0;\n }\n\n function getPadding(right) {\n return parseFloat(style(track, resolve(\"padding\" + (right ? \"Right\" : \"Left\")))) || 0;\n }\n\n function isOverflow() {\n return Splide2.is(FADE) || sliderSize(true) > listSize();\n }\n\n return {\n mount: mount,\n resize: resize,\n listSize: listSize,\n slideSize: slideSize,\n sliderSize: sliderSize,\n totalSize: totalSize,\n getPadding: getPadding,\n isOverflow: isOverflow\n };\n}\n\nvar MULTIPLIER = 2;\n\nfunction Clones(Splide2, Components2, options) {\n var event = EventInterface(Splide2);\n var on = event.on;\n var Elements = Components2.Elements,\n Slides = Components2.Slides;\n var resolve = Components2.Direction.resolve;\n var clones = [];\n var cloneCount;\n\n function mount() {\n on(EVENT_REFRESH, remount);\n on([EVENT_UPDATED, EVENT_RESIZE], observe);\n\n if (cloneCount = computeCloneCount()) {\n generate(cloneCount);\n Components2.Layout.resize(true);\n }\n }\n\n function remount() {\n destroy();\n mount();\n }\n\n function destroy() {\n remove(clones);\n empty(clones);\n event.destroy();\n }\n\n function observe() {\n var count = computeCloneCount();\n\n if (cloneCount !== count) {\n if (cloneCount < count || !count) {\n event.emit(EVENT_REFRESH);\n }\n }\n }\n\n function generate(count) {\n var slides = Slides.get().slice();\n var length = slides.length;\n\n if (length) {\n while (slides.length < count) {\n push(slides, slides);\n }\n\n push(slides.slice(-count), slides.slice(0, count)).forEach(function (Slide, index) {\n var isHead = index < count;\n var clone = cloneDeep(Slide.slide, index);\n isHead ? before(clone, slides[0].slide) : append(Elements.list, clone);\n push(clones, clone);\n Slides.register(clone, index - count + (isHead ? 0 : length), Slide.index);\n });\n }\n }\n\n function cloneDeep(elm, index) {\n var clone = elm.cloneNode(true);\n addClass(clone, options.classes.clone);\n clone.id = Splide2.root.id + \"-clone\" + pad(index + 1);\n return clone;\n }\n\n function computeCloneCount() {\n var clones2 = options.clones;\n\n if (!Splide2.is(LOOP)) {\n clones2 = 0;\n } else if (isUndefined(clones2)) {\n var fixedSize = options[resolve(\"fixedWidth\")] && Components2.Layout.slideSize(0);\n var fixedCount = fixedSize && ceil(rect(Elements.track)[resolve(\"width\")] / fixedSize);\n clones2 = fixedCount || options[resolve(\"autoWidth\")] && Splide2.length || options.perPage * MULTIPLIER;\n }\n\n return clones2;\n }\n\n return {\n mount: mount,\n destroy: destroy\n };\n}\n\nfunction Move(Splide2, Components2, options) {\n var _EventInterface4 = EventInterface(Splide2),\n on = _EventInterface4.on,\n emit = _EventInterface4.emit;\n\n var set = Splide2.state.set;\n var _Components2$Layout = Components2.Layout,\n slideSize = _Components2$Layout.slideSize,\n getPadding = _Components2$Layout.getPadding,\n totalSize = _Components2$Layout.totalSize,\n listSize = _Components2$Layout.listSize,\n sliderSize = _Components2$Layout.sliderSize;\n var _Components2$Directio = Components2.Direction,\n resolve = _Components2$Directio.resolve,\n orient = _Components2$Directio.orient;\n var _Components2$Elements3 = Components2.Elements,\n list = _Components2$Elements3.list,\n track = _Components2$Elements3.track;\n var Transition;\n\n function mount() {\n Transition = Components2.Transition;\n on([EVENT_MOUNTED, EVENT_RESIZED, EVENT_UPDATED, EVENT_REFRESH], reposition);\n }\n\n function reposition() {\n if (!Components2.Controller.isBusy()) {\n Components2.Scroll.cancel();\n jump(Splide2.index);\n Components2.Slides.update();\n }\n }\n\n function move(dest, index, prev, callback) {\n if (dest !== index && canShift(dest > prev)) {\n cancel();\n translate(shift(getPosition(), dest > prev), true);\n }\n\n set(MOVING);\n emit(EVENT_MOVE, index, prev, dest);\n Transition.start(index, function () {\n set(IDLE);\n emit(EVENT_MOVED, index, prev, dest);\n callback && callback();\n });\n }\n\n function jump(index) {\n translate(toPosition(index, true));\n }\n\n function translate(position, preventLoop) {\n if (!Splide2.is(FADE)) {\n var destination = preventLoop ? position : loop(position);\n style(list, \"transform\", \"translate\" + resolve(\"X\") + \"(\" + destination + \"px)\");\n position !== destination && emit(EVENT_SHIFTED);\n }\n }\n\n function loop(position) {\n if (Splide2.is(LOOP)) {\n var index = toIndex(position);\n var exceededMax = index > Components2.Controller.getEnd();\n var exceededMin = index < 0;\n\n if (exceededMin || exceededMax) {\n position = shift(position, exceededMax);\n }\n }\n\n return position;\n }\n\n function shift(position, backwards) {\n var excess = position - getLimit(backwards);\n var size = sliderSize();\n position -= orient(size * (ceil(abs(excess) / size) || 1)) * (backwards ? 1 : -1);\n return position;\n }\n\n function cancel() {\n translate(getPosition(), true);\n Transition.cancel();\n }\n\n function toIndex(position) {\n var Slides = Components2.Slides.get();\n var index = 0;\n var minDistance = Infinity;\n\n for (var i = 0; i < Slides.length; i++) {\n var slideIndex = Slides[i].index;\n var distance = abs(toPosition(slideIndex, true) - position);\n\n if (distance <= minDistance) {\n minDistance = distance;\n index = slideIndex;\n } else {\n break;\n }\n }\n\n return index;\n }\n\n function toPosition(index, trimming) {\n var position = orient(totalSize(index - 1) - offset(index));\n return trimming ? trim(position) : position;\n }\n\n function getPosition() {\n var left = resolve(\"left\");\n return rect(list)[left] - rect(track)[left] + orient(getPadding(false));\n }\n\n function trim(position) {\n if (options.trimSpace && Splide2.is(SLIDE)) {\n position = clamp(position, 0, orient(sliderSize(true) - listSize()));\n }\n\n return position;\n }\n\n function offset(index) {\n var focus = options.focus;\n return focus === \"center\" ? (listSize() - slideSize(index, true)) / 2 : +focus * slideSize(index) || 0;\n }\n\n function getLimit(max) {\n return toPosition(max ? Components2.Controller.getEnd() : 0, !!options.trimSpace);\n }\n\n function canShift(backwards) {\n var shifted = orient(shift(getPosition(), backwards));\n return backwards ? shifted >= 0 : shifted <= list[resolve(\"scrollWidth\")] - rect(track)[resolve(\"width\")];\n }\n\n function exceededLimit(max, position) {\n position = isUndefined(position) ? getPosition() : position;\n var exceededMin = max !== true && orient(position) < orient(getLimit(false));\n var exceededMax = max !== false && orient(position) > orient(getLimit(true));\n return exceededMin || exceededMax;\n }\n\n return {\n mount: mount,\n move: move,\n jump: jump,\n translate: translate,\n shift: shift,\n cancel: cancel,\n toIndex: toIndex,\n toPosition: toPosition,\n getPosition: getPosition,\n getLimit: getLimit,\n exceededLimit: exceededLimit,\n reposition: reposition\n };\n}\n\nfunction Controller(Splide2, Components2, options) {\n var _EventInterface5 = EventInterface(Splide2),\n on = _EventInterface5.on,\n emit = _EventInterface5.emit;\n\n var Move = Components2.Move;\n var getPosition = Move.getPosition,\n getLimit = Move.getLimit,\n toPosition = Move.toPosition;\n var _Components2$Slides = Components2.Slides,\n isEnough = _Components2$Slides.isEnough,\n getLength = _Components2$Slides.getLength;\n var omitEnd = options.omitEnd;\n var isLoop = Splide2.is(LOOP);\n var isSlide = Splide2.is(SLIDE);\n var getNext = apply(getAdjacent, false);\n var getPrev = apply(getAdjacent, true);\n var currIndex = options.start || 0;\n var endIndex;\n var prevIndex = currIndex;\n var slideCount;\n var perMove;\n var perPage;\n\n function mount() {\n init();\n on([EVENT_UPDATED, EVENT_REFRESH, EVENT_END_INDEX_CHANGED], init);\n on(EVENT_RESIZED, onResized);\n }\n\n function init() {\n slideCount = getLength(true);\n perMove = options.perMove;\n perPage = options.perPage;\n endIndex = getEnd();\n var index = clamp(currIndex, 0, omitEnd ? endIndex : slideCount - 1);\n\n if (index !== currIndex) {\n currIndex = index;\n Move.reposition();\n }\n }\n\n function onResized() {\n if (endIndex !== getEnd()) {\n emit(EVENT_END_INDEX_CHANGED);\n }\n }\n\n function go(control, allowSameIndex, callback) {\n if (!isBusy()) {\n var dest = parse(control);\n var index = loop(dest);\n\n if (index > -1 && (allowSameIndex || index !== currIndex)) {\n setIndex(index);\n Move.move(dest, index, prevIndex, callback);\n }\n }\n }\n\n function scroll(destination, duration, snap, callback) {\n Components2.Scroll.scroll(destination, duration, snap, function () {\n var index = loop(Move.toIndex(getPosition()));\n setIndex(omitEnd ? min(index, endIndex) : index);\n callback && callback();\n });\n }\n\n function parse(control) {\n var index = currIndex;\n\n if (isString(control)) {\n var _ref = control.match(/([+\\-<>])(\\d+)?/) || [],\n indicator = _ref[1],\n number = _ref[2];\n\n if (indicator === \"+\" || indicator === \"-\") {\n index = computeDestIndex(currIndex + +(\"\" + indicator + (+number || 1)), currIndex);\n } else if (indicator === \">\") {\n index = number ? toIndex(+number) : getNext(true);\n } else if (indicator === \"<\") {\n index = getPrev(true);\n }\n } else {\n index = isLoop ? control : clamp(control, 0, endIndex);\n }\n\n return index;\n }\n\n function getAdjacent(prev, destination) {\n var number = perMove || (hasFocus() ? 1 : perPage);\n var dest = computeDestIndex(currIndex + number * (prev ? -1 : 1), currIndex, !(perMove || hasFocus()));\n\n if (dest === -1 && isSlide) {\n if (!approximatelyEqual(getPosition(), getLimit(!prev), 1)) {\n return prev ? 0 : endIndex;\n }\n }\n\n return destination ? dest : loop(dest);\n }\n\n function computeDestIndex(dest, from, snapPage) {\n if (isEnough() || hasFocus()) {\n var index = computeMovableDestIndex(dest);\n\n if (index !== dest) {\n from = dest;\n dest = index;\n snapPage = false;\n }\n\n if (dest < 0 || dest > endIndex) {\n if (!perMove && (between(0, dest, from, true) || between(endIndex, from, dest, true))) {\n dest = toIndex(toPage(dest));\n } else {\n if (isLoop) {\n dest = snapPage ? dest < 0 ? -(slideCount % perPage || perPage) : slideCount : dest;\n } else if (options.rewind) {\n dest = dest < 0 ? endIndex : 0;\n } else {\n dest = -1;\n }\n }\n } else {\n if (snapPage && dest !== from) {\n dest = toIndex(toPage(from) + (dest < from ? -1 : 1));\n }\n }\n } else {\n dest = -1;\n }\n\n return dest;\n }\n\n function computeMovableDestIndex(dest) {\n if (isSlide && options.trimSpace === \"move\" && dest !== currIndex) {\n var position = getPosition();\n\n while (position === toPosition(dest, true) && between(dest, 0, Splide2.length - 1, !options.rewind)) {\n dest < currIndex ? --dest : ++dest;\n }\n }\n\n return dest;\n }\n\n function loop(index) {\n return isLoop ? (index + slideCount) % slideCount || 0 : index;\n }\n\n function getEnd() {\n var end = slideCount - (hasFocus() || isLoop && perMove ? 1 : perPage);\n\n while (omitEnd && end-- > 0) {\n if (toPosition(slideCount - 1, true) !== toPosition(end, true)) {\n end++;\n break;\n }\n }\n\n return clamp(end, 0, slideCount - 1);\n }\n\n function toIndex(page) {\n return clamp(hasFocus() ? page : perPage * page, 0, endIndex);\n }\n\n function toPage(index) {\n return hasFocus() ? min(index, endIndex) : floor((index >= endIndex ? slideCount - 1 : index) / perPage);\n }\n\n function toDest(destination) {\n var closest = Move.toIndex(destination);\n return isSlide ? clamp(closest, 0, endIndex) : closest;\n }\n\n function setIndex(index) {\n if (index !== currIndex) {\n prevIndex = currIndex;\n currIndex = index;\n }\n }\n\n function getIndex(prev) {\n return prev ? prevIndex : currIndex;\n }\n\n function hasFocus() {\n return !isUndefined(options.focus) || options.isNavigation;\n }\n\n function isBusy() {\n return Splide2.state.is([MOVING, SCROLLING]) && !!options.waitForTransition;\n }\n\n return {\n mount: mount,\n go: go,\n scroll: scroll,\n getNext: getNext,\n getPrev: getPrev,\n getAdjacent: getAdjacent,\n getEnd: getEnd,\n setIndex: setIndex,\n getIndex: getIndex,\n toIndex: toIndex,\n toPage: toPage,\n toDest: toDest,\n hasFocus: hasFocus,\n isBusy: isBusy\n };\n}\n\nvar XML_NAME_SPACE = \"http://www.w3.org/2000/svg\";\nvar PATH = \"m15.5 0.932-4.3 4.38 14.5 14.6-14.5 14.5 4.3 4.4 14.6-14.6 4.4-4.3-4.4-4.4-14.6-14.6z\";\nvar SIZE = 40;\n\nfunction Arrows(Splide2, Components2, options) {\n var event = EventInterface(Splide2);\n var on = event.on,\n bind = event.bind,\n emit = event.emit;\n var classes = options.classes,\n i18n = options.i18n;\n var Elements = Components2.Elements,\n Controller = Components2.Controller;\n var placeholder = Elements.arrows,\n track = Elements.track;\n var wrapper = placeholder;\n var prev = Elements.prev;\n var next = Elements.next;\n var created;\n var wrapperClasses;\n var arrows = {};\n\n function mount() {\n init();\n on(EVENT_UPDATED, remount);\n }\n\n function remount() {\n destroy();\n mount();\n }\n\n function init() {\n var enabled = options.arrows;\n\n if (enabled && !(prev && next)) {\n createArrows();\n }\n\n if (prev && next) {\n assign(arrows, {\n prev: prev,\n next: next\n });\n display(wrapper, enabled ? \"\" : \"none\");\n addClass(wrapper, wrapperClasses = CLASS_ARROWS + \"--\" + options.direction);\n\n if (enabled) {\n listen();\n update();\n setAttribute([prev, next], ARIA_CONTROLS, track.id);\n emit(EVENT_ARROWS_MOUNTED, prev, next);\n }\n }\n }\n\n function destroy() {\n event.destroy();\n removeClass(wrapper, wrapperClasses);\n\n if (created) {\n remove(placeholder ? [prev, next] : wrapper);\n prev = next = null;\n } else {\n removeAttribute([prev, next], ALL_ATTRIBUTES);\n }\n }\n\n function listen() {\n on([EVENT_MOUNTED, EVENT_MOVED, EVENT_REFRESH, EVENT_SCROLLED, EVENT_END_INDEX_CHANGED], update);\n bind(next, \"click\", apply(go, \">\"));\n bind(prev, \"click\", apply(go, \"<\"));\n }\n\n function go(control) {\n Controller.go(control, true);\n }\n\n function createArrows() {\n wrapper = placeholder || create(\"div\", classes.arrows);\n prev = createArrow(true);\n next = createArrow(false);\n created = true;\n append(wrapper, [prev, next]);\n !placeholder && before(wrapper, track);\n }\n\n function createArrow(prev2) {\n var arrow = \"\";\n };\n\n _proto3.html = function html() {\n var _this$config = this.config,\n rootClass = _this$config.rootClass,\n listTag = _this$config.listTag,\n arrows = _this$config.arrows,\n beforeTrack = _this$config.beforeTrack,\n afterTrack = _this$config.afterTrack,\n slider = _this$config.slider,\n beforeSlider = _this$config.beforeSlider,\n afterSlider = _this$config.afterSlider;\n var html = \"\";\n html += \"
      \";\n html += \"\";\n\n if (slider) {\n html += beforeSlider || \"\";\n html += \"
      \";\n }\n\n html += beforeTrack || \"\";\n\n if (arrows) {\n html += this.renderArrows();\n }\n\n html += \"
      \";\n html += \"<\" + listTag + \" class=\\\"splide__list\\\">\";\n html += this.renderSlides();\n html += \"\";\n html += \"
      \";\n html += afterTrack || \"\";\n\n if (slider) {\n html += \"
      \";\n html += afterSlider || \"\";\n }\n\n html += \"
      \";\n return html;\n };\n\n return SplideRenderer;\n}();\n\nexport { CLASSES, CLASS_ACTIVE, CLASS_ARROW, CLASS_ARROWS, CLASS_ARROW_NEXT, CLASS_ARROW_PREV, CLASS_CLONE, CLASS_CONTAINER, CLASS_FOCUS_IN, CLASS_INITIALIZED, CLASS_LIST, CLASS_LOADING, CLASS_NEXT, CLASS_OVERFLOW, CLASS_PAGINATION, CLASS_PAGINATION_PAGE, CLASS_PREV, CLASS_PROGRESS, CLASS_PROGRESS_BAR, CLASS_ROOT, CLASS_SLIDE, CLASS_SPINNER, CLASS_SR, CLASS_TOGGLE, CLASS_TOGGLE_PAUSE, CLASS_TOGGLE_PLAY, CLASS_TRACK, CLASS_VISIBLE, DEFAULTS, EVENT_ACTIVE, EVENT_ARROWS_MOUNTED, EVENT_ARROWS_UPDATED, EVENT_AUTOPLAY_PAUSE, EVENT_AUTOPLAY_PLAY, EVENT_AUTOPLAY_PLAYING, EVENT_CLICK, EVENT_DESTROY, EVENT_DRAG, EVENT_DRAGGED, EVENT_DRAGGING, EVENT_END_INDEX_CHANGED, EVENT_HIDDEN, EVENT_INACTIVE, EVENT_LAZYLOAD_LOADED, EVENT_MOUNTED, EVENT_MOVE, EVENT_MOVED, EVENT_NAVIGATION_MOUNTED, EVENT_OVERFLOW, EVENT_PAGINATION_MOUNTED, EVENT_PAGINATION_UPDATED, EVENT_READY, EVENT_REFRESH, EVENT_RESIZE, EVENT_RESIZED, EVENT_SCROLL, EVENT_SCROLLED, EVENT_SHIFTED, EVENT_SLIDE_KEYDOWN, EVENT_UPDATED, EVENT_VISIBLE, EventBinder, EventInterface, FADE, LOOP, LTR, RTL, RequestInterval, SLIDE, STATUS_CLASSES, Splide, SplideRenderer, State, TTB, Throttle, Splide as default };\n","// import 'bootstrap'; // ohne Pfadangabe (Modul auslesen aus node_modules) funktioniert nur mit JS-Bundler (esbuild, rollup & co.)\n\nimport ProductManager from './modules/ProductManager'; // Dateiendung kann weggelassen werden, wenn ein Bundler eingesetzt wird (esbuild, webpack, rollup, etc.)\nimport Splide from '@splidejs/splide';\n\n(() => {\n // === DOM & VARS =======\n const DOM = {};\n\n // === INIT =============\n const init = () => {\n console.log('init');\n router();\n };\n\n // === EVENTHANDLER =====\n\n // === XHR/FETCH ========\n\n // === FUNCTIONS ========\n const router = () => {\n const path = window.location.pathname;\n\n console.log(path);\n\n switch (path) {\n case '/':\n case '/index.html':\n console.log('HOME');\n const splider = new Splide('.splide', {\n type: 'loop',\n fixedHeight: '100%',\n height: '100%',\n autoHeight: true,\n }).mount();\n\n // nur Skripte, die für Home relevant ausführen\n break;\n case '/projects/product-manager.html':\n console.log('PRODUCT_MANAGER');\n const pm = ProductManager();\n break;\n default:\n console.warn('Page not found');\n }\n };\n\n init();\n})();\n"],"names":["__awaiter","thisArg","_arguments","P","generator","adopt","value","resolve","Promise","reject","fulfilled","step","next","e","rejected","result","done","then","apply","SuppressedError","error","suppressed","message","Error","name","top","bottom","right","left","auto","basePlacements","start","end","clippingParents","viewport","popper","reference","variationPlacements","reduce","acc","placement","concat","placements","beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite","modifierPhases","getNodeName","element","nodeName","toLowerCase","getWindow","node","window","toString","ownerDocument","defaultView","isElement","OwnElement","Element","isHTMLElement","HTMLElement","isShadowRoot","ShadowRoot","applyStyles","_ref","state","Object","keys","elements","forEach","style","styles","attributes","assign","removeAttribute","setAttribute","effect","_ref2","initialStyles","position","options","strategy","margin","arrow","styleProperties","hasOwnProperty","property","attribute","enabled","phase","fn","requires","getBasePlacement","split","max","Math","min","round","getUAString","uaData","navigator","userAgentData","brands","Array","isArray","map","item","brand","version","join","userAgent","isLayoutViewport","test","getBoundingClientRect","includeScale","isFixedStrategy","clientRect","scaleX","scaleY","offsetWidth","width","offsetHeight","height","visualViewport","addVisualOffsets","x","offsetLeft","y","offsetTop","getLayoutRect","abs","contains","parent","child","rootNode","getRootNode","isSameNode","parentNode","host","getComputedStyle","isTableElement","indexOf","getDocumentElement","document","documentElement","getParentNode","assignedSlot","getTrueOffsetParent","offsetParent","getContainingBlock","isFirefox","isIE","elementCss","currentNode","css","transform","perspective","contain","willChange","filter","getOffsetParent","getMainAxisFromPlacement","within","mathMax","mathMin","withinMaxClamp","v","getFreshSideObject","mergePaddingObject","paddingObject","expandToHashMap","hashMap","key","toPaddingObject","padding","rects","_state$modifiersData$","arrowElement","popperOffsets","modifiersData","basePlacement","axis","isVertical","len","arrowRect","minProp","maxProp","endDiff","startDiff","arrowOffsetParent","clientSize","clientHeight","clientWidth","centerToReference","center","offset","axisProp","centerOffset","_options$element","querySelector","requiresIfExists","getVariation","unsetSides","roundOffsetsByDPR","win","dpr","devicePixelRatio","mapToStyles","_Object$assign2","popperRect","variation","offsets","gpuAcceleration","adaptive","roundOffsets","isFixed","_offsets$x","_offsets$y","_ref3","hasX","hasY","sideX","sideY","heightProp","widthProp","offsetY","offsetX","commonStyles","_ref4","_Object$assign","computeStyles","_ref5","_options$gpuAccelerat","_options$adaptive","_options$roundOffsets","data","passive","instance","_options$scroll","scroll","_options$resize","resize","scrollParents","scrollParent","addEventListener","update","removeEventListener","hash","getOppositePlacement","replace","matched","getOppositeVariationPlacement","getWindowScroll","scrollLeft","pageXOffset","scrollTop","pageYOffset","getWindowScrollBarX","getViewportRect","html","layoutViewport","getDocumentRect","_element$ownerDocumen","winScroll","body","scrollWidth","scrollHeight","direction","isScrollParent","_getComputedStyle","overflow","overflowX","overflowY","getScrollParent","listScrollParents","list","isBody","target","updatedList","rectToClientRect","rect","getInnerBoundingClientRect","clientTop","clientLeft","getClientRectFromMixedType","clippingParent","getClippingParents","canEscapeClipping","clipperElement","getClippingRect","boundary","rootBoundary","mainClippingParents","firstClippingParent","clippingRect","accRect","computeOffsets","commonX","commonY","mainAxis","detectOverflow","_options","_options$placement","_options$strategy","_options$boundary","_options$rootBoundary","_options$elementConte","elementContext","_options$altBoundary","altBoundary","_options$padding","altContext","clippingClientRect","contextElement","referenceClientRect","popperClientRect","elementClientRect","overflowOffsets","offsetData","multiply","computeAutoPlacement","flipVariations","_options$allowedAutoP","allowedAutoPlacements","allPlacements","allowedPlacements","length","overflows","sort","a","b","getExpandedFallbackPlacements","oppositePlacement","flip","_skip","_options$mainAxis","checkMainAxis","_options$altAxis","altAxis","checkAltAxis","specifiedFallbackPlacements","fallbackPlacements","_options$flipVariatio","preferredPlacement","isBasePlacement","referenceRect","checksMap","Map","makeFallbackChecks","firstFittingPlacement","i","_basePlacement","isStartVariation","mainVariationSide","altVariationSide","checks","push","every","check","set","numberOfChecks","_loop","_i","fittingPlacement","find","get","slice","_ret","reset","getSideOffsets","preventedOffsets","isAnySideFullyClipped","some","side","hide","preventOverflow","referenceOverflow","popperAltOverflow","referenceClippingOffsets","popperEscapeOffsets","isReferenceHidden","hasPopperEscaped","distanceAndSkiddingToXY","invertDistance","skidding","distance","_options$offset","_data$state$placement","getAltAxis","_options$tether","tether","_options$tetherOffset","tetherOffset","tetherOffsetValue","normalizedTetherOffsetValue","offsetModifierState","_offsetModifierState$","mainSide","altSide","additive","minLen","maxLen","arrowPaddingObject","arrowPaddingMin","arrowPaddingMax","arrowLen","minOffset","maxOffset","clientOffset","offsetModifierValue","tetherMin","tetherMax","preventedOffset","_offsetModifierState$2","_mainSide","_altSide","_offset","_len","_min","_max","isOriginSide","_offsetModifierValue","_tetherMin","_tetherMax","_preventedOffset","getHTMLElementScroll","getNodeScroll","isElementScaled","getCompositeRect","elementOrVirtualElement","isOffsetParentAnElement","offsetParentIsScaled","order","modifiers","visited","Set","modifier","add","dep","has","depModifier","orderModifiers","orderedModifiers","debounce","pending","undefined","mergeByName","merged","current","existing","DEFAULT_OPTIONS","areValidElements","arguments","args","_key","popperGenerator","generatorOptions","_generatorOptions","_generatorOptions$def","defaultModifiers","_generatorOptions$def2","defaultOptions","createPopper","effectCleanupFns","isDestroyed","setOptions","setOptionsAction","cleanupModifierEffects","m","runModifierEffects","forceUpdate","_state$elements","index","_state$orderedModifie","_state$orderedModifie2","destroy","onFirstUpdate","_ref$options","cleanupFn","noopFn","eventListeners","elementMap","Data","instanceMap","size","console","from","remove","delete","root","factory","module","exports","Toastify","this","global","lib","init","defaults","oldestFirst","text","duration","selector","callback","destination","newWindow","close","gravity","positionLeft","backgroundColor","avatar","className","stopOnFocus","onClick","escapeMarkup","ariaLive","background","prototype","toastify","constructor","toastElement","buildToast","divElement","createElement","warn","nodeType","Node","ELEMENT_NODE","appendChild","innerText","innerHTML","avatarElement","src","insertAdjacentElement","closeElement","type","event","stopPropagation","removeElement","clearTimeout","timeOutValue","bind","innerWidth","screen","self","setTimeout","open","location","getAxisOffsetAValue","xOffset","yOffset","showToast","rootElement","getElementById","elementToInsert","firstChild","lastChild","insertBefore","reposition","hideToast","removeChild","call","topLeftOffsetSize","topRightOffsetSize","offsetSize","allToasts","getElementsByClassName","classUsed","containsClass","substr","isNaN","elem","yourClass","trim","Toast","variant","getColorByName","color","show","querySelectorTyped","parents","el","currentEl","parentElement","matches","ProductManager","BASE_URL","DOM","table","tBody","inputName","inputPrice","btnAdd","templateRow","btnSave","btnReset","modalEdit","formEdit","inputEditName","inputEditPrice","inputEditId","inputEditPosition","btnUpdate","modalDelete","productName","btnConfirmDelete","log","bsModalEdit","Modal","backdrop","keyboard","bsModalDelete","initProducts","onClickReset","onClickSave","onClickAdd","disabled","onClickConfirmDelete","onSubmitEdit","onKeyUp","currentTarget","resetProducts","success","msg","loadProducts","btnEl","icon","classList","saveProducts","preventDefault","product","price","Number","_id","updateProduct","resetFields","createProduct","disableNonFunctionalButtons","onClickEdit","currentRow","id","String","dataset","getProduct","showModalEdit","onClickRemove","textContent","deleteProduct","onClickMoveUp","currentRowEl","previousElementSibling","before","onClickMoveDown","nextElementSibling","after","onMouseDownDrag","draggable","onMouseUpDrag","onDragStart","idx","children","_a","dataTransfer","setData","onDragOver","onDrop","targetIdx","sourceIdx","parseInt","getData","draggedEl","response","fetch","method","headers","JSON","stringify","ok","json","save","getProducts","products","addProduct","trEl","content","firstElementChild","cloneNode","tdNameEl","tdPriceEl","btnRemoveEl","btnMoveUpEl","btnMoveDownEl","btnDragEl","btnEditEl","querySelectorAll","tr","btnMoveUp","btnMoveDown","_defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","_createClass","Constructor","protoProps","staticProps","MEDIA_PREFERS_REDUCED_MOTION","CREATED","MOUNTED","IDLE","MOVING","SCROLLING","DRAGGING","DESTROYED","STATES","empty","array","arrayLike","func","nextTick","noop","raf","requestAnimationFrame","typeOf","subject","isObject","isNull","isFunction","isString","isUndefined","toArray","values","iteratee","includes","items","toggleClass","elm","classes","addClass","append","nodes","ref","children2","ownKeys","forOwn","object","reverse","source","merge","omit","elms","attrs","attr","value2","create","tag","prop","display","display2","focus","preventScroll","getAttribute","hasClass","parseHtml","DOMParser","parseFromString","prevent","stopImmediatePropagation","query","queryAll","removeClass","timeOf","timeStamp","unit","PROJECT_CODE","DATA_ATTRIBUTE","assert","condition","floor","ceil","approximatelyEqual","epsilon","between","number","exclusive","minimum","maximum","clamp","sign","format","string","replacements","replacement","pad","ids","uniqueId","prefix","EventBinder","listeners","targets","events","forEachEvent","namespace","isEventTarget","remover","unbind","listener","dispatch","detail","bubbles","CustomEvent","createEvent","initCustomEvent","dispatchEvent","events2","eventNS","fragment","EVENT_MOUNTED","EVENT_READY","EVENT_MOVE","EVENT_MOVED","EVENT_CLICK","EVENT_ACTIVE","EVENT_INACTIVE","EVENT_VISIBLE","EVENT_HIDDEN","EVENT_REFRESH","EVENT_UPDATED","EVENT_RESIZE","EVENT_RESIZED","EVENT_DRAG","EVENT_DRAGGING","EVENT_DRAGGED","EVENT_SCROLL","EVENT_SCROLLED","EVENT_OVERFLOW","EVENT_DESTROY","EVENT_ARROWS_MOUNTED","EVENT_ARROWS_UPDATED","EVENT_PAGINATION_MOUNTED","EVENT_PAGINATION_UPDATED","EVENT_NAVIGATION_MOUNTED","EVENT_AUTOPLAY_PLAY","EVENT_AUTOPLAY_PLAYING","EVENT_AUTOPLAY_PAUSE","EVENT_LAZYLOAD_LOADED","EVENT_SLIDE_KEYDOWN","EVENT_SHIFTED","EVENT_END_INDEX_CHANGED","EventInterface","Splide2","bus","createDocumentFragment","binder","on","emit","off","RequestInterval","interval","onInterval","onUpdate","limit","now","Date","startTime","rate","paused","count","pause","resume","cancel","rewind","cancelAnimationFrame","time","isPaused","State","initialState","is","states","Throttle","Media","Components2","breakpoints","reducedMotion","queries","setup","isMin","mediaQuery","n","register","completely","options2","queryList","matchMedia","destroyed","merged2","entry","mount","refresh","enable","opts","base","notify","getPrototypeOf","ARROW","ARROW_LEFT","ARROW_RIGHT","ARROW_UP","ARROW_DOWN","RTL","TTB","ORIENTATION_MAP","X","Y","ArrowLeft","ArrowRight","Direction","axisOnly","match","charAt","toUpperCase","orient","ROLE","TAB_INDEX","DISABLED","ARIA_PREFIX","ARIA_CONTROLS","ARIA_CURRENT","ARIA_SELECTED","ARIA_LABEL","ARIA_LABELLEDBY","ARIA_HIDDEN","ARIA_ORIENTATION","ARIA_ROLEDESCRIPTION","ARIA_LIVE","ARIA_BUSY","ARIA_ATOMIC","ALL_ATTRIBUTES","CLASS_PREFIX","STATUS_CLASS_PREFIX","CLASS_ROOT","CLASS_TRACK","CLASS_LIST","CLASS_SLIDE","CLASS_CLONE","CLASS_CONTAINER","CLASS_ARROWS","CLASS_ARROW","CLASS_ARROW_PREV","CLASS_ARROW_NEXT","CLASS_PAGINATION","CLASS_PAGINATION_PAGE","CLASS_PROGRESS","CLASS_PROGRESS_BAR","CLASS_TOGGLE","CLASS_SPINNER","CLASS_SR","CLASS_INITIALIZED","CLASS_ACTIVE","CLASS_PREV","CLASS_NEXT","CLASS_VISIBLE","CLASS_LOADING","CLASS_FOCUS_IN","CLASS_OVERFLOW","STATUS_CLASSES","CLASSES","slide","clone","arrows","prev","pagination","page","spinner","closest","FRICTION","LOG_INTERVAL","POINTER_DOWN_EVENTS","POINTER_MOVE_EVENTS","POINTER_UP_EVENTS","Elements","_EventInterface","i18n","slides","rootClasses","trackClasses","track","isUsingKey","collect","capture","getClasses","label","labelledby","bar","toggle","role","tagName","carousel","drag","isNavigation","SLIDE","LOOP","FADE","Slide$1","slideIndex","Components","updateOnMove","slideFocus","isClone","container","slideLabel","listen","initNavigation","onMove","controls","splides","Slide2","splide","Slides","getAt","slideX","curr","updateActivity","updateVisibility","active","isActive","visible","isVisible","hidden","focusableNodes","activeElement","style$1","useContainer","cloneStatus","trackRect","slideRect","isWithin","diff","_EventInterface2","_Components2$Elements","Slides2","forEach$1","Slide1","excludeClones","getIn","Controller","toIndex","hasFocus","perPage","observeImages","remove$1","matcher","images","img","getLength","isEnough","Layout","_EventInterface3","_Components2$Elements2","styleSlides","vertical","rootRect","cssPadding","force","newRect","cssTrackHeight","gap","cssSlideWidth","cssSlideHeight","isOverflow","cssHeight","heightRatio","autoWidth","fixedWidth","cssSlideSize","fixedHeight","autoHeight","listSize","slideSize","withoutGap","Slide","getGap","totalSize","sliderSize","parseFloat","getPadding","MULTIPLIER","Clones","clones","cloneCount","remount","observe","computeCloneCount","generate","isHead","cloneDeep","clones2","fixedSize","fixedCount","Move","_EventInterface4","_Components2$Layout","_Components2$Directio","_Components2$Elements3","Transition","isBusy","Scroll","jump","move","dest","canShift","translate","shift","getPosition","toPosition","preventLoop","loop","exceededMax","getEnd","exceededMin","backwards","excess","getLimit","minDistance","Infinity","trimming","trimSpace","shifted","exceededLimit","_EventInterface5","_Components2$Slides","omitEnd","isLoop","isSlide","getNext","getAdjacent","getPrev","currIndex","endIndex","prevIndex","slideCount","perMove","onResized","go","control","allowSameIndex","parse","setIndex","snap","indicator","computeDestIndex","snapPage","computeMovableDestIndex","toPage","toDest","getIndex","waitForTransition","XML_NAME_SPACE","PATH","SIZE","Arrows","placeholder","wrapper","created","wrapperClasses","createArrows","createArrow","prev2","arrowPath","nextIndex","prevLabel","last","nextLabel","first","INTERVAL_DATA_ATTRIBUTE","Autoplay","_EventInterface6","onAnimationFrame","_Components2$Elements4","autoplay","hovered","focused","stopped","play","pauseOnHover","autoToggle","pauseOnFocus","resetProgress","stop","Cover","_EventInterface7","cover","cover2","BOUNCE_DIFF_THRESHOLD","BOUNCE_DURATION","FRICTION_FACTOR","BASE_VELOCITY","MIN_DURATION","_EventInterface8","friction","clear","onScrolled","noConstrain","noDistance","onEnd","to","easing","t","easingFunc","pow","SCROLL_LISTENER_OPTIONS","Drag","_EventInterface9","_Components2$Directio2","basePosition","baseEvent","prevBaseEvent","isFree","dragging","exceeded","clickPrevented","onPointerDown","disable","isTouch","isTouchEvent","isDraggable","button","onPointerMove","onPointerUp","cancelable","constrain","diffCoord","expired","diffTime","hasExceeded","isSliderDirection","shouldStart","velocity","computeVelocity","computeDestination","rewindByDrag","thresholds","dragMinThreshold","isObj","mouse","touch","flickPower","flickMaxPages","orthogonal","coordOf","getBaseEvent","changedTouches","target2","noDrag","TouchEvent","isDragging","NORMALIZATION_MAP","Spacebar","Right","Left","Up","Down","normalizeKey","KEYBOARD_EVENT","Keyboard","_EventInterface10","onKeydown","_disabled","SRC_DATA_ATTRIBUTE","SRCSET_DATA_ATTRIBUTE","IMAGE_SELECTOR","LazyLoad","_EventInterface11","isSequential","lazyLoad","entries","loadNext","srcset","preloadPages","load","onLoad","Pagination","paginationClasses","createPagination","getDirection","select","li","class","pageX","paginationKeyboard","dir","nextPage","paginationDirection","_button","TRIGGER_KEYS","Sync","isParent","sync","navigate","Wheel","_EventInterface12","lastTime","wheel","onWheel","deltaY","wheelMinThreshold","sleep","wheelSleep","shouldPrevent","releaseWheel","SR_REMOVAL_DELAY","Live","_EventInterface13","live","sr","ComponentConstructors","freeze","__proto__","I18N","DEFAULTS","speed","rewindSpeed","Fade","transition","endCallback","getSpeed","useScroll","_Splide","_o","_E","_proto","Extensions","_this","_C","_T","Constructors","Component","component","_this$event","Splide","router","path","pathname"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,60],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZW51bXMuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXROb2RlTmFtZS5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFdpbmRvdy5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2luc3RhbmNlT2YuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9hcHBseVN0eWxlcy5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvbWF0aC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvdXNlckFnZW50LmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvaXNMYXlvdXRWaWV3cG9ydC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldExheW91dFJlY3QuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9jb250YWlucy5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldENvbXB1dGVkU3R5bGUuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pc1RhYmxlRWxlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldERvY3VtZW50RWxlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFBhcmVudE5vZGUuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvd2l0aGluLmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRGcmVzaFNpZGVPYmplY3QuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL21lcmdlUGFkZGluZ09iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZXhwYW5kVG9IYXNoTWFwLmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvYXJyb3cuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldFZhcmlhdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2NvbXB1dGVTdHlsZXMuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9ldmVudExpc3RlbmVycy5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0T3Bwb3NpdGVQbGFjZW1lbnQuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50LmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0V2luZG93U2Nyb2xsLmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0V2luZG93U2Nyb2xsQmFyWC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFZpZXdwb3J0UmVjdC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldERvY3VtZW50UmVjdC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2lzU2Nyb2xsUGFyZW50LmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0U2Nyb2xsUGFyZW50LmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvbGlzdFNjcm9sbFBhcmVudHMuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL3JlY3RUb0NsaWVudFJlY3QuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRDbGlwcGluZ1JlY3QuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2NvbXB1dGVPZmZzZXRzLmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9kZXRlY3RPdmVyZmxvdy5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvY29tcHV0ZUF1dG9QbGFjZW1lbnQuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9mbGlwLmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvaGlkZS5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL29mZnNldC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL3BvcHBlck9mZnNldHMuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldEFsdEF4aXMuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9wcmV2ZW50T3ZlcmZsb3cuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRIVE1MRWxlbWVudFNjcm9sbC5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldE5vZGVTY3JvbGwuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRDb21wb3NpdGVSZWN0LmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9vcmRlck1vZGlmaWVycy5qcyIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZGVib3VuY2UuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL21lcmdlQnlOYW1lLmpzIiwibm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9jcmVhdGVQb3BwZXIuanMiLCJub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3BvcHBlci5qcyIsIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvZGlzdC9qcy9ib290c3RyYXAuZXNtLmpzIiwibm9kZV9tb2R1bGVzL3RvYXN0aWZ5LWpzL3NyYy90b2FzdGlmeS5qcyIsImRldi9zY3JpcHRzL21vZHVsZXMvVG9hc3QudHMiLCJkZXYvc2NyaXB0cy91dGlscy9oZWxwZXJzLnRzIiwiZGV2L3NjcmlwdHMvbW9kdWxlcy9Qcm9kdWN0TWFuYWdlci50cyIsIm5vZGVfbW9kdWxlcy9Ac3BsaWRlanMvc3BsaWRlL2Rpc3QvanMvc3BsaWRlLmVzbS5qcyIsImRldi9zY3JpcHRzL21haW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlLCBTdXBwcmVzc2VkRXJyb3IsIFN5bWJvbCwgSXRlcmF0b3IgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXNEZWNvcmF0ZShjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykge1xyXG4gICAgZnVuY3Rpb24gYWNjZXB0KGYpIHsgaWYgKGYgIT09IHZvaWQgMCAmJiB0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24gZXhwZWN0ZWRcIik7IHJldHVybiBmOyB9XHJcbiAgICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xyXG4gICAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJbltcInN0YXRpY1wiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7XHJcbiAgICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTtcclxuICAgIHZhciBfLCBkb25lID0gZmFsc2U7XHJcbiAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgIHZhciBjb250ZXh0ID0ge307XHJcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XHJcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0LmFjY2Vzc1twXSA9IGNvbnRleHRJbi5hY2Nlc3NbcF07XHJcbiAgICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uIChmKSB7IGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkXCIpOyBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmIHx8IG51bGwpKTsgfTtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcclxuICAgICAgICBpZiAoa2luZCA9PT0gXCJhY2Nlc3NvclwiKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcclxuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXztcclxuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXztcclxuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoXyA9IGFjY2VwdChyZXN1bHQpKSB7XHJcbiAgICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xyXG4gICAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5XSA9IF87XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpO1xyXG4gICAgZG9uZSA9IHRydWU7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19ydW5Jbml0aWFsaXplcnModGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xyXG4gICAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcclxuICAgIH1cclxuICAgIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlIDogdm9pZCAwO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcHJvcEtleSh4KSB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHggPT09IFwic3ltYm9sXCIgPyB4IDogXCJcIi5jb25jYXQoeCk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zZXRGdW5jdGlvbk5hbWUoZiwgbmFtZSwgcHJlZml4KSB7XHJcbiAgICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XHJcbiAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIFwibmFtZVwiLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHByZWZpeCA/IFwiXCIuY29uY2F0KHByZWZpeCwgXCIgXCIsIG5hbWUpIDogbmFtZSB9KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGcgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEl0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpO1xyXG4gICAgcmV0dXJuIGcubmV4dCA9IHZlcmIoMCksIGdbXCJ0aHJvd1wiXSA9IHZlcmIoMSksIGdbXCJyZXR1cm5cIl0gPSB2ZXJiKDIpLCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XHJcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xyXG4gICAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XHJcbiAgICB9XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xyXG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIG9bazJdID0gbVtrXTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcclxuICAgIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xyXG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxyXG4gICAgICAgICAgICByW2tdID0gYVtqXTtcclxuICAgIHJldHVybiByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xyXG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XHJcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XHJcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBBc3luY0l0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBBc3luY0l0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpLCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIsIGF3YWl0UmV0dXJuKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gYXdhaXRSZXR1cm4oZikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGYsIHJlamVjdCk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpZiAoZ1tuXSkgeyBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyBpZiAoZikgaVtuXSA9IGYoaVtuXSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IGZhbHNlIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xyXG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcclxufTtcclxuXHJcbnZhciBvd25LZXlzID0gZnVuY3Rpb24obykge1xyXG4gICAgb3duS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIChvKSB7XHJcbiAgICAgICAgdmFyIGFyID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgayBpbiBvKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIGspKSBhclthci5sZW5ndGhdID0gaztcclxuICAgICAgICByZXR1cm4gYXI7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG93bktleXMobyk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayA9IG93bktleXMobW9kKSwgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSBpZiAoa1tpXSAhPT0gXCJkZWZhdWx0XCIpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwga1tpXSk7XHJcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4oc3RhdGUsIHJlY2VpdmVyKSB7XHJcbiAgICBpZiAocmVjZWl2ZXIgPT09IG51bGwgfHwgKHR5cGVvZiByZWNlaXZlciAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcmVjZWl2ZXIgIT09IFwiZnVuY3Rpb25cIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgdXNlICdpbicgb3BlcmF0b3Igb24gbm9uLW9iamVjdFwiKTtcclxuICAgIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykge1xyXG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcclxuICAgICAgICB2YXIgZGlzcG9zZSwgaW5uZXI7XHJcbiAgICAgICAgaWYgKGFzeW5jKSB7XHJcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcclxuICAgICAgICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcclxuICAgICAgICAgICAgaWYgKGFzeW5jKSBpbm5lciA9IGRpc3Bvc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcclxuICAgICAgICBpZiAoaW5uZXIpIGRpc3Bvc2UgPSBmdW5jdGlvbigpIHsgdHJ5IHsgaW5uZXIuY2FsbCh0aGlzKTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7IH0gfTtcclxuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoYXN5bmMpIHtcclxuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG5cclxufVxyXG5cclxudmFyIF9TdXBwcmVzc2VkRXJyb3IgPSB0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcclxuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xyXG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XHJcbiAgICBmdW5jdGlvbiBmYWlsKGUpIHtcclxuICAgICAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgX1N1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XHJcbiAgICAgICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHZhciByLCBzID0gMDtcclxuICAgIGZ1bmN0aW9uIG5leHQoKSB7XHJcbiAgICAgICAgd2hpbGUgKHIgPSBlbnYuc3RhY2sucG9wKCkpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmICghci5hc3luYyAmJiBzID09PSAxKSByZXR1cm4gcyA9IDAsIGVudi5zdGFjay5wdXNoKHIpLCBQcm9taXNlLnJlc29sdmUoKS50aGVuKG5leHQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHIuZGlzcG9zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSByLmRpc3Bvc2UuY2FsbChyLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoci5hc3luYykgcmV0dXJuIHMgfD0gMiwgUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBzIHw9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGZhaWwoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHMgPT09IDEpIHJldHVybiBlbnYuaGFzRXJyb3IgPyBQcm9taXNlLnJlamVjdChlbnYuZXJyb3IpIDogUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICAgICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5leHQoKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uKHBhdGgsIHByZXNlcnZlSnN4KSB7XHJcbiAgICBpZiAodHlwZW9mIHBhdGggPT09IFwic3RyaW5nXCIgJiYgL15cXC5cXC4/XFwvLy50ZXN0KHBhdGgpKSB7XHJcbiAgICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZSgvXFwuKHRzeCkkfCgoPzpcXC5kKT8pKCg/OlxcLlteLi9dKz8pPylcXC4oW2NtXT8pdHMkL2ksIGZ1bmN0aW9uIChtLCB0c3gsIGQsIGV4dCwgY20pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRzeCA/IHByZXNlcnZlSnN4ID8gXCIuanN4XCIgOiBcIi5qc1wiIDogZCAmJiAoIWV4dCB8fCAhY20pID8gbSA6IChkICsgZXh0ICsgXCIuXCIgKyBjbS50b0xvd2VyQ2FzZSgpICsgXCJqc1wiKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXRoO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgICBfX2V4dGVuZHM6IF9fZXh0ZW5kcyxcclxuICAgIF9fYXNzaWduOiBfX2Fzc2lnbixcclxuICAgIF9fcmVzdDogX19yZXN0LFxyXG4gICAgX19kZWNvcmF0ZTogX19kZWNvcmF0ZSxcclxuICAgIF9fcGFyYW06IF9fcGFyYW0sXHJcbiAgICBfX2VzRGVjb3JhdGU6IF9fZXNEZWNvcmF0ZSxcclxuICAgIF9fcnVuSW5pdGlhbGl6ZXJzOiBfX3J1bkluaXRpYWxpemVycyxcclxuICAgIF9fcHJvcEtleTogX19wcm9wS2V5LFxyXG4gICAgX19zZXRGdW5jdGlvbk5hbWU6IF9fc2V0RnVuY3Rpb25OYW1lLFxyXG4gICAgX19tZXRhZGF0YTogX19tZXRhZGF0YSxcclxuICAgIF9fYXdhaXRlcjogX19hd2FpdGVyLFxyXG4gICAgX19nZW5lcmF0b3I6IF9fZ2VuZXJhdG9yLFxyXG4gICAgX19jcmVhdGVCaW5kaW5nOiBfX2NyZWF0ZUJpbmRpbmcsXHJcbiAgICBfX2V4cG9ydFN0YXI6IF9fZXhwb3J0U3RhcixcclxuICAgIF9fdmFsdWVzOiBfX3ZhbHVlcyxcclxuICAgIF9fcmVhZDogX19yZWFkLFxyXG4gICAgX19zcHJlYWQ6IF9fc3ByZWFkLFxyXG4gICAgX19zcHJlYWRBcnJheXM6IF9fc3ByZWFkQXJyYXlzLFxyXG4gICAgX19zcHJlYWRBcnJheTogX19zcHJlYWRBcnJheSxcclxuICAgIF9fYXdhaXQ6IF9fYXdhaXQsXHJcbiAgICBfX2FzeW5jR2VuZXJhdG9yOiBfX2FzeW5jR2VuZXJhdG9yLFxyXG4gICAgX19hc3luY0RlbGVnYXRvcjogX19hc3luY0RlbGVnYXRvcixcclxuICAgIF9fYXN5bmNWYWx1ZXM6IF9fYXN5bmNWYWx1ZXMsXHJcbiAgICBfX21ha2VUZW1wbGF0ZU9iamVjdDogX19tYWtlVGVtcGxhdGVPYmplY3QsXHJcbiAgICBfX2ltcG9ydFN0YXI6IF9faW1wb3J0U3RhcixcclxuICAgIF9faW1wb3J0RGVmYXVsdDogX19pbXBvcnREZWZhdWx0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldDogX19jbGFzc1ByaXZhdGVGaWVsZEdldCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQ6IF9fY2xhc3NQcml2YXRlRmllbGRTZXQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW46IF9fY2xhc3NQcml2YXRlRmllbGRJbixcclxuICAgIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlOiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSxcclxuICAgIF9fZGlzcG9zZVJlc291cmNlczogX19kaXNwb3NlUmVzb3VyY2VzLFxyXG4gICAgX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb246IF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uLFxyXG59O1xyXG4iLCJleHBvcnQgdmFyIHRvcCA9ICd0b3AnO1xuZXhwb3J0IHZhciBib3R0b20gPSAnYm90dG9tJztcbmV4cG9ydCB2YXIgcmlnaHQgPSAncmlnaHQnO1xuZXhwb3J0IHZhciBsZWZ0ID0gJ2xlZnQnO1xuZXhwb3J0IHZhciBhdXRvID0gJ2F1dG8nO1xuZXhwb3J0IHZhciBiYXNlUGxhY2VtZW50cyA9IFt0b3AsIGJvdHRvbSwgcmlnaHQsIGxlZnRdO1xuZXhwb3J0IHZhciBzdGFydCA9ICdzdGFydCc7XG5leHBvcnQgdmFyIGVuZCA9ICdlbmQnO1xuZXhwb3J0IHZhciBjbGlwcGluZ1BhcmVudHMgPSAnY2xpcHBpbmdQYXJlbnRzJztcbmV4cG9ydCB2YXIgdmlld3BvcnQgPSAndmlld3BvcnQnO1xuZXhwb3J0IHZhciBwb3BwZXIgPSAncG9wcGVyJztcbmV4cG9ydCB2YXIgcmVmZXJlbmNlID0gJ3JlZmVyZW5jZSc7XG5leHBvcnQgdmFyIHZhcmlhdGlvblBsYWNlbWVudHMgPSAvKiNfX1BVUkVfXyovYmFzZVBsYWNlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICByZXR1cm4gYWNjLmNvbmNhdChbcGxhY2VtZW50ICsgXCItXCIgKyBzdGFydCwgcGxhY2VtZW50ICsgXCItXCIgKyBlbmRdKTtcbn0sIFtdKTtcbmV4cG9ydCB2YXIgcGxhY2VtZW50cyA9IC8qI19fUFVSRV9fKi9bXS5jb25jYXQoYmFzZVBsYWNlbWVudHMsIFthdXRvXSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICByZXR1cm4gYWNjLmNvbmNhdChbcGxhY2VtZW50LCBwbGFjZW1lbnQgKyBcIi1cIiArIHN0YXJ0LCBwbGFjZW1lbnQgKyBcIi1cIiArIGVuZF0pO1xufSwgW10pOyAvLyBtb2RpZmllcnMgdGhhdCBuZWVkIHRvIHJlYWQgdGhlIERPTVxuXG5leHBvcnQgdmFyIGJlZm9yZVJlYWQgPSAnYmVmb3JlUmVhZCc7XG5leHBvcnQgdmFyIHJlYWQgPSAncmVhZCc7XG5leHBvcnQgdmFyIGFmdGVyUmVhZCA9ICdhZnRlclJlYWQnOyAvLyBwdXJlLWxvZ2ljIG1vZGlmaWVyc1xuXG5leHBvcnQgdmFyIGJlZm9yZU1haW4gPSAnYmVmb3JlTWFpbic7XG5leHBvcnQgdmFyIG1haW4gPSAnbWFpbic7XG5leHBvcnQgdmFyIGFmdGVyTWFpbiA9ICdhZnRlck1haW4nOyAvLyBtb2RpZmllciB3aXRoIHRoZSBwdXJwb3NlIHRvIHdyaXRlIHRvIHRoZSBET00gKG9yIHdyaXRlIGludG8gYSBmcmFtZXdvcmsgc3RhdGUpXG5cbmV4cG9ydCB2YXIgYmVmb3JlV3JpdGUgPSAnYmVmb3JlV3JpdGUnO1xuZXhwb3J0IHZhciB3cml0ZSA9ICd3cml0ZSc7XG5leHBvcnQgdmFyIGFmdGVyV3JpdGUgPSAnYWZ0ZXJXcml0ZSc7XG5leHBvcnQgdmFyIG1vZGlmaWVyUGhhc2VzID0gW2JlZm9yZVJlYWQsIHJlYWQsIGFmdGVyUmVhZCwgYmVmb3JlTWFpbiwgbWFpbiwgYWZ0ZXJNYWluLCBiZWZvcmVXcml0ZSwgd3JpdGUsIGFmdGVyV3JpdGVdOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE5vZGVOYW1lKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGVsZW1lbnQgPyAoZWxlbWVudC5ub2RlTmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKSA6IG51bGw7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0V2luZG93KG5vZGUpIHtcbiAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgIHJldHVybiB3aW5kb3c7XG4gIH1cblxuICBpZiAobm9kZS50b1N0cmluZygpICE9PSAnW29iamVjdCBXaW5kb3ddJykge1xuICAgIHZhciBvd25lckRvY3VtZW50ID0gbm9kZS5vd25lckRvY3VtZW50O1xuICAgIHJldHVybiBvd25lckRvY3VtZW50ID8gb3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3cgOiB3aW5kb3c7XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn0iLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuXG5mdW5jdGlvbiBpc0VsZW1lbnQobm9kZSkge1xuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5FbGVtZW50O1xuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIE93bkVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGlzSFRNTEVsZW1lbnQobm9kZSkge1xuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5IVE1MRWxlbWVudDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudDtcbn1cblxuZnVuY3Rpb24gaXNTaGFkb3dSb290KG5vZGUpIHtcbiAgLy8gSUUgMTEgaGFzIG5vIFNoYWRvd1Jvb3RcbiAgaWYgKHR5cGVvZiBTaGFkb3dSb290ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBPd25FbGVtZW50ID0gZ2V0V2luZG93KG5vZGUpLlNoYWRvd1Jvb3Q7XG4gIHJldHVybiBub2RlIGluc3RhbmNlb2YgT3duRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdDtcbn1cblxuZXhwb3J0IHsgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50LCBpc1NoYWRvd1Jvb3QgfTsiLCJpbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4uL2RvbS11dGlscy9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuLi9kb20tdXRpbHMvaW5zdGFuY2VPZi5qc1wiOyAvLyBUaGlzIG1vZGlmaWVyIHRha2VzIHRoZSBzdHlsZXMgcHJlcGFyZWQgYnkgdGhlIGBjb21wdXRlU3R5bGVzYCBtb2RpZmllclxuLy8gYW5kIGFwcGxpZXMgdGhlbSB0byB0aGUgSFRNTEVsZW1lbnRzIHN1Y2ggYXMgcG9wcGVyIGFuZCBhcnJvd1xuXG5mdW5jdGlvbiBhcHBseVN0eWxlcyhfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGU7XG4gIE9iamVjdC5rZXlzKHN0YXRlLmVsZW1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdmFyIHN0eWxlID0gc3RhdGUuc3R5bGVzW25hbWVdIHx8IHt9O1xuICAgIHZhciBhdHRyaWJ1dGVzID0gc3RhdGUuYXR0cmlidXRlc1tuYW1lXSB8fCB7fTtcbiAgICB2YXIgZWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzW25hbWVdOyAvLyBhcnJvdyBpcyBvcHRpb25hbCArIHZpcnR1YWwgZWxlbWVudHNcblxuICAgIGlmICghaXNIVE1MRWxlbWVudChlbGVtZW50KSB8fCAhZ2V0Tm9kZU5hbWUoZWxlbWVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIEZsb3cgZG9lc24ndCBzdXBwb3J0IHRvIGV4dGVuZCB0aGlzIHByb3BlcnR5LCBidXQgaXQncyB0aGUgbW9zdFxuICAgIC8vIGVmZmVjdGl2ZSB3YXkgdG8gYXBwbHkgc3R5bGVzIHRvIGFuIEhUTUxFbGVtZW50XG4gICAgLy8gJEZsb3dGaXhNZVtjYW5ub3Qtd3JpdGVdXG5cblxuICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgc3R5bGUpO1xuICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGF0dHJpYnV0ZXNbbmFtZV07XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSA9PT0gdHJ1ZSA/ICcnIDogdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZWZmZWN0KF9yZWYyKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYyLnN0YXRlO1xuICB2YXIgaW5pdGlhbFN0eWxlcyA9IHtcbiAgICBwb3BwZXI6IHtcbiAgICAgIHBvc2l0aW9uOiBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgbGVmdDogJzAnLFxuICAgICAgdG9wOiAnMCcsXG4gICAgICBtYXJnaW46ICcwJ1xuICAgIH0sXG4gICAgYXJyb3c6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnXG4gICAgfSxcbiAgICByZWZlcmVuY2U6IHt9XG4gIH07XG4gIE9iamVjdC5hc3NpZ24oc3RhdGUuZWxlbWVudHMucG9wcGVyLnN0eWxlLCBpbml0aWFsU3R5bGVzLnBvcHBlcik7XG4gIHN0YXRlLnN0eWxlcyA9IGluaXRpYWxTdHlsZXM7XG5cbiAgaWYgKHN0YXRlLmVsZW1lbnRzLmFycm93KSB7XG4gICAgT2JqZWN0LmFzc2lnbihzdGF0ZS5lbGVtZW50cy5hcnJvdy5zdHlsZSwgaW5pdGlhbFN0eWxlcy5hcnJvdyk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIE9iamVjdC5rZXlzKHN0YXRlLmVsZW1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICB2YXIgZWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzW25hbWVdO1xuICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBzdGF0ZS5hdHRyaWJ1dGVzW25hbWVdIHx8IHt9O1xuICAgICAgdmFyIHN0eWxlUHJvcGVydGllcyA9IE9iamVjdC5rZXlzKHN0YXRlLnN0eWxlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSA/IHN0YXRlLnN0eWxlc1tuYW1lXSA6IGluaXRpYWxTdHlsZXNbbmFtZV0pOyAvLyBTZXQgYWxsIHZhbHVlcyB0byBhbiBlbXB0eSBzdHJpbmcgdG8gdW5zZXQgdGhlbVxuXG4gICAgICB2YXIgc3R5bGUgPSBzdHlsZVByb3BlcnRpZXMucmVkdWNlKGZ1bmN0aW9uIChzdHlsZSwgcHJvcGVydHkpIHtcbiAgICAgICAgc3R5bGVbcHJvcGVydHldID0gJyc7XG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICAgIH0sIHt9KTsgLy8gYXJyb3cgaXMgb3B0aW9uYWwgKyB2aXJ0dWFsIGVsZW1lbnRzXG5cbiAgICAgIGlmICghaXNIVE1MRWxlbWVudChlbGVtZW50KSB8fCAhZ2V0Tm9kZU5hbWUoZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlKTtcbiAgICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZSkge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdhcHBseVN0eWxlcycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnd3JpdGUnLFxuICBmbjogYXBwbHlTdHlsZXMsXG4gIGVmZmVjdDogZWZmZWN0LFxuICByZXF1aXJlczogWydjb21wdXRlU3R5bGVzJ11cbn07IiwiaW1wb3J0IHsgYXV0byB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xufSIsImV4cG9ydCB2YXIgbWF4ID0gTWF0aC5tYXg7XG5leHBvcnQgdmFyIG1pbiA9IE1hdGgubWluO1xuZXhwb3J0IHZhciByb3VuZCA9IE1hdGgucm91bmQ7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0VUFTdHJpbmcoKSB7XG4gIHZhciB1YURhdGEgPSBuYXZpZ2F0b3IudXNlckFnZW50RGF0YTtcblxuICBpZiAodWFEYXRhICE9IG51bGwgJiYgdWFEYXRhLmJyYW5kcyAmJiBBcnJheS5pc0FycmF5KHVhRGF0YS5icmFuZHMpKSB7XG4gICAgcmV0dXJuIHVhRGF0YS5icmFuZHMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gaXRlbS5icmFuZCArIFwiL1wiICsgaXRlbS52ZXJzaW9uO1xuICAgIH0pLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50O1xufSIsImltcG9ydCBnZXRVQVN0cmluZyBmcm9tIFwiLi4vdXRpbHMvdXNlckFnZW50LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0xheW91dFZpZXdwb3J0KCkge1xuICByZXR1cm4gIS9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QoZ2V0VUFTdHJpbmcoKSk7XG59IiwiaW1wb3J0IHsgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBpc0xheW91dFZpZXdwb3J0IGZyb20gXCIuL2lzTGF5b3V0Vmlld3BvcnQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50LCBpbmNsdWRlU2NhbGUsIGlzRml4ZWRTdHJhdGVneSkge1xuICBpZiAoaW5jbHVkZVNjYWxlID09PSB2b2lkIDApIHtcbiAgICBpbmNsdWRlU2NhbGUgPSBmYWxzZTtcbiAgfVxuXG4gIGlmIChpc0ZpeGVkU3RyYXRlZ3kgPT09IHZvaWQgMCkge1xuICAgIGlzRml4ZWRTdHJhdGVneSA9IGZhbHNlO1xuICB9XG5cbiAgdmFyIGNsaWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgc2NhbGVYID0gMTtcbiAgdmFyIHNjYWxlWSA9IDE7XG5cbiAgaWYgKGluY2x1ZGVTY2FsZSAmJiBpc0hUTUxFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgc2NhbGVYID0gZWxlbWVudC5vZmZzZXRXaWR0aCA+IDAgPyByb3VuZChjbGllbnRSZWN0LndpZHRoKSAvIGVsZW1lbnQub2Zmc2V0V2lkdGggfHwgMSA6IDE7XG4gICAgc2NhbGVZID0gZWxlbWVudC5vZmZzZXRIZWlnaHQgPiAwID8gcm91bmQoY2xpZW50UmVjdC5oZWlnaHQpIC8gZWxlbWVudC5vZmZzZXRIZWlnaHQgfHwgMSA6IDE7XG4gIH1cblxuICB2YXIgX3JlZiA9IGlzRWxlbWVudChlbGVtZW50KSA/IGdldFdpbmRvdyhlbGVtZW50KSA6IHdpbmRvdyxcbiAgICAgIHZpc3VhbFZpZXdwb3J0ID0gX3JlZi52aXN1YWxWaWV3cG9ydDtcblxuICB2YXIgYWRkVmlzdWFsT2Zmc2V0cyA9ICFpc0xheW91dFZpZXdwb3J0KCkgJiYgaXNGaXhlZFN0cmF0ZWd5O1xuICB2YXIgeCA9IChjbGllbnRSZWN0LmxlZnQgKyAoYWRkVmlzdWFsT2Zmc2V0cyAmJiB2aXN1YWxWaWV3cG9ydCA/IHZpc3VhbFZpZXdwb3J0Lm9mZnNldExlZnQgOiAwKSkgLyBzY2FsZVg7XG4gIHZhciB5ID0gKGNsaWVudFJlY3QudG9wICsgKGFkZFZpc3VhbE9mZnNldHMgJiYgdmlzdWFsVmlld3BvcnQgPyB2aXN1YWxWaWV3cG9ydC5vZmZzZXRUb3AgOiAwKSkgLyBzY2FsZVk7XG4gIHZhciB3aWR0aCA9IGNsaWVudFJlY3Qud2lkdGggLyBzY2FsZVg7XG4gIHZhciBoZWlnaHQgPSBjbGllbnRSZWN0LmhlaWdodCAvIHNjYWxlWTtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgdG9wOiB5LFxuICAgIHJpZ2h0OiB4ICsgd2lkdGgsXG4gICAgYm90dG9tOiB5ICsgaGVpZ2h0LFxuICAgIGxlZnQ6IHgsXG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH07XG59IiwiaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjsgLy8gUmV0dXJucyB0aGUgbGF5b3V0IHJlY3Qgb2YgYW4gZWxlbWVudCByZWxhdGl2ZSB0byBpdHMgb2Zmc2V0UGFyZW50LiBMYXlvdXRcbi8vIG1lYW5zIGl0IGRvZXNuJ3QgdGFrZSBpbnRvIGFjY291bnQgdHJhbnNmb3Jtcy5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0TGF5b3V0UmVjdChlbGVtZW50KSB7XG4gIHZhciBjbGllbnRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQpOyAvLyBVc2UgdGhlIGNsaWVudFJlY3Qgc2l6ZXMgaWYgaXQncyBub3QgYmVlbiB0cmFuc2Zvcm1lZC5cbiAgLy8gRml4ZXMgaHR0cHM6Ly9naXRodWIuY29tL3BvcHBlcmpzL3BvcHBlci1jb3JlL2lzc3Vlcy8xMjIzXG5cbiAgdmFyIHdpZHRoID0gZWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgdmFyIGhlaWdodCA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuXG4gIGlmIChNYXRoLmFicyhjbGllbnRSZWN0LndpZHRoIC0gd2lkdGgpIDw9IDEpIHtcbiAgICB3aWR0aCA9IGNsaWVudFJlY3Qud2lkdGg7XG4gIH1cblxuICBpZiAoTWF0aC5hYnMoY2xpZW50UmVjdC5oZWlnaHQgLSBoZWlnaHQpIDw9IDEpIHtcbiAgICBoZWlnaHQgPSBjbGllbnRSZWN0LmhlaWdodDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgeDogZWxlbWVudC5vZmZzZXRMZWZ0LFxuICAgIHk6IGVsZW1lbnQub2Zmc2V0VG9wLFxuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodFxuICB9O1xufSIsImltcG9ydCB7IGlzU2hhZG93Um9vdCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbnRhaW5zKHBhcmVudCwgY2hpbGQpIHtcbiAgdmFyIHJvb3ROb2RlID0gY2hpbGQuZ2V0Um9vdE5vZGUgJiYgY2hpbGQuZ2V0Um9vdE5vZGUoKTsgLy8gRmlyc3QsIGF0dGVtcHQgd2l0aCBmYXN0ZXIgbmF0aXZlIG1ldGhvZFxuXG4gIGlmIChwYXJlbnQuY29udGFpbnMoY2hpbGQpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gdGhlbiBmYWxsYmFjayB0byBjdXN0b20gaW1wbGVtZW50YXRpb24gd2l0aCBTaGFkb3cgRE9NIHN1cHBvcnRcbiAgZWxzZSBpZiAocm9vdE5vZGUgJiYgaXNTaGFkb3dSb290KHJvb3ROb2RlKSkge1xuICAgICAgdmFyIG5leHQgPSBjaGlsZDtcblxuICAgICAgZG8ge1xuICAgICAgICBpZiAobmV4dCAmJiBwYXJlbnQuaXNTYW1lTm9kZShuZXh0KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXTogbmVlZCBhIGJldHRlciB3YXkgdG8gaGFuZGxlIHRoaXMuLi5cblxuXG4gICAgICAgIG5leHQgPSBuZXh0LnBhcmVudE5vZGUgfHwgbmV4dC5ob3N0O1xuICAgICAgfSB3aGlsZSAobmV4dCk7XG4gICAgfSAvLyBHaXZlIHVwLCB0aGUgcmVzdWx0IGlzIGZhbHNlXG5cblxuICByZXR1cm4gZmFsc2U7XG59IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkge1xuICByZXR1cm4gZ2V0V2luZG93KGVsZW1lbnQpLmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG59IiwiaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1RhYmxlRWxlbWVudChlbGVtZW50KSB7XG4gIHJldHVybiBbJ3RhYmxlJywgJ3RkJywgJ3RoJ10uaW5kZXhPZihnZXROb2RlTmFtZShlbGVtZW50KSkgPj0gMDtcbn0iLCJpbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkge1xuICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dOiBhc3N1bWUgYm9keSBpcyBhbHdheXMgYXZhaWxhYmxlXG4gIHJldHVybiAoKGlzRWxlbWVudChlbGVtZW50KSA/IGVsZW1lbnQub3duZXJEb2N1bWVudCA6IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICBlbGVtZW50LmRvY3VtZW50KSB8fCB3aW5kb3cuZG9jdW1lbnQpLmRvY3VtZW50RWxlbWVudDtcbn0iLCJpbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgeyBpc1NoYWRvd1Jvb3QgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRQYXJlbnROb2RlKGVsZW1lbnQpIHtcbiAgaWYgKGdldE5vZGVOYW1lKGVsZW1lbnQpID09PSAnaHRtbCcpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHJldHVybiAoLy8gdGhpcyBpcyBhIHF1aWNrZXIgKGJ1dCBsZXNzIHR5cGUgc2FmZSkgd2F5IHRvIHNhdmUgcXVpdGUgc29tZSBieXRlcyBmcm9tIHRoZSBidW5kbGVcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dXG4gICAgLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG4gICAgZWxlbWVudC5hc3NpZ25lZFNsb3QgfHwgLy8gc3RlcCBpbnRvIHRoZSBzaGFkb3cgRE9NIG9mIHRoZSBwYXJlbnQgb2YgYSBzbG90dGVkIG5vZGVcbiAgICBlbGVtZW50LnBhcmVudE5vZGUgfHwgKCAvLyBET00gRWxlbWVudCBkZXRlY3RlZFxuICAgIGlzU2hhZG93Um9vdChlbGVtZW50KSA/IGVsZW1lbnQuaG9zdCA6IG51bGwpIHx8IC8vIFNoYWRvd1Jvb3QgZGV0ZWN0ZWRcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYWxsXTogSFRNTEVsZW1lbnQgaXMgYSBOb2RlXG4gICAgZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpIC8vIGZhbGxiYWNrXG5cbiAgKTtcbn0iLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50LCBpc1NoYWRvd1Jvb3QgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgaXNUYWJsZUVsZW1lbnQgZnJvbSBcIi4vaXNUYWJsZUVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcbmltcG9ydCBnZXRVQVN0cmluZyBmcm9tIFwiLi4vdXRpbHMvdXNlckFnZW50LmpzXCI7XG5cbmZ1bmN0aW9uIGdldFRydWVPZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BvcHBlcmpzL3BvcHBlci1jb3JlL2lzc3Vlcy84MzdcbiAgZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbiA9PT0gJ2ZpeGVkJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQub2Zmc2V0UGFyZW50O1xufSAvLyBgLm9mZnNldFBhcmVudGAgcmVwb3J0cyBgbnVsbGAgZm9yIGZpeGVkIGVsZW1lbnRzLCB3aGlsZSBhYnNvbHV0ZSBlbGVtZW50c1xuLy8gcmV0dXJuIHRoZSBjb250YWluaW5nIGJsb2NrXG5cblxuZnVuY3Rpb24gZ2V0Q29udGFpbmluZ0Jsb2NrKGVsZW1lbnQpIHtcbiAgdmFyIGlzRmlyZWZveCA9IC9maXJlZm94L2kudGVzdChnZXRVQVN0cmluZygpKTtcbiAgdmFyIGlzSUUgPSAvVHJpZGVudC9pLnRlc3QoZ2V0VUFTdHJpbmcoKSk7XG5cbiAgaWYgKGlzSUUgJiYgaXNIVE1MRWxlbWVudChlbGVtZW50KSkge1xuICAgIC8vIEluIElFIDksIDEwIGFuZCAxMSBmaXhlZCBlbGVtZW50cyBjb250YWluaW5nIGJsb2NrIGlzIGFsd2F5cyBlc3RhYmxpc2hlZCBieSB0aGUgdmlld3BvcnRcbiAgICB2YXIgZWxlbWVudENzcyA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG5cbiAgICBpZiAoZWxlbWVudENzcy5wb3NpdGlvbiA9PT0gJ2ZpeGVkJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgdmFyIGN1cnJlbnROb2RlID0gZ2V0UGFyZW50Tm9kZShlbGVtZW50KTtcblxuICBpZiAoaXNTaGFkb3dSb290KGN1cnJlbnROb2RlKSkge1xuICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuaG9zdDtcbiAgfVxuXG4gIHdoaWxlIChpc0hUTUxFbGVtZW50KGN1cnJlbnROb2RlKSAmJiBbJ2h0bWwnLCAnYm9keSddLmluZGV4T2YoZ2V0Tm9kZU5hbWUoY3VycmVudE5vZGUpKSA8IDApIHtcbiAgICB2YXIgY3NzID0gZ2V0Q29tcHV0ZWRTdHlsZShjdXJyZW50Tm9kZSk7IC8vIFRoaXMgaXMgbm9uLWV4aGF1c3RpdmUgYnV0IGNvdmVycyB0aGUgbW9zdCBjb21tb24gQ1NTIHByb3BlcnRpZXMgdGhhdFxuICAgIC8vIGNyZWF0ZSBhIGNvbnRhaW5pbmcgYmxvY2suXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NvbnRhaW5pbmdfYmxvY2sjaWRlbnRpZnlpbmdfdGhlX2NvbnRhaW5pbmdfYmxvY2tcblxuICAgIGlmIChjc3MudHJhbnNmb3JtICE9PSAnbm9uZScgfHwgY3NzLnBlcnNwZWN0aXZlICE9PSAnbm9uZScgfHwgY3NzLmNvbnRhaW4gPT09ICdwYWludCcgfHwgWyd0cmFuc2Zvcm0nLCAncGVyc3BlY3RpdmUnXS5pbmRleE9mKGNzcy53aWxsQ2hhbmdlKSAhPT0gLTEgfHwgaXNGaXJlZm94ICYmIGNzcy53aWxsQ2hhbmdlID09PSAnZmlsdGVyJyB8fCBpc0ZpcmVmb3ggJiYgY3NzLmZpbHRlciAmJiBjc3MuZmlsdGVyICE9PSAnbm9uZScpIHtcbiAgICAgIHJldHVybiBjdXJyZW50Tm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufSAvLyBHZXRzIHRoZSBjbG9zZXN0IGFuY2VzdG9yIHBvc2l0aW9uZWQgZWxlbWVudC4gSGFuZGxlcyBzb21lIGVkZ2UgY2FzZXMsXG4vLyBzdWNoIGFzIHRhYmxlIGFuY2VzdG9ycyBhbmQgY3Jvc3MgYnJvd3NlciBidWdzLlxuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9mZnNldFBhcmVudChlbGVtZW50KSB7XG4gIHZhciB3aW5kb3cgPSBnZXRXaW5kb3coZWxlbWVudCk7XG4gIHZhciBvZmZzZXRQYXJlbnQgPSBnZXRUcnVlT2Zmc2V0UGFyZW50KGVsZW1lbnQpO1xuXG4gIHdoaWxlIChvZmZzZXRQYXJlbnQgJiYgaXNUYWJsZUVsZW1lbnQob2Zmc2V0UGFyZW50KSAmJiBnZXRDb21wdXRlZFN0eWxlKG9mZnNldFBhcmVudCkucG9zaXRpb24gPT09ICdzdGF0aWMnKSB7XG4gICAgb2Zmc2V0UGFyZW50ID0gZ2V0VHJ1ZU9mZnNldFBhcmVudChvZmZzZXRQYXJlbnQpO1xuICB9XG5cbiAgaWYgKG9mZnNldFBhcmVudCAmJiAoZ2V0Tm9kZU5hbWUob2Zmc2V0UGFyZW50KSA9PT0gJ2h0bWwnIHx8IGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgPT09ICdib2R5JyAmJiBnZXRDb21wdXRlZFN0eWxlKG9mZnNldFBhcmVudCkucG9zaXRpb24gPT09ICdzdGF0aWMnKSkge1xuICAgIHJldHVybiB3aW5kb3c7XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50KSB8fCB3aW5kb3c7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gWyd0b3AnLCAnYm90dG9tJ10uaW5kZXhPZihwbGFjZW1lbnQpID49IDAgPyAneCcgOiAneSc7XG59IiwiaW1wb3J0IHsgbWF4IGFzIG1hdGhNYXgsIG1pbiBhcyBtYXRoTWluIH0gZnJvbSBcIi4vbWF0aC5qc1wiO1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhpbihtaW4sIHZhbHVlLCBtYXgpIHtcbiAgcmV0dXJuIG1hdGhNYXgobWluLCBtYXRoTWluKHZhbHVlLCBtYXgpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3aXRoaW5NYXhDbGFtcChtaW4sIHZhbHVlLCBtYXgpIHtcbiAgdmFyIHYgPSB3aXRoaW4obWluLCB2YWx1ZSwgbWF4KTtcbiAgcmV0dXJuIHYgPiBtYXggPyBtYXggOiB2O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEZyZXNoU2lkZU9iamVjdCgpIHtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IDAsXG4gICAgcmlnaHQ6IDAsXG4gICAgYm90dG9tOiAwLFxuICAgIGxlZnQ6IDBcbiAgfTtcbn0iLCJpbXBvcnQgZ2V0RnJlc2hTaWRlT2JqZWN0IGZyb20gXCIuL2dldEZyZXNoU2lkZU9iamVjdC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWVyZ2VQYWRkaW5nT2JqZWN0KHBhZGRpbmdPYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGdldEZyZXNoU2lkZU9iamVjdCgpLCBwYWRkaW5nT2JqZWN0KTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBleHBhbmRUb0hhc2hNYXAodmFsdWUsIGtleXMpIHtcbiAgcmV0dXJuIGtleXMucmVkdWNlKGZ1bmN0aW9uIChoYXNoTWFwLCBrZXkpIHtcbiAgICBoYXNoTWFwW2tleV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gaGFzaE1hcDtcbiAgfSwge30pO1xufSIsImltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0TGF5b3V0UmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldExheW91dFJlY3QuanNcIjtcbmltcG9ydCBjb250YWlucyBmcm9tIFwiLi4vZG9tLXV0aWxzL2NvbnRhaW5zLmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanNcIjtcbmltcG9ydCB7IHdpdGhpbiB9IGZyb20gXCIuLi91dGlscy93aXRoaW4uanNcIjtcbmltcG9ydCBtZXJnZVBhZGRpbmdPYmplY3QgZnJvbSBcIi4uL3V0aWxzL21lcmdlUGFkZGluZ09iamVjdC5qc1wiO1xuaW1wb3J0IGV4cGFuZFRvSGFzaE1hcCBmcm9tIFwiLi4vdXRpbHMvZXhwYW5kVG9IYXNoTWFwLmpzXCI7XG5pbXBvcnQgeyBsZWZ0LCByaWdodCwgYmFzZVBsYWNlbWVudHMsIHRvcCwgYm90dG9tIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxudmFyIHRvUGFkZGluZ09iamVjdCA9IGZ1bmN0aW9uIHRvUGFkZGluZ09iamVjdChwYWRkaW5nLCBzdGF0ZSkge1xuICBwYWRkaW5nID0gdHlwZW9mIHBhZGRpbmcgPT09ICdmdW5jdGlvbicgPyBwYWRkaW5nKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnJlY3RzLCB7XG4gICAgcGxhY2VtZW50OiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSkpIDogcGFkZGluZztcbiAgcmV0dXJuIG1lcmdlUGFkZGluZ09iamVjdCh0eXBlb2YgcGFkZGluZyAhPT0gJ251bWJlcicgPyBwYWRkaW5nIDogZXhwYW5kVG9IYXNoTWFwKHBhZGRpbmcsIGJhc2VQbGFjZW1lbnRzKSk7XG59O1xuXG5mdW5jdGlvbiBhcnJvdyhfcmVmKSB7XG4gIHZhciBfc3RhdGUkbW9kaWZpZXJzRGF0YSQ7XG5cbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWUsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zO1xuICB2YXIgYXJyb3dFbGVtZW50ID0gc3RhdGUuZWxlbWVudHMuYXJyb3c7XG4gIHZhciBwb3BwZXJPZmZzZXRzID0gc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzO1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQoc3RhdGUucGxhY2VtZW50KTtcbiAgdmFyIGF4aXMgPSBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQoYmFzZVBsYWNlbWVudCk7XG4gIHZhciBpc1ZlcnRpY2FsID0gW2xlZnQsIHJpZ2h0XS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpID49IDA7XG4gIHZhciBsZW4gPSBpc1ZlcnRpY2FsID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuXG4gIGlmICghYXJyb3dFbGVtZW50IHx8ICFwb3BwZXJPZmZzZXRzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHBhZGRpbmdPYmplY3QgPSB0b1BhZGRpbmdPYmplY3Qob3B0aW9ucy5wYWRkaW5nLCBzdGF0ZSk7XG4gIHZhciBhcnJvd1JlY3QgPSBnZXRMYXlvdXRSZWN0KGFycm93RWxlbWVudCk7XG4gIHZhciBtaW5Qcm9wID0gYXhpcyA9PT0gJ3knID8gdG9wIDogbGVmdDtcbiAgdmFyIG1heFByb3AgPSBheGlzID09PSAneScgPyBib3R0b20gOiByaWdodDtcbiAgdmFyIGVuZERpZmYgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2VbbGVuXSArIHN0YXRlLnJlY3RzLnJlZmVyZW5jZVtheGlzXSAtIHBvcHBlck9mZnNldHNbYXhpc10gLSBzdGF0ZS5yZWN0cy5wb3BwZXJbbGVuXTtcbiAgdmFyIHN0YXJ0RGlmZiA9IHBvcHBlck9mZnNldHNbYXhpc10gLSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2VbYXhpc107XG4gIHZhciBhcnJvd09mZnNldFBhcmVudCA9IGdldE9mZnNldFBhcmVudChhcnJvd0VsZW1lbnQpO1xuICB2YXIgY2xpZW50U2l6ZSA9IGFycm93T2Zmc2V0UGFyZW50ID8gYXhpcyA9PT0gJ3knID8gYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50SGVpZ2h0IHx8IDAgOiBhcnJvd09mZnNldFBhcmVudC5jbGllbnRXaWR0aCB8fCAwIDogMDtcbiAgdmFyIGNlbnRlclRvUmVmZXJlbmNlID0gZW5kRGlmZiAvIDIgLSBzdGFydERpZmYgLyAyOyAvLyBNYWtlIHN1cmUgdGhlIGFycm93IGRvZXNuJ3Qgb3ZlcmZsb3cgdGhlIHBvcHBlciBpZiB0aGUgY2VudGVyIHBvaW50IGlzXG4gIC8vIG91dHNpZGUgb2YgdGhlIHBvcHBlciBib3VuZHNcblxuICB2YXIgbWluID0gcGFkZGluZ09iamVjdFttaW5Qcm9wXTtcbiAgdmFyIG1heCA9IGNsaWVudFNpemUgLSBhcnJvd1JlY3RbbGVuXSAtIHBhZGRpbmdPYmplY3RbbWF4UHJvcF07XG4gIHZhciBjZW50ZXIgPSBjbGllbnRTaXplIC8gMiAtIGFycm93UmVjdFtsZW5dIC8gMiArIGNlbnRlclRvUmVmZXJlbmNlO1xuICB2YXIgb2Zmc2V0ID0gd2l0aGluKG1pbiwgY2VudGVyLCBtYXgpOyAvLyBQcmV2ZW50cyBicmVha2luZyBzeW50YXggaGlnaGxpZ2h0aW5nLi4uXG5cbiAgdmFyIGF4aXNQcm9wID0gYXhpcztcbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IChfc3RhdGUkbW9kaWZpZXJzRGF0YSQgPSB7fSwgX3N0YXRlJG1vZGlmaWVyc0RhdGEkW2F4aXNQcm9wXSA9IG9mZnNldCwgX3N0YXRlJG1vZGlmaWVyc0RhdGEkLmNlbnRlck9mZnNldCA9IG9mZnNldCAtIGNlbnRlciwgX3N0YXRlJG1vZGlmaWVyc0RhdGEkKTtcbn1cblxuZnVuY3Rpb24gZWZmZWN0KF9yZWYyKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYyLnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYyLm9wdGlvbnM7XG4gIHZhciBfb3B0aW9ucyRlbGVtZW50ID0gb3B0aW9ucy5lbGVtZW50LFxuICAgICAgYXJyb3dFbGVtZW50ID0gX29wdGlvbnMkZWxlbWVudCA9PT0gdm9pZCAwID8gJ1tkYXRhLXBvcHBlci1hcnJvd10nIDogX29wdGlvbnMkZWxlbWVudDtcblxuICBpZiAoYXJyb3dFbGVtZW50ID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gQ1NTIHNlbGVjdG9yXG5cblxuICBpZiAodHlwZW9mIGFycm93RWxlbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICBhcnJvd0VsZW1lbnQgPSBzdGF0ZS5lbGVtZW50cy5wb3BwZXIucXVlcnlTZWxlY3RvcihhcnJvd0VsZW1lbnQpO1xuXG4gICAgaWYgKCFhcnJvd0VsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbnRhaW5zKHN0YXRlLmVsZW1lbnRzLnBvcHBlciwgYXJyb3dFbGVtZW50KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHN0YXRlLmVsZW1lbnRzLmFycm93ID0gYXJyb3dFbGVtZW50O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnYXJyb3cnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogYXJyb3csXG4gIGVmZmVjdDogZWZmZWN0LFxuICByZXF1aXJlczogWydwb3BwZXJPZmZzZXRzJ10sXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsncHJldmVudE92ZXJmbG93J11cbn07IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnNwbGl0KCctJylbMV07XG59IiwiaW1wb3J0IHsgdG9wLCBsZWZ0LCByaWdodCwgYm90dG9tLCBlbmQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4uL3V0aWxzL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbnZhciB1bnNldFNpZGVzID0ge1xuICB0b3A6ICdhdXRvJyxcbiAgcmlnaHQ6ICdhdXRvJyxcbiAgYm90dG9tOiAnYXV0bycsXG4gIGxlZnQ6ICdhdXRvJ1xufTsgLy8gUm91bmQgdGhlIG9mZnNldHMgdG8gdGhlIG5lYXJlc3Qgc3VpdGFibGUgc3VicGl4ZWwgYmFzZWQgb24gdGhlIERQUi5cbi8vIFpvb21pbmcgY2FuIGNoYW5nZSB0aGUgRFBSLCBidXQgaXQgc2VlbXMgdG8gcmVwb3J0IGEgdmFsdWUgdGhhdCB3aWxsXG4vLyBjbGVhbmx5IGRpdmlkZSB0aGUgdmFsdWVzIGludG8gdGhlIGFwcHJvcHJpYXRlIHN1YnBpeGVscy5cblxuZnVuY3Rpb24gcm91bmRPZmZzZXRzQnlEUFIoX3JlZiwgd2luKSB7XG4gIHZhciB4ID0gX3JlZi54LFxuICAgICAgeSA9IF9yZWYueTtcbiAgdmFyIGRwciA9IHdpbi5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gIHJldHVybiB7XG4gICAgeDogcm91bmQoeCAqIGRwcikgLyBkcHIgfHwgMCxcbiAgICB5OiByb3VuZCh5ICogZHByKSAvIGRwciB8fCAwXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXBUb1N0eWxlcyhfcmVmMikge1xuICB2YXIgX09iamVjdCRhc3NpZ24yO1xuXG4gIHZhciBwb3BwZXIgPSBfcmVmMi5wb3BwZXIsXG4gICAgICBwb3BwZXJSZWN0ID0gX3JlZjIucG9wcGVyUmVjdCxcbiAgICAgIHBsYWNlbWVudCA9IF9yZWYyLnBsYWNlbWVudCxcbiAgICAgIHZhcmlhdGlvbiA9IF9yZWYyLnZhcmlhdGlvbixcbiAgICAgIG9mZnNldHMgPSBfcmVmMi5vZmZzZXRzLFxuICAgICAgcG9zaXRpb24gPSBfcmVmMi5wb3NpdGlvbixcbiAgICAgIGdwdUFjY2VsZXJhdGlvbiA9IF9yZWYyLmdwdUFjY2VsZXJhdGlvbixcbiAgICAgIGFkYXB0aXZlID0gX3JlZjIuYWRhcHRpdmUsXG4gICAgICByb3VuZE9mZnNldHMgPSBfcmVmMi5yb3VuZE9mZnNldHMsXG4gICAgICBpc0ZpeGVkID0gX3JlZjIuaXNGaXhlZDtcbiAgdmFyIF9vZmZzZXRzJHggPSBvZmZzZXRzLngsXG4gICAgICB4ID0gX29mZnNldHMkeCA9PT0gdm9pZCAwID8gMCA6IF9vZmZzZXRzJHgsXG4gICAgICBfb2Zmc2V0cyR5ID0gb2Zmc2V0cy55LFxuICAgICAgeSA9IF9vZmZzZXRzJHkgPT09IHZvaWQgMCA/IDAgOiBfb2Zmc2V0cyR5O1xuXG4gIHZhciBfcmVmMyA9IHR5cGVvZiByb3VuZE9mZnNldHMgPT09ICdmdW5jdGlvbicgPyByb3VuZE9mZnNldHMoe1xuICAgIHg6IHgsXG4gICAgeTogeVxuICB9KSA6IHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcblxuICB4ID0gX3JlZjMueDtcbiAgeSA9IF9yZWYzLnk7XG4gIHZhciBoYXNYID0gb2Zmc2V0cy5oYXNPd25Qcm9wZXJ0eSgneCcpO1xuICB2YXIgaGFzWSA9IG9mZnNldHMuaGFzT3duUHJvcGVydHkoJ3knKTtcbiAgdmFyIHNpZGVYID0gbGVmdDtcbiAgdmFyIHNpZGVZID0gdG9wO1xuICB2YXIgd2luID0gd2luZG93O1xuXG4gIGlmIChhZGFwdGl2ZSkge1xuICAgIHZhciBvZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQocG9wcGVyKTtcbiAgICB2YXIgaGVpZ2h0UHJvcCA9ICdjbGllbnRIZWlnaHQnO1xuICAgIHZhciB3aWR0aFByb3AgPSAnY2xpZW50V2lkdGgnO1xuXG4gICAgaWYgKG9mZnNldFBhcmVudCA9PT0gZ2V0V2luZG93KHBvcHBlcikpIHtcbiAgICAgIG9mZnNldFBhcmVudCA9IGdldERvY3VtZW50RWxlbWVudChwb3BwZXIpO1xuXG4gICAgICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uICE9PSAnc3RhdGljJyAmJiBwb3NpdGlvbiA9PT0gJ2Fic29sdXRlJykge1xuICAgICAgICBoZWlnaHRQcm9wID0gJ3Njcm9sbEhlaWdodCc7XG4gICAgICAgIHdpZHRoUHJvcCA9ICdzY3JvbGxXaWR0aCc7XG4gICAgICB9XG4gICAgfSAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYXN0XTogZm9yY2UgdHlwZSByZWZpbmVtZW50LCB3ZSBjb21wYXJlIG9mZnNldFBhcmVudCB3aXRoIHdpbmRvdyBhYm92ZSwgYnV0IEZsb3cgZG9lc24ndCBkZXRlY3QgaXRcblxuXG4gICAgb2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50O1xuXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gdG9wIHx8IChwbGFjZW1lbnQgPT09IGxlZnQgfHwgcGxhY2VtZW50ID09PSByaWdodCkgJiYgdmFyaWF0aW9uID09PSBlbmQpIHtcbiAgICAgIHNpZGVZID0gYm90dG9tO1xuICAgICAgdmFyIG9mZnNldFkgPSBpc0ZpeGVkICYmIG9mZnNldFBhcmVudCA9PT0gd2luICYmIHdpbi52aXN1YWxWaWV3cG9ydCA/IHdpbi52aXN1YWxWaWV3cG9ydC5oZWlnaHQgOiAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgICAgIG9mZnNldFBhcmVudFtoZWlnaHRQcm9wXTtcbiAgICAgIHkgLT0gb2Zmc2V0WSAtIHBvcHBlclJlY3QuaGVpZ2h0O1xuICAgICAgeSAqPSBncHVBY2NlbGVyYXRpb24gPyAxIDogLTE7XG4gICAgfVxuXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gbGVmdCB8fCAocGxhY2VtZW50ID09PSB0b3AgfHwgcGxhY2VtZW50ID09PSBib3R0b20pICYmIHZhcmlhdGlvbiA9PT0gZW5kKSB7XG4gICAgICBzaWRlWCA9IHJpZ2h0O1xuICAgICAgdmFyIG9mZnNldFggPSBpc0ZpeGVkICYmIG9mZnNldFBhcmVudCA9PT0gd2luICYmIHdpbi52aXN1YWxWaWV3cG9ydCA/IHdpbi52aXN1YWxWaWV3cG9ydC53aWR0aCA6IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgICAgb2Zmc2V0UGFyZW50W3dpZHRoUHJvcF07XG4gICAgICB4IC09IG9mZnNldFggLSBwb3BwZXJSZWN0LndpZHRoO1xuICAgICAgeCAqPSBncHVBY2NlbGVyYXRpb24gPyAxIDogLTE7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbW1vblN0eWxlcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHBvc2l0aW9uOiBwb3NpdGlvblxuICB9LCBhZGFwdGl2ZSAmJiB1bnNldFNpZGVzKTtcblxuICB2YXIgX3JlZjQgPSByb3VuZE9mZnNldHMgPT09IHRydWUgPyByb3VuZE9mZnNldHNCeURQUih7XG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH0sIGdldFdpbmRvdyhwb3BwZXIpKSA6IHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcblxuICB4ID0gX3JlZjQueDtcbiAgeSA9IF9yZWY0Lnk7XG5cbiAgaWYgKGdwdUFjY2VsZXJhdGlvbikge1xuICAgIHZhciBfT2JqZWN0JGFzc2lnbjtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIChfT2JqZWN0JGFzc2lnbiA9IHt9LCBfT2JqZWN0JGFzc2lnbltzaWRlWV0gPSBoYXNZID8gJzAnIDogJycsIF9PYmplY3QkYXNzaWduW3NpZGVYXSA9IGhhc1ggPyAnMCcgOiAnJywgX09iamVjdCRhc3NpZ24udHJhbnNmb3JtID0gKHdpbi5kZXZpY2VQaXhlbFJhdGlvIHx8IDEpIDw9IDEgPyBcInRyYW5zbGF0ZShcIiArIHggKyBcInB4LCBcIiArIHkgKyBcInB4KVwiIDogXCJ0cmFuc2xhdGUzZChcIiArIHggKyBcInB4LCBcIiArIHkgKyBcInB4LCAwKVwiLCBfT2JqZWN0JGFzc2lnbikpO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcywgKF9PYmplY3QkYXNzaWduMiA9IHt9LCBfT2JqZWN0JGFzc2lnbjJbc2lkZVldID0gaGFzWSA/IHkgKyBcInB4XCIgOiAnJywgX09iamVjdCRhc3NpZ24yW3NpZGVYXSA9IGhhc1ggPyB4ICsgXCJweFwiIDogJycsIF9PYmplY3QkYXNzaWduMi50cmFuc2Zvcm0gPSAnJywgX09iamVjdCRhc3NpZ24yKSk7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVTdHlsZXMoX3JlZjUpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjUuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZjUub3B0aW9ucztcbiAgdmFyIF9vcHRpb25zJGdwdUFjY2VsZXJhdCA9IG9wdGlvbnMuZ3B1QWNjZWxlcmF0aW9uLFxuICAgICAgZ3B1QWNjZWxlcmF0aW9uID0gX29wdGlvbnMkZ3B1QWNjZWxlcmF0ID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkZ3B1QWNjZWxlcmF0LFxuICAgICAgX29wdGlvbnMkYWRhcHRpdmUgPSBvcHRpb25zLmFkYXB0aXZlLFxuICAgICAgYWRhcHRpdmUgPSBfb3B0aW9ucyRhZGFwdGl2ZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJGFkYXB0aXZlLFxuICAgICAgX29wdGlvbnMkcm91bmRPZmZzZXRzID0gb3B0aW9ucy5yb3VuZE9mZnNldHMsXG4gICAgICByb3VuZE9mZnNldHMgPSBfb3B0aW9ucyRyb3VuZE9mZnNldHMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRyb3VuZE9mZnNldHM7XG4gIHZhciBjb21tb25TdHlsZXMgPSB7XG4gICAgcGxhY2VtZW50OiBnZXRCYXNlUGxhY2VtZW50KHN0YXRlLnBsYWNlbWVudCksXG4gICAgdmFyaWF0aW9uOiBnZXRWYXJpYXRpb24oc3RhdGUucGxhY2VtZW50KSxcbiAgICBwb3BwZXI6IHN0YXRlLmVsZW1lbnRzLnBvcHBlcixcbiAgICBwb3BwZXJSZWN0OiBzdGF0ZS5yZWN0cy5wb3BwZXIsXG4gICAgZ3B1QWNjZWxlcmF0aW9uOiBncHVBY2NlbGVyYXRpb24sXG4gICAgaXNGaXhlZDogc3RhdGUub3B0aW9ucy5zdHJhdGVneSA9PT0gJ2ZpeGVkJ1xuICB9O1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMgIT0gbnVsbCkge1xuICAgIHN0YXRlLnN0eWxlcy5wb3BwZXIgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zdHlsZXMucG9wcGVyLCBtYXBUb1N0eWxlcyhPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIHtcbiAgICAgIG9mZnNldHM6IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyxcbiAgICAgIHBvc2l0aW9uOiBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgYWRhcHRpdmU6IGFkYXB0aXZlLFxuICAgICAgcm91bmRPZmZzZXRzOiByb3VuZE9mZnNldHNcbiAgICB9KSkpO1xuICB9XG5cbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGEuYXJyb3cgIT0gbnVsbCkge1xuICAgIHN0YXRlLnN0eWxlcy5hcnJvdyA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnN0eWxlcy5hcnJvdywgbWFwVG9TdHlsZXMoT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCB7XG4gICAgICBvZmZzZXRzOiBzdGF0ZS5tb2RpZmllcnNEYXRhLmFycm93LFxuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBhZGFwdGl2ZTogZmFsc2UsXG4gICAgICByb3VuZE9mZnNldHM6IHJvdW5kT2Zmc2V0c1xuICAgIH0pKSk7XG4gIH1cblxuICBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyLCB7XG4gICAgJ2RhdGEtcG9wcGVyLXBsYWNlbWVudCc6IHN0YXRlLnBsYWNlbWVudFxuICB9KTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2NvbXB1dGVTdHlsZXMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ2JlZm9yZVdyaXRlJyxcbiAgZm46IGNvbXB1dGVTdHlsZXMsXG4gIGRhdGE6IHt9XG59OyIsImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRXaW5kb3cuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG52YXIgcGFzc2l2ZSA9IHtcbiAgcGFzc2l2ZTogdHJ1ZVxufTtcblxuZnVuY3Rpb24gZWZmZWN0KF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnM7XG4gIHZhciBfb3B0aW9ucyRzY3JvbGwgPSBvcHRpb25zLnNjcm9sbCxcbiAgICAgIHNjcm9sbCA9IF9vcHRpb25zJHNjcm9sbCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHNjcm9sbCxcbiAgICAgIF9vcHRpb25zJHJlc2l6ZSA9IG9wdGlvbnMucmVzaXplLFxuICAgICAgcmVzaXplID0gX29wdGlvbnMkcmVzaXplID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkcmVzaXplO1xuICB2YXIgd2luZG93ID0gZ2V0V2luZG93KHN0YXRlLmVsZW1lbnRzLnBvcHBlcik7XG4gIHZhciBzY3JvbGxQYXJlbnRzID0gW10uY29uY2F0KHN0YXRlLnNjcm9sbFBhcmVudHMucmVmZXJlbmNlLCBzdGF0ZS5zY3JvbGxQYXJlbnRzLnBvcHBlcik7XG5cbiAgaWYgKHNjcm9sbCkge1xuICAgIHNjcm9sbFBhcmVudHMuZm9yRWFjaChmdW5jdGlvbiAoc2Nyb2xsUGFyZW50KSB7XG4gICAgICBzY3JvbGxQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChyZXNpemUpIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNjcm9sbCkge1xuICAgICAgc2Nyb2xsUGFyZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChzY3JvbGxQYXJlbnQpIHtcbiAgICAgICAgc2Nyb2xsUGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocmVzaXplKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgICB9XG4gIH07XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdldmVudExpc3RlbmVycycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnd3JpdGUnLFxuICBmbjogZnVuY3Rpb24gZm4oKSB7fSxcbiAgZWZmZWN0OiBlZmZlY3QsXG4gIGRhdGE6IHt9XG59OyIsInZhciBoYXNoID0ge1xuICBsZWZ0OiAncmlnaHQnLFxuICByaWdodDogJ2xlZnQnLFxuICBib3R0b206ICd0b3AnLFxuICB0b3A6ICdib3R0b20nXG59O1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQucmVwbGFjZSgvbGVmdHxyaWdodHxib3R0b218dG9wL2csIGZ1bmN0aW9uIChtYXRjaGVkKSB7XG4gICAgcmV0dXJuIGhhc2hbbWF0Y2hlZF07XG4gIH0pO1xufSIsInZhciBoYXNoID0ge1xuICBzdGFydDogJ2VuZCcsXG4gIGVuZDogJ3N0YXJ0J1xufTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnJlcGxhY2UoL3N0YXJ0fGVuZC9nLCBmdW5jdGlvbiAobWF0Y2hlZCkge1xuICAgIHJldHVybiBoYXNoW21hdGNoZWRdO1xuICB9KTtcbn0iLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsKG5vZGUpIHtcbiAgdmFyIHdpbiA9IGdldFdpbmRvdyhub2RlKTtcbiAgdmFyIHNjcm9sbExlZnQgPSB3aW4ucGFnZVhPZmZzZXQ7XG4gIHZhciBzY3JvbGxUb3AgPSB3aW4ucGFnZVlPZmZzZXQ7XG4gIHJldHVybiB7XG4gICAgc2Nyb2xsTGVmdDogc2Nyb2xsTGVmdCxcbiAgICBzY3JvbGxUb3A6IHNjcm9sbFRvcFxuICB9O1xufSIsImltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGwuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCkge1xuICAvLyBJZiA8aHRtbD4gaGFzIGEgQ1NTIHdpZHRoIGdyZWF0ZXIgdGhhbiB0aGUgdmlld3BvcnQsIHRoZW4gdGhpcyB3aWxsIGJlXG4gIC8vIGluY29ycmVjdCBmb3IgUlRMLlxuICAvLyBQb3BwZXIgMSBpcyBicm9rZW4gaW4gdGhpcyBjYXNlIGFuZCBuZXZlciBoYWQgYSBidWcgcmVwb3J0IHNvIGxldCdzIGFzc3VtZVxuICAvLyBpdCdzIG5vdCBhbiBpc3N1ZS4gSSBkb24ndCB0aGluayBhbnlvbmUgZXZlciBzcGVjaWZpZXMgd2lkdGggb24gPGh0bWw+XG4gIC8vIGFueXdheS5cbiAgLy8gQnJvd3NlcnMgd2hlcmUgdGhlIGxlZnQgc2Nyb2xsYmFyIGRvZXNuJ3QgY2F1c2UgYW4gaXNzdWUgcmVwb3J0IGAwYCBmb3JcbiAgLy8gdGhpcyAoZS5nLiBFZGdlIDIwMTksIElFMTEsIFNhZmFyaSlcbiAgcmV0dXJuIGdldEJvdW5kaW5nQ2xpZW50UmVjdChnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkpLmxlZnQgKyBnZXRXaW5kb3dTY3JvbGwoZWxlbWVudCkuc2Nyb2xsTGVmdDtcbn0iLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbEJhclguanNcIjtcbmltcG9ydCBpc0xheW91dFZpZXdwb3J0IGZyb20gXCIuL2lzTGF5b3V0Vmlld3BvcnQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFZpZXdwb3J0UmVjdChlbGVtZW50LCBzdHJhdGVneSkge1xuICB2YXIgd2luID0gZ2V0V2luZG93KGVsZW1lbnQpO1xuICB2YXIgaHRtbCA9IGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KTtcbiAgdmFyIHZpc3VhbFZpZXdwb3J0ID0gd2luLnZpc3VhbFZpZXdwb3J0O1xuICB2YXIgd2lkdGggPSBodG1sLmNsaWVudFdpZHRoO1xuICB2YXIgaGVpZ2h0ID0gaHRtbC5jbGllbnRIZWlnaHQ7XG4gIHZhciB4ID0gMDtcbiAgdmFyIHkgPSAwO1xuXG4gIGlmICh2aXN1YWxWaWV3cG9ydCkge1xuICAgIHdpZHRoID0gdmlzdWFsVmlld3BvcnQud2lkdGg7XG4gICAgaGVpZ2h0ID0gdmlzdWFsVmlld3BvcnQuaGVpZ2h0O1xuICAgIHZhciBsYXlvdXRWaWV3cG9ydCA9IGlzTGF5b3V0Vmlld3BvcnQoKTtcblxuICAgIGlmIChsYXlvdXRWaWV3cG9ydCB8fCAhbGF5b3V0Vmlld3BvcnQgJiYgc3RyYXRlZ3kgPT09ICdmaXhlZCcpIHtcbiAgICAgIHggPSB2aXN1YWxWaWV3cG9ydC5vZmZzZXRMZWZ0O1xuICAgICAgeSA9IHZpc3VhbFZpZXdwb3J0Lm9mZnNldFRvcDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICB4OiB4ICsgZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KSxcbiAgICB5OiB5XG4gIH07XG59IiwiaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbEJhclguanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGwgZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsLmpzXCI7XG5pbXBvcnQgeyBtYXggfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiOyAvLyBHZXRzIHRoZSBlbnRpcmUgc2l6ZSBvZiB0aGUgc2Nyb2xsYWJsZSBkb2N1bWVudCBhcmVhLCBldmVuIGV4dGVuZGluZyBvdXRzaWRlXG4vLyBvZiB0aGUgYDxodG1sPmAgYW5kIGA8Ym9keT5gIHJlY3QgYm91bmRzIGlmIGhvcml6b250YWxseSBzY3JvbGxhYmxlXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldERvY3VtZW50UmVjdChlbGVtZW50KSB7XG4gIHZhciBfZWxlbWVudCRvd25lckRvY3VtZW47XG5cbiAgdmFyIGh0bWwgPSBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCk7XG4gIHZhciB3aW5TY3JvbGwgPSBnZXRXaW5kb3dTY3JvbGwoZWxlbWVudCk7XG4gIHZhciBib2R5ID0gKF9lbGVtZW50JG93bmVyRG9jdW1lbiA9IGVsZW1lbnQub3duZXJEb2N1bWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9lbGVtZW50JG93bmVyRG9jdW1lbi5ib2R5O1xuICB2YXIgd2lkdGggPSBtYXgoaHRtbC5zY3JvbGxXaWR0aCwgaHRtbC5jbGllbnRXaWR0aCwgYm9keSA/IGJvZHkuc2Nyb2xsV2lkdGggOiAwLCBib2R5ID8gYm9keS5jbGllbnRXaWR0aCA6IDApO1xuICB2YXIgaGVpZ2h0ID0gbWF4KGh0bWwuc2Nyb2xsSGVpZ2h0LCBodG1sLmNsaWVudEhlaWdodCwgYm9keSA/IGJvZHkuc2Nyb2xsSGVpZ2h0IDogMCwgYm9keSA/IGJvZHkuY2xpZW50SGVpZ2h0IDogMCk7XG4gIHZhciB4ID0gLXdpblNjcm9sbC5zY3JvbGxMZWZ0ICsgZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KTtcbiAgdmFyIHkgPSAtd2luU2Nyb2xsLnNjcm9sbFRvcDtcblxuICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShib2R5IHx8IGh0bWwpLmRpcmVjdGlvbiA9PT0gJ3J0bCcpIHtcbiAgICB4ICs9IG1heChodG1sLmNsaWVudFdpZHRoLCBib2R5ID8gYm9keS5jbGllbnRXaWR0aCA6IDApIC0gd2lkdGg7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcbn0iLCJpbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1Njcm9sbFBhcmVudChlbGVtZW50KSB7XG4gIC8vIEZpcmVmb3ggd2FudHMgdXMgdG8gY2hlY2sgYC14YCBhbmQgYC15YCB2YXJpYXRpb25zIGFzIHdlbGxcbiAgdmFyIF9nZXRDb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KSxcbiAgICAgIG92ZXJmbG93ID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3csXG4gICAgICBvdmVyZmxvd1ggPSBfZ2V0Q29tcHV0ZWRTdHlsZS5vdmVyZmxvd1gsXG4gICAgICBvdmVyZmxvd1kgPSBfZ2V0Q29tcHV0ZWRTdHlsZS5vdmVyZmxvd1k7XG5cbiAgcmV0dXJuIC9hdXRvfHNjcm9sbHxvdmVybGF5fGhpZGRlbi8udGVzdChvdmVyZmxvdyArIG92ZXJmbG93WSArIG92ZXJmbG93WCk7XG59IiwiaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuaW1wb3J0IGlzU2Nyb2xsUGFyZW50IGZyb20gXCIuL2lzU2Nyb2xsUGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRTY3JvbGxQYXJlbnQobm9kZSkge1xuICBpZiAoWydodG1sJywgJ2JvZHknLCAnI2RvY3VtZW50J10uaW5kZXhPZihnZXROb2RlTmFtZShub2RlKSkgPj0gMCkge1xuICAgIC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXJldHVybl06IGFzc3VtZSBib2R5IGlzIGFsd2F5cyBhdmFpbGFibGVcbiAgICByZXR1cm4gbm9kZS5vd25lckRvY3VtZW50LmJvZHk7XG4gIH1cblxuICBpZiAoaXNIVE1MRWxlbWVudChub2RlKSAmJiBpc1Njcm9sbFBhcmVudChub2RlKSkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgcmV0dXJuIGdldFNjcm9sbFBhcmVudChnZXRQYXJlbnROb2RlKG5vZGUpKTtcbn0iLCJpbXBvcnQgZ2V0U2Nyb2xsUGFyZW50IGZyb20gXCIuL2dldFNjcm9sbFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBpc1Njcm9sbFBhcmVudCBmcm9tIFwiLi9pc1Njcm9sbFBhcmVudC5qc1wiO1xuLypcbmdpdmVuIGEgRE9NIGVsZW1lbnQsIHJldHVybiB0aGUgbGlzdCBvZiBhbGwgc2Nyb2xsIHBhcmVudHMsIHVwIHRoZSBsaXN0IG9mIGFuY2Vzb3JzXG51bnRpbCB3ZSBnZXQgdG8gdGhlIHRvcCB3aW5kb3cgb2JqZWN0LiBUaGlzIGxpc3QgaXMgd2hhdCB3ZSBhdHRhY2ggc2Nyb2xsIGxpc3RlbmVyc1xudG8sIGJlY2F1c2UgaWYgYW55IG9mIHRoZXNlIHBhcmVudCBlbGVtZW50cyBzY3JvbGwsIHdlJ2xsIG5lZWQgdG8gcmUtY2FsY3VsYXRlIHRoZVxucmVmZXJlbmNlIGVsZW1lbnQncyBwb3NpdGlvbi5cbiovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxpc3RTY3JvbGxQYXJlbnRzKGVsZW1lbnQsIGxpc3QpIHtcbiAgdmFyIF9lbGVtZW50JG93bmVyRG9jdW1lbjtcblxuICBpZiAobGlzdCA9PT0gdm9pZCAwKSB7XG4gICAgbGlzdCA9IFtdO1xuICB9XG5cbiAgdmFyIHNjcm9sbFBhcmVudCA9IGdldFNjcm9sbFBhcmVudChlbGVtZW50KTtcbiAgdmFyIGlzQm9keSA9IHNjcm9sbFBhcmVudCA9PT0gKChfZWxlbWVudCRvd25lckRvY3VtZW4gPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfZWxlbWVudCRvd25lckRvY3VtZW4uYm9keSk7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3coc2Nyb2xsUGFyZW50KTtcbiAgdmFyIHRhcmdldCA9IGlzQm9keSA/IFt3aW5dLmNvbmNhdCh3aW4udmlzdWFsVmlld3BvcnQgfHwgW10sIGlzU2Nyb2xsUGFyZW50KHNjcm9sbFBhcmVudCkgPyBzY3JvbGxQYXJlbnQgOiBbXSkgOiBzY3JvbGxQYXJlbnQ7XG4gIHZhciB1cGRhdGVkTGlzdCA9IGxpc3QuY29uY2F0KHRhcmdldCk7XG4gIHJldHVybiBpc0JvZHkgPyB1cGRhdGVkTGlzdCA6IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLWNhbGxdOiBpc0JvZHkgdGVsbHMgdXMgdGFyZ2V0IHdpbGwgYmUgYW4gSFRNTEVsZW1lbnQgaGVyZVxuICB1cGRhdGVkTGlzdC5jb25jYXQobGlzdFNjcm9sbFBhcmVudHMoZ2V0UGFyZW50Tm9kZSh0YXJnZXQpKSk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVjdFRvQ2xpZW50UmVjdChyZWN0KSB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCByZWN0LCB7XG4gICAgbGVmdDogcmVjdC54LFxuICAgIHRvcDogcmVjdC55LFxuICAgIHJpZ2h0OiByZWN0LnggKyByZWN0LndpZHRoLFxuICAgIGJvdHRvbTogcmVjdC55ICsgcmVjdC5oZWlnaHRcbiAgfSk7XG59IiwiaW1wb3J0IHsgdmlld3BvcnQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRWaWV3cG9ydFJlY3QgZnJvbSBcIi4vZ2V0Vmlld3BvcnRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRSZWN0IGZyb20gXCIuL2dldERvY3VtZW50UmVjdC5qc1wiO1xuaW1wb3J0IGxpc3RTY3JvbGxQYXJlbnRzIGZyb20gXCIuL2xpc3RTY3JvbGxQYXJlbnRzLmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCB7IGlzRWxlbWVudCwgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tIFwiLi9nZXRQYXJlbnROb2RlLmpzXCI7XG5pbXBvcnQgY29udGFpbnMgZnJvbSBcIi4vY29udGFpbnMuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHJlY3RUb0NsaWVudFJlY3QgZnJvbSBcIi4uL3V0aWxzL3JlY3RUb0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCB7IG1heCwgbWluIH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcblxuZnVuY3Rpb24gZ2V0SW5uZXJCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCwgc3RyYXRlZ3kpIHtcbiAgdmFyIHJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCwgZmFsc2UsIHN0cmF0ZWd5ID09PSAnZml4ZWQnKTtcbiAgcmVjdC50b3AgPSByZWN0LnRvcCArIGVsZW1lbnQuY2xpZW50VG9wO1xuICByZWN0LmxlZnQgPSByZWN0LmxlZnQgKyBlbGVtZW50LmNsaWVudExlZnQ7XG4gIHJlY3QuYm90dG9tID0gcmVjdC50b3AgKyBlbGVtZW50LmNsaWVudEhlaWdodDtcbiAgcmVjdC5yaWdodCA9IHJlY3QubGVmdCArIGVsZW1lbnQuY2xpZW50V2lkdGg7XG4gIHJlY3Qud2lkdGggPSBlbGVtZW50LmNsaWVudFdpZHRoO1xuICByZWN0LmhlaWdodCA9IGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICByZWN0LnggPSByZWN0LmxlZnQ7XG4gIHJlY3QueSA9IHJlY3QudG9wO1xuICByZXR1cm4gcmVjdDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgY2xpcHBpbmdQYXJlbnQsIHN0cmF0ZWd5KSB7XG4gIHJldHVybiBjbGlwcGluZ1BhcmVudCA9PT0gdmlld3BvcnQgPyByZWN0VG9DbGllbnRSZWN0KGdldFZpZXdwb3J0UmVjdChlbGVtZW50LCBzdHJhdGVneSkpIDogaXNFbGVtZW50KGNsaXBwaW5nUGFyZW50KSA/IGdldElubmVyQm91bmRpbmdDbGllbnRSZWN0KGNsaXBwaW5nUGFyZW50LCBzdHJhdGVneSkgOiByZWN0VG9DbGllbnRSZWN0KGdldERvY3VtZW50UmVjdChnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkpKTtcbn0gLy8gQSBcImNsaXBwaW5nIHBhcmVudFwiIGlzIGFuIG92ZXJmbG93YWJsZSBjb250YWluZXIgd2l0aCB0aGUgY2hhcmFjdGVyaXN0aWMgb2Zcbi8vIGNsaXBwaW5nIChvciBoaWRpbmcpIG92ZXJmbG93aW5nIGVsZW1lbnRzIHdpdGggYSBwb3NpdGlvbiBkaWZmZXJlbnQgZnJvbVxuLy8gYGluaXRpYWxgXG5cblxuZnVuY3Rpb24gZ2V0Q2xpcHBpbmdQYXJlbnRzKGVsZW1lbnQpIHtcbiAgdmFyIGNsaXBwaW5nUGFyZW50cyA9IGxpc3RTY3JvbGxQYXJlbnRzKGdldFBhcmVudE5vZGUoZWxlbWVudCkpO1xuICB2YXIgY2FuRXNjYXBlQ2xpcHBpbmcgPSBbJ2Fic29sdXRlJywgJ2ZpeGVkJ10uaW5kZXhPZihnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLnBvc2l0aW9uKSA+PSAwO1xuICB2YXIgY2xpcHBlckVsZW1lbnQgPSBjYW5Fc2NhcGVDbGlwcGluZyAmJiBpc0hUTUxFbGVtZW50KGVsZW1lbnQpID8gZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQpIDogZWxlbWVudDtcblxuICBpZiAoIWlzRWxlbWVudChjbGlwcGVyRWxlbWVudCkpIHtcbiAgICByZXR1cm4gW107XG4gIH0gLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzE0MTRcblxuXG4gIHJldHVybiBjbGlwcGluZ1BhcmVudHMuZmlsdGVyKGZ1bmN0aW9uIChjbGlwcGluZ1BhcmVudCkge1xuICAgIHJldHVybiBpc0VsZW1lbnQoY2xpcHBpbmdQYXJlbnQpICYmIGNvbnRhaW5zKGNsaXBwaW5nUGFyZW50LCBjbGlwcGVyRWxlbWVudCkgJiYgZ2V0Tm9kZU5hbWUoY2xpcHBpbmdQYXJlbnQpICE9PSAnYm9keSc7XG4gIH0pO1xufSAvLyBHZXRzIHRoZSBtYXhpbXVtIGFyZWEgdGhhdCB0aGUgZWxlbWVudCBpcyB2aXNpYmxlIGluIGR1ZSB0byBhbnkgbnVtYmVyIG9mXG4vLyBjbGlwcGluZyBwYXJlbnRzXG5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q2xpcHBpbmdSZWN0KGVsZW1lbnQsIGJvdW5kYXJ5LCByb290Qm91bmRhcnksIHN0cmF0ZWd5KSB7XG4gIHZhciBtYWluQ2xpcHBpbmdQYXJlbnRzID0gYm91bmRhcnkgPT09ICdjbGlwcGluZ1BhcmVudHMnID8gZ2V0Q2xpcHBpbmdQYXJlbnRzKGVsZW1lbnQpIDogW10uY29uY2F0KGJvdW5kYXJ5KTtcbiAgdmFyIGNsaXBwaW5nUGFyZW50cyA9IFtdLmNvbmNhdChtYWluQ2xpcHBpbmdQYXJlbnRzLCBbcm9vdEJvdW5kYXJ5XSk7XG4gIHZhciBmaXJzdENsaXBwaW5nUGFyZW50ID0gY2xpcHBpbmdQYXJlbnRzWzBdO1xuICB2YXIgY2xpcHBpbmdSZWN0ID0gY2xpcHBpbmdQYXJlbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjUmVjdCwgY2xpcHBpbmdQYXJlbnQpIHtcbiAgICB2YXIgcmVjdCA9IGdldENsaWVudFJlY3RGcm9tTWl4ZWRUeXBlKGVsZW1lbnQsIGNsaXBwaW5nUGFyZW50LCBzdHJhdGVneSk7XG4gICAgYWNjUmVjdC50b3AgPSBtYXgocmVjdC50b3AsIGFjY1JlY3QudG9wKTtcbiAgICBhY2NSZWN0LnJpZ2h0ID0gbWluKHJlY3QucmlnaHQsIGFjY1JlY3QucmlnaHQpO1xuICAgIGFjY1JlY3QuYm90dG9tID0gbWluKHJlY3QuYm90dG9tLCBhY2NSZWN0LmJvdHRvbSk7XG4gICAgYWNjUmVjdC5sZWZ0ID0gbWF4KHJlY3QubGVmdCwgYWNjUmVjdC5sZWZ0KTtcbiAgICByZXR1cm4gYWNjUmVjdDtcbiAgfSwgZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgZmlyc3RDbGlwcGluZ1BhcmVudCwgc3RyYXRlZ3kpKTtcbiAgY2xpcHBpbmdSZWN0LndpZHRoID0gY2xpcHBpbmdSZWN0LnJpZ2h0IC0gY2xpcHBpbmdSZWN0LmxlZnQ7XG4gIGNsaXBwaW5nUmVjdC5oZWlnaHQgPSBjbGlwcGluZ1JlY3QuYm90dG9tIC0gY2xpcHBpbmdSZWN0LnRvcDtcbiAgY2xpcHBpbmdSZWN0LnggPSBjbGlwcGluZ1JlY3QubGVmdDtcbiAgY2xpcHBpbmdSZWN0LnkgPSBjbGlwcGluZ1JlY3QudG9wO1xuICByZXR1cm4gY2xpcHBpbmdSZWN0O1xufSIsImltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4vZ2V0VmFyaWF0aW9uLmpzXCI7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gXCIuL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0LCBzdGFydCwgZW5kIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wdXRlT2Zmc2V0cyhfcmVmKSB7XG4gIHZhciByZWZlcmVuY2UgPSBfcmVmLnJlZmVyZW5jZSxcbiAgICAgIGVsZW1lbnQgPSBfcmVmLmVsZW1lbnQsXG4gICAgICBwbGFjZW1lbnQgPSBfcmVmLnBsYWNlbWVudDtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBwbGFjZW1lbnQgPyBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgOiBudWxsO1xuICB2YXIgdmFyaWF0aW9uID0gcGxhY2VtZW50ID8gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgOiBudWxsO1xuICB2YXIgY29tbW9uWCA9IHJlZmVyZW5jZS54ICsgcmVmZXJlbmNlLndpZHRoIC8gMiAtIGVsZW1lbnQud2lkdGggLyAyO1xuICB2YXIgY29tbW9uWSA9IHJlZmVyZW5jZS55ICsgcmVmZXJlbmNlLmhlaWdodCAvIDIgLSBlbGVtZW50LmhlaWdodCAvIDI7XG4gIHZhciBvZmZzZXRzO1xuXG4gIHN3aXRjaCAoYmFzZVBsYWNlbWVudCkge1xuICAgIGNhc2UgdG9wOlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogY29tbW9uWCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnkgLSBlbGVtZW50LmhlaWdodFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBib3R0b206XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiBjb21tb25YLFxuICAgICAgICB5OiByZWZlcmVuY2UueSArIHJlZmVyZW5jZS5oZWlnaHRcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgcmlnaHQ6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiByZWZlcmVuY2UueCArIHJlZmVyZW5jZS53aWR0aCxcbiAgICAgICAgeTogY29tbW9uWVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBsZWZ0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLnggLSBlbGVtZW50LndpZHRoLFxuICAgICAgICB5OiBjb21tb25ZXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLngsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55XG4gICAgICB9O1xuICB9XG5cbiAgdmFyIG1haW5BeGlzID0gYmFzZVBsYWNlbWVudCA/IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChiYXNlUGxhY2VtZW50KSA6IG51bGw7XG5cbiAgaWYgKG1haW5BeGlzICE9IG51bGwpIHtcbiAgICB2YXIgbGVuID0gbWFpbkF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICAgIHN3aXRjaCAodmFyaWF0aW9uKSB7XG4gICAgICBjYXNlIHN0YXJ0OlxuICAgICAgICBvZmZzZXRzW21haW5BeGlzXSA9IG9mZnNldHNbbWFpbkF4aXNdIC0gKHJlZmVyZW5jZVtsZW5dIC8gMiAtIGVsZW1lbnRbbGVuXSAvIDIpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBlbmQ6XG4gICAgICAgIG9mZnNldHNbbWFpbkF4aXNdID0gb2Zmc2V0c1ttYWluQXhpc10gKyAocmVmZXJlbmNlW2xlbl0gLyAyIC0gZWxlbWVudFtsZW5dIC8gMik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvZmZzZXRzO1xufSIsImltcG9ydCBnZXRDbGlwcGluZ1JlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRDbGlwcGluZ1JlY3QuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBjb21wdXRlT2Zmc2V0cyBmcm9tIFwiLi9jb21wdXRlT2Zmc2V0cy5qc1wiO1xuaW1wb3J0IHJlY3RUb0NsaWVudFJlY3QgZnJvbSBcIi4vcmVjdFRvQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IHsgY2xpcHBpbmdQYXJlbnRzLCByZWZlcmVuY2UsIHBvcHBlciwgYm90dG9tLCB0b3AsIHJpZ2h0LCBiYXNlUGxhY2VtZW50cywgdmlld3BvcnQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCB7IGlzRWxlbWVudCB9IGZyb20gXCIuLi9kb20tdXRpbHMvaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IG1lcmdlUGFkZGluZ09iamVjdCBmcm9tIFwiLi9tZXJnZVBhZGRpbmdPYmplY3QuanNcIjtcbmltcG9ydCBleHBhbmRUb0hhc2hNYXAgZnJvbSBcIi4vZXhwYW5kVG9IYXNoTWFwLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBfb3B0aW9ucyA9IG9wdGlvbnMsXG4gICAgICBfb3B0aW9ucyRwbGFjZW1lbnQgPSBfb3B0aW9ucy5wbGFjZW1lbnQsXG4gICAgICBwbGFjZW1lbnQgPSBfb3B0aW9ucyRwbGFjZW1lbnQgPT09IHZvaWQgMCA/IHN0YXRlLnBsYWNlbWVudCA6IF9vcHRpb25zJHBsYWNlbWVudCxcbiAgICAgIF9vcHRpb25zJHN0cmF0ZWd5ID0gX29wdGlvbnMuc3RyYXRlZ3ksXG4gICAgICBzdHJhdGVneSA9IF9vcHRpb25zJHN0cmF0ZWd5ID09PSB2b2lkIDAgPyBzdGF0ZS5zdHJhdGVneSA6IF9vcHRpb25zJHN0cmF0ZWd5LFxuICAgICAgX29wdGlvbnMkYm91bmRhcnkgPSBfb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIGJvdW5kYXJ5ID0gX29wdGlvbnMkYm91bmRhcnkgPT09IHZvaWQgMCA/IGNsaXBwaW5nUGFyZW50cyA6IF9vcHRpb25zJGJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkcm9vdEJvdW5kYXJ5ID0gX29wdGlvbnMucm9vdEJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gX29wdGlvbnMkcm9vdEJvdW5kYXJ5ID09PSB2b2lkIDAgPyB2aWV3cG9ydCA6IF9vcHRpb25zJHJvb3RCb3VuZGFyeSxcbiAgICAgIF9vcHRpb25zJGVsZW1lbnRDb250ZSA9IF9vcHRpb25zLmVsZW1lbnRDb250ZXh0LFxuICAgICAgZWxlbWVudENvbnRleHQgPSBfb3B0aW9ucyRlbGVtZW50Q29udGUgPT09IHZvaWQgMCA/IHBvcHBlciA6IF9vcHRpb25zJGVsZW1lbnRDb250ZSxcbiAgICAgIF9vcHRpb25zJGFsdEJvdW5kYXJ5ID0gX29wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IF9vcHRpb25zJGFsdEJvdW5kYXJ5ID09PSB2b2lkIDAgPyBmYWxzZSA6IF9vcHRpb25zJGFsdEJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkcGFkZGluZyA9IF9vcHRpb25zLnBhZGRpbmcsXG4gICAgICBwYWRkaW5nID0gX29wdGlvbnMkcGFkZGluZyA9PT0gdm9pZCAwID8gMCA6IF9vcHRpb25zJHBhZGRpbmc7XG4gIHZhciBwYWRkaW5nT2JqZWN0ID0gbWVyZ2VQYWRkaW5nT2JqZWN0KHR5cGVvZiBwYWRkaW5nICE9PSAnbnVtYmVyJyA/IHBhZGRpbmcgOiBleHBhbmRUb0hhc2hNYXAocGFkZGluZywgYmFzZVBsYWNlbWVudHMpKTtcbiAgdmFyIGFsdENvbnRleHQgPSBlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyID8gcmVmZXJlbmNlIDogcG9wcGVyO1xuICB2YXIgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgdmFyIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1thbHRCb3VuZGFyeSA/IGFsdENvbnRleHQgOiBlbGVtZW50Q29udGV4dF07XG4gIHZhciBjbGlwcGluZ0NsaWVudFJlY3QgPSBnZXRDbGlwcGluZ1JlY3QoaXNFbGVtZW50KGVsZW1lbnQpID8gZWxlbWVudCA6IGVsZW1lbnQuY29udGV4dEVsZW1lbnQgfHwgZ2V0RG9jdW1lbnRFbGVtZW50KHN0YXRlLmVsZW1lbnRzLnBvcHBlciksIGJvdW5kYXJ5LCByb290Qm91bmRhcnksIHN0cmF0ZWd5KTtcbiAgdmFyIHJlZmVyZW5jZUNsaWVudFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3Qoc3RhdGUuZWxlbWVudHMucmVmZXJlbmNlKTtcbiAgdmFyIHBvcHBlck9mZnNldHMgPSBjb21wdXRlT2Zmc2V0cyh7XG4gICAgcmVmZXJlbmNlOiByZWZlcmVuY2VDbGllbnRSZWN0LFxuICAgIGVsZW1lbnQ6IHBvcHBlclJlY3QsXG4gICAgc3RyYXRlZ3k6ICdhYnNvbHV0ZScsXG4gICAgcGxhY2VtZW50OiBwbGFjZW1lbnRcbiAgfSk7XG4gIHZhciBwb3BwZXJDbGllbnRSZWN0ID0gcmVjdFRvQ2xpZW50UmVjdChPYmplY3QuYXNzaWduKHt9LCBwb3BwZXJSZWN0LCBwb3BwZXJPZmZzZXRzKSk7XG4gIHZhciBlbGVtZW50Q2xpZW50UmVjdCA9IGVsZW1lbnRDb250ZXh0ID09PSBwb3BwZXIgPyBwb3BwZXJDbGllbnRSZWN0IDogcmVmZXJlbmNlQ2xpZW50UmVjdDsgLy8gcG9zaXRpdmUgPSBvdmVyZmxvd2luZyB0aGUgY2xpcHBpbmcgcmVjdFxuICAvLyAwIG9yIG5lZ2F0aXZlID0gd2l0aGluIHRoZSBjbGlwcGluZyByZWN0XG5cbiAgdmFyIG92ZXJmbG93T2Zmc2V0cyA9IHtcbiAgICB0b3A6IGNsaXBwaW5nQ2xpZW50UmVjdC50b3AgLSBlbGVtZW50Q2xpZW50UmVjdC50b3AgKyBwYWRkaW5nT2JqZWN0LnRvcCxcbiAgICBib3R0b206IGVsZW1lbnRDbGllbnRSZWN0LmJvdHRvbSAtIGNsaXBwaW5nQ2xpZW50UmVjdC5ib3R0b20gKyBwYWRkaW5nT2JqZWN0LmJvdHRvbSxcbiAgICBsZWZ0OiBjbGlwcGluZ0NsaWVudFJlY3QubGVmdCAtIGVsZW1lbnRDbGllbnRSZWN0LmxlZnQgKyBwYWRkaW5nT2JqZWN0LmxlZnQsXG4gICAgcmlnaHQ6IGVsZW1lbnRDbGllbnRSZWN0LnJpZ2h0IC0gY2xpcHBpbmdDbGllbnRSZWN0LnJpZ2h0ICsgcGFkZGluZ09iamVjdC5yaWdodFxuICB9O1xuICB2YXIgb2Zmc2V0RGF0YSA9IHN0YXRlLm1vZGlmaWVyc0RhdGEub2Zmc2V0OyAvLyBPZmZzZXRzIGNhbiBiZSBhcHBsaWVkIG9ubHkgdG8gdGhlIHBvcHBlciBlbGVtZW50XG5cbiAgaWYgKGVsZW1lbnRDb250ZXh0ID09PSBwb3BwZXIgJiYgb2Zmc2V0RGF0YSkge1xuICAgIHZhciBvZmZzZXQgPSBvZmZzZXREYXRhW3BsYWNlbWVudF07XG4gICAgT2JqZWN0LmtleXMob3ZlcmZsb3dPZmZzZXRzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBtdWx0aXBseSA9IFtyaWdodCwgYm90dG9tXS5pbmRleE9mKGtleSkgPj0gMCA/IDEgOiAtMTtcbiAgICAgIHZhciBheGlzID0gW3RvcCwgYm90dG9tXS5pbmRleE9mKGtleSkgPj0gMCA/ICd5JyA6ICd4JztcbiAgICAgIG92ZXJmbG93T2Zmc2V0c1trZXldICs9IG9mZnNldFtheGlzXSAqIG11bHRpcGx5O1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG92ZXJmbG93T2Zmc2V0cztcbn0iLCJpbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IHsgdmFyaWF0aW9uUGxhY2VtZW50cywgYmFzZVBsYWNlbWVudHMsIHBsYWNlbWVudHMgYXMgYWxsUGxhY2VtZW50cyB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wdXRlQXV0b1BsYWNlbWVudChzdGF0ZSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgIHBsYWNlbWVudCA9IF9vcHRpb25zLnBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5ID0gX29wdGlvbnMuYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBfb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nID0gX29wdGlvbnMucGFkZGluZyxcbiAgICAgIGZsaXBWYXJpYXRpb25zID0gX29wdGlvbnMuZmxpcFZhcmlhdGlvbnMsXG4gICAgICBfb3B0aW9ucyRhbGxvd2VkQXV0b1AgPSBfb3B0aW9ucy5hbGxvd2VkQXV0b1BsYWNlbWVudHMsXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHMgPSBfb3B0aW9ucyRhbGxvd2VkQXV0b1AgPT09IHZvaWQgMCA/IGFsbFBsYWNlbWVudHMgOiBfb3B0aW9ucyRhbGxvd2VkQXV0b1A7XG4gIHZhciB2YXJpYXRpb24gPSBnZXRWYXJpYXRpb24ocGxhY2VtZW50KTtcbiAgdmFyIHBsYWNlbWVudHMgPSB2YXJpYXRpb24gPyBmbGlwVmFyaWF0aW9ucyA/IHZhcmlhdGlvblBsYWNlbWVudHMgOiB2YXJpYXRpb25QbGFjZW1lbnRzLmZpbHRlcihmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgcmV0dXJuIGdldFZhcmlhdGlvbihwbGFjZW1lbnQpID09PSB2YXJpYXRpb247XG4gIH0pIDogYmFzZVBsYWNlbWVudHM7XG4gIHZhciBhbGxvd2VkUGxhY2VtZW50cyA9IHBsYWNlbWVudHMuZmlsdGVyKGZ1bmN0aW9uIChwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gYWxsb3dlZEF1dG9QbGFjZW1lbnRzLmluZGV4T2YocGxhY2VtZW50KSA+PSAwO1xuICB9KTtcblxuICBpZiAoYWxsb3dlZFBsYWNlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgYWxsb3dlZFBsYWNlbWVudHMgPSBwbGFjZW1lbnRzO1xuICB9IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXR5cGVdOiBGbG93IHNlZW1zIHRvIGhhdmUgcHJvYmxlbXMgd2l0aCB0d28gYXJyYXkgdW5pb25zLi4uXG5cblxuICB2YXIgb3ZlcmZsb3dzID0gYWxsb3dlZFBsYWNlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICAgIGFjY1twbGFjZW1lbnRdID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nOiBwYWRkaW5nXG4gICAgfSlbZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpXTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvdmVyZmxvd3MpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gb3ZlcmZsb3dzW2FdIC0gb3ZlcmZsb3dzW2JdO1xuICB9KTtcbn0iLCJpbXBvcnQgZ2V0T3Bwb3NpdGVQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldE9wcG9zaXRlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IGNvbXB1dGVBdXRvUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9jb21wdXRlQXV0b1BsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgYm90dG9tLCB0b3AsIHN0YXJ0LCByaWdodCwgbGVmdCwgYXV0byB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi4vdXRpbHMvZ2V0VmFyaWF0aW9uLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZnVuY3Rpb24gZ2V0RXhwYW5kZWRGYWxsYmFja1BsYWNlbWVudHMocGxhY2VtZW50KSB7XG4gIGlmIChnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgPT09IGF1dG8pIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgb3Bwb3NpdGVQbGFjZW1lbnQgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICByZXR1cm4gW2dldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KHBsYWNlbWVudCksIG9wcG9zaXRlUGxhY2VtZW50LCBnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudChvcHBvc2l0ZVBsYWNlbWVudCldO1xufVxuXG5mdW5jdGlvbiBmbGlwKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdLl9za2lwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIF9vcHRpb25zJG1haW5BeGlzID0gb3B0aW9ucy5tYWluQXhpcyxcbiAgICAgIGNoZWNrTWFpbkF4aXMgPSBfb3B0aW9ucyRtYWluQXhpcyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJG1haW5BeGlzLFxuICAgICAgX29wdGlvbnMkYWx0QXhpcyA9IG9wdGlvbnMuYWx0QXhpcyxcbiAgICAgIGNoZWNrQWx0QXhpcyA9IF9vcHRpb25zJGFsdEF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRhbHRBeGlzLFxuICAgICAgc3BlY2lmaWVkRmFsbGJhY2tQbGFjZW1lbnRzID0gb3B0aW9ucy5mYWxsYmFja1BsYWNlbWVudHMsXG4gICAgICBwYWRkaW5nID0gb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgYm91bmRhcnkgPSBvcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IG9wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRmbGlwVmFyaWF0aW8gPSBvcHRpb25zLmZsaXBWYXJpYXRpb25zLFxuICAgICAgZmxpcFZhcmlhdGlvbnMgPSBfb3B0aW9ucyRmbGlwVmFyaWF0aW8gPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRmbGlwVmFyaWF0aW8sXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHMgPSBvcHRpb25zLmFsbG93ZWRBdXRvUGxhY2VtZW50cztcbiAgdmFyIHByZWZlcnJlZFBsYWNlbWVudCA9IHN0YXRlLm9wdGlvbnMucGxhY2VtZW50O1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocHJlZmVycmVkUGxhY2VtZW50KTtcbiAgdmFyIGlzQmFzZVBsYWNlbWVudCA9IGJhc2VQbGFjZW1lbnQgPT09IHByZWZlcnJlZFBsYWNlbWVudDtcbiAgdmFyIGZhbGxiYWNrUGxhY2VtZW50cyA9IHNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyB8fCAoaXNCYXNlUGxhY2VtZW50IHx8ICFmbGlwVmFyaWF0aW9ucyA/IFtnZXRPcHBvc2l0ZVBsYWNlbWVudChwcmVmZXJyZWRQbGFjZW1lbnQpXSA6IGdldEV4cGFuZGVkRmFsbGJhY2tQbGFjZW1lbnRzKHByZWZlcnJlZFBsYWNlbWVudCkpO1xuICB2YXIgcGxhY2VtZW50cyA9IFtwcmVmZXJyZWRQbGFjZW1lbnRdLmNvbmNhdChmYWxsYmFja1BsYWNlbWVudHMpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gYWNjLmNvbmNhdChnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgPT09IGF1dG8gPyBjb21wdXRlQXV0b1BsYWNlbWVudChzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmcsXG4gICAgICBmbGlwVmFyaWF0aW9uczogZmxpcFZhcmlhdGlvbnMsXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHM6IGFsbG93ZWRBdXRvUGxhY2VtZW50c1xuICAgIH0pIDogcGxhY2VtZW50KTtcbiAgfSwgW10pO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciBjaGVja3NNYXAgPSBuZXcgTWFwKCk7XG4gIHZhciBtYWtlRmFsbGJhY2tDaGVja3MgPSB0cnVlO1xuICB2YXIgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gcGxhY2VtZW50c1swXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBsYWNlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcGxhY2VtZW50ID0gcGxhY2VtZW50c1tpXTtcblxuICAgIHZhciBfYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KTtcblxuICAgIHZhciBpc1N0YXJ0VmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgPT09IHN0YXJ0O1xuICAgIHZhciBpc1ZlcnRpY2FsID0gW3RvcCwgYm90dG9tXS5pbmRleE9mKF9iYXNlUGxhY2VtZW50KSA+PSAwO1xuICAgIHZhciBsZW4gPSBpc1ZlcnRpY2FsID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgIHZhciBvdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeTogcm9vdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnk6IGFsdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZzogcGFkZGluZ1xuICAgIH0pO1xuICAgIHZhciBtYWluVmFyaWF0aW9uU2lkZSA9IGlzVmVydGljYWwgPyBpc1N0YXJ0VmFyaWF0aW9uID8gcmlnaHQgOiBsZWZ0IDogaXNTdGFydFZhcmlhdGlvbiA/IGJvdHRvbSA6IHRvcDtcblxuICAgIGlmIChyZWZlcmVuY2VSZWN0W2xlbl0gPiBwb3BwZXJSZWN0W2xlbl0pIHtcbiAgICAgIG1haW5WYXJpYXRpb25TaWRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpblZhcmlhdGlvblNpZGUpO1xuICAgIH1cblxuICAgIHZhciBhbHRWYXJpYXRpb25TaWRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpblZhcmlhdGlvblNpZGUpO1xuICAgIHZhciBjaGVja3MgPSBbXTtcblxuICAgIGlmIChjaGVja01haW5BeGlzKSB7XG4gICAgICBjaGVja3MucHVzaChvdmVyZmxvd1tfYmFzZVBsYWNlbWVudF0gPD0gMCk7XG4gICAgfVxuXG4gICAgaWYgKGNoZWNrQWx0QXhpcykge1xuICAgICAgY2hlY2tzLnB1c2gob3ZlcmZsb3dbbWFpblZhcmlhdGlvblNpZGVdIDw9IDAsIG92ZXJmbG93W2FsdFZhcmlhdGlvblNpZGVdIDw9IDApO1xuICAgIH1cblxuICAgIGlmIChjaGVja3MuZXZlcnkoZnVuY3Rpb24gKGNoZWNrKSB7XG4gICAgICByZXR1cm4gY2hlY2s7XG4gICAgfSkpIHtcbiAgICAgIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudDtcbiAgICAgIG1ha2VGYWxsYmFja0NoZWNrcyA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY2hlY2tzTWFwLnNldChwbGFjZW1lbnQsIGNoZWNrcyk7XG4gIH1cblxuICBpZiAobWFrZUZhbGxiYWNrQ2hlY2tzKSB7XG4gICAgLy8gYDJgIG1heSBiZSBkZXNpcmVkIGluIHNvbWUgY2FzZXMg4oCTIHJlc2VhcmNoIGxhdGVyXG4gICAgdmFyIG51bWJlck9mQ2hlY2tzID0gZmxpcFZhcmlhdGlvbnMgPyAzIDogMTtcblxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKF9pKSB7XG4gICAgICB2YXIgZml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudHMuZmluZChmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgICAgIHZhciBjaGVja3MgPSBjaGVja3NNYXAuZ2V0KHBsYWNlbWVudCk7XG5cbiAgICAgICAgaWYgKGNoZWNrcykge1xuICAgICAgICAgIHJldHVybiBjaGVja3Muc2xpY2UoMCwgX2kpLmV2ZXJ5KGZ1bmN0aW9uIChjaGVjaykge1xuICAgICAgICAgICAgcmV0dXJuIGNoZWNrO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKGZpdHRpbmdQbGFjZW1lbnQpIHtcbiAgICAgICAgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gZml0dGluZ1BsYWNlbWVudDtcbiAgICAgICAgcmV0dXJuIFwiYnJlYWtcIjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yICh2YXIgX2kgPSBudW1iZXJPZkNoZWNrczsgX2kgPiAwOyBfaS0tKSB7XG4gICAgICB2YXIgX3JldCA9IF9sb29wKF9pKTtcblxuICAgICAgaWYgKF9yZXQgPT09IFwiYnJlYWtcIikgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLnBsYWNlbWVudCAhPT0gZmlyc3RGaXR0aW5nUGxhY2VtZW50KSB7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXS5fc2tpcCA9IHRydWU7XG4gICAgc3RhdGUucGxhY2VtZW50ID0gZmlyc3RGaXR0aW5nUGxhY2VtZW50O1xuICAgIHN0YXRlLnJlc2V0ID0gdHJ1ZTtcbiAgfVxufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnZmxpcCcsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIGZuOiBmbGlwLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ29mZnNldCddLFxuICBkYXRhOiB7XG4gICAgX3NraXA6IGZhbHNlXG4gIH1cbn07IiwiaW1wb3J0IHsgdG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0IH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4uL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzXCI7XG5cbmZ1bmN0aW9uIGdldFNpZGVPZmZzZXRzKG92ZXJmbG93LCByZWN0LCBwcmV2ZW50ZWRPZmZzZXRzKSB7XG4gIGlmIChwcmV2ZW50ZWRPZmZzZXRzID09PSB2b2lkIDApIHtcbiAgICBwcmV2ZW50ZWRPZmZzZXRzID0ge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0b3A6IG92ZXJmbG93LnRvcCAtIHJlY3QuaGVpZ2h0IC0gcHJldmVudGVkT2Zmc2V0cy55LFxuICAgIHJpZ2h0OiBvdmVyZmxvdy5yaWdodCAtIHJlY3Qud2lkdGggKyBwcmV2ZW50ZWRPZmZzZXRzLngsXG4gICAgYm90dG9tOiBvdmVyZmxvdy5ib3R0b20gLSByZWN0LmhlaWdodCArIHByZXZlbnRlZE9mZnNldHMueSxcbiAgICBsZWZ0OiBvdmVyZmxvdy5sZWZ0IC0gcmVjdC53aWR0aCAtIHByZXZlbnRlZE9mZnNldHMueFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc0FueVNpZGVGdWxseUNsaXBwZWQob3ZlcmZsb3cpIHtcbiAgcmV0dXJuIFt0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnRdLnNvbWUoZnVuY3Rpb24gKHNpZGUpIHtcbiAgICByZXR1cm4gb3ZlcmZsb3dbc2lkZV0gPj0gMDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGhpZGUoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcbiAgdmFyIHJlZmVyZW5jZVJlY3QgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2U7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgcHJldmVudGVkT2Zmc2V0cyA9IHN0YXRlLm1vZGlmaWVyc0RhdGEucHJldmVudE92ZXJmbG93O1xuICB2YXIgcmVmZXJlbmNlT3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgIGVsZW1lbnRDb250ZXh0OiAncmVmZXJlbmNlJ1xuICB9KTtcbiAgdmFyIHBvcHBlckFsdE92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICBhbHRCb3VuZGFyeTogdHJ1ZVxuICB9KTtcbiAgdmFyIHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0cyA9IGdldFNpZGVPZmZzZXRzKHJlZmVyZW5jZU92ZXJmbG93LCByZWZlcmVuY2VSZWN0KTtcbiAgdmFyIHBvcHBlckVzY2FwZU9mZnNldHMgPSBnZXRTaWRlT2Zmc2V0cyhwb3BwZXJBbHRPdmVyZmxvdywgcG9wcGVyUmVjdCwgcHJldmVudGVkT2Zmc2V0cyk7XG4gIHZhciBpc1JlZmVyZW5jZUhpZGRlbiA9IGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChyZWZlcmVuY2VDbGlwcGluZ09mZnNldHMpO1xuICB2YXIgaGFzUG9wcGVyRXNjYXBlZCA9IGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChwb3BwZXJFc2NhcGVPZmZzZXRzKTtcbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IHtcbiAgICByZWZlcmVuY2VDbGlwcGluZ09mZnNldHM6IHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0cyxcbiAgICBwb3BwZXJFc2NhcGVPZmZzZXRzOiBwb3BwZXJFc2NhcGVPZmZzZXRzLFxuICAgIGlzUmVmZXJlbmNlSGlkZGVuOiBpc1JlZmVyZW5jZUhpZGRlbixcbiAgICBoYXNQb3BwZXJFc2NhcGVkOiBoYXNQb3BwZXJFc2NhcGVkXG4gIH07XG4gIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIsIHtcbiAgICAnZGF0YS1wb3BwZXItcmVmZXJlbmNlLWhpZGRlbic6IGlzUmVmZXJlbmNlSGlkZGVuLFxuICAgICdkYXRhLXBvcHBlci1lc2NhcGVkJzogaGFzUG9wcGVyRXNjYXBlZFxuICB9KTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2hpZGUnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ3ByZXZlbnRPdmVyZmxvdyddLFxuICBmbjogaGlkZVxufTsiLCJpbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgdG9wLCBsZWZ0LCByaWdodCwgcGxhY2VtZW50cyB9IGZyb20gXCIuLi9lbnVtcy5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZUFuZFNraWRkaW5nVG9YWShwbGFjZW1lbnQsIHJlY3RzLCBvZmZzZXQpIHtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCk7XG4gIHZhciBpbnZlcnREaXN0YW5jZSA9IFtsZWZ0LCB0b3BdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMCA/IC0xIDogMTtcblxuICB2YXIgX3JlZiA9IHR5cGVvZiBvZmZzZXQgPT09ICdmdW5jdGlvbicgPyBvZmZzZXQoT2JqZWN0LmFzc2lnbih7fSwgcmVjdHMsIHtcbiAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudFxuICB9KSkgOiBvZmZzZXQsXG4gICAgICBza2lkZGluZyA9IF9yZWZbMF0sXG4gICAgICBkaXN0YW5jZSA9IF9yZWZbMV07XG5cbiAgc2tpZGRpbmcgPSBza2lkZGluZyB8fCAwO1xuICBkaXN0YW5jZSA9IChkaXN0YW5jZSB8fCAwKSAqIGludmVydERpc3RhbmNlO1xuICByZXR1cm4gW2xlZnQsIHJpZ2h0XS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpID49IDAgPyB7XG4gICAgeDogZGlzdGFuY2UsXG4gICAgeTogc2tpZGRpbmdcbiAgfSA6IHtcbiAgICB4OiBza2lkZGluZyxcbiAgICB5OiBkaXN0YW5jZVxuICB9O1xufVxuXG5mdW5jdGlvbiBvZmZzZXQoX3JlZjIpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjIuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZjIub3B0aW9ucyxcbiAgICAgIG5hbWUgPSBfcmVmMi5uYW1lO1xuICB2YXIgX29wdGlvbnMkb2Zmc2V0ID0gb3B0aW9ucy5vZmZzZXQsXG4gICAgICBvZmZzZXQgPSBfb3B0aW9ucyRvZmZzZXQgPT09IHZvaWQgMCA/IFswLCAwXSA6IF9vcHRpb25zJG9mZnNldDtcbiAgdmFyIGRhdGEgPSBwbGFjZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICBhY2NbcGxhY2VtZW50XSA9IGRpc3RhbmNlQW5kU2tpZGRpbmdUb1hZKHBsYWNlbWVudCwgc3RhdGUucmVjdHMsIG9mZnNldCk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xuICB2YXIgX2RhdGEkc3RhdGUkcGxhY2VtZW50ID0gZGF0YVtzdGF0ZS5wbGFjZW1lbnRdLFxuICAgICAgeCA9IF9kYXRhJHN0YXRlJHBsYWNlbWVudC54LFxuICAgICAgeSA9IF9kYXRhJHN0YXRlJHBsYWNlbWVudC55O1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMgIT0gbnVsbCkge1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cy54ICs9IHg7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLnkgKz0geTtcbiAgfVxuXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBkYXRhO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnb2Zmc2V0JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgcmVxdWlyZXM6IFsncG9wcGVyT2Zmc2V0cyddLFxuICBmbjogb2Zmc2V0XG59OyIsImltcG9ydCBjb21wdXRlT2Zmc2V0cyBmcm9tIFwiLi4vdXRpbHMvY29tcHV0ZU9mZnNldHMuanNcIjtcblxuZnVuY3Rpb24gcG9wcGVyT2Zmc2V0cyhfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICAvLyBPZmZzZXRzIGFyZSB0aGUgYWN0dWFsIHBvc2l0aW9uIHRoZSBwb3BwZXIgbmVlZHMgdG8gaGF2ZSB0byBiZVxuICAvLyBwcm9wZXJseSBwb3NpdGlvbmVkIG5lYXIgaXRzIHJlZmVyZW5jZSBlbGVtZW50XG4gIC8vIFRoaXMgaXMgdGhlIG1vc3QgYmFzaWMgcGxhY2VtZW50LCBhbmQgd2lsbCBiZSBhZGp1c3RlZCBieVxuICAvLyB0aGUgbW9kaWZpZXJzIGluIHRoZSBuZXh0IHN0ZXBcbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IGNvbXB1dGVPZmZzZXRzKHtcbiAgICByZWZlcmVuY2U6IHN0YXRlLnJlY3RzLnJlZmVyZW5jZSxcbiAgICBlbGVtZW50OiBzdGF0ZS5yZWN0cy5wb3BwZXIsXG4gICAgc3RyYXRlZ3k6ICdhYnNvbHV0ZScsXG4gICAgcGxhY2VtZW50OiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdwb3BwZXJPZmZzZXRzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdyZWFkJyxcbiAgZm46IHBvcHBlck9mZnNldHMsXG4gIGRhdGE6IHt9XG59OyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEFsdEF4aXMoYXhpcykge1xuICByZXR1cm4gYXhpcyA9PT0gJ3gnID8gJ3knIDogJ3gnO1xufSIsImltcG9ydCB7IHRvcCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgc3RhcnQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRBbHRBeGlzIGZyb20gXCIuLi91dGlscy9nZXRBbHRBeGlzLmpzXCI7XG5pbXBvcnQgeyB3aXRoaW4sIHdpdGhpbk1heENsYW1wIH0gZnJvbSBcIi4uL3V0aWxzL3dpdGhpbi5qc1wiO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRMYXlvdXRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4uL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuLi91dGlscy9nZXRWYXJpYXRpb24uanNcIjtcbmltcG9ydCBnZXRGcmVzaFNpZGVPYmplY3QgZnJvbSBcIi4uL3V0aWxzL2dldEZyZXNoU2lkZU9iamVjdC5qc1wiO1xuaW1wb3J0IHsgbWluIGFzIG1hdGhNaW4sIG1heCBhcyBtYXRoTWF4IH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcblxuZnVuY3Rpb24gcHJldmVudE92ZXJmbG93KF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICB2YXIgX29wdGlvbnMkbWFpbkF4aXMgPSBvcHRpb25zLm1haW5BeGlzLFxuICAgICAgY2hlY2tNYWluQXhpcyA9IF9vcHRpb25zJG1haW5BeGlzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkbWFpbkF4aXMsXG4gICAgICBfb3B0aW9ucyRhbHRBeGlzID0gb3B0aW9ucy5hbHRBeGlzLFxuICAgICAgY2hlY2tBbHRBeGlzID0gX29wdGlvbnMkYWx0QXhpcyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfb3B0aW9ucyRhbHRBeGlzLFxuICAgICAgYm91bmRhcnkgPSBvcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IG9wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBwYWRkaW5nID0gb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgX29wdGlvbnMkdGV0aGVyID0gb3B0aW9ucy50ZXRoZXIsXG4gICAgICB0ZXRoZXIgPSBfb3B0aW9ucyR0ZXRoZXIgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyR0ZXRoZXIsXG4gICAgICBfb3B0aW9ucyR0ZXRoZXJPZmZzZXQgPSBvcHRpb25zLnRldGhlck9mZnNldCxcbiAgICAgIHRldGhlck9mZnNldCA9IF9vcHRpb25zJHRldGhlck9mZnNldCA9PT0gdm9pZCAwID8gMCA6IF9vcHRpb25zJHRldGhlck9mZnNldDtcbiAgdmFyIG92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgcGFkZGluZzogcGFkZGluZyxcbiAgICBhbHRCb3VuZGFyeTogYWx0Qm91bmRhcnlcbiAgfSk7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpO1xuICB2YXIgdmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciBpc0Jhc2VQbGFjZW1lbnQgPSAhdmFyaWF0aW9uO1xuICB2YXIgbWFpbkF4aXMgPSBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQoYmFzZVBsYWNlbWVudCk7XG4gIHZhciBhbHRBeGlzID0gZ2V0QWx0QXhpcyhtYWluQXhpcyk7XG4gIHZhciBwb3BwZXJPZmZzZXRzID0gc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciB0ZXRoZXJPZmZzZXRWYWx1ZSA9IHR5cGVvZiB0ZXRoZXJPZmZzZXQgPT09ICdmdW5jdGlvbicgPyB0ZXRoZXJPZmZzZXQoT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUucmVjdHMsIHtcbiAgICBwbGFjZW1lbnQ6IHN0YXRlLnBsYWNlbWVudFxuICB9KSkgOiB0ZXRoZXJPZmZzZXQ7XG4gIHZhciBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUgPSB0eXBlb2YgdGV0aGVyT2Zmc2V0VmFsdWUgPT09ICdudW1iZXInID8ge1xuICAgIG1haW5BeGlzOiB0ZXRoZXJPZmZzZXRWYWx1ZSxcbiAgICBhbHRBeGlzOiB0ZXRoZXJPZmZzZXRWYWx1ZVxuICB9IDogT2JqZWN0LmFzc2lnbih7XG4gICAgbWFpbkF4aXM6IDAsXG4gICAgYWx0QXhpczogMFxuICB9LCB0ZXRoZXJPZmZzZXRWYWx1ZSk7XG4gIHZhciBvZmZzZXRNb2RpZmllclN0YXRlID0gc3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXQgPyBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldFtzdGF0ZS5wbGFjZW1lbnRdIDogbnVsbDtcbiAgdmFyIGRhdGEgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG5cbiAgaWYgKCFwb3BwZXJPZmZzZXRzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGNoZWNrTWFpbkF4aXMpIHtcbiAgICB2YXIgX29mZnNldE1vZGlmaWVyU3RhdGUkO1xuXG4gICAgdmFyIG1haW5TaWRlID0gbWFpbkF4aXMgPT09ICd5JyA/IHRvcCA6IGxlZnQ7XG4gICAgdmFyIGFsdFNpZGUgPSBtYWluQXhpcyA9PT0gJ3knID8gYm90dG9tIDogcmlnaHQ7XG4gICAgdmFyIGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG4gICAgdmFyIG9mZnNldCA9IHBvcHBlck9mZnNldHNbbWFpbkF4aXNdO1xuICAgIHZhciBtaW4gPSBvZmZzZXQgKyBvdmVyZmxvd1ttYWluU2lkZV07XG4gICAgdmFyIG1heCA9IG9mZnNldCAtIG92ZXJmbG93W2FsdFNpZGVdO1xuICAgIHZhciBhZGRpdGl2ZSA9IHRldGhlciA/IC1wb3BwZXJSZWN0W2xlbl0gLyAyIDogMDtcbiAgICB2YXIgbWluTGVuID0gdmFyaWF0aW9uID09PSBzdGFydCA/IHJlZmVyZW5jZVJlY3RbbGVuXSA6IHBvcHBlclJlY3RbbGVuXTtcbiAgICB2YXIgbWF4TGVuID0gdmFyaWF0aW9uID09PSBzdGFydCA/IC1wb3BwZXJSZWN0W2xlbl0gOiAtcmVmZXJlbmNlUmVjdFtsZW5dOyAvLyBXZSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFycm93IGluIHRoZSBjYWxjdWxhdGlvbiBzbyB0aGUgYXJyb3cgZG9lc24ndCBnb1xuICAgIC8vIG91dHNpZGUgdGhlIHJlZmVyZW5jZSBib3VuZHNcblxuICAgIHZhciBhcnJvd0VsZW1lbnQgPSBzdGF0ZS5lbGVtZW50cy5hcnJvdztcbiAgICB2YXIgYXJyb3dSZWN0ID0gdGV0aGVyICYmIGFycm93RWxlbWVudCA/IGdldExheW91dFJlY3QoYXJyb3dFbGVtZW50KSA6IHtcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwXG4gICAgfTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nT2JqZWN0ID0gc3RhdGUubW9kaWZpZXJzRGF0YVsnYXJyb3cjcGVyc2lzdGVudCddID8gc3RhdGUubW9kaWZpZXJzRGF0YVsnYXJyb3cjcGVyc2lzdGVudCddLnBhZGRpbmcgOiBnZXRGcmVzaFNpZGVPYmplY3QoKTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nTWluID0gYXJyb3dQYWRkaW5nT2JqZWN0W21haW5TaWRlXTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nTWF4ID0gYXJyb3dQYWRkaW5nT2JqZWN0W2FsdFNpZGVdOyAvLyBJZiB0aGUgcmVmZXJlbmNlIGxlbmd0aCBpcyBzbWFsbGVyIHRoYW4gdGhlIGFycm93IGxlbmd0aCwgd2UgZG9uJ3Qgd2FudFxuICAgIC8vIHRvIGluY2x1ZGUgaXRzIGZ1bGwgc2l6ZSBpbiB0aGUgY2FsY3VsYXRpb24uIElmIHRoZSByZWZlcmVuY2UgaXMgc21hbGxcbiAgICAvLyBhbmQgbmVhciB0aGUgZWRnZSBvZiBhIGJvdW5kYXJ5LCB0aGUgcG9wcGVyIGNhbiBvdmVyZmxvdyBldmVuIGlmIHRoZVxuICAgIC8vIHJlZmVyZW5jZSBpcyBub3Qgb3ZlcmZsb3dpbmcgYXMgd2VsbCAoZS5nLiB2aXJ0dWFsIGVsZW1lbnRzIHdpdGggbm9cbiAgICAvLyB3aWR0aCBvciBoZWlnaHQpXG5cbiAgICB2YXIgYXJyb3dMZW4gPSB3aXRoaW4oMCwgcmVmZXJlbmNlUmVjdFtsZW5dLCBhcnJvd1JlY3RbbGVuXSk7XG4gICAgdmFyIG1pbk9mZnNldCA9IGlzQmFzZVBsYWNlbWVudCA/IHJlZmVyZW5jZVJlY3RbbGVuXSAvIDIgLSBhZGRpdGl2ZSAtIGFycm93TGVuIC0gYXJyb3dQYWRkaW5nTWluIC0gbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzIDogbWluTGVuIC0gYXJyb3dMZW4gLSBhcnJvd1BhZGRpbmdNaW4gLSBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXM7XG4gICAgdmFyIG1heE9mZnNldCA9IGlzQmFzZVBsYWNlbWVudCA/IC1yZWZlcmVuY2VSZWN0W2xlbl0gLyAyICsgYWRkaXRpdmUgKyBhcnJvd0xlbiArIGFycm93UGFkZGluZ01heCArIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5tYWluQXhpcyA6IG1heExlbiArIGFycm93TGVuICsgYXJyb3dQYWRkaW5nTWF4ICsgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzO1xuICAgIHZhciBhcnJvd09mZnNldFBhcmVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93ICYmIGdldE9mZnNldFBhcmVudChzdGF0ZS5lbGVtZW50cy5hcnJvdyk7XG4gICAgdmFyIGNsaWVudE9mZnNldCA9IGFycm93T2Zmc2V0UGFyZW50ID8gbWFpbkF4aXMgPT09ICd5JyA/IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudFRvcCB8fCAwIDogYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50TGVmdCB8fCAwIDogMDtcbiAgICB2YXIgb2Zmc2V0TW9kaWZpZXJWYWx1ZSA9IChfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQgPSBvZmZzZXRNb2RpZmllclN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBvZmZzZXRNb2RpZmllclN0YXRlW21haW5BeGlzXSkgIT0gbnVsbCA/IF9vZmZzZXRNb2RpZmllclN0YXRlJCA6IDA7XG4gICAgdmFyIHRldGhlck1pbiA9IG9mZnNldCArIG1pbk9mZnNldCAtIG9mZnNldE1vZGlmaWVyVmFsdWUgLSBjbGllbnRPZmZzZXQ7XG4gICAgdmFyIHRldGhlck1heCA9IG9mZnNldCArIG1heE9mZnNldCAtIG9mZnNldE1vZGlmaWVyVmFsdWU7XG4gICAgdmFyIHByZXZlbnRlZE9mZnNldCA9IHdpdGhpbih0ZXRoZXIgPyBtYXRoTWluKG1pbiwgdGV0aGVyTWluKSA6IG1pbiwgb2Zmc2V0LCB0ZXRoZXIgPyBtYXRoTWF4KG1heCwgdGV0aGVyTWF4KSA6IG1heCk7XG4gICAgcG9wcGVyT2Zmc2V0c1ttYWluQXhpc10gPSBwcmV2ZW50ZWRPZmZzZXQ7XG4gICAgZGF0YVttYWluQXhpc10gPSBwcmV2ZW50ZWRPZmZzZXQgLSBvZmZzZXQ7XG4gIH1cblxuICBpZiAoY2hlY2tBbHRBeGlzKSB7XG4gICAgdmFyIF9vZmZzZXRNb2RpZmllclN0YXRlJDI7XG5cbiAgICB2YXIgX21haW5TaWRlID0gbWFpbkF4aXMgPT09ICd4JyA/IHRvcCA6IGxlZnQ7XG5cbiAgICB2YXIgX2FsdFNpZGUgPSBtYWluQXhpcyA9PT0gJ3gnID8gYm90dG9tIDogcmlnaHQ7XG5cbiAgICB2YXIgX29mZnNldCA9IHBvcHBlck9mZnNldHNbYWx0QXhpc107XG5cbiAgICB2YXIgX2xlbiA9IGFsdEF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICAgIHZhciBfbWluID0gX29mZnNldCArIG92ZXJmbG93W19tYWluU2lkZV07XG5cbiAgICB2YXIgX21heCA9IF9vZmZzZXQgLSBvdmVyZmxvd1tfYWx0U2lkZV07XG5cbiAgICB2YXIgaXNPcmlnaW5TaWRlID0gW3RvcCwgbGVmdF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSAhPT0gLTE7XG5cbiAgICB2YXIgX29mZnNldE1vZGlmaWVyVmFsdWUgPSAoX29mZnNldE1vZGlmaWVyU3RhdGUkMiA9IG9mZnNldE1vZGlmaWVyU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IG9mZnNldE1vZGlmaWVyU3RhdGVbYWx0QXhpc10pICE9IG51bGwgPyBfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQyIDogMDtcblxuICAgIHZhciBfdGV0aGVyTWluID0gaXNPcmlnaW5TaWRlID8gX21pbiA6IF9vZmZzZXQgLSByZWZlcmVuY2VSZWN0W19sZW5dIC0gcG9wcGVyUmVjdFtfbGVuXSAtIF9vZmZzZXRNb2RpZmllclZhbHVlICsgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLmFsdEF4aXM7XG5cbiAgICB2YXIgX3RldGhlck1heCA9IGlzT3JpZ2luU2lkZSA/IF9vZmZzZXQgKyByZWZlcmVuY2VSZWN0W19sZW5dICsgcG9wcGVyUmVjdFtfbGVuXSAtIF9vZmZzZXRNb2RpZmllclZhbHVlIC0gbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLmFsdEF4aXMgOiBfbWF4O1xuXG4gICAgdmFyIF9wcmV2ZW50ZWRPZmZzZXQgPSB0ZXRoZXIgJiYgaXNPcmlnaW5TaWRlID8gd2l0aGluTWF4Q2xhbXAoX3RldGhlck1pbiwgX29mZnNldCwgX3RldGhlck1heCkgOiB3aXRoaW4odGV0aGVyID8gX3RldGhlck1pbiA6IF9taW4sIF9vZmZzZXQsIHRldGhlciA/IF90ZXRoZXJNYXggOiBfbWF4KTtcblxuICAgIHBvcHBlck9mZnNldHNbYWx0QXhpc10gPSBfcHJldmVudGVkT2Zmc2V0O1xuICAgIGRhdGFbYWx0QXhpc10gPSBfcHJldmVudGVkT2Zmc2V0IC0gX29mZnNldDtcbiAgfVxuXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBkYXRhO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAncHJldmVudE92ZXJmbG93JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgZm46IHByZXZlbnRPdmVyZmxvdyxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydvZmZzZXQnXVxufTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRIVE1MRWxlbWVudFNjcm9sbChlbGVtZW50KSB7XG4gIHJldHVybiB7XG4gICAgc2Nyb2xsTGVmdDogZWxlbWVudC5zY3JvbGxMZWZ0LFxuICAgIHNjcm9sbFRvcDogZWxlbWVudC5zY3JvbGxUb3BcbiAgfTtcbn0iLCJpbXBvcnQgZ2V0V2luZG93U2Nyb2xsIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgZ2V0SFRNTEVsZW1lbnRTY3JvbGwgZnJvbSBcIi4vZ2V0SFRNTEVsZW1lbnRTY3JvbGwuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE5vZGVTY3JvbGwobm9kZSkge1xuICBpZiAobm9kZSA9PT0gZ2V0V2luZG93KG5vZGUpIHx8ICFpc0hUTUxFbGVtZW50KG5vZGUpKSB7XG4gICAgcmV0dXJuIGdldFdpbmRvd1Njcm9sbChub2RlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZ2V0SFRNTEVsZW1lbnRTY3JvbGwobm9kZSk7XG4gIH1cbn0iLCJpbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGdldE5vZGVTY3JvbGwgZnJvbSBcIi4vZ2V0Tm9kZVNjcm9sbC5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbEJhclggZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsQmFyWC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBpc1Njcm9sbFBhcmVudCBmcm9tIFwiLi9pc1Njcm9sbFBhcmVudC5qc1wiO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiBpc0VsZW1lbnRTY2FsZWQoZWxlbWVudCkge1xuICB2YXIgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHZhciBzY2FsZVggPSByb3VuZChyZWN0LndpZHRoKSAvIGVsZW1lbnQub2Zmc2V0V2lkdGggfHwgMTtcbiAgdmFyIHNjYWxlWSA9IHJvdW5kKHJlY3QuaGVpZ2h0KSAvIGVsZW1lbnQub2Zmc2V0SGVpZ2h0IHx8IDE7XG4gIHJldHVybiBzY2FsZVggIT09IDEgfHwgc2NhbGVZICE9PSAxO1xufSAvLyBSZXR1cm5zIHRoZSBjb21wb3NpdGUgcmVjdCBvZiBhbiBlbGVtZW50IHJlbGF0aXZlIHRvIGl0cyBvZmZzZXRQYXJlbnQuXG4vLyBDb21wb3NpdGUgbWVhbnMgaXQgdGFrZXMgaW50byBhY2NvdW50IHRyYW5zZm9ybXMgYXMgd2VsbCBhcyBsYXlvdXQuXG5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q29tcG9zaXRlUmVjdChlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCwgb2Zmc2V0UGFyZW50LCBpc0ZpeGVkKSB7XG4gIGlmIChpc0ZpeGVkID09PSB2b2lkIDApIHtcbiAgICBpc0ZpeGVkID0gZmFsc2U7XG4gIH1cblxuICB2YXIgaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgPSBpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCk7XG4gIHZhciBvZmZzZXRQYXJlbnRJc1NjYWxlZCA9IGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KSAmJiBpc0VsZW1lbnRTY2FsZWQob2Zmc2V0UGFyZW50KTtcbiAgdmFyIGRvY3VtZW50RWxlbWVudCA9IGdldERvY3VtZW50RWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICB2YXIgcmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCwgb2Zmc2V0UGFyZW50SXNTY2FsZWQsIGlzRml4ZWQpO1xuICB2YXIgc2Nyb2xsID0ge1xuICAgIHNjcm9sbExlZnQ6IDAsXG4gICAgc2Nyb2xsVG9wOiAwXG4gIH07XG4gIHZhciBvZmZzZXRzID0ge1xuICAgIHg6IDAsXG4gICAgeTogMFxuICB9O1xuXG4gIGlmIChpc09mZnNldFBhcmVudEFuRWxlbWVudCB8fCAhaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgJiYgIWlzRml4ZWQpIHtcbiAgICBpZiAoZ2V0Tm9kZU5hbWUob2Zmc2V0UGFyZW50KSAhPT0gJ2JvZHknIHx8IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvMTA3OFxuICAgIGlzU2Nyb2xsUGFyZW50KGRvY3VtZW50RWxlbWVudCkpIHtcbiAgICAgIHNjcm9sbCA9IGdldE5vZGVTY3JvbGwob2Zmc2V0UGFyZW50KTtcbiAgICB9XG5cbiAgICBpZiAoaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpKSB7XG4gICAgICBvZmZzZXRzID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KG9mZnNldFBhcmVudCwgdHJ1ZSk7XG4gICAgICBvZmZzZXRzLnggKz0gb2Zmc2V0UGFyZW50LmNsaWVudExlZnQ7XG4gICAgICBvZmZzZXRzLnkgKz0gb2Zmc2V0UGFyZW50LmNsaWVudFRvcDtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50RWxlbWVudCkge1xuICAgICAgb2Zmc2V0cy54ID0gZ2V0V2luZG93U2Nyb2xsQmFyWChkb2N1bWVudEVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgeDogcmVjdC5sZWZ0ICsgc2Nyb2xsLnNjcm9sbExlZnQgLSBvZmZzZXRzLngsXG4gICAgeTogcmVjdC50b3AgKyBzY3JvbGwuc2Nyb2xsVG9wIC0gb2Zmc2V0cy55LFxuICAgIHdpZHRoOiByZWN0LndpZHRoLFxuICAgIGhlaWdodDogcmVjdC5oZWlnaHRcbiAgfTtcbn0iLCJpbXBvcnQgeyBtb2RpZmllclBoYXNlcyB9IGZyb20gXCIuLi9lbnVtcy5qc1wiOyAvLyBzb3VyY2U6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ5ODc1MjU1XG5cbmZ1bmN0aW9uIG9yZGVyKG1vZGlmaWVycykge1xuICB2YXIgbWFwID0gbmV3IE1hcCgpO1xuICB2YXIgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBtb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICBtYXAuc2V0KG1vZGlmaWVyLm5hbWUsIG1vZGlmaWVyKTtcbiAgfSk7IC8vIE9uIHZpc2l0aW5nIG9iamVjdCwgY2hlY2sgZm9yIGl0cyBkZXBlbmRlbmNpZXMgYW5kIHZpc2l0IHRoZW0gcmVjdXJzaXZlbHlcblxuICBmdW5jdGlvbiBzb3J0KG1vZGlmaWVyKSB7XG4gICAgdmlzaXRlZC5hZGQobW9kaWZpZXIubmFtZSk7XG4gICAgdmFyIHJlcXVpcmVzID0gW10uY29uY2F0KG1vZGlmaWVyLnJlcXVpcmVzIHx8IFtdLCBtb2RpZmllci5yZXF1aXJlc0lmRXhpc3RzIHx8IFtdKTtcbiAgICByZXF1aXJlcy5mb3JFYWNoKGZ1bmN0aW9uIChkZXApIHtcbiAgICAgIGlmICghdmlzaXRlZC5oYXMoZGVwKSkge1xuICAgICAgICB2YXIgZGVwTW9kaWZpZXIgPSBtYXAuZ2V0KGRlcCk7XG5cbiAgICAgICAgaWYgKGRlcE1vZGlmaWVyKSB7XG4gICAgICAgICAgc29ydChkZXBNb2RpZmllcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXN1bHQucHVzaChtb2RpZmllcik7XG4gIH1cblxuICBtb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICBpZiAoIXZpc2l0ZWQuaGFzKG1vZGlmaWVyLm5hbWUpKSB7XG4gICAgICAvLyBjaGVjayBmb3IgdmlzaXRlZCBvYmplY3RcbiAgICAgIHNvcnQobW9kaWZpZXIpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG9yZGVyTW9kaWZpZXJzKG1vZGlmaWVycykge1xuICAvLyBvcmRlciBiYXNlZCBvbiBkZXBlbmRlbmNpZXNcbiAgdmFyIG9yZGVyZWRNb2RpZmllcnMgPSBvcmRlcihtb2RpZmllcnMpOyAvLyBvcmRlciBiYXNlZCBvbiBwaGFzZVxuXG4gIHJldHVybiBtb2RpZmllclBoYXNlcy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGhhc2UpIHtcbiAgICByZXR1cm4gYWNjLmNvbmNhdChvcmRlcmVkTW9kaWZpZXJzLmZpbHRlcihmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICAgIHJldHVybiBtb2RpZmllci5waGFzZSA9PT0gcGhhc2U7XG4gICAgfSkpO1xuICB9LCBbXSk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGVib3VuY2UoZm4pIHtcbiAgdmFyIHBlbmRpbmc7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICBwZW5kaW5nID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcGVuZGluZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICByZXNvbHZlKGZuKCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBwZW5kaW5nO1xuICB9O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lcmdlQnlOYW1lKG1vZGlmaWVycykge1xuICB2YXIgbWVyZ2VkID0gbW9kaWZpZXJzLnJlZHVjZShmdW5jdGlvbiAobWVyZ2VkLCBjdXJyZW50KSB7XG4gICAgdmFyIGV4aXN0aW5nID0gbWVyZ2VkW2N1cnJlbnQubmFtZV07XG4gICAgbWVyZ2VkW2N1cnJlbnQubmFtZV0gPSBleGlzdGluZyA/IE9iamVjdC5hc3NpZ24oe30sIGV4aXN0aW5nLCBjdXJyZW50LCB7XG4gICAgICBvcHRpb25zOiBPYmplY3QuYXNzaWduKHt9LCBleGlzdGluZy5vcHRpb25zLCBjdXJyZW50Lm9wdGlvbnMpLFxuICAgICAgZGF0YTogT2JqZWN0LmFzc2lnbih7fSwgZXhpc3RpbmcuZGF0YSwgY3VycmVudC5kYXRhKVxuICAgIH0pIDogY3VycmVudDtcbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9LCB7fSk7IC8vIElFMTEgZG9lcyBub3Qgc3VwcG9ydCBPYmplY3QudmFsdWVzXG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKG1lcmdlZCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gbWVyZ2VkW2tleV07XG4gIH0pO1xufSIsImltcG9ydCBnZXRDb21wb3NpdGVSZWN0IGZyb20gXCIuL2RvbS11dGlscy9nZXRDb21wb3NpdGVSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0TGF5b3V0UmVjdCBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0TGF5b3V0UmVjdC5qc1wiO1xuaW1wb3J0IGxpc3RTY3JvbGxQYXJlbnRzIGZyb20gXCIuL2RvbS11dGlscy9saXN0U2Nyb2xsUGFyZW50cy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgb3JkZXJNb2RpZmllcnMgZnJvbSBcIi4vdXRpbHMvb3JkZXJNb2RpZmllcnMuanNcIjtcbmltcG9ydCBkZWJvdW5jZSBmcm9tIFwiLi91dGlscy9kZWJvdW5jZS5qc1wiO1xuaW1wb3J0IG1lcmdlQnlOYW1lIGZyb20gXCIuL3V0aWxzL21lcmdlQnlOYW1lLmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCB7IGlzRWxlbWVudCB9IGZyb20gXCIuL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzXCI7XG52YXIgREVGQVVMVF9PUFRJT05TID0ge1xuICBwbGFjZW1lbnQ6ICdib3R0b20nLFxuICBtb2RpZmllcnM6IFtdLFxuICBzdHJhdGVneTogJ2Fic29sdXRlJ1xufTtcblxuZnVuY3Rpb24gYXJlVmFsaWRFbGVtZW50cygpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiAhYXJncy5zb21lKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgcmV0dXJuICEoZWxlbWVudCAmJiB0eXBlb2YgZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPT09ICdmdW5jdGlvbicpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBvcHBlckdlbmVyYXRvcihnZW5lcmF0b3JPcHRpb25zKSB7XG4gIGlmIChnZW5lcmF0b3JPcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBnZW5lcmF0b3JPcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgX2dlbmVyYXRvck9wdGlvbnMgPSBnZW5lcmF0b3JPcHRpb25zLFxuICAgICAgX2dlbmVyYXRvck9wdGlvbnMkZGVmID0gX2dlbmVyYXRvck9wdGlvbnMuZGVmYXVsdE1vZGlmaWVycyxcbiAgICAgIGRlZmF1bHRNb2RpZmllcnMgPSBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYgPT09IHZvaWQgMCA/IFtdIDogX2dlbmVyYXRvck9wdGlvbnMkZGVmLFxuICAgICAgX2dlbmVyYXRvck9wdGlvbnMkZGVmMiA9IF9nZW5lcmF0b3JPcHRpb25zLmRlZmF1bHRPcHRpb25zLFxuICAgICAgZGVmYXVsdE9wdGlvbnMgPSBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYyID09PSB2b2lkIDAgPyBERUZBVUxUX09QVElPTlMgOiBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYyO1xuICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlUG9wcGVyKHJlZmVyZW5jZSwgcG9wcGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zO1xuICAgIH1cblxuICAgIHZhciBzdGF0ZSA9IHtcbiAgICAgIHBsYWNlbWVudDogJ2JvdHRvbScsXG4gICAgICBvcmRlcmVkTW9kaWZpZXJzOiBbXSxcbiAgICAgIG9wdGlvbnM6IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfT1BUSU9OUywgZGVmYXVsdE9wdGlvbnMpLFxuICAgICAgbW9kaWZpZXJzRGF0YToge30sXG4gICAgICBlbGVtZW50czoge1xuICAgICAgICByZWZlcmVuY2U6IHJlZmVyZW5jZSxcbiAgICAgICAgcG9wcGVyOiBwb3BwZXJcbiAgICAgIH0sXG4gICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgIHN0eWxlczoge31cbiAgICB9O1xuICAgIHZhciBlZmZlY3RDbGVhbnVwRm5zID0gW107XG4gICAgdmFyIGlzRGVzdHJveWVkID0gZmFsc2U7XG4gICAgdmFyIGluc3RhbmNlID0ge1xuICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgc2V0T3B0aW9uczogZnVuY3Rpb24gc2V0T3B0aW9ucyhzZXRPcHRpb25zQWN0aW9uKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gdHlwZW9mIHNldE9wdGlvbnNBY3Rpb24gPT09ICdmdW5jdGlvbicgPyBzZXRPcHRpb25zQWN0aW9uKHN0YXRlLm9wdGlvbnMpIDogc2V0T3B0aW9uc0FjdGlvbjtcbiAgICAgICAgY2xlYW51cE1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICBzdGF0ZS5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdE9wdGlvbnMsIHN0YXRlLm9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICBzdGF0ZS5zY3JvbGxQYXJlbnRzID0ge1xuICAgICAgICAgIHJlZmVyZW5jZTogaXNFbGVtZW50KHJlZmVyZW5jZSkgPyBsaXN0U2Nyb2xsUGFyZW50cyhyZWZlcmVuY2UpIDogcmVmZXJlbmNlLmNvbnRleHRFbGVtZW50ID8gbGlzdFNjcm9sbFBhcmVudHMocmVmZXJlbmNlLmNvbnRleHRFbGVtZW50KSA6IFtdLFxuICAgICAgICAgIHBvcHBlcjogbGlzdFNjcm9sbFBhcmVudHMocG9wcGVyKVxuICAgICAgICB9OyAvLyBPcmRlcnMgdGhlIG1vZGlmaWVycyBiYXNlZCBvbiB0aGVpciBkZXBlbmRlbmNpZXMgYW5kIGBwaGFzZWBcbiAgICAgICAgLy8gcHJvcGVydGllc1xuXG4gICAgICAgIHZhciBvcmRlcmVkTW9kaWZpZXJzID0gb3JkZXJNb2RpZmllcnMobWVyZ2VCeU5hbWUoW10uY29uY2F0KGRlZmF1bHRNb2RpZmllcnMsIHN0YXRlLm9wdGlvbnMubW9kaWZpZXJzKSkpOyAvLyBTdHJpcCBvdXQgZGlzYWJsZWQgbW9kaWZpZXJzXG5cbiAgICAgICAgc3RhdGUub3JkZXJlZE1vZGlmaWVycyA9IG9yZGVyZWRNb2RpZmllcnMuZmlsdGVyKGZ1bmN0aW9uIChtKSB7XG4gICAgICAgICAgcmV0dXJuIG0uZW5hYmxlZDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJ1bk1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICByZXR1cm4gaW5zdGFuY2UudXBkYXRlKCk7XG4gICAgICB9LFxuICAgICAgLy8gU3luYyB1cGRhdGUg4oCTIGl0IHdpbGwgYWx3YXlzIGJlIGV4ZWN1dGVkLCBldmVuIGlmIG5vdCBuZWNlc3NhcnkuIFRoaXNcbiAgICAgIC8vIGlzIHVzZWZ1bCBmb3IgbG93IGZyZXF1ZW5jeSB1cGRhdGVzIHdoZXJlIHN5bmMgYmVoYXZpb3Igc2ltcGxpZmllcyB0aGVcbiAgICAgIC8vIGxvZ2ljLlxuICAgICAgLy8gRm9yIGhpZ2ggZnJlcXVlbmN5IHVwZGF0ZXMgKGUuZy4gYHJlc2l6ZWAgYW5kIGBzY3JvbGxgIGV2ZW50cyksIGFsd2F5c1xuICAgICAgLy8gcHJlZmVyIHRoZSBhc3luYyBQb3BwZXIjdXBkYXRlIG1ldGhvZFxuICAgICAgZm9yY2VVcGRhdGU6IGZ1bmN0aW9uIGZvcmNlVXBkYXRlKCkge1xuICAgICAgICBpZiAoaXNEZXN0cm95ZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX3N0YXRlJGVsZW1lbnRzID0gc3RhdGUuZWxlbWVudHMsXG4gICAgICAgICAgICByZWZlcmVuY2UgPSBfc3RhdGUkZWxlbWVudHMucmVmZXJlbmNlLFxuICAgICAgICAgICAgcG9wcGVyID0gX3N0YXRlJGVsZW1lbnRzLnBvcHBlcjsgLy8gRG9uJ3QgcHJvY2VlZCBpZiBgcmVmZXJlbmNlYCBvciBgcG9wcGVyYCBhcmUgbm90IHZhbGlkIGVsZW1lbnRzXG4gICAgICAgIC8vIGFueW1vcmVcblxuICAgICAgICBpZiAoIWFyZVZhbGlkRWxlbWVudHMocmVmZXJlbmNlLCBwb3BwZXIpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IC8vIFN0b3JlIHRoZSByZWZlcmVuY2UgYW5kIHBvcHBlciByZWN0cyB0byBiZSByZWFkIGJ5IG1vZGlmaWVyc1xuXG5cbiAgICAgICAgc3RhdGUucmVjdHMgPSB7XG4gICAgICAgICAgcmVmZXJlbmNlOiBnZXRDb21wb3NpdGVSZWN0KHJlZmVyZW5jZSwgZ2V0T2Zmc2V0UGFyZW50KHBvcHBlciksIHN0YXRlLm9wdGlvbnMuc3RyYXRlZ3kgPT09ICdmaXhlZCcpLFxuICAgICAgICAgIHBvcHBlcjogZ2V0TGF5b3V0UmVjdChwb3BwZXIpXG4gICAgICAgIH07IC8vIE1vZGlmaWVycyBoYXZlIHRoZSBhYmlsaXR5IHRvIHJlc2V0IHRoZSBjdXJyZW50IHVwZGF0ZSBjeWNsZS4gVGhlXG4gICAgICAgIC8vIG1vc3QgY29tbW9uIHVzZSBjYXNlIGZvciB0aGlzIGlzIHRoZSBgZmxpcGAgbW9kaWZpZXIgY2hhbmdpbmcgdGhlXG4gICAgICAgIC8vIHBsYWNlbWVudCwgd2hpY2ggdGhlbiBuZWVkcyB0byByZS1ydW4gYWxsIHRoZSBtb2RpZmllcnMsIGJlY2F1c2UgdGhlXG4gICAgICAgIC8vIGxvZ2ljIHdhcyBwcmV2aW91c2x5IHJhbiBmb3IgdGhlIHByZXZpb3VzIHBsYWNlbWVudCBhbmQgaXMgdGhlcmVmb3JlXG4gICAgICAgIC8vIHN0YWxlL2luY29ycmVjdFxuXG4gICAgICAgIHN0YXRlLnJlc2V0ID0gZmFsc2U7XG4gICAgICAgIHN0YXRlLnBsYWNlbWVudCA9IHN0YXRlLm9wdGlvbnMucGxhY2VtZW50OyAvLyBPbiBlYWNoIHVwZGF0ZSBjeWNsZSwgdGhlIGBtb2RpZmllcnNEYXRhYCBwcm9wZXJ0eSBmb3IgZWFjaCBtb2RpZmllclxuICAgICAgICAvLyBpcyBmaWxsZWQgd2l0aCB0aGUgaW5pdGlhbCBkYXRhIHNwZWNpZmllZCBieSB0aGUgbW9kaWZpZXIuIFRoaXMgbWVhbnNcbiAgICAgICAgLy8gaXQgZG9lc24ndCBwZXJzaXN0IGFuZCBpcyBmcmVzaCBvbiBlYWNoIHVwZGF0ZS5cbiAgICAgICAgLy8gVG8gZW5zdXJlIHBlcnNpc3RlbnQgZGF0YSwgdXNlIGAke25hbWV9I3BlcnNpc3RlbnRgXG5cbiAgICAgICAgc3RhdGUub3JkZXJlZE1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgICAgICAgIHJldHVybiBzdGF0ZS5tb2RpZmllcnNEYXRhW21vZGlmaWVyLm5hbWVdID0gT2JqZWN0LmFzc2lnbih7fSwgbW9kaWZpZXIuZGF0YSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgIGlmIChzdGF0ZS5yZXNldCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgc3RhdGUucmVzZXQgPSBmYWxzZTtcbiAgICAgICAgICAgIGluZGV4ID0gLTE7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgX3N0YXRlJG9yZGVyZWRNb2RpZmllID0gc3RhdGUub3JkZXJlZE1vZGlmaWVyc1tpbmRleF0sXG4gICAgICAgICAgICAgIGZuID0gX3N0YXRlJG9yZGVyZWRNb2RpZmllLmZuLFxuICAgICAgICAgICAgICBfc3RhdGUkb3JkZXJlZE1vZGlmaWUyID0gX3N0YXRlJG9yZGVyZWRNb2RpZmllLm9wdGlvbnMsXG4gICAgICAgICAgICAgIF9vcHRpb25zID0gX3N0YXRlJG9yZGVyZWRNb2RpZmllMiA9PT0gdm9pZCAwID8ge30gOiBfc3RhdGUkb3JkZXJlZE1vZGlmaWUyLFxuICAgICAgICAgICAgICBuYW1lID0gX3N0YXRlJG9yZGVyZWRNb2RpZmllLm5hbWU7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IGZuKHtcbiAgICAgICAgICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgICAgICAgICBvcHRpb25zOiBfb3B0aW9ucyxcbiAgICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgaW5zdGFuY2U6IGluc3RhbmNlXG4gICAgICAgICAgICB9KSB8fCBzdGF0ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBBc3luYyBhbmQgb3B0aW1pc3RpY2FsbHkgb3B0aW1pemVkIHVwZGF0ZSDigJMgaXQgd2lsbCBub3QgYmUgZXhlY3V0ZWQgaWZcbiAgICAgIC8vIG5vdCBuZWNlc3NhcnkgKGRlYm91bmNlZCB0byBydW4gYXQgbW9zdCBvbmNlLXBlci10aWNrKVxuICAgICAgdXBkYXRlOiBkZWJvdW5jZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgIGluc3RhbmNlLmZvcmNlVXBkYXRlKCk7XG4gICAgICAgICAgcmVzb2x2ZShzdGF0ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgICBjbGVhbnVwTW9kaWZpZXJFZmZlY3RzKCk7XG4gICAgICAgIGlzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKCFhcmVWYWxpZEVsZW1lbnRzKHJlZmVyZW5jZSwgcG9wcGVyKSkge1xuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIGluc3RhbmNlLnNldE9wdGlvbnMob3B0aW9ucykudGhlbihmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgIGlmICghaXNEZXN0cm95ZWQgJiYgb3B0aW9ucy5vbkZpcnN0VXBkYXRlKSB7XG4gICAgICAgIG9wdGlvbnMub25GaXJzdFVwZGF0ZShzdGF0ZSk7XG4gICAgICB9XG4gICAgfSk7IC8vIE1vZGlmaWVycyBoYXZlIHRoZSBhYmlsaXR5IHRvIGV4ZWN1dGUgYXJiaXRyYXJ5IGNvZGUgYmVmb3JlIHRoZSBmaXJzdFxuICAgIC8vIHVwZGF0ZSBjeWNsZSBydW5zLiBUaGV5IHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHVwZGF0ZVxuICAgIC8vIGN5Y2xlLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGEgbW9kaWZpZXIgYWRkcyBzb21lIHBlcnNpc3RlbnQgZGF0YSB0aGF0XG4gICAgLy8gb3RoZXIgbW9kaWZpZXJzIG5lZWQgdG8gdXNlLCBidXQgdGhlIG1vZGlmaWVyIGlzIHJ1biBhZnRlciB0aGUgZGVwZW5kZW50XG4gICAgLy8gb25lLlxuXG4gICAgZnVuY3Rpb24gcnVuTW9kaWZpZXJFZmZlY3RzKCkge1xuICAgICAgc3RhdGUub3JkZXJlZE1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgIHZhciBuYW1lID0gX3JlZi5uYW1lLFxuICAgICAgICAgICAgX3JlZiRvcHRpb25zID0gX3JlZi5vcHRpb25zLFxuICAgICAgICAgICAgb3B0aW9ucyA9IF9yZWYkb3B0aW9ucyA9PT0gdm9pZCAwID8ge30gOiBfcmVmJG9wdGlvbnMsXG4gICAgICAgICAgICBlZmZlY3QgPSBfcmVmLmVmZmVjdDtcblxuICAgICAgICBpZiAodHlwZW9mIGVmZmVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhciBjbGVhbnVwRm4gPSBlZmZlY3Qoe1xuICAgICAgICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnNcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHZhciBub29wRm4gPSBmdW5jdGlvbiBub29wRm4oKSB7fTtcblxuICAgICAgICAgIGVmZmVjdENsZWFudXBGbnMucHVzaChjbGVhbnVwRm4gfHwgbm9vcEZuKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYW51cE1vZGlmaWVyRWZmZWN0cygpIHtcbiAgICAgIGVmZmVjdENsZWFudXBGbnMuZm9yRWFjaChmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgcmV0dXJuIGZuKCk7XG4gICAgICB9KTtcbiAgICAgIGVmZmVjdENsZWFudXBGbnMgPSBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH07XG59XG5leHBvcnQgdmFyIGNyZWF0ZVBvcHBlciA9IC8qI19fUFVSRV9fKi9wb3BwZXJHZW5lcmF0b3IoKTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBkZXRlY3RPdmVyZmxvdyB9OyIsImltcG9ydCB7IHBvcHBlckdlbmVyYXRvciwgZGV0ZWN0T3ZlcmZsb3cgfSBmcm9tIFwiLi9jcmVhdGVQb3BwZXIuanNcIjtcbmltcG9ydCBldmVudExpc3RlbmVycyBmcm9tIFwiLi9tb2RpZmllcnMvZXZlbnRMaXN0ZW5lcnMuanNcIjtcbmltcG9ydCBwb3BwZXJPZmZzZXRzIGZyb20gXCIuL21vZGlmaWVycy9wb3BwZXJPZmZzZXRzLmpzXCI7XG5pbXBvcnQgY29tcHV0ZVN0eWxlcyBmcm9tIFwiLi9tb2RpZmllcnMvY29tcHV0ZVN0eWxlcy5qc1wiO1xuaW1wb3J0IGFwcGx5U3R5bGVzIGZyb20gXCIuL21vZGlmaWVycy9hcHBseVN0eWxlcy5qc1wiO1xuaW1wb3J0IG9mZnNldCBmcm9tIFwiLi9tb2RpZmllcnMvb2Zmc2V0LmpzXCI7XG5pbXBvcnQgZmxpcCBmcm9tIFwiLi9tb2RpZmllcnMvZmxpcC5qc1wiO1xuaW1wb3J0IHByZXZlbnRPdmVyZmxvdyBmcm9tIFwiLi9tb2RpZmllcnMvcHJldmVudE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgYXJyb3cgZnJvbSBcIi4vbW9kaWZpZXJzL2Fycm93LmpzXCI7XG5pbXBvcnQgaGlkZSBmcm9tIFwiLi9tb2RpZmllcnMvaGlkZS5qc1wiO1xudmFyIGRlZmF1bHRNb2RpZmllcnMgPSBbZXZlbnRMaXN0ZW5lcnMsIHBvcHBlck9mZnNldHMsIGNvbXB1dGVTdHlsZXMsIGFwcGx5U3R5bGVzLCBvZmZzZXQsIGZsaXAsIHByZXZlbnRPdmVyZmxvdywgYXJyb3csIGhpZGVdO1xudmFyIGNyZWF0ZVBvcHBlciA9IC8qI19fUFVSRV9fKi9wb3BwZXJHZW5lcmF0b3Ioe1xuICBkZWZhdWx0TW9kaWZpZXJzOiBkZWZhdWx0TW9kaWZpZXJzXG59KTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBjcmVhdGVQb3BwZXIsIHBvcHBlckdlbmVyYXRvciwgZGVmYXVsdE1vZGlmaWVycywgZGV0ZWN0T3ZlcmZsb3cgfTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBjcmVhdGVQb3BwZXIgYXMgY3JlYXRlUG9wcGVyTGl0ZSB9IGZyb20gXCIuL3BvcHBlci1saXRlLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0ICogZnJvbSBcIi4vbW9kaWZpZXJzL2luZGV4LmpzXCI7IiwiLyohXG4gICogQm9vdHN0cmFwIHY1LjMuOCAoaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLylcbiAgKiBDb3B5cmlnaHQgMjAxMS0yMDI1IFRoZSBCb290c3RyYXAgQXV0aG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2dyYXBocy9jb250cmlidXRvcnMpXG4gICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICovXG5pbXBvcnQgKiBhcyBQb3BwZXIgZnJvbSAnQHBvcHBlcmpzL2NvcmUnO1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgZG9tL2RhdGEuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IGVsZW1lbnRNYXAgPSBuZXcgTWFwKCk7XG5jb25zdCBEYXRhID0ge1xuICBzZXQoZWxlbWVudCwga2V5LCBpbnN0YW5jZSkge1xuICAgIGlmICghZWxlbWVudE1hcC5oYXMoZWxlbWVudCkpIHtcbiAgICAgIGVsZW1lbnRNYXAuc2V0KGVsZW1lbnQsIG5ldyBNYXAoKSk7XG4gICAgfVxuICAgIGNvbnN0IGluc3RhbmNlTWFwID0gZWxlbWVudE1hcC5nZXQoZWxlbWVudCk7XG5cbiAgICAvLyBtYWtlIGl0IGNsZWFyIHdlIG9ubHkgd2FudCBvbmUgaW5zdGFuY2UgcGVyIGVsZW1lbnRcbiAgICAvLyBjYW4gYmUgcmVtb3ZlZCBsYXRlciB3aGVuIG11bHRpcGxlIGtleS9pbnN0YW5jZXMgYXJlIGZpbmUgdG8gYmUgdXNlZFxuICAgIGlmICghaW5zdGFuY2VNYXAuaGFzKGtleSkgJiYgaW5zdGFuY2VNYXAuc2l6ZSAhPT0gMCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEJvb3RzdHJhcCBkb2Vzbid0IGFsbG93IG1vcmUgdGhhbiBvbmUgaW5zdGFuY2UgcGVyIGVsZW1lbnQuIEJvdW5kIGluc3RhbmNlOiAke0FycmF5LmZyb20oaW5zdGFuY2VNYXAua2V5cygpKVswXX0uYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGluc3RhbmNlTWFwLnNldChrZXksIGluc3RhbmNlKTtcbiAgfSxcbiAgZ2V0KGVsZW1lbnQsIGtleSkge1xuICAgIGlmIChlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgcmV0dXJuIGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpLmdldChrZXkpIHx8IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9LFxuICByZW1vdmUoZWxlbWVudCwga2V5KSB7XG4gICAgaWYgKCFlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbnN0YW5jZU1hcCA9IGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpO1xuICAgIGluc3RhbmNlTWFwLmRlbGV0ZShrZXkpO1xuXG4gICAgLy8gZnJlZSB1cCBlbGVtZW50IHJlZmVyZW5jZXMgaWYgdGhlcmUgYXJlIG5vIGluc3RhbmNlcyBsZWZ0IGZvciBhbiBlbGVtZW50XG4gICAgaWYgKGluc3RhbmNlTWFwLnNpemUgPT09IDApIHtcbiAgICAgIGVsZW1lbnRNYXAuZGVsZXRlKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHV0aWwvaW5kZXguanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5jb25zdCBNQVhfVUlEID0gMTAwMDAwMDtcbmNvbnN0IE1JTExJU0VDT05EU19NVUxUSVBMSUVSID0gMTAwMDtcbmNvbnN0IFRSQU5TSVRJT05fRU5EID0gJ3RyYW5zaXRpb25lbmQnO1xuXG4vKipcbiAqIFByb3Blcmx5IGVzY2FwZSBJRHMgc2VsZWN0b3JzIHRvIGhhbmRsZSB3ZWlyZCBJRHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgcGFyc2VTZWxlY3RvciA9IHNlbGVjdG9yID0+IHtcbiAgaWYgKHNlbGVjdG9yICYmIHdpbmRvdy5DU1MgJiYgd2luZG93LkNTUy5lc2NhcGUpIHtcbiAgICAvLyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yIG5lZWRzIGVzY2FwaW5nIHRvIGhhbmRsZSBJRHMgKGh0bWw1KykgY29udGFpbmluZyBmb3IgaW5zdGFuY2UgL1xuICAgIHNlbGVjdG9yID0gc2VsZWN0b3IucmVwbGFjZSgvIyhbXlxcc1wiIyddKykvZywgKG1hdGNoLCBpZCkgPT4gYCMke0NTUy5lc2NhcGUoaWQpfWApO1xuICB9XG4gIHJldHVybiBzZWxlY3Rvcjtcbn07XG5cbi8vIFNob3V0LW91dCBBbmd1cyBDcm9sbCAoaHR0cHM6Ly9nb28uZ2wvcHh3UUdwKVxuY29uc3QgdG9UeXBlID0gb2JqZWN0ID0+IHtcbiAgaWYgKG9iamVjdCA9PT0gbnVsbCB8fCBvYmplY3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBgJHtvYmplY3R9YDtcbiAgfVxuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkubWF0Y2goL1xccyhbYS16XSspL2kpWzFdLnRvTG93ZXJDYXNlKCk7XG59O1xuXG4vKipcbiAqIFB1YmxpYyBVdGlsIEFQSVxuICovXG5cbmNvbnN0IGdldFVJRCA9IHByZWZpeCA9PiB7XG4gIGRvIHtcbiAgICBwcmVmaXggKz0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogTUFYX1VJRCk7XG4gIH0gd2hpbGUgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHByZWZpeCkpO1xuICByZXR1cm4gcHJlZml4O1xufTtcbmNvbnN0IGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50ID0gZWxlbWVudCA9PiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLy8gR2V0IHRyYW5zaXRpb24tZHVyYXRpb24gb2YgdGhlIGVsZW1lbnRcbiAgbGV0IHtcbiAgICB0cmFuc2l0aW9uRHVyYXRpb24sXG4gICAgdHJhbnNpdGlvbkRlbGF5XG4gIH0gPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbiAgY29uc3QgZmxvYXRUcmFuc2l0aW9uRHVyYXRpb24gPSBOdW1iZXIucGFyc2VGbG9hdCh0cmFuc2l0aW9uRHVyYXRpb24pO1xuICBjb25zdCBmbG9hdFRyYW5zaXRpb25EZWxheSA9IE51bWJlci5wYXJzZUZsb2F0KHRyYW5zaXRpb25EZWxheSk7XG5cbiAgLy8gUmV0dXJuIDAgaWYgZWxlbWVudCBvciB0cmFuc2l0aW9uIGR1cmF0aW9uIGlzIG5vdCBmb3VuZFxuICBpZiAoIWZsb2F0VHJhbnNpdGlvbkR1cmF0aW9uICYmICFmbG9hdFRyYW5zaXRpb25EZWxheSkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLy8gSWYgbXVsdGlwbGUgZHVyYXRpb25zIGFyZSBkZWZpbmVkLCB0YWtlIHRoZSBmaXJzdFxuICB0cmFuc2l0aW9uRHVyYXRpb24gPSB0cmFuc2l0aW9uRHVyYXRpb24uc3BsaXQoJywnKVswXTtcbiAgdHJhbnNpdGlvbkRlbGF5ID0gdHJhbnNpdGlvbkRlbGF5LnNwbGl0KCcsJylbMF07XG4gIHJldHVybiAoTnVtYmVyLnBhcnNlRmxvYXQodHJhbnNpdGlvbkR1cmF0aW9uKSArIE51bWJlci5wYXJzZUZsb2F0KHRyYW5zaXRpb25EZWxheSkpICogTUlMTElTRUNPTkRTX01VTFRJUExJRVI7XG59O1xuY29uc3QgdHJpZ2dlclRyYW5zaXRpb25FbmQgPSBlbGVtZW50ID0+IHtcbiAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChUUkFOU0lUSU9OX0VORCkpO1xufTtcbmNvbnN0IGlzRWxlbWVudCA9IG9iamVjdCA9PiB7XG4gIGlmICghb2JqZWN0IHx8IHR5cGVvZiBvYmplY3QgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2Ygb2JqZWN0LmpxdWVyeSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBvYmplY3QgPSBvYmplY3RbMF07XG4gIH1cbiAgcmV0dXJuIHR5cGVvZiBvYmplY3Qubm9kZVR5cGUgIT09ICd1bmRlZmluZWQnO1xufTtcbmNvbnN0IGdldEVsZW1lbnQgPSBvYmplY3QgPT4ge1xuICAvLyBpdCdzIGEgalF1ZXJ5IG9iamVjdCBvciBhIG5vZGUgZWxlbWVudFxuICBpZiAoaXNFbGVtZW50KG9iamVjdCkpIHtcbiAgICByZXR1cm4gb2JqZWN0LmpxdWVyeSA/IG9iamVjdFswXSA6IG9iamVjdDtcbiAgfVxuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ3N0cmluZycgJiYgb2JqZWN0Lmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihwYXJzZVNlbGVjdG9yKG9iamVjdCkpO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcbmNvbnN0IGlzVmlzaWJsZSA9IGVsZW1lbnQgPT4ge1xuICBpZiAoIWlzRWxlbWVudChlbGVtZW50KSB8fCBlbGVtZW50LmdldENsaWVudFJlY3RzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGVsZW1lbnRJc1Zpc2libGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ3Zpc2liaWxpdHknKSA9PT0gJ3Zpc2libGUnO1xuICAvLyBIYW5kbGUgYGRldGFpbHNgIGVsZW1lbnQgYXMgaXRzIGNvbnRlbnQgbWF5IGZhbHNpZSBhcHBlYXIgdmlzaWJsZSB3aGVuIGl0IGlzIGNsb3NlZFxuICBjb25zdCBjbG9zZWREZXRhaWxzID0gZWxlbWVudC5jbG9zZXN0KCdkZXRhaWxzOm5vdChbb3Blbl0pJyk7XG4gIGlmICghY2xvc2VkRGV0YWlscykge1xuICAgIHJldHVybiBlbGVtZW50SXNWaXNpYmxlO1xuICB9XG4gIGlmIChjbG9zZWREZXRhaWxzICE9PSBlbGVtZW50KSB7XG4gICAgY29uc3Qgc3VtbWFyeSA9IGVsZW1lbnQuY2xvc2VzdCgnc3VtbWFyeScpO1xuICAgIGlmIChzdW1tYXJ5ICYmIHN1bW1hcnkucGFyZW50Tm9kZSAhPT0gY2xvc2VkRGV0YWlscykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoc3VtbWFyeSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZWxlbWVudElzVmlzaWJsZTtcbn07XG5jb25zdCBpc0Rpc2FibGVkID0gZWxlbWVudCA9PiB7XG4gIGlmICghZWxlbWVudCB8fCBlbGVtZW50Lm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZGlzYWJsZWQnKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh0eXBlb2YgZWxlbWVudC5kaXNhYmxlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZWxlbWVudC5kaXNhYmxlZDtcbiAgfVxuICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgIT09ICdmYWxzZSc7XG59O1xuY29uc3QgZmluZFNoYWRvd1Jvb3QgPSBlbGVtZW50ID0+IHtcbiAgaWYgKCFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXR0YWNoU2hhZG93KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBDYW4gZmluZCB0aGUgc2hhZG93IHJvb3Qgb3RoZXJ3aXNlIGl0J2xsIHJldHVybiB0aGUgZG9jdW1lbnRcbiAgaWYgKHR5cGVvZiBlbGVtZW50LmdldFJvb3ROb2RlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc3Qgcm9vdCA9IGVsZW1lbnQuZ2V0Um9vdE5vZGUoKTtcbiAgICByZXR1cm4gcm9vdCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QgPyByb290IDogbnVsbDtcbiAgfVxuICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIC8vIHdoZW4gd2UgZG9uJ3QgZmluZCBhIHNoYWRvdyByb290XG4gIGlmICghZWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGZpbmRTaGFkb3dSb290KGVsZW1lbnQucGFyZW50Tm9kZSk7XG59O1xuY29uc3Qgbm9vcCA9ICgpID0+IHt9O1xuXG4vKipcbiAqIFRyaWNrIHRvIHJlc3RhcnQgYW4gZWxlbWVudCdzIGFuaW1hdGlvblxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm4gdm9pZFxuICpcbiAqIEBzZWUgaHR0cHM6Ly93d3cuaGFycnl0aGVvLmNvbS9ibG9nLzIwMjEvMDIvcmVzdGFydC1hLWNzcy1hbmltYXRpb24td2l0aC1qYXZhc2NyaXB0LyNyZXN0YXJ0aW5nLWEtY3NzLWFuaW1hdGlvblxuICovXG5jb25zdCByZWZsb3cgPSBlbGVtZW50ID0+IHtcbiAgZWxlbWVudC5vZmZzZXRIZWlnaHQ7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG59O1xuY29uc3QgZ2V0alF1ZXJ5ID0gKCkgPT4ge1xuICBpZiAod2luZG93LmpRdWVyeSAmJiAhZG9jdW1lbnQuYm9keS5oYXNBdHRyaWJ1dGUoJ2RhdGEtYnMtbm8tanF1ZXJ5JykpIHtcbiAgICByZXR1cm4gd2luZG93LmpRdWVyeTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5jb25zdCBET01Db250ZW50TG9hZGVkQ2FsbGJhY2tzID0gW107XG5jb25zdCBvbkRPTUNvbnRlbnRMb2FkZWQgPSBjYWxsYmFjayA9PiB7XG4gIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHtcbiAgICAvLyBhZGQgbGlzdGVuZXIgb24gdGhlIGZpcnN0IGNhbGwgd2hlbiB0aGUgZG9jdW1lbnQgaXMgaW4gbG9hZGluZyBzdGF0ZVxuICAgIGlmICghRE9NQ29udGVudExvYWRlZENhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgRE9NQ29udGVudExvYWRlZENhbGxiYWNrcykge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBET01Db250ZW50TG9hZGVkQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICB9IGVsc2Uge1xuICAgIGNhbGxiYWNrKCk7XG4gIH1cbn07XG5jb25zdCBpc1JUTCA9ICgpID0+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kaXIgPT09ICdydGwnO1xuY29uc3QgZGVmaW5lSlF1ZXJ5UGx1Z2luID0gcGx1Z2luID0+IHtcbiAgb25ET01Db250ZW50TG9hZGVkKCgpID0+IHtcbiAgICBjb25zdCAkID0gZ2V0alF1ZXJ5KCk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCQpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBwbHVnaW4uTkFNRTtcbiAgICAgIGNvbnN0IEpRVUVSWV9OT19DT05GTElDVCA9ICQuZm5bbmFtZV07XG4gICAgICAkLmZuW25hbWVdID0gcGx1Z2luLmpRdWVyeUludGVyZmFjZTtcbiAgICAgICQuZm5bbmFtZV0uQ29uc3RydWN0b3IgPSBwbHVnaW47XG4gICAgICAkLmZuW25hbWVdLm5vQ29uZmxpY3QgPSAoKSA9PiB7XG4gICAgICAgICQuZm5bbmFtZV0gPSBKUVVFUllfTk9fQ09ORkxJQ1Q7XG4gICAgICAgIHJldHVybiBwbHVnaW4ualF1ZXJ5SW50ZXJmYWNlO1xuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufTtcbmNvbnN0IGV4ZWN1dGUgPSAocG9zc2libGVDYWxsYmFjaywgYXJncyA9IFtdLCBkZWZhdWx0VmFsdWUgPSBwb3NzaWJsZUNhbGxiYWNrKSA9PiB7XG4gIHJldHVybiB0eXBlb2YgcG9zc2libGVDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyA/IHBvc3NpYmxlQ2FsbGJhY2suY2FsbCguLi5hcmdzKSA6IGRlZmF1bHRWYWx1ZTtcbn07XG5jb25zdCBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uID0gKGNhbGxiYWNrLCB0cmFuc2l0aW9uRWxlbWVudCwgd2FpdEZvclRyYW5zaXRpb24gPSB0cnVlKSA9PiB7XG4gIGlmICghd2FpdEZvclRyYW5zaXRpb24pIHtcbiAgICBleGVjdXRlKGNhbGxiYWNrKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgZHVyYXRpb25QYWRkaW5nID0gNTtcbiAgY29uc3QgZW11bGF0ZWREdXJhdGlvbiA9IGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRyYW5zaXRpb25FbGVtZW50KSArIGR1cmF0aW9uUGFkZGluZztcbiAgbGV0IGNhbGxlZCA9IGZhbHNlO1xuICBjb25zdCBoYW5kbGVyID0gKHtcbiAgICB0YXJnZXRcbiAgfSkgPT4ge1xuICAgIGlmICh0YXJnZXQgIT09IHRyYW5zaXRpb25FbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNhbGxlZCA9IHRydWU7XG4gICAgdHJhbnNpdGlvbkVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihUUkFOU0lUSU9OX0VORCwgaGFuZGxlcik7XG4gICAgZXhlY3V0ZShjYWxsYmFjayk7XG4gIH07XG4gIHRyYW5zaXRpb25FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoVFJBTlNJVElPTl9FTkQsIGhhbmRsZXIpO1xuICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICBpZiAoIWNhbGxlZCkge1xuICAgICAgdHJpZ2dlclRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkVsZW1lbnQpO1xuICAgIH1cbiAgfSwgZW11bGF0ZWREdXJhdGlvbik7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgcHJldmlvdXMvbmV4dCBlbGVtZW50IG9mIGEgbGlzdC5cbiAqXG4gKiBAcGFyYW0ge2FycmF5fSBsaXN0ICAgIFRoZSBsaXN0IG9mIGVsZW1lbnRzXG4gKiBAcGFyYW0gYWN0aXZlRWxlbWVudCAgIFRoZSBhY3RpdmUgZWxlbWVudFxuICogQHBhcmFtIHNob3VsZEdldE5leHQgICBDaG9vc2UgdG8gZ2V0IG5leHQgb3IgcHJldmlvdXMgZWxlbWVudFxuICogQHBhcmFtIGlzQ3ljbGVBbGxvd2VkXG4gKiBAcmV0dXJuIHtFbGVtZW50fGVsZW19IFRoZSBwcm9wZXIgZWxlbWVudFxuICovXG5jb25zdCBnZXROZXh0QWN0aXZlRWxlbWVudCA9IChsaXN0LCBhY3RpdmVFbGVtZW50LCBzaG91bGRHZXROZXh0LCBpc0N5Y2xlQWxsb3dlZCkgPT4ge1xuICBjb25zdCBsaXN0TGVuZ3RoID0gbGlzdC5sZW5ndGg7XG4gIGxldCBpbmRleCA9IGxpc3QuaW5kZXhPZihhY3RpdmVFbGVtZW50KTtcblxuICAvLyBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbGlzdCByZXR1cm4gYW4gZWxlbWVudFxuICAvLyBkZXBlbmRpbmcgb24gdGhlIGRpcmVjdGlvbiBhbmQgaWYgY3ljbGUgaXMgYWxsb3dlZFxuICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuICFzaG91bGRHZXROZXh0ICYmIGlzQ3ljbGVBbGxvd2VkID8gbGlzdFtsaXN0TGVuZ3RoIC0gMV0gOiBsaXN0WzBdO1xuICB9XG4gIGluZGV4ICs9IHNob3VsZEdldE5leHQgPyAxIDogLTE7XG4gIGlmIChpc0N5Y2xlQWxsb3dlZCkge1xuICAgIGluZGV4ID0gKGluZGV4ICsgbGlzdExlbmd0aCkgJSBsaXN0TGVuZ3RoO1xuICB9XG4gIHJldHVybiBsaXN0W01hdGgubWF4KDAsIE1hdGgubWluKGluZGV4LCBsaXN0TGVuZ3RoIC0gMSkpXTtcbn07XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBkb20vZXZlbnQtaGFuZGxlci5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBuYW1lc3BhY2VSZWdleCA9IC9bXi5dKig/PVxcLi4qKVxcLnwuKi87XG5jb25zdCBzdHJpcE5hbWVSZWdleCA9IC9cXC4uKi87XG5jb25zdCBzdHJpcFVpZFJlZ2V4ID0gLzo6XFxkKyQvO1xuY29uc3QgZXZlbnRSZWdpc3RyeSA9IHt9OyAvLyBFdmVudHMgc3RvcmFnZVxubGV0IHVpZEV2ZW50ID0gMTtcbmNvbnN0IGN1c3RvbUV2ZW50cyA9IHtcbiAgbW91c2VlbnRlcjogJ21vdXNlb3ZlcicsXG4gIG1vdXNlbGVhdmU6ICdtb3VzZW91dCdcbn07XG5jb25zdCBuYXRpdmVFdmVudHMgPSBuZXcgU2V0KFsnY2xpY2snLCAnZGJsY2xpY2snLCAnbW91c2V1cCcsICdtb3VzZWRvd24nLCAnY29udGV4dG1lbnUnLCAnbW91c2V3aGVlbCcsICdET01Nb3VzZVNjcm9sbCcsICdtb3VzZW92ZXInLCAnbW91c2VvdXQnLCAnbW91c2Vtb3ZlJywgJ3NlbGVjdHN0YXJ0JywgJ3NlbGVjdGVuZCcsICdrZXlkb3duJywgJ2tleXByZXNzJywgJ2tleXVwJywgJ29yaWVudGF0aW9uY2hhbmdlJywgJ3RvdWNoc3RhcnQnLCAndG91Y2htb3ZlJywgJ3RvdWNoZW5kJywgJ3RvdWNoY2FuY2VsJywgJ3BvaW50ZXJkb3duJywgJ3BvaW50ZXJtb3ZlJywgJ3BvaW50ZXJ1cCcsICdwb2ludGVybGVhdmUnLCAncG9pbnRlcmNhbmNlbCcsICdnZXN0dXJlc3RhcnQnLCAnZ2VzdHVyZWNoYW5nZScsICdnZXN0dXJlZW5kJywgJ2ZvY3VzJywgJ2JsdXInLCAnY2hhbmdlJywgJ3Jlc2V0JywgJ3NlbGVjdCcsICdzdWJtaXQnLCAnZm9jdXNpbicsICdmb2N1c291dCcsICdsb2FkJywgJ3VubG9hZCcsICdiZWZvcmV1bmxvYWQnLCAncmVzaXplJywgJ21vdmUnLCAnRE9NQ29udGVudExvYWRlZCcsICdyZWFkeXN0YXRlY2hhbmdlJywgJ2Vycm9yJywgJ2Fib3J0JywgJ3Njcm9sbCddKTtcblxuLyoqXG4gKiBQcml2YXRlIG1ldGhvZHNcbiAqL1xuXG5mdW5jdGlvbiBtYWtlRXZlbnRVaWQoZWxlbWVudCwgdWlkKSB7XG4gIHJldHVybiB1aWQgJiYgYCR7dWlkfTo6JHt1aWRFdmVudCsrfWAgfHwgZWxlbWVudC51aWRFdmVudCB8fCB1aWRFdmVudCsrO1xufVxuZnVuY3Rpb24gZ2V0RWxlbWVudEV2ZW50cyhlbGVtZW50KSB7XG4gIGNvbnN0IHVpZCA9IG1ha2VFdmVudFVpZChlbGVtZW50KTtcbiAgZWxlbWVudC51aWRFdmVudCA9IHVpZDtcbiAgZXZlbnRSZWdpc3RyeVt1aWRdID0gZXZlbnRSZWdpc3RyeVt1aWRdIHx8IHt9O1xuICByZXR1cm4gZXZlbnRSZWdpc3RyeVt1aWRdO1xufVxuZnVuY3Rpb24gYm9vdHN0cmFwSGFuZGxlcihlbGVtZW50LCBmbikge1xuICByZXR1cm4gZnVuY3Rpb24gaGFuZGxlcihldmVudCkge1xuICAgIGh5ZHJhdGVPYmooZXZlbnQsIHtcbiAgICAgIGRlbGVnYXRlVGFyZ2V0OiBlbGVtZW50XG4gICAgfSk7XG4gICAgaWYgKGhhbmRsZXIub25lT2ZmKSB7XG4gICAgICBFdmVudEhhbmRsZXIub2ZmKGVsZW1lbnQsIGV2ZW50LnR5cGUsIGZuKTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KGVsZW1lbnQsIFtldmVudF0pO1xuICB9O1xufVxuZnVuY3Rpb24gYm9vdHN0cmFwRGVsZWdhdGlvbkhhbmRsZXIoZWxlbWVudCwgc2VsZWN0b3IsIGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBoYW5kbGVyKGV2ZW50KSB7XG4gICAgY29uc3QgZG9tRWxlbWVudHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgIGZvciAobGV0IHtcbiAgICAgIHRhcmdldFxuICAgIH0gPSBldmVudDsgdGFyZ2V0ICYmIHRhcmdldCAhPT0gdGhpczsgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGUpIHtcbiAgICAgIGZvciAoY29uc3QgZG9tRWxlbWVudCBvZiBkb21FbGVtZW50cykge1xuICAgICAgICBpZiAoZG9tRWxlbWVudCAhPT0gdGFyZ2V0KSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaHlkcmF0ZU9iaihldmVudCwge1xuICAgICAgICAgIGRlbGVnYXRlVGFyZ2V0OiB0YXJnZXRcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChoYW5kbGVyLm9uZU9mZikge1xuICAgICAgICAgIEV2ZW50SGFuZGxlci5vZmYoZWxlbWVudCwgZXZlbnQudHlwZSwgc2VsZWN0b3IsIGZuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGFyZ2V0LCBbZXZlbnRdKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBmaW5kSGFuZGxlcihldmVudHMsIGNhbGxhYmxlLCBkZWxlZ2F0aW9uU2VsZWN0b3IgPSBudWxsKSB7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKGV2ZW50cykuZmluZChldmVudCA9PiBldmVudC5jYWxsYWJsZSA9PT0gY2FsbGFibGUgJiYgZXZlbnQuZGVsZWdhdGlvblNlbGVjdG9yID09PSBkZWxlZ2F0aW9uU2VsZWN0b3IpO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplUGFyYW1ldGVycyhvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XG4gIGNvbnN0IGlzRGVsZWdhdGVkID0gdHlwZW9mIGhhbmRsZXIgPT09ICdzdHJpbmcnO1xuICAvLyBUT0RPOiB0b29sdGlwIHBhc3NlcyBgZmFsc2VgIGluc3RlYWQgb2Ygc2VsZWN0b3IsIHNvIHdlIG5lZWQgdG8gY2hlY2tcbiAgY29uc3QgY2FsbGFibGUgPSBpc0RlbGVnYXRlZCA/IGRlbGVnYXRpb25GdW5jdGlvbiA6IGhhbmRsZXIgfHwgZGVsZWdhdGlvbkZ1bmN0aW9uO1xuICBsZXQgdHlwZUV2ZW50ID0gZ2V0VHlwZUV2ZW50KG9yaWdpbmFsVHlwZUV2ZW50KTtcbiAgaWYgKCFuYXRpdmVFdmVudHMuaGFzKHR5cGVFdmVudCkpIHtcbiAgICB0eXBlRXZlbnQgPSBvcmlnaW5hbFR5cGVFdmVudDtcbiAgfVxuICByZXR1cm4gW2lzRGVsZWdhdGVkLCBjYWxsYWJsZSwgdHlwZUV2ZW50XTtcbn1cbmZ1bmN0aW9uIGFkZEhhbmRsZXIoZWxlbWVudCwgb3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbiwgb25lT2ZmKSB7XG4gIGlmICh0eXBlb2Ygb3JpZ2luYWxUeXBlRXZlbnQgIT09ICdzdHJpbmcnIHx8ICFlbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBbaXNEZWxlZ2F0ZWQsIGNhbGxhYmxlLCB0eXBlRXZlbnRdID0gbm9ybWFsaXplUGFyYW1ldGVycyhvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKTtcblxuICAvLyBpbiBjYXNlIG9mIG1vdXNlZW50ZXIgb3IgbW91c2VsZWF2ZSB3cmFwIHRoZSBoYW5kbGVyIHdpdGhpbiBhIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGZvciBpdHMgRE9NIHBvc2l0aW9uXG4gIC8vIHRoaXMgcHJldmVudHMgdGhlIGhhbmRsZXIgZnJvbSBiZWluZyBkaXNwYXRjaGVkIHRoZSBzYW1lIHdheSBhcyBtb3VzZW92ZXIgb3IgbW91c2VvdXQgZG9lc1xuICBpZiAob3JpZ2luYWxUeXBlRXZlbnQgaW4gY3VzdG9tRXZlbnRzKSB7XG4gICAgY29uc3Qgd3JhcEZ1bmN0aW9uID0gZm4gPT4ge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBpZiAoIWV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgZXZlbnQucmVsYXRlZFRhcmdldCAhPT0gZXZlbnQuZGVsZWdhdGVUYXJnZXQgJiYgIWV2ZW50LmRlbGVnYXRlVGFyZ2V0LmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpKSB7XG4gICAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhpcywgZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG4gICAgY2FsbGFibGUgPSB3cmFwRnVuY3Rpb24oY2FsbGFibGUpO1xuICB9XG4gIGNvbnN0IGV2ZW50cyA9IGdldEVsZW1lbnRFdmVudHMoZWxlbWVudCk7XG4gIGNvbnN0IGhhbmRsZXJzID0gZXZlbnRzW3R5cGVFdmVudF0gfHwgKGV2ZW50c1t0eXBlRXZlbnRdID0ge30pO1xuICBjb25zdCBwcmV2aW91c0Z1bmN0aW9uID0gZmluZEhhbmRsZXIoaGFuZGxlcnMsIGNhbGxhYmxlLCBpc0RlbGVnYXRlZCA/IGhhbmRsZXIgOiBudWxsKTtcbiAgaWYgKHByZXZpb3VzRnVuY3Rpb24pIHtcbiAgICBwcmV2aW91c0Z1bmN0aW9uLm9uZU9mZiA9IHByZXZpb3VzRnVuY3Rpb24ub25lT2ZmICYmIG9uZU9mZjtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgdWlkID0gbWFrZUV2ZW50VWlkKGNhbGxhYmxlLCBvcmlnaW5hbFR5cGVFdmVudC5yZXBsYWNlKG5hbWVzcGFjZVJlZ2V4LCAnJykpO1xuICBjb25zdCBmbiA9IGlzRGVsZWdhdGVkID8gYm9vdHN0cmFwRGVsZWdhdGlvbkhhbmRsZXIoZWxlbWVudCwgaGFuZGxlciwgY2FsbGFibGUpIDogYm9vdHN0cmFwSGFuZGxlcihlbGVtZW50LCBjYWxsYWJsZSk7XG4gIGZuLmRlbGVnYXRpb25TZWxlY3RvciA9IGlzRGVsZWdhdGVkID8gaGFuZGxlciA6IG51bGw7XG4gIGZuLmNhbGxhYmxlID0gY2FsbGFibGU7XG4gIGZuLm9uZU9mZiA9IG9uZU9mZjtcbiAgZm4udWlkRXZlbnQgPSB1aWQ7XG4gIGhhbmRsZXJzW3VpZF0gPSBmbjtcbiAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGVFdmVudCwgZm4sIGlzRGVsZWdhdGVkKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZUhhbmRsZXIoZWxlbWVudCwgZXZlbnRzLCB0eXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25TZWxlY3Rvcikge1xuICBjb25zdCBmbiA9IGZpbmRIYW5kbGVyKGV2ZW50c1t0eXBlRXZlbnRdLCBoYW5kbGVyLCBkZWxlZ2F0aW9uU2VsZWN0b3IpO1xuICBpZiAoIWZuKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlRXZlbnQsIGZuLCBCb29sZWFuKGRlbGVnYXRpb25TZWxlY3RvcikpO1xuICBkZWxldGUgZXZlbnRzW3R5cGVFdmVudF1bZm4udWlkRXZlbnRdO1xufVxuZnVuY3Rpb24gcmVtb3ZlTmFtZXNwYWNlZEhhbmRsZXJzKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBuYW1lc3BhY2UpIHtcbiAgY29uc3Qgc3RvcmVFbGVtZW50RXZlbnQgPSBldmVudHNbdHlwZUV2ZW50XSB8fCB7fTtcbiAgZm9yIChjb25zdCBbaGFuZGxlcktleSwgZXZlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHN0b3JlRWxlbWVudEV2ZW50KSkge1xuICAgIGlmIChoYW5kbGVyS2V5LmluY2x1ZGVzKG5hbWVzcGFjZSkpIHtcbiAgICAgIHJlbW92ZUhhbmRsZXIoZWxlbWVudCwgZXZlbnRzLCB0eXBlRXZlbnQsIGV2ZW50LmNhbGxhYmxlLCBldmVudC5kZWxlZ2F0aW9uU2VsZWN0b3IpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZ2V0VHlwZUV2ZW50KGV2ZW50KSB7XG4gIC8vIGFsbG93IHRvIGdldCB0aGUgbmF0aXZlIGV2ZW50cyBmcm9tIG5hbWVzcGFjZWQgZXZlbnRzICgnY2xpY2suYnMuYnV0dG9uJyAtLT4gJ2NsaWNrJylcbiAgZXZlbnQgPSBldmVudC5yZXBsYWNlKHN0cmlwTmFtZVJlZ2V4LCAnJyk7XG4gIHJldHVybiBjdXN0b21FdmVudHNbZXZlbnRdIHx8IGV2ZW50O1xufVxuY29uc3QgRXZlbnRIYW5kbGVyID0ge1xuICBvbihlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XG4gICAgYWRkSGFuZGxlcihlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uLCBmYWxzZSk7XG4gIH0sXG4gIG9uZShlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XG4gICAgYWRkSGFuZGxlcihlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uLCB0cnVlKTtcbiAgfSxcbiAgb2ZmKGVsZW1lbnQsIG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pIHtcbiAgICBpZiAodHlwZW9mIG9yaWdpbmFsVHlwZUV2ZW50ICE9PSAnc3RyaW5nJyB8fCAhZWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBbaXNEZWxlZ2F0ZWQsIGNhbGxhYmxlLCB0eXBlRXZlbnRdID0gbm9ybWFsaXplUGFyYW1ldGVycyhvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKTtcbiAgICBjb25zdCBpbk5hbWVzcGFjZSA9IHR5cGVFdmVudCAhPT0gb3JpZ2luYWxUeXBlRXZlbnQ7XG4gICAgY29uc3QgZXZlbnRzID0gZ2V0RWxlbWVudEV2ZW50cyhlbGVtZW50KTtcbiAgICBjb25zdCBzdG9yZUVsZW1lbnRFdmVudCA9IGV2ZW50c1t0eXBlRXZlbnRdIHx8IHt9O1xuICAgIGNvbnN0IGlzTmFtZXNwYWNlID0gb3JpZ2luYWxUeXBlRXZlbnQuc3RhcnRzV2l0aCgnLicpO1xuICAgIGlmICh0eXBlb2YgY2FsbGFibGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBTaW1wbGVzdCBjYXNlOiBoYW5kbGVyIGlzIHBhc3NlZCwgcmVtb3ZlIHRoYXQgbGlzdGVuZXIgT05MWS5cbiAgICAgIGlmICghT2JqZWN0LmtleXMoc3RvcmVFbGVtZW50RXZlbnQpLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBjYWxsYWJsZSwgaXNEZWxlZ2F0ZWQgPyBoYW5kbGVyIDogbnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc05hbWVzcGFjZSkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50RXZlbnQgb2YgT2JqZWN0LmtleXMoZXZlbnRzKSkge1xuICAgICAgICByZW1vdmVOYW1lc3BhY2VkSGFuZGxlcnMoZWxlbWVudCwgZXZlbnRzLCBlbGVtZW50RXZlbnQsIG9yaWdpbmFsVHlwZUV2ZW50LnNsaWNlKDEpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBba2V5SGFuZGxlcnMsIGV2ZW50XSBvZiBPYmplY3QuZW50cmllcyhzdG9yZUVsZW1lbnRFdmVudCkpIHtcbiAgICAgIGNvbnN0IGhhbmRsZXJLZXkgPSBrZXlIYW5kbGVycy5yZXBsYWNlKHN0cmlwVWlkUmVnZXgsICcnKTtcbiAgICAgIGlmICghaW5OYW1lc3BhY2UgfHwgb3JpZ2luYWxUeXBlRXZlbnQuaW5jbHVkZXMoaGFuZGxlcktleSkpIHtcbiAgICAgICAgcmVtb3ZlSGFuZGxlcihlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgZXZlbnQuY2FsbGFibGUsIGV2ZW50LmRlbGVnYXRpb25TZWxlY3Rvcik7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICB0cmlnZ2VyKGVsZW1lbnQsIGV2ZW50LCBhcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBldmVudCAhPT0gJ3N0cmluZycgfHwgIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCAkID0gZ2V0alF1ZXJ5KCk7XG4gICAgY29uc3QgdHlwZUV2ZW50ID0gZ2V0VHlwZUV2ZW50KGV2ZW50KTtcbiAgICBjb25zdCBpbk5hbWVzcGFjZSA9IGV2ZW50ICE9PSB0eXBlRXZlbnQ7XG4gICAgbGV0IGpRdWVyeUV2ZW50ID0gbnVsbDtcbiAgICBsZXQgYnViYmxlcyA9IHRydWU7XG4gICAgbGV0IG5hdGl2ZURpc3BhdGNoID0gdHJ1ZTtcbiAgICBsZXQgZGVmYXVsdFByZXZlbnRlZCA9IGZhbHNlO1xuICAgIGlmIChpbk5hbWVzcGFjZSAmJiAkKSB7XG4gICAgICBqUXVlcnlFdmVudCA9ICQuRXZlbnQoZXZlbnQsIGFyZ3MpO1xuICAgICAgJChlbGVtZW50KS50cmlnZ2VyKGpRdWVyeUV2ZW50KTtcbiAgICAgIGJ1YmJsZXMgPSAhalF1ZXJ5RXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTtcbiAgICAgIG5hdGl2ZURpc3BhdGNoID0gIWpRdWVyeUV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCk7XG4gICAgICBkZWZhdWx0UHJldmVudGVkID0galF1ZXJ5RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCk7XG4gICAgfVxuICAgIGNvbnN0IGV2dCA9IGh5ZHJhdGVPYmoobmV3IEV2ZW50KGV2ZW50LCB7XG4gICAgICBidWJibGVzLFxuICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgIH0pLCBhcmdzKTtcbiAgICBpZiAoZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGlmIChuYXRpdmVEaXNwYXRjaCkge1xuICAgICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7XG4gICAgfVxuICAgIGlmIChldnQuZGVmYXVsdFByZXZlbnRlZCAmJiBqUXVlcnlFdmVudCkge1xuICAgICAgalF1ZXJ5RXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGV2dDtcbiAgfVxufTtcbmZ1bmN0aW9uIGh5ZHJhdGVPYmoob2JqLCBtZXRhID0ge30pIHtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobWV0YSkpIHtcbiAgICB0cnkge1xuICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgICB9IGNhdGNoIChfdW51c2VkKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGRvbS9tYW5pcHVsYXRvci5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZURhdGEodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSAndHJ1ZScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodmFsdWUgPT09ICdmYWxzZScpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHZhbHVlID09PSBOdW1iZXIodmFsdWUpLnRvU3RyaW5nKCkpIHtcbiAgICByZXR1cm4gTnVtYmVyKHZhbHVlKTtcbiAgfVxuICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSAnbnVsbCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkpO1xuICB9IGNhdGNoIChfdW51c2VkKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5mdW5jdGlvbiBub3JtYWxpemVEYXRhS2V5KGtleSkge1xuICByZXR1cm4ga2V5LnJlcGxhY2UoL1tBLVpdL2csIGNociA9PiBgLSR7Y2hyLnRvTG93ZXJDYXNlKCl9YCk7XG59XG5jb25zdCBNYW5pcHVsYXRvciA9IHtcbiAgc2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCBrZXksIHZhbHVlKSB7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYGRhdGEtYnMtJHtub3JtYWxpemVEYXRhS2V5KGtleSl9YCwgdmFsdWUpO1xuICB9LFxuICByZW1vdmVEYXRhQXR0cmlidXRlKGVsZW1lbnQsIGtleSkge1xuICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGBkYXRhLWJzLSR7bm9ybWFsaXplRGF0YUtleShrZXkpfWApO1xuICB9LFxuICBnZXREYXRhQXR0cmlidXRlcyhlbGVtZW50KSB7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB7fTtcbiAgICBjb25zdCBic0tleXMgPSBPYmplY3Qua2V5cyhlbGVtZW50LmRhdGFzZXQpLmZpbHRlcihrZXkgPT4ga2V5LnN0YXJ0c1dpdGgoJ2JzJykgJiYgIWtleS5zdGFydHNXaXRoKCdic0NvbmZpZycpKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBic0tleXMpIHtcbiAgICAgIGxldCBwdXJlS2V5ID0ga2V5LnJlcGxhY2UoL15icy8sICcnKTtcbiAgICAgIHB1cmVLZXkgPSBwdXJlS2V5LmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgcHVyZUtleS5zbGljZSgxKTtcbiAgICAgIGF0dHJpYnV0ZXNbcHVyZUtleV0gPSBub3JtYWxpemVEYXRhKGVsZW1lbnQuZGF0YXNldFtrZXldKTtcbiAgICB9XG4gICAgcmV0dXJuIGF0dHJpYnV0ZXM7XG4gIH0sXG4gIGdldERhdGFBdHRyaWJ1dGUoZWxlbWVudCwga2V5KSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZURhdGEoZWxlbWVudC5nZXRBdHRyaWJ1dGUoYGRhdGEtYnMtJHtub3JtYWxpemVEYXRhS2V5KGtleSl9YCkpO1xuICB9XG59O1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9jb25maWcuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIENvbmZpZyB7XG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgaGF2ZSB0byBpbXBsZW1lbnQgdGhlIHN0YXRpYyBtZXRob2QgXCJOQU1FXCIsIGZvciBlYWNoIGNvbXBvbmVudCEnKTtcbiAgfVxuICBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgIGNvbmZpZyA9IHRoaXMuX21lcmdlQ29uZmlnT2JqKGNvbmZpZyk7XG4gICAgY29uZmlnID0gdGhpcy5fY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpO1xuICAgIHRoaXMuX3R5cGVDaGVja0NvbmZpZyhjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbiAgX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBfbWVyZ2VDb25maWdPYmooY29uZmlnLCBlbGVtZW50KSB7XG4gICAgY29uc3QganNvbkNvbmZpZyA9IGlzRWxlbWVudChlbGVtZW50KSA/IE1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGUoZWxlbWVudCwgJ2NvbmZpZycpIDoge307IC8vIHRyeSB0byBwYXJzZVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuY29uc3RydWN0b3IuRGVmYXVsdCxcbiAgICAgIC4uLih0eXBlb2YganNvbkNvbmZpZyA9PT0gJ29iamVjdCcgPyBqc29uQ29uZmlnIDoge30pLFxuICAgICAgLi4uKGlzRWxlbWVudChlbGVtZW50KSA/IE1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGVzKGVsZW1lbnQpIDoge30pLFxuICAgICAgLi4uKHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnID8gY29uZmlnIDoge30pXG4gICAgfTtcbiAgfVxuICBfdHlwZUNoZWNrQ29uZmlnKGNvbmZpZywgY29uZmlnVHlwZXMgPSB0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRUeXBlKSB7XG4gICAgZm9yIChjb25zdCBbcHJvcGVydHksIGV4cGVjdGVkVHlwZXNdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ1R5cGVzKSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBjb25maWdbcHJvcGVydHldO1xuICAgICAgY29uc3QgdmFsdWVUeXBlID0gaXNFbGVtZW50KHZhbHVlKSA/ICdlbGVtZW50JyA6IHRvVHlwZSh2YWx1ZSk7XG4gICAgICBpZiAoIW5ldyBSZWdFeHAoZXhwZWN0ZWRUeXBlcykudGVzdCh2YWx1ZVR5cGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7dGhpcy5jb25zdHJ1Y3Rvci5OQU1FLnRvVXBwZXJDYXNlKCl9OiBPcHRpb24gXCIke3Byb3BlcnR5fVwiIHByb3ZpZGVkIHR5cGUgXCIke3ZhbHVlVHlwZX1cIiBidXQgZXhwZWN0ZWQgdHlwZSBcIiR7ZXhwZWN0ZWRUeXBlc31cIi5gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGJhc2UtY29tcG9uZW50LmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IFZFUlNJT04gPSAnNS4zLjgnO1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBCYXNlQ29tcG9uZW50IGV4dGVuZHMgQ29uZmlnIHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoKTtcbiAgICBlbGVtZW50ID0gZ2V0RWxlbWVudChlbGVtZW50KTtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgRGF0YS5zZXQodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWSwgdGhpcyk7XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgZGlzcG9zZSgpIHtcbiAgICBEYXRhLnJlbW92ZSh0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZKTtcbiAgICBFdmVudEhhbmRsZXIub2ZmKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuRVZFTlRfS0VZKTtcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkge1xuICAgICAgdGhpc1twcm9wZXJ0eU5hbWVdID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9xdWV1ZUNhbGxiYWNrKGNhbGxiYWNrLCBlbGVtZW50LCBpc0FuaW1hdGVkID0gdHJ1ZSkge1xuICAgIGV4ZWN1dGVBZnRlclRyYW5zaXRpb24oY2FsbGJhY2ssIGVsZW1lbnQsIGlzQW5pbWF0ZWQpO1xuICB9XG4gIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgY29uZmlnID0gdGhpcy5fbWVyZ2VDb25maWdPYmooY29uZmlnLCB0aGlzLl9lbGVtZW50KTtcbiAgICBjb25maWcgPSB0aGlzLl9jb25maWdBZnRlck1lcmdlKGNvbmZpZyk7XG4gICAgdGhpcy5fdHlwZUNoZWNrQ29uZmlnKGNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgZ2V0SW5zdGFuY2UoZWxlbWVudCkge1xuICAgIHJldHVybiBEYXRhLmdldChnZXRFbGVtZW50KGVsZW1lbnQpLCB0aGlzLkRBVEFfS0VZKTtcbiAgfVxuICBzdGF0aWMgZ2V0T3JDcmVhdGVJbnN0YW5jZShlbGVtZW50LCBjb25maWcgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmdldEluc3RhbmNlKGVsZW1lbnQpIHx8IG5ldyB0aGlzKGVsZW1lbnQsIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnID8gY29uZmlnIDogbnVsbCk7XG4gIH1cbiAgc3RhdGljIGdldCBWRVJTSU9OKCkge1xuICAgIHJldHVybiBWRVJTSU9OO1xuICB9XG4gIHN0YXRpYyBnZXQgREFUQV9LRVkoKSB7XG4gICAgcmV0dXJuIGBicy4ke3RoaXMuTkFNRX1gO1xuICB9XG4gIHN0YXRpYyBnZXQgRVZFTlRfS0VZKCkge1xuICAgIHJldHVybiBgLiR7dGhpcy5EQVRBX0tFWX1gO1xuICB9XG4gIHN0YXRpYyBldmVudE5hbWUobmFtZSkge1xuICAgIHJldHVybiBgJHtuYW1lfSR7dGhpcy5FVkVOVF9LRVl9YDtcbiAgfVxufVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgZG9tL3NlbGVjdG9yLWVuZ2luZS5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmNvbnN0IGdldFNlbGVjdG9yID0gZWxlbWVudCA9PiB7XG4gIGxldCBzZWxlY3RvciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLXRhcmdldCcpO1xuICBpZiAoIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSAnIycpIHtcbiAgICBsZXQgaHJlZkF0dHJpYnV0ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdocmVmJyk7XG5cbiAgICAvLyBUaGUgb25seSB2YWxpZCBjb250ZW50IHRoYXQgY291bGQgZG91YmxlIGFzIGEgc2VsZWN0b3IgYXJlIElEcyBvciBjbGFzc2VzLFxuICAgIC8vIHNvIGV2ZXJ5dGhpbmcgc3RhcnRpbmcgd2l0aCBgI2Agb3IgYC5gLiBJZiBhIFwicmVhbFwiIFVSTCBpcyB1c2VkIGFzIHRoZSBzZWxlY3RvcixcbiAgICAvLyBgZG9jdW1lbnQucXVlcnlTZWxlY3RvcmAgd2lsbCByaWdodGZ1bGx5IGNvbXBsYWluIGl0IGlzIGludmFsaWQuXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMzIyNzNcbiAgICBpZiAoIWhyZWZBdHRyaWJ1dGUgfHwgIWhyZWZBdHRyaWJ1dGUuaW5jbHVkZXMoJyMnKSAmJiAhaHJlZkF0dHJpYnV0ZS5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIEp1c3QgaW4gY2FzZSBzb21lIENNUyBwdXRzIG91dCBhIGZ1bGwgVVJMIHdpdGggdGhlIGFuY2hvciBhcHBlbmRlZFxuICAgIGlmIChocmVmQXR0cmlidXRlLmluY2x1ZGVzKCcjJykgJiYgIWhyZWZBdHRyaWJ1dGUuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICBocmVmQXR0cmlidXRlID0gYCMke2hyZWZBdHRyaWJ1dGUuc3BsaXQoJyMnKVsxXX1gO1xuICAgIH1cbiAgICBzZWxlY3RvciA9IGhyZWZBdHRyaWJ1dGUgJiYgaHJlZkF0dHJpYnV0ZSAhPT0gJyMnID8gaHJlZkF0dHJpYnV0ZS50cmltKCkgOiBudWxsO1xuICB9XG4gIHJldHVybiBzZWxlY3RvciA/IHNlbGVjdG9yLnNwbGl0KCcsJykubWFwKHNlbCA9PiBwYXJzZVNlbGVjdG9yKHNlbCkpLmpvaW4oJywnKSA6IG51bGw7XG59O1xuY29uc3QgU2VsZWN0b3JFbmdpbmUgPSB7XG4gIGZpbmQoc2VsZWN0b3IsIGVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICByZXR1cm4gW10uY29uY2F0KC4uLkVsZW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwuY2FsbChlbGVtZW50LCBzZWxlY3RvcikpO1xuICB9LFxuICBmaW5kT25lKHNlbGVjdG9yLCBlbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgcmV0dXJuIEVsZW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3IuY2FsbChlbGVtZW50LCBzZWxlY3Rvcik7XG4gIH0sXG4gIGNoaWxkcmVuKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdCguLi5lbGVtZW50LmNoaWxkcmVuKS5maWx0ZXIoY2hpbGQgPT4gY2hpbGQubWF0Y2hlcyhzZWxlY3RvcikpO1xuICB9LFxuICBwYXJlbnRzKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgY29uc3QgcGFyZW50cyA9IFtdO1xuICAgIGxldCBhbmNlc3RvciA9IGVsZW1lbnQucGFyZW50Tm9kZS5jbG9zZXN0KHNlbGVjdG9yKTtcbiAgICB3aGlsZSAoYW5jZXN0b3IpIHtcbiAgICAgIHBhcmVudHMucHVzaChhbmNlc3Rvcik7XG4gICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudE5vZGUuY2xvc2VzdChzZWxlY3Rvcik7XG4gICAgfVxuICAgIHJldHVybiBwYXJlbnRzO1xuICB9LFxuICBwcmV2KGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgbGV0IHByZXZpb3VzID0gZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgIHdoaWxlIChwcmV2aW91cykge1xuICAgICAgaWYgKHByZXZpb3VzLm1hdGNoZXMoc2VsZWN0b3IpKSB7XG4gICAgICAgIHJldHVybiBbcHJldmlvdXNdO1xuICAgICAgfVxuICAgICAgcHJldmlvdXMgPSBwcmV2aW91cy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH0sXG4gIC8vIFRPRE86IHRoaXMgaXMgbm93IHVudXNlZDsgcmVtb3ZlIGxhdGVyIGFsb25nIHdpdGggcHJldigpXG4gIG5leHQoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICBsZXQgbmV4dCA9IGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgIHdoaWxlIChuZXh0KSB7XG4gICAgICBpZiAobmV4dC5tYXRjaGVzKHNlbGVjdG9yKSkge1xuICAgICAgICByZXR1cm4gW25leHRdO1xuICAgICAgfVxuICAgICAgbmV4dCA9IG5leHQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH0sXG4gIGZvY3VzYWJsZUNoaWxkcmVuKGVsZW1lbnQpIHtcbiAgICBjb25zdCBmb2N1c2FibGVzID0gWydhJywgJ2J1dHRvbicsICdpbnB1dCcsICd0ZXh0YXJlYScsICdzZWxlY3QnLCAnZGV0YWlscycsICdbdGFiaW5kZXhdJywgJ1tjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdJ10ubWFwKHNlbGVjdG9yID0+IGAke3NlbGVjdG9yfTpub3QoW3RhYmluZGV4Xj1cIi1cIl0pYCkuam9pbignLCcpO1xuICAgIHJldHVybiB0aGlzLmZpbmQoZm9jdXNhYmxlcywgZWxlbWVudCkuZmlsdGVyKGVsID0+ICFpc0Rpc2FibGVkKGVsKSAmJiBpc1Zpc2libGUoZWwpKTtcbiAgfSxcbiAgZ2V0U2VsZWN0b3JGcm9tRWxlbWVudChlbGVtZW50KSB7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihlbGVtZW50KTtcbiAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiBTZWxlY3RvckVuZ2luZS5maW5kT25lKHNlbGVjdG9yKSA/IHNlbGVjdG9yIDogbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG4gIGdldEVsZW1lbnRGcm9tU2VsZWN0b3IoZWxlbWVudCkge1xuICAgIGNvbnN0IHNlbGVjdG9yID0gZ2V0U2VsZWN0b3IoZWxlbWVudCk7XG4gICAgcmV0dXJuIHNlbGVjdG9yID8gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShzZWxlY3RvcikgOiBudWxsO1xuICB9LFxuICBnZXRNdWx0aXBsZUVsZW1lbnRzRnJvbVNlbGVjdG9yKGVsZW1lbnQpIHtcbiAgICBjb25zdCBzZWxlY3RvciA9IGdldFNlbGVjdG9yKGVsZW1lbnQpO1xuICAgIHJldHVybiBzZWxlY3RvciA/IFNlbGVjdG9yRW5naW5lLmZpbmQoc2VsZWN0b3IpIDogW107XG4gIH1cbn07XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL2NvbXBvbmVudC1mdW5jdGlvbnMuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5jb25zdCBlbmFibGVEaXNtaXNzVHJpZ2dlciA9IChjb21wb25lbnQsIG1ldGhvZCA9ICdoaWRlJykgPT4ge1xuICBjb25zdCBjbGlja0V2ZW50ID0gYGNsaWNrLmRpc21pc3Mke2NvbXBvbmVudC5FVkVOVF9LRVl9YDtcbiAgY29uc3QgbmFtZSA9IGNvbXBvbmVudC5OQU1FO1xuICBFdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIGNsaWNrRXZlbnQsIGBbZGF0YS1icy1kaXNtaXNzPVwiJHtuYW1lfVwiXWAsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChbJ0EnLCAnQVJFQSddLmluY2x1ZGVzKHRoaXMudGFnTmFtZSkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGlmIChpc0Rpc2FibGVkKHRoaXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IFNlbGVjdG9yRW5naW5lLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IodGhpcykgfHwgdGhpcy5jbG9zZXN0KGAuJHtuYW1lfWApO1xuICAgIGNvbnN0IGluc3RhbmNlID0gY29tcG9uZW50LmdldE9yQ3JlYXRlSW5zdGFuY2UodGFyZ2V0KTtcblxuICAgIC8vIE1ldGhvZCBhcmd1bWVudCBpcyBsZWZ0LCBmb3IgQWxlcnQgYW5kIG9ubHksIGFzIGl0IGRvZXNuJ3QgaW1wbGVtZW50IHRoZSAnaGlkZScgbWV0aG9kXG4gICAgaW5zdGFuY2VbbWV0aG9kXSgpO1xuICB9KTtcbn07XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBhbGVydC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJGYgPSAnYWxlcnQnO1xuY29uc3QgREFUQV9LRVkkYSA9ICdicy5hbGVydCc7XG5jb25zdCBFVkVOVF9LRVkkYiA9IGAuJHtEQVRBX0tFWSRhfWA7XG5jb25zdCBFVkVOVF9DTE9TRSA9IGBjbG9zZSR7RVZFTlRfS0VZJGJ9YDtcbmNvbnN0IEVWRU5UX0NMT1NFRCA9IGBjbG9zZWQke0VWRU5UX0tFWSRifWA7XG5jb25zdCBDTEFTU19OQU1FX0ZBREUkNSA9ICdmYWRlJztcbmNvbnN0IENMQVNTX05BTUVfU0hPVyQ4ID0gJ3Nob3cnO1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBBbGVydCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRSRmO1xuICB9XG5cbiAgLy8gUHVibGljXG4gIGNsb3NlKCkge1xuICAgIGNvbnN0IGNsb3NlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9DTE9TRSk7XG4gICAgaWYgKGNsb3NlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XJDgpO1xuICAgIGNvbnN0IGlzQW5pbWF0ZWQgPSB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0ZBREUkNSk7XG4gICAgdGhpcy5fcXVldWVDYWxsYmFjaygoKSA9PiB0aGlzLl9kZXN0cm95RWxlbWVudCgpLCB0aGlzLl9lbGVtZW50LCBpc0FuaW1hdGVkKTtcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2Rlc3Ryb3lFbGVtZW50KCkge1xuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7XG4gICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfQ0xPU0VEKTtcbiAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IEFsZXJ0LmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcyk7XG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGFbY29uZmlnXSA9PT0gdW5kZWZpbmVkIHx8IGNvbmZpZy5zdGFydHNXaXRoKCdfJykgfHwgY29uZmlnID09PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYCk7XG4gICAgICB9XG4gICAgICBkYXRhW2NvbmZpZ10odGhpcyk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbmVuYWJsZURpc21pc3NUcmlnZ2VyKEFsZXJ0LCAnY2xvc2UnKTtcblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oQWxlcnQpO1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgYnV0dG9uLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUkZSA9ICdidXR0b24nO1xuY29uc3QgREFUQV9LRVkkOSA9ICdicy5idXR0b24nO1xuY29uc3QgRVZFTlRfS0VZJGEgPSBgLiR7REFUQV9LRVkkOX1gO1xuY29uc3QgREFUQV9BUElfS0VZJDYgPSAnLmRhdGEtYXBpJztcbmNvbnN0IENMQVNTX05BTUVfQUNUSVZFJDMgPSAnYWN0aXZlJztcbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFJDUgPSAnW2RhdGEtYnMtdG9nZ2xlPVwiYnV0dG9uXCJdJztcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJJDYgPSBgY2xpY2ske0VWRU5UX0tFWSRhfSR7REFUQV9BUElfS0VZJDZ9YDtcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgQnV0dG9uIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FJGU7XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgdG9nZ2xlKCkge1xuICAgIC8vIFRvZ2dsZSBjbGFzcyBhbmQgc3luYyB0aGUgYGFyaWEtcHJlc3NlZGAgYXR0cmlidXRlIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgYC50b2dnbGUoKWAgbWV0aG9kXG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShDTEFTU19OQU1FX0FDVElWRSQzKSk7XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBCdXR0b24uZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzKTtcbiAgICAgIGlmIChjb25maWcgPT09ICd0b2dnbGUnKSB7XG4gICAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJJDYsIFNFTEVDVE9SX0RBVEFfVE9HR0xFJDUsIGV2ZW50ID0+IHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgY29uc3QgYnV0dG9uID0gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoU0VMRUNUT1JfREFUQV9UT0dHTEUkNSk7XG4gIGNvbnN0IGRhdGEgPSBCdXR0b24uZ2V0T3JDcmVhdGVJbnN0YW5jZShidXR0b24pO1xuICBkYXRhLnRvZ2dsZSgpO1xufSk7XG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKEJ1dHRvbik7XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL3N3aXBlLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUkZCA9ICdzd2lwZSc7XG5jb25zdCBFVkVOVF9LRVkkOSA9ICcuYnMuc3dpcGUnO1xuY29uc3QgRVZFTlRfVE9VQ0hTVEFSVCA9IGB0b3VjaHN0YXJ0JHtFVkVOVF9LRVkkOX1gO1xuY29uc3QgRVZFTlRfVE9VQ0hNT1ZFID0gYHRvdWNobW92ZSR7RVZFTlRfS0VZJDl9YDtcbmNvbnN0IEVWRU5UX1RPVUNIRU5EID0gYHRvdWNoZW5kJHtFVkVOVF9LRVkkOX1gO1xuY29uc3QgRVZFTlRfUE9JTlRFUkRPV04gPSBgcG9pbnRlcmRvd24ke0VWRU5UX0tFWSQ5fWA7XG5jb25zdCBFVkVOVF9QT0lOVEVSVVAgPSBgcG9pbnRlcnVwJHtFVkVOVF9LRVkkOX1gO1xuY29uc3QgUE9JTlRFUl9UWVBFX1RPVUNIID0gJ3RvdWNoJztcbmNvbnN0IFBPSU5URVJfVFlQRV9QRU4gPSAncGVuJztcbmNvbnN0IENMQVNTX05BTUVfUE9JTlRFUl9FVkVOVCA9ICdwb2ludGVyLWV2ZW50JztcbmNvbnN0IFNXSVBFX1RIUkVTSE9MRCA9IDQwO1xuY29uc3QgRGVmYXVsdCRjID0ge1xuICBlbmRDYWxsYmFjazogbnVsbCxcbiAgbGVmdENhbGxiYWNrOiBudWxsLFxuICByaWdodENhbGxiYWNrOiBudWxsXG59O1xuY29uc3QgRGVmYXVsdFR5cGUkYyA9IHtcbiAgZW5kQ2FsbGJhY2s6ICcoZnVuY3Rpb258bnVsbCknLFxuICBsZWZ0Q2FsbGJhY2s6ICcoZnVuY3Rpb258bnVsbCknLFxuICByaWdodENhbGxiYWNrOiAnKGZ1bmN0aW9ufG51bGwpJ1xufTtcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgU3dpcGUgZXh0ZW5kcyBDb25maWcge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgIGlmICghZWxlbWVudCB8fCAhU3dpcGUuaXNTdXBwb3J0ZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKTtcbiAgICB0aGlzLl9kZWx0YVggPSAwO1xuICAgIHRoaXMuX3N1cHBvcnRQb2ludGVyRXZlbnRzID0gQm9vbGVhbih3aW5kb3cuUG9pbnRlckV2ZW50KTtcbiAgICB0aGlzLl9pbml0RXZlbnRzKCk7XG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdCRjO1xuICB9XG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlJGM7XG4gIH1cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FJGQ7XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgZGlzcG9zZSgpIHtcbiAgICBFdmVudEhhbmRsZXIub2ZmKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0tFWSQ5KTtcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX3N0YXJ0KGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLl9zdXBwb3J0UG9pbnRlckV2ZW50cykge1xuICAgICAgdGhpcy5fZGVsdGFYID0gZXZlbnQudG91Y2hlc1swXS5jbGllbnRYO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZXZlbnRJc1BvaW50ZXJQZW5Ub3VjaChldmVudCkpIHtcbiAgICAgIHRoaXMuX2RlbHRhWCA9IGV2ZW50LmNsaWVudFg7XG4gICAgfVxuICB9XG4gIF9lbmQoZXZlbnQpIHtcbiAgICBpZiAodGhpcy5fZXZlbnRJc1BvaW50ZXJQZW5Ub3VjaChldmVudCkpIHtcbiAgICAgIHRoaXMuX2RlbHRhWCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLl9kZWx0YVg7XG4gICAgfVxuICAgIHRoaXMuX2hhbmRsZVN3aXBlKCk7XG4gICAgZXhlY3V0ZSh0aGlzLl9jb25maWcuZW5kQ2FsbGJhY2spO1xuICB9XG4gIF9tb3ZlKGV2ZW50KSB7XG4gICAgdGhpcy5fZGVsdGFYID0gZXZlbnQudG91Y2hlcyAmJiBldmVudC50b3VjaGVzLmxlbmd0aCA+IDEgPyAwIDogZXZlbnQudG91Y2hlc1swXS5jbGllbnRYIC0gdGhpcy5fZGVsdGFYO1xuICB9XG4gIF9oYW5kbGVTd2lwZSgpIHtcbiAgICBjb25zdCBhYnNEZWx0YVggPSBNYXRoLmFicyh0aGlzLl9kZWx0YVgpO1xuICAgIGlmIChhYnNEZWx0YVggPD0gU1dJUEVfVEhSRVNIT0xEKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IGFic0RlbHRhWCAvIHRoaXMuX2RlbHRhWDtcbiAgICB0aGlzLl9kZWx0YVggPSAwO1xuICAgIGlmICghZGlyZWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV4ZWN1dGUoZGlyZWN0aW9uID4gMCA/IHRoaXMuX2NvbmZpZy5yaWdodENhbGxiYWNrIDogdGhpcy5fY29uZmlnLmxlZnRDYWxsYmFjayk7XG4gIH1cbiAgX2luaXRFdmVudHMoKSB7XG4gICAgaWYgKHRoaXMuX3N1cHBvcnRQb2ludGVyRXZlbnRzKSB7XG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfUE9JTlRFUkRPV04sIGV2ZW50ID0+IHRoaXMuX3N0YXJ0KGV2ZW50KSk7XG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfUE9JTlRFUlVQLCBldmVudCA9PiB0aGlzLl9lbmQoZXZlbnQpKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1BPSU5URVJfRVZFTlQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfVE9VQ0hTVEFSVCwgZXZlbnQgPT4gdGhpcy5fc3RhcnQoZXZlbnQpKTtcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9UT1VDSE1PVkUsIGV2ZW50ID0+IHRoaXMuX21vdmUoZXZlbnQpKTtcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9UT1VDSEVORCwgZXZlbnQgPT4gdGhpcy5fZW5kKGV2ZW50KSk7XG4gICAgfVxuICB9XG4gIF9ldmVudElzUG9pbnRlclBlblRvdWNoKGV2ZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuX3N1cHBvcnRQb2ludGVyRXZlbnRzICYmIChldmVudC5wb2ludGVyVHlwZSA9PT0gUE9JTlRFUl9UWVBFX1BFTiB8fCBldmVudC5wb2ludGVyVHlwZSA9PT0gUE9JTlRFUl9UWVBFX1RPVUNIKTtcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgaXNTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuICdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAwO1xuICB9XG59XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBjYXJvdXNlbC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJGMgPSAnY2Fyb3VzZWwnO1xuY29uc3QgREFUQV9LRVkkOCA9ICdicy5jYXJvdXNlbCc7XG5jb25zdCBFVkVOVF9LRVkkOCA9IGAuJHtEQVRBX0tFWSQ4fWA7XG5jb25zdCBEQVRBX0FQSV9LRVkkNSA9ICcuZGF0YS1hcGknO1xuY29uc3QgQVJST1dfTEVGVF9LRVkkMSA9ICdBcnJvd0xlZnQnO1xuY29uc3QgQVJST1dfUklHSFRfS0VZJDEgPSAnQXJyb3dSaWdodCc7XG5jb25zdCBUT1VDSEVWRU5UX0NPTVBBVF9XQUlUID0gNTAwOyAvLyBUaW1lIGZvciBtb3VzZSBjb21wYXQgZXZlbnRzIHRvIGZpcmUgYWZ0ZXIgdG91Y2hcblxuY29uc3QgT1JERVJfTkVYVCA9ICduZXh0JztcbmNvbnN0IE9SREVSX1BSRVYgPSAncHJldic7XG5jb25zdCBESVJFQ1RJT05fTEVGVCA9ICdsZWZ0JztcbmNvbnN0IERJUkVDVElPTl9SSUdIVCA9ICdyaWdodCc7XG5jb25zdCBFVkVOVF9TTElERSA9IGBzbGlkZSR7RVZFTlRfS0VZJDh9YDtcbmNvbnN0IEVWRU5UX1NMSUQgPSBgc2xpZCR7RVZFTlRfS0VZJDh9YDtcbmNvbnN0IEVWRU5UX0tFWURPV04kMSA9IGBrZXlkb3duJHtFVkVOVF9LRVkkOH1gO1xuY29uc3QgRVZFTlRfTU9VU0VFTlRFUiQxID0gYG1vdXNlZW50ZXIke0VWRU5UX0tFWSQ4fWA7XG5jb25zdCBFVkVOVF9NT1VTRUxFQVZFJDEgPSBgbW91c2VsZWF2ZSR7RVZFTlRfS0VZJDh9YDtcbmNvbnN0IEVWRU5UX0RSQUdfU1RBUlQgPSBgZHJhZ3N0YXJ0JHtFVkVOVF9LRVkkOH1gO1xuY29uc3QgRVZFTlRfTE9BRF9EQVRBX0FQSSQzID0gYGxvYWQke0VWRU5UX0tFWSQ4fSR7REFUQV9BUElfS0VZJDV9YDtcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJJDUgPSBgY2xpY2ske0VWRU5UX0tFWSQ4fSR7REFUQV9BUElfS0VZJDV9YDtcbmNvbnN0IENMQVNTX05BTUVfQ0FST1VTRUwgPSAnY2Fyb3VzZWwnO1xuY29uc3QgQ0xBU1NfTkFNRV9BQ1RJVkUkMiA9ICdhY3RpdmUnO1xuY29uc3QgQ0xBU1NfTkFNRV9TTElERSA9ICdzbGlkZSc7XG5jb25zdCBDTEFTU19OQU1FX0VORCA9ICdjYXJvdXNlbC1pdGVtLWVuZCc7XG5jb25zdCBDTEFTU19OQU1FX1NUQVJUID0gJ2Nhcm91c2VsLWl0ZW0tc3RhcnQnO1xuY29uc3QgQ0xBU1NfTkFNRV9ORVhUID0gJ2Nhcm91c2VsLWl0ZW0tbmV4dCc7XG5jb25zdCBDTEFTU19OQU1FX1BSRVYgPSAnY2Fyb3VzZWwtaXRlbS1wcmV2JztcbmNvbnN0IFNFTEVDVE9SX0FDVElWRSA9ICcuYWN0aXZlJztcbmNvbnN0IFNFTEVDVE9SX0lURU0gPSAnLmNhcm91c2VsLWl0ZW0nO1xuY29uc3QgU0VMRUNUT1JfQUNUSVZFX0lURU0gPSBTRUxFQ1RPUl9BQ1RJVkUgKyBTRUxFQ1RPUl9JVEVNO1xuY29uc3QgU0VMRUNUT1JfSVRFTV9JTUcgPSAnLmNhcm91c2VsLWl0ZW0gaW1nJztcbmNvbnN0IFNFTEVDVE9SX0lORElDQVRPUlMgPSAnLmNhcm91c2VsLWluZGljYXRvcnMnO1xuY29uc3QgU0VMRUNUT1JfREFUQV9TTElERSA9ICdbZGF0YS1icy1zbGlkZV0sIFtkYXRhLWJzLXNsaWRlLXRvXSc7XG5jb25zdCBTRUxFQ1RPUl9EQVRBX1JJREUgPSAnW2RhdGEtYnMtcmlkZT1cImNhcm91c2VsXCJdJztcbmNvbnN0IEtFWV9UT19ESVJFQ1RJT04gPSB7XG4gIFtBUlJPV19MRUZUX0tFWSQxXTogRElSRUNUSU9OX1JJR0hULFxuICBbQVJST1dfUklHSFRfS0VZJDFdOiBESVJFQ1RJT05fTEVGVFxufTtcbmNvbnN0IERlZmF1bHQkYiA9IHtcbiAgaW50ZXJ2YWw6IDUwMDAsXG4gIGtleWJvYXJkOiB0cnVlLFxuICBwYXVzZTogJ2hvdmVyJyxcbiAgcmlkZTogZmFsc2UsXG4gIHRvdWNoOiB0cnVlLFxuICB3cmFwOiB0cnVlXG59O1xuY29uc3QgRGVmYXVsdFR5cGUkYiA9IHtcbiAgaW50ZXJ2YWw6ICcobnVtYmVyfGJvb2xlYW4pJyxcbiAgLy8gVE9ETzp2NiByZW1vdmUgYm9vbGVhbiBzdXBwb3J0XG4gIGtleWJvYXJkOiAnYm9vbGVhbicsXG4gIHBhdXNlOiAnKHN0cmluZ3xib29sZWFuKScsXG4gIHJpZGU6ICcoYm9vbGVhbnxzdHJpbmcpJyxcbiAgdG91Y2g6ICdib29sZWFuJyxcbiAgd3JhcDogJ2Jvb2xlYW4nXG59O1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBDYXJvdXNlbCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpO1xuICAgIHRoaXMuX2ludGVydmFsID0gbnVsbDtcbiAgICB0aGlzLl9hY3RpdmVFbGVtZW50ID0gbnVsbDtcbiAgICB0aGlzLl9pc1NsaWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnRvdWNoVGltZW91dCA9IG51bGw7XG4gICAgdGhpcy5fc3dpcGVIZWxwZXIgPSBudWxsO1xuICAgIHRoaXMuX2luZGljYXRvcnNFbGVtZW50ID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9JTkRJQ0FUT1JTLCB0aGlzLl9lbGVtZW50KTtcbiAgICB0aGlzLl9hZGRFdmVudExpc3RlbmVycygpO1xuICAgIGlmICh0aGlzLl9jb25maWcucmlkZSA9PT0gQ0xBU1NfTkFNRV9DQVJPVVNFTCkge1xuICAgICAgdGhpcy5jeWNsZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0JGI7XG4gIH1cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGUkYjtcbiAgfVxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUUkYztcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBuZXh0KCkge1xuICAgIHRoaXMuX3NsaWRlKE9SREVSX05FWFQpO1xuICB9XG4gIG5leHRXaGVuVmlzaWJsZSgpIHtcbiAgICAvLyBGSVhNRSBUT0RPIHVzZSBgZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlYFxuICAgIC8vIERvbid0IGNhbGwgbmV4dCB3aGVuIHRoZSBwYWdlIGlzbid0IHZpc2libGVcbiAgICAvLyBvciB0aGUgY2Fyb3VzZWwgb3IgaXRzIHBhcmVudCBpc24ndCB2aXNpYmxlXG4gICAgaWYgKCFkb2N1bWVudC5oaWRkZW4gJiYgaXNWaXNpYmxlKHRoaXMuX2VsZW1lbnQpKSB7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICB9XG4gIH1cbiAgcHJldigpIHtcbiAgICB0aGlzLl9zbGlkZShPUkRFUl9QUkVWKTtcbiAgfVxuICBwYXVzZSgpIHtcbiAgICBpZiAodGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICB0cmlnZ2VyVHJhbnNpdGlvbkVuZCh0aGlzLl9lbGVtZW50KTtcbiAgICB9XG4gICAgdGhpcy5fY2xlYXJJbnRlcnZhbCgpO1xuICB9XG4gIGN5Y2xlKCkge1xuICAgIHRoaXMuX2NsZWFySW50ZXJ2YWwoKTtcbiAgICB0aGlzLl91cGRhdGVJbnRlcnZhbCgpO1xuICAgIHRoaXMuX2ludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5uZXh0V2hlblZpc2libGUoKSwgdGhpcy5fY29uZmlnLmludGVydmFsKTtcbiAgfVxuICBfbWF5YmVFbmFibGVDeWNsZSgpIHtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5yaWRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9pc1NsaWRpbmcpIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vbmUodGhpcy5fZWxlbWVudCwgRVZFTlRfU0xJRCwgKCkgPT4gdGhpcy5jeWNsZSgpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jeWNsZSgpO1xuICB9XG4gIHRvKGluZGV4KSB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLl9nZXRJdGVtcygpO1xuICAgIGlmIChpbmRleCA+IGl0ZW1zLmxlbmd0aCAtIDEgfHwgaW5kZXggPCAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9pc1NsaWRpbmcpIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vbmUodGhpcy5fZWxlbWVudCwgRVZFTlRfU0xJRCwgKCkgPT4gdGhpcy50byhpbmRleCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhY3RpdmVJbmRleCA9IHRoaXMuX2dldEl0ZW1JbmRleCh0aGlzLl9nZXRBY3RpdmUoKSk7XG4gICAgaWYgKGFjdGl2ZUluZGV4ID09PSBpbmRleCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvcmRlciA9IGluZGV4ID4gYWN0aXZlSW5kZXggPyBPUkRFUl9ORVhUIDogT1JERVJfUFJFVjtcbiAgICB0aGlzLl9zbGlkZShvcmRlciwgaXRlbXNbaW5kZXhdKTtcbiAgfVxuICBkaXNwb3NlKCkge1xuICAgIGlmICh0aGlzLl9zd2lwZUhlbHBlcikge1xuICAgICAgdGhpcy5fc3dpcGVIZWxwZXIuZGlzcG9zZSgpO1xuICAgIH1cbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9jb25maWdBZnRlck1lcmdlKGNvbmZpZykge1xuICAgIGNvbmZpZy5kZWZhdWx0SW50ZXJ2YWwgPSBjb25maWcuaW50ZXJ2YWw7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBfYWRkRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgaWYgKHRoaXMuX2NvbmZpZy5rZXlib2FyZCkge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0tFWURPV04kMSwgZXZlbnQgPT4gdGhpcy5fa2V5ZG93bihldmVudCkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY29uZmlnLnBhdXNlID09PSAnaG92ZXInKSB7XG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfTU9VU0VFTlRFUiQxLCAoKSA9PiB0aGlzLnBhdXNlKCkpO1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFTEVBVkUkMSwgKCkgPT4gdGhpcy5fbWF5YmVFbmFibGVDeWNsZSgpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NvbmZpZy50b3VjaCAmJiBTd2lwZS5pc1N1cHBvcnRlZCgpKSB7XG4gICAgICB0aGlzLl9hZGRUb3VjaEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuICB9XG4gIF9hZGRUb3VjaEV2ZW50TGlzdGVuZXJzKCkge1xuICAgIGZvciAoY29uc3QgaW1nIG9mIFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfSVRFTV9JTUcsIHRoaXMuX2VsZW1lbnQpKSB7XG4gICAgICBFdmVudEhhbmRsZXIub24oaW1nLCBFVkVOVF9EUkFHX1NUQVJULCBldmVudCA9PiBldmVudC5wcmV2ZW50RGVmYXVsdCgpKTtcbiAgICB9XG4gICAgY29uc3QgZW5kQ2FsbEJhY2sgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fY29uZmlnLnBhdXNlICE9PSAnaG92ZXInKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgaXQncyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlLCBtb3VzZWVudGVyL2xlYXZlIGFyZSBmaXJlZCBhc1xuICAgICAgLy8gcGFydCBvZiB0aGUgbW91c2UgY29tcGF0aWJpbGl0eSBldmVudHMgb24gZmlyc3QgdGFwIC0gdGhlIGNhcm91c2VsXG4gICAgICAvLyB3b3VsZCBzdG9wIGN5Y2xpbmcgdW50aWwgdXNlciB0YXBwZWQgb3V0IG9mIGl0O1xuICAgICAgLy8gaGVyZSwgd2UgbGlzdGVuIGZvciB0b3VjaGVuZCwgZXhwbGljaXRseSBwYXVzZSB0aGUgY2Fyb3VzZWxcbiAgICAgIC8vIChhcyBpZiBpdCdzIHRoZSBzZWNvbmQgdGltZSB3ZSB0YXAgb24gaXQsIG1vdXNlZW50ZXIgY29tcGF0IGV2ZW50XG4gICAgICAvLyBpcyBOT1QgZmlyZWQpIGFuZCBhZnRlciBhIHRpbWVvdXQgKHRvIGFsbG93IGZvciBtb3VzZSBjb21wYXRpYmlsaXR5XG4gICAgICAvLyBldmVudHMgdG8gZmlyZSkgd2UgZXhwbGljaXRseSByZXN0YXJ0IGN5Y2xpbmdcblxuICAgICAgdGhpcy5wYXVzZSgpO1xuICAgICAgaWYgKHRoaXMudG91Y2hUaW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvdWNoVGltZW91dCk7XG4gICAgICB9XG4gICAgICB0aGlzLnRvdWNoVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5fbWF5YmVFbmFibGVDeWNsZSgpLCBUT1VDSEVWRU5UX0NPTVBBVF9XQUlUICsgdGhpcy5fY29uZmlnLmludGVydmFsKTtcbiAgICB9O1xuICAgIGNvbnN0IHN3aXBlQ29uZmlnID0ge1xuICAgICAgbGVmdENhbGxiYWNrOiAoKSA9PiB0aGlzLl9zbGlkZSh0aGlzLl9kaXJlY3Rpb25Ub09yZGVyKERJUkVDVElPTl9MRUZUKSksXG4gICAgICByaWdodENhbGxiYWNrOiAoKSA9PiB0aGlzLl9zbGlkZSh0aGlzLl9kaXJlY3Rpb25Ub09yZGVyKERJUkVDVElPTl9SSUdIVCkpLFxuICAgICAgZW5kQ2FsbGJhY2s6IGVuZENhbGxCYWNrXG4gICAgfTtcbiAgICB0aGlzLl9zd2lwZUhlbHBlciA9IG5ldyBTd2lwZSh0aGlzLl9lbGVtZW50LCBzd2lwZUNvbmZpZyk7XG4gIH1cbiAgX2tleWRvd24oZXZlbnQpIHtcbiAgICBpZiAoL2lucHV0fHRleHRhcmVhL2kudGVzdChldmVudC50YXJnZXQudGFnTmFtZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGlyZWN0aW9uID0gS0VZX1RPX0RJUkVDVElPTltldmVudC5rZXldO1xuICAgIGlmIChkaXJlY3Rpb24pIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLl9zbGlkZSh0aGlzLl9kaXJlY3Rpb25Ub09yZGVyKGRpcmVjdGlvbikpO1xuICAgIH1cbiAgfVxuICBfZ2V0SXRlbUluZGV4KGVsZW1lbnQpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0SXRlbXMoKS5pbmRleE9mKGVsZW1lbnQpO1xuICB9XG4gIF9zZXRBY3RpdmVJbmRpY2F0b3JFbGVtZW50KGluZGV4KSB7XG4gICAgaWYgKCF0aGlzLl9pbmRpY2F0b3JzRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhY3RpdmVJbmRpY2F0b3IgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX0FDVElWRSwgdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQpO1xuICAgIGFjdGl2ZUluZGljYXRvci5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFJDIpO1xuICAgIGFjdGl2ZUluZGljYXRvci5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcpO1xuICAgIGNvbnN0IG5ld0FjdGl2ZUluZGljYXRvciA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoYFtkYXRhLWJzLXNsaWRlLXRvPVwiJHtpbmRleH1cIl1gLCB0aGlzLl9pbmRpY2F0b3JzRWxlbWVudCk7XG4gICAgaWYgKG5ld0FjdGl2ZUluZGljYXRvcikge1xuICAgICAgbmV3QWN0aXZlSW5kaWNhdG9yLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9BQ1RJVkUkMik7XG4gICAgICBuZXdBY3RpdmVJbmRpY2F0b3Iuc2V0QXR0cmlidXRlKCdhcmlhLWN1cnJlbnQnLCAndHJ1ZScpO1xuICAgIH1cbiAgfVxuICBfdXBkYXRlSW50ZXJ2YWwoKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2FjdGl2ZUVsZW1lbnQgfHwgdGhpcy5fZ2V0QWN0aXZlKCk7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGVsZW1lbnRJbnRlcnZhbCA9IE51bWJlci5wYXJzZUludChlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1icy1pbnRlcnZhbCcpLCAxMCk7XG4gICAgdGhpcy5fY29uZmlnLmludGVydmFsID0gZWxlbWVudEludGVydmFsIHx8IHRoaXMuX2NvbmZpZy5kZWZhdWx0SW50ZXJ2YWw7XG4gIH1cbiAgX3NsaWRlKG9yZGVyLCBlbGVtZW50ID0gbnVsbCkge1xuICAgIGlmICh0aGlzLl9pc1NsaWRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IHRoaXMuX2dldEFjdGl2ZSgpO1xuICAgIGNvbnN0IGlzTmV4dCA9IG9yZGVyID09PSBPUkRFUl9ORVhUO1xuICAgIGNvbnN0IG5leHRFbGVtZW50ID0gZWxlbWVudCB8fCBnZXROZXh0QWN0aXZlRWxlbWVudCh0aGlzLl9nZXRJdGVtcygpLCBhY3RpdmVFbGVtZW50LCBpc05leHQsIHRoaXMuX2NvbmZpZy53cmFwKTtcbiAgICBpZiAobmV4dEVsZW1lbnQgPT09IGFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV4dEVsZW1lbnRJbmRleCA9IHRoaXMuX2dldEl0ZW1JbmRleChuZXh0RWxlbWVudCk7XG4gICAgY29uc3QgdHJpZ2dlckV2ZW50ID0gZXZlbnROYW1lID0+IHtcbiAgICAgIHJldHVybiBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBldmVudE5hbWUsIHtcbiAgICAgICAgcmVsYXRlZFRhcmdldDogbmV4dEVsZW1lbnQsXG4gICAgICAgIGRpcmVjdGlvbjogdGhpcy5fb3JkZXJUb0RpcmVjdGlvbihvcmRlciksXG4gICAgICAgIGZyb206IHRoaXMuX2dldEl0ZW1JbmRleChhY3RpdmVFbGVtZW50KSxcbiAgICAgICAgdG86IG5leHRFbGVtZW50SW5kZXhcbiAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3Qgc2xpZGVFdmVudCA9IHRyaWdnZXJFdmVudChFVkVOVF9TTElERSk7XG4gICAgaWYgKHNsaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWFjdGl2ZUVsZW1lbnQgfHwgIW5leHRFbGVtZW50KSB7XG4gICAgICAvLyBTb21lIHdlaXJkbmVzcyBpcyBoYXBwZW5pbmcsIHNvIHdlIGJhaWxcbiAgICAgIC8vIFRPRE86IGNoYW5nZSB0ZXN0cyB0aGF0IHVzZSBlbXB0eSBkaXZzIHRvIGF2b2lkIHRoaXMgY2hlY2tcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaXNDeWNsaW5nID0gQm9vbGVhbih0aGlzLl9pbnRlcnZhbCk7XG4gICAgdGhpcy5wYXVzZSgpO1xuICAgIHRoaXMuX2lzU2xpZGluZyA9IHRydWU7XG4gICAgdGhpcy5fc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudChuZXh0RWxlbWVudEluZGV4KTtcbiAgICB0aGlzLl9hY3RpdmVFbGVtZW50ID0gbmV4dEVsZW1lbnQ7XG4gICAgY29uc3QgZGlyZWN0aW9uYWxDbGFzc05hbWUgPSBpc05leHQgPyBDTEFTU19OQU1FX1NUQVJUIDogQ0xBU1NfTkFNRV9FTkQ7XG4gICAgY29uc3Qgb3JkZXJDbGFzc05hbWUgPSBpc05leHQgPyBDTEFTU19OQU1FX05FWFQgOiBDTEFTU19OQU1FX1BSRVY7XG4gICAgbmV4dEVsZW1lbnQuY2xhc3NMaXN0LmFkZChvcmRlckNsYXNzTmFtZSk7XG4gICAgcmVmbG93KG5leHRFbGVtZW50KTtcbiAgICBhY3RpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoZGlyZWN0aW9uYWxDbGFzc05hbWUpO1xuICAgIG5leHRFbGVtZW50LmNsYXNzTGlzdC5hZGQoZGlyZWN0aW9uYWxDbGFzc05hbWUpO1xuICAgIGNvbnN0IGNvbXBsZXRlQ2FsbEJhY2sgPSAoKSA9PiB7XG4gICAgICBuZXh0RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGRpcmVjdGlvbmFsQ2xhc3NOYW1lLCBvcmRlckNsYXNzTmFtZSk7XG4gICAgICBuZXh0RWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFJDIpO1xuICAgICAgYWN0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFJDIsIG9yZGVyQ2xhc3NOYW1lLCBkaXJlY3Rpb25hbENsYXNzTmFtZSk7XG4gICAgICB0aGlzLl9pc1NsaWRpbmcgPSBmYWxzZTtcbiAgICAgIHRyaWdnZXJFdmVudChFVkVOVF9TTElEKTtcbiAgICB9O1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGVDYWxsQmFjaywgYWN0aXZlRWxlbWVudCwgdGhpcy5faXNBbmltYXRlZCgpKTtcbiAgICBpZiAoaXNDeWNsaW5nKSB7XG4gICAgICB0aGlzLmN5Y2xlKCk7XG4gICAgfVxuICB9XG4gIF9pc0FuaW1hdGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NMSURFKTtcbiAgfVxuICBfZ2V0QWN0aXZlKCkge1xuICAgIHJldHVybiBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX0FDVElWRV9JVEVNLCB0aGlzLl9lbGVtZW50KTtcbiAgfVxuICBfZ2V0SXRlbXMoKSB7XG4gICAgcmV0dXJuIFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfSVRFTSwgdGhpcy5fZWxlbWVudCk7XG4gIH1cbiAgX2NsZWFySW50ZXJ2YWwoKSB7XG4gICAgaWYgKHRoaXMuX2ludGVydmFsKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuX2ludGVydmFsKTtcbiAgICAgIHRoaXMuX2ludGVydmFsID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgX2RpcmVjdGlvblRvT3JkZXIoZGlyZWN0aW9uKSB7XG4gICAgaWYgKGlzUlRMKCkpIHtcbiAgICAgIHJldHVybiBkaXJlY3Rpb24gPT09IERJUkVDVElPTl9MRUZUID8gT1JERVJfUFJFViA6IE9SREVSX05FWFQ7XG4gICAgfVxuICAgIHJldHVybiBkaXJlY3Rpb24gPT09IERJUkVDVElPTl9MRUZUID8gT1JERVJfTkVYVCA6IE9SREVSX1BSRVY7XG4gIH1cbiAgX29yZGVyVG9EaXJlY3Rpb24ob3JkZXIpIHtcbiAgICBpZiAoaXNSVEwoKSkge1xuICAgICAgcmV0dXJuIG9yZGVyID09PSBPUkRFUl9QUkVWID8gRElSRUNUSU9OX0xFRlQgOiBESVJFQ1RJT05fUklHSFQ7XG4gICAgfVxuICAgIHJldHVybiBvcmRlciA9PT0gT1JERVJfUFJFViA/IERJUkVDVElPTl9SSUdIVCA6IERJUkVDVElPTl9MRUZUO1xuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gQ2Fyb3VzZWwuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGRhdGEudG8oY29uZmlnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYCk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YVtjb25maWddKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEkkNSwgU0VMRUNUT1JfREFUQV9TTElERSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGNvbnN0IHRhcmdldCA9IFNlbGVjdG9yRW5naW5lLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IodGhpcyk7XG4gIGlmICghdGFyZ2V0IHx8ICF0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfQ0FST1VTRUwpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIGNvbnN0IGNhcm91c2VsID0gQ2Fyb3VzZWwuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0YXJnZXQpO1xuICBjb25zdCBzbGlkZUluZGV4ID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtc2xpZGUtdG8nKTtcbiAgaWYgKHNsaWRlSW5kZXgpIHtcbiAgICBjYXJvdXNlbC50byhzbGlkZUluZGV4KTtcbiAgICBjYXJvdXNlbC5fbWF5YmVFbmFibGVDeWNsZSgpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoTWFuaXB1bGF0b3IuZ2V0RGF0YUF0dHJpYnV0ZSh0aGlzLCAnc2xpZGUnKSA9PT0gJ25leHQnKSB7XG4gICAgY2Fyb3VzZWwubmV4dCgpO1xuICAgIGNhcm91c2VsLl9tYXliZUVuYWJsZUN5Y2xlKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNhcm91c2VsLnByZXYoKTtcbiAgY2Fyb3VzZWwuX21heWJlRW5hYmxlQ3ljbGUoKTtcbn0pO1xuRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfTE9BRF9EQVRBX0FQSSQzLCAoKSA9PiB7XG4gIGNvbnN0IGNhcm91c2VscyA9IFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfREFUQV9SSURFKTtcbiAgZm9yIChjb25zdCBjYXJvdXNlbCBvZiBjYXJvdXNlbHMpIHtcbiAgICBDYXJvdXNlbC5nZXRPckNyZWF0ZUluc3RhbmNlKGNhcm91c2VsKTtcbiAgfVxufSk7XG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKENhcm91c2VsKTtcblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGNvbGxhcHNlLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUkYiA9ICdjb2xsYXBzZSc7XG5jb25zdCBEQVRBX0tFWSQ3ID0gJ2JzLmNvbGxhcHNlJztcbmNvbnN0IEVWRU5UX0tFWSQ3ID0gYC4ke0RBVEFfS0VZJDd9YDtcbmNvbnN0IERBVEFfQVBJX0tFWSQ0ID0gJy5kYXRhLWFwaSc7XG5jb25zdCBFVkVOVF9TSE9XJDYgPSBgc2hvdyR7RVZFTlRfS0VZJDd9YDtcbmNvbnN0IEVWRU5UX1NIT1dOJDYgPSBgc2hvd24ke0VWRU5UX0tFWSQ3fWA7XG5jb25zdCBFVkVOVF9ISURFJDYgPSBgaGlkZSR7RVZFTlRfS0VZJDd9YDtcbmNvbnN0IEVWRU5UX0hJRERFTiQ2ID0gYGhpZGRlbiR7RVZFTlRfS0VZJDd9YDtcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJJDQgPSBgY2xpY2ske0VWRU5UX0tFWSQ3fSR7REFUQV9BUElfS0VZJDR9YDtcbmNvbnN0IENMQVNTX05BTUVfU0hPVyQ3ID0gJ3Nob3cnO1xuY29uc3QgQ0xBU1NfTkFNRV9DT0xMQVBTRSA9ICdjb2xsYXBzZSc7XG5jb25zdCBDTEFTU19OQU1FX0NPTExBUFNJTkcgPSAnY29sbGFwc2luZyc7XG5jb25zdCBDTEFTU19OQU1FX0NPTExBUFNFRCA9ICdjb2xsYXBzZWQnO1xuY29uc3QgQ0xBU1NfTkFNRV9ERUVQRVJfQ0hJTERSRU4gPSBgOnNjb3BlIC4ke0NMQVNTX05BTUVfQ09MTEFQU0V9IC4ke0NMQVNTX05BTUVfQ09MTEFQU0V9YDtcbmNvbnN0IENMQVNTX05BTUVfSE9SSVpPTlRBTCA9ICdjb2xsYXBzZS1ob3Jpem9udGFsJztcbmNvbnN0IFdJRFRIID0gJ3dpZHRoJztcbmNvbnN0IEhFSUdIVCA9ICdoZWlnaHQnO1xuY29uc3QgU0VMRUNUT1JfQUNUSVZFUyA9ICcuY29sbGFwc2Uuc2hvdywgLmNvbGxhcHNlLmNvbGxhcHNpbmcnO1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUkNCA9ICdbZGF0YS1icy10b2dnbGU9XCJjb2xsYXBzZVwiXSc7XG5jb25zdCBEZWZhdWx0JGEgPSB7XG4gIHBhcmVudDogbnVsbCxcbiAgdG9nZ2xlOiB0cnVlXG59O1xuY29uc3QgRGVmYXVsdFR5cGUkYSA9IHtcbiAgcGFyZW50OiAnKG51bGx8ZWxlbWVudCknLFxuICB0b2dnbGU6ICdib29sZWFuJ1xufTtcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgQ29sbGFwc2UgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKTtcbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICB0aGlzLl90cmlnZ2VyQXJyYXkgPSBbXTtcbiAgICBjb25zdCB0b2dnbGVMaXN0ID0gU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9EQVRBX1RPR0dMRSQ0KTtcbiAgICBmb3IgKGNvbnN0IGVsZW0gb2YgdG9nZ2xlTGlzdCkge1xuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBTZWxlY3RvckVuZ2luZS5nZXRTZWxlY3RvckZyb21FbGVtZW50KGVsZW0pO1xuICAgICAgY29uc3QgZmlsdGVyRWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmZpbmQoc2VsZWN0b3IpLmZpbHRlcihmb3VuZEVsZW1lbnQgPT4gZm91bmRFbGVtZW50ID09PSB0aGlzLl9lbGVtZW50KTtcbiAgICAgIGlmIChzZWxlY3RvciAhPT0gbnVsbCAmJiBmaWx0ZXJFbGVtZW50Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLl90cmlnZ2VyQXJyYXkucHVzaChlbGVtKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5faW5pdGlhbGl6ZUNoaWxkcmVuKCk7XG4gICAgaWYgKCF0aGlzLl9jb25maWcucGFyZW50KSB7XG4gICAgICB0aGlzLl9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3ModGhpcy5fdHJpZ2dlckFycmF5LCB0aGlzLl9pc1Nob3duKCkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY29uZmlnLnRvZ2dsZSkge1xuICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICB9XG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdCRhO1xuICB9XG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlJGE7XG4gIH1cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FJGI7XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgdG9nZ2xlKCkge1xuICAgIGlmICh0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNob3coKTtcbiAgICB9XG4gIH1cbiAgc2hvdygpIHtcbiAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uaW5nIHx8IHRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgYWN0aXZlQ2hpbGRyZW4gPSBbXTtcblxuICAgIC8vIGZpbmQgYWN0aXZlIGNoaWxkcmVuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5wYXJlbnQpIHtcbiAgICAgIGFjdGl2ZUNoaWxkcmVuID0gdGhpcy5fZ2V0Rmlyc3RMZXZlbENoaWxkcmVuKFNFTEVDVE9SX0FDVElWRVMpLmZpbHRlcihlbGVtZW50ID0+IGVsZW1lbnQgIT09IHRoaXMuX2VsZW1lbnQpLm1hcChlbGVtZW50ID0+IENvbGxhcHNlLmdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCwge1xuICAgICAgICB0b2dnbGU6IGZhbHNlXG4gICAgICB9KSk7XG4gICAgfVxuICAgIGlmIChhY3RpdmVDaGlsZHJlbi5sZW5ndGggJiYgYWN0aXZlQ2hpbGRyZW5bMF0uX2lzVHJhbnNpdGlvbmluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzdGFydEV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPVyQ2KTtcbiAgICBpZiAoc3RhcnRFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgYWN0aXZlSW5zdGFuY2Ugb2YgYWN0aXZlQ2hpbGRyZW4pIHtcbiAgICAgIGFjdGl2ZUluc3RhbmNlLmhpZGUoKTtcbiAgICB9XG4gICAgY29uc3QgZGltZW5zaW9uID0gdGhpcy5fZ2V0RGltZW5zaW9uKCk7XG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQ09MTEFQU0UpO1xuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0NPTExBUFNJTkcpO1xuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9IDA7XG4gICAgdGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRoaXMuX3RyaWdnZXJBcnJheSwgdHJ1ZSk7XG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQ09MTEFQU0lORyk7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9DT0xMQVBTRSwgQ0xBU1NfTkFNRV9TSE9XJDcpO1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gJyc7XG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XTiQ2KTtcbiAgICB9O1xuICAgIGNvbnN0IGNhcGl0YWxpemVkRGltZW5zaW9uID0gZGltZW5zaW9uWzBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoMSk7XG4gICAgY29uc3Qgc2Nyb2xsU2l6ZSA9IGBzY3JvbGwke2NhcGl0YWxpemVkRGltZW5zaW9ufWA7XG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgdGhpcy5fZWxlbWVudCwgdHJ1ZSk7XG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gYCR7dGhpcy5fZWxlbWVudFtzY3JvbGxTaXplXX1weGA7XG4gIH1cbiAgaGlkZSgpIHtcbiAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uaW5nIHx8ICF0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3RhcnRFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREUkNik7XG4gICAgaWYgKHN0YXJ0RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkaW1lbnNpb24gPSB0aGlzLl9nZXREaW1lbnNpb24oKTtcbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSBgJHt0aGlzLl9lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2RpbWVuc2lvbl19cHhgO1xuICAgIHJlZmxvdyh0aGlzLl9lbGVtZW50KTtcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9DT0xMQVBTSU5HKTtcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9DT0xMQVBTRSwgQ0xBU1NfTkFNRV9TSE9XJDcpO1xuICAgIGZvciAoY29uc3QgdHJpZ2dlciBvZiB0aGlzLl90cmlnZ2VyQXJyYXkpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKHRyaWdnZXIpO1xuICAgICAgaWYgKGVsZW1lbnQgJiYgIXRoaXMuX2lzU2hvd24oZWxlbWVudCkpIHtcbiAgICAgICAgdGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKFt0cmlnZ2VyXSwgZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSB0cnVlO1xuICAgIGNvbnN0IGNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9DT0xMQVBTSU5HKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0NPTExBUFNFKTtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJRERFTiQ2KTtcbiAgICB9O1xuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9ICcnO1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMuX2VsZW1lbnQsIHRydWUpO1xuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfaXNTaG93bihlbGVtZW50ID0gdGhpcy5fZWxlbWVudCkge1xuICAgIHJldHVybiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NIT1ckNyk7XG4gIH1cbiAgX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKSB7XG4gICAgY29uZmlnLnRvZ2dsZSA9IEJvb2xlYW4oY29uZmlnLnRvZ2dsZSk7IC8vIENvZXJjZSBzdHJpbmcgdmFsdWVzXG4gICAgY29uZmlnLnBhcmVudCA9IGdldEVsZW1lbnQoY29uZmlnLnBhcmVudCk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBfZ2V0RGltZW5zaW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0hPUklaT05UQUwpID8gV0lEVEggOiBIRUlHSFQ7XG4gIH1cbiAgX2luaXRpYWxpemVDaGlsZHJlbigpIHtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5wYXJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLl9nZXRGaXJzdExldmVsQ2hpbGRyZW4oU0VMRUNUT1JfREFUQV9UT0dHTEUkNCk7XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGNoaWxkcmVuKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZCA9IFNlbGVjdG9yRW5naW5lLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IoZWxlbWVudCk7XG4gICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgdGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKFtlbGVtZW50XSwgdGhpcy5faXNTaG93bihzZWxlY3RlZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBfZ2V0Rmlyc3RMZXZlbENoaWxkcmVuKHNlbGVjdG9yKSB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBTZWxlY3RvckVuZ2luZS5maW5kKENMQVNTX05BTUVfREVFUEVSX0NISUxEUkVOLCB0aGlzLl9jb25maWcucGFyZW50KTtcbiAgICAvLyByZW1vdmUgY2hpbGRyZW4gaWYgZ3JlYXRlciBkZXB0aFxuICAgIHJldHVybiBTZWxlY3RvckVuZ2luZS5maW5kKHNlbGVjdG9yLCB0aGlzLl9jb25maWcucGFyZW50KS5maWx0ZXIoZWxlbWVudCA9PiAhY2hpbGRyZW4uaW5jbHVkZXMoZWxlbWVudCkpO1xuICB9XG4gIF9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3ModHJpZ2dlckFycmF5LCBpc09wZW4pIHtcbiAgICBpZiAoIXRyaWdnZXJBcnJheS5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRyaWdnZXJBcnJheSkge1xuICAgICAgZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKENMQVNTX05BTUVfQ09MTEFQU0VELCAhaXNPcGVuKTtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgaXNPcGVuKTtcbiAgICB9XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICBjb25zdCBfY29uZmlnID0ge307XG4gICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnICYmIC9zaG93fGhpZGUvLnRlc3QoY29uZmlnKSkge1xuICAgICAgX2NvbmZpZy50b2dnbGUgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gQ29sbGFwc2UuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBfY29uZmlnKTtcbiAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgICB9XG4gICAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJJDQsIFNFTEVDVE9SX0RBVEFfVE9HR0xFJDQsIGZ1bmN0aW9uIChldmVudCkge1xuICAvLyBwcmV2ZW50RGVmYXVsdCBvbmx5IGZvciA8YT4gZWxlbWVudHMgKHdoaWNoIGNoYW5nZSB0aGUgVVJMKSBub3QgaW5zaWRlIHRoZSBjb2xsYXBzaWJsZSBlbGVtZW50XG4gIGlmIChldmVudC50YXJnZXQudGFnTmFtZSA9PT0gJ0EnIHx8IGV2ZW50LmRlbGVnYXRlVGFyZ2V0ICYmIGV2ZW50LmRlbGVnYXRlVGFyZ2V0LnRhZ05hbWUgPT09ICdBJykge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIFNlbGVjdG9yRW5naW5lLmdldE11bHRpcGxlRWxlbWVudHNGcm9tU2VsZWN0b3IodGhpcykpIHtcbiAgICBDb2xsYXBzZS5nZXRPckNyZWF0ZUluc3RhbmNlKGVsZW1lbnQsIHtcbiAgICAgIHRvZ2dsZTogZmFsc2VcbiAgICB9KS50b2dnbGUoKTtcbiAgfVxufSk7XG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKENvbGxhcHNlKTtcblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGRyb3Bkb3duLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUkYSA9ICdkcm9wZG93bic7XG5jb25zdCBEQVRBX0tFWSQ2ID0gJ2JzLmRyb3Bkb3duJztcbmNvbnN0IEVWRU5UX0tFWSQ2ID0gYC4ke0RBVEFfS0VZJDZ9YDtcbmNvbnN0IERBVEFfQVBJX0tFWSQzID0gJy5kYXRhLWFwaSc7XG5jb25zdCBFU0NBUEVfS0VZJDIgPSAnRXNjYXBlJztcbmNvbnN0IFRBQl9LRVkkMSA9ICdUYWInO1xuY29uc3QgQVJST1dfVVBfS0VZJDEgPSAnQXJyb3dVcCc7XG5jb25zdCBBUlJPV19ET1dOX0tFWSQxID0gJ0Fycm93RG93bic7XG5jb25zdCBSSUdIVF9NT1VTRV9CVVRUT04gPSAyOyAvLyBNb3VzZUV2ZW50LmJ1dHRvbiB2YWx1ZSBmb3IgdGhlIHNlY29uZGFyeSBidXR0b24sIHVzdWFsbHkgdGhlIHJpZ2h0IGJ1dHRvblxuXG5jb25zdCBFVkVOVF9ISURFJDUgPSBgaGlkZSR7RVZFTlRfS0VZJDZ9YDtcbmNvbnN0IEVWRU5UX0hJRERFTiQ1ID0gYGhpZGRlbiR7RVZFTlRfS0VZJDZ9YDtcbmNvbnN0IEVWRU5UX1NIT1ckNSA9IGBzaG93JHtFVkVOVF9LRVkkNn1gO1xuY29uc3QgRVZFTlRfU0hPV04kNSA9IGBzaG93biR7RVZFTlRfS0VZJDZ9YDtcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJJDMgPSBgY2xpY2ske0VWRU5UX0tFWSQ2fSR7REFUQV9BUElfS0VZJDN9YDtcbmNvbnN0IEVWRU5UX0tFWURPV05fREFUQV9BUEkgPSBga2V5ZG93biR7RVZFTlRfS0VZJDZ9JHtEQVRBX0FQSV9LRVkkM31gO1xuY29uc3QgRVZFTlRfS0VZVVBfREFUQV9BUEkgPSBga2V5dXAke0VWRU5UX0tFWSQ2fSR7REFUQV9BUElfS0VZJDN9YDtcbmNvbnN0IENMQVNTX05BTUVfU0hPVyQ2ID0gJ3Nob3cnO1xuY29uc3QgQ0xBU1NfTkFNRV9EUk9QVVAgPSAnZHJvcHVwJztcbmNvbnN0IENMQVNTX05BTUVfRFJPUEVORCA9ICdkcm9wZW5kJztcbmNvbnN0IENMQVNTX05BTUVfRFJPUFNUQVJUID0gJ2Ryb3BzdGFydCc7XG5jb25zdCBDTEFTU19OQU1FX0RST1BVUF9DRU5URVIgPSAnZHJvcHVwLWNlbnRlcic7XG5jb25zdCBDTEFTU19OQU1FX0RST1BET1dOX0NFTlRFUiA9ICdkcm9wZG93bi1jZW50ZXInO1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUkMyA9ICdbZGF0YS1icy10b2dnbGU9XCJkcm9wZG93blwiXTpub3QoLmRpc2FibGVkKTpub3QoOmRpc2FibGVkKSc7XG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRV9TSE9XTiA9IGAke1NFTEVDVE9SX0RBVEFfVE9HR0xFJDN9LiR7Q0xBU1NfTkFNRV9TSE9XJDZ9YDtcbmNvbnN0IFNFTEVDVE9SX01FTlUgPSAnLmRyb3Bkb3duLW1lbnUnO1xuY29uc3QgU0VMRUNUT1JfTkFWQkFSID0gJy5uYXZiYXInO1xuY29uc3QgU0VMRUNUT1JfTkFWQkFSX05BViA9ICcubmF2YmFyLW5hdic7XG5jb25zdCBTRUxFQ1RPUl9WSVNJQkxFX0lURU1TID0gJy5kcm9wZG93bi1tZW51IC5kcm9wZG93bi1pdGVtOm5vdCguZGlzYWJsZWQpOm5vdCg6ZGlzYWJsZWQpJztcbmNvbnN0IFBMQUNFTUVOVF9UT1AgPSBpc1JUTCgpID8gJ3RvcC1lbmQnIDogJ3RvcC1zdGFydCc7XG5jb25zdCBQTEFDRU1FTlRfVE9QRU5EID0gaXNSVEwoKSA/ICd0b3Atc3RhcnQnIDogJ3RvcC1lbmQnO1xuY29uc3QgUExBQ0VNRU5UX0JPVFRPTSA9IGlzUlRMKCkgPyAnYm90dG9tLWVuZCcgOiAnYm90dG9tLXN0YXJ0JztcbmNvbnN0IFBMQUNFTUVOVF9CT1RUT01FTkQgPSBpc1JUTCgpID8gJ2JvdHRvbS1zdGFydCcgOiAnYm90dG9tLWVuZCc7XG5jb25zdCBQTEFDRU1FTlRfUklHSFQgPSBpc1JUTCgpID8gJ2xlZnQtc3RhcnQnIDogJ3JpZ2h0LXN0YXJ0JztcbmNvbnN0IFBMQUNFTUVOVF9MRUZUID0gaXNSVEwoKSA/ICdyaWdodC1zdGFydCcgOiAnbGVmdC1zdGFydCc7XG5jb25zdCBQTEFDRU1FTlRfVE9QQ0VOVEVSID0gJ3RvcCc7XG5jb25zdCBQTEFDRU1FTlRfQk9UVE9NQ0VOVEVSID0gJ2JvdHRvbSc7XG5jb25zdCBEZWZhdWx0JDkgPSB7XG4gIGF1dG9DbG9zZTogdHJ1ZSxcbiAgYm91bmRhcnk6ICdjbGlwcGluZ1BhcmVudHMnLFxuICBkaXNwbGF5OiAnZHluYW1pYycsXG4gIG9mZnNldDogWzAsIDJdLFxuICBwb3BwZXJDb25maWc6IG51bGwsXG4gIHJlZmVyZW5jZTogJ3RvZ2dsZSdcbn07XG5jb25zdCBEZWZhdWx0VHlwZSQ5ID0ge1xuICBhdXRvQ2xvc2U6ICcoYm9vbGVhbnxzdHJpbmcpJyxcbiAgYm91bmRhcnk6ICcoc3RyaW5nfGVsZW1lbnQpJyxcbiAgZGlzcGxheTogJ3N0cmluZycsXG4gIG9mZnNldDogJyhhcnJheXxzdHJpbmd8ZnVuY3Rpb24pJyxcbiAgcG9wcGVyQ29uZmlnOiAnKG51bGx8b2JqZWN0fGZ1bmN0aW9uKScsXG4gIHJlZmVyZW5jZTogJyhzdHJpbmd8ZWxlbWVudHxvYmplY3QpJ1xufTtcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgRHJvcGRvd24gZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKTtcbiAgICB0aGlzLl9wb3BwZXIgPSBudWxsO1xuICAgIHRoaXMuX3BhcmVudCA9IHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZTsgLy8gZHJvcGRvd24gd3JhcHBlclxuICAgIC8vIFRPRE86IHY2IHJldmVydCAjMzcwMTEgJiBjaGFuZ2UgbWFya3VwIGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS9kb2NzLzUuMy9mb3Jtcy9pbnB1dC1ncm91cC9cbiAgICB0aGlzLl9tZW51ID0gU2VsZWN0b3JFbmdpbmUubmV4dCh0aGlzLl9lbGVtZW50LCBTRUxFQ1RPUl9NRU5VKVswXSB8fCBTZWxlY3RvckVuZ2luZS5wcmV2KHRoaXMuX2VsZW1lbnQsIFNFTEVDVE9SX01FTlUpWzBdIHx8IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfTUVOVSwgdGhpcy5fcGFyZW50KTtcbiAgICB0aGlzLl9pbk5hdmJhciA9IHRoaXMuX2RldGVjdE5hdmJhcigpO1xuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHQkOTtcbiAgfVxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZSQ5O1xuICB9XG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRSRhO1xuICB9XG5cbiAgLy8gUHVibGljXG4gIHRvZ2dsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNTaG93bigpID8gdGhpcy5oaWRlKCkgOiB0aGlzLnNob3coKTtcbiAgfVxuICBzaG93KCkge1xuICAgIGlmIChpc0Rpc2FibGVkKHRoaXMuX2VsZW1lbnQpIHx8IHRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0ge1xuICAgICAgcmVsYXRlZFRhcmdldDogdGhpcy5fZWxlbWVudFxuICAgIH07XG4gICAgY29uc3Qgc2hvd0V2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPVyQ1LCByZWxhdGVkVGFyZ2V0KTtcbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fY3JlYXRlUG9wcGVyKCk7XG5cbiAgICAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgYWRkIGV4dHJhXG4gICAgLy8gZW1wdHkgbW91c2VvdmVyIGxpc3RlbmVycyB0byB0aGUgYm9keSdzIGltbWVkaWF0ZSBjaGlsZHJlbjtcbiAgICAvLyBvbmx5IG5lZWRlZCBiZWNhdXNlIG9mIGJyb2tlbiBldmVudCBkZWxlZ2F0aW9uIG9uIGlPU1xuICAgIC8vIGh0dHBzOi8vd3d3LnF1aXJrc21vZGUub3JnL2Jsb2cvYXJjaGl2ZXMvMjAxNC8wMi9tb3VzZV9ldmVudF9idWIuaHRtbFxuICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgIXRoaXMuX3BhcmVudC5jbG9zZXN0KFNFTEVDVE9SX05BVkJBUl9OQVYpKSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgW10uY29uY2F0KC4uLmRvY3VtZW50LmJvZHkuY2hpbGRyZW4pKSB7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vbihlbGVtZW50LCAnbW91c2VvdmVyJywgbm9vcCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2VsZW1lbnQuZm9jdXMoKTtcbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIHRydWUpO1xuICAgIHRoaXMuX21lbnUuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1ckNik7XG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVyQ2KTtcbiAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XTiQ1LCByZWxhdGVkVGFyZ2V0KTtcbiAgfVxuICBoaWRlKCkge1xuICAgIGlmIChpc0Rpc2FibGVkKHRoaXMuX2VsZW1lbnQpIHx8ICF0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IHtcbiAgICAgIHJlbGF0ZWRUYXJnZXQ6IHRoaXMuX2VsZW1lbnRcbiAgICB9O1xuICAgIHRoaXMuX2NvbXBsZXRlSGlkZShyZWxhdGVkVGFyZ2V0KTtcbiAgfVxuICBkaXNwb3NlKCkge1xuICAgIGlmICh0aGlzLl9wb3BwZXIpIHtcbiAgICAgIHRoaXMuX3BvcHBlci5kZXN0cm95KCk7XG4gICAgfVxuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgfVxuICB1cGRhdGUoKSB7XG4gICAgdGhpcy5faW5OYXZiYXIgPSB0aGlzLl9kZXRlY3ROYXZiYXIoKTtcbiAgICBpZiAodGhpcy5fcG9wcGVyKSB7XG4gICAgICB0aGlzLl9wb3BwZXIudXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfY29tcGxldGVIaWRlKHJlbGF0ZWRUYXJnZXQpIHtcbiAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFJDUsIHJlbGF0ZWRUYXJnZXQpO1xuICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHRoaXMgaXMgYSB0b3VjaC1lbmFibGVkIGRldmljZSB3ZSByZW1vdmUgdGhlIGV4dHJhXG4gICAgLy8gZW1wdHkgbW91c2VvdmVyIGxpc3RlbmVycyB3ZSBhZGRlZCBmb3IgaU9TIHN1cHBvcnRcbiAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgW10uY29uY2F0KC4uLmRvY3VtZW50LmJvZHkuY2hpbGRyZW4pKSB7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vZmYoZWxlbWVudCwgJ21vdXNlb3ZlcicsIG5vb3ApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5fcG9wcGVyKSB7XG4gICAgICB0aGlzLl9wb3BwZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgICB0aGlzLl9tZW51LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XJDYpO1xuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1ckNik7XG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTtcbiAgICBNYW5pcHVsYXRvci5yZW1vdmVEYXRhQXR0cmlidXRlKHRoaXMuX21lbnUsICdwb3BwZXInKTtcbiAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURERU4kNSwgcmVsYXRlZFRhcmdldCk7XG4gIH1cbiAgX2dldENvbmZpZyhjb25maWcpIHtcbiAgICBjb25maWcgPSBzdXBlci5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgaWYgKHR5cGVvZiBjb25maWcucmVmZXJlbmNlID09PSAnb2JqZWN0JyAmJiAhaXNFbGVtZW50KGNvbmZpZy5yZWZlcmVuY2UpICYmIHR5cGVvZiBjb25maWcucmVmZXJlbmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gUG9wcGVyIHZpcnR1YWwgZWxlbWVudHMgcmVxdWlyZSBhIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBtZXRob2RcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7TkFNRSRhLnRvVXBwZXJDYXNlKCl9OiBPcHRpb24gXCJyZWZlcmVuY2VcIiBwcm92aWRlZCB0eXBlIFwib2JqZWN0XCIgd2l0aG91dCBhIHJlcXVpcmVkIFwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0XCIgbWV0aG9kLmApO1xuICAgIH1cbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG4gIF9jcmVhdGVQb3BwZXIoKSB7XG4gICAgaWYgKHR5cGVvZiBQb3BwZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCb290c3RyYXBcXCdzIGRyb3Bkb3ducyByZXF1aXJlIFBvcHBlciAoaHR0cHM6Ly9wb3BwZXIuanMub3JnL2RvY3MvdjIvKScpO1xuICAgIH1cbiAgICBsZXQgcmVmZXJlbmNlRWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG4gICAgaWYgKHRoaXMuX2NvbmZpZy5yZWZlcmVuY2UgPT09ICdwYXJlbnQnKSB7XG4gICAgICByZWZlcmVuY2VFbGVtZW50ID0gdGhpcy5fcGFyZW50O1xuICAgIH0gZWxzZSBpZiAoaXNFbGVtZW50KHRoaXMuX2NvbmZpZy5yZWZlcmVuY2UpKSB7XG4gICAgICByZWZlcmVuY2VFbGVtZW50ID0gZ2V0RWxlbWVudCh0aGlzLl9jb25maWcucmVmZXJlbmNlKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLl9jb25maWcucmVmZXJlbmNlID09PSAnb2JqZWN0Jykge1xuICAgICAgcmVmZXJlbmNlRWxlbWVudCA9IHRoaXMuX2NvbmZpZy5yZWZlcmVuY2U7XG4gICAgfVxuICAgIGNvbnN0IHBvcHBlckNvbmZpZyA9IHRoaXMuX2dldFBvcHBlckNvbmZpZygpO1xuICAgIHRoaXMuX3BvcHBlciA9IFBvcHBlci5jcmVhdGVQb3BwZXIocmVmZXJlbmNlRWxlbWVudCwgdGhpcy5fbWVudSwgcG9wcGVyQ29uZmlnKTtcbiAgfVxuICBfaXNTaG93bigpIHtcbiAgICByZXR1cm4gdGhpcy5fbWVudS5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TSE9XJDYpO1xuICB9XG4gIF9nZXRQbGFjZW1lbnQoKSB7XG4gICAgY29uc3QgcGFyZW50RHJvcGRvd24gPSB0aGlzLl9wYXJlbnQ7XG4gICAgaWYgKHBhcmVudERyb3Bkb3duLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0RST1BFTkQpKSB7XG4gICAgICByZXR1cm4gUExBQ0VNRU5UX1JJR0hUO1xuICAgIH1cbiAgICBpZiAocGFyZW50RHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRFJPUFNUQVJUKSkge1xuICAgICAgcmV0dXJuIFBMQUNFTUVOVF9MRUZUO1xuICAgIH1cbiAgICBpZiAocGFyZW50RHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRFJPUFVQX0NFTlRFUikpIHtcbiAgICAgIHJldHVybiBQTEFDRU1FTlRfVE9QQ0VOVEVSO1xuICAgIH1cbiAgICBpZiAocGFyZW50RHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRFJPUERPV05fQ0VOVEVSKSkge1xuICAgICAgcmV0dXJuIFBMQUNFTUVOVF9CT1RUT01DRU5URVI7XG4gICAgfVxuXG4gICAgLy8gV2UgbmVlZCB0byB0cmltIHRoZSB2YWx1ZSBiZWNhdXNlIGN1c3RvbSBwcm9wZXJ0aWVzIGNhbiBhbHNvIGluY2x1ZGUgc3BhY2VzXG4gICAgY29uc3QgaXNFbmQgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMuX21lbnUpLmdldFByb3BlcnR5VmFsdWUoJy0tYnMtcG9zaXRpb24nKS50cmltKCkgPT09ICdlbmQnO1xuICAgIGlmIChwYXJlbnREcm9wZG93bi5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9EUk9QVVApKSB7XG4gICAgICByZXR1cm4gaXNFbmQgPyBQTEFDRU1FTlRfVE9QRU5EIDogUExBQ0VNRU5UX1RPUDtcbiAgICB9XG4gICAgcmV0dXJuIGlzRW5kID8gUExBQ0VNRU5UX0JPVFRPTUVORCA6IFBMQUNFTUVOVF9CT1RUT007XG4gIH1cbiAgX2RldGVjdE5hdmJhcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5jbG9zZXN0KFNFTEVDVE9SX05BVkJBUikgIT09IG51bGw7XG4gIH1cbiAgX2dldE9mZnNldCgpIHtcbiAgICBjb25zdCB7XG4gICAgICBvZmZzZXRcbiAgICB9ID0gdGhpcy5fY29uZmlnO1xuICAgIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG9mZnNldC5zcGxpdCgnLCcpLm1hcCh2YWx1ZSA9PiBOdW1iZXIucGFyc2VJbnQodmFsdWUsIDEwKSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gcG9wcGVyRGF0YSA9PiBvZmZzZXQocG9wcGVyRGF0YSwgdGhpcy5fZWxlbWVudCk7XG4gICAgfVxuICAgIHJldHVybiBvZmZzZXQ7XG4gIH1cbiAgX2dldFBvcHBlckNvbmZpZygpIHtcbiAgICBjb25zdCBkZWZhdWx0QnNQb3BwZXJDb25maWcgPSB7XG4gICAgICBwbGFjZW1lbnQ6IHRoaXMuX2dldFBsYWNlbWVudCgpLFxuICAgICAgbW9kaWZpZXJzOiBbe1xuICAgICAgICBuYW1lOiAncHJldmVudE92ZXJmbG93JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGJvdW5kYXJ5OiB0aGlzLl9jb25maWcuYm91bmRhcnlcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBuYW1lOiAnb2Zmc2V0JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG9mZnNldDogdGhpcy5fZ2V0T2Zmc2V0KClcbiAgICAgICAgfVxuICAgICAgfV1cbiAgICB9O1xuXG4gICAgLy8gRGlzYWJsZSBQb3BwZXIgaWYgd2UgaGF2ZSBhIHN0YXRpYyBkaXNwbGF5IG9yIERyb3Bkb3duIGlzIGluIE5hdmJhclxuICAgIGlmICh0aGlzLl9pbk5hdmJhciB8fCB0aGlzLl9jb25maWcuZGlzcGxheSA9PT0gJ3N0YXRpYycpIHtcbiAgICAgIE1hbmlwdWxhdG9yLnNldERhdGFBdHRyaWJ1dGUodGhpcy5fbWVudSwgJ3BvcHBlcicsICdzdGF0aWMnKTsgLy8gVE9ETzogdjYgcmVtb3ZlXG4gICAgICBkZWZhdWx0QnNQb3BwZXJDb25maWcubW9kaWZpZXJzID0gW3tcbiAgICAgICAgbmFtZTogJ2FwcGx5U3R5bGVzJyxcbiAgICAgICAgZW5hYmxlZDogZmFsc2VcbiAgICAgIH1dO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmYXVsdEJzUG9wcGVyQ29uZmlnLFxuICAgICAgLi4uZXhlY3V0ZSh0aGlzLl9jb25maWcucG9wcGVyQ29uZmlnLCBbdW5kZWZpbmVkLCBkZWZhdWx0QnNQb3BwZXJDb25maWddKVxuICAgIH07XG4gIH1cbiAgX3NlbGVjdE1lbnVJdGVtKHtcbiAgICBrZXksXG4gICAgdGFyZ2V0XG4gIH0pIHtcbiAgICBjb25zdCBpdGVtcyA9IFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfVklTSUJMRV9JVEVNUywgdGhpcy5fbWVudSkuZmlsdGVyKGVsZW1lbnQgPT4gaXNWaXNpYmxlKGVsZW1lbnQpKTtcbiAgICBpZiAoIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGlmIHRhcmdldCBpc24ndCBpbmNsdWRlZCBpbiBpdGVtcyAoZS5nLiB3aGVuIGV4cGFuZGluZyB0aGUgZHJvcGRvd24pXG4gICAgLy8gYWxsb3cgY3ljbGluZyB0byBnZXQgdGhlIGxhc3QgaXRlbSBpbiBjYXNlIGtleSBlcXVhbHMgQVJST1dfVVBfS0VZXG4gICAgZ2V0TmV4dEFjdGl2ZUVsZW1lbnQoaXRlbXMsIHRhcmdldCwga2V5ID09PSBBUlJPV19ET1dOX0tFWSQxLCAhaXRlbXMuaW5jbHVkZXModGFyZ2V0KSkuZm9jdXMoKTtcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IERyb3Bkb3duLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKTtcbiAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKTtcbiAgICAgIH1cbiAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgIH0pO1xuICB9XG4gIHN0YXRpYyBjbGVhck1lbnVzKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gUklHSFRfTU9VU0VfQlVUVE9OIHx8IGV2ZW50LnR5cGUgPT09ICdrZXl1cCcgJiYgZXZlbnQua2V5ICE9PSBUQUJfS0VZJDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3BlblRvZ2dsZXMgPSBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfVE9HR0xFX1NIT1dOKTtcbiAgICBmb3IgKGNvbnN0IHRvZ2dsZSBvZiBvcGVuVG9nZ2xlcykge1xuICAgICAgY29uc3QgY29udGV4dCA9IERyb3Bkb3duLmdldEluc3RhbmNlKHRvZ2dsZSk7XG4gICAgICBpZiAoIWNvbnRleHQgfHwgY29udGV4dC5fY29uZmlnLmF1dG9DbG9zZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBjb21wb3NlZFBhdGggPSBldmVudC5jb21wb3NlZFBhdGgoKTtcbiAgICAgIGNvbnN0IGlzTWVudVRhcmdldCA9IGNvbXBvc2VkUGF0aC5pbmNsdWRlcyhjb250ZXh0Ll9tZW51KTtcbiAgICAgIGlmIChjb21wb3NlZFBhdGguaW5jbHVkZXMoY29udGV4dC5fZWxlbWVudCkgfHwgY29udGV4dC5fY29uZmlnLmF1dG9DbG9zZSA9PT0gJ2luc2lkZScgJiYgIWlzTWVudVRhcmdldCB8fCBjb250ZXh0Ll9jb25maWcuYXV0b0Nsb3NlID09PSAnb3V0c2lkZScgJiYgaXNNZW51VGFyZ2V0KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBUYWIgbmF2aWdhdGlvbiB0aHJvdWdoIHRoZSBkcm9wZG93biBtZW51IG9yIGV2ZW50cyBmcm9tIGNvbnRhaW5lZCBpbnB1dHMgc2hvdWxkbid0IGNsb3NlIHRoZSBtZW51XG4gICAgICBpZiAoY29udGV4dC5fbWVudS5jb250YWlucyhldmVudC50YXJnZXQpICYmIChldmVudC50eXBlID09PSAna2V5dXAnICYmIGV2ZW50LmtleSA9PT0gVEFCX0tFWSQxIHx8IC9pbnB1dHxzZWxlY3R8b3B0aW9ufHRleHRhcmVhfGZvcm0vaS50ZXN0KGV2ZW50LnRhcmdldC50YWdOYW1lKSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0ge1xuICAgICAgICByZWxhdGVkVGFyZ2V0OiBjb250ZXh0Ll9lbGVtZW50XG4gICAgICB9O1xuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdjbGljaycpIHtcbiAgICAgICAgcmVsYXRlZFRhcmdldC5jbGlja0V2ZW50ID0gZXZlbnQ7XG4gICAgICB9XG4gICAgICBjb250ZXh0Ll9jb21wbGV0ZUhpZGUocmVsYXRlZFRhcmdldCk7XG4gICAgfVxuICB9XG4gIHN0YXRpYyBkYXRhQXBpS2V5ZG93bkhhbmRsZXIoZXZlbnQpIHtcbiAgICAvLyBJZiBub3QgYW4gVVAgfCBET1dOIHwgRVNDQVBFIGtleSA9PiBub3QgYSBkcm9wZG93biBjb21tYW5kXG4gICAgLy8gSWYgaW5wdXQvdGV4dGFyZWEgJiYgaWYga2V5IGlzIG90aGVyIHRoYW4gRVNDQVBFID0+IG5vdCBhIGRyb3Bkb3duIGNvbW1hbmRcblxuICAgIGNvbnN0IGlzSW5wdXQgPSAvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGV2ZW50LnRhcmdldC50YWdOYW1lKTtcbiAgICBjb25zdCBpc0VzY2FwZUV2ZW50ID0gZXZlbnQua2V5ID09PSBFU0NBUEVfS0VZJDI7XG4gICAgY29uc3QgaXNVcE9yRG93bkV2ZW50ID0gW0FSUk9XX1VQX0tFWSQxLCBBUlJPV19ET1dOX0tFWSQxXS5pbmNsdWRlcyhldmVudC5rZXkpO1xuICAgIGlmICghaXNVcE9yRG93bkV2ZW50ICYmICFpc0VzY2FwZUV2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc0lucHV0ICYmICFpc0VzY2FwZUV2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAvLyBUT0RPOiB2NiByZXZlcnQgIzM3MDExICYgY2hhbmdlIG1hcmt1cCBodHRwczovL2dldGJvb3RzdHJhcC5jb20vZG9jcy81LjMvZm9ybXMvaW5wdXQtZ3JvdXAvXG4gICAgY29uc3QgZ2V0VG9nZ2xlQnV0dG9uID0gdGhpcy5tYXRjaGVzKFNFTEVDVE9SX0RBVEFfVE9HR0xFJDMpID8gdGhpcyA6IFNlbGVjdG9yRW5naW5lLnByZXYodGhpcywgU0VMRUNUT1JfREFUQV9UT0dHTEUkMylbMF0gfHwgU2VsZWN0b3JFbmdpbmUubmV4dCh0aGlzLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQzKVswXSB8fCBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX0RBVEFfVE9HR0xFJDMsIGV2ZW50LmRlbGVnYXRlVGFyZ2V0LnBhcmVudE5vZGUpO1xuICAgIGNvbnN0IGluc3RhbmNlID0gRHJvcGRvd24uZ2V0T3JDcmVhdGVJbnN0YW5jZShnZXRUb2dnbGVCdXR0b24pO1xuICAgIGlmIChpc1VwT3JEb3duRXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgaW5zdGFuY2Uuc2hvdygpO1xuICAgICAgaW5zdGFuY2UuX3NlbGVjdE1lbnVJdGVtKGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGluc3RhbmNlLl9pc1Nob3duKCkpIHtcbiAgICAgIC8vIGVsc2UgaXMgZXNjYXBlIGFuZCB3ZSBjaGVjayBpZiBpdCBpcyBzaG93blxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBpbnN0YW5jZS5oaWRlKCk7XG4gICAgICBnZXRUb2dnbGVCdXR0b24uZm9jdXMoKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfS0VZRE9XTl9EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUkMywgRHJvcGRvd24uZGF0YUFwaUtleWRvd25IYW5kbGVyKTtcbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfS0VZRE9XTl9EQVRBX0FQSSwgU0VMRUNUT1JfTUVOVSwgRHJvcGRvd24uZGF0YUFwaUtleWRvd25IYW5kbGVyKTtcbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEkkMywgRHJvcGRvd24uY2xlYXJNZW51cyk7XG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWVVQX0RBVEFfQVBJLCBEcm9wZG93bi5jbGVhck1lbnVzKTtcbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEkkMywgU0VMRUNUT1JfREFUQV9UT0dHTEUkMywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIERyb3Bkb3duLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcykudG9nZ2xlKCk7XG59KTtcblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oRHJvcGRvd24pO1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9iYWNrZHJvcC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJDkgPSAnYmFja2Ryb3AnO1xuY29uc3QgQ0xBU1NfTkFNRV9GQURFJDQgPSAnZmFkZSc7XG5jb25zdCBDTEFTU19OQU1FX1NIT1ckNSA9ICdzaG93JztcbmNvbnN0IEVWRU5UX01PVVNFRE9XTiA9IGBtb3VzZWRvd24uYnMuJHtOQU1FJDl9YDtcbmNvbnN0IERlZmF1bHQkOCA9IHtcbiAgY2xhc3NOYW1lOiAnbW9kYWwtYmFja2Ryb3AnLFxuICBjbGlja0NhbGxiYWNrOiBudWxsLFxuICBpc0FuaW1hdGVkOiBmYWxzZSxcbiAgaXNWaXNpYmxlOiB0cnVlLFxuICAvLyBpZiBmYWxzZSwgd2UgdXNlIHRoZSBiYWNrZHJvcCBoZWxwZXIgd2l0aG91dCBhZGRpbmcgYW55IGVsZW1lbnQgdG8gdGhlIGRvbVxuICByb290RWxlbWVudDogJ2JvZHknIC8vIGdpdmUgdGhlIGNob2ljZSB0byBwbGFjZSBiYWNrZHJvcCB1bmRlciBkaWZmZXJlbnQgZWxlbWVudHNcbn07XG5jb25zdCBEZWZhdWx0VHlwZSQ4ID0ge1xuICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICBjbGlja0NhbGxiYWNrOiAnKGZ1bmN0aW9ufG51bGwpJyxcbiAgaXNBbmltYXRlZDogJ2Jvb2xlYW4nLFxuICBpc1Zpc2libGU6ICdib29sZWFuJyxcbiAgcm9vdEVsZW1lbnQ6ICcoZWxlbWVudHxzdHJpbmcpJ1xufTtcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgQmFja2Ryb3AgZXh0ZW5kcyBDb25maWcge1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpO1xuICAgIHRoaXMuX2lzQXBwZW5kZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0JDg7XG4gIH1cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGUkODtcbiAgfVxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUUkOTtcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBzaG93KGNhbGxiYWNrKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcuaXNWaXNpYmxlKSB7XG4gICAgICBleGVjdXRlKGNhbGxiYWNrKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fYXBwZW5kKCk7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2dldEVsZW1lbnQoKTtcbiAgICBpZiAodGhpcy5fY29uZmlnLmlzQW5pbWF0ZWQpIHtcbiAgICAgIHJlZmxvdyhlbGVtZW50KTtcbiAgICB9XG4gICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVyQ1KTtcbiAgICB0aGlzLl9lbXVsYXRlQW5pbWF0aW9uKCgpID0+IHtcbiAgICAgIGV4ZWN1dGUoY2FsbGJhY2spO1xuICAgIH0pO1xuICB9XG4gIGhpZGUoY2FsbGJhY2spIHtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5pc1Zpc2libGUpIHtcbiAgICAgIGV4ZWN1dGUoY2FsbGJhY2spO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9nZXRFbGVtZW50KCkuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1ckNSk7XG4gICAgdGhpcy5fZW11bGF0ZUFuaW1hdGlvbigoKSA9PiB7XG4gICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgIGV4ZWN1dGUoY2FsbGJhY2spO1xuICAgIH0pO1xuICB9XG4gIGRpc3Bvc2UoKSB7XG4gICAgaWYgKCF0aGlzLl9pc0FwcGVuZGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudCwgRVZFTlRfTU9VU0VET1dOKTtcbiAgICB0aGlzLl9lbGVtZW50LnJlbW92ZSgpO1xuICAgIHRoaXMuX2lzQXBwZW5kZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2dldEVsZW1lbnQoKSB7XG4gICAgaWYgKCF0aGlzLl9lbGVtZW50KSB7XG4gICAgICBjb25zdCBiYWNrZHJvcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgYmFja2Ryb3AuY2xhc3NOYW1lID0gdGhpcy5fY29uZmlnLmNsYXNzTmFtZTtcbiAgICAgIGlmICh0aGlzLl9jb25maWcuaXNBbmltYXRlZCkge1xuICAgICAgICBiYWNrZHJvcC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfRkFERSQ0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBiYWNrZHJvcDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7XG4gIH1cbiAgX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKSB7XG4gICAgLy8gdXNlIGdldEVsZW1lbnQoKSB3aXRoIHRoZSBkZWZhdWx0IFwiYm9keVwiIHRvIGdldCBhIGZyZXNoIEVsZW1lbnQgb24gZWFjaCBpbnN0YW50aWF0aW9uXG4gICAgY29uZmlnLnJvb3RFbGVtZW50ID0gZ2V0RWxlbWVudChjb25maWcucm9vdEVsZW1lbnQpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbiAgX2FwcGVuZCgpIHtcbiAgICBpZiAodGhpcy5faXNBcHBlbmRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZ2V0RWxlbWVudCgpO1xuICAgIHRoaXMuX2NvbmZpZy5yb290RWxlbWVudC5hcHBlbmQoZWxlbWVudCk7XG4gICAgRXZlbnRIYW5kbGVyLm9uKGVsZW1lbnQsIEVWRU5UX01PVVNFRE9XTiwgKCkgPT4ge1xuICAgICAgZXhlY3V0ZSh0aGlzLl9jb25maWcuY2xpY2tDYWxsYmFjayk7XG4gICAgfSk7XG4gICAgdGhpcy5faXNBcHBlbmRlZCA9IHRydWU7XG4gIH1cbiAgX2VtdWxhdGVBbmltYXRpb24oY2FsbGJhY2spIHtcbiAgICBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uKGNhbGxiYWNrLCB0aGlzLl9nZXRFbGVtZW50KCksIHRoaXMuX2NvbmZpZy5pc0FuaW1hdGVkKTtcbiAgfVxufVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9mb2N1c3RyYXAuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSQ4ID0gJ2ZvY3VzdHJhcCc7XG5jb25zdCBEQVRBX0tFWSQ1ID0gJ2JzLmZvY3VzdHJhcCc7XG5jb25zdCBFVkVOVF9LRVkkNSA9IGAuJHtEQVRBX0tFWSQ1fWA7XG5jb25zdCBFVkVOVF9GT0NVU0lOJDIgPSBgZm9jdXNpbiR7RVZFTlRfS0VZJDV9YDtcbmNvbnN0IEVWRU5UX0tFWURPV05fVEFCID0gYGtleWRvd24udGFiJHtFVkVOVF9LRVkkNX1gO1xuY29uc3QgVEFCX0tFWSA9ICdUYWInO1xuY29uc3QgVEFCX05BVl9GT1JXQVJEID0gJ2ZvcndhcmQnO1xuY29uc3QgVEFCX05BVl9CQUNLV0FSRCA9ICdiYWNrd2FyZCc7XG5jb25zdCBEZWZhdWx0JDcgPSB7XG4gIGF1dG9mb2N1czogdHJ1ZSxcbiAgdHJhcEVsZW1lbnQ6IG51bGwgLy8gVGhlIGVsZW1lbnQgdG8gdHJhcCBmb2N1cyBpbnNpZGUgb2Zcbn07XG5jb25zdCBEZWZhdWx0VHlwZSQ3ID0ge1xuICBhdXRvZm9jdXM6ICdib29sZWFuJyxcbiAgdHJhcEVsZW1lbnQ6ICdlbGVtZW50J1xufTtcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgRm9jdXNUcmFwIGV4dGVuZHMgQ29uZmlnIHtcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKTtcbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuX2xhc3RUYWJOYXZEaXJlY3Rpb24gPSBudWxsO1xuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHQkNztcbiAgfVxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZSQ3O1xuICB9XG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRSQ4O1xuICB9XG5cbiAgLy8gUHVibGljXG4gIGFjdGl2YXRlKCkge1xuICAgIGlmICh0aGlzLl9pc0FjdGl2ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY29uZmlnLmF1dG9mb2N1cykge1xuICAgICAgdGhpcy5fY29uZmlnLnRyYXBFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICAgIEV2ZW50SGFuZGxlci5vZmYoZG9jdW1lbnQsIEVWRU5UX0tFWSQ1KTsgLy8gZ3VhcmQgYWdhaW5zdCBpbmZpbml0ZSBmb2N1cyBsb29wXG4gICAgRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9GT0NVU0lOJDIsIGV2ZW50ID0+IHRoaXMuX2hhbmRsZUZvY3VzaW4oZXZlbnQpKTtcbiAgICBFdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWURPV05fVEFCLCBldmVudCA9PiB0aGlzLl9oYW5kbGVLZXlkb3duKGV2ZW50KSk7XG4gICAgdGhpcy5faXNBY3RpdmUgPSB0cnVlO1xuICB9XG4gIGRlYWN0aXZhdGUoKSB7XG4gICAgaWYgKCF0aGlzLl9pc0FjdGl2ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuICAgIEV2ZW50SGFuZGxlci5vZmYoZG9jdW1lbnQsIEVWRU5UX0tFWSQ1KTtcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2hhbmRsZUZvY3VzaW4oZXZlbnQpIHtcbiAgICBjb25zdCB7XG4gICAgICB0cmFwRWxlbWVudFxuICAgIH0gPSB0aGlzLl9jb25maWc7XG4gICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gZG9jdW1lbnQgfHwgZXZlbnQudGFyZ2V0ID09PSB0cmFwRWxlbWVudCB8fCB0cmFwRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGVsZW1lbnRzID0gU2VsZWN0b3JFbmdpbmUuZm9jdXNhYmxlQ2hpbGRyZW4odHJhcEVsZW1lbnQpO1xuICAgIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRyYXBFbGVtZW50LmZvY3VzKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9sYXN0VGFiTmF2RGlyZWN0aW9uID09PSBUQUJfTkFWX0JBQ0tXQVJEKSB7XG4gICAgICBlbGVtZW50c1tlbGVtZW50cy5sZW5ndGggLSAxXS5mb2N1cygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50c1swXS5mb2N1cygpO1xuICAgIH1cbiAgfVxuICBfaGFuZGxlS2V5ZG93bihldmVudCkge1xuICAgIGlmIChldmVudC5rZXkgIT09IFRBQl9LRVkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fbGFzdFRhYk5hdkRpcmVjdGlvbiA9IGV2ZW50LnNoaWZ0S2V5ID8gVEFCX05BVl9CQUNLV0FSRCA6IFRBQl9OQVZfRk9SV0FSRDtcbiAgfVxufVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9zY3JvbGxCYXIuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgU0VMRUNUT1JfRklYRURfQ09OVEVOVCA9ICcuZml4ZWQtdG9wLCAuZml4ZWQtYm90dG9tLCAuaXMtZml4ZWQsIC5zdGlja3ktdG9wJztcbmNvbnN0IFNFTEVDVE9SX1NUSUNLWV9DT05URU5UID0gJy5zdGlja3ktdG9wJztcbmNvbnN0IFBST1BFUlRZX1BBRERJTkcgPSAncGFkZGluZy1yaWdodCc7XG5jb25zdCBQUk9QRVJUWV9NQVJHSU4gPSAnbWFyZ2luLXJpZ2h0JztcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgU2Nyb2xsQmFySGVscGVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fZWxlbWVudCA9IGRvY3VtZW50LmJvZHk7XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgZ2V0V2lkdGgoKSB7XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvdy9pbm5lcldpZHRoI3VzYWdlX25vdGVzXG4gICAgY29uc3QgZG9jdW1lbnRXaWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICByZXR1cm4gTWF0aC5hYnMod2luZG93LmlubmVyV2lkdGggLSBkb2N1bWVudFdpZHRoKTtcbiAgfVxuICBoaWRlKCkge1xuICAgIGNvbnN0IHdpZHRoID0gdGhpcy5nZXRXaWR0aCgpO1xuICAgIHRoaXMuX2Rpc2FibGVPdmVyRmxvdygpO1xuICAgIC8vIGdpdmUgcGFkZGluZyB0byBlbGVtZW50IHRvIGJhbGFuY2UgdGhlIGhpZGRlbiBzY3JvbGxiYXIgd2lkdGhcbiAgICB0aGlzLl9zZXRFbGVtZW50QXR0cmlidXRlcyh0aGlzLl9lbGVtZW50LCBQUk9QRVJUWV9QQURESU5HLCBjYWxjdWxhdGVkVmFsdWUgPT4gY2FsY3VsYXRlZFZhbHVlICsgd2lkdGgpO1xuICAgIC8vIHRyaWNrOiBXZSBhZGp1c3QgcG9zaXRpdmUgcGFkZGluZ1JpZ2h0IGFuZCBuZWdhdGl2ZSBtYXJnaW5SaWdodCB0byBzdGlja3ktdG9wIGVsZW1lbnRzIHRvIGtlZXAgc2hvd2luZyBmdWxsd2lkdGhcbiAgICB0aGlzLl9zZXRFbGVtZW50QXR0cmlidXRlcyhTRUxFQ1RPUl9GSVhFRF9DT05URU5ULCBQUk9QRVJUWV9QQURESU5HLCBjYWxjdWxhdGVkVmFsdWUgPT4gY2FsY3VsYXRlZFZhbHVlICsgd2lkdGgpO1xuICAgIHRoaXMuX3NldEVsZW1lbnRBdHRyaWJ1dGVzKFNFTEVDVE9SX1NUSUNLWV9DT05URU5ULCBQUk9QRVJUWV9NQVJHSU4sIGNhbGN1bGF0ZWRWYWx1ZSA9PiBjYWxjdWxhdGVkVmFsdWUgLSB3aWR0aCk7XG4gIH1cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5fcmVzZXRFbGVtZW50QXR0cmlidXRlcyh0aGlzLl9lbGVtZW50LCAnb3ZlcmZsb3cnKTtcbiAgICB0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQsIFBST1BFUlRZX1BBRERJTkcpO1xuICAgIHRoaXMuX3Jlc2V0RWxlbWVudEF0dHJpYnV0ZXMoU0VMRUNUT1JfRklYRURfQ09OVEVOVCwgUFJPUEVSVFlfUEFERElORyk7XG4gICAgdGhpcy5fcmVzZXRFbGVtZW50QXR0cmlidXRlcyhTRUxFQ1RPUl9TVElDS1lfQ09OVEVOVCwgUFJPUEVSVFlfTUFSR0lOKTtcbiAgfVxuICBpc092ZXJmbG93aW5nKCkge1xuICAgIHJldHVybiB0aGlzLmdldFdpZHRoKCkgPiAwO1xuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfZGlzYWJsZU92ZXJGbG93KCkge1xuICAgIHRoaXMuX3NhdmVJbml0aWFsQXR0cmlidXRlKHRoaXMuX2VsZW1lbnQsICdvdmVyZmxvdycpO1xuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgfVxuICBfc2V0RWxlbWVudEF0dHJpYnV0ZXMoc2VsZWN0b3IsIHN0eWxlUHJvcGVydHksIGNhbGxiYWNrKSB7XG4gICAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSB0aGlzLmdldFdpZHRoKCk7XG4gICAgY29uc3QgbWFuaXB1bGF0aW9uQ2FsbEJhY2sgPSBlbGVtZW50ID0+IHtcbiAgICAgIGlmIChlbGVtZW50ICE9PSB0aGlzLl9lbGVtZW50ICYmIHdpbmRvdy5pbm5lcldpZHRoID4gZWxlbWVudC5jbGllbnRXaWR0aCArIHNjcm9sbGJhcldpZHRoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3NhdmVJbml0aWFsQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHkpO1xuICAgICAgY29uc3QgY2FsY3VsYXRlZFZhbHVlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShzdHlsZVByb3BlcnR5KTtcbiAgICAgIGVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoc3R5bGVQcm9wZXJ0eSwgYCR7Y2FsbGJhY2soTnVtYmVyLnBhcnNlRmxvYXQoY2FsY3VsYXRlZFZhbHVlKSl9cHhgKTtcbiAgICB9O1xuICAgIHRoaXMuX2FwcGx5TWFuaXB1bGF0aW9uQ2FsbGJhY2soc2VsZWN0b3IsIG1hbmlwdWxhdGlvbkNhbGxCYWNrKTtcbiAgfVxuICBfc2F2ZUluaXRpYWxBdHRyaWJ1dGUoZWxlbWVudCwgc3R5bGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IGFjdHVhbFZhbHVlID0gZWxlbWVudC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKHN0eWxlUHJvcGVydHkpO1xuICAgIGlmIChhY3R1YWxWYWx1ZSkge1xuICAgICAgTWFuaXB1bGF0b3Iuc2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCBzdHlsZVByb3BlcnR5LCBhY3R1YWxWYWx1ZSk7XG4gICAgfVxuICB9XG4gIF9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKHNlbGVjdG9yLCBzdHlsZVByb3BlcnR5KSB7XG4gICAgY29uc3QgbWFuaXB1bGF0aW9uQ2FsbEJhY2sgPSBlbGVtZW50ID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gTWFuaXB1bGF0b3IuZ2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCBzdHlsZVByb3BlcnR5KTtcbiAgICAgIC8vIFdlIG9ubHkgd2FudCB0byByZW1vdmUgdGhlIHByb3BlcnR5IGlmIHRoZSB2YWx1ZSBpcyBgbnVsbGA7IHRoZSB2YWx1ZSBjYW4gYWxzbyBiZSB6ZXJvXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eShzdHlsZVByb3BlcnR5KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgTWFuaXB1bGF0b3IucmVtb3ZlRGF0YUF0dHJpYnV0ZShlbGVtZW50LCBzdHlsZVByb3BlcnR5KTtcbiAgICAgIGVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoc3R5bGVQcm9wZXJ0eSwgdmFsdWUpO1xuICAgIH07XG4gICAgdGhpcy5fYXBwbHlNYW5pcHVsYXRpb25DYWxsYmFjayhzZWxlY3RvciwgbWFuaXB1bGF0aW9uQ2FsbEJhY2spO1xuICB9XG4gIF9hcHBseU1hbmlwdWxhdGlvbkNhbGxiYWNrKHNlbGVjdG9yLCBjYWxsQmFjaykge1xuICAgIGlmIChpc0VsZW1lbnQoc2VsZWN0b3IpKSB7XG4gICAgICBjYWxsQmFjayhzZWxlY3Rvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc2VsIG9mIFNlbGVjdG9yRW5naW5lLmZpbmQoc2VsZWN0b3IsIHRoaXMuX2VsZW1lbnQpKSB7XG4gICAgICBjYWxsQmFjayhzZWwpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgbW9kYWwuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSQ3ID0gJ21vZGFsJztcbmNvbnN0IERBVEFfS0VZJDQgPSAnYnMubW9kYWwnO1xuY29uc3QgRVZFTlRfS0VZJDQgPSBgLiR7REFUQV9LRVkkNH1gO1xuY29uc3QgREFUQV9BUElfS0VZJDIgPSAnLmRhdGEtYXBpJztcbmNvbnN0IEVTQ0FQRV9LRVkkMSA9ICdFc2NhcGUnO1xuY29uc3QgRVZFTlRfSElERSQ0ID0gYGhpZGUke0VWRU5UX0tFWSQ0fWA7XG5jb25zdCBFVkVOVF9ISURFX1BSRVZFTlRFRCQxID0gYGhpZGVQcmV2ZW50ZWQke0VWRU5UX0tFWSQ0fWA7XG5jb25zdCBFVkVOVF9ISURERU4kNCA9IGBoaWRkZW4ke0VWRU5UX0tFWSQ0fWA7XG5jb25zdCBFVkVOVF9TSE9XJDQgPSBgc2hvdyR7RVZFTlRfS0VZJDR9YDtcbmNvbnN0IEVWRU5UX1NIT1dOJDQgPSBgc2hvd24ke0VWRU5UX0tFWSQ0fWA7XG5jb25zdCBFVkVOVF9SRVNJWkUkMSA9IGByZXNpemUke0VWRU5UX0tFWSQ0fWA7XG5jb25zdCBFVkVOVF9DTElDS19ESVNNSVNTID0gYGNsaWNrLmRpc21pc3Mke0VWRU5UX0tFWSQ0fWA7XG5jb25zdCBFVkVOVF9NT1VTRURPV05fRElTTUlTUyA9IGBtb3VzZWRvd24uZGlzbWlzcyR7RVZFTlRfS0VZJDR9YDtcbmNvbnN0IEVWRU5UX0tFWURPV05fRElTTUlTUyQxID0gYGtleWRvd24uZGlzbWlzcyR7RVZFTlRfS0VZJDR9YDtcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJJDIgPSBgY2xpY2ske0VWRU5UX0tFWSQ0fSR7REFUQV9BUElfS0VZJDJ9YDtcbmNvbnN0IENMQVNTX05BTUVfT1BFTiA9ICdtb2RhbC1vcGVuJztcbmNvbnN0IENMQVNTX05BTUVfRkFERSQzID0gJ2ZhZGUnO1xuY29uc3QgQ0xBU1NfTkFNRV9TSE9XJDQgPSAnc2hvdyc7XG5jb25zdCBDTEFTU19OQU1FX1NUQVRJQyA9ICdtb2RhbC1zdGF0aWMnO1xuY29uc3QgT1BFTl9TRUxFQ1RPUiQxID0gJy5tb2RhbC5zaG93JztcbmNvbnN0IFNFTEVDVE9SX0RJQUxPRyA9ICcubW9kYWwtZGlhbG9nJztcbmNvbnN0IFNFTEVDVE9SX01PREFMX0JPRFkgPSAnLm1vZGFsLWJvZHknO1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUkMiA9ICdbZGF0YS1icy10b2dnbGU9XCJtb2RhbFwiXSc7XG5jb25zdCBEZWZhdWx0JDYgPSB7XG4gIGJhY2tkcm9wOiB0cnVlLFxuICBmb2N1czogdHJ1ZSxcbiAga2V5Ym9hcmQ6IHRydWVcbn07XG5jb25zdCBEZWZhdWx0VHlwZSQ2ID0ge1xuICBiYWNrZHJvcDogJyhib29sZWFufHN0cmluZyknLFxuICBmb2N1czogJ2Jvb2xlYW4nLFxuICBrZXlib2FyZDogJ2Jvb2xlYW4nXG59O1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBNb2RhbCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpO1xuICAgIHRoaXMuX2RpYWxvZyA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfRElBTE9HLCB0aGlzLl9lbGVtZW50KTtcbiAgICB0aGlzLl9iYWNrZHJvcCA9IHRoaXMuX2luaXRpYWxpemVCYWNrRHJvcCgpO1xuICAgIHRoaXMuX2ZvY3VzdHJhcCA9IHRoaXMuX2luaXRpYWxpemVGb2N1c1RyYXAoKTtcbiAgICB0aGlzLl9pc1Nob3duID0gZmFsc2U7XG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICAgdGhpcy5fc2Nyb2xsQmFyID0gbmV3IFNjcm9sbEJhckhlbHBlcigpO1xuICAgIHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKCk7XG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdCQ2O1xuICB9XG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlJDY7XG4gIH1cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FJDc7XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgdG9nZ2xlKHJlbGF0ZWRUYXJnZXQpIHtcbiAgICByZXR1cm4gdGhpcy5faXNTaG93biA/IHRoaXMuaGlkZSgpIDogdGhpcy5zaG93KHJlbGF0ZWRUYXJnZXQpO1xuICB9XG4gIHNob3cocmVsYXRlZFRhcmdldCkge1xuICAgIGlmICh0aGlzLl9pc1Nob3duIHx8IHRoaXMuX2lzVHJhbnNpdGlvbmluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XJDQsIHtcbiAgICAgIHJlbGF0ZWRUYXJnZXRcbiAgICB9KTtcbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5faXNTaG93biA9IHRydWU7XG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZTtcbiAgICB0aGlzLl9zY3JvbGxCYXIuaGlkZSgpO1xuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX09QRU4pO1xuICAgIHRoaXMuX2FkanVzdERpYWxvZygpO1xuICAgIHRoaXMuX2JhY2tkcm9wLnNob3coKCkgPT4gdGhpcy5fc2hvd0VsZW1lbnQocmVsYXRlZFRhcmdldCkpO1xuICB9XG4gIGhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLl9pc1Nob3duIHx8IHRoaXMuX2lzVHJhbnNpdGlvbmluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFJDQpO1xuICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9pc1Nob3duID0gZmFsc2U7XG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZTtcbiAgICB0aGlzLl9mb2N1c3RyYXAuZGVhY3RpdmF0ZSgpO1xuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1ckNCk7XG4gICAgdGhpcy5fcXVldWVDYWxsYmFjaygoKSA9PiB0aGlzLl9oaWRlTW9kYWwoKSwgdGhpcy5fZWxlbWVudCwgdGhpcy5faXNBbmltYXRlZCgpKTtcbiAgfVxuICBkaXNwb3NlKCkge1xuICAgIEV2ZW50SGFuZGxlci5vZmYod2luZG93LCBFVkVOVF9LRVkkNCk7XG4gICAgRXZlbnRIYW5kbGVyLm9mZih0aGlzLl9kaWFsb2csIEVWRU5UX0tFWSQ0KTtcbiAgICB0aGlzLl9iYWNrZHJvcC5kaXNwb3NlKCk7XG4gICAgdGhpcy5fZm9jdXN0cmFwLmRlYWN0aXZhdGUoKTtcbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cbiAgaGFuZGxlVXBkYXRlKCkge1xuICAgIHRoaXMuX2FkanVzdERpYWxvZygpO1xuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfaW5pdGlhbGl6ZUJhY2tEcm9wKCkge1xuICAgIHJldHVybiBuZXcgQmFja2Ryb3Aoe1xuICAgICAgaXNWaXNpYmxlOiBCb29sZWFuKHRoaXMuX2NvbmZpZy5iYWNrZHJvcCksXG4gICAgICAvLyAnc3RhdGljJyBvcHRpb24gd2lsbCBiZSB0cmFuc2xhdGVkIHRvIHRydWUsIGFuZCBib29sZWFucyB3aWxsIGtlZXAgdGhlaXIgdmFsdWUsXG4gICAgICBpc0FuaW1hdGVkOiB0aGlzLl9pc0FuaW1hdGVkKClcbiAgICB9KTtcbiAgfVxuICBfaW5pdGlhbGl6ZUZvY3VzVHJhcCgpIHtcbiAgICByZXR1cm4gbmV3IEZvY3VzVHJhcCh7XG4gICAgICB0cmFwRWxlbWVudDogdGhpcy5fZWxlbWVudFxuICAgIH0pO1xuICB9XG4gIF9zaG93RWxlbWVudChyZWxhdGVkVGFyZ2V0KSB7XG4gICAgLy8gdHJ5IHRvIGFwcGVuZCBkeW5hbWljIG1vZGFsXG4gICAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKHRoaXMuX2VsZW1lbnQpKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZCh0aGlzLl9lbGVtZW50KTtcbiAgICB9XG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nKTtcbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1tb2RhbCcsIHRydWUpO1xuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2RpYWxvZycpO1xuICAgIHRoaXMuX2VsZW1lbnQuc2Nyb2xsVG9wID0gMDtcbiAgICBjb25zdCBtb2RhbEJvZHkgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX01PREFMX0JPRFksIHRoaXMuX2RpYWxvZyk7XG4gICAgaWYgKG1vZGFsQm9keSkge1xuICAgICAgbW9kYWxCb2R5LnNjcm9sbFRvcCA9IDA7XG4gICAgfVxuICAgIHJlZmxvdyh0aGlzLl9lbGVtZW50KTtcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XJDQpO1xuICAgIGNvbnN0IHRyYW5zaXRpb25Db21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9jb25maWcuZm9jdXMpIHtcbiAgICAgICAgdGhpcy5fZm9jdXN0cmFwLmFjdGl2YXRlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1dOJDQsIHtcbiAgICAgICAgcmVsYXRlZFRhcmdldFxuICAgICAgfSk7XG4gICAgfTtcbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKHRyYW5zaXRpb25Db21wbGV0ZSwgdGhpcy5fZGlhbG9nLCB0aGlzLl9pc0FuaW1hdGVkKCkpO1xuICB9XG4gIF9hZGRFdmVudExpc3RlbmVycygpIHtcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZRE9XTl9ESVNNSVNTJDEsIGV2ZW50ID0+IHtcbiAgICAgIGlmIChldmVudC5rZXkgIT09IEVTQ0FQRV9LRVkkMSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fY29uZmlnLmtleWJvYXJkKSB7XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uKCk7XG4gICAgfSk7XG4gICAgRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfUkVTSVpFJDEsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9pc1Nob3duICYmICF0aGlzLl9pc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgICAgdGhpcy5fYWRqdXN0RGlhbG9nKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFRE9XTl9ESVNNSVNTLCBldmVudCA9PiB7XG4gICAgICAvLyBhIGJhZCB0cmljayB0byBzZWdyZWdhdGUgY2xpY2tzIHRoYXQgbWF5IHN0YXJ0IGluc2lkZSBkaWFsb2cgYnV0IGVuZCBvdXRzaWRlLCBhbmQgYXZvaWQgbGlzdGVuIHRvIHNjcm9sbGJhciBjbGlja3NcbiAgICAgIEV2ZW50SGFuZGxlci5vbmUodGhpcy5fZWxlbWVudCwgRVZFTlRfQ0xJQ0tfRElTTUlTUywgZXZlbnQyID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2VsZW1lbnQgIT09IGV2ZW50LnRhcmdldCB8fCB0aGlzLl9lbGVtZW50ICE9PSBldmVudDIudGFyZ2V0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jb25maWcuYmFja2Ryb3AgPT09ICdzdGF0aWMnKSB7XG4gICAgICAgICAgdGhpcy5fdHJpZ2dlckJhY2tkcm9wVHJhbnNpdGlvbigpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fY29uZmlnLmJhY2tkcm9wKSB7XG4gICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIF9oaWRlTW9kYWwoKSB7XG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsIHRydWUpO1xuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLW1vZGFsJyk7XG4gICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3JvbGUnKTtcbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9iYWNrZHJvcC5oaWRlKCgpID0+IHtcbiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX09QRU4pO1xuICAgICAgdGhpcy5fcmVzZXRBZGp1c3RtZW50cygpO1xuICAgICAgdGhpcy5fc2Nyb2xsQmFyLnJlc2V0KCk7XG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURERU4kNCk7XG4gICAgfSk7XG4gIH1cbiAgX2lzQW5pbWF0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRkFERSQzKTtcbiAgfVxuICBfdHJpZ2dlckJhY2tkcm9wVHJhbnNpdGlvbigpIHtcbiAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFX1BSRVZFTlRFRCQxKTtcbiAgICBpZiAoaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaXNNb2RhbE92ZXJmbG93aW5nID0gdGhpcy5fZWxlbWVudC5zY3JvbGxIZWlnaHQgPiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgIGNvbnN0IGluaXRpYWxPdmVyZmxvd1kgPSB0aGlzLl9lbGVtZW50LnN0eWxlLm92ZXJmbG93WTtcbiAgICAvLyByZXR1cm4gaWYgdGhlIGZvbGxvd2luZyBiYWNrZ3JvdW5kIHRyYW5zaXRpb24gaGFzbid0IHlldCBjb21wbGV0ZWRcbiAgICBpZiAoaW5pdGlhbE92ZXJmbG93WSA9PT0gJ2hpZGRlbicgfHwgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TVEFUSUMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghaXNNb2RhbE92ZXJmbG93aW5nKSB7XG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nO1xuICAgIH1cbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TVEFUSUMpO1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU1RBVElDKTtcbiAgICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9IGluaXRpYWxPdmVyZmxvd1k7XG4gICAgICB9LCB0aGlzLl9kaWFsb2cpO1xuICAgIH0sIHRoaXMuX2RpYWxvZyk7XG4gICAgdGhpcy5fZWxlbWVudC5mb2N1cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgdXNlZCB0byBoYW5kbGUgb3ZlcmZsb3dpbmcgbW9kYWxzXG4gICAqL1xuXG4gIF9hZGp1c3REaWFsb2coKSB7XG4gICAgY29uc3QgaXNNb2RhbE92ZXJmbG93aW5nID0gdGhpcy5fZWxlbWVudC5zY3JvbGxIZWlnaHQgPiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgIGNvbnN0IHNjcm9sbGJhcldpZHRoID0gdGhpcy5fc2Nyb2xsQmFyLmdldFdpZHRoKCk7XG4gICAgY29uc3QgaXNCb2R5T3ZlcmZsb3dpbmcgPSBzY3JvbGxiYXJXaWR0aCA+IDA7XG4gICAgaWYgKGlzQm9keU92ZXJmbG93aW5nICYmICFpc01vZGFsT3ZlcmZsb3dpbmcpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0gaXNSVEwoKSA/ICdwYWRkaW5nTGVmdCcgOiAncGFkZGluZ1JpZ2h0JztcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbcHJvcGVydHldID0gYCR7c2Nyb2xsYmFyV2lkdGh9cHhgO1xuICAgIH1cbiAgICBpZiAoIWlzQm9keU92ZXJmbG93aW5nICYmIGlzTW9kYWxPdmVyZmxvd2luZykge1xuICAgICAgY29uc3QgcHJvcGVydHkgPSBpc1JUTCgpID8gJ3BhZGRpbmdSaWdodCcgOiAncGFkZGluZ0xlZnQnO1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtwcm9wZXJ0eV0gPSBgJHtzY3JvbGxiYXJXaWR0aH1weGA7XG4gICAgfVxuICB9XG4gIF9yZXNldEFkanVzdG1lbnRzKCkge1xuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ0xlZnQgPSAnJztcbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnBhZGRpbmdSaWdodCA9ICcnO1xuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnLCByZWxhdGVkVGFyZ2V0KSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gTW9kYWwuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgfVxuICAgICAgZGF0YVtjb25maWddKHJlbGF0ZWRUYXJnZXQpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJJDIsIFNFTEVDVE9SX0RBVEFfVE9HR0xFJDIsIGZ1bmN0aW9uIChldmVudCkge1xuICBjb25zdCB0YXJnZXQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKHRoaXMpO1xuICBpZiAoWydBJywgJ0FSRUEnXS5pbmNsdWRlcyh0aGlzLnRhZ05hbWUpKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuICBFdmVudEhhbmRsZXIub25lKHRhcmdldCwgRVZFTlRfU0hPVyQ0LCBzaG93RXZlbnQgPT4ge1xuICAgIGlmIChzaG93RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgLy8gb25seSByZWdpc3RlciBmb2N1cyByZXN0b3JlciBpZiBtb2RhbCB3aWxsIGFjdHVhbGx5IGdldCBzaG93blxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBFdmVudEhhbmRsZXIub25lKHRhcmdldCwgRVZFTlRfSElEREVOJDQsICgpID0+IHtcbiAgICAgIGlmIChpc1Zpc2libGUodGhpcykpIHtcbiAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICAvLyBhdm9pZCBjb25mbGljdCB3aGVuIGNsaWNraW5nIG1vZGFsIHRvZ2dsZXIgd2hpbGUgYW5vdGhlciBvbmUgaXMgb3BlblxuICBjb25zdCBhbHJlYWR5T3BlbiA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoT1BFTl9TRUxFQ1RPUiQxKTtcbiAgaWYgKGFscmVhZHlPcGVuKSB7XG4gICAgTW9kYWwuZ2V0SW5zdGFuY2UoYWxyZWFkeU9wZW4pLmhpZGUoKTtcbiAgfVxuICBjb25zdCBkYXRhID0gTW9kYWwuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0YXJnZXQpO1xuICBkYXRhLnRvZ2dsZSh0aGlzKTtcbn0pO1xuZW5hYmxlRGlzbWlzc1RyaWdnZXIoTW9kYWwpO1xuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihNb2RhbCk7XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBvZmZjYW52YXMuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSQ2ID0gJ29mZmNhbnZhcyc7XG5jb25zdCBEQVRBX0tFWSQzID0gJ2JzLm9mZmNhbnZhcyc7XG5jb25zdCBFVkVOVF9LRVkkMyA9IGAuJHtEQVRBX0tFWSQzfWA7XG5jb25zdCBEQVRBX0FQSV9LRVkkMSA9ICcuZGF0YS1hcGknO1xuY29uc3QgRVZFTlRfTE9BRF9EQVRBX0FQSSQyID0gYGxvYWQke0VWRU5UX0tFWSQzfSR7REFUQV9BUElfS0VZJDF9YDtcbmNvbnN0IEVTQ0FQRV9LRVkgPSAnRXNjYXBlJztcbmNvbnN0IENMQVNTX05BTUVfU0hPVyQzID0gJ3Nob3cnO1xuY29uc3QgQ0xBU1NfTkFNRV9TSE9XSU5HJDEgPSAnc2hvd2luZyc7XG5jb25zdCBDTEFTU19OQU1FX0hJRElORyA9ICdoaWRpbmcnO1xuY29uc3QgQ0xBU1NfTkFNRV9CQUNLRFJPUCA9ICdvZmZjYW52YXMtYmFja2Ryb3AnO1xuY29uc3QgT1BFTl9TRUxFQ1RPUiA9ICcub2ZmY2FudmFzLnNob3cnO1xuY29uc3QgRVZFTlRfU0hPVyQzID0gYHNob3cke0VWRU5UX0tFWSQzfWA7XG5jb25zdCBFVkVOVF9TSE9XTiQzID0gYHNob3duJHtFVkVOVF9LRVkkM31gO1xuY29uc3QgRVZFTlRfSElERSQzID0gYGhpZGUke0VWRU5UX0tFWSQzfWA7XG5jb25zdCBFVkVOVF9ISURFX1BSRVZFTlRFRCA9IGBoaWRlUHJldmVudGVkJHtFVkVOVF9LRVkkM31gO1xuY29uc3QgRVZFTlRfSElEREVOJDMgPSBgaGlkZGVuJHtFVkVOVF9LRVkkM31gO1xuY29uc3QgRVZFTlRfUkVTSVpFID0gYHJlc2l6ZSR7RVZFTlRfS0VZJDN9YDtcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJJDEgPSBgY2xpY2ske0VWRU5UX0tFWSQzfSR7REFUQV9BUElfS0VZJDF9YDtcbmNvbnN0IEVWRU5UX0tFWURPV05fRElTTUlTUyA9IGBrZXlkb3duLmRpc21pc3Mke0VWRU5UX0tFWSQzfWA7XG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQxID0gJ1tkYXRhLWJzLXRvZ2dsZT1cIm9mZmNhbnZhc1wiXSc7XG5jb25zdCBEZWZhdWx0JDUgPSB7XG4gIGJhY2tkcm9wOiB0cnVlLFxuICBrZXlib2FyZDogdHJ1ZSxcbiAgc2Nyb2xsOiBmYWxzZVxufTtcbmNvbnN0IERlZmF1bHRUeXBlJDUgPSB7XG4gIGJhY2tkcm9wOiAnKGJvb2xlYW58c3RyaW5nKScsXG4gIGtleWJvYXJkOiAnYm9vbGVhbicsXG4gIHNjcm9sbDogJ2Jvb2xlYW4nXG59O1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBPZmZjYW52YXMgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKTtcbiAgICB0aGlzLl9pc1Nob3duID0gZmFsc2U7XG4gICAgdGhpcy5fYmFja2Ryb3AgPSB0aGlzLl9pbml0aWFsaXplQmFja0Ryb3AoKTtcbiAgICB0aGlzLl9mb2N1c3RyYXAgPSB0aGlzLl9pbml0aWFsaXplRm9jdXNUcmFwKCk7XG4gICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0JDU7XG4gIH1cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGUkNTtcbiAgfVxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUUkNjtcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICB0b2dnbGUocmVsYXRlZFRhcmdldCkge1xuICAgIHJldHVybiB0aGlzLl9pc1Nob3duID8gdGhpcy5oaWRlKCkgOiB0aGlzLnNob3cocmVsYXRlZFRhcmdldCk7XG4gIH1cbiAgc2hvdyhyZWxhdGVkVGFyZ2V0KSB7XG4gICAgaWYgKHRoaXMuX2lzU2hvd24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2hvd0V2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPVyQzLCB7XG4gICAgICByZWxhdGVkVGFyZ2V0XG4gICAgfSk7XG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2lzU2hvd24gPSB0cnVlO1xuICAgIHRoaXMuX2JhY2tkcm9wLnNob3coKTtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5zY3JvbGwpIHtcbiAgICAgIG5ldyBTY3JvbGxCYXJIZWxwZXIoKS5oaWRlKCk7XG4gICAgfVxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLW1vZGFsJywgdHJ1ZSk7XG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnZGlhbG9nJyk7XG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPV0lORyQxKTtcbiAgICBjb25zdCBjb21wbGV0ZUNhbGxCYWNrID0gKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9jb25maWcuc2Nyb2xsIHx8IHRoaXMuX2NvbmZpZy5iYWNrZHJvcCkge1xuICAgICAgICB0aGlzLl9mb2N1c3RyYXAuYWN0aXZhdGUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1ckMyk7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XSU5HJDEpO1xuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPV04kMywge1xuICAgICAgICByZWxhdGVkVGFyZ2V0XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGVDYWxsQmFjaywgdGhpcy5fZWxlbWVudCwgdHJ1ZSk7XG4gIH1cbiAgaGlkZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzU2hvd24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERSQzKTtcbiAgICBpZiAoaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fZm9jdXN0cmFwLmRlYWN0aXZhdGUoKTtcbiAgICB0aGlzLl9lbGVtZW50LmJsdXIoKTtcbiAgICB0aGlzLl9pc1Nob3duID0gZmFsc2U7XG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfSElESU5HKTtcbiAgICB0aGlzLl9iYWNrZHJvcC5oaWRlKCk7XG4gICAgY29uc3QgY29tcGxldGVDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1ckMywgQ0xBU1NfTkFNRV9ISURJTkcpO1xuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdyb2xlJyk7XG4gICAgICBpZiAoIXRoaXMuX2NvbmZpZy5zY3JvbGwpIHtcbiAgICAgICAgbmV3IFNjcm9sbEJhckhlbHBlcigpLnJlc2V0KCk7XG4gICAgICB9XG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURERU4kMyk7XG4gICAgfTtcbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlQ2FsbGJhY2ssIHRoaXMuX2VsZW1lbnQsIHRydWUpO1xuICB9XG4gIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5fYmFja2Ryb3AuZGlzcG9zZSgpO1xuICAgIHRoaXMuX2ZvY3VzdHJhcC5kZWFjdGl2YXRlKCk7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfaW5pdGlhbGl6ZUJhY2tEcm9wKCkge1xuICAgIGNvbnN0IGNsaWNrQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fY29uZmlnLmJhY2tkcm9wID09PSAnc3RhdGljJykge1xuICAgICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFX1BSRVZFTlRFRCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgIH07XG5cbiAgICAvLyAnc3RhdGljJyBvcHRpb24gd2lsbCBiZSB0cmFuc2xhdGVkIHRvIHRydWUsIGFuZCBib29sZWFucyB3aWxsIGtlZXAgdGhlaXIgdmFsdWVcbiAgICBjb25zdCBpc1Zpc2libGUgPSBCb29sZWFuKHRoaXMuX2NvbmZpZy5iYWNrZHJvcCk7XG4gICAgcmV0dXJuIG5ldyBCYWNrZHJvcCh7XG4gICAgICBjbGFzc05hbWU6IENMQVNTX05BTUVfQkFDS0RST1AsXG4gICAgICBpc1Zpc2libGUsXG4gICAgICBpc0FuaW1hdGVkOiB0cnVlLFxuICAgICAgcm9vdEVsZW1lbnQ6IHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZSxcbiAgICAgIGNsaWNrQ2FsbGJhY2s6IGlzVmlzaWJsZSA/IGNsaWNrQ2FsbGJhY2sgOiBudWxsXG4gICAgfSk7XG4gIH1cbiAgX2luaXRpYWxpemVGb2N1c1RyYXAoKSB7XG4gICAgcmV0dXJuIG5ldyBGb2N1c1RyYXAoe1xuICAgICAgdHJhcEVsZW1lbnQ6IHRoaXMuX2VsZW1lbnRcbiAgICB9KTtcbiAgfVxuICBfYWRkRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0tFWURPV05fRElTTUlTUywgZXZlbnQgPT4ge1xuICAgICAgaWYgKGV2ZW50LmtleSAhPT0gRVNDQVBFX0tFWSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fY29uZmlnLmtleWJvYXJkKSB7XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFX1BSRVZFTlRFRCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBPZmZjYW52YXMuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgfVxuICAgICAgZGF0YVtjb25maWddKHRoaXMpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJJDEsIFNFTEVDVE9SX0RBVEFfVE9HR0xFJDEsIGZ1bmN0aW9uIChldmVudCkge1xuICBjb25zdCB0YXJnZXQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKHRoaXMpO1xuICBpZiAoWydBJywgJ0FSRUEnXS5pbmNsdWRlcyh0aGlzLnRhZ05hbWUpKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuICBpZiAoaXNEaXNhYmxlZCh0aGlzKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBFdmVudEhhbmRsZXIub25lKHRhcmdldCwgRVZFTlRfSElEREVOJDMsICgpID0+IHtcbiAgICAvLyBmb2N1cyBvbiB0cmlnZ2VyIHdoZW4gaXQgaXMgY2xvc2VkXG4gICAgaWYgKGlzVmlzaWJsZSh0aGlzKSkge1xuICAgICAgdGhpcy5mb2N1cygpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gYXZvaWQgY29uZmxpY3Qgd2hlbiBjbGlja2luZyBhIHRvZ2dsZXIgb2YgYW4gb2ZmY2FudmFzLCB3aGlsZSBhbm90aGVyIGlzIG9wZW5cbiAgY29uc3QgYWxyZWFkeU9wZW4gPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKE9QRU5fU0VMRUNUT1IpO1xuICBpZiAoYWxyZWFkeU9wZW4gJiYgYWxyZWFkeU9wZW4gIT09IHRhcmdldCkge1xuICAgIE9mZmNhbnZhcy5nZXRJbnN0YW5jZShhbHJlYWR5T3BlbikuaGlkZSgpO1xuICB9XG4gIGNvbnN0IGRhdGEgPSBPZmZjYW52YXMuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0YXJnZXQpO1xuICBkYXRhLnRvZ2dsZSh0aGlzKTtcbn0pO1xuRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfTE9BRF9EQVRBX0FQSSQyLCAoKSA9PiB7XG4gIGZvciAoY29uc3Qgc2VsZWN0b3Igb2YgU2VsZWN0b3JFbmdpbmUuZmluZChPUEVOX1NFTEVDVE9SKSkge1xuICAgIE9mZmNhbnZhcy5nZXRPckNyZWF0ZUluc3RhbmNlKHNlbGVjdG9yKS5zaG93KCk7XG4gIH1cbn0pO1xuRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfUkVTSVpFLCAoKSA9PiB7XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBTZWxlY3RvckVuZ2luZS5maW5kKCdbYXJpYS1tb2RhbF1bY2xhc3MqPXNob3ddW2NsYXNzKj1vZmZjYW52YXMtXScpKSB7XG4gICAgaWYgKGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24gIT09ICdmaXhlZCcpIHtcbiAgICAgIE9mZmNhbnZhcy5nZXRPckNyZWF0ZUluc3RhbmNlKGVsZW1lbnQpLmhpZGUoKTtcbiAgICB9XG4gIH1cbn0pO1xuZW5hYmxlRGlzbWlzc1RyaWdnZXIoT2ZmY2FudmFzKTtcblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oT2ZmY2FudmFzKTtcblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHV0aWwvc2FuaXRpemVyLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuLy8ganMtZG9jcy1zdGFydCBhbGxvdy1saXN0XG5jb25zdCBBUklBX0FUVFJJQlVURV9QQVRURVJOID0gL15hcmlhLVtcXHctXSokL2k7XG5jb25zdCBEZWZhdWx0QWxsb3dsaXN0ID0ge1xuICAvLyBHbG9iYWwgYXR0cmlidXRlcyBhbGxvd2VkIG9uIGFueSBzdXBwbGllZCBlbGVtZW50IGJlbG93LlxuICAnKic6IFsnY2xhc3MnLCAnZGlyJywgJ2lkJywgJ2xhbmcnLCAncm9sZScsIEFSSUFfQVRUUklCVVRFX1BBVFRFUk5dLFxuICBhOiBbJ3RhcmdldCcsICdocmVmJywgJ3RpdGxlJywgJ3JlbCddLFxuICBhcmVhOiBbXSxcbiAgYjogW10sXG4gIGJyOiBbXSxcbiAgY29sOiBbXSxcbiAgY29kZTogW10sXG4gIGRkOiBbXSxcbiAgZGl2OiBbXSxcbiAgZGw6IFtdLFxuICBkdDogW10sXG4gIGVtOiBbXSxcbiAgaHI6IFtdLFxuICBoMTogW10sXG4gIGgyOiBbXSxcbiAgaDM6IFtdLFxuICBoNDogW10sXG4gIGg1OiBbXSxcbiAgaDY6IFtdLFxuICBpOiBbXSxcbiAgaW1nOiBbJ3NyYycsICdzcmNzZXQnLCAnYWx0JywgJ3RpdGxlJywgJ3dpZHRoJywgJ2hlaWdodCddLFxuICBsaTogW10sXG4gIG9sOiBbXSxcbiAgcDogW10sXG4gIHByZTogW10sXG4gIHM6IFtdLFxuICBzbWFsbDogW10sXG4gIHNwYW46IFtdLFxuICBzdWI6IFtdLFxuICBzdXA6IFtdLFxuICBzdHJvbmc6IFtdLFxuICB1OiBbXSxcbiAgdWw6IFtdXG59O1xuLy8ganMtZG9jcy1lbmQgYWxsb3ctbGlzdFxuXG5jb25zdCB1cmlBdHRyaWJ1dGVzID0gbmV3IFNldChbJ2JhY2tncm91bmQnLCAnY2l0ZScsICdocmVmJywgJ2l0ZW10eXBlJywgJ2xvbmdkZXNjJywgJ3Bvc3RlcicsICdzcmMnLCAneGxpbms6aHJlZiddKTtcblxuLyoqXG4gKiBBIHBhdHRlcm4gdGhhdCByZWNvZ25pemVzIFVSTHMgdGhhdCBhcmUgc2FmZSB3cnQuIFhTUyBpbiBVUkwgbmF2aWdhdGlvblxuICogY29udGV4dHMuXG4gKlxuICogU2hvdXQtb3V0IHRvIEFuZ3VsYXIgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iLzE1LjIuOC9wYWNrYWdlcy9jb3JlL3NyYy9zYW5pdGl6YXRpb24vdXJsX3Nhbml0aXplci50cyNMMzhcbiAqL1xuY29uc3QgU0FGRV9VUkxfUEFUVEVSTiA9IC9eKD8hamF2YXNjcmlwdDopKD86W2EtejAtOSsuLV0rOnxbXiY6Lz8jXSooPzpbLz8jXXwkKSkvaTtcbmNvbnN0IGFsbG93ZWRBdHRyaWJ1dGUgPSAoYXR0cmlidXRlLCBhbGxvd2VkQXR0cmlidXRlTGlzdCkgPT4ge1xuICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChhbGxvd2VkQXR0cmlidXRlTGlzdC5pbmNsdWRlcyhhdHRyaWJ1dGVOYW1lKSkge1xuICAgIGlmICh1cmlBdHRyaWJ1dGVzLmhhcyhhdHRyaWJ1dGVOYW1lKSkge1xuICAgICAgcmV0dXJuIEJvb2xlYW4oU0FGRV9VUkxfUEFUVEVSTi50ZXN0KGF0dHJpYnV0ZS5ub2RlVmFsdWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBDaGVjayBpZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB2YWxpZGF0ZXMgdGhlIGF0dHJpYnV0ZS5cbiAgcmV0dXJuIGFsbG93ZWRBdHRyaWJ1dGVMaXN0LmZpbHRlcihhdHRyaWJ1dGVSZWdleCA9PiBhdHRyaWJ1dGVSZWdleCBpbnN0YW5jZW9mIFJlZ0V4cCkuc29tZShyZWdleCA9PiByZWdleC50ZXN0KGF0dHJpYnV0ZU5hbWUpKTtcbn07XG5mdW5jdGlvbiBzYW5pdGl6ZUh0bWwodW5zYWZlSHRtbCwgYWxsb3dMaXN0LCBzYW5pdGl6ZUZ1bmN0aW9uKSB7XG4gIGlmICghdW5zYWZlSHRtbC5sZW5ndGgpIHtcbiAgICByZXR1cm4gdW5zYWZlSHRtbDtcbiAgfVxuICBpZiAoc2FuaXRpemVGdW5jdGlvbiAmJiB0eXBlb2Ygc2FuaXRpemVGdW5jdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBzYW5pdGl6ZUZ1bmN0aW9uKHVuc2FmZUh0bWwpO1xuICB9XG4gIGNvbnN0IGRvbVBhcnNlciA9IG5ldyB3aW5kb3cuRE9NUGFyc2VyKCk7XG4gIGNvbnN0IGNyZWF0ZWREb2N1bWVudCA9IGRvbVBhcnNlci5wYXJzZUZyb21TdHJpbmcodW5zYWZlSHRtbCwgJ3RleHQvaHRtbCcpO1xuICBjb25zdCBlbGVtZW50cyA9IFtdLmNvbmNhdCguLi5jcmVhdGVkRG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yQWxsKCcqJykpO1xuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICBjb25zdCBlbGVtZW50TmFtZSA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIU9iamVjdC5rZXlzKGFsbG93TGlzdCkuaW5jbHVkZXMoZWxlbWVudE5hbWUpKSB7XG4gICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZUxpc3QgPSBbXS5jb25jYXQoLi4uZWxlbWVudC5hdHRyaWJ1dGVzKTtcbiAgICBjb25zdCBhbGxvd2VkQXR0cmlidXRlcyA9IFtdLmNvbmNhdChhbGxvd0xpc3RbJyonXSB8fCBbXSwgYWxsb3dMaXN0W2VsZW1lbnROYW1lXSB8fCBbXSk7XG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlTGlzdCkge1xuICAgICAgaWYgKCFhbGxvd2VkQXR0cmlidXRlKGF0dHJpYnV0ZSwgYWxsb3dlZEF0dHJpYnV0ZXMpKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZS5ub2RlTmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBjcmVhdGVkRG9jdW1lbnQuYm9keS5pbm5lckhUTUw7XG59XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL3RlbXBsYXRlLWZhY3RvcnkuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSQ1ID0gJ1RlbXBsYXRlRmFjdG9yeSc7XG5jb25zdCBEZWZhdWx0JDQgPSB7XG4gIGFsbG93TGlzdDogRGVmYXVsdEFsbG93bGlzdCxcbiAgY29udGVudDoge30sXG4gIC8vIHsgc2VsZWN0b3IgOiB0ZXh0ICwgIHNlbGVjdG9yMiA6IHRleHQyICwgfVxuICBleHRyYUNsYXNzOiAnJyxcbiAgaHRtbDogZmFsc2UsXG4gIHNhbml0aXplOiB0cnVlLFxuICBzYW5pdGl6ZUZuOiBudWxsLFxuICB0ZW1wbGF0ZTogJzxkaXY+PC9kaXY+J1xufTtcbmNvbnN0IERlZmF1bHRUeXBlJDQgPSB7XG4gIGFsbG93TGlzdDogJ29iamVjdCcsXG4gIGNvbnRlbnQ6ICdvYmplY3QnLFxuICBleHRyYUNsYXNzOiAnKHN0cmluZ3xmdW5jdGlvbiknLFxuICBodG1sOiAnYm9vbGVhbicsXG4gIHNhbml0aXplOiAnYm9vbGVhbicsXG4gIHNhbml0aXplRm46ICcobnVsbHxmdW5jdGlvbiknLFxuICB0ZW1wbGF0ZTogJ3N0cmluZydcbn07XG5jb25zdCBEZWZhdWx0Q29udGVudFR5cGUgPSB7XG4gIGVudHJ5OiAnKHN0cmluZ3xlbGVtZW50fGZ1bmN0aW9ufG51bGwpJyxcbiAgc2VsZWN0b3I6ICcoc3RyaW5nfGVsZW1lbnQpJ1xufTtcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgVGVtcGxhdGVGYWN0b3J5IGV4dGVuZHMgQ29uZmlnIHtcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKTtcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0JDQ7XG4gIH1cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGUkNDtcbiAgfVxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUUkNTtcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBnZXRDb250ZW50KCkge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuX2NvbmZpZy5jb250ZW50KS5tYXAoY29uZmlnID0+IHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKGNvbmZpZykpLmZpbHRlcihCb29sZWFuKTtcbiAgfVxuICBoYXNDb250ZW50KCkge1xuICAgIHJldHVybiB0aGlzLmdldENvbnRlbnQoKS5sZW5ndGggPiAwO1xuICB9XG4gIGNoYW5nZUNvbnRlbnQoY29udGVudCkge1xuICAgIHRoaXMuX2NoZWNrQ29udGVudChjb250ZW50KTtcbiAgICB0aGlzLl9jb25maWcuY29udGVudCA9IHtcbiAgICAgIC4uLnRoaXMuX2NvbmZpZy5jb250ZW50LFxuICAgICAgLi4uY29udGVudFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgdG9IdG1sKCkge1xuICAgIGNvbnN0IHRlbXBsYXRlV3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRlbXBsYXRlV3JhcHBlci5pbm5lckhUTUwgPSB0aGlzLl9tYXliZVNhbml0aXplKHRoaXMuX2NvbmZpZy50ZW1wbGF0ZSk7XG4gICAgZm9yIChjb25zdCBbc2VsZWN0b3IsIHRleHRdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuX2NvbmZpZy5jb250ZW50KSkge1xuICAgICAgdGhpcy5fc2V0Q29udGVudCh0ZW1wbGF0ZVdyYXBwZXIsIHRleHQsIHNlbGVjdG9yKTtcbiAgICB9XG4gICAgY29uc3QgdGVtcGxhdGUgPSB0ZW1wbGF0ZVdyYXBwZXIuY2hpbGRyZW5bMF07XG4gICAgY29uc3QgZXh0cmFDbGFzcyA9IHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKHRoaXMuX2NvbmZpZy5leHRyYUNsYXNzKTtcbiAgICBpZiAoZXh0cmFDbGFzcykge1xuICAgICAgdGVtcGxhdGUuY2xhc3NMaXN0LmFkZCguLi5leHRyYUNsYXNzLnNwbGl0KCcgJykpO1xuICAgIH1cbiAgICByZXR1cm4gdGVtcGxhdGU7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF90eXBlQ2hlY2tDb25maWcoY29uZmlnKSB7XG4gICAgc3VwZXIuX3R5cGVDaGVja0NvbmZpZyhjb25maWcpO1xuICAgIHRoaXMuX2NoZWNrQ29udGVudChjb25maWcuY29udGVudCk7XG4gIH1cbiAgX2NoZWNrQ29udGVudChhcmcpIHtcbiAgICBmb3IgKGNvbnN0IFtzZWxlY3RvciwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoYXJnKSkge1xuICAgICAgc3VwZXIuX3R5cGVDaGVja0NvbmZpZyh7XG4gICAgICAgIHNlbGVjdG9yLFxuICAgICAgICBlbnRyeTogY29udGVudFxuICAgICAgfSwgRGVmYXVsdENvbnRlbnRUeXBlKTtcbiAgICB9XG4gIH1cbiAgX3NldENvbnRlbnQodGVtcGxhdGUsIGNvbnRlbnQsIHNlbGVjdG9yKSB7XG4gICAgY29uc3QgdGVtcGxhdGVFbGVtZW50ID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShzZWxlY3RvciwgdGVtcGxhdGUpO1xuICAgIGlmICghdGVtcGxhdGVFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnRlbnQgPSB0aGlzLl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbihjb250ZW50KTtcbiAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgIHRlbXBsYXRlRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGlzRWxlbWVudChjb250ZW50KSkge1xuICAgICAgdGhpcy5fcHV0RWxlbWVudEluVGVtcGxhdGUoZ2V0RWxlbWVudChjb250ZW50KSwgdGVtcGxhdGVFbGVtZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NvbmZpZy5odG1sKSB7XG4gICAgICB0ZW1wbGF0ZUVsZW1lbnQuaW5uZXJIVE1MID0gdGhpcy5fbWF5YmVTYW5pdGl6ZShjb250ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGVtcGxhdGVFbGVtZW50LnRleHRDb250ZW50ID0gY29udGVudDtcbiAgfVxuICBfbWF5YmVTYW5pdGl6ZShhcmcpIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnLnNhbml0aXplID8gc2FuaXRpemVIdG1sKGFyZywgdGhpcy5fY29uZmlnLmFsbG93TGlzdCwgdGhpcy5fY29uZmlnLnNhbml0aXplRm4pIDogYXJnO1xuICB9XG4gIF9yZXNvbHZlUG9zc2libGVGdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gZXhlY3V0ZShhcmcsIFt1bmRlZmluZWQsIHRoaXNdKTtcbiAgfVxuICBfcHV0RWxlbWVudEluVGVtcGxhdGUoZWxlbWVudCwgdGVtcGxhdGVFbGVtZW50KSB7XG4gICAgaWYgKHRoaXMuX2NvbmZpZy5odG1sKSB7XG4gICAgICB0ZW1wbGF0ZUVsZW1lbnQuaW5uZXJIVE1MID0gJyc7XG4gICAgICB0ZW1wbGF0ZUVsZW1lbnQuYXBwZW5kKGVsZW1lbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0ZW1wbGF0ZUVsZW1lbnQudGV4dENvbnRlbnQgPSBlbGVtZW50LnRleHRDb250ZW50O1xuICB9XG59XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB0b29sdGlwLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUkNCA9ICd0b29sdGlwJztcbmNvbnN0IERJU0FMTE9XRURfQVRUUklCVVRFUyA9IG5ldyBTZXQoWydzYW5pdGl6ZScsICdhbGxvd0xpc3QnLCAnc2FuaXRpemVGbiddKTtcbmNvbnN0IENMQVNTX05BTUVfRkFERSQyID0gJ2ZhZGUnO1xuY29uc3QgQ0xBU1NfTkFNRV9NT0RBTCA9ICdtb2RhbCc7XG5jb25zdCBDTEFTU19OQU1FX1NIT1ckMiA9ICdzaG93JztcbmNvbnN0IFNFTEVDVE9SX1RPT0xUSVBfSU5ORVIgPSAnLnRvb2x0aXAtaW5uZXInO1xuY29uc3QgU0VMRUNUT1JfTU9EQUwgPSBgLiR7Q0xBU1NfTkFNRV9NT0RBTH1gO1xuY29uc3QgRVZFTlRfTU9EQUxfSElERSA9ICdoaWRlLmJzLm1vZGFsJztcbmNvbnN0IFRSSUdHRVJfSE9WRVIgPSAnaG92ZXInO1xuY29uc3QgVFJJR0dFUl9GT0NVUyA9ICdmb2N1cyc7XG5jb25zdCBUUklHR0VSX0NMSUNLID0gJ2NsaWNrJztcbmNvbnN0IFRSSUdHRVJfTUFOVUFMID0gJ21hbnVhbCc7XG5jb25zdCBFVkVOVF9ISURFJDIgPSAnaGlkZSc7XG5jb25zdCBFVkVOVF9ISURERU4kMiA9ICdoaWRkZW4nO1xuY29uc3QgRVZFTlRfU0hPVyQyID0gJ3Nob3cnO1xuY29uc3QgRVZFTlRfU0hPV04kMiA9ICdzaG93bic7XG5jb25zdCBFVkVOVF9JTlNFUlRFRCA9ICdpbnNlcnRlZCc7XG5jb25zdCBFVkVOVF9DTElDSyQxID0gJ2NsaWNrJztcbmNvbnN0IEVWRU5UX0ZPQ1VTSU4kMSA9ICdmb2N1c2luJztcbmNvbnN0IEVWRU5UX0ZPQ1VTT1VUJDEgPSAnZm9jdXNvdXQnO1xuY29uc3QgRVZFTlRfTU9VU0VFTlRFUiA9ICdtb3VzZWVudGVyJztcbmNvbnN0IEVWRU5UX01PVVNFTEVBVkUgPSAnbW91c2VsZWF2ZSc7XG5jb25zdCBBdHRhY2htZW50TWFwID0ge1xuICBBVVRPOiAnYXV0bycsXG4gIFRPUDogJ3RvcCcsXG4gIFJJR0hUOiBpc1JUTCgpID8gJ2xlZnQnIDogJ3JpZ2h0JyxcbiAgQk9UVE9NOiAnYm90dG9tJyxcbiAgTEVGVDogaXNSVEwoKSA/ICdyaWdodCcgOiAnbGVmdCdcbn07XG5jb25zdCBEZWZhdWx0JDMgPSB7XG4gIGFsbG93TGlzdDogRGVmYXVsdEFsbG93bGlzdCxcbiAgYW5pbWF0aW9uOiB0cnVlLFxuICBib3VuZGFyeTogJ2NsaXBwaW5nUGFyZW50cycsXG4gIGNvbnRhaW5lcjogZmFsc2UsXG4gIGN1c3RvbUNsYXNzOiAnJyxcbiAgZGVsYXk6IDAsXG4gIGZhbGxiYWNrUGxhY2VtZW50czogWyd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnXSxcbiAgaHRtbDogZmFsc2UsXG4gIG9mZnNldDogWzAsIDZdLFxuICBwbGFjZW1lbnQ6ICd0b3AnLFxuICBwb3BwZXJDb25maWc6IG51bGwsXG4gIHNhbml0aXplOiB0cnVlLFxuICBzYW5pdGl6ZUZuOiBudWxsLFxuICBzZWxlY3RvcjogZmFsc2UsXG4gIHRlbXBsYXRlOiAnPGRpdiBjbGFzcz1cInRvb2x0aXBcIiByb2xlPVwidG9vbHRpcFwiPicgKyAnPGRpdiBjbGFzcz1cInRvb2x0aXAtYXJyb3dcIj48L2Rpdj4nICsgJzxkaXYgY2xhc3M9XCJ0b29sdGlwLWlubmVyXCI+PC9kaXY+JyArICc8L2Rpdj4nLFxuICB0aXRsZTogJycsXG4gIHRyaWdnZXI6ICdob3ZlciBmb2N1cydcbn07XG5jb25zdCBEZWZhdWx0VHlwZSQzID0ge1xuICBhbGxvd0xpc3Q6ICdvYmplY3QnLFxuICBhbmltYXRpb246ICdib29sZWFuJyxcbiAgYm91bmRhcnk6ICcoc3RyaW5nfGVsZW1lbnQpJyxcbiAgY29udGFpbmVyOiAnKHN0cmluZ3xlbGVtZW50fGJvb2xlYW4pJyxcbiAgY3VzdG9tQ2xhc3M6ICcoc3RyaW5nfGZ1bmN0aW9uKScsXG4gIGRlbGF5OiAnKG51bWJlcnxvYmplY3QpJyxcbiAgZmFsbGJhY2tQbGFjZW1lbnRzOiAnYXJyYXknLFxuICBodG1sOiAnYm9vbGVhbicsXG4gIG9mZnNldDogJyhhcnJheXxzdHJpbmd8ZnVuY3Rpb24pJyxcbiAgcGxhY2VtZW50OiAnKHN0cmluZ3xmdW5jdGlvbiknLFxuICBwb3BwZXJDb25maWc6ICcobnVsbHxvYmplY3R8ZnVuY3Rpb24pJyxcbiAgc2FuaXRpemU6ICdib29sZWFuJyxcbiAgc2FuaXRpemVGbjogJyhudWxsfGZ1bmN0aW9uKScsXG4gIHNlbGVjdG9yOiAnKHN0cmluZ3xib29sZWFuKScsXG4gIHRlbXBsYXRlOiAnc3RyaW5nJyxcbiAgdGl0bGU6ICcoc3RyaW5nfGVsZW1lbnR8ZnVuY3Rpb24pJyxcbiAgdHJpZ2dlcjogJ3N0cmluZydcbn07XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIFRvb2x0aXAgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgaWYgKHR5cGVvZiBQb3BwZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCb290c3RyYXBcXCdzIHRvb2x0aXBzIHJlcXVpcmUgUG9wcGVyIChodHRwczovL3BvcHBlci5qcy5vcmcvZG9jcy92Mi8pJyk7XG4gICAgfVxuICAgIHN1cGVyKGVsZW1lbnQsIGNvbmZpZyk7XG5cbiAgICAvLyBQcml2YXRlXG4gICAgdGhpcy5faXNFbmFibGVkID0gdHJ1ZTtcbiAgICB0aGlzLl90aW1lb3V0ID0gMDtcbiAgICB0aGlzLl9pc0hvdmVyZWQgPSBudWxsO1xuICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXIgPSB7fTtcbiAgICB0aGlzLl9wb3BwZXIgPSBudWxsO1xuICAgIHRoaXMuX3RlbXBsYXRlRmFjdG9yeSA9IG51bGw7XG4gICAgdGhpcy5fbmV3Q29udGVudCA9IG51bGw7XG5cbiAgICAvLyBQcm90ZWN0ZWRcbiAgICB0aGlzLnRpcCA9IG51bGw7XG4gICAgdGhpcy5fc2V0TGlzdGVuZXJzKCk7XG4gICAgaWYgKCF0aGlzLl9jb25maWcuc2VsZWN0b3IpIHtcbiAgICAgIHRoaXMuX2ZpeFRpdGxlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHQkMztcbiAgfVxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZSQzO1xuICB9XG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRSQ0O1xuICB9XG5cbiAgLy8gUHVibGljXG4gIGVuYWJsZSgpIHtcbiAgICB0aGlzLl9pc0VuYWJsZWQgPSB0cnVlO1xuICB9XG4gIGRpc2FibGUoKSB7XG4gICAgdGhpcy5faXNFbmFibGVkID0gZmFsc2U7XG4gIH1cbiAgdG9nZ2xlRW5hYmxlZCgpIHtcbiAgICB0aGlzLl9pc0VuYWJsZWQgPSAhdGhpcy5faXNFbmFibGVkO1xuICB9XG4gIHRvZ2dsZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5faXNTaG93bigpKSB7XG4gICAgICB0aGlzLl9sZWF2ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9lbnRlcigpO1xuICB9XG4gIGRpc3Bvc2UoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpO1xuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudC5jbG9zZXN0KFNFTEVDVE9SX01PREFMKSwgRVZFTlRfTU9EQUxfSElERSwgdGhpcy5faGlkZU1vZGFsSGFuZGxlcik7XG4gICAgaWYgKHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJykpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsIHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJykpO1xuICAgIH1cbiAgICB0aGlzLl9kaXNwb3NlUG9wcGVyKCk7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG4gIHNob3coKSB7XG4gICAgaWYgKHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSB1c2Ugc2hvdyBvbiB2aXNpYmxlIGVsZW1lbnRzJyk7XG4gICAgfVxuICAgIGlmICghKHRoaXMuX2lzV2l0aENvbnRlbnQoKSAmJiB0aGlzLl9pc0VuYWJsZWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX1NIT1ckMikpO1xuICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSBmaW5kU2hhZG93Um9vdCh0aGlzLl9lbGVtZW50KTtcbiAgICBjb25zdCBpc0luVGhlRG9tID0gKHNoYWRvd1Jvb3QgfHwgdGhpcy5fZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuY29udGFpbnModGhpcy5fZWxlbWVudCk7XG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkIHx8ICFpc0luVGhlRG9tKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVE9ETzogdjYgcmVtb3ZlIHRoaXMgb3IgbWFrZSBpdCBvcHRpb25hbFxuICAgIHRoaXMuX2Rpc3Bvc2VQb3BwZXIoKTtcbiAgICBjb25zdCB0aXAgPSB0aGlzLl9nZXRUaXBFbGVtZW50KCk7XG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknLCB0aXAuZ2V0QXR0cmlidXRlKCdpZCcpKTtcbiAgICBjb25zdCB7XG4gICAgICBjb250YWluZXJcbiAgICB9ID0gdGhpcy5fY29uZmlnO1xuICAgIGlmICghdGhpcy5fZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jb250YWlucyh0aGlzLnRpcCkpIHtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmQodGlwKTtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0lOU0VSVEVEKSk7XG4gICAgfVxuICAgIHRoaXMuX3BvcHBlciA9IHRoaXMuX2NyZWF0ZVBvcHBlcih0aXApO1xuICAgIHRpcC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVyQyKTtcblxuICAgIC8vIElmIHRoaXMgaXMgYSB0b3VjaC1lbmFibGVkIGRldmljZSB3ZSBhZGQgZXh0cmFcbiAgICAvLyBlbXB0eSBtb3VzZW92ZXIgbGlzdGVuZXJzIHRvIHRoZSBib2R5J3MgaW1tZWRpYXRlIGNoaWxkcmVuO1xuICAgIC8vIG9ubHkgbmVlZGVkIGJlY2F1c2Ugb2YgYnJva2VuIGV2ZW50IGRlbGVnYXRpb24gb24gaU9TXG4gICAgLy8gaHR0cHM6Ly93d3cucXVpcmtzbW9kZS5vcmcvYmxvZy9hcmNoaXZlcy8yMDE0LzAyL21vdXNlX2V2ZW50X2J1Yi5odG1sXG4gICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKSkge1xuICAgICAgICBFdmVudEhhbmRsZXIub24oZWxlbWVudCwgJ21vdXNlb3ZlcicsIG5vb3ApO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX1NIT1dOJDIpKTtcbiAgICAgIGlmICh0aGlzLl9pc0hvdmVyZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX2xlYXZlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9pc0hvdmVyZWQgPSBmYWxzZTtcbiAgICB9O1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMudGlwLCB0aGlzLl9pc0FuaW1hdGVkKCkpO1xuICB9XG4gIGhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfSElERSQyKSk7XG4gICAgaWYgKGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRpcCA9IHRoaXMuX2dldFRpcEVsZW1lbnQoKTtcbiAgICB0aXAuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1ckMik7XG5cbiAgICAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgcmVtb3ZlIHRoZSBleHRyYVxuICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgd2UgYWRkZWQgZm9yIGlPUyBzdXBwb3J0XG4gICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKSkge1xuICAgICAgICBFdmVudEhhbmRsZXIub2ZmKGVsZW1lbnQsICdtb3VzZW92ZXInLCBub29wKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fYWN0aXZlVHJpZ2dlcltUUklHR0VSX0NMSUNLXSA9IGZhbHNlO1xuICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVFJJR0dFUl9GT0NVU10gPSBmYWxzZTtcbiAgICB0aGlzLl9hY3RpdmVUcmlnZ2VyW1RSSUdHRVJfSE9WRVJdID0gZmFsc2U7XG4gICAgdGhpcy5faXNIb3ZlcmVkID0gbnVsbDsgLy8gaXQgaXMgYSB0cmljayB0byBzdXBwb3J0IG1hbnVhbCB0cmlnZ2VyaW5nXG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9pc1dpdGhBY3RpdmVUcmlnZ2VyKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLl9pc0hvdmVyZWQpIHtcbiAgICAgICAgdGhpcy5fZGlzcG9zZVBvcHBlcigpO1xuICAgICAgfVxuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknKTtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0hJRERFTiQyKSk7XG4gICAgfTtcbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCB0aGlzLnRpcCwgdGhpcy5faXNBbmltYXRlZCgpKTtcbiAgfVxuICB1cGRhdGUoKSB7XG4gICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgdGhpcy5fcG9wcGVyLnVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFByb3RlY3RlZFxuICBfaXNXaXRoQ29udGVudCgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLl9nZXRUaXRsZSgpKTtcbiAgfVxuICBfZ2V0VGlwRWxlbWVudCgpIHtcbiAgICBpZiAoIXRoaXMudGlwKSB7XG4gICAgICB0aGlzLnRpcCA9IHRoaXMuX2NyZWF0ZVRpcEVsZW1lbnQodGhpcy5fbmV3Q29udGVudCB8fCB0aGlzLl9nZXRDb250ZW50Rm9yVGVtcGxhdGUoKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRpcDtcbiAgfVxuICBfY3JlYXRlVGlwRWxlbWVudChjb250ZW50KSB7XG4gICAgY29uc3QgdGlwID0gdGhpcy5fZ2V0VGVtcGxhdGVGYWN0b3J5KGNvbnRlbnQpLnRvSHRtbCgpO1xuXG4gICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgY2hlY2sgaW4gdjZcbiAgICBpZiAoIXRpcCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRpcC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfRkFERSQyLCBDTEFTU19OQU1FX1NIT1ckMik7XG4gICAgLy8gVE9ETzogdjYgdGhlIGZvbGxvd2luZyBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBDU1Mgb25seVxuICAgIHRpcC5jbGFzc0xpc3QuYWRkKGBicy0ke3RoaXMuY29uc3RydWN0b3IuTkFNRX0tYXV0b2ApO1xuICAgIGNvbnN0IHRpcElkID0gZ2V0VUlEKHRoaXMuY29uc3RydWN0b3IuTkFNRSkudG9TdHJpbmcoKTtcbiAgICB0aXAuc2V0QXR0cmlidXRlKCdpZCcsIHRpcElkKTtcbiAgICBpZiAodGhpcy5faXNBbmltYXRlZCgpKSB7XG4gICAgICB0aXAuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0ZBREUkMik7XG4gICAgfVxuICAgIHJldHVybiB0aXA7XG4gIH1cbiAgc2V0Q29udGVudChjb250ZW50KSB7XG4gICAgdGhpcy5fbmV3Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgaWYgKHRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgdGhpcy5fZGlzcG9zZVBvcHBlcigpO1xuICAgICAgdGhpcy5zaG93KCk7XG4gICAgfVxuICB9XG4gIF9nZXRUZW1wbGF0ZUZhY3RvcnkoY29udGVudCkge1xuICAgIGlmICh0aGlzLl90ZW1wbGF0ZUZhY3RvcnkpIHtcbiAgICAgIHRoaXMuX3RlbXBsYXRlRmFjdG9yeS5jaGFuZ2VDb250ZW50KGNvbnRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90ZW1wbGF0ZUZhY3RvcnkgPSBuZXcgVGVtcGxhdGVGYWN0b3J5KHtcbiAgICAgICAgLi4udGhpcy5fY29uZmlnLFxuICAgICAgICAvLyB0aGUgYGNvbnRlbnRgIHZhciBoYXMgdG8gYmUgYWZ0ZXIgYHRoaXMuX2NvbmZpZ2BcbiAgICAgICAgLy8gdG8gb3ZlcnJpZGUgY29uZmlnLmNvbnRlbnQgaW4gY2FzZSBvZiBwb3BvdmVyXG4gICAgICAgIGNvbnRlbnQsXG4gICAgICAgIGV4dHJhQ2xhc3M6IHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKHRoaXMuX2NvbmZpZy5jdXN0b21DbGFzcylcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGVGYWN0b3J5O1xuICB9XG4gIF9nZXRDb250ZW50Rm9yVGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFtTRUxFQ1RPUl9UT09MVElQX0lOTkVSXTogdGhpcy5fZ2V0VGl0bGUoKVxuICAgIH07XG4gIH1cbiAgX2dldFRpdGxlKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbih0aGlzLl9jb25maWcudGl0bGUpIHx8IHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJyk7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9pbml0aWFsaXplT25EZWxlZ2F0ZWRUYXJnZXQoZXZlbnQpIHtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5nZXRPckNyZWF0ZUluc3RhbmNlKGV2ZW50LmRlbGVnYXRlVGFyZ2V0LCB0aGlzLl9nZXREZWxlZ2F0ZUNvbmZpZygpKTtcbiAgfVxuICBfaXNBbmltYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnLmFuaW1hdGlvbiB8fCB0aGlzLnRpcCAmJiB0aGlzLnRpcC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9GQURFJDIpO1xuICB9XG4gIF9pc1Nob3duKCkge1xuICAgIHJldHVybiB0aGlzLnRpcCAmJiB0aGlzLnRpcC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TSE9XJDIpO1xuICB9XG4gIF9jcmVhdGVQb3BwZXIodGlwKSB7XG4gICAgY29uc3QgcGxhY2VtZW50ID0gZXhlY3V0ZSh0aGlzLl9jb25maWcucGxhY2VtZW50LCBbdGhpcywgdGlwLCB0aGlzLl9lbGVtZW50XSk7XG4gICAgY29uc3QgYXR0YWNobWVudCA9IEF0dGFjaG1lbnRNYXBbcGxhY2VtZW50LnRvVXBwZXJDYXNlKCldO1xuICAgIHJldHVybiBQb3BwZXIuY3JlYXRlUG9wcGVyKHRoaXMuX2VsZW1lbnQsIHRpcCwgdGhpcy5fZ2V0UG9wcGVyQ29uZmlnKGF0dGFjaG1lbnQpKTtcbiAgfVxuICBfZ2V0T2Zmc2V0KCkge1xuICAgIGNvbnN0IHtcbiAgICAgIG9mZnNldFxuICAgIH0gPSB0aGlzLl9jb25maWc7XG4gICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gb2Zmc2V0LnNwbGl0KCcsJykubWFwKHZhbHVlID0+IE51bWJlci5wYXJzZUludCh2YWx1ZSwgMTApKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBwb3BwZXJEYXRhID0+IG9mZnNldChwb3BwZXJEYXRhLCB0aGlzLl9lbGVtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIG9mZnNldDtcbiAgfVxuICBfcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGV4ZWN1dGUoYXJnLCBbdGhpcy5fZWxlbWVudCwgdGhpcy5fZWxlbWVudF0pO1xuICB9XG4gIF9nZXRQb3BwZXJDb25maWcoYXR0YWNobWVudCkge1xuICAgIGNvbnN0IGRlZmF1bHRCc1BvcHBlckNvbmZpZyA9IHtcbiAgICAgIHBsYWNlbWVudDogYXR0YWNobWVudCxcbiAgICAgIG1vZGlmaWVyczogW3tcbiAgICAgICAgbmFtZTogJ2ZsaXAnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgZmFsbGJhY2tQbGFjZW1lbnRzOiB0aGlzLl9jb25maWcuZmFsbGJhY2tQbGFjZW1lbnRzXG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgbmFtZTogJ29mZnNldCcsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBvZmZzZXQ6IHRoaXMuX2dldE9mZnNldCgpXG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBib3VuZGFyeTogdGhpcy5fY29uZmlnLmJvdW5kYXJ5XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgbmFtZTogJ2Fycm93JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGVsZW1lbnQ6IGAuJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUV9LWFycm93YFxuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIG5hbWU6ICdwcmVTZXRQbGFjZW1lbnQnLFxuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICBwaGFzZTogJ2JlZm9yZU1haW4nLFxuICAgICAgICBmbjogZGF0YSA9PiB7XG4gICAgICAgICAgLy8gUHJlLXNldCBQb3BwZXIncyBwbGFjZW1lbnQgYXR0cmlidXRlIGluIG9yZGVyIHRvIHJlYWQgdGhlIGFycm93IHNpemVzIHByb3Blcmx5LlxuICAgICAgICAgIC8vIE90aGVyd2lzZSwgUG9wcGVyIG1peGVzIHVwIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGRpbWVuc2lvbnMgc2luY2UgdGhlIGluaXRpYWwgYXJyb3cgc3R5bGUgaXMgZm9yIHRvcCBwbGFjZW1lbnRcbiAgICAgICAgICB0aGlzLl9nZXRUaXBFbGVtZW50KCkuc2V0QXR0cmlidXRlKCdkYXRhLXBvcHBlci1wbGFjZW1lbnQnLCBkYXRhLnN0YXRlLnBsYWNlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1dXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmYXVsdEJzUG9wcGVyQ29uZmlnLFxuICAgICAgLi4uZXhlY3V0ZSh0aGlzLl9jb25maWcucG9wcGVyQ29uZmlnLCBbdW5kZWZpbmVkLCBkZWZhdWx0QnNQb3BwZXJDb25maWddKVxuICAgIH07XG4gIH1cbiAgX3NldExpc3RlbmVycygpIHtcbiAgICBjb25zdCB0cmlnZ2VycyA9IHRoaXMuX2NvbmZpZy50cmlnZ2VyLnNwbGl0KCcgJyk7XG4gICAgZm9yIChjb25zdCB0cmlnZ2VyIG9mIHRyaWdnZXJzKSB7XG4gICAgICBpZiAodHJpZ2dlciA9PT0gJ2NsaWNrJykge1xuICAgICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfQ0xJQ0skMSksIHRoaXMuX2NvbmZpZy5zZWxlY3RvciwgZXZlbnQgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9pbml0aWFsaXplT25EZWxlZ2F0ZWRUYXJnZXQoZXZlbnQpO1xuICAgICAgICAgIGNvbnRleHQuX2FjdGl2ZVRyaWdnZXJbVFJJR0dFUl9DTElDS10gPSAhKGNvbnRleHQuX2lzU2hvd24oKSAmJiBjb250ZXh0Ll9hY3RpdmVUcmlnZ2VyW1RSSUdHRVJfQ0xJQ0tdKTtcbiAgICAgICAgICBjb250ZXh0LnRvZ2dsZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodHJpZ2dlciAhPT0gVFJJR0dFUl9NQU5VQUwpIHtcbiAgICAgICAgY29uc3QgZXZlbnRJbiA9IHRyaWdnZXIgPT09IFRSSUdHRVJfSE9WRVIgPyB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9NT1VTRUVOVEVSKSA6IHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0ZPQ1VTSU4kMSk7XG4gICAgICAgIGNvbnN0IGV2ZW50T3V0ID0gdHJpZ2dlciA9PT0gVFJJR0dFUl9IT1ZFUiA/IHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX01PVVNFTEVBVkUpIDogdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfRk9DVVNPVVQkMSk7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBldmVudEluLCB0aGlzLl9jb25maWcuc2VsZWN0b3IsIGV2ZW50ID0+IHtcbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5faW5pdGlhbGl6ZU9uRGVsZWdhdGVkVGFyZ2V0KGV2ZW50KTtcbiAgICAgICAgICBjb250ZXh0Ll9hY3RpdmVUcmlnZ2VyW2V2ZW50LnR5cGUgPT09ICdmb2N1c2luJyA/IFRSSUdHRVJfRk9DVVMgOiBUUklHR0VSX0hPVkVSXSA9IHRydWU7XG4gICAgICAgICAgY29udGV4dC5fZW50ZXIoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBldmVudE91dCwgdGhpcy5fY29uZmlnLnNlbGVjdG9yLCBldmVudCA9PiB7XG4gICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuX2luaXRpYWxpemVPbkRlbGVnYXRlZFRhcmdldChldmVudCk7XG4gICAgICAgICAgY29udGV4dC5fYWN0aXZlVHJpZ2dlcltldmVudC50eXBlID09PSAnZm9jdXNvdXQnID8gVFJJR0dFUl9GT0NVUyA6IFRSSUdHRVJfSE9WRVJdID0gY29udGV4dC5fZWxlbWVudC5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KTtcbiAgICAgICAgICBjb250ZXh0Ll9sZWF2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5faGlkZU1vZGFsSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9lbGVtZW50KSB7XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgfVxuICAgIH07XG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQuY2xvc2VzdChTRUxFQ1RPUl9NT0RBTCksIEVWRU5UX01PREFMX0hJREUsIHRoaXMuX2hpZGVNb2RhbEhhbmRsZXIpO1xuICB9XG4gIF9maXhUaXRsZSgpIHtcbiAgICBjb25zdCB0aXRsZSA9IHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCd0aXRsZScpO1xuICAgIGlmICghdGl0bGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpICYmICF0aGlzLl9lbGVtZW50LnRleHRDb250ZW50LnRyaW0oKSkge1xuICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCB0aXRsZSk7XG4gICAgfVxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJywgdGl0bGUpOyAvLyBETyBOT1QgVVNFIElULiBJcyBvbmx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCd0aXRsZScpO1xuICB9XG4gIF9lbnRlcigpIHtcbiAgICBpZiAodGhpcy5faXNTaG93bigpIHx8IHRoaXMuX2lzSG92ZXJlZCkge1xuICAgICAgdGhpcy5faXNIb3ZlcmVkID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5faXNIb3ZlcmVkID0gdHJ1ZTtcbiAgICB0aGlzLl9zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9pc0hvdmVyZWQpIHtcbiAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICB9XG4gICAgfSwgdGhpcy5fY29uZmlnLmRlbGF5LnNob3cpO1xuICB9XG4gIF9sZWF2ZSgpIHtcbiAgICBpZiAodGhpcy5faXNXaXRoQWN0aXZlVHJpZ2dlcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2lzSG92ZXJlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3NldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9pc0hvdmVyZWQpIHtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICB9XG4gICAgfSwgdGhpcy5fY29uZmlnLmRlbGF5LmhpZGUpO1xuICB9XG4gIF9zZXRUaW1lb3V0KGhhbmRsZXIsIHRpbWVvdXQpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7XG4gICAgdGhpcy5fdGltZW91dCA9IHNldFRpbWVvdXQoaGFuZGxlciwgdGltZW91dCk7XG4gIH1cbiAgX2lzV2l0aEFjdGl2ZVRyaWdnZXIoKSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5fYWN0aXZlVHJpZ2dlcikuaW5jbHVkZXModHJ1ZSk7XG4gIH1cbiAgX2dldENvbmZpZyhjb25maWcpIHtcbiAgICBjb25zdCBkYXRhQXR0cmlidXRlcyA9IE1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQpO1xuICAgIGZvciAoY29uc3QgZGF0YUF0dHJpYnV0ZSBvZiBPYmplY3Qua2V5cyhkYXRhQXR0cmlidXRlcykpIHtcbiAgICAgIGlmIChESVNBTExPV0VEX0FUVFJJQlVURVMuaGFzKGRhdGFBdHRyaWJ1dGUpKSB7XG4gICAgICAgIGRlbGV0ZSBkYXRhQXR0cmlidXRlc1tkYXRhQXR0cmlidXRlXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uZmlnID0ge1xuICAgICAgLi4uZGF0YUF0dHJpYnV0ZXMsXG4gICAgICAuLi4odHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgJiYgY29uZmlnID8gY29uZmlnIDoge30pXG4gICAgfTtcbiAgICBjb25maWcgPSB0aGlzLl9tZXJnZUNvbmZpZ09iaihjb25maWcpO1xuICAgIGNvbmZpZyA9IHRoaXMuX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKTtcbiAgICB0aGlzLl90eXBlQ2hlY2tDb25maWcoY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG4gIF9jb25maWdBZnRlck1lcmdlKGNvbmZpZykge1xuICAgIGNvbmZpZy5jb250YWluZXIgPSBjb25maWcuY29udGFpbmVyID09PSBmYWxzZSA/IGRvY3VtZW50LmJvZHkgOiBnZXRFbGVtZW50KGNvbmZpZy5jb250YWluZXIpO1xuICAgIGlmICh0eXBlb2YgY29uZmlnLmRlbGF5ID09PSAnbnVtYmVyJykge1xuICAgICAgY29uZmlnLmRlbGF5ID0ge1xuICAgICAgICBzaG93OiBjb25maWcuZGVsYXksXG4gICAgICAgIGhpZGU6IGNvbmZpZy5kZWxheVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb25maWcudGl0bGUgPT09ICdudW1iZXInKSB7XG4gICAgICBjb25maWcudGl0bGUgPSBjb25maWcudGl0bGUudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb25maWcuY29udGVudCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGNvbmZpZy5jb250ZW50ID0gY29uZmlnLmNvbnRlbnQudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBfZ2V0RGVsZWdhdGVDb25maWcoKSB7XG4gICAgY29uc3QgY29uZmlnID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5fY29uZmlnKSkge1xuICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFtrZXldICE9PSB2YWx1ZSkge1xuICAgICAgICBjb25maWdba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25maWcuc2VsZWN0b3IgPSBmYWxzZTtcbiAgICBjb25maWcudHJpZ2dlciA9ICdtYW51YWwnO1xuXG4gICAgLy8gSW4gdGhlIGZ1dHVyZSBjYW4gYmUgcmVwbGFjZWQgd2l0aDpcbiAgICAvLyBjb25zdCBrZXlzV2l0aERpZmZlcmVudFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuX2NvbmZpZykuZmlsdGVyKGVudHJ5ID0+IHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFtlbnRyeVswXV0gIT09IHRoaXMuX2NvbmZpZ1tlbnRyeVswXV0pXG4gICAgLy8gYE9iamVjdC5mcm9tRW50cmllcyhrZXlzV2l0aERpZmZlcmVudFZhbHVlcylgXG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBfZGlzcG9zZVBvcHBlcigpIHtcbiAgICBpZiAodGhpcy5fcG9wcGVyKSB7XG4gICAgICB0aGlzLl9wb3BwZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5fcG9wcGVyID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMudGlwKSB7XG4gICAgICB0aGlzLnRpcC5yZW1vdmUoKTtcbiAgICAgIHRoaXMudGlwID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBUb29sdGlwLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKTtcbiAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKTtcbiAgICAgIH1cbiAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKFRvb2x0aXApO1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgcG9wb3Zlci5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJDMgPSAncG9wb3Zlcic7XG5jb25zdCBTRUxFQ1RPUl9USVRMRSA9ICcucG9wb3Zlci1oZWFkZXInO1xuY29uc3QgU0VMRUNUT1JfQ09OVEVOVCA9ICcucG9wb3Zlci1ib2R5JztcbmNvbnN0IERlZmF1bHQkMiA9IHtcbiAgLi4uVG9vbHRpcC5EZWZhdWx0LFxuICBjb250ZW50OiAnJyxcbiAgb2Zmc2V0OiBbMCwgOF0sXG4gIHBsYWNlbWVudDogJ3JpZ2h0JyxcbiAgdGVtcGxhdGU6ICc8ZGl2IGNsYXNzPVwicG9wb3ZlclwiIHJvbGU9XCJ0b29sdGlwXCI+JyArICc8ZGl2IGNsYXNzPVwicG9wb3Zlci1hcnJvd1wiPjwvZGl2PicgKyAnPGgzIGNsYXNzPVwicG9wb3Zlci1oZWFkZXJcIj48L2gzPicgKyAnPGRpdiBjbGFzcz1cInBvcG92ZXItYm9keVwiPjwvZGl2PicgKyAnPC9kaXY+JyxcbiAgdHJpZ2dlcjogJ2NsaWNrJ1xufTtcbmNvbnN0IERlZmF1bHRUeXBlJDIgPSB7XG4gIC4uLlRvb2x0aXAuRGVmYXVsdFR5cGUsXG4gIGNvbnRlbnQ6ICcobnVsbHxzdHJpbmd8ZWxlbWVudHxmdW5jdGlvbiknXG59O1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBQb3BvdmVyIGV4dGVuZHMgVG9vbHRpcCB7XG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0JDI7XG4gIH1cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGUkMjtcbiAgfVxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUUkMztcbiAgfVxuXG4gIC8vIE92ZXJyaWRlc1xuICBfaXNXaXRoQ29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0VGl0bGUoKSB8fCB0aGlzLl9nZXRDb250ZW50KCk7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9nZXRDb250ZW50Rm9yVGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFtTRUxFQ1RPUl9USVRMRV06IHRoaXMuX2dldFRpdGxlKCksXG4gICAgICBbU0VMRUNUT1JfQ09OVEVOVF06IHRoaXMuX2dldENvbnRlbnQoKVxuICAgIH07XG4gIH1cbiAgX2dldENvbnRlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKHRoaXMuX2NvbmZpZy5jb250ZW50KTtcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFBvcG92ZXIuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgfVxuICAgICAgZGF0YVtjb25maWddKCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oUG9wb3Zlcik7XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBzY3JvbGxzcHkuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSQyID0gJ3Njcm9sbHNweSc7XG5jb25zdCBEQVRBX0tFWSQyID0gJ2JzLnNjcm9sbHNweSc7XG5jb25zdCBFVkVOVF9LRVkkMiA9IGAuJHtEQVRBX0tFWSQyfWA7XG5jb25zdCBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJztcbmNvbnN0IEVWRU5UX0FDVElWQVRFID0gYGFjdGl2YXRlJHtFVkVOVF9LRVkkMn1gO1xuY29uc3QgRVZFTlRfQ0xJQ0sgPSBgY2xpY2ske0VWRU5UX0tFWSQyfWA7XG5jb25zdCBFVkVOVF9MT0FEX0RBVEFfQVBJJDEgPSBgbG9hZCR7RVZFTlRfS0VZJDJ9JHtEQVRBX0FQSV9LRVl9YDtcbmNvbnN0IENMQVNTX05BTUVfRFJPUERPV05fSVRFTSA9ICdkcm9wZG93bi1pdGVtJztcbmNvbnN0IENMQVNTX05BTUVfQUNUSVZFJDEgPSAnYWN0aXZlJztcbmNvbnN0IFNFTEVDVE9SX0RBVEFfU1BZID0gJ1tkYXRhLWJzLXNweT1cInNjcm9sbFwiXSc7XG5jb25zdCBTRUxFQ1RPUl9UQVJHRVRfTElOS1MgPSAnW2hyZWZdJztcbmNvbnN0IFNFTEVDVE9SX05BVl9MSVNUX0dST1VQID0gJy5uYXYsIC5saXN0LWdyb3VwJztcbmNvbnN0IFNFTEVDVE9SX05BVl9MSU5LUyA9ICcubmF2LWxpbmsnO1xuY29uc3QgU0VMRUNUT1JfTkFWX0lURU1TID0gJy5uYXYtaXRlbSc7XG5jb25zdCBTRUxFQ1RPUl9MSVNUX0lURU1TID0gJy5saXN0LWdyb3VwLWl0ZW0nO1xuY29uc3QgU0VMRUNUT1JfTElOS19JVEVNUyA9IGAke1NFTEVDVE9SX05BVl9MSU5LU30sICR7U0VMRUNUT1JfTkFWX0lURU1TfSA+ICR7U0VMRUNUT1JfTkFWX0xJTktTfSwgJHtTRUxFQ1RPUl9MSVNUX0lURU1TfWA7XG5jb25zdCBTRUxFQ1RPUl9EUk9QRE9XTiA9ICcuZHJvcGRvd24nO1xuY29uc3QgU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFJDEgPSAnLmRyb3Bkb3duLXRvZ2dsZSc7XG5jb25zdCBEZWZhdWx0JDEgPSB7XG4gIG9mZnNldDogbnVsbCxcbiAgLy8gVE9ETzogdjYgQGRlcHJlY2F0ZWQsIGtlZXAgaXQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnNcbiAgcm9vdE1hcmdpbjogJzBweCAwcHggLTI1JScsXG4gIHNtb290aFNjcm9sbDogZmFsc2UsXG4gIHRhcmdldDogbnVsbCxcbiAgdGhyZXNob2xkOiBbMC4xLCAwLjUsIDFdXG59O1xuY29uc3QgRGVmYXVsdFR5cGUkMSA9IHtcbiAgb2Zmc2V0OiAnKG51bWJlcnxudWxsKScsXG4gIC8vIFRPRE8gdjYgQGRlcHJlY2F0ZWQsIGtlZXAgaXQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnNcbiAgcm9vdE1hcmdpbjogJ3N0cmluZycsXG4gIHNtb290aFNjcm9sbDogJ2Jvb2xlYW4nLFxuICB0YXJnZXQ6ICdlbGVtZW50JyxcbiAgdGhyZXNob2xkOiAnYXJyYXknXG59O1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBTY3JvbGxTcHkgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKTtcblxuICAgIC8vIHRoaXMuX2VsZW1lbnQgaXMgdGhlIG9ic2VydmFibGVzQ29udGFpbmVyIGFuZCBjb25maWcudGFyZ2V0IHRoZSBtZW51IGxpbmtzIHdyYXBwZXJcbiAgICB0aGlzLl90YXJnZXRMaW5rcyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLl9vYnNlcnZhYmxlU2VjdGlvbnMgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5fcm9vdEVsZW1lbnQgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMuX2VsZW1lbnQpLm92ZXJmbG93WSA9PT0gJ3Zpc2libGUnID8gbnVsbCA6IHRoaXMuX2VsZW1lbnQ7XG4gICAgdGhpcy5fYWN0aXZlVGFyZ2V0ID0gbnVsbDtcbiAgICB0aGlzLl9vYnNlcnZlciA9IG51bGw7XG4gICAgdGhpcy5fcHJldmlvdXNTY3JvbGxEYXRhID0ge1xuICAgICAgdmlzaWJsZUVudHJ5VG9wOiAwLFxuICAgICAgcGFyZW50U2Nyb2xsVG9wOiAwXG4gICAgfTtcbiAgICB0aGlzLnJlZnJlc2goKTsgLy8gaW5pdGlhbGl6ZVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHQkMTtcbiAgfVxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZSQxO1xuICB9XG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRSQyO1xuICB9XG5cbiAgLy8gUHVibGljXG4gIHJlZnJlc2goKSB7XG4gICAgdGhpcy5faW5pdGlhbGl6ZVRhcmdldHNBbmRPYnNlcnZhYmxlcygpO1xuICAgIHRoaXMuX21heWJlRW5hYmxlU21vb3RoU2Nyb2xsKCk7XG4gICAgaWYgKHRoaXMuX29ic2VydmVyKSB7XG4gICAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX29ic2VydmVyID0gdGhpcy5fZ2V0TmV3T2JzZXJ2ZXIoKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHRoaXMuX29ic2VydmFibGVTZWN0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgdGhpcy5fb2JzZXJ2ZXIub2JzZXJ2ZShzZWN0aW9uKTtcbiAgICB9XG4gIH1cbiAgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICAvLyBUT0RPOiBvbiB2NiB0YXJnZXQgc2hvdWxkIGJlIGdpdmVuIGV4cGxpY2l0bHkgJiByZW1vdmUgdGhlIHt0YXJnZXQ6ICdzcy10YXJnZXQnfSBjYXNlXG4gICAgY29uZmlnLnRhcmdldCA9IGdldEVsZW1lbnQoY29uZmlnLnRhcmdldCkgfHwgZG9jdW1lbnQuYm9keTtcblxuICAgIC8vIFRPRE86IHY2IE9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnMuIFVzZSByb290TWFyZ2luIG9ubHlcbiAgICBjb25maWcucm9vdE1hcmdpbiA9IGNvbmZpZy5vZmZzZXQgPyBgJHtjb25maWcub2Zmc2V0fXB4IDBweCAtMzAlYCA6IGNvbmZpZy5yb290TWFyZ2luO1xuICAgIGlmICh0eXBlb2YgY29uZmlnLnRocmVzaG9sZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbmZpZy50aHJlc2hvbGQgPSBjb25maWcudGhyZXNob2xkLnNwbGl0KCcsJykubWFwKHZhbHVlID0+IE51bWJlci5wYXJzZUZsb2F0KHZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG4gIH1cbiAgX21heWJlRW5hYmxlU21vb3RoU2Nyb2xsKCkge1xuICAgIGlmICghdGhpcy5fY29uZmlnLnNtb290aFNjcm9sbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHVucmVnaXN0ZXIgYW55IHByZXZpb3VzIGxpc3RlbmVyc1xuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fY29uZmlnLnRhcmdldCwgRVZFTlRfQ0xJQ0spO1xuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9jb25maWcudGFyZ2V0LCBFVkVOVF9DTElDSywgU0VMRUNUT1JfVEFSR0VUX0xJTktTLCBldmVudCA9PiB7XG4gICAgICBjb25zdCBvYnNlcnZhYmxlU2VjdGlvbiA9IHRoaXMuX29ic2VydmFibGVTZWN0aW9ucy5nZXQoZXZlbnQudGFyZ2V0Lmhhc2gpO1xuICAgICAgaWYgKG9ic2VydmFibGVTZWN0aW9uKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLl9yb290RWxlbWVudCB8fCB3aW5kb3c7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IG9ic2VydmFibGVTZWN0aW9uLm9mZnNldFRvcCAtIHRoaXMuX2VsZW1lbnQub2Zmc2V0VG9wO1xuICAgICAgICBpZiAocm9vdC5zY3JvbGxUbykge1xuICAgICAgICAgIHJvb3Quc2Nyb2xsVG8oe1xuICAgICAgICAgICAgdG9wOiBoZWlnaHQsXG4gICAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCdcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaHJvbWUgNjAgZG9lc24ndCBzdXBwb3J0IGBzY3JvbGxUb2BcbiAgICAgICAgcm9vdC5zY3JvbGxUb3AgPSBoZWlnaHQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgX2dldE5ld09ic2VydmVyKCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICByb290OiB0aGlzLl9yb290RWxlbWVudCxcbiAgICAgIHRocmVzaG9sZDogdGhpcy5fY29uZmlnLnRocmVzaG9sZCxcbiAgICAgIHJvb3RNYXJnaW46IHRoaXMuX2NvbmZpZy5yb290TWFyZ2luXG4gICAgfTtcbiAgICByZXR1cm4gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGVudHJpZXMgPT4gdGhpcy5fb2JzZXJ2ZXJDYWxsYmFjayhlbnRyaWVzKSwgb3B0aW9ucyk7XG4gIH1cblxuICAvLyBUaGUgbG9naWMgb2Ygc2VsZWN0aW9uXG4gIF9vYnNlcnZlckNhbGxiYWNrKGVudHJpZXMpIHtcbiAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gZW50cnkgPT4gdGhpcy5fdGFyZ2V0TGlua3MuZ2V0KGAjJHtlbnRyeS50YXJnZXQuaWR9YCk7XG4gICAgY29uc3QgYWN0aXZhdGUgPSBlbnRyeSA9PiB7XG4gICAgICB0aGlzLl9wcmV2aW91c1Njcm9sbERhdGEudmlzaWJsZUVudHJ5VG9wID0gZW50cnkudGFyZ2V0Lm9mZnNldFRvcDtcbiAgICAgIHRoaXMuX3Byb2Nlc3ModGFyZ2V0RWxlbWVudChlbnRyeSkpO1xuICAgIH07XG4gICAgY29uc3QgcGFyZW50U2Nyb2xsVG9wID0gKHRoaXMuX3Jvb3RFbGVtZW50IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuc2Nyb2xsVG9wO1xuICAgIGNvbnN0IHVzZXJTY3JvbGxzRG93biA9IHBhcmVudFNjcm9sbFRvcCA+PSB0aGlzLl9wcmV2aW91c1Njcm9sbERhdGEucGFyZW50U2Nyb2xsVG9wO1xuICAgIHRoaXMuX3ByZXZpb3VzU2Nyb2xsRGF0YS5wYXJlbnRTY3JvbGxUb3AgPSBwYXJlbnRTY3JvbGxUb3A7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBpZiAoIWVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZVRhcmdldCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2NsZWFyQWN0aXZlQ2xhc3ModGFyZ2V0RWxlbWVudChlbnRyeSkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVudHJ5SXNMb3dlclRoYW5QcmV2aW91cyA9IGVudHJ5LnRhcmdldC5vZmZzZXRUb3AgPj0gdGhpcy5fcHJldmlvdXNTY3JvbGxEYXRhLnZpc2libGVFbnRyeVRvcDtcbiAgICAgIC8vIGlmIHdlIGFyZSBzY3JvbGxpbmcgZG93biwgcGljayB0aGUgYmlnZ2VyIG9mZnNldFRvcFxuICAgICAgaWYgKHVzZXJTY3JvbGxzRG93biAmJiBlbnRyeUlzTG93ZXJUaGFuUHJldmlvdXMpIHtcbiAgICAgICAgYWN0aXZhdGUoZW50cnkpO1xuICAgICAgICAvLyBpZiBwYXJlbnQgaXNuJ3Qgc2Nyb2xsZWQsIGxldCdzIGtlZXAgdGhlIGZpcnN0IHZpc2libGUgaXRlbSwgYnJlYWtpbmcgdGhlIGl0ZXJhdGlvblxuICAgICAgICBpZiAoIXBhcmVudFNjcm9sbFRvcCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgd2UgYXJlIHNjcm9sbGluZyB1cCwgcGljayB0aGUgc21hbGxlc3Qgb2Zmc2V0VG9wXG4gICAgICBpZiAoIXVzZXJTY3JvbGxzRG93biAmJiAhZW50cnlJc0xvd2VyVGhhblByZXZpb3VzKSB7XG4gICAgICAgIGFjdGl2YXRlKGVudHJ5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgX2luaXRpYWxpemVUYXJnZXRzQW5kT2JzZXJ2YWJsZXMoKSB7XG4gICAgdGhpcy5fdGFyZ2V0TGlua3MgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5fb2JzZXJ2YWJsZVNlY3Rpb25zID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IHRhcmdldExpbmtzID0gU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9UQVJHRVRfTElOS1MsIHRoaXMuX2NvbmZpZy50YXJnZXQpO1xuICAgIGZvciAoY29uc3QgYW5jaG9yIG9mIHRhcmdldExpbmtzKSB7XG4gICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgYW5jaG9yIGhhcyBhbiBpZCBhbmQgaXMgbm90IGRpc2FibGVkXG4gICAgICBpZiAoIWFuY2hvci5oYXNoIHx8IGlzRGlzYWJsZWQoYW5jaG9yKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9ic2VydmFibGVTZWN0aW9uID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShkZWNvZGVVUkkoYW5jaG9yLmhhc2gpLCB0aGlzLl9lbGVtZW50KTtcblxuICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIG9ic2VydmFibGVTZWN0aW9uIGV4aXN0cyAmIGlzIHZpc2libGVcbiAgICAgIGlmIChpc1Zpc2libGUob2JzZXJ2YWJsZVNlY3Rpb24pKSB7XG4gICAgICAgIHRoaXMuX3RhcmdldExpbmtzLnNldChkZWNvZGVVUkkoYW5jaG9yLmhhc2gpLCBhbmNob3IpO1xuICAgICAgICB0aGlzLl9vYnNlcnZhYmxlU2VjdGlvbnMuc2V0KGFuY2hvci5oYXNoLCBvYnNlcnZhYmxlU2VjdGlvbik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIF9wcm9jZXNzKHRhcmdldCkge1xuICAgIGlmICh0aGlzLl9hY3RpdmVUYXJnZXQgPT09IHRhcmdldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jbGVhckFjdGl2ZUNsYXNzKHRoaXMuX2NvbmZpZy50YXJnZXQpO1xuICAgIHRoaXMuX2FjdGl2ZVRhcmdldCA9IHRhcmdldDtcbiAgICB0YXJnZXQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSQxKTtcbiAgICB0aGlzLl9hY3RpdmF0ZVBhcmVudHModGFyZ2V0KTtcbiAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9BQ1RJVkFURSwge1xuICAgICAgcmVsYXRlZFRhcmdldDogdGFyZ2V0XG4gICAgfSk7XG4gIH1cbiAgX2FjdGl2YXRlUGFyZW50cyh0YXJnZXQpIHtcbiAgICAvLyBBY3RpdmF0ZSBkcm9wZG93biBwYXJlbnRzXG4gICAgaWYgKHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9EUk9QRE9XTl9JVEVNKSkge1xuICAgICAgU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUkMSwgdGFyZ2V0LmNsb3Nlc3QoU0VMRUNUT1JfRFJPUERPV04pKS5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFJDEpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGxpc3RHcm91cCBvZiBTZWxlY3RvckVuZ2luZS5wYXJlbnRzKHRhcmdldCwgU0VMRUNUT1JfTkFWX0xJU1RfR1JPVVApKSB7XG4gICAgICAvLyBTZXQgdHJpZ2dlcmVkIGxpbmtzIHBhcmVudHMgYXMgYWN0aXZlXG4gICAgICAvLyBXaXRoIGJvdGggPHVsPiBhbmQgPG5hdj4gbWFya3VwIGEgcGFyZW50IGlzIHRoZSBwcmV2aW91cyBzaWJsaW5nIG9mIGFueSBuYXYgYW5jZXN0b3JcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBTZWxlY3RvckVuZ2luZS5wcmV2KGxpc3RHcm91cCwgU0VMRUNUT1JfTElOS19JVEVNUykpIHtcbiAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFJDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBfY2xlYXJBY3RpdmVDbGFzcyhwYXJlbnQpIHtcbiAgICBwYXJlbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSQxKTtcbiAgICBjb25zdCBhY3RpdmVOb2RlcyA9IFNlbGVjdG9yRW5naW5lLmZpbmQoYCR7U0VMRUNUT1JfVEFSR0VUX0xJTktTfS4ke0NMQVNTX05BTUVfQUNUSVZFJDF9YCwgcGFyZW50KTtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgYWN0aXZlTm9kZXMpIHtcbiAgICAgIG5vZGUuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSQxKTtcbiAgICB9XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBTY3JvbGxTcHkuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgfVxuICAgICAgZGF0YVtjb25maWddKCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbih3aW5kb3csIEVWRU5UX0xPQURfREFUQV9BUEkkMSwgKCkgPT4ge1xuICBmb3IgKGNvbnN0IHNweSBvZiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfU1BZKSkge1xuICAgIFNjcm9sbFNweS5nZXRPckNyZWF0ZUluc3RhbmNlKHNweSk7XG4gIH1cbn0pO1xuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihTY3JvbGxTcHkpO1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdGFiLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUkMSA9ICd0YWInO1xuY29uc3QgREFUQV9LRVkkMSA9ICdicy50YWInO1xuY29uc3QgRVZFTlRfS0VZJDEgPSBgLiR7REFUQV9LRVkkMX1gO1xuY29uc3QgRVZFTlRfSElERSQxID0gYGhpZGUke0VWRU5UX0tFWSQxfWA7XG5jb25zdCBFVkVOVF9ISURERU4kMSA9IGBoaWRkZW4ke0VWRU5UX0tFWSQxfWA7XG5jb25zdCBFVkVOVF9TSE9XJDEgPSBgc2hvdyR7RVZFTlRfS0VZJDF9YDtcbmNvbnN0IEVWRU5UX1NIT1dOJDEgPSBgc2hvd24ke0VWRU5UX0tFWSQxfWA7XG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSA9IGBjbGljayR7RVZFTlRfS0VZJDF9YDtcbmNvbnN0IEVWRU5UX0tFWURPV04gPSBga2V5ZG93biR7RVZFTlRfS0VZJDF9YDtcbmNvbnN0IEVWRU5UX0xPQURfREFUQV9BUEkgPSBgbG9hZCR7RVZFTlRfS0VZJDF9YDtcbmNvbnN0IEFSUk9XX0xFRlRfS0VZID0gJ0Fycm93TGVmdCc7XG5jb25zdCBBUlJPV19SSUdIVF9LRVkgPSAnQXJyb3dSaWdodCc7XG5jb25zdCBBUlJPV19VUF9LRVkgPSAnQXJyb3dVcCc7XG5jb25zdCBBUlJPV19ET1dOX0tFWSA9ICdBcnJvd0Rvd24nO1xuY29uc3QgSE9NRV9LRVkgPSAnSG9tZSc7XG5jb25zdCBFTkRfS0VZID0gJ0VuZCc7XG5jb25zdCBDTEFTU19OQU1FX0FDVElWRSA9ICdhY3RpdmUnO1xuY29uc3QgQ0xBU1NfTkFNRV9GQURFJDEgPSAnZmFkZSc7XG5jb25zdCBDTEFTU19OQU1FX1NIT1ckMSA9ICdzaG93JztcbmNvbnN0IENMQVNTX0RST1BET1dOID0gJ2Ryb3Bkb3duJztcbmNvbnN0IFNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSA9ICcuZHJvcGRvd24tdG9nZ2xlJztcbmNvbnN0IFNFTEVDVE9SX0RST1BET1dOX01FTlUgPSAnLmRyb3Bkb3duLW1lbnUnO1xuY29uc3QgTk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRSA9IGA6bm90KCR7U0VMRUNUT1JfRFJPUERPV05fVE9HR0xFfSlgO1xuY29uc3QgU0VMRUNUT1JfVEFCX1BBTkVMID0gJy5saXN0LWdyb3VwLCAubmF2LCBbcm9sZT1cInRhYmxpc3RcIl0nO1xuY29uc3QgU0VMRUNUT1JfT1VURVIgPSAnLm5hdi1pdGVtLCAubGlzdC1ncm91cC1pdGVtJztcbmNvbnN0IFNFTEVDVE9SX0lOTkVSID0gYC5uYXYtbGluayR7Tk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRX0sIC5saXN0LWdyb3VwLWl0ZW0ke05PVF9TRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEV9LCBbcm9sZT1cInRhYlwiXSR7Tk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRX1gO1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUgPSAnW2RhdGEtYnMtdG9nZ2xlPVwidGFiXCJdLCBbZGF0YS1icy10b2dnbGU9XCJwaWxsXCJdLCBbZGF0YS1icy10b2dnbGU9XCJsaXN0XCJdJzsgLy8gVE9ETzogY291bGQgb25seSBiZSBgdGFiYCBpbiB2NlxuY29uc3QgU0VMRUNUT1JfSU5ORVJfRUxFTSA9IGAke1NFTEVDVE9SX0lOTkVSfSwgJHtTRUxFQ1RPUl9EQVRBX1RPR0dMRX1gO1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEVfQUNUSVZFID0gYC4ke0NMQVNTX05BTUVfQUNUSVZFfVtkYXRhLWJzLXRvZ2dsZT1cInRhYlwiXSwgLiR7Q0xBU1NfTkFNRV9BQ1RJVkV9W2RhdGEtYnMtdG9nZ2xlPVwicGlsbFwiXSwgLiR7Q0xBU1NfTkFNRV9BQ1RJVkV9W2RhdGEtYnMtdG9nZ2xlPVwibGlzdFwiXWA7XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIFRhYiBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50KSB7XG4gICAgc3VwZXIoZWxlbWVudCk7XG4gICAgdGhpcy5fcGFyZW50ID0gdGhpcy5fZWxlbWVudC5jbG9zZXN0KFNFTEVDVE9SX1RBQl9QQU5FTCk7XG4gICAgaWYgKCF0aGlzLl9wYXJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICAgIC8vIFRPRE86IHNob3VsZCB0aHJvdyBleGNlcHRpb24gaW4gdjZcbiAgICAgIC8vIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7ZWxlbWVudC5vdXRlckhUTUx9IGhhcyBub3QgYSB2YWxpZCBwYXJlbnQgJHtTRUxFQ1RPUl9JTk5FUl9FTEVNfWApXG4gICAgfVxuXG4gICAgLy8gU2V0IHVwIGluaXRpYWwgYXJpYSBhdHRyaWJ1dGVzXG4gICAgdGhpcy5fc2V0SW5pdGlhbEF0dHJpYnV0ZXModGhpcy5fcGFyZW50LCB0aGlzLl9nZXRDaGlsZHJlbigpKTtcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZRE9XTiwgZXZlbnQgPT4gdGhpcy5fa2V5ZG93bihldmVudCkpO1xuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUUkMTtcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBzaG93KCkge1xuICAgIC8vIFNob3dzIHRoaXMgZWxlbSBhbmQgZGVhY3RpdmF0ZSB0aGUgYWN0aXZlIHNpYmxpbmcgaWYgZXhpc3RzXG4gICAgY29uc3QgaW5uZXJFbGVtID0gdGhpcy5fZWxlbWVudDtcbiAgICBpZiAodGhpcy5fZWxlbUlzQWN0aXZlKGlubmVyRWxlbSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTZWFyY2ggZm9yIGFjdGl2ZSB0YWIgb24gc2FtZSBwYXJlbnQgdG8gZGVhY3RpdmF0ZSBpdFxuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuX2dldEFjdGl2ZUVsZW0oKTtcbiAgICBjb25zdCBoaWRlRXZlbnQgPSBhY3RpdmUgPyBFdmVudEhhbmRsZXIudHJpZ2dlcihhY3RpdmUsIEVWRU5UX0hJREUkMSwge1xuICAgICAgcmVsYXRlZFRhcmdldDogaW5uZXJFbGVtXG4gICAgfSkgOiBudWxsO1xuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKGlubmVyRWxlbSwgRVZFTlRfU0hPVyQxLCB7XG4gICAgICByZWxhdGVkVGFyZ2V0OiBhY3RpdmVcbiAgICB9KTtcbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgfHwgaGlkZUV2ZW50ICYmIGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2RlYWN0aXZhdGUoYWN0aXZlLCBpbm5lckVsZW0pO1xuICAgIHRoaXMuX2FjdGl2YXRlKGlubmVyRWxlbSwgYWN0aXZlKTtcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2FjdGl2YXRlKGVsZW1lbnQsIHJlbGF0ZWRFbGVtKSB7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSk7XG4gICAgdGhpcy5fYWN0aXZhdGUoU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3RvcihlbGVtZW50KSk7IC8vIFNlYXJjaCBhbmQgYWN0aXZhdGUvc2hvdyB0aGUgcHJvcGVyIHNlY3Rpb25cblxuICAgIGNvbnN0IGNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdyb2xlJykgIT09ICd0YWInKSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1ckMSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpO1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCB0cnVlKTtcbiAgICAgIHRoaXMuX3RvZ2dsZURyb3BEb3duKGVsZW1lbnQsIHRydWUpO1xuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIoZWxlbWVudCwgRVZFTlRfU0hPV04kMSwge1xuICAgICAgICByZWxhdGVkVGFyZ2V0OiByZWxhdGVkRWxlbVxuICAgICAgfSk7XG4gICAgfTtcbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCBlbGVtZW50LCBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0ZBREUkMSkpO1xuICB9XG4gIF9kZWFjdGl2YXRlKGVsZW1lbnQsIHJlbGF0ZWRFbGVtKSB7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSk7XG4gICAgZWxlbWVudC5ibHVyKCk7XG4gICAgdGhpcy5fZGVhY3RpdmF0ZShTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKGVsZW1lbnQpKTsgLy8gU2VhcmNoIGFuZCBkZWFjdGl2YXRlIHRoZSBzaG93biBzZWN0aW9uIHRvb1xuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSAhPT0gJ3RhYicpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVyQxKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCBmYWxzZSk7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKTtcbiAgICAgIHRoaXMuX3RvZ2dsZURyb3BEb3duKGVsZW1lbnQsIGZhbHNlKTtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKGVsZW1lbnQsIEVWRU5UX0hJRERFTiQxLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHJlbGF0ZWRFbGVtXG4gICAgICB9KTtcbiAgICB9O1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIGVsZW1lbnQsIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRkFERSQxKSk7XG4gIH1cbiAgX2tleWRvd24oZXZlbnQpIHtcbiAgICBpZiAoIVtBUlJPV19MRUZUX0tFWSwgQVJST1dfUklHSFRfS0VZLCBBUlJPV19VUF9LRVksIEFSUk9XX0RPV05fS0VZLCBIT01FX0tFWSwgRU5EX0tFWV0uaW5jbHVkZXMoZXZlbnQua2V5KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgLy8gc3RvcFByb3BhZ2F0aW9uL3ByZXZlbnREZWZhdWx0IGJvdGggYWRkZWQgdG8gc3VwcG9ydCB1cC9kb3duIGtleXMgd2l0aG91dCBzY3JvbGxpbmcgdGhlIHBhZ2VcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5fZ2V0Q2hpbGRyZW4oKS5maWx0ZXIoZWxlbWVudCA9PiAhaXNEaXNhYmxlZChlbGVtZW50KSk7XG4gICAgbGV0IG5leHRBY3RpdmVFbGVtZW50O1xuICAgIGlmIChbSE9NRV9LRVksIEVORF9LRVldLmluY2x1ZGVzKGV2ZW50LmtleSkpIHtcbiAgICAgIG5leHRBY3RpdmVFbGVtZW50ID0gY2hpbGRyZW5bZXZlbnQua2V5ID09PSBIT01FX0tFWSA/IDAgOiBjaGlsZHJlbi5sZW5ndGggLSAxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaXNOZXh0ID0gW0FSUk9XX1JJR0hUX0tFWSwgQVJST1dfRE9XTl9LRVldLmluY2x1ZGVzKGV2ZW50LmtleSk7XG4gICAgICBuZXh0QWN0aXZlRWxlbWVudCA9IGdldE5leHRBY3RpdmVFbGVtZW50KGNoaWxkcmVuLCBldmVudC50YXJnZXQsIGlzTmV4dCwgdHJ1ZSk7XG4gICAgfVxuICAgIGlmIChuZXh0QWN0aXZlRWxlbWVudCkge1xuICAgICAgbmV4dEFjdGl2ZUVsZW1lbnQuZm9jdXMoe1xuICAgICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIFRhYi5nZXRPckNyZWF0ZUluc3RhbmNlKG5leHRBY3RpdmVFbGVtZW50KS5zaG93KCk7XG4gICAgfVxuICB9XG4gIF9nZXRDaGlsZHJlbigpIHtcbiAgICAvLyBjb2xsZWN0aW9uIG9mIGlubmVyIGVsZW1lbnRzXG4gICAgcmV0dXJuIFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfSU5ORVJfRUxFTSwgdGhpcy5fcGFyZW50KTtcbiAgfVxuICBfZ2V0QWN0aXZlRWxlbSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0Q2hpbGRyZW4oKS5maW5kKGNoaWxkID0+IHRoaXMuX2VsZW1Jc0FjdGl2ZShjaGlsZCkpIHx8IG51bGw7XG4gIH1cbiAgX3NldEluaXRpYWxBdHRyaWJ1dGVzKHBhcmVudCwgY2hpbGRyZW4pIHtcbiAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyhwYXJlbnQsICdyb2xlJywgJ3RhYmxpc3QnKTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICB0aGlzLl9zZXRJbml0aWFsQXR0cmlidXRlc09uQ2hpbGQoY2hpbGQpO1xuICAgIH1cbiAgfVxuICBfc2V0SW5pdGlhbEF0dHJpYnV0ZXNPbkNoaWxkKGNoaWxkKSB7XG4gICAgY2hpbGQgPSB0aGlzLl9nZXRJbm5lckVsZW1lbnQoY2hpbGQpO1xuICAgIGNvbnN0IGlzQWN0aXZlID0gdGhpcy5fZWxlbUlzQWN0aXZlKGNoaWxkKTtcbiAgICBjb25zdCBvdXRlckVsZW0gPSB0aGlzLl9nZXRPdXRlckVsZW1lbnQoY2hpbGQpO1xuICAgIGNoaWxkLnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsIGlzQWN0aXZlKTtcbiAgICBpZiAob3V0ZXJFbGVtICE9PSBjaGlsZCkge1xuICAgICAgdGhpcy5fc2V0QXR0cmlidXRlSWZOb3RFeGlzdHMob3V0ZXJFbGVtLCAncm9sZScsICdwcmVzZW50YXRpb24nKTtcbiAgICB9XG4gICAgaWYgKCFpc0FjdGl2ZSkge1xuICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICctMScpO1xuICAgIH1cbiAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyhjaGlsZCwgJ3JvbGUnLCAndGFiJyk7XG5cbiAgICAvLyBzZXQgYXR0cmlidXRlcyB0byB0aGUgcmVsYXRlZCBwYW5lbCB0b29cbiAgICB0aGlzLl9zZXRJbml0aWFsQXR0cmlidXRlc09uVGFyZ2V0UGFuZWwoY2hpbGQpO1xuICB9XG4gIF9zZXRJbml0aWFsQXR0cmlidXRlc09uVGFyZ2V0UGFuZWwoY2hpbGQpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKGNoaWxkKTtcbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyh0YXJnZXQsICdyb2xlJywgJ3RhYnBhbmVsJyk7XG4gICAgaWYgKGNoaWxkLmlkKSB7XG4gICAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyh0YXJnZXQsICdhcmlhLWxhYmVsbGVkYnknLCBgJHtjaGlsZC5pZH1gKTtcbiAgICB9XG4gIH1cbiAgX3RvZ2dsZURyb3BEb3duKGVsZW1lbnQsIG9wZW4pIHtcbiAgICBjb25zdCBvdXRlckVsZW0gPSB0aGlzLl9nZXRPdXRlckVsZW1lbnQoZWxlbWVudCk7XG4gICAgaWYgKCFvdXRlckVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX0RST1BET1dOKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0b2dnbGUgPSAoc2VsZWN0b3IsIGNsYXNzTmFtZSkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoc2VsZWN0b3IsIG91dGVyRWxlbSk7XG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoY2xhc3NOYW1lLCBvcGVuKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRvZ2dsZShTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUsIENMQVNTX05BTUVfQUNUSVZFKTtcbiAgICB0b2dnbGUoU0VMRUNUT1JfRFJPUERPV05fTUVOVSwgQ0xBU1NfTkFNRV9TSE9XJDEpO1xuICAgIG91dGVyRWxlbS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBvcGVuKTtcbiAgfVxuICBfc2V0QXR0cmlidXRlSWZOb3RFeGlzdHMoZWxlbWVudCwgYXR0cmlidXRlLCB2YWx1ZSkge1xuICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlKSkge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIF9lbGVtSXNBY3RpdmUoZWxlbSkge1xuICAgIHJldHVybiBlbGVtLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0FDVElWRSk7XG4gIH1cblxuICAvLyBUcnkgdG8gZ2V0IHRoZSBpbm5lciBlbGVtZW50ICh1c3VhbGx5IHRoZSAubmF2LWxpbmspXG4gIF9nZXRJbm5lckVsZW1lbnQoZWxlbSkge1xuICAgIHJldHVybiBlbGVtLm1hdGNoZXMoU0VMRUNUT1JfSU5ORVJfRUxFTSkgPyBlbGVtIDogU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9JTk5FUl9FTEVNLCBlbGVtKTtcbiAgfVxuXG4gIC8vIFRyeSB0byBnZXQgdGhlIG91dGVyIGVsZW1lbnQgKHVzdWFsbHkgdGhlIC5uYXYtaXRlbSlcbiAgX2dldE91dGVyRWxlbWVudChlbGVtKSB7XG4gICAgcmV0dXJuIGVsZW0uY2xvc2VzdChTRUxFQ1RPUl9PVVRFUikgfHwgZWxlbTtcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFRhYi5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMpO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgfVxuICAgICAgZGF0YVtjb25maWddKCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEksIFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgaWYgKFsnQScsICdBUkVBJ10uaW5jbHVkZXModGhpcy50YWdOYW1lKSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbiAgaWYgKGlzRGlzYWJsZWQodGhpcykpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgVGFiLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcykuc2hvdygpO1xufSk7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBvbiBmb2N1c1xuICovXG5FdmVudEhhbmRsZXIub24od2luZG93LCBFVkVOVF9MT0FEX0RBVEFfQVBJLCAoKSA9PiB7XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfVE9HR0xFX0FDVElWRSkpIHtcbiAgICBUYWIuZ2V0T3JDcmVhdGVJbnN0YW5jZShlbGVtZW50KTtcbiAgfVxufSk7XG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihUYWIpO1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdG9hc3QuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICd0b2FzdCc7XG5jb25zdCBEQVRBX0tFWSA9ICdicy50b2FzdCc7XG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YDtcbmNvbnN0IEVWRU5UX01PVVNFT1ZFUiA9IGBtb3VzZW92ZXIke0VWRU5UX0tFWX1gO1xuY29uc3QgRVZFTlRfTU9VU0VPVVQgPSBgbW91c2VvdXQke0VWRU5UX0tFWX1gO1xuY29uc3QgRVZFTlRfRk9DVVNJTiA9IGBmb2N1c2luJHtFVkVOVF9LRVl9YDtcbmNvbnN0IEVWRU5UX0ZPQ1VTT1VUID0gYGZvY3Vzb3V0JHtFVkVOVF9LRVl9YDtcbmNvbnN0IEVWRU5UX0hJREUgPSBgaGlkZSR7RVZFTlRfS0VZfWA7XG5jb25zdCBFVkVOVF9ISURERU4gPSBgaGlkZGVuJHtFVkVOVF9LRVl9YDtcbmNvbnN0IEVWRU5UX1NIT1cgPSBgc2hvdyR7RVZFTlRfS0VZfWA7XG5jb25zdCBFVkVOVF9TSE9XTiA9IGBzaG93biR7RVZFTlRfS0VZfWA7XG5jb25zdCBDTEFTU19OQU1FX0ZBREUgPSAnZmFkZSc7XG5jb25zdCBDTEFTU19OQU1FX0hJREUgPSAnaGlkZSc7IC8vIEBkZXByZWNhdGVkIC0ga2VwdCBoZXJlIG9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5jb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdyc7XG5jb25zdCBDTEFTU19OQU1FX1NIT1dJTkcgPSAnc2hvd2luZyc7XG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgYW5pbWF0aW9uOiAnYm9vbGVhbicsXG4gIGF1dG9oaWRlOiAnYm9vbGVhbicsXG4gIGRlbGF5OiAnbnVtYmVyJ1xufTtcbmNvbnN0IERlZmF1bHQgPSB7XG4gIGFuaW1hdGlvbjogdHJ1ZSxcbiAgYXV0b2hpZGU6IHRydWUsXG4gIGRlbGF5OiA1MDAwXG59O1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBUb2FzdCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpO1xuICAgIHRoaXMuX3RpbWVvdXQgPSBudWxsO1xuICAgIHRoaXMuX2hhc01vdXNlSW50ZXJhY3Rpb24gPSBmYWxzZTtcbiAgICB0aGlzLl9oYXNLZXlib2FyZEludGVyYWN0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5fc2V0TGlzdGVuZXJzKCk7XG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdDtcbiAgfVxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZTtcbiAgfVxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUU7XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgc2hvdygpIHtcbiAgICBjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XKTtcbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fY2xlYXJUaW1lb3V0KCk7XG4gICAgaWYgKHRoaXMuX2NvbmZpZy5hbmltYXRpb24pIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0ZBREUpO1xuICAgIH1cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1dJTkcpO1xuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPV04pO1xuICAgICAgdGhpcy5fbWF5YmVTY2hlZHVsZUhpZGUoKTtcbiAgICB9O1xuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0hJREUpOyAvLyBAZGVwcmVjYXRlZFxuICAgIHJlZmxvdyh0aGlzLl9lbGVtZW50KTtcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XLCBDTEFTU19OQU1FX1NIT1dJTkcpO1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMuX2VsZW1lbnQsIHRoaXMuX2NvbmZpZy5hbmltYXRpb24pO1xuICB9XG4gIGhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLmlzU2hvd24oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFKTtcbiAgICBpZiAoaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9ISURFKTsgLy8gQGRlcHJlY2F0ZWRcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1dJTkcsIENMQVNTX05BTUVfU0hPVyk7XG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURERU4pO1xuICAgIH07XG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPV0lORyk7XG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgdGhpcy5fZWxlbWVudCwgdGhpcy5fY29uZmlnLmFuaW1hdGlvbik7XG4gIH1cbiAgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9jbGVhclRpbWVvdXQoKTtcbiAgICBpZiAodGhpcy5pc1Nob3duKCkpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpO1xuICAgIH1cbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cbiAgaXNTaG93bigpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TSE9XKTtcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX21heWJlU2NoZWR1bGVIaWRlKCkge1xuICAgIGlmICghdGhpcy5fY29uZmlnLmF1dG9oaWRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9oYXNNb3VzZUludGVyYWN0aW9uIHx8IHRoaXMuX2hhc0tleWJvYXJkSW50ZXJhY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfSwgdGhpcy5fY29uZmlnLmRlbGF5KTtcbiAgfVxuICBfb25JbnRlcmFjdGlvbihldmVudCwgaXNJbnRlcmFjdGluZykge1xuICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgY2FzZSAnbW91c2VvdmVyJzpcbiAgICAgIGNhc2UgJ21vdXNlb3V0JzpcbiAgICAgICAge1xuICAgICAgICAgIHRoaXMuX2hhc01vdXNlSW50ZXJhY3Rpb24gPSBpc0ludGVyYWN0aW5nO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICBjYXNlICdmb2N1c2luJzpcbiAgICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICAgICAge1xuICAgICAgICAgIHRoaXMuX2hhc0tleWJvYXJkSW50ZXJhY3Rpb24gPSBpc0ludGVyYWN0aW5nO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0ludGVyYWN0aW5nKSB7XG4gICAgICB0aGlzLl9jbGVhclRpbWVvdXQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV4dEVsZW1lbnQgPSBldmVudC5yZWxhdGVkVGFyZ2V0O1xuICAgIGlmICh0aGlzLl9lbGVtZW50ID09PSBuZXh0RWxlbWVudCB8fCB0aGlzLl9lbGVtZW50LmNvbnRhaW5zKG5leHRFbGVtZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9tYXliZVNjaGVkdWxlSGlkZSgpO1xuICB9XG4gIF9zZXRMaXN0ZW5lcnMoKSB7XG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFT1ZFUiwgZXZlbnQgPT4gdGhpcy5fb25JbnRlcmFjdGlvbihldmVudCwgdHJ1ZSkpO1xuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9NT1VTRU9VVCwgZXZlbnQgPT4gdGhpcy5fb25JbnRlcmFjdGlvbihldmVudCwgZmFsc2UpKTtcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfRk9DVVNJTiwgZXZlbnQgPT4gdGhpcy5fb25JbnRlcmFjdGlvbihldmVudCwgdHJ1ZSkpO1xuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9GT0NVU09VVCwgZXZlbnQgPT4gdGhpcy5fb25JbnRlcmFjdGlvbihldmVudCwgZmFsc2UpKTtcbiAgfVxuICBfY2xlYXJUaW1lb3V0KCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KTtcbiAgICB0aGlzLl90aW1lb3V0ID0gbnVsbDtcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFRvYXN0LmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKTtcbiAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgICB9XG4gICAgICAgIGRhdGFbY29uZmlnXSh0aGlzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuZW5hYmxlRGlzbWlzc1RyaWdnZXIoVG9hc3QpO1xuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihUb2FzdCk7XG5cbmV4cG9ydCB7IEFsZXJ0LCBCdXR0b24sIENhcm91c2VsLCBDb2xsYXBzZSwgRHJvcGRvd24sIE1vZGFsLCBPZmZjYW52YXMsIFBvcG92ZXIsIFNjcm9sbFNweSwgVGFiLCBUb2FzdCwgVG9vbHRpcCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Ym9vdHN0cmFwLmVzbS5qcy5tYXBcbiIsIi8qIVxuICogVG9hc3RpZnkganMgMS4xMi4wXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXB2YXJ1bi90b2FzdGlmeS1qc1xuICogQGxpY2Vuc2UgTUlUIGxpY2Vuc2VkXG4gKlxuICogQ29weXJpZ2h0IChDKSAyMDE4IFZhcnVuIEEgUFxuICovXG4oZnVuY3Rpb24ocm9vdCwgZmFjdG9yeSkge1xuICBpZiAodHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICB9IGVsc2Uge1xuICAgIHJvb3QuVG9hc3RpZnkgPSBmYWN0b3J5KCk7XG4gIH1cbn0pKHRoaXMsIGZ1bmN0aW9uKGdsb2JhbCkge1xuICAvLyBPYmplY3QgaW5pdGlhbGl6YXRpb25cbiAgdmFyIFRvYXN0aWZ5ID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgLy8gUmV0dXJuaW5nIGEgbmV3IGluaXQgb2JqZWN0XG4gICAgICByZXR1cm4gbmV3IFRvYXN0aWZ5LmxpYi5pbml0KG9wdGlvbnMpO1xuICAgIH0sXG4gICAgLy8gTGlicmFyeSB2ZXJzaW9uXG4gICAgdmVyc2lvbiA9IFwiMS4xMi4wXCI7XG5cbiAgLy8gU2V0IHRoZSBkZWZhdWx0IGdsb2JhbCBvcHRpb25zXG4gIFRvYXN0aWZ5LmRlZmF1bHRzID0ge1xuICAgIG9sZGVzdEZpcnN0OiB0cnVlLFxuICAgIHRleHQ6IFwiVG9hc3RpZnkgaXMgYXdlc29tZSFcIixcbiAgICBub2RlOiB1bmRlZmluZWQsXG4gICAgZHVyYXRpb246IDMwMDAsXG4gICAgc2VsZWN0b3I6IHVuZGVmaW5lZCxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gKCkge1xuICAgIH0sXG4gICAgZGVzdGluYXRpb246IHVuZGVmaW5lZCxcbiAgICBuZXdXaW5kb3c6IGZhbHNlLFxuICAgIGNsb3NlOiBmYWxzZSxcbiAgICBncmF2aXR5OiBcInRvYXN0aWZ5LXRvcFwiLFxuICAgIHBvc2l0aW9uTGVmdDogZmFsc2UsXG4gICAgcG9zaXRpb246ICcnLFxuICAgIGJhY2tncm91bmRDb2xvcjogJycsXG4gICAgYXZhdGFyOiBcIlwiLFxuICAgIGNsYXNzTmFtZTogXCJcIixcbiAgICBzdG9wT25Gb2N1czogdHJ1ZSxcbiAgICBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgfSxcbiAgICBvZmZzZXQ6IHt4OiAwLCB5OiAwfSxcbiAgICBlc2NhcGVNYXJrdXA6IHRydWUsXG4gICAgYXJpYUxpdmU6ICdwb2xpdGUnLFxuICAgIHN0eWxlOiB7YmFja2dyb3VuZDogJyd9XG4gIH07XG5cbiAgLy8gRGVmaW5pbmcgdGhlIHByb3RvdHlwZSBvZiB0aGUgb2JqZWN0XG4gIFRvYXN0aWZ5LmxpYiA9IFRvYXN0aWZ5LnByb3RvdHlwZSA9IHtcbiAgICB0b2FzdGlmeTogdmVyc2lvbixcblxuICAgIGNvbnN0cnVjdG9yOiBUb2FzdGlmeSxcblxuICAgIC8vIEluaXRpYWxpemluZyB0aGUgb2JqZWN0IHdpdGggcmVxdWlyZWQgcGFyYW1ldGVyc1xuICAgIGluaXQ6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgIC8vIFZlcmlmeWluZyBhbmQgdmFsaWRhdGluZyB0aGUgaW5wdXQgb2JqZWN0XG4gICAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGluZyB0aGUgb3B0aW9ucyBvYmplY3RcbiAgICAgIHRoaXMub3B0aW9ucyA9IHt9O1xuXG4gICAgICB0aGlzLnRvYXN0RWxlbWVudCA9IG51bGw7XG5cbiAgICAgIC8vIFZhbGlkYXRpbmcgdGhlIG9wdGlvbnNcbiAgICAgIHRoaXMub3B0aW9ucy50ZXh0ID0gb3B0aW9ucy50ZXh0IHx8IFRvYXN0aWZ5LmRlZmF1bHRzLnRleHQ7IC8vIERpc3BsYXkgbWVzc2FnZVxuICAgICAgdGhpcy5vcHRpb25zLm5vZGUgPSBvcHRpb25zLm5vZGUgfHwgVG9hc3RpZnkuZGVmYXVsdHMubm9kZTsgIC8vIERpc3BsYXkgY29udGVudCBhcyBub2RlXG4gICAgICB0aGlzLm9wdGlvbnMuZHVyYXRpb24gPSBvcHRpb25zLmR1cmF0aW9uID09PSAwID8gMCA6IG9wdGlvbnMuZHVyYXRpb24gfHwgVG9hc3RpZnkuZGVmYXVsdHMuZHVyYXRpb247IC8vIERpc3BsYXkgZHVyYXRpb25cbiAgICAgIHRoaXMub3B0aW9ucy5zZWxlY3RvciA9IG9wdGlvbnMuc2VsZWN0b3IgfHwgVG9hc3RpZnkuZGVmYXVsdHMuc2VsZWN0b3I7IC8vIFBhcmVudCBzZWxlY3RvclxuICAgICAgdGhpcy5vcHRpb25zLmNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjayB8fCBUb2FzdGlmeS5kZWZhdWx0cy5jYWxsYmFjazsgLy8gQ2FsbGJhY2sgYWZ0ZXIgZGlzcGxheVxuICAgICAgdGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uID0gb3B0aW9ucy5kZXN0aW5hdGlvbiB8fCBUb2FzdGlmeS5kZWZhdWx0cy5kZXN0aW5hdGlvbjsgLy8gT24tY2xpY2sgZGVzdGluYXRpb25cbiAgICAgIHRoaXMub3B0aW9ucy5uZXdXaW5kb3cgPSBvcHRpb25zLm5ld1dpbmRvdyB8fCBUb2FzdGlmeS5kZWZhdWx0cy5uZXdXaW5kb3c7IC8vIE9wZW4gZGVzdGluYXRpb24gaW4gbmV3IHdpbmRvd1xuICAgICAgdGhpcy5vcHRpb25zLmNsb3NlID0gb3B0aW9ucy5jbG9zZSB8fCBUb2FzdGlmeS5kZWZhdWx0cy5jbG9zZTsgLy8gU2hvdyB0b2FzdCBjbG9zZSBpY29uXG4gICAgICB0aGlzLm9wdGlvbnMuZ3Jhdml0eSA9IG9wdGlvbnMuZ3Jhdml0eSA9PT0gXCJib3R0b21cIiA/IFwidG9hc3RpZnktYm90dG9tXCIgOiBUb2FzdGlmeS5kZWZhdWx0cy5ncmF2aXR5OyAvLyB0b2FzdCBwb3NpdGlvbiAtIHRvcCBvciBib3R0b21cbiAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbkxlZnQgPSBvcHRpb25zLnBvc2l0aW9uTGVmdCB8fCBUb2FzdGlmeS5kZWZhdWx0cy5wb3NpdGlvbkxlZnQ7IC8vIHRvYXN0IHBvc2l0aW9uIC0gbGVmdCBvciByaWdodFxuICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uID0gb3B0aW9ucy5wb3NpdGlvbiB8fCBUb2FzdGlmeS5kZWZhdWx0cy5wb3NpdGlvbjsgLy8gdG9hc3QgcG9zaXRpb24gLSBsZWZ0IG9yIHJpZ2h0XG4gICAgICB0aGlzLm9wdGlvbnMuYmFja2dyb3VuZENvbG9yID0gb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IgfHwgVG9hc3RpZnkuZGVmYXVsdHMuYmFja2dyb3VuZENvbG9yOyAvLyB0b2FzdCBiYWNrZ3JvdW5kIGNvbG9yXG4gICAgICB0aGlzLm9wdGlvbnMuYXZhdGFyID0gb3B0aW9ucy5hdmF0YXIgfHwgVG9hc3RpZnkuZGVmYXVsdHMuYXZhdGFyOyAvLyBpbWcgZWxlbWVudCBzcmMgLSB1cmwgb3IgYSBwYXRoXG4gICAgICB0aGlzLm9wdGlvbnMuY2xhc3NOYW1lID0gb3B0aW9ucy5jbGFzc05hbWUgfHwgVG9hc3RpZnkuZGVmYXVsdHMuY2xhc3NOYW1lOyAvLyBhZGRpdGlvbmFsIGNsYXNzIG5hbWVzIGZvciB0aGUgdG9hc3RcbiAgICAgIHRoaXMub3B0aW9ucy5zdG9wT25Gb2N1cyA9IG9wdGlvbnMuc3RvcE9uRm9jdXMgPT09IHVuZGVmaW5lZCA/IFRvYXN0aWZ5LmRlZmF1bHRzLnN0b3BPbkZvY3VzIDogb3B0aW9ucy5zdG9wT25Gb2N1czsgLy8gc3RvcCB0aW1lb3V0IG9uIGZvY3VzXG4gICAgICB0aGlzLm9wdGlvbnMub25DbGljayA9IG9wdGlvbnMub25DbGljayB8fCBUb2FzdGlmeS5kZWZhdWx0cy5vbkNsaWNrOyAvLyBDYWxsYmFjayBhZnRlciBjbGlja1xuICAgICAgdGhpcy5vcHRpb25zLm9mZnNldCA9IG9wdGlvbnMub2Zmc2V0IHx8IFRvYXN0aWZ5LmRlZmF1bHRzLm9mZnNldDsgLy8gdG9hc3Qgb2Zmc2V0XG4gICAgICB0aGlzLm9wdGlvbnMuZXNjYXBlTWFya3VwID0gb3B0aW9ucy5lc2NhcGVNYXJrdXAgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZXNjYXBlTWFya3VwIDogVG9hc3RpZnkuZGVmYXVsdHMuZXNjYXBlTWFya3VwO1xuICAgICAgdGhpcy5vcHRpb25zLmFyaWFMaXZlID0gb3B0aW9ucy5hcmlhTGl2ZSB8fCBUb2FzdGlmeS5kZWZhdWx0cy5hcmlhTGl2ZTtcbiAgICAgIHRoaXMub3B0aW9ucy5zdHlsZSA9IG9wdGlvbnMuc3R5bGUgfHwgVG9hc3RpZnkuZGVmYXVsdHMuc3R5bGU7XG4gICAgICBpZihvcHRpb25zLmJhY2tncm91bmRDb2xvcikge1xuICAgICAgICB0aGlzLm9wdGlvbnMuc3R5bGUuYmFja2dyb3VuZCA9IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXR1cm5pbmcgdGhlIGN1cnJlbnQgb2JqZWN0IGZvciBjaGFpbmluZyBmdW5jdGlvbnNcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZGluZyB0aGUgRE9NIGVsZW1lbnRcbiAgICBidWlsZFRvYXN0OiBmdW5jdGlvbigpIHtcbiAgICAgIC8vIFZhbGlkYXRpbmcgaWYgdGhlIG9wdGlvbnMgYXJlIGRlZmluZWRcbiAgICAgIGlmICghdGhpcy5vcHRpb25zKSB7XG4gICAgICAgIHRocm93IFwiVG9hc3RpZnkgaXMgbm90IGluaXRpYWxpemVkXCI7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0aW5nIHRoZSBET00gb2JqZWN0XG4gICAgICB2YXIgZGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBkaXZFbGVtZW50LmNsYXNzTmFtZSA9IFwidG9hc3RpZnkgb24gXCIgKyB0aGlzLm9wdGlvbnMuY2xhc3NOYW1lO1xuXG4gICAgICAvLyBQb3NpdGlvbmluZyB0b2FzdCB0byBsZWZ0IG9yIHJpZ2h0IG9yIGNlbnRlclxuICAgICAgaWYgKCEhdGhpcy5vcHRpb25zLnBvc2l0aW9uKSB7XG4gICAgICAgIGRpdkVsZW1lbnQuY2xhc3NOYW1lICs9IFwiIHRvYXN0aWZ5LVwiICsgdGhpcy5vcHRpb25zLnBvc2l0aW9uO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVG8gYmUgZGVwcmVjaWF0ZWQgaW4gZnVydGhlciB2ZXJzaW9uc1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBvc2l0aW9uTGVmdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGRpdkVsZW1lbnQuY2xhc3NOYW1lICs9IFwiIHRvYXN0aWZ5LWxlZnRcIjtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1Byb3BlcnR5IGBwb3NpdGlvbkxlZnRgIHdpbGwgYmUgZGVwcmVjaWF0ZWQgaW4gZnVydGhlciB2ZXJzaW9ucy4gUGxlYXNlIHVzZSBgcG9zaXRpb25gIGluc3RlYWQuJylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEZWZhdWx0IHBvc2l0aW9uXG4gICAgICAgICAgZGl2RWxlbWVudC5jbGFzc05hbWUgKz0gXCIgdG9hc3RpZnktcmlnaHRcIjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBc3NpZ25pbmcgZ3Jhdml0eSBvZiBlbGVtZW50XG4gICAgICBkaXZFbGVtZW50LmNsYXNzTmFtZSArPSBcIiBcIiArIHRoaXMub3B0aW9ucy5ncmF2aXR5O1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmJhY2tncm91bmRDb2xvcikge1xuICAgICAgICAvLyBUaGlzIGlzIGJlaW5nIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgdXNpbmcgdGhlIHN0eWxlIEhUTUwgRE9NIHByb3BlcnR5XG4gICAgICAgIGNvbnNvbGUud2FybignREVQUkVDQVRJT04gTk9USUNFOiBcImJhY2tncm91bmRDb2xvclwiIGlzIGJlaW5nIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdGhlIFwic3R5bGUuYmFja2dyb3VuZFwiIHByb3BlcnR5LicpO1xuICAgICAgfVxuXG4gICAgICAvLyBMb29wIHRocm91Z2ggb3VyIHN0eWxlIG9iamVjdCBhbmQgYXBwbHkgc3R5bGVzIHRvIGRpdkVsZW1lbnRcbiAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMub3B0aW9ucy5zdHlsZSkge1xuICAgICAgICBkaXZFbGVtZW50LnN0eWxlW3Byb3BlcnR5XSA9IHRoaXMub3B0aW9ucy5zdHlsZVtwcm9wZXJ0eV07XG4gICAgICB9XG5cbiAgICAgIC8vIEFubm91bmNlIHRoZSB0b2FzdCB0byBzY3JlZW4gcmVhZGVyc1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5hcmlhTGl2ZSkge1xuICAgICAgICBkaXZFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1saXZlJywgdGhpcy5vcHRpb25zLmFyaWFMaXZlKVxuICAgICAgfVxuXG4gICAgICAvLyBBZGRpbmcgdGhlIHRvYXN0IG1lc3NhZ2Uvbm9kZVxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5ub2RlICYmIHRoaXMub3B0aW9ucy5ub2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgdmFsaWQgbm9kZSwgd2UgaW5zZXJ0IGl0XG4gICAgICAgIGRpdkVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5vcHRpb25zLm5vZGUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVzY2FwZU1hcmt1cCkge1xuICAgICAgICAgIGRpdkVsZW1lbnQuaW5uZXJUZXh0ID0gdGhpcy5vcHRpb25zLnRleHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGl2RWxlbWVudC5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMudGV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXZhdGFyICE9PSBcIlwiKSB7XG4gICAgICAgICAgdmFyIGF2YXRhckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuICAgICAgICAgIGF2YXRhckVsZW1lbnQuc3JjID0gdGhpcy5vcHRpb25zLmF2YXRhcjtcblxuICAgICAgICAgIGF2YXRhckVsZW1lbnQuY2xhc3NOYW1lID0gXCJ0b2FzdGlmeS1hdmF0YXJcIjtcblxuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucG9zaXRpb24gPT0gXCJsZWZ0XCIgfHwgdGhpcy5vcHRpb25zLnBvc2l0aW9uTGVmdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgLy8gQWRkaW5nIGNsb3NlIGljb24gb24gdGhlIGxlZnQgb2YgY29udGVudFxuICAgICAgICAgICAgZGl2RWxlbWVudC5hcHBlbmRDaGlsZChhdmF0YXJFbGVtZW50KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQWRkaW5nIGNsb3NlIGljb24gb24gdGhlIHJpZ2h0IG9mIGNvbnRlbnRcbiAgICAgICAgICAgIGRpdkVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYWZ0ZXJiZWdpblwiLCBhdmF0YXJFbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQWRkaW5nIGEgY2xvc2UgaWNvbiB0byB0aGUgdG9hc3RcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2xvc2UgPT09IHRydWUpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgc3BhbiBmb3IgY2xvc2UgZWxlbWVudFxuICAgICAgICB2YXIgY2xvc2VFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgY2xvc2VFbGVtZW50LnR5cGUgPSBcImJ1dHRvblwiO1xuICAgICAgICBjbG9zZUVsZW1lbnQuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBcIkNsb3NlXCIpO1xuICAgICAgICBjbG9zZUVsZW1lbnQuY2xhc3NOYW1lID0gXCJ0b2FzdC1jbG9zZVwiO1xuICAgICAgICBjbG9zZUVsZW1lbnQuaW5uZXJIVE1MID0gXCImIzEwMDA2O1wiO1xuXG4gICAgICAgIC8vIFRyaWdnZXJpbmcgdGhlIHJlbW92YWwgb2YgdG9hc3QgZnJvbSBET00gb24gY2xvc2UgY2xpY2tcbiAgICAgICAgY2xvc2VFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgXCJjbGlja1wiLFxuICAgICAgICAgIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRWxlbWVudCh0aGlzLnRvYXN0RWxlbWVudCk7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudG9hc3RFbGVtZW50LnRpbWVPdXRWYWx1ZSk7XG4gICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG5cbiAgICAgICAgLy9DYWxjdWxhdGluZyBzY3JlZW4gd2lkdGhcbiAgICAgICAgdmFyIHdpZHRoID0gd2luZG93LmlubmVyV2lkdGggPiAwID8gd2luZG93LmlubmVyV2lkdGggOiBzY3JlZW4ud2lkdGg7XG5cbiAgICAgICAgLy8gQWRkaW5nIHRoZSBjbG9zZSBpY29uIHRvIHRoZSB0b2FzdCBlbGVtZW50XG4gICAgICAgIC8vIERpc3BsYXkgb24gdGhlIHJpZ2h0IGlmIHNjcmVlbiB3aWR0aCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMzYwcHhcbiAgICAgICAgaWYgKCh0aGlzLm9wdGlvbnMucG9zaXRpb24gPT0gXCJsZWZ0XCIgfHwgdGhpcy5vcHRpb25zLnBvc2l0aW9uTGVmdCA9PT0gdHJ1ZSkgJiYgd2lkdGggPiAzNjApIHtcbiAgICAgICAgICAvLyBBZGRpbmcgY2xvc2UgaWNvbiBvbiB0aGUgbGVmdCBvZiBjb250ZW50XG4gICAgICAgICAgZGl2RWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoXCJhZnRlcmJlZ2luXCIsIGNsb3NlRWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQWRkaW5nIGNsb3NlIGljb24gb24gdGhlIHJpZ2h0IG9mIGNvbnRlbnRcbiAgICAgICAgICBkaXZFbGVtZW50LmFwcGVuZENoaWxkKGNsb3NlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYXIgdGltZW91dCB3aGlsZSB0b2FzdCBpcyBmb2N1c2VkXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnN0b3BPbkZvY3VzICYmIHRoaXMub3B0aW9ucy5kdXJhdGlvbiA+IDApIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICAvLyBzdG9wIGNvdW50ZG93blxuICAgICAgICBkaXZFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgXCJtb3VzZW92ZXJcIixcbiAgICAgICAgICBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChkaXZFbGVtZW50LnRpbWVPdXRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICAgIC8vIGFkZCBiYWNrIHRoZSB0aW1lb3V0XG4gICAgICAgIGRpdkVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICBcIm1vdXNlbGVhdmVcIixcbiAgICAgICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGRpdkVsZW1lbnQudGltZU91dFZhbHVlID0gd2luZG93LnNldFRpbWVvdXQoXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgdG9hc3QgZnJvbSBET01cbiAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZUVsZW1lbnQoZGl2RWxlbWVudCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kdXJhdGlvblxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvLyBBZGRpbmcgYW4gb24tY2xpY2sgZGVzdGluYXRpb24gcGF0aFxuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuZGVzdGluYXRpb24gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgZGl2RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgIFwiY2xpY2tcIixcbiAgICAgICAgICBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5ld1dpbmRvdyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICB3aW5kb3cub3Blbih0aGlzLm9wdGlvbnMuZGVzdGluYXRpb24sIFwiX2JsYW5rXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uID0gdGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5vbkNsaWNrID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5kZXN0aW5hdGlvbiA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBkaXZFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgXCJjbGlja1wiLFxuICAgICAgICAgIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vbkNsaWNrKCk7XG4gICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZGluZyBvZmZzZXRcbiAgICAgIGlmKHR5cGVvZiB0aGlzLm9wdGlvbnMub2Zmc2V0ID09PSBcIm9iamVjdFwiKSB7XG5cbiAgICAgICAgdmFyIHggPSBnZXRBeGlzT2Zmc2V0QVZhbHVlKFwieFwiLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICB2YXIgeSA9IGdldEF4aXNPZmZzZXRBVmFsdWUoXCJ5XCIsIHRoaXMub3B0aW9ucyk7XG5cbiAgICAgICAgdmFyIHhPZmZzZXQgPSB0aGlzLm9wdGlvbnMucG9zaXRpb24gPT0gXCJsZWZ0XCIgPyB4IDogXCItXCIgKyB4O1xuICAgICAgICB2YXIgeU9mZnNldCA9IHRoaXMub3B0aW9ucy5ncmF2aXR5ID09IFwidG9hc3RpZnktdG9wXCIgPyB5IDogXCItXCIgKyB5O1xuXG4gICAgICAgIGRpdkVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gXCJ0cmFuc2xhdGUoXCIgKyB4T2Zmc2V0ICsgXCIsXCIgKyB5T2Zmc2V0ICsgXCIpXCI7XG5cbiAgICAgIH1cblxuICAgICAgLy8gUmV0dXJuaW5nIHRoZSBnZW5lcmF0ZWQgZWxlbWVudFxuICAgICAgcmV0dXJuIGRpdkVsZW1lbnQ7XG4gICAgfSxcblxuICAgIC8vIERpc3BsYXlpbmcgdGhlIHRvYXN0XG4gICAgc2hvd1RvYXN0OiBmdW5jdGlvbigpIHtcbiAgICAgIC8vIENyZWF0aW5nIHRoZSBET00gb2JqZWN0IGZvciB0aGUgdG9hc3RcbiAgICAgIHRoaXMudG9hc3RFbGVtZW50ID0gdGhpcy5idWlsZFRvYXN0KCk7XG5cbiAgICAgIC8vIEdldHRpbmcgdGhlIHJvb3QgZWxlbWVudCB0byB3aXRoIHRoZSB0b2FzdCBuZWVkcyB0byBiZSBhZGRlZFxuICAgICAgdmFyIHJvb3RFbGVtZW50O1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuc2VsZWN0b3IgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm9wdGlvbnMuc2VsZWN0b3IpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuc2VsZWN0b3IgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCAodHlwZW9mIFNoYWRvd1Jvb3QgIT09ICd1bmRlZmluZWQnICYmIHRoaXMub3B0aW9ucy5zZWxlY3RvciBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpKSB7XG4gICAgICAgIHJvb3RFbGVtZW50ID0gdGhpcy5vcHRpb25zLnNlbGVjdG9yO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0aW5nIGlmIHJvb3QgZWxlbWVudCBpcyBwcmVzZW50IGluIERPTVxuICAgICAgaWYgKCFyb290RWxlbWVudCkge1xuICAgICAgICB0aHJvdyBcIlJvb3QgZWxlbWVudCBpcyBub3QgZGVmaW5lZFwiO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGRpbmcgdGhlIERPTSBlbGVtZW50XG4gICAgICB2YXIgZWxlbWVudFRvSW5zZXJ0ID0gVG9hc3RpZnkuZGVmYXVsdHMub2xkZXN0Rmlyc3QgPyByb290RWxlbWVudC5maXJzdENoaWxkIDogcm9vdEVsZW1lbnQubGFzdENoaWxkO1xuICAgICAgcm9vdEVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRoaXMudG9hc3RFbGVtZW50LCBlbGVtZW50VG9JbnNlcnQpO1xuXG4gICAgICAvLyBSZXBvc2l0aW9uaW5nIHRoZSB0b2FzdHMgaW4gY2FzZSBtdWx0aXBsZSB0b2FzdHMgYXJlIHByZXNlbnRcbiAgICAgIFRvYXN0aWZ5LnJlcG9zaXRpb24oKTtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5kdXJhdGlvbiA+IDApIHtcbiAgICAgICAgdGhpcy50b2FzdEVsZW1lbnQudGltZU91dFZhbHVlID0gd2luZG93LnNldFRpbWVvdXQoXG4gICAgICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHRvYXN0IGZyb20gRE9NXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUVsZW1lbnQodGhpcy50b2FzdEVsZW1lbnQpO1xuICAgICAgICAgIH0uYmluZCh0aGlzKSxcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuZHVyYXRpb25cbiAgICAgICAgKTsgLy8gQmluZGluZyBgdGhpc2AgZm9yIGZ1bmN0aW9uIGludm9jYXRpb25cbiAgICAgIH1cblxuICAgICAgLy8gU3VwcG9ydGluZyBmdW5jdGlvbiBjaGFpbmluZ1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIGhpZGVUb2FzdDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy50b2FzdEVsZW1lbnQudGltZU91dFZhbHVlKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvYXN0RWxlbWVudC50aW1lT3V0VmFsdWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5yZW1vdmVFbGVtZW50KHRoaXMudG9hc3RFbGVtZW50KTtcbiAgICB9LFxuXG4gICAgLy8gUmVtb3ZpbmcgdGhlIGVsZW1lbnQgZnJvbSB0aGUgRE9NXG4gICAgcmVtb3ZlRWxlbWVudDogZnVuY3Rpb24odG9hc3RFbGVtZW50KSB7XG4gICAgICAvLyBIaWRpbmcgdGhlIGVsZW1lbnRcbiAgICAgIC8vIHRvYXN0RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwib25cIik7XG4gICAgICB0b2FzdEVsZW1lbnQuY2xhc3NOYW1lID0gdG9hc3RFbGVtZW50LmNsYXNzTmFtZS5yZXBsYWNlKFwiIG9uXCIsIFwiXCIpO1xuXG4gICAgICAvLyBSZW1vdmluZyB0aGUgZWxlbWVudCBmcm9tIERPTSBhZnRlciB0cmFuc2l0aW9uIGVuZFxuICAgICAgd2luZG93LnNldFRpbWVvdXQoXG4gICAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIC8vIHJlbW92ZSBvcHRpb25zIG5vZGUgaWYgYW55XG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5ub2RlICYmIHRoaXMub3B0aW9ucy5ub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5ub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5vcHRpb25zLm5vZGUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZWxlbWVudCBmcm9tIHRoZSBET00sIG9ubHkgd2hlbiB0aGUgcGFyZW50IG5vZGUgd2FzIG5vdCByZW1vdmVkIGJlZm9yZS5cbiAgICAgICAgICBpZiAodG9hc3RFbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRvYXN0RWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRvYXN0RWxlbWVudCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2FsbGluZyB0aGUgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICAgICAgICB0aGlzLm9wdGlvbnMuY2FsbGJhY2suY2FsbCh0b2FzdEVsZW1lbnQpO1xuXG4gICAgICAgICAgLy8gUmVwb3NpdGlvbmluZyB0aGUgdG9hc3RzIGFnYWluXG4gICAgICAgICAgVG9hc3RpZnkucmVwb3NpdGlvbigpO1xuICAgICAgICB9LmJpbmQodGhpcyksXG4gICAgICAgIDQwMFxuICAgICAgKTsgLy8gQmluZGluZyBgdGhpc2AgZm9yIGZ1bmN0aW9uIGludm9jYXRpb25cbiAgICB9LFxuICB9O1xuXG4gIC8vIFBvc2l0aW9uaW5nIHRoZSB0b2FzdHMgb24gdGhlIERPTVxuICBUb2FzdGlmeS5yZXBvc2l0aW9uID0gZnVuY3Rpb24oKSB7XG5cbiAgICAvLyBUb3AgbWFyZ2lucyB3aXRoIGdyYXZpdHlcbiAgICB2YXIgdG9wTGVmdE9mZnNldFNpemUgPSB7XG4gICAgICB0b3A6IDE1LFxuICAgICAgYm90dG9tOiAxNSxcbiAgICB9O1xuICAgIHZhciB0b3BSaWdodE9mZnNldFNpemUgPSB7XG4gICAgICB0b3A6IDE1LFxuICAgICAgYm90dG9tOiAxNSxcbiAgICB9O1xuICAgIHZhciBvZmZzZXRTaXplID0ge1xuICAgICAgdG9wOiAxNSxcbiAgICAgIGJvdHRvbTogMTUsXG4gICAgfTtcblxuICAgIC8vIEdldCBhbGwgdG9hc3QgbWVzc2FnZXMgb24gdGhlIERPTVxuICAgIHZhciBhbGxUb2FzdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwidG9hc3RpZnlcIik7XG5cbiAgICB2YXIgY2xhc3NVc2VkO1xuXG4gICAgLy8gTW9kaWZ5aW5nIHRoZSBwb3NpdGlvbiBvZiBlYWNoIHRvYXN0IGVsZW1lbnRcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbFRvYXN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gR2V0dGluZyB0aGUgYXBwbGllZCBncmF2aXR5XG4gICAgICBpZiAoY29udGFpbnNDbGFzcyhhbGxUb2FzdHNbaV0sIFwidG9hc3RpZnktdG9wXCIpID09PSB0cnVlKSB7XG4gICAgICAgIGNsYXNzVXNlZCA9IFwidG9hc3RpZnktdG9wXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGFzc1VzZWQgPSBcInRvYXN0aWZ5LWJvdHRvbVwiO1xuICAgICAgfVxuXG4gICAgICB2YXIgaGVpZ2h0ID0gYWxsVG9hc3RzW2ldLm9mZnNldEhlaWdodDtcbiAgICAgIGNsYXNzVXNlZCA9IGNsYXNzVXNlZC5zdWJzdHIoOSwgY2xhc3NVc2VkLmxlbmd0aC0xKVxuICAgICAgLy8gU3BhY2luZyBiZXR3ZWVuIHRvYXN0c1xuICAgICAgdmFyIG9mZnNldCA9IDE1O1xuXG4gICAgICB2YXIgd2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aCA+IDAgPyB3aW5kb3cuaW5uZXJXaWR0aCA6IHNjcmVlbi53aWR0aDtcblxuICAgICAgLy8gU2hvdyB0b2FzdCBpbiBjZW50ZXIgaWYgc2NyZWVuIHdpdGggbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDM2MHB4XG4gICAgICBpZiAod2lkdGggPD0gMzYwKSB7XG4gICAgICAgIC8vIFNldHRpbmcgdGhlIHBvc2l0aW9uXG4gICAgICAgIGFsbFRvYXN0c1tpXS5zdHlsZVtjbGFzc1VzZWRdID0gb2Zmc2V0U2l6ZVtjbGFzc1VzZWRdICsgXCJweFwiO1xuXG4gICAgICAgIG9mZnNldFNpemVbY2xhc3NVc2VkXSArPSBoZWlnaHQgKyBvZmZzZXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY29udGFpbnNDbGFzcyhhbGxUb2FzdHNbaV0sIFwidG9hc3RpZnktbGVmdFwiKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIC8vIFNldHRpbmcgdGhlIHBvc2l0aW9uXG4gICAgICAgICAgYWxsVG9hc3RzW2ldLnN0eWxlW2NsYXNzVXNlZF0gPSB0b3BMZWZ0T2Zmc2V0U2l6ZVtjbGFzc1VzZWRdICsgXCJweFwiO1xuXG4gICAgICAgICAgdG9wTGVmdE9mZnNldFNpemVbY2xhc3NVc2VkXSArPSBoZWlnaHQgKyBvZmZzZXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2V0dGluZyB0aGUgcG9zaXRpb25cbiAgICAgICAgICBhbGxUb2FzdHNbaV0uc3R5bGVbY2xhc3NVc2VkXSA9IHRvcFJpZ2h0T2Zmc2V0U2l6ZVtjbGFzc1VzZWRdICsgXCJweFwiO1xuXG4gICAgICAgICAgdG9wUmlnaHRPZmZzZXRTaXplW2NsYXNzVXNlZF0gKz0gaGVpZ2h0ICsgb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3VwcG9ydGluZyBmdW5jdGlvbiBjaGFpbmluZ1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgb2Zmc2V0LlxuICBmdW5jdGlvbiBnZXRBeGlzT2Zmc2V0QVZhbHVlKGF4aXMsIG9wdGlvbnMpIHtcblxuICAgIGlmKG9wdGlvbnMub2Zmc2V0W2F4aXNdKSB7XG4gICAgICBpZihpc05hTihvcHRpb25zLm9mZnNldFtheGlzXSkpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMub2Zmc2V0W2F4aXNdO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLm9mZnNldFtheGlzXSArICdweCc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuICcwcHgnO1xuXG4gIH1cblxuICBmdW5jdGlvbiBjb250YWluc0NsYXNzKGVsZW0sIHlvdXJDbGFzcykge1xuICAgIGlmICghZWxlbSB8fCB0eXBlb2YgeW91ckNsYXNzICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGVsZW0uY2xhc3NOYW1lICYmXG4gICAgICBlbGVtLmNsYXNzTmFtZVxuICAgICAgICAudHJpbSgpXG4gICAgICAgIC5zcGxpdCgvXFxzKy9naSlcbiAgICAgICAgLmluZGV4T2YoeW91ckNsYXNzKSA+IC0xXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNldHRpbmcgdXAgdGhlIHByb3RvdHlwZSBmb3IgdGhlIGluaXQgb2JqZWN0XG4gIFRvYXN0aWZ5LmxpYi5pbml0LnByb3RvdHlwZSA9IFRvYXN0aWZ5LmxpYjtcblxuICAvLyBSZXR1cm5pbmcgdGhlIFRvYXN0aWZ5IGZ1bmN0aW9uIHRvIGJlIGFzc2lnbmVkIHRvIHRoZSB3aW5kb3cgb2JqZWN0L21vZHVsZVxuICByZXR1cm4gVG9hc3RpZnk7XG59KTtcbiIsbnVsbCxudWxsLG51bGwsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHsgd3JpdGFibGU6IGZhbHNlIH0pOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuLyohXG4gKiBTcGxpZGUuanNcbiAqIFZlcnNpb24gIDogNC4xLjRcbiAqIExpY2Vuc2UgIDogTUlUXG4gKiBDb3B5cmlnaHQ6IDIwMjIgTmFvdG9zaGkgRnVqaXRhXG4gKi9cbnZhciBNRURJQV9QUkVGRVJTX1JFRFVDRURfTU9USU9OID0gXCIocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKVwiO1xudmFyIENSRUFURUQgPSAxO1xudmFyIE1PVU5URUQgPSAyO1xudmFyIElETEUgPSAzO1xudmFyIE1PVklORyA9IDQ7XG52YXIgU0NST0xMSU5HID0gNTtcbnZhciBEUkFHR0lORyA9IDY7XG52YXIgREVTVFJPWUVEID0gNztcbnZhciBTVEFURVMgPSB7XG4gIENSRUFURUQ6IENSRUFURUQsXG4gIE1PVU5URUQ6IE1PVU5URUQsXG4gIElETEU6IElETEUsXG4gIE1PVklORzogTU9WSU5HLFxuICBTQ1JPTExJTkc6IFNDUk9MTElORyxcbiAgRFJBR0dJTkc6IERSQUdHSU5HLFxuICBERVNUUk9ZRUQ6IERFU1RST1lFRFxufTtcblxuZnVuY3Rpb24gZW1wdHkoYXJyYXkpIHtcbiAgYXJyYXkubGVuZ3RoID0gMDtcbn1cblxuZnVuY3Rpb24gc2xpY2UoYXJyYXlMaWtlLCBzdGFydCwgZW5kKSB7XG4gIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcnJheUxpa2UsIHN0YXJ0LCBlbmQpO1xufVxuXG5mdW5jdGlvbiBhcHBseShmdW5jKSB7XG4gIHJldHVybiBmdW5jLmJpbmQuYXBwbHkoZnVuYywgW251bGxdLmNvbmNhdChzbGljZShhcmd1bWVudHMsIDEpKSk7XG59XG5cbnZhciBuZXh0VGljayA9IHNldFRpbWVvdXQ7XG5cbnZhciBub29wID0gZnVuY3Rpb24gbm9vcCgpIHt9O1xuXG5mdW5jdGlvbiByYWYoZnVuYykge1xuICByZXR1cm4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmMpO1xufVxuXG5mdW5jdGlvbiB0eXBlT2YodHlwZSwgc3ViamVjdCkge1xuICByZXR1cm4gdHlwZW9mIHN1YmplY3QgPT09IHR5cGU7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KHN1YmplY3QpIHtcbiAgcmV0dXJuICFpc051bGwoc3ViamVjdCkgJiYgdHlwZU9mKFwib2JqZWN0XCIsIHN1YmplY3QpO1xufVxuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG52YXIgaXNGdW5jdGlvbiA9IGFwcGx5KHR5cGVPZiwgXCJmdW5jdGlvblwiKTtcbnZhciBpc1N0cmluZyA9IGFwcGx5KHR5cGVPZiwgXCJzdHJpbmdcIik7XG52YXIgaXNVbmRlZmluZWQgPSBhcHBseSh0eXBlT2YsIFwidW5kZWZpbmVkXCIpO1xuXG5mdW5jdGlvbiBpc051bGwoc3ViamVjdCkge1xuICByZXR1cm4gc3ViamVjdCA9PT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNIVE1MRWxlbWVudChzdWJqZWN0KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHN1YmplY3QgaW5zdGFuY2VvZiAoc3ViamVjdC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdykuSFRNTEVsZW1lbnQ7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9BcnJheSh2YWx1ZSkge1xuICByZXR1cm4gaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG59XG5cbmZ1bmN0aW9uIGZvckVhY2godmFsdWVzLCBpdGVyYXRlZSkge1xuICB0b0FycmF5KHZhbHVlcykuZm9yRWFjaChpdGVyYXRlZSk7XG59XG5cbmZ1bmN0aW9uIGluY2x1ZGVzKGFycmF5LCB2YWx1ZSkge1xuICByZXR1cm4gYXJyYXkuaW5kZXhPZih2YWx1ZSkgPiAtMTtcbn1cblxuZnVuY3Rpb24gcHVzaChhcnJheSwgaXRlbXMpIHtcbiAgYXJyYXkucHVzaC5hcHBseShhcnJheSwgdG9BcnJheShpdGVtcykpO1xuICByZXR1cm4gYXJyYXk7XG59XG5cbmZ1bmN0aW9uIHRvZ2dsZUNsYXNzKGVsbSwgY2xhc3NlcywgYWRkKSB7XG4gIGlmIChlbG0pIHtcbiAgICBmb3JFYWNoKGNsYXNzZXMsIGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICBpZiAobmFtZSkge1xuICAgICAgICBlbG0uY2xhc3NMaXN0W2FkZCA/IFwiYWRkXCIgOiBcInJlbW92ZVwiXShuYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRDbGFzcyhlbG0sIGNsYXNzZXMpIHtcbiAgdG9nZ2xlQ2xhc3MoZWxtLCBpc1N0cmluZyhjbGFzc2VzKSA/IGNsYXNzZXMuc3BsaXQoXCIgXCIpIDogY2xhc3NlcywgdHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZChwYXJlbnQsIGNoaWxkcmVuKSB7XG4gIGZvckVhY2goY2hpbGRyZW4sIHBhcmVudC5hcHBlbmRDaGlsZC5iaW5kKHBhcmVudCkpO1xufVxuXG5mdW5jdGlvbiBiZWZvcmUobm9kZXMsIHJlZikge1xuICBmb3JFYWNoKG5vZGVzLCBmdW5jdGlvbiAobm9kZSkge1xuICAgIHZhciBwYXJlbnQgPSAocmVmIHx8IG5vZGUpLnBhcmVudE5vZGU7XG5cbiAgICBpZiAocGFyZW50KSB7XG4gICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5vZGUsIHJlZik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlcyhlbG0sIHNlbGVjdG9yKSB7XG4gIHJldHVybiBpc0hUTUxFbGVtZW50KGVsbSkgJiYgKGVsbVtcIm1zTWF0Y2hlc1NlbGVjdG9yXCJdIHx8IGVsbS5tYXRjaGVzKS5jYWxsKGVsbSwgc2VsZWN0b3IpO1xufVxuXG5mdW5jdGlvbiBjaGlsZHJlbihwYXJlbnQsIHNlbGVjdG9yKSB7XG4gIHZhciBjaGlsZHJlbjIgPSBwYXJlbnQgPyBzbGljZShwYXJlbnQuY2hpbGRyZW4pIDogW107XG4gIHJldHVybiBzZWxlY3RvciA/IGNoaWxkcmVuMi5maWx0ZXIoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgcmV0dXJuIG1hdGNoZXMoY2hpbGQsIHNlbGVjdG9yKTtcbiAgfSkgOiBjaGlsZHJlbjI7XG59XG5cbmZ1bmN0aW9uIGNoaWxkKHBhcmVudCwgc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHNlbGVjdG9yID8gY2hpbGRyZW4ocGFyZW50LCBzZWxlY3RvcilbMF0gOiBwYXJlbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XG59XG5cbnZhciBvd25LZXlzID0gT2JqZWN0LmtleXM7XG5cbmZ1bmN0aW9uIGZvck93bihvYmplY3QsIGl0ZXJhdGVlLCByaWdodCkge1xuICBpZiAob2JqZWN0KSB7XG4gICAgKHJpZ2h0ID8gb3duS2V5cyhvYmplY3QpLnJldmVyc2UoKSA6IG93bktleXMob2JqZWN0KSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBrZXkgIT09IFwiX19wcm90b19fXCIgJiYgaXRlcmF0ZWUob2JqZWN0W2tleV0sIGtleSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gb2JqZWN0O1xufVxuXG5mdW5jdGlvbiBhc3NpZ24ob2JqZWN0KSB7XG4gIHNsaWNlKGFyZ3VtZW50cywgMSkuZm9yRWFjaChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgZm9yT3duKHNvdXJjZSwgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIG9iamVjdFtrZXldID0gc291cmNlW2tleV07XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gb2JqZWN0O1xufVxuXG5mdW5jdGlvbiBtZXJnZShvYmplY3QpIHtcbiAgc2xpY2UoYXJndW1lbnRzLCAxKS5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICBmb3JPd24oc291cmNlLCBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIG9iamVjdFtrZXldID0gdmFsdWUuc2xpY2UoKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIG9iamVjdFtrZXldID0gbWVyZ2Uoe30sIGlzT2JqZWN0KG9iamVjdFtrZXldKSA/IG9iamVjdFtrZXldIDoge30sIHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gb2JqZWN0O1xufVxuXG5mdW5jdGlvbiBvbWl0KG9iamVjdCwga2V5cykge1xuICBmb3JFYWNoKGtleXMgfHwgb3duS2V5cyhvYmplY3QpLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgZGVsZXRlIG9iamVjdFtrZXldO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlQXR0cmlidXRlKGVsbXMsIGF0dHJzKSB7XG4gIGZvckVhY2goZWxtcywgZnVuY3Rpb24gKGVsbSkge1xuICAgIGZvckVhY2goYXR0cnMsIGZ1bmN0aW9uIChhdHRyKSB7XG4gICAgICBlbG0gJiYgZWxtLnJlbW92ZUF0dHJpYnV0ZShhdHRyKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNldEF0dHJpYnV0ZShlbG1zLCBhdHRycywgdmFsdWUpIHtcbiAgaWYgKGlzT2JqZWN0KGF0dHJzKSkge1xuICAgIGZvck93bihhdHRycywgZnVuY3Rpb24gKHZhbHVlMiwgbmFtZSkge1xuICAgICAgc2V0QXR0cmlidXRlKGVsbXMsIG5hbWUsIHZhbHVlMik7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgZm9yRWFjaChlbG1zLCBmdW5jdGlvbiAoZWxtKSB7XG4gICAgICBpc051bGwodmFsdWUpIHx8IHZhbHVlID09PSBcIlwiID8gcmVtb3ZlQXR0cmlidXRlKGVsbSwgYXR0cnMpIDogZWxtLnNldEF0dHJpYnV0ZShhdHRycywgU3RyaW5nKHZhbHVlKSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlKHRhZywgYXR0cnMsIHBhcmVudCkge1xuICB2YXIgZWxtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpO1xuXG4gIGlmIChhdHRycykge1xuICAgIGlzU3RyaW5nKGF0dHJzKSA/IGFkZENsYXNzKGVsbSwgYXR0cnMpIDogc2V0QXR0cmlidXRlKGVsbSwgYXR0cnMpO1xuICB9XG5cbiAgcGFyZW50ICYmIGFwcGVuZChwYXJlbnQsIGVsbSk7XG4gIHJldHVybiBlbG07XG59XG5cbmZ1bmN0aW9uIHN0eWxlKGVsbSwgcHJvcCwgdmFsdWUpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgIHJldHVybiBnZXRDb21wdXRlZFN0eWxlKGVsbSlbcHJvcF07XG4gIH1cblxuICBpZiAoIWlzTnVsbCh2YWx1ZSkpIHtcbiAgICBlbG0uc3R5bGVbcHJvcF0gPSBcIlwiICsgdmFsdWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzcGxheShlbG0sIGRpc3BsYXkyKSB7XG4gIHN0eWxlKGVsbSwgXCJkaXNwbGF5XCIsIGRpc3BsYXkyKTtcbn1cblxuZnVuY3Rpb24gZm9jdXMoZWxtKSB7XG4gIGVsbVtcInNldEFjdGl2ZVwiXSAmJiBlbG1bXCJzZXRBY3RpdmVcIl0oKSB8fCBlbG0uZm9jdXMoe1xuICAgIHByZXZlbnRTY3JvbGw6IHRydWVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldEF0dHJpYnV0ZShlbG0sIGF0dHIpIHtcbiAgcmV0dXJuIGVsbS5nZXRBdHRyaWJ1dGUoYXR0cik7XG59XG5cbmZ1bmN0aW9uIGhhc0NsYXNzKGVsbSwgY2xhc3NOYW1lKSB7XG4gIHJldHVybiBlbG0gJiYgZWxtLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpO1xufVxuXG5mdW5jdGlvbiByZWN0KHRhcmdldCkge1xuICByZXR1cm4gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xufVxuXG5mdW5jdGlvbiByZW1vdmUobm9kZXMpIHtcbiAgZm9yRWFjaChub2RlcywgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBpZiAobm9kZSAmJiBub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwYXJzZUh0bWwoaHRtbCkge1xuICByZXR1cm4gY2hpbGQobmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhodG1sLCBcInRleHQvaHRtbFwiKS5ib2R5KTtcbn1cblxuZnVuY3Rpb24gcHJldmVudChlLCBzdG9wUHJvcGFnYXRpb24pIHtcbiAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gIGlmIChzdG9wUHJvcGFnYXRpb24pIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcXVlcnkocGFyZW50LCBzZWxlY3Rvcikge1xuICByZXR1cm4gcGFyZW50ICYmIHBhcmVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbn1cblxuZnVuY3Rpb24gcXVlcnlBbGwocGFyZW50LCBzZWxlY3Rvcikge1xuICByZXR1cm4gc2VsZWN0b3IgPyBzbGljZShwYXJlbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpIDogW107XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUNsYXNzKGVsbSwgY2xhc3Nlcykge1xuICB0b2dnbGVDbGFzcyhlbG0sIGNsYXNzZXMsIGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gdGltZU9mKGUpIHtcbiAgcmV0dXJuIGUudGltZVN0YW1wO1xufVxuXG5mdW5jdGlvbiB1bml0KHZhbHVlKSB7XG4gIHJldHVybiBpc1N0cmluZyh2YWx1ZSkgPyB2YWx1ZSA6IHZhbHVlID8gdmFsdWUgKyBcInB4XCIgOiBcIlwiO1xufVxuXG52YXIgUFJPSkVDVF9DT0RFID0gXCJzcGxpZGVcIjtcbnZhciBEQVRBX0FUVFJJQlVURSA9IFwiZGF0YS1cIiArIFBST0pFQ1RfQ09ERTtcblxuZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbiwgbWVzc2FnZSkge1xuICBpZiAoIWNvbmRpdGlvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcIltcIiArIFBST0pFQ1RfQ09ERSArIFwiXSBcIiArIChtZXNzYWdlIHx8IFwiXCIpKTtcbiAgfVxufVxuXG52YXIgbWluID0gTWF0aC5taW4sXG4gICAgbWF4ID0gTWF0aC5tYXgsXG4gICAgZmxvb3IgPSBNYXRoLmZsb29yLFxuICAgIGNlaWwgPSBNYXRoLmNlaWwsXG4gICAgYWJzID0gTWF0aC5hYnM7XG5cbmZ1bmN0aW9uIGFwcHJveGltYXRlbHlFcXVhbCh4LCB5LCBlcHNpbG9uKSB7XG4gIHJldHVybiBhYnMoeCAtIHkpIDwgZXBzaWxvbjtcbn1cblxuZnVuY3Rpb24gYmV0d2VlbihudW1iZXIsIHgsIHksIGV4Y2x1c2l2ZSkge1xuICB2YXIgbWluaW11bSA9IG1pbih4LCB5KTtcbiAgdmFyIG1heGltdW0gPSBtYXgoeCwgeSk7XG4gIHJldHVybiBleGNsdXNpdmUgPyBtaW5pbXVtIDwgbnVtYmVyICYmIG51bWJlciA8IG1heGltdW0gOiBtaW5pbXVtIDw9IG51bWJlciAmJiBudW1iZXIgPD0gbWF4aW11bTtcbn1cblxuZnVuY3Rpb24gY2xhbXAobnVtYmVyLCB4LCB5KSB7XG4gIHZhciBtaW5pbXVtID0gbWluKHgsIHkpO1xuICB2YXIgbWF4aW11bSA9IG1heCh4LCB5KTtcbiAgcmV0dXJuIG1pbihtYXgobWluaW11bSwgbnVtYmVyKSwgbWF4aW11bSk7XG59XG5cbmZ1bmN0aW9uIHNpZ24oeCkge1xuICByZXR1cm4gKyh4ID4gMCkgLSArKHggPCAwKTtcbn1cblxuZnVuY3Rpb24gY2FtZWxUb0tlYmFiKHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csIFwiJDEtJDJcIikudG9Mb3dlckNhc2UoKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0KHN0cmluZywgcmVwbGFjZW1lbnRzKSB7XG4gIGZvckVhY2gocmVwbGFjZW1lbnRzLCBmdW5jdGlvbiAocmVwbGFjZW1lbnQpIHtcbiAgICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShcIiVzXCIsIFwiXCIgKyByZXBsYWNlbWVudCk7XG4gIH0pO1xuICByZXR1cm4gc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBwYWQobnVtYmVyKSB7XG4gIHJldHVybiBudW1iZXIgPCAxMCA/IFwiMFwiICsgbnVtYmVyIDogXCJcIiArIG51bWJlcjtcbn1cblxudmFyIGlkcyA9IHt9O1xuXG5mdW5jdGlvbiB1bmlxdWVJZChwcmVmaXgpIHtcbiAgcmV0dXJuIFwiXCIgKyBwcmVmaXggKyBwYWQoaWRzW3ByZWZpeF0gPSAoaWRzW3ByZWZpeF0gfHwgMCkgKyAxKTtcbn1cblxuZnVuY3Rpb24gRXZlbnRCaW5kZXIoKSB7XG4gIHZhciBsaXN0ZW5lcnMgPSBbXTtcblxuICBmdW5jdGlvbiBiaW5kKHRhcmdldHMsIGV2ZW50cywgY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgICBmb3JFYWNoRXZlbnQodGFyZ2V0cywgZXZlbnRzLCBmdW5jdGlvbiAodGFyZ2V0LCBldmVudCwgbmFtZXNwYWNlKSB7XG4gICAgICB2YXIgaXNFdmVudFRhcmdldCA9IChcImFkZEV2ZW50TGlzdGVuZXJcIiBpbiB0YXJnZXQpO1xuICAgICAgdmFyIHJlbW92ZXIgPSBpc0V2ZW50VGFyZ2V0ID8gdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIuYmluZCh0YXJnZXQsIGV2ZW50LCBjYWxsYmFjaywgb3B0aW9ucykgOiB0YXJnZXRbXCJyZW1vdmVMaXN0ZW5lclwiXS5iaW5kKHRhcmdldCwgY2FsbGJhY2spO1xuICAgICAgaXNFdmVudFRhcmdldCA/IHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBjYWxsYmFjaywgb3B0aW9ucykgOiB0YXJnZXRbXCJhZGRMaXN0ZW5lclwiXShjYWxsYmFjayk7XG4gICAgICBsaXN0ZW5lcnMucHVzaChbdGFyZ2V0LCBldmVudCwgbmFtZXNwYWNlLCBjYWxsYmFjaywgcmVtb3Zlcl0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gdW5iaW5kKHRhcmdldHMsIGV2ZW50cywgY2FsbGJhY2spIHtcbiAgICBmb3JFYWNoRXZlbnQodGFyZ2V0cywgZXZlbnRzLCBmdW5jdGlvbiAodGFyZ2V0LCBldmVudCwgbmFtZXNwYWNlKSB7XG4gICAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZmlsdGVyKGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICBpZiAobGlzdGVuZXJbMF0gPT09IHRhcmdldCAmJiBsaXN0ZW5lclsxXSA9PT0gZXZlbnQgJiYgbGlzdGVuZXJbMl0gPT09IG5hbWVzcGFjZSAmJiAoIWNhbGxiYWNrIHx8IGxpc3RlbmVyWzNdID09PSBjYWxsYmFjaykpIHtcbiAgICAgICAgICBsaXN0ZW5lcls0XSgpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBkaXNwYXRjaCh0YXJnZXQsIHR5cGUsIGRldGFpbCkge1xuICAgIHZhciBlO1xuICAgIHZhciBidWJibGVzID0gdHJ1ZTtcblxuICAgIGlmICh0eXBlb2YgQ3VzdG9tRXZlbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgZSA9IG5ldyBDdXN0b21FdmVudCh0eXBlLCB7XG4gICAgICAgIGJ1YmJsZXM6IGJ1YmJsZXMsXG4gICAgICAgIGRldGFpbDogZGV0YWlsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiQ3VzdG9tRXZlbnRcIik7XG4gICAgICBlLmluaXRDdXN0b21FdmVudCh0eXBlLCBidWJibGVzLCBmYWxzZSwgZGV0YWlsKTtcbiAgICB9XG5cbiAgICB0YXJnZXQuZGlzcGF0Y2hFdmVudChlKTtcbiAgICByZXR1cm4gZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvckVhY2hFdmVudCh0YXJnZXRzLCBldmVudHMsIGl0ZXJhdGVlKSB7XG4gICAgZm9yRWFjaCh0YXJnZXRzLCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICB0YXJnZXQgJiYgZm9yRWFjaChldmVudHMsIGZ1bmN0aW9uIChldmVudHMyKSB7XG4gICAgICAgIGV2ZW50czIuc3BsaXQoXCIgXCIpLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50TlMpIHtcbiAgICAgICAgICB2YXIgZnJhZ21lbnQgPSBldmVudE5TLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgICBpdGVyYXRlZSh0YXJnZXQsIGZyYWdtZW50WzBdLCBmcmFnbWVudFsxXSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgIGxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICBkYXRhWzRdKCk7XG4gICAgfSk7XG4gICAgZW1wdHkobGlzdGVuZXJzKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYmluZDogYmluZCxcbiAgICB1bmJpbmQ6IHVuYmluZCxcbiAgICBkaXNwYXRjaDogZGlzcGF0Y2gsXG4gICAgZGVzdHJveTogZGVzdHJveVxuICB9O1xufVxuXG52YXIgRVZFTlRfTU9VTlRFRCA9IFwibW91bnRlZFwiO1xudmFyIEVWRU5UX1JFQURZID0gXCJyZWFkeVwiO1xudmFyIEVWRU5UX01PVkUgPSBcIm1vdmVcIjtcbnZhciBFVkVOVF9NT1ZFRCA9IFwibW92ZWRcIjtcbnZhciBFVkVOVF9DTElDSyA9IFwiY2xpY2tcIjtcbnZhciBFVkVOVF9BQ1RJVkUgPSBcImFjdGl2ZVwiO1xudmFyIEVWRU5UX0lOQUNUSVZFID0gXCJpbmFjdGl2ZVwiO1xudmFyIEVWRU5UX1ZJU0lCTEUgPSBcInZpc2libGVcIjtcbnZhciBFVkVOVF9ISURERU4gPSBcImhpZGRlblwiO1xudmFyIEVWRU5UX1JFRlJFU0ggPSBcInJlZnJlc2hcIjtcbnZhciBFVkVOVF9VUERBVEVEID0gXCJ1cGRhdGVkXCI7XG52YXIgRVZFTlRfUkVTSVpFID0gXCJyZXNpemVcIjtcbnZhciBFVkVOVF9SRVNJWkVEID0gXCJyZXNpemVkXCI7XG52YXIgRVZFTlRfRFJBRyA9IFwiZHJhZ1wiO1xudmFyIEVWRU5UX0RSQUdHSU5HID0gXCJkcmFnZ2luZ1wiO1xudmFyIEVWRU5UX0RSQUdHRUQgPSBcImRyYWdnZWRcIjtcbnZhciBFVkVOVF9TQ1JPTEwgPSBcInNjcm9sbFwiO1xudmFyIEVWRU5UX1NDUk9MTEVEID0gXCJzY3JvbGxlZFwiO1xudmFyIEVWRU5UX09WRVJGTE9XID0gXCJvdmVyZmxvd1wiO1xudmFyIEVWRU5UX0RFU1RST1kgPSBcImRlc3Ryb3lcIjtcbnZhciBFVkVOVF9BUlJPV1NfTU9VTlRFRCA9IFwiYXJyb3dzOm1vdW50ZWRcIjtcbnZhciBFVkVOVF9BUlJPV1NfVVBEQVRFRCA9IFwiYXJyb3dzOnVwZGF0ZWRcIjtcbnZhciBFVkVOVF9QQUdJTkFUSU9OX01PVU5URUQgPSBcInBhZ2luYXRpb246bW91bnRlZFwiO1xudmFyIEVWRU5UX1BBR0lOQVRJT05fVVBEQVRFRCA9IFwicGFnaW5hdGlvbjp1cGRhdGVkXCI7XG52YXIgRVZFTlRfTkFWSUdBVElPTl9NT1VOVEVEID0gXCJuYXZpZ2F0aW9uOm1vdW50ZWRcIjtcbnZhciBFVkVOVF9BVVRPUExBWV9QTEFZID0gXCJhdXRvcGxheTpwbGF5XCI7XG52YXIgRVZFTlRfQVVUT1BMQVlfUExBWUlORyA9IFwiYXV0b3BsYXk6cGxheWluZ1wiO1xudmFyIEVWRU5UX0FVVE9QTEFZX1BBVVNFID0gXCJhdXRvcGxheTpwYXVzZVwiO1xudmFyIEVWRU5UX0xBWllMT0FEX0xPQURFRCA9IFwibGF6eWxvYWQ6bG9hZGVkXCI7XG52YXIgRVZFTlRfU0xJREVfS0VZRE9XTiA9IFwic2tcIjtcbnZhciBFVkVOVF9TSElGVEVEID0gXCJzaFwiO1xudmFyIEVWRU5UX0VORF9JTkRFWF9DSEFOR0VEID0gXCJlaVwiO1xuXG5mdW5jdGlvbiBFdmVudEludGVyZmFjZShTcGxpZGUyKSB7XG4gIHZhciBidXMgPSBTcGxpZGUyID8gU3BsaWRlMi5ldmVudC5idXMgOiBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gIHZhciBiaW5kZXIgPSBFdmVudEJpbmRlcigpO1xuXG4gIGZ1bmN0aW9uIG9uKGV2ZW50cywgY2FsbGJhY2spIHtcbiAgICBiaW5kZXIuYmluZChidXMsIHRvQXJyYXkoZXZlbnRzKS5qb2luKFwiIFwiKSwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGNhbGxiYWNrLmFwcGx5KGNhbGxiYWNrLCBpc0FycmF5KGUuZGV0YWlsKSA/IGUuZGV0YWlsIDogW10pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZW1pdChldmVudCkge1xuICAgIGJpbmRlci5kaXNwYXRjaChidXMsIGV2ZW50LCBzbGljZShhcmd1bWVudHMsIDEpKTtcbiAgfVxuXG4gIGlmIChTcGxpZGUyKSB7XG4gICAgU3BsaWRlMi5ldmVudC5vbihFVkVOVF9ERVNUUk9ZLCBiaW5kZXIuZGVzdHJveSk7XG4gIH1cblxuICByZXR1cm4gYXNzaWduKGJpbmRlciwge1xuICAgIGJ1czogYnVzLFxuICAgIG9uOiBvbixcbiAgICBvZmY6IGFwcGx5KGJpbmRlci51bmJpbmQsIGJ1cyksXG4gICAgZW1pdDogZW1pdFxuICB9KTtcbn1cblxuZnVuY3Rpb24gUmVxdWVzdEludGVydmFsKGludGVydmFsLCBvbkludGVydmFsLCBvblVwZGF0ZSwgbGltaXQpIHtcbiAgdmFyIG5vdyA9IERhdGUubm93O1xuICB2YXIgc3RhcnRUaW1lO1xuICB2YXIgcmF0ZSA9IDA7XG4gIHZhciBpZDtcbiAgdmFyIHBhdXNlZCA9IHRydWU7XG4gIHZhciBjb3VudCA9IDA7XG5cbiAgZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgIGlmICghcGF1c2VkKSB7XG4gICAgICByYXRlID0gaW50ZXJ2YWwgPyBtaW4oKG5vdygpIC0gc3RhcnRUaW1lKSAvIGludGVydmFsLCAxKSA6IDE7XG4gICAgICBvblVwZGF0ZSAmJiBvblVwZGF0ZShyYXRlKTtcblxuICAgICAgaWYgKHJhdGUgPj0gMSkge1xuICAgICAgICBvbkludGVydmFsKCk7XG4gICAgICAgIHN0YXJ0VGltZSA9IG5vdygpO1xuXG4gICAgICAgIGlmIChsaW1pdCAmJiArK2NvdW50ID49IGxpbWl0KSB7XG4gICAgICAgICAgcmV0dXJuIHBhdXNlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWQgPSByYWYodXBkYXRlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdGFydChyZXN1bWUpIHtcbiAgICByZXN1bWUgfHwgY2FuY2VsKCk7XG4gICAgc3RhcnRUaW1lID0gbm93KCkgLSAocmVzdW1lID8gcmF0ZSAqIGludGVydmFsIDogMCk7XG4gICAgcGF1c2VkID0gZmFsc2U7XG4gICAgaWQgPSByYWYodXBkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhdXNlKCkge1xuICAgIHBhdXNlZCA9IHRydWU7XG4gIH1cblxuICBmdW5jdGlvbiByZXdpbmQoKSB7XG4gICAgc3RhcnRUaW1lID0gbm93KCk7XG4gICAgcmF0ZSA9IDA7XG5cbiAgICBpZiAob25VcGRhdGUpIHtcbiAgICAgIG9uVXBkYXRlKHJhdGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICBpZCAmJiBjYW5jZWxBbmltYXRpb25GcmFtZShpZCk7XG4gICAgcmF0ZSA9IDA7XG4gICAgaWQgPSAwO1xuICAgIHBhdXNlZCA9IHRydWU7XG4gIH1cblxuICBmdW5jdGlvbiBzZXQodGltZSkge1xuICAgIGludGVydmFsID0gdGltZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzUGF1c2VkKCkge1xuICAgIHJldHVybiBwYXVzZWQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHN0YXJ0OiBzdGFydCxcbiAgICByZXdpbmQ6IHJld2luZCxcbiAgICBwYXVzZTogcGF1c2UsXG4gICAgY2FuY2VsOiBjYW5jZWwsXG4gICAgc2V0OiBzZXQsXG4gICAgaXNQYXVzZWQ6IGlzUGF1c2VkXG4gIH07XG59XG5cbmZ1bmN0aW9uIFN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICB2YXIgc3RhdGUgPSBpbml0aWFsU3RhdGU7XG5cbiAgZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgc3RhdGUgPSB2YWx1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzKHN0YXRlcykge1xuICAgIHJldHVybiBpbmNsdWRlcyh0b0FycmF5KHN0YXRlcyksIHN0YXRlKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2V0OiBzZXQsXG4gICAgaXM6IGlzXG4gIH07XG59XG5cbmZ1bmN0aW9uIFRocm90dGxlKGZ1bmMsIGR1cmF0aW9uKSB7XG4gIHZhciBpbnRlcnZhbCA9IFJlcXVlc3RJbnRlcnZhbChkdXJhdGlvbiB8fCAwLCBmdW5jLCBudWxsLCAxKTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpbnRlcnZhbC5pc1BhdXNlZCgpICYmIGludGVydmFsLnN0YXJ0KCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIE1lZGlhKFNwbGlkZTIsIENvbXBvbmVudHMyLCBvcHRpb25zKSB7XG4gIHZhciBzdGF0ZSA9IFNwbGlkZTIuc3RhdGU7XG4gIHZhciBicmVha3BvaW50cyA9IG9wdGlvbnMuYnJlYWtwb2ludHMgfHwge307XG4gIHZhciByZWR1Y2VkTW90aW9uID0gb3B0aW9ucy5yZWR1Y2VkTW90aW9uIHx8IHt9O1xuICB2YXIgYmluZGVyID0gRXZlbnRCaW5kZXIoKTtcbiAgdmFyIHF1ZXJpZXMgPSBbXTtcblxuICBmdW5jdGlvbiBzZXR1cCgpIHtcbiAgICB2YXIgaXNNaW4gPSBvcHRpb25zLm1lZGlhUXVlcnkgPT09IFwibWluXCI7XG4gICAgb3duS2V5cyhicmVha3BvaW50cykuc29ydChmdW5jdGlvbiAobiwgbSkge1xuICAgICAgcmV0dXJuIGlzTWluID8gK24gLSArbSA6ICttIC0gK247XG4gICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICByZWdpc3RlcihicmVha3BvaW50c1trZXldLCBcIihcIiArIChpc01pbiA/IFwibWluXCIgOiBcIm1heFwiKSArIFwiLXdpZHRoOlwiICsga2V5ICsgXCJweClcIik7XG4gICAgfSk7XG4gICAgcmVnaXN0ZXIocmVkdWNlZE1vdGlvbiwgTUVESUFfUFJFRkVSU19SRURVQ0VEX01PVElPTik7XG4gICAgdXBkYXRlKCk7XG4gIH1cblxuICBmdW5jdGlvbiBkZXN0cm95KGNvbXBsZXRlbHkpIHtcbiAgICBpZiAoY29tcGxldGVseSkge1xuICAgICAgYmluZGVyLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWdpc3RlcihvcHRpb25zMiwgcXVlcnkpIHtcbiAgICB2YXIgcXVlcnlMaXN0ID0gbWF0Y2hNZWRpYShxdWVyeSk7XG4gICAgYmluZGVyLmJpbmQocXVlcnlMaXN0LCBcImNoYW5nZVwiLCB1cGRhdGUpO1xuICAgIHF1ZXJpZXMucHVzaChbb3B0aW9uczIsIHF1ZXJ5TGlzdF0pO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgIHZhciBkZXN0cm95ZWQgPSBzdGF0ZS5pcyhERVNUUk9ZRUQpO1xuICAgIHZhciBkaXJlY3Rpb24gPSBvcHRpb25zLmRpcmVjdGlvbjtcbiAgICB2YXIgbWVyZ2VkID0gcXVlcmllcy5yZWR1Y2UoZnVuY3Rpb24gKG1lcmdlZDIsIGVudHJ5KSB7XG4gICAgICByZXR1cm4gbWVyZ2UobWVyZ2VkMiwgZW50cnlbMV0ubWF0Y2hlcyA/IGVudHJ5WzBdIDoge30pO1xuICAgIH0sIHt9KTtcbiAgICBvbWl0KG9wdGlvbnMpO1xuICAgIHNldChtZXJnZWQpO1xuXG4gICAgaWYgKG9wdGlvbnMuZGVzdHJveSkge1xuICAgICAgU3BsaWRlMi5kZXN0cm95KG9wdGlvbnMuZGVzdHJveSA9PT0gXCJjb21wbGV0ZWx5XCIpO1xuICAgIH0gZWxzZSBpZiAoZGVzdHJveWVkKSB7XG4gICAgICBkZXN0cm95KHRydWUpO1xuICAgICAgU3BsaWRlMi5tb3VudCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaXJlY3Rpb24gIT09IG9wdGlvbnMuZGlyZWN0aW9uICYmIFNwbGlkZTIucmVmcmVzaCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlZHVjZShlbmFibGUpIHtcbiAgICBpZiAobWF0Y2hNZWRpYShNRURJQV9QUkVGRVJTX1JFRFVDRURfTU9USU9OKS5tYXRjaGVzKSB7XG4gICAgICBlbmFibGUgPyBtZXJnZShvcHRpb25zLCByZWR1Y2VkTW90aW9uKSA6IG9taXQob3B0aW9ucywgb3duS2V5cyhyZWR1Y2VkTW90aW9uKSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2V0KG9wdHMsIGJhc2UsIG5vdGlmeSkge1xuICAgIG1lcmdlKG9wdGlvbnMsIG9wdHMpO1xuICAgIGJhc2UgJiYgbWVyZ2UoT2JqZWN0LmdldFByb3RvdHlwZU9mKG9wdGlvbnMpLCBvcHRzKTtcblxuICAgIGlmIChub3RpZnkgfHwgIXN0YXRlLmlzKENSRUFURUQpKSB7XG4gICAgICBTcGxpZGUyLmVtaXQoRVZFTlRfVVBEQVRFRCwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzZXR1cDogc2V0dXAsXG4gICAgZGVzdHJveTogZGVzdHJveSxcbiAgICByZWR1Y2U6IHJlZHVjZSxcbiAgICBzZXQ6IHNldFxuICB9O1xufVxuXG52YXIgQVJST1cgPSBcIkFycm93XCI7XG52YXIgQVJST1dfTEVGVCA9IEFSUk9XICsgXCJMZWZ0XCI7XG52YXIgQVJST1dfUklHSFQgPSBBUlJPVyArIFwiUmlnaHRcIjtcbnZhciBBUlJPV19VUCA9IEFSUk9XICsgXCJVcFwiO1xudmFyIEFSUk9XX0RPV04gPSBBUlJPVyArIFwiRG93blwiO1xudmFyIExUUiA9IFwibHRyXCI7XG52YXIgUlRMID0gXCJydGxcIjtcbnZhciBUVEIgPSBcInR0YlwiO1xudmFyIE9SSUVOVEFUSU9OX01BUCA9IHtcbiAgd2lkdGg6IFtcImhlaWdodFwiXSxcbiAgbGVmdDogW1widG9wXCIsIFwicmlnaHRcIl0sXG4gIHJpZ2h0OiBbXCJib3R0b21cIiwgXCJsZWZ0XCJdLFxuICB4OiBbXCJ5XCJdLFxuICBYOiBbXCJZXCJdLFxuICBZOiBbXCJYXCJdLFxuICBBcnJvd0xlZnQ6IFtBUlJPV19VUCwgQVJST1dfUklHSFRdLFxuICBBcnJvd1JpZ2h0OiBbQVJST1dfRE9XTiwgQVJST1dfTEVGVF1cbn07XG5cbmZ1bmN0aW9uIERpcmVjdGlvbihTcGxpZGUyLCBDb21wb25lbnRzMiwgb3B0aW9ucykge1xuICBmdW5jdGlvbiByZXNvbHZlKHByb3AsIGF4aXNPbmx5LCBkaXJlY3Rpb24pIHtcbiAgICBkaXJlY3Rpb24gPSBkaXJlY3Rpb24gfHwgb3B0aW9ucy5kaXJlY3Rpb247XG4gICAgdmFyIGluZGV4ID0gZGlyZWN0aW9uID09PSBSVEwgJiYgIWF4aXNPbmx5ID8gMSA6IGRpcmVjdGlvbiA9PT0gVFRCID8gMCA6IC0xO1xuICAgIHJldHVybiBPUklFTlRBVElPTl9NQVBbcHJvcF0gJiYgT1JJRU5UQVRJT05fTUFQW3Byb3BdW2luZGV4XSB8fCBwcm9wLnJlcGxhY2UoL3dpZHRofGxlZnR8cmlnaHQvaSwgZnVuY3Rpb24gKG1hdGNoLCBvZmZzZXQpIHtcbiAgICAgIHZhciByZXBsYWNlbWVudCA9IE9SSUVOVEFUSU9OX01BUFttYXRjaC50b0xvd2VyQ2FzZSgpXVtpbmRleF0gfHwgbWF0Y2g7XG4gICAgICByZXR1cm4gb2Zmc2V0ID4gMCA/IHJlcGxhY2VtZW50LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcmVwbGFjZW1lbnQuc2xpY2UoMSkgOiByZXBsYWNlbWVudDtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9yaWVudCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAqIChvcHRpb25zLmRpcmVjdGlvbiA9PT0gUlRMID8gMSA6IC0xKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcmVzb2x2ZTogcmVzb2x2ZSxcbiAgICBvcmllbnQ6IG9yaWVudFxuICB9O1xufVxuXG52YXIgUk9MRSA9IFwicm9sZVwiO1xudmFyIFRBQl9JTkRFWCA9IFwidGFiaW5kZXhcIjtcbnZhciBESVNBQkxFRCA9IFwiZGlzYWJsZWRcIjtcbnZhciBBUklBX1BSRUZJWCA9IFwiYXJpYS1cIjtcbnZhciBBUklBX0NPTlRST0xTID0gQVJJQV9QUkVGSVggKyBcImNvbnRyb2xzXCI7XG52YXIgQVJJQV9DVVJSRU5UID0gQVJJQV9QUkVGSVggKyBcImN1cnJlbnRcIjtcbnZhciBBUklBX1NFTEVDVEVEID0gQVJJQV9QUkVGSVggKyBcInNlbGVjdGVkXCI7XG52YXIgQVJJQV9MQUJFTCA9IEFSSUFfUFJFRklYICsgXCJsYWJlbFwiO1xudmFyIEFSSUFfTEFCRUxMRURCWSA9IEFSSUFfUFJFRklYICsgXCJsYWJlbGxlZGJ5XCI7XG52YXIgQVJJQV9ISURERU4gPSBBUklBX1BSRUZJWCArIFwiaGlkZGVuXCI7XG52YXIgQVJJQV9PUklFTlRBVElPTiA9IEFSSUFfUFJFRklYICsgXCJvcmllbnRhdGlvblwiO1xudmFyIEFSSUFfUk9MRURFU0NSSVBUSU9OID0gQVJJQV9QUkVGSVggKyBcInJvbGVkZXNjcmlwdGlvblwiO1xudmFyIEFSSUFfTElWRSA9IEFSSUFfUFJFRklYICsgXCJsaXZlXCI7XG52YXIgQVJJQV9CVVNZID0gQVJJQV9QUkVGSVggKyBcImJ1c3lcIjtcbnZhciBBUklBX0FUT01JQyA9IEFSSUFfUFJFRklYICsgXCJhdG9taWNcIjtcbnZhciBBTExfQVRUUklCVVRFUyA9IFtST0xFLCBUQUJfSU5ERVgsIERJU0FCTEVELCBBUklBX0NPTlRST0xTLCBBUklBX0NVUlJFTlQsIEFSSUFfTEFCRUwsIEFSSUFfTEFCRUxMRURCWSwgQVJJQV9ISURERU4sIEFSSUFfT1JJRU5UQVRJT04sIEFSSUFfUk9MRURFU0NSSVBUSU9OXTtcbnZhciBDTEFTU19QUkVGSVggPSBQUk9KRUNUX0NPREUgKyBcIl9fXCI7XG52YXIgU1RBVFVTX0NMQVNTX1BSRUZJWCA9IFwiaXMtXCI7XG52YXIgQ0xBU1NfUk9PVCA9IFBST0pFQ1RfQ09ERTtcbnZhciBDTEFTU19UUkFDSyA9IENMQVNTX1BSRUZJWCArIFwidHJhY2tcIjtcbnZhciBDTEFTU19MSVNUID0gQ0xBU1NfUFJFRklYICsgXCJsaXN0XCI7XG52YXIgQ0xBU1NfU0xJREUgPSBDTEFTU19QUkVGSVggKyBcInNsaWRlXCI7XG52YXIgQ0xBU1NfQ0xPTkUgPSBDTEFTU19TTElERSArIFwiLS1jbG9uZVwiO1xudmFyIENMQVNTX0NPTlRBSU5FUiA9IENMQVNTX1NMSURFICsgXCJfX2NvbnRhaW5lclwiO1xudmFyIENMQVNTX0FSUk9XUyA9IENMQVNTX1BSRUZJWCArIFwiYXJyb3dzXCI7XG52YXIgQ0xBU1NfQVJST1cgPSBDTEFTU19QUkVGSVggKyBcImFycm93XCI7XG52YXIgQ0xBU1NfQVJST1dfUFJFViA9IENMQVNTX0FSUk9XICsgXCItLXByZXZcIjtcbnZhciBDTEFTU19BUlJPV19ORVhUID0gQ0xBU1NfQVJST1cgKyBcIi0tbmV4dFwiO1xudmFyIENMQVNTX1BBR0lOQVRJT04gPSBDTEFTU19QUkVGSVggKyBcInBhZ2luYXRpb25cIjtcbnZhciBDTEFTU19QQUdJTkFUSU9OX1BBR0UgPSBDTEFTU19QQUdJTkFUSU9OICsgXCJfX3BhZ2VcIjtcbnZhciBDTEFTU19QUk9HUkVTUyA9IENMQVNTX1BSRUZJWCArIFwicHJvZ3Jlc3NcIjtcbnZhciBDTEFTU19QUk9HUkVTU19CQVIgPSBDTEFTU19QUk9HUkVTUyArIFwiX19iYXJcIjtcbnZhciBDTEFTU19UT0dHTEUgPSBDTEFTU19QUkVGSVggKyBcInRvZ2dsZVwiO1xudmFyIENMQVNTX1RPR0dMRV9QTEFZID0gQ0xBU1NfVE9HR0xFICsgXCJfX3BsYXlcIjtcbnZhciBDTEFTU19UT0dHTEVfUEFVU0UgPSBDTEFTU19UT0dHTEUgKyBcIl9fcGF1c2VcIjtcbnZhciBDTEFTU19TUElOTkVSID0gQ0xBU1NfUFJFRklYICsgXCJzcGlubmVyXCI7XG52YXIgQ0xBU1NfU1IgPSBDTEFTU19QUkVGSVggKyBcInNyXCI7XG52YXIgQ0xBU1NfSU5JVElBTElaRUQgPSBTVEFUVVNfQ0xBU1NfUFJFRklYICsgXCJpbml0aWFsaXplZFwiO1xudmFyIENMQVNTX0FDVElWRSA9IFNUQVRVU19DTEFTU19QUkVGSVggKyBcImFjdGl2ZVwiO1xudmFyIENMQVNTX1BSRVYgPSBTVEFUVVNfQ0xBU1NfUFJFRklYICsgXCJwcmV2XCI7XG52YXIgQ0xBU1NfTkVYVCA9IFNUQVRVU19DTEFTU19QUkVGSVggKyBcIm5leHRcIjtcbnZhciBDTEFTU19WSVNJQkxFID0gU1RBVFVTX0NMQVNTX1BSRUZJWCArIFwidmlzaWJsZVwiO1xudmFyIENMQVNTX0xPQURJTkcgPSBTVEFUVVNfQ0xBU1NfUFJFRklYICsgXCJsb2FkaW5nXCI7XG52YXIgQ0xBU1NfRk9DVVNfSU4gPSBTVEFUVVNfQ0xBU1NfUFJFRklYICsgXCJmb2N1cy1pblwiO1xudmFyIENMQVNTX09WRVJGTE9XID0gU1RBVFVTX0NMQVNTX1BSRUZJWCArIFwib3ZlcmZsb3dcIjtcbnZhciBTVEFUVVNfQ0xBU1NFUyA9IFtDTEFTU19BQ1RJVkUsIENMQVNTX1ZJU0lCTEUsIENMQVNTX1BSRVYsIENMQVNTX05FWFQsIENMQVNTX0xPQURJTkcsIENMQVNTX0ZPQ1VTX0lOLCBDTEFTU19PVkVSRkxPV107XG52YXIgQ0xBU1NFUyA9IHtcbiAgc2xpZGU6IENMQVNTX1NMSURFLFxuICBjbG9uZTogQ0xBU1NfQ0xPTkUsXG4gIGFycm93czogQ0xBU1NfQVJST1dTLFxuICBhcnJvdzogQ0xBU1NfQVJST1csXG4gIHByZXY6IENMQVNTX0FSUk9XX1BSRVYsXG4gIG5leHQ6IENMQVNTX0FSUk9XX05FWFQsXG4gIHBhZ2luYXRpb246IENMQVNTX1BBR0lOQVRJT04sXG4gIHBhZ2U6IENMQVNTX1BBR0lOQVRJT05fUEFHRSxcbiAgc3Bpbm5lcjogQ0xBU1NfU1BJTk5FUlxufTtcblxuZnVuY3Rpb24gY2xvc2VzdChmcm9tLCBzZWxlY3Rvcikge1xuICBpZiAoaXNGdW5jdGlvbihmcm9tLmNsb3Nlc3QpKSB7XG4gICAgcmV0dXJuIGZyb20uY2xvc2VzdChzZWxlY3Rvcik7XG4gIH1cblxuICB2YXIgZWxtID0gZnJvbTtcblxuICB3aGlsZSAoZWxtICYmIGVsbS5ub2RlVHlwZSA9PT0gMSkge1xuICAgIGlmIChtYXRjaGVzKGVsbSwgc2VsZWN0b3IpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBlbG0gPSBlbG0ucGFyZW50RWxlbWVudDtcbiAgfVxuXG4gIHJldHVybiBlbG07XG59XG5cbnZhciBGUklDVElPTiA9IDU7XG52YXIgTE9HX0lOVEVSVkFMID0gMjAwO1xudmFyIFBPSU5URVJfRE9XTl9FVkVOVFMgPSBcInRvdWNoc3RhcnQgbW91c2Vkb3duXCI7XG52YXIgUE9JTlRFUl9NT1ZFX0VWRU5UUyA9IFwidG91Y2htb3ZlIG1vdXNlbW92ZVwiO1xudmFyIFBPSU5URVJfVVBfRVZFTlRTID0gXCJ0b3VjaGVuZCB0b3VjaGNhbmNlbCBtb3VzZXVwIGNsaWNrXCI7XG5cbmZ1bmN0aW9uIEVsZW1lbnRzKFNwbGlkZTIsIENvbXBvbmVudHMyLCBvcHRpb25zKSB7XG4gIHZhciBfRXZlbnRJbnRlcmZhY2UgPSBFdmVudEludGVyZmFjZShTcGxpZGUyKSxcbiAgICAgIG9uID0gX0V2ZW50SW50ZXJmYWNlLm9uLFxuICAgICAgYmluZCA9IF9FdmVudEludGVyZmFjZS5iaW5kO1xuXG4gIHZhciByb290ID0gU3BsaWRlMi5yb290O1xuICB2YXIgaTE4biA9IG9wdGlvbnMuaTE4bjtcbiAgdmFyIGVsZW1lbnRzID0ge307XG4gIHZhciBzbGlkZXMgPSBbXTtcbiAgdmFyIHJvb3RDbGFzc2VzID0gW107XG4gIHZhciB0cmFja0NsYXNzZXMgPSBbXTtcbiAgdmFyIHRyYWNrO1xuICB2YXIgbGlzdDtcbiAgdmFyIGlzVXNpbmdLZXk7XG5cbiAgZnVuY3Rpb24gc2V0dXAoKSB7XG4gICAgY29sbGVjdCgpO1xuICAgIGluaXQoKTtcbiAgICB1cGRhdGUoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdW50KCkge1xuICAgIG9uKEVWRU5UX1JFRlJFU0gsIGRlc3Ryb3kpO1xuICAgIG9uKEVWRU5UX1JFRlJFU0gsIHNldHVwKTtcbiAgICBvbihFVkVOVF9VUERBVEVELCB1cGRhdGUpO1xuICAgIGJpbmQoZG9jdW1lbnQsIFBPSU5URVJfRE9XTl9FVkVOVFMgKyBcIiBrZXlkb3duXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpc1VzaW5nS2V5ID0gZS50eXBlID09PSBcImtleWRvd25cIjtcbiAgICB9LCB7XG4gICAgICBjYXB0dXJlOiB0cnVlXG4gICAgfSk7XG4gICAgYmluZChyb290LCBcImZvY3VzaW5cIiwgZnVuY3Rpb24gKCkge1xuICAgICAgdG9nZ2xlQ2xhc3Mocm9vdCwgQ0xBU1NfRk9DVVNfSU4sICEhaXNVc2luZ0tleSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZXN0cm95KGNvbXBsZXRlbHkpIHtcbiAgICB2YXIgYXR0cnMgPSBBTExfQVRUUklCVVRFUy5jb25jYXQoXCJzdHlsZVwiKTtcbiAgICBlbXB0eShzbGlkZXMpO1xuICAgIHJlbW92ZUNsYXNzKHJvb3QsIHJvb3RDbGFzc2VzKTtcbiAgICByZW1vdmVDbGFzcyh0cmFjaywgdHJhY2tDbGFzc2VzKTtcbiAgICByZW1vdmVBdHRyaWJ1dGUoW3RyYWNrLCBsaXN0XSwgYXR0cnMpO1xuICAgIHJlbW92ZUF0dHJpYnV0ZShyb290LCBjb21wbGV0ZWx5ID8gYXR0cnMgOiBbXCJzdHlsZVwiLCBBUklBX1JPTEVERVNDUklQVElPTl0pO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgIHJlbW92ZUNsYXNzKHJvb3QsIHJvb3RDbGFzc2VzKTtcbiAgICByZW1vdmVDbGFzcyh0cmFjaywgdHJhY2tDbGFzc2VzKTtcbiAgICByb290Q2xhc3NlcyA9IGdldENsYXNzZXMoQ0xBU1NfUk9PVCk7XG4gICAgdHJhY2tDbGFzc2VzID0gZ2V0Q2xhc3NlcyhDTEFTU19UUkFDSyk7XG4gICAgYWRkQ2xhc3Mocm9vdCwgcm9vdENsYXNzZXMpO1xuICAgIGFkZENsYXNzKHRyYWNrLCB0cmFja0NsYXNzZXMpO1xuICAgIHNldEF0dHJpYnV0ZShyb290LCBBUklBX0xBQkVMLCBvcHRpb25zLmxhYmVsKTtcbiAgICBzZXRBdHRyaWJ1dGUocm9vdCwgQVJJQV9MQUJFTExFREJZLCBvcHRpb25zLmxhYmVsbGVkYnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gY29sbGVjdCgpIHtcbiAgICB0cmFjayA9IGZpbmQoXCIuXCIgKyBDTEFTU19UUkFDSyk7XG4gICAgbGlzdCA9IGNoaWxkKHRyYWNrLCBcIi5cIiArIENMQVNTX0xJU1QpO1xuICAgIGFzc2VydCh0cmFjayAmJiBsaXN0LCBcIkEgdHJhY2svbGlzdCBlbGVtZW50IGlzIG1pc3NpbmcuXCIpO1xuICAgIHB1c2goc2xpZGVzLCBjaGlsZHJlbihsaXN0LCBcIi5cIiArIENMQVNTX1NMSURFICsgXCI6bm90KC5cIiArIENMQVNTX0NMT05FICsgXCIpXCIpKTtcbiAgICBmb3JPd24oe1xuICAgICAgYXJyb3dzOiBDTEFTU19BUlJPV1MsXG4gICAgICBwYWdpbmF0aW9uOiBDTEFTU19QQUdJTkFUSU9OLFxuICAgICAgcHJldjogQ0xBU1NfQVJST1dfUFJFVixcbiAgICAgIG5leHQ6IENMQVNTX0FSUk9XX05FWFQsXG4gICAgICBiYXI6IENMQVNTX1BST0dSRVNTX0JBUixcbiAgICAgIHRvZ2dsZTogQ0xBU1NfVE9HR0xFXG4gICAgfSwgZnVuY3Rpb24gKGNsYXNzTmFtZSwga2V5KSB7XG4gICAgICBlbGVtZW50c1trZXldID0gZmluZChcIi5cIiArIGNsYXNzTmFtZSk7XG4gICAgfSk7XG4gICAgYXNzaWduKGVsZW1lbnRzLCB7XG4gICAgICByb290OiByb290LFxuICAgICAgdHJhY2s6IHRyYWNrLFxuICAgICAgbGlzdDogbGlzdCxcbiAgICAgIHNsaWRlczogc2xpZGVzXG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBpbml0KCkge1xuICAgIHZhciBpZCA9IHJvb3QuaWQgfHwgdW5pcXVlSWQoUFJPSkVDVF9DT0RFKTtcbiAgICB2YXIgcm9sZSA9IG9wdGlvbnMucm9sZTtcbiAgICByb290LmlkID0gaWQ7XG4gICAgdHJhY2suaWQgPSB0cmFjay5pZCB8fCBpZCArIFwiLXRyYWNrXCI7XG4gICAgbGlzdC5pZCA9IGxpc3QuaWQgfHwgaWQgKyBcIi1saXN0XCI7XG5cbiAgICBpZiAoIWdldEF0dHJpYnV0ZShyb290LCBST0xFKSAmJiByb290LnRhZ05hbWUgIT09IFwiU0VDVElPTlwiICYmIHJvbGUpIHtcbiAgICAgIHNldEF0dHJpYnV0ZShyb290LCBST0xFLCByb2xlKTtcbiAgICB9XG5cbiAgICBzZXRBdHRyaWJ1dGUocm9vdCwgQVJJQV9ST0xFREVTQ1JJUFRJT04sIGkxOG4uY2Fyb3VzZWwpO1xuICAgIHNldEF0dHJpYnV0ZShsaXN0LCBST0xFLCBcInByZXNlbnRhdGlvblwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmQoc2VsZWN0b3IpIHtcbiAgICB2YXIgZWxtID0gcXVlcnkocm9vdCwgc2VsZWN0b3IpO1xuICAgIHJldHVybiBlbG0gJiYgY2xvc2VzdChlbG0sIFwiLlwiICsgQ0xBU1NfUk9PVCkgPT09IHJvb3QgPyBlbG0gOiB2b2lkIDA7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRDbGFzc2VzKGJhc2UpIHtcbiAgICByZXR1cm4gW2Jhc2UgKyBcIi0tXCIgKyBvcHRpb25zLnR5cGUsIGJhc2UgKyBcIi0tXCIgKyBvcHRpb25zLmRpcmVjdGlvbiwgb3B0aW9ucy5kcmFnICYmIGJhc2UgKyBcIi0tZHJhZ2dhYmxlXCIsIG9wdGlvbnMuaXNOYXZpZ2F0aW9uICYmIGJhc2UgKyBcIi0tbmF2XCIsIGJhc2UgPT09IENMQVNTX1JPT1QgJiYgQ0xBU1NfQUNUSVZFXTtcbiAgfVxuXG4gIHJldHVybiBhc3NpZ24oZWxlbWVudHMsIHtcbiAgICBzZXR1cDogc2V0dXAsXG4gICAgbW91bnQ6IG1vdW50LFxuICAgIGRlc3Ryb3k6IGRlc3Ryb3lcbiAgfSk7XG59XG5cbnZhciBTTElERSA9IFwic2xpZGVcIjtcbnZhciBMT09QID0gXCJsb29wXCI7XG52YXIgRkFERSA9IFwiZmFkZVwiO1xuXG5mdW5jdGlvbiBTbGlkZSQxKFNwbGlkZTIsIGluZGV4LCBzbGlkZUluZGV4LCBzbGlkZSkge1xuICB2YXIgZXZlbnQgPSBFdmVudEludGVyZmFjZShTcGxpZGUyKTtcbiAgdmFyIG9uID0gZXZlbnQub24sXG4gICAgICBlbWl0ID0gZXZlbnQuZW1pdCxcbiAgICAgIGJpbmQgPSBldmVudC5iaW5kO1xuICB2YXIgQ29tcG9uZW50cyA9IFNwbGlkZTIuQ29tcG9uZW50cyxcbiAgICAgIHJvb3QgPSBTcGxpZGUyLnJvb3QsXG4gICAgICBvcHRpb25zID0gU3BsaWRlMi5vcHRpb25zO1xuICB2YXIgaXNOYXZpZ2F0aW9uID0gb3B0aW9ucy5pc05hdmlnYXRpb24sXG4gICAgICB1cGRhdGVPbk1vdmUgPSBvcHRpb25zLnVwZGF0ZU9uTW92ZSxcbiAgICAgIGkxOG4gPSBvcHRpb25zLmkxOG4sXG4gICAgICBwYWdpbmF0aW9uID0gb3B0aW9ucy5wYWdpbmF0aW9uLFxuICAgICAgc2xpZGVGb2N1cyA9IG9wdGlvbnMuc2xpZGVGb2N1cztcbiAgdmFyIHJlc29sdmUgPSBDb21wb25lbnRzLkRpcmVjdGlvbi5yZXNvbHZlO1xuICB2YXIgc3R5bGVzID0gZ2V0QXR0cmlidXRlKHNsaWRlLCBcInN0eWxlXCIpO1xuICB2YXIgbGFiZWwgPSBnZXRBdHRyaWJ1dGUoc2xpZGUsIEFSSUFfTEFCRUwpO1xuICB2YXIgaXNDbG9uZSA9IHNsaWRlSW5kZXggPiAtMTtcbiAgdmFyIGNvbnRhaW5lciA9IGNoaWxkKHNsaWRlLCBcIi5cIiArIENMQVNTX0NPTlRBSU5FUik7XG4gIHZhciBkZXN0cm95ZWQ7XG5cbiAgZnVuY3Rpb24gbW91bnQoKSB7XG4gICAgaWYgKCFpc0Nsb25lKSB7XG4gICAgICBzbGlkZS5pZCA9IHJvb3QuaWQgKyBcIi1zbGlkZVwiICsgcGFkKGluZGV4ICsgMSk7XG4gICAgICBzZXRBdHRyaWJ1dGUoc2xpZGUsIFJPTEUsIHBhZ2luYXRpb24gPyBcInRhYnBhbmVsXCIgOiBcImdyb3VwXCIpO1xuICAgICAgc2V0QXR0cmlidXRlKHNsaWRlLCBBUklBX1JPTEVERVNDUklQVElPTiwgaTE4bi5zbGlkZSk7XG4gICAgICBzZXRBdHRyaWJ1dGUoc2xpZGUsIEFSSUFfTEFCRUwsIGxhYmVsIHx8IGZvcm1hdChpMThuLnNsaWRlTGFiZWwsIFtpbmRleCArIDEsIFNwbGlkZTIubGVuZ3RoXSkpO1xuICAgIH1cblxuICAgIGxpc3RlbigpO1xuICB9XG5cbiAgZnVuY3Rpb24gbGlzdGVuKCkge1xuICAgIGJpbmQoc2xpZGUsIFwiY2xpY2tcIiwgYXBwbHkoZW1pdCwgRVZFTlRfQ0xJQ0ssIHNlbGYpKTtcbiAgICBiaW5kKHNsaWRlLCBcImtleWRvd25cIiwgYXBwbHkoZW1pdCwgRVZFTlRfU0xJREVfS0VZRE9XTiwgc2VsZikpO1xuICAgIG9uKFtFVkVOVF9NT1ZFRCwgRVZFTlRfU0hJRlRFRCwgRVZFTlRfU0NST0xMRURdLCB1cGRhdGUpO1xuICAgIG9uKEVWRU5UX05BVklHQVRJT05fTU9VTlRFRCwgaW5pdE5hdmlnYXRpb24pO1xuXG4gICAgaWYgKHVwZGF0ZU9uTW92ZSkge1xuICAgICAgb24oRVZFTlRfTU9WRSwgb25Nb3ZlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgIGRlc3Ryb3llZCA9IHRydWU7XG4gICAgZXZlbnQuZGVzdHJveSgpO1xuICAgIHJlbW92ZUNsYXNzKHNsaWRlLCBTVEFUVVNfQ0xBU1NFUyk7XG4gICAgcmVtb3ZlQXR0cmlidXRlKHNsaWRlLCBBTExfQVRUUklCVVRFUyk7XG4gICAgc2V0QXR0cmlidXRlKHNsaWRlLCBcInN0eWxlXCIsIHN0eWxlcyk7XG4gICAgc2V0QXR0cmlidXRlKHNsaWRlLCBBUklBX0xBQkVMLCBsYWJlbCB8fCBcIlwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXROYXZpZ2F0aW9uKCkge1xuICAgIHZhciBjb250cm9scyA9IFNwbGlkZTIuc3BsaWRlcy5tYXAoZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgdmFyIFNsaWRlMiA9IHRhcmdldC5zcGxpZGUuQ29tcG9uZW50cy5TbGlkZXMuZ2V0QXQoaW5kZXgpO1xuICAgICAgcmV0dXJuIFNsaWRlMiA/IFNsaWRlMi5zbGlkZS5pZCA6IFwiXCI7XG4gICAgfSkuam9pbihcIiBcIik7XG4gICAgc2V0QXR0cmlidXRlKHNsaWRlLCBBUklBX0xBQkVMLCBmb3JtYXQoaTE4bi5zbGlkZVgsIChpc0Nsb25lID8gc2xpZGVJbmRleCA6IGluZGV4KSArIDEpKTtcbiAgICBzZXRBdHRyaWJ1dGUoc2xpZGUsIEFSSUFfQ09OVFJPTFMsIGNvbnRyb2xzKTtcbiAgICBzZXRBdHRyaWJ1dGUoc2xpZGUsIFJPTEUsIHNsaWRlRm9jdXMgPyBcImJ1dHRvblwiIDogXCJcIik7XG4gICAgc2xpZGVGb2N1cyAmJiByZW1vdmVBdHRyaWJ1dGUoc2xpZGUsIEFSSUFfUk9MRURFU0NSSVBUSU9OKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uTW92ZSgpIHtcbiAgICBpZiAoIWRlc3Ryb3llZCkge1xuICAgICAgdXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgIGlmICghZGVzdHJveWVkKSB7XG4gICAgICB2YXIgY3VyciA9IFNwbGlkZTIuaW5kZXg7XG4gICAgICB1cGRhdGVBY3Rpdml0eSgpO1xuICAgICAgdXBkYXRlVmlzaWJpbGl0eSgpO1xuICAgICAgdG9nZ2xlQ2xhc3Moc2xpZGUsIENMQVNTX1BSRVYsIGluZGV4ID09PSBjdXJyIC0gMSk7XG4gICAgICB0b2dnbGVDbGFzcyhzbGlkZSwgQ0xBU1NfTkVYVCwgaW5kZXggPT09IGN1cnIgKyAxKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVBY3Rpdml0eSgpIHtcbiAgICB2YXIgYWN0aXZlID0gaXNBY3RpdmUoKTtcblxuICAgIGlmIChhY3RpdmUgIT09IGhhc0NsYXNzKHNsaWRlLCBDTEFTU19BQ1RJVkUpKSB7XG4gICAgICB0b2dnbGVDbGFzcyhzbGlkZSwgQ0xBU1NfQUNUSVZFLCBhY3RpdmUpO1xuICAgICAgc2V0QXR0cmlidXRlKHNsaWRlLCBBUklBX0NVUlJFTlQsIGlzTmF2aWdhdGlvbiAmJiBhY3RpdmUgfHwgXCJcIik7XG4gICAgICBlbWl0KGFjdGl2ZSA/IEVWRU5UX0FDVElWRSA6IEVWRU5UX0lOQUNUSVZFLCBzZWxmKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVWaXNpYmlsaXR5KCkge1xuICAgIHZhciB2aXNpYmxlID0gaXNWaXNpYmxlKCk7XG4gICAgdmFyIGhpZGRlbiA9ICF2aXNpYmxlICYmICghaXNBY3RpdmUoKSB8fCBpc0Nsb25lKTtcblxuICAgIGlmICghU3BsaWRlMi5zdGF0ZS5pcyhbTU9WSU5HLCBTQ1JPTExJTkddKSkge1xuICAgICAgc2V0QXR0cmlidXRlKHNsaWRlLCBBUklBX0hJRERFTiwgaGlkZGVuIHx8IFwiXCIpO1xuICAgIH1cblxuICAgIHNldEF0dHJpYnV0ZShxdWVyeUFsbChzbGlkZSwgb3B0aW9ucy5mb2N1c2FibGVOb2RlcyB8fCBcIlwiKSwgVEFCX0lOREVYLCBoaWRkZW4gPyAtMSA6IFwiXCIpO1xuXG4gICAgaWYgKHNsaWRlRm9jdXMpIHtcbiAgICAgIHNldEF0dHJpYnV0ZShzbGlkZSwgVEFCX0lOREVYLCBoaWRkZW4gPyAtMSA6IDApO1xuICAgIH1cblxuICAgIGlmICh2aXNpYmxlICE9PSBoYXNDbGFzcyhzbGlkZSwgQ0xBU1NfVklTSUJMRSkpIHtcbiAgICAgIHRvZ2dsZUNsYXNzKHNsaWRlLCBDTEFTU19WSVNJQkxFLCB2aXNpYmxlKTtcbiAgICAgIGVtaXQodmlzaWJsZSA/IEVWRU5UX1ZJU0lCTEUgOiBFVkVOVF9ISURERU4sIHNlbGYpO1xuICAgIH1cblxuICAgIGlmICghdmlzaWJsZSAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBzbGlkZSkge1xuICAgICAgdmFyIFNsaWRlMiA9IENvbXBvbmVudHMuU2xpZGVzLmdldEF0KFNwbGlkZTIuaW5kZXgpO1xuICAgICAgU2xpZGUyICYmIGZvY3VzKFNsaWRlMi5zbGlkZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3R5bGUkMShwcm9wLCB2YWx1ZSwgdXNlQ29udGFpbmVyKSB7XG4gICAgc3R5bGUodXNlQ29udGFpbmVyICYmIGNvbnRhaW5lciB8fCBzbGlkZSwgcHJvcCwgdmFsdWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNBY3RpdmUoKSB7XG4gICAgdmFyIGN1cnIgPSBTcGxpZGUyLmluZGV4O1xuICAgIHJldHVybiBjdXJyID09PSBpbmRleCB8fCBvcHRpb25zLmNsb25lU3RhdHVzICYmIGN1cnIgPT09IHNsaWRlSW5kZXg7XG4gIH1cblxuICBmdW5jdGlvbiBpc1Zpc2libGUoKSB7XG4gICAgaWYgKFNwbGlkZTIuaXMoRkFERSkpIHtcbiAgICAgIHJldHVybiBpc0FjdGl2ZSgpO1xuICAgIH1cblxuICAgIHZhciB0cmFja1JlY3QgPSByZWN0KENvbXBvbmVudHMuRWxlbWVudHMudHJhY2spO1xuICAgIHZhciBzbGlkZVJlY3QgPSByZWN0KHNsaWRlKTtcbiAgICB2YXIgbGVmdCA9IHJlc29sdmUoXCJsZWZ0XCIsIHRydWUpO1xuICAgIHZhciByaWdodCA9IHJlc29sdmUoXCJyaWdodFwiLCB0cnVlKTtcbiAgICByZXR1cm4gZmxvb3IodHJhY2tSZWN0W2xlZnRdKSA8PSBjZWlsKHNsaWRlUmVjdFtsZWZ0XSkgJiYgZmxvb3Ioc2xpZGVSZWN0W3JpZ2h0XSkgPD0gY2VpbCh0cmFja1JlY3RbcmlnaHRdKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzV2l0aGluKGZyb20sIGRpc3RhbmNlKSB7XG4gICAgdmFyIGRpZmYgPSBhYnMoZnJvbSAtIGluZGV4KTtcblxuICAgIGlmICghaXNDbG9uZSAmJiAob3B0aW9ucy5yZXdpbmQgfHwgU3BsaWRlMi5pcyhMT09QKSkpIHtcbiAgICAgIGRpZmYgPSBtaW4oZGlmZiwgU3BsaWRlMi5sZW5ndGggLSBkaWZmKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGlmZiA8PSBkaXN0YW5jZTtcbiAgfVxuXG4gIHZhciBzZWxmID0ge1xuICAgIGluZGV4OiBpbmRleCxcbiAgICBzbGlkZUluZGV4OiBzbGlkZUluZGV4LFxuICAgIHNsaWRlOiBzbGlkZSxcbiAgICBjb250YWluZXI6IGNvbnRhaW5lcixcbiAgICBpc0Nsb25lOiBpc0Nsb25lLFxuICAgIG1vdW50OiBtb3VudCxcbiAgICBkZXN0cm95OiBkZXN0cm95LFxuICAgIHVwZGF0ZTogdXBkYXRlLFxuICAgIHN0eWxlOiBzdHlsZSQxLFxuICAgIGlzV2l0aGluOiBpc1dpdGhpblxuICB9O1xuICByZXR1cm4gc2VsZjtcbn1cblxuZnVuY3Rpb24gU2xpZGVzKFNwbGlkZTIsIENvbXBvbmVudHMyLCBvcHRpb25zKSB7XG4gIHZhciBfRXZlbnRJbnRlcmZhY2UyID0gRXZlbnRJbnRlcmZhY2UoU3BsaWRlMiksXG4gICAgICBvbiA9IF9FdmVudEludGVyZmFjZTIub24sXG4gICAgICBlbWl0ID0gX0V2ZW50SW50ZXJmYWNlMi5lbWl0LFxuICAgICAgYmluZCA9IF9FdmVudEludGVyZmFjZTIuYmluZDtcblxuICB2YXIgX0NvbXBvbmVudHMyJEVsZW1lbnRzID0gQ29tcG9uZW50czIuRWxlbWVudHMsXG4gICAgICBzbGlkZXMgPSBfQ29tcG9uZW50czIkRWxlbWVudHMuc2xpZGVzLFxuICAgICAgbGlzdCA9IF9Db21wb25lbnRzMiRFbGVtZW50cy5saXN0O1xuICB2YXIgU2xpZGVzMiA9IFtdO1xuXG4gIGZ1bmN0aW9uIG1vdW50KCkge1xuICAgIGluaXQoKTtcbiAgICBvbihFVkVOVF9SRUZSRVNILCBkZXN0cm95KTtcbiAgICBvbihFVkVOVF9SRUZSRVNILCBpbml0KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgc2xpZGVzLmZvckVhY2goZnVuY3Rpb24gKHNsaWRlLCBpbmRleCkge1xuICAgICAgcmVnaXN0ZXIoc2xpZGUsIGluZGV4LCAtMSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgIGZvckVhY2gkMShmdW5jdGlvbiAoU2xpZGUyKSB7XG4gICAgICBTbGlkZTIuZGVzdHJveSgpO1xuICAgIH0pO1xuICAgIGVtcHR5KFNsaWRlczIpO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgIGZvckVhY2gkMShmdW5jdGlvbiAoU2xpZGUyKSB7XG4gICAgICBTbGlkZTIudXBkYXRlKCk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiByZWdpc3RlcihzbGlkZSwgaW5kZXgsIHNsaWRlSW5kZXgpIHtcbiAgICB2YXIgb2JqZWN0ID0gU2xpZGUkMShTcGxpZGUyLCBpbmRleCwgc2xpZGVJbmRleCwgc2xpZGUpO1xuICAgIG9iamVjdC5tb3VudCgpO1xuICAgIFNsaWRlczIucHVzaChvYmplY3QpO1xuICAgIFNsaWRlczIuc29ydChmdW5jdGlvbiAoU2xpZGUxLCBTbGlkZTIpIHtcbiAgICAgIHJldHVybiBTbGlkZTEuaW5kZXggLSBTbGlkZTIuaW5kZXg7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXQoZXhjbHVkZUNsb25lcykge1xuICAgIHJldHVybiBleGNsdWRlQ2xvbmVzID8gZmlsdGVyKGZ1bmN0aW9uIChTbGlkZTIpIHtcbiAgICAgIHJldHVybiAhU2xpZGUyLmlzQ2xvbmU7XG4gICAgfSkgOiBTbGlkZXMyO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0SW4ocGFnZSkge1xuICAgIHZhciBDb250cm9sbGVyID0gQ29tcG9uZW50czIuQ29udHJvbGxlcjtcbiAgICB2YXIgaW5kZXggPSBDb250cm9sbGVyLnRvSW5kZXgocGFnZSk7XG4gICAgdmFyIG1heCA9IENvbnRyb2xsZXIuaGFzRm9jdXMoKSA/IDEgOiBvcHRpb25zLnBlclBhZ2U7XG4gICAgcmV0dXJuIGZpbHRlcihmdW5jdGlvbiAoU2xpZGUyKSB7XG4gICAgICByZXR1cm4gYmV0d2VlbihTbGlkZTIuaW5kZXgsIGluZGV4LCBpbmRleCArIG1heCAtIDEpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0QXQoaW5kZXgpIHtcbiAgICByZXR1cm4gZmlsdGVyKGluZGV4KVswXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZChpdGVtcywgaW5kZXgpIHtcbiAgICBmb3JFYWNoKGl0ZW1zLCBmdW5jdGlvbiAoc2xpZGUpIHtcbiAgICAgIGlmIChpc1N0cmluZyhzbGlkZSkpIHtcbiAgICAgICAgc2xpZGUgPSBwYXJzZUh0bWwoc2xpZGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNIVE1MRWxlbWVudChzbGlkZSkpIHtcbiAgICAgICAgdmFyIHJlZiA9IHNsaWRlc1tpbmRleF07XG4gICAgICAgIHJlZiA/IGJlZm9yZShzbGlkZSwgcmVmKSA6IGFwcGVuZChsaXN0LCBzbGlkZSk7XG4gICAgICAgIGFkZENsYXNzKHNsaWRlLCBvcHRpb25zLmNsYXNzZXMuc2xpZGUpO1xuICAgICAgICBvYnNlcnZlSW1hZ2VzKHNsaWRlLCBhcHBseShlbWl0LCBFVkVOVF9SRVNJWkUpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBlbWl0KEVWRU5UX1JFRlJFU0gpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZlJDEobWF0Y2hlcikge1xuICAgIHJlbW92ZShmaWx0ZXIobWF0Y2hlcikubWFwKGZ1bmN0aW9uIChTbGlkZTIpIHtcbiAgICAgIHJldHVybiBTbGlkZTIuc2xpZGU7XG4gICAgfSkpO1xuICAgIGVtaXQoRVZFTlRfUkVGUkVTSCk7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JFYWNoJDEoaXRlcmF0ZWUsIGV4Y2x1ZGVDbG9uZXMpIHtcbiAgICBnZXQoZXhjbHVkZUNsb25lcykuZm9yRWFjaChpdGVyYXRlZSk7XG4gIH1cblxuICBmdW5jdGlvbiBmaWx0ZXIobWF0Y2hlcikge1xuICAgIHJldHVybiBTbGlkZXMyLmZpbHRlcihpc0Z1bmN0aW9uKG1hdGNoZXIpID8gbWF0Y2hlciA6IGZ1bmN0aW9uIChTbGlkZTIpIHtcbiAgICAgIHJldHVybiBpc1N0cmluZyhtYXRjaGVyKSA/IG1hdGNoZXMoU2xpZGUyLnNsaWRlLCBtYXRjaGVyKSA6IGluY2x1ZGVzKHRvQXJyYXkobWF0Y2hlciksIFNsaWRlMi5pbmRleCk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBzdHlsZShwcm9wLCB2YWx1ZSwgdXNlQ29udGFpbmVyKSB7XG4gICAgZm9yRWFjaCQxKGZ1bmN0aW9uIChTbGlkZTIpIHtcbiAgICAgIFNsaWRlMi5zdHlsZShwcm9wLCB2YWx1ZSwgdXNlQ29udGFpbmVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9ic2VydmVJbWFnZXMoZWxtLCBjYWxsYmFjaykge1xuICAgIHZhciBpbWFnZXMgPSBxdWVyeUFsbChlbG0sIFwiaW1nXCIpO1xuICAgIHZhciBsZW5ndGggPSBpbWFnZXMubGVuZ3RoO1xuXG4gICAgaWYgKGxlbmd0aCkge1xuICAgICAgaW1hZ2VzLmZvckVhY2goZnVuY3Rpb24gKGltZykge1xuICAgICAgICBiaW5kKGltZywgXCJsb2FkIGVycm9yXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoISAtLWxlbmd0aCkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0TGVuZ3RoKGV4Y2x1ZGVDbG9uZXMpIHtcbiAgICByZXR1cm4gZXhjbHVkZUNsb25lcyA/IHNsaWRlcy5sZW5ndGggOiBTbGlkZXMyLmxlbmd0aDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzRW5vdWdoKCkge1xuICAgIHJldHVybiBTbGlkZXMyLmxlbmd0aCA+IG9wdGlvbnMucGVyUGFnZTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbW91bnQ6IG1vdW50LFxuICAgIGRlc3Ryb3k6IGRlc3Ryb3ksXG4gICAgdXBkYXRlOiB1cGRhdGUsXG4gICAgcmVnaXN0ZXI6IHJlZ2lzdGVyLFxuICAgIGdldDogZ2V0LFxuICAgIGdldEluOiBnZXRJbixcbiAgICBnZXRBdDogZ2V0QXQsXG4gICAgYWRkOiBhZGQsXG4gICAgcmVtb3ZlOiByZW1vdmUkMSxcbiAgICBmb3JFYWNoOiBmb3JFYWNoJDEsXG4gICAgZmlsdGVyOiBmaWx0ZXIsXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIGdldExlbmd0aDogZ2V0TGVuZ3RoLFxuICAgIGlzRW5vdWdoOiBpc0Vub3VnaFxuICB9O1xufVxuXG5mdW5jdGlvbiBMYXlvdXQoU3BsaWRlMiwgQ29tcG9uZW50czIsIG9wdGlvbnMpIHtcbiAgdmFyIF9FdmVudEludGVyZmFjZTMgPSBFdmVudEludGVyZmFjZShTcGxpZGUyKSxcbiAgICAgIG9uID0gX0V2ZW50SW50ZXJmYWNlMy5vbixcbiAgICAgIGJpbmQgPSBfRXZlbnRJbnRlcmZhY2UzLmJpbmQsXG4gICAgICBlbWl0ID0gX0V2ZW50SW50ZXJmYWNlMy5lbWl0O1xuXG4gIHZhciBTbGlkZXMgPSBDb21wb25lbnRzMi5TbGlkZXM7XG4gIHZhciByZXNvbHZlID0gQ29tcG9uZW50czIuRGlyZWN0aW9uLnJlc29sdmU7XG4gIHZhciBfQ29tcG9uZW50czIkRWxlbWVudHMyID0gQ29tcG9uZW50czIuRWxlbWVudHMsXG4gICAgICByb290ID0gX0NvbXBvbmVudHMyJEVsZW1lbnRzMi5yb290LFxuICAgICAgdHJhY2sgPSBfQ29tcG9uZW50czIkRWxlbWVudHMyLnRyYWNrLFxuICAgICAgbGlzdCA9IF9Db21wb25lbnRzMiRFbGVtZW50czIubGlzdDtcbiAgdmFyIGdldEF0ID0gU2xpZGVzLmdldEF0LFxuICAgICAgc3R5bGVTbGlkZXMgPSBTbGlkZXMuc3R5bGU7XG4gIHZhciB2ZXJ0aWNhbDtcbiAgdmFyIHJvb3RSZWN0O1xuICB2YXIgb3ZlcmZsb3c7XG5cbiAgZnVuY3Rpb24gbW91bnQoKSB7XG4gICAgaW5pdCgpO1xuICAgIGJpbmQod2luZG93LCBcInJlc2l6ZSBsb2FkXCIsIFRocm90dGxlKGFwcGx5KGVtaXQsIEVWRU5UX1JFU0laRSkpKTtcbiAgICBvbihbRVZFTlRfVVBEQVRFRCwgRVZFTlRfUkVGUkVTSF0sIGluaXQpO1xuICAgIG9uKEVWRU5UX1JFU0laRSwgcmVzaXplKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgdmVydGljYWwgPSBvcHRpb25zLmRpcmVjdGlvbiA9PT0gVFRCO1xuICAgIHN0eWxlKHJvb3QsIFwibWF4V2lkdGhcIiwgdW5pdChvcHRpb25zLndpZHRoKSk7XG4gICAgc3R5bGUodHJhY2ssIHJlc29sdmUoXCJwYWRkaW5nTGVmdFwiKSwgY3NzUGFkZGluZyhmYWxzZSkpO1xuICAgIHN0eWxlKHRyYWNrLCByZXNvbHZlKFwicGFkZGluZ1JpZ2h0XCIpLCBjc3NQYWRkaW5nKHRydWUpKTtcbiAgICByZXNpemUodHJ1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXNpemUoZm9yY2UpIHtcbiAgICB2YXIgbmV3UmVjdCA9IHJlY3Qocm9vdCk7XG5cbiAgICBpZiAoZm9yY2UgfHwgcm9vdFJlY3Qud2lkdGggIT09IG5ld1JlY3Qud2lkdGggfHwgcm9vdFJlY3QuaGVpZ2h0ICE9PSBuZXdSZWN0LmhlaWdodCkge1xuICAgICAgc3R5bGUodHJhY2ssIFwiaGVpZ2h0XCIsIGNzc1RyYWNrSGVpZ2h0KCkpO1xuICAgICAgc3R5bGVTbGlkZXMocmVzb2x2ZShcIm1hcmdpblJpZ2h0XCIpLCB1bml0KG9wdGlvbnMuZ2FwKSk7XG4gICAgICBzdHlsZVNsaWRlcyhcIndpZHRoXCIsIGNzc1NsaWRlV2lkdGgoKSk7XG4gICAgICBzdHlsZVNsaWRlcyhcImhlaWdodFwiLCBjc3NTbGlkZUhlaWdodCgpLCB0cnVlKTtcbiAgICAgIHJvb3RSZWN0ID0gbmV3UmVjdDtcbiAgICAgIGVtaXQoRVZFTlRfUkVTSVpFRCk7XG5cbiAgICAgIGlmIChvdmVyZmxvdyAhPT0gKG92ZXJmbG93ID0gaXNPdmVyZmxvdygpKSkge1xuICAgICAgICB0b2dnbGVDbGFzcyhyb290LCBDTEFTU19PVkVSRkxPVywgb3ZlcmZsb3cpO1xuICAgICAgICBlbWl0KEVWRU5UX09WRVJGTE9XLCBvdmVyZmxvdyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY3NzUGFkZGluZyhyaWdodCkge1xuICAgIHZhciBwYWRkaW5nID0gb3B0aW9ucy5wYWRkaW5nO1xuICAgIHZhciBwcm9wID0gcmVzb2x2ZShyaWdodCA/IFwicmlnaHRcIiA6IFwibGVmdFwiKTtcbiAgICByZXR1cm4gcGFkZGluZyAmJiB1bml0KHBhZGRpbmdbcHJvcF0gfHwgKGlzT2JqZWN0KHBhZGRpbmcpID8gMCA6IHBhZGRpbmcpKSB8fCBcIjBweFwiO1xuICB9XG5cbiAgZnVuY3Rpb24gY3NzVHJhY2tIZWlnaHQoKSB7XG4gICAgdmFyIGhlaWdodCA9IFwiXCI7XG5cbiAgICBpZiAodmVydGljYWwpIHtcbiAgICAgIGhlaWdodCA9IGNzc0hlaWdodCgpO1xuICAgICAgYXNzZXJ0KGhlaWdodCwgXCJoZWlnaHQgb3IgaGVpZ2h0UmF0aW8gaXMgbWlzc2luZy5cIik7XG4gICAgICBoZWlnaHQgPSBcImNhbGMoXCIgKyBoZWlnaHQgKyBcIiAtIFwiICsgY3NzUGFkZGluZyhmYWxzZSkgKyBcIiAtIFwiICsgY3NzUGFkZGluZyh0cnVlKSArIFwiKVwiO1xuICAgIH1cblxuICAgIHJldHVybiBoZWlnaHQ7XG4gIH1cblxuICBmdW5jdGlvbiBjc3NIZWlnaHQoKSB7XG4gICAgcmV0dXJuIHVuaXQob3B0aW9ucy5oZWlnaHQgfHwgcmVjdChsaXN0KS53aWR0aCAqIG9wdGlvbnMuaGVpZ2h0UmF0aW8pO1xuICB9XG5cbiAgZnVuY3Rpb24gY3NzU2xpZGVXaWR0aCgpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5hdXRvV2lkdGggPyBudWxsIDogdW5pdChvcHRpb25zLmZpeGVkV2lkdGgpIHx8ICh2ZXJ0aWNhbCA/IFwiXCIgOiBjc3NTbGlkZVNpemUoKSk7XG4gIH1cblxuICBmdW5jdGlvbiBjc3NTbGlkZUhlaWdodCgpIHtcbiAgICByZXR1cm4gdW5pdChvcHRpb25zLmZpeGVkSGVpZ2h0KSB8fCAodmVydGljYWwgPyBvcHRpb25zLmF1dG9IZWlnaHQgPyBudWxsIDogY3NzU2xpZGVTaXplKCkgOiBjc3NIZWlnaHQoKSk7XG4gIH1cblxuICBmdW5jdGlvbiBjc3NTbGlkZVNpemUoKSB7XG4gICAgdmFyIGdhcCA9IHVuaXQob3B0aW9ucy5nYXApO1xuICAgIHJldHVybiBcImNhbGMoKDEwMCVcIiArIChnYXAgJiYgXCIgKyBcIiArIGdhcCkgKyBcIikvXCIgKyAob3B0aW9ucy5wZXJQYWdlIHx8IDEpICsgKGdhcCAmJiBcIiAtIFwiICsgZ2FwKSArIFwiKVwiO1xuICB9XG5cbiAgZnVuY3Rpb24gbGlzdFNpemUoKSB7XG4gICAgcmV0dXJuIHJlY3QobGlzdClbcmVzb2x2ZShcIndpZHRoXCIpXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNsaWRlU2l6ZShpbmRleCwgd2l0aG91dEdhcCkge1xuICAgIHZhciBTbGlkZSA9IGdldEF0KGluZGV4IHx8IDApO1xuICAgIHJldHVybiBTbGlkZSA/IHJlY3QoU2xpZGUuc2xpZGUpW3Jlc29sdmUoXCJ3aWR0aFwiKV0gKyAod2l0aG91dEdhcCA/IDAgOiBnZXRHYXAoKSkgOiAwO1xuICB9XG5cbiAgZnVuY3Rpb24gdG90YWxTaXplKGluZGV4LCB3aXRob3V0R2FwKSB7XG4gICAgdmFyIFNsaWRlID0gZ2V0QXQoaW5kZXgpO1xuXG4gICAgaWYgKFNsaWRlKSB7XG4gICAgICB2YXIgcmlnaHQgPSByZWN0KFNsaWRlLnNsaWRlKVtyZXNvbHZlKFwicmlnaHRcIildO1xuICAgICAgdmFyIGxlZnQgPSByZWN0KGxpc3QpW3Jlc29sdmUoXCJsZWZ0XCIpXTtcbiAgICAgIHJldHVybiBhYnMocmlnaHQgLSBsZWZ0KSArICh3aXRob3V0R2FwID8gMCA6IGdldEdhcCgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNsaWRlclNpemUod2l0aG91dEdhcCkge1xuICAgIHJldHVybiB0b3RhbFNpemUoU3BsaWRlMi5sZW5ndGggLSAxKSAtIHRvdGFsU2l6ZSgwKSArIHNsaWRlU2l6ZSgwLCB3aXRob3V0R2FwKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEdhcCgpIHtcbiAgICB2YXIgU2xpZGUgPSBnZXRBdCgwKTtcbiAgICByZXR1cm4gU2xpZGUgJiYgcGFyc2VGbG9hdChzdHlsZShTbGlkZS5zbGlkZSwgcmVzb2x2ZShcIm1hcmdpblJpZ2h0XCIpKSkgfHwgMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFBhZGRpbmcocmlnaHQpIHtcbiAgICByZXR1cm4gcGFyc2VGbG9hdChzdHlsZSh0cmFjaywgcmVzb2x2ZShcInBhZGRpbmdcIiArIChyaWdodCA/IFwiUmlnaHRcIiA6IFwiTGVmdFwiKSkpKSB8fCAwO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNPdmVyZmxvdygpIHtcbiAgICByZXR1cm4gU3BsaWRlMi5pcyhGQURFKSB8fCBzbGlkZXJTaXplKHRydWUpID4gbGlzdFNpemUoKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbW91bnQ6IG1vdW50LFxuICAgIHJlc2l6ZTogcmVzaXplLFxuICAgIGxpc3RTaXplOiBsaXN0U2l6ZSxcbiAgICBzbGlkZVNpemU6IHNsaWRlU2l6ZSxcbiAgICBzbGlkZXJTaXplOiBzbGlkZXJTaXplLFxuICAgIHRvdGFsU2l6ZTogdG90YWxTaXplLFxuICAgIGdldFBhZGRpbmc6IGdldFBhZGRpbmcsXG4gICAgaXNPdmVyZmxvdzogaXNPdmVyZmxvd1xuICB9O1xufVxuXG52YXIgTVVMVElQTElFUiA9IDI7XG5cbmZ1bmN0aW9uIENsb25lcyhTcGxpZGUyLCBDb21wb25lbnRzMiwgb3B0aW9ucykge1xuICB2YXIgZXZlbnQgPSBFdmVudEludGVyZmFjZShTcGxpZGUyKTtcbiAgdmFyIG9uID0gZXZlbnQub247XG4gIHZhciBFbGVtZW50cyA9IENvbXBvbmVudHMyLkVsZW1lbnRzLFxuICAgICAgU2xpZGVzID0gQ29tcG9uZW50czIuU2xpZGVzO1xuICB2YXIgcmVzb2x2ZSA9IENvbXBvbmVudHMyLkRpcmVjdGlvbi5yZXNvbHZlO1xuICB2YXIgY2xvbmVzID0gW107XG4gIHZhciBjbG9uZUNvdW50O1xuXG4gIGZ1bmN0aW9uIG1vdW50KCkge1xuICAgIG9uKEVWRU5UX1JFRlJFU0gsIHJlbW91bnQpO1xuICAgIG9uKFtFVkVOVF9VUERBVEVELCBFVkVOVF9SRVNJWkVdLCBvYnNlcnZlKTtcblxuICAgIGlmIChjbG9uZUNvdW50ID0gY29tcHV0ZUNsb25lQ291bnQoKSkge1xuICAgICAgZ2VuZXJhdGUoY2xvbmVDb3VudCk7XG4gICAgICBDb21wb25lbnRzMi5MYXlvdXQucmVzaXplKHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW91bnQoKSB7XG4gICAgZGVzdHJveSgpO1xuICAgIG1vdW50KCk7XG4gIH1cblxuICBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgIHJlbW92ZShjbG9uZXMpO1xuICAgIGVtcHR5KGNsb25lcyk7XG4gICAgZXZlbnQuZGVzdHJveSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gb2JzZXJ2ZSgpIHtcbiAgICB2YXIgY291bnQgPSBjb21wdXRlQ2xvbmVDb3VudCgpO1xuXG4gICAgaWYgKGNsb25lQ291bnQgIT09IGNvdW50KSB7XG4gICAgICBpZiAoY2xvbmVDb3VudCA8IGNvdW50IHx8ICFjb3VudCkge1xuICAgICAgICBldmVudC5lbWl0KEVWRU5UX1JFRlJFU0gpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdlbmVyYXRlKGNvdW50KSB7XG4gICAgdmFyIHNsaWRlcyA9IFNsaWRlcy5nZXQoKS5zbGljZSgpO1xuICAgIHZhciBsZW5ndGggPSBzbGlkZXMubGVuZ3RoO1xuXG4gICAgaWYgKGxlbmd0aCkge1xuICAgICAgd2hpbGUgKHNsaWRlcy5sZW5ndGggPCBjb3VudCkge1xuICAgICAgICBwdXNoKHNsaWRlcywgc2xpZGVzKTtcbiAgICAgIH1cblxuICAgICAgcHVzaChzbGlkZXMuc2xpY2UoLWNvdW50KSwgc2xpZGVzLnNsaWNlKDAsIGNvdW50KSkuZm9yRWFjaChmdW5jdGlvbiAoU2xpZGUsIGluZGV4KSB7XG4gICAgICAgIHZhciBpc0hlYWQgPSBpbmRleCA8IGNvdW50O1xuICAgICAgICB2YXIgY2xvbmUgPSBjbG9uZURlZXAoU2xpZGUuc2xpZGUsIGluZGV4KTtcbiAgICAgICAgaXNIZWFkID8gYmVmb3JlKGNsb25lLCBzbGlkZXNbMF0uc2xpZGUpIDogYXBwZW5kKEVsZW1lbnRzLmxpc3QsIGNsb25lKTtcbiAgICAgICAgcHVzaChjbG9uZXMsIGNsb25lKTtcbiAgICAgICAgU2xpZGVzLnJlZ2lzdGVyKGNsb25lLCBpbmRleCAtIGNvdW50ICsgKGlzSGVhZCA/IDAgOiBsZW5ndGgpLCBTbGlkZS5pbmRleCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjbG9uZURlZXAoZWxtLCBpbmRleCkge1xuICAgIHZhciBjbG9uZSA9IGVsbS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgYWRkQ2xhc3MoY2xvbmUsIG9wdGlvbnMuY2xhc3Nlcy5jbG9uZSk7XG4gICAgY2xvbmUuaWQgPSBTcGxpZGUyLnJvb3QuaWQgKyBcIi1jbG9uZVwiICsgcGFkKGluZGV4ICsgMSk7XG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG5cbiAgZnVuY3Rpb24gY29tcHV0ZUNsb25lQ291bnQoKSB7XG4gICAgdmFyIGNsb25lczIgPSBvcHRpb25zLmNsb25lcztcblxuICAgIGlmICghU3BsaWRlMi5pcyhMT09QKSkge1xuICAgICAgY2xvbmVzMiA9IDA7XG4gICAgfSBlbHNlIGlmIChpc1VuZGVmaW5lZChjbG9uZXMyKSkge1xuICAgICAgdmFyIGZpeGVkU2l6ZSA9IG9wdGlvbnNbcmVzb2x2ZShcImZpeGVkV2lkdGhcIildICYmIENvbXBvbmVudHMyLkxheW91dC5zbGlkZVNpemUoMCk7XG4gICAgICB2YXIgZml4ZWRDb3VudCA9IGZpeGVkU2l6ZSAmJiBjZWlsKHJlY3QoRWxlbWVudHMudHJhY2spW3Jlc29sdmUoXCJ3aWR0aFwiKV0gLyBmaXhlZFNpemUpO1xuICAgICAgY2xvbmVzMiA9IGZpeGVkQ291bnQgfHwgb3B0aW9uc1tyZXNvbHZlKFwiYXV0b1dpZHRoXCIpXSAmJiBTcGxpZGUyLmxlbmd0aCB8fCBvcHRpb25zLnBlclBhZ2UgKiBNVUxUSVBMSUVSO1xuICAgIH1cblxuICAgIHJldHVybiBjbG9uZXMyO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtb3VudDogbW91bnQsXG4gICAgZGVzdHJveTogZGVzdHJveVxuICB9O1xufVxuXG5mdW5jdGlvbiBNb3ZlKFNwbGlkZTIsIENvbXBvbmVudHMyLCBvcHRpb25zKSB7XG4gIHZhciBfRXZlbnRJbnRlcmZhY2U0ID0gRXZlbnRJbnRlcmZhY2UoU3BsaWRlMiksXG4gICAgICBvbiA9IF9FdmVudEludGVyZmFjZTQub24sXG4gICAgICBlbWl0ID0gX0V2ZW50SW50ZXJmYWNlNC5lbWl0O1xuXG4gIHZhciBzZXQgPSBTcGxpZGUyLnN0YXRlLnNldDtcbiAgdmFyIF9Db21wb25lbnRzMiRMYXlvdXQgPSBDb21wb25lbnRzMi5MYXlvdXQsXG4gICAgICBzbGlkZVNpemUgPSBfQ29tcG9uZW50czIkTGF5b3V0LnNsaWRlU2l6ZSxcbiAgICAgIGdldFBhZGRpbmcgPSBfQ29tcG9uZW50czIkTGF5b3V0LmdldFBhZGRpbmcsXG4gICAgICB0b3RhbFNpemUgPSBfQ29tcG9uZW50czIkTGF5b3V0LnRvdGFsU2l6ZSxcbiAgICAgIGxpc3RTaXplID0gX0NvbXBvbmVudHMyJExheW91dC5saXN0U2l6ZSxcbiAgICAgIHNsaWRlclNpemUgPSBfQ29tcG9uZW50czIkTGF5b3V0LnNsaWRlclNpemU7XG4gIHZhciBfQ29tcG9uZW50czIkRGlyZWN0aW8gPSBDb21wb25lbnRzMi5EaXJlY3Rpb24sXG4gICAgICByZXNvbHZlID0gX0NvbXBvbmVudHMyJERpcmVjdGlvLnJlc29sdmUsXG4gICAgICBvcmllbnQgPSBfQ29tcG9uZW50czIkRGlyZWN0aW8ub3JpZW50O1xuICB2YXIgX0NvbXBvbmVudHMyJEVsZW1lbnRzMyA9IENvbXBvbmVudHMyLkVsZW1lbnRzLFxuICAgICAgbGlzdCA9IF9Db21wb25lbnRzMiRFbGVtZW50czMubGlzdCxcbiAgICAgIHRyYWNrID0gX0NvbXBvbmVudHMyJEVsZW1lbnRzMy50cmFjaztcbiAgdmFyIFRyYW5zaXRpb247XG5cbiAgZnVuY3Rpb24gbW91bnQoKSB7XG4gICAgVHJhbnNpdGlvbiA9IENvbXBvbmVudHMyLlRyYW5zaXRpb247XG4gICAgb24oW0VWRU5UX01PVU5URUQsIEVWRU5UX1JFU0laRUQsIEVWRU5UX1VQREFURUQsIEVWRU5UX1JFRlJFU0hdLCByZXBvc2l0aW9uKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlcG9zaXRpb24oKSB7XG4gICAgaWYgKCFDb21wb25lbnRzMi5Db250cm9sbGVyLmlzQnVzeSgpKSB7XG4gICAgICBDb21wb25lbnRzMi5TY3JvbGwuY2FuY2VsKCk7XG4gICAgICBqdW1wKFNwbGlkZTIuaW5kZXgpO1xuICAgICAgQ29tcG9uZW50czIuU2xpZGVzLnVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdmUoZGVzdCwgaW5kZXgsIHByZXYsIGNhbGxiYWNrKSB7XG4gICAgaWYgKGRlc3QgIT09IGluZGV4ICYmIGNhblNoaWZ0KGRlc3QgPiBwcmV2KSkge1xuICAgICAgY2FuY2VsKCk7XG4gICAgICB0cmFuc2xhdGUoc2hpZnQoZ2V0UG9zaXRpb24oKSwgZGVzdCA+IHByZXYpLCB0cnVlKTtcbiAgICB9XG5cbiAgICBzZXQoTU9WSU5HKTtcbiAgICBlbWl0KEVWRU5UX01PVkUsIGluZGV4LCBwcmV2LCBkZXN0KTtcbiAgICBUcmFuc2l0aW9uLnN0YXJ0KGluZGV4LCBmdW5jdGlvbiAoKSB7XG4gICAgICBzZXQoSURMRSk7XG4gICAgICBlbWl0KEVWRU5UX01PVkVELCBpbmRleCwgcHJldiwgZGVzdCk7XG4gICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24ganVtcChpbmRleCkge1xuICAgIHRyYW5zbGF0ZSh0b1Bvc2l0aW9uKGluZGV4LCB0cnVlKSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2xhdGUocG9zaXRpb24sIHByZXZlbnRMb29wKSB7XG4gICAgaWYgKCFTcGxpZGUyLmlzKEZBREUpKSB7XG4gICAgICB2YXIgZGVzdGluYXRpb24gPSBwcmV2ZW50TG9vcCA/IHBvc2l0aW9uIDogbG9vcChwb3NpdGlvbik7XG4gICAgICBzdHlsZShsaXN0LCBcInRyYW5zZm9ybVwiLCBcInRyYW5zbGF0ZVwiICsgcmVzb2x2ZShcIlhcIikgKyBcIihcIiArIGRlc3RpbmF0aW9uICsgXCJweClcIik7XG4gICAgICBwb3NpdGlvbiAhPT0gZGVzdGluYXRpb24gJiYgZW1pdChFVkVOVF9TSElGVEVEKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBsb29wKHBvc2l0aW9uKSB7XG4gICAgaWYgKFNwbGlkZTIuaXMoTE9PUCkpIHtcbiAgICAgIHZhciBpbmRleCA9IHRvSW5kZXgocG9zaXRpb24pO1xuICAgICAgdmFyIGV4Y2VlZGVkTWF4ID0gaW5kZXggPiBDb21wb25lbnRzMi5Db250cm9sbGVyLmdldEVuZCgpO1xuICAgICAgdmFyIGV4Y2VlZGVkTWluID0gaW5kZXggPCAwO1xuXG4gICAgICBpZiAoZXhjZWVkZWRNaW4gfHwgZXhjZWVkZWRNYXgpIHtcbiAgICAgICAgcG9zaXRpb24gPSBzaGlmdChwb3NpdGlvbiwgZXhjZWVkZWRNYXgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwb3NpdGlvbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNoaWZ0KHBvc2l0aW9uLCBiYWNrd2FyZHMpIHtcbiAgICB2YXIgZXhjZXNzID0gcG9zaXRpb24gLSBnZXRMaW1pdChiYWNrd2FyZHMpO1xuICAgIHZhciBzaXplID0gc2xpZGVyU2l6ZSgpO1xuICAgIHBvc2l0aW9uIC09IG9yaWVudChzaXplICogKGNlaWwoYWJzKGV4Y2VzcykgLyBzaXplKSB8fCAxKSkgKiAoYmFja3dhcmRzID8gMSA6IC0xKTtcbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH1cblxuICBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgdHJhbnNsYXRlKGdldFBvc2l0aW9uKCksIHRydWUpO1xuICAgIFRyYW5zaXRpb24uY2FuY2VsKCk7XG4gIH1cblxuICBmdW5jdGlvbiB0b0luZGV4KHBvc2l0aW9uKSB7XG4gICAgdmFyIFNsaWRlcyA9IENvbXBvbmVudHMyLlNsaWRlcy5nZXQoKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBtaW5EaXN0YW5jZSA9IEluZmluaXR5O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBTbGlkZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzbGlkZUluZGV4ID0gU2xpZGVzW2ldLmluZGV4O1xuICAgICAgdmFyIGRpc3RhbmNlID0gYWJzKHRvUG9zaXRpb24oc2xpZGVJbmRleCwgdHJ1ZSkgLSBwb3NpdGlvbik7XG5cbiAgICAgIGlmIChkaXN0YW5jZSA8PSBtaW5EaXN0YW5jZSkge1xuICAgICAgICBtaW5EaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgICBpbmRleCA9IHNsaWRlSW5kZXg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICBmdW5jdGlvbiB0b1Bvc2l0aW9uKGluZGV4LCB0cmltbWluZykge1xuICAgIHZhciBwb3NpdGlvbiA9IG9yaWVudCh0b3RhbFNpemUoaW5kZXggLSAxKSAtIG9mZnNldChpbmRleCkpO1xuICAgIHJldHVybiB0cmltbWluZyA/IHRyaW0ocG9zaXRpb24pIDogcG9zaXRpb247XG4gIH1cblxuICBmdW5jdGlvbiBnZXRQb3NpdGlvbigpIHtcbiAgICB2YXIgbGVmdCA9IHJlc29sdmUoXCJsZWZ0XCIpO1xuICAgIHJldHVybiByZWN0KGxpc3QpW2xlZnRdIC0gcmVjdCh0cmFjaylbbGVmdF0gKyBvcmllbnQoZ2V0UGFkZGluZyhmYWxzZSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJpbShwb3NpdGlvbikge1xuICAgIGlmIChvcHRpb25zLnRyaW1TcGFjZSAmJiBTcGxpZGUyLmlzKFNMSURFKSkge1xuICAgICAgcG9zaXRpb24gPSBjbGFtcChwb3NpdGlvbiwgMCwgb3JpZW50KHNsaWRlclNpemUodHJ1ZSkgLSBsaXN0U2l6ZSgpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9XG5cbiAgZnVuY3Rpb24gb2Zmc2V0KGluZGV4KSB7XG4gICAgdmFyIGZvY3VzID0gb3B0aW9ucy5mb2N1cztcbiAgICByZXR1cm4gZm9jdXMgPT09IFwiY2VudGVyXCIgPyAobGlzdFNpemUoKSAtIHNsaWRlU2l6ZShpbmRleCwgdHJ1ZSkpIC8gMiA6ICtmb2N1cyAqIHNsaWRlU2l6ZShpbmRleCkgfHwgMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldExpbWl0KG1heCkge1xuICAgIHJldHVybiB0b1Bvc2l0aW9uKG1heCA/IENvbXBvbmVudHMyLkNvbnRyb2xsZXIuZ2V0RW5kKCkgOiAwLCAhIW9wdGlvbnMudHJpbVNwYWNlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhblNoaWZ0KGJhY2t3YXJkcykge1xuICAgIHZhciBzaGlmdGVkID0gb3JpZW50KHNoaWZ0KGdldFBvc2l0aW9uKCksIGJhY2t3YXJkcykpO1xuICAgIHJldHVybiBiYWNrd2FyZHMgPyBzaGlmdGVkID49IDAgOiBzaGlmdGVkIDw9IGxpc3RbcmVzb2x2ZShcInNjcm9sbFdpZHRoXCIpXSAtIHJlY3QodHJhY2spW3Jlc29sdmUoXCJ3aWR0aFwiKV07XG4gIH1cblxuICBmdW5jdGlvbiBleGNlZWRlZExpbWl0KG1heCwgcG9zaXRpb24pIHtcbiAgICBwb3NpdGlvbiA9IGlzVW5kZWZpbmVkKHBvc2l0aW9uKSA/IGdldFBvc2l0aW9uKCkgOiBwb3NpdGlvbjtcbiAgICB2YXIgZXhjZWVkZWRNaW4gPSBtYXggIT09IHRydWUgJiYgb3JpZW50KHBvc2l0aW9uKSA8IG9yaWVudChnZXRMaW1pdChmYWxzZSkpO1xuICAgIHZhciBleGNlZWRlZE1heCA9IG1heCAhPT0gZmFsc2UgJiYgb3JpZW50KHBvc2l0aW9uKSA+IG9yaWVudChnZXRMaW1pdCh0cnVlKSk7XG4gICAgcmV0dXJuIGV4Y2VlZGVkTWluIHx8IGV4Y2VlZGVkTWF4O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtb3VudDogbW91bnQsXG4gICAgbW92ZTogbW92ZSxcbiAgICBqdW1wOiBqdW1wLFxuICAgIHRyYW5zbGF0ZTogdHJhbnNsYXRlLFxuICAgIHNoaWZ0OiBzaGlmdCxcbiAgICBjYW5jZWw6IGNhbmNlbCxcbiAgICB0b0luZGV4OiB0b0luZGV4LFxuICAgIHRvUG9zaXRpb246IHRvUG9zaXRpb24sXG4gICAgZ2V0UG9zaXRpb246IGdldFBvc2l0aW9uLFxuICAgIGdldExpbWl0OiBnZXRMaW1pdCxcbiAgICBleGNlZWRlZExpbWl0OiBleGNlZWRlZExpbWl0LFxuICAgIHJlcG9zaXRpb246IHJlcG9zaXRpb25cbiAgfTtcbn1cblxuZnVuY3Rpb24gQ29udHJvbGxlcihTcGxpZGUyLCBDb21wb25lbnRzMiwgb3B0aW9ucykge1xuICB2YXIgX0V2ZW50SW50ZXJmYWNlNSA9IEV2ZW50SW50ZXJmYWNlKFNwbGlkZTIpLFxuICAgICAgb24gPSBfRXZlbnRJbnRlcmZhY2U1Lm9uLFxuICAgICAgZW1pdCA9IF9FdmVudEludGVyZmFjZTUuZW1pdDtcblxuICB2YXIgTW92ZSA9IENvbXBvbmVudHMyLk1vdmU7XG4gIHZhciBnZXRQb3NpdGlvbiA9IE1vdmUuZ2V0UG9zaXRpb24sXG4gICAgICBnZXRMaW1pdCA9IE1vdmUuZ2V0TGltaXQsXG4gICAgICB0b1Bvc2l0aW9uID0gTW92ZS50b1Bvc2l0aW9uO1xuICB2YXIgX0NvbXBvbmVudHMyJFNsaWRlcyA9IENvbXBvbmVudHMyLlNsaWRlcyxcbiAgICAgIGlzRW5vdWdoID0gX0NvbXBvbmVudHMyJFNsaWRlcy5pc0Vub3VnaCxcbiAgICAgIGdldExlbmd0aCA9IF9Db21wb25lbnRzMiRTbGlkZXMuZ2V0TGVuZ3RoO1xuICB2YXIgb21pdEVuZCA9IG9wdGlvbnMub21pdEVuZDtcbiAgdmFyIGlzTG9vcCA9IFNwbGlkZTIuaXMoTE9PUCk7XG4gIHZhciBpc1NsaWRlID0gU3BsaWRlMi5pcyhTTElERSk7XG4gIHZhciBnZXROZXh0ID0gYXBwbHkoZ2V0QWRqYWNlbnQsIGZhbHNlKTtcbiAgdmFyIGdldFByZXYgPSBhcHBseShnZXRBZGphY2VudCwgdHJ1ZSk7XG4gIHZhciBjdXJySW5kZXggPSBvcHRpb25zLnN0YXJ0IHx8IDA7XG4gIHZhciBlbmRJbmRleDtcbiAgdmFyIHByZXZJbmRleCA9IGN1cnJJbmRleDtcbiAgdmFyIHNsaWRlQ291bnQ7XG4gIHZhciBwZXJNb3ZlO1xuICB2YXIgcGVyUGFnZTtcblxuICBmdW5jdGlvbiBtb3VudCgpIHtcbiAgICBpbml0KCk7XG4gICAgb24oW0VWRU5UX1VQREFURUQsIEVWRU5UX1JFRlJFU0gsIEVWRU5UX0VORF9JTkRFWF9DSEFOR0VEXSwgaW5pdCk7XG4gICAgb24oRVZFTlRfUkVTSVpFRCwgb25SZXNpemVkKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgc2xpZGVDb3VudCA9IGdldExlbmd0aCh0cnVlKTtcbiAgICBwZXJNb3ZlID0gb3B0aW9ucy5wZXJNb3ZlO1xuICAgIHBlclBhZ2UgPSBvcHRpb25zLnBlclBhZ2U7XG4gICAgZW5kSW5kZXggPSBnZXRFbmQoKTtcbiAgICB2YXIgaW5kZXggPSBjbGFtcChjdXJySW5kZXgsIDAsIG9taXRFbmQgPyBlbmRJbmRleCA6IHNsaWRlQ291bnQgLSAxKTtcblxuICAgIGlmIChpbmRleCAhPT0gY3VyckluZGV4KSB7XG4gICAgICBjdXJySW5kZXggPSBpbmRleDtcbiAgICAgIE1vdmUucmVwb3NpdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uUmVzaXplZCgpIHtcbiAgICBpZiAoZW5kSW5kZXggIT09IGdldEVuZCgpKSB7XG4gICAgICBlbWl0KEVWRU5UX0VORF9JTkRFWF9DSEFOR0VEKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnbyhjb250cm9sLCBhbGxvd1NhbWVJbmRleCwgY2FsbGJhY2spIHtcbiAgICBpZiAoIWlzQnVzeSgpKSB7XG4gICAgICB2YXIgZGVzdCA9IHBhcnNlKGNvbnRyb2wpO1xuICAgICAgdmFyIGluZGV4ID0gbG9vcChkZXN0KTtcblxuICAgICAgaWYgKGluZGV4ID4gLTEgJiYgKGFsbG93U2FtZUluZGV4IHx8IGluZGV4ICE9PSBjdXJySW5kZXgpKSB7XG4gICAgICAgIHNldEluZGV4KGluZGV4KTtcbiAgICAgICAgTW92ZS5tb3ZlKGRlc3QsIGluZGV4LCBwcmV2SW5kZXgsIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzY3JvbGwoZGVzdGluYXRpb24sIGR1cmF0aW9uLCBzbmFwLCBjYWxsYmFjaykge1xuICAgIENvbXBvbmVudHMyLlNjcm9sbC5zY3JvbGwoZGVzdGluYXRpb24sIGR1cmF0aW9uLCBzbmFwLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgaW5kZXggPSBsb29wKE1vdmUudG9JbmRleChnZXRQb3NpdGlvbigpKSk7XG4gICAgICBzZXRJbmRleChvbWl0RW5kID8gbWluKGluZGV4LCBlbmRJbmRleCkgOiBpbmRleCk7XG4gICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2UoY29udHJvbCkge1xuICAgIHZhciBpbmRleCA9IGN1cnJJbmRleDtcblxuICAgIGlmIChpc1N0cmluZyhjb250cm9sKSkge1xuICAgICAgdmFyIF9yZWYgPSBjb250cm9sLm1hdGNoKC8oWytcXC08Pl0pKFxcZCspPy8pIHx8IFtdLFxuICAgICAgICAgIGluZGljYXRvciA9IF9yZWZbMV0sXG4gICAgICAgICAgbnVtYmVyID0gX3JlZlsyXTtcblxuICAgICAgaWYgKGluZGljYXRvciA9PT0gXCIrXCIgfHwgaW5kaWNhdG9yID09PSBcIi1cIikge1xuICAgICAgICBpbmRleCA9IGNvbXB1dGVEZXN0SW5kZXgoY3VyckluZGV4ICsgKyhcIlwiICsgaW5kaWNhdG9yICsgKCtudW1iZXIgfHwgMSkpLCBjdXJySW5kZXgpO1xuICAgICAgfSBlbHNlIGlmIChpbmRpY2F0b3IgPT09IFwiPlwiKSB7XG4gICAgICAgIGluZGV4ID0gbnVtYmVyID8gdG9JbmRleCgrbnVtYmVyKSA6IGdldE5leHQodHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGluZGljYXRvciA9PT0gXCI8XCIpIHtcbiAgICAgICAgaW5kZXggPSBnZXRQcmV2KHRydWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpbmRleCA9IGlzTG9vcCA/IGNvbnRyb2wgOiBjbGFtcChjb250cm9sLCAwLCBlbmRJbmRleCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0QWRqYWNlbnQocHJldiwgZGVzdGluYXRpb24pIHtcbiAgICB2YXIgbnVtYmVyID0gcGVyTW92ZSB8fCAoaGFzRm9jdXMoKSA/IDEgOiBwZXJQYWdlKTtcbiAgICB2YXIgZGVzdCA9IGNvbXB1dGVEZXN0SW5kZXgoY3VyckluZGV4ICsgbnVtYmVyICogKHByZXYgPyAtMSA6IDEpLCBjdXJySW5kZXgsICEocGVyTW92ZSB8fCBoYXNGb2N1cygpKSk7XG5cbiAgICBpZiAoZGVzdCA9PT0gLTEgJiYgaXNTbGlkZSkge1xuICAgICAgaWYgKCFhcHByb3hpbWF0ZWx5RXF1YWwoZ2V0UG9zaXRpb24oKSwgZ2V0TGltaXQoIXByZXYpLCAxKSkge1xuICAgICAgICByZXR1cm4gcHJldiA/IDAgOiBlbmRJbmRleDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVzdGluYXRpb24gPyBkZXN0IDogbG9vcChkZXN0KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXB1dGVEZXN0SW5kZXgoZGVzdCwgZnJvbSwgc25hcFBhZ2UpIHtcbiAgICBpZiAoaXNFbm91Z2goKSB8fCBoYXNGb2N1cygpKSB7XG4gICAgICB2YXIgaW5kZXggPSBjb21wdXRlTW92YWJsZURlc3RJbmRleChkZXN0KTtcblxuICAgICAgaWYgKGluZGV4ICE9PSBkZXN0KSB7XG4gICAgICAgIGZyb20gPSBkZXN0O1xuICAgICAgICBkZXN0ID0gaW5kZXg7XG4gICAgICAgIHNuYXBQYWdlID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChkZXN0IDwgMCB8fCBkZXN0ID4gZW5kSW5kZXgpIHtcbiAgICAgICAgaWYgKCFwZXJNb3ZlICYmIChiZXR3ZWVuKDAsIGRlc3QsIGZyb20sIHRydWUpIHx8IGJldHdlZW4oZW5kSW5kZXgsIGZyb20sIGRlc3QsIHRydWUpKSkge1xuICAgICAgICAgIGRlc3QgPSB0b0luZGV4KHRvUGFnZShkZXN0KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGlzTG9vcCkge1xuICAgICAgICAgICAgZGVzdCA9IHNuYXBQYWdlID8gZGVzdCA8IDAgPyAtKHNsaWRlQ291bnQgJSBwZXJQYWdlIHx8IHBlclBhZ2UpIDogc2xpZGVDb3VudCA6IGRlc3Q7XG4gICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnJld2luZCkge1xuICAgICAgICAgICAgZGVzdCA9IGRlc3QgPCAwID8gZW5kSW5kZXggOiAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZXN0ID0gLTE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc25hcFBhZ2UgJiYgZGVzdCAhPT0gZnJvbSkge1xuICAgICAgICAgIGRlc3QgPSB0b0luZGV4KHRvUGFnZShmcm9tKSArIChkZXN0IDwgZnJvbSA/IC0xIDogMSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlc3QgPSAtMTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVzdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXB1dGVNb3ZhYmxlRGVzdEluZGV4KGRlc3QpIHtcbiAgICBpZiAoaXNTbGlkZSAmJiBvcHRpb25zLnRyaW1TcGFjZSA9PT0gXCJtb3ZlXCIgJiYgZGVzdCAhPT0gY3VyckluZGV4KSB7XG4gICAgICB2YXIgcG9zaXRpb24gPSBnZXRQb3NpdGlvbigpO1xuXG4gICAgICB3aGlsZSAocG9zaXRpb24gPT09IHRvUG9zaXRpb24oZGVzdCwgdHJ1ZSkgJiYgYmV0d2VlbihkZXN0LCAwLCBTcGxpZGUyLmxlbmd0aCAtIDEsICFvcHRpb25zLnJld2luZCkpIHtcbiAgICAgICAgZGVzdCA8IGN1cnJJbmRleCA/IC0tZGVzdCA6ICsrZGVzdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVzdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvb3AoaW5kZXgpIHtcbiAgICByZXR1cm4gaXNMb29wID8gKGluZGV4ICsgc2xpZGVDb3VudCkgJSBzbGlkZUNvdW50IHx8IDAgOiBpbmRleDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEVuZCgpIHtcbiAgICB2YXIgZW5kID0gc2xpZGVDb3VudCAtIChoYXNGb2N1cygpIHx8IGlzTG9vcCAmJiBwZXJNb3ZlID8gMSA6IHBlclBhZ2UpO1xuXG4gICAgd2hpbGUgKG9taXRFbmQgJiYgZW5kLS0gPiAwKSB7XG4gICAgICBpZiAodG9Qb3NpdGlvbihzbGlkZUNvdW50IC0gMSwgdHJ1ZSkgIT09IHRvUG9zaXRpb24oZW5kLCB0cnVlKSkge1xuICAgICAgICBlbmQrKztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsYW1wKGVuZCwgMCwgc2xpZGVDb3VudCAtIDEpO1xuICB9XG5cbiAgZnVuY3Rpb24gdG9JbmRleChwYWdlKSB7XG4gICAgcmV0dXJuIGNsYW1wKGhhc0ZvY3VzKCkgPyBwYWdlIDogcGVyUGFnZSAqIHBhZ2UsIDAsIGVuZEluZGV4KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvUGFnZShpbmRleCkge1xuICAgIHJldHVybiBoYXNGb2N1cygpID8gbWluKGluZGV4LCBlbmRJbmRleCkgOiBmbG9vcigoaW5kZXggPj0gZW5kSW5kZXggPyBzbGlkZUNvdW50IC0gMSA6IGluZGV4KSAvIHBlclBhZ2UpO1xuICB9XG5cbiAgZnVuY3Rpb24gdG9EZXN0KGRlc3RpbmF0aW9uKSB7XG4gICAgdmFyIGNsb3Nlc3QgPSBNb3ZlLnRvSW5kZXgoZGVzdGluYXRpb24pO1xuICAgIHJldHVybiBpc1NsaWRlID8gY2xhbXAoY2xvc2VzdCwgMCwgZW5kSW5kZXgpIDogY2xvc2VzdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldEluZGV4KGluZGV4KSB7XG4gICAgaWYgKGluZGV4ICE9PSBjdXJySW5kZXgpIHtcbiAgICAgIHByZXZJbmRleCA9IGN1cnJJbmRleDtcbiAgICAgIGN1cnJJbmRleCA9IGluZGV4O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEluZGV4KHByZXYpIHtcbiAgICByZXR1cm4gcHJldiA/IHByZXZJbmRleCA6IGN1cnJJbmRleDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhc0ZvY3VzKCkge1xuICAgIHJldHVybiAhaXNVbmRlZmluZWQob3B0aW9ucy5mb2N1cykgfHwgb3B0aW9ucy5pc05hdmlnYXRpb247XG4gIH1cblxuICBmdW5jdGlvbiBpc0J1c3koKSB7XG4gICAgcmV0dXJuIFNwbGlkZTIuc3RhdGUuaXMoW01PVklORywgU0NST0xMSU5HXSkgJiYgISFvcHRpb25zLndhaXRGb3JUcmFuc2l0aW9uO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtb3VudDogbW91bnQsXG4gICAgZ286IGdvLFxuICAgIHNjcm9sbDogc2Nyb2xsLFxuICAgIGdldE5leHQ6IGdldE5leHQsXG4gICAgZ2V0UHJldjogZ2V0UHJldixcbiAgICBnZXRBZGphY2VudDogZ2V0QWRqYWNlbnQsXG4gICAgZ2V0RW5kOiBnZXRFbmQsXG4gICAgc2V0SW5kZXg6IHNldEluZGV4LFxuICAgIGdldEluZGV4OiBnZXRJbmRleCxcbiAgICB0b0luZGV4OiB0b0luZGV4LFxuICAgIHRvUGFnZTogdG9QYWdlLFxuICAgIHRvRGVzdDogdG9EZXN0LFxuICAgIGhhc0ZvY3VzOiBoYXNGb2N1cyxcbiAgICBpc0J1c3k6IGlzQnVzeVxuICB9O1xufVxuXG52YXIgWE1MX05BTUVfU1BBQ0UgPSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI7XG52YXIgUEFUSCA9IFwibTE1LjUgMC45MzItNC4zIDQuMzggMTQuNSAxNC42LTE0LjUgMTQuNSA0LjMgNC40IDE0LjYtMTQuNiA0LjQtNC4zLTQuNC00LjQtMTQuNi0xNC42elwiO1xudmFyIFNJWkUgPSA0MDtcblxuZnVuY3Rpb24gQXJyb3dzKFNwbGlkZTIsIENvbXBvbmVudHMyLCBvcHRpb25zKSB7XG4gIHZhciBldmVudCA9IEV2ZW50SW50ZXJmYWNlKFNwbGlkZTIpO1xuICB2YXIgb24gPSBldmVudC5vbixcbiAgICAgIGJpbmQgPSBldmVudC5iaW5kLFxuICAgICAgZW1pdCA9IGV2ZW50LmVtaXQ7XG4gIHZhciBjbGFzc2VzID0gb3B0aW9ucy5jbGFzc2VzLFxuICAgICAgaTE4biA9IG9wdGlvbnMuaTE4bjtcbiAgdmFyIEVsZW1lbnRzID0gQ29tcG9uZW50czIuRWxlbWVudHMsXG4gICAgICBDb250cm9sbGVyID0gQ29tcG9uZW50czIuQ29udHJvbGxlcjtcbiAgdmFyIHBsYWNlaG9sZGVyID0gRWxlbWVudHMuYXJyb3dzLFxuICAgICAgdHJhY2sgPSBFbGVtZW50cy50cmFjaztcbiAgdmFyIHdyYXBwZXIgPSBwbGFjZWhvbGRlcjtcbiAgdmFyIHByZXYgPSBFbGVtZW50cy5wcmV2O1xuICB2YXIgbmV4dCA9IEVsZW1lbnRzLm5leHQ7XG4gIHZhciBjcmVhdGVkO1xuICB2YXIgd3JhcHBlckNsYXNzZXM7XG4gIHZhciBhcnJvd3MgPSB7fTtcblxuICBmdW5jdGlvbiBtb3VudCgpIHtcbiAgICBpbml0KCk7XG4gICAgb24oRVZFTlRfVVBEQVRFRCwgcmVtb3VudCk7XG4gIH1cblxuICBmdW5jdGlvbiByZW1vdW50KCkge1xuICAgIGRlc3Ryb3koKTtcbiAgICBtb3VudCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICB2YXIgZW5hYmxlZCA9IG9wdGlvbnMuYXJyb3dzO1xuXG4gICAgaWYgKGVuYWJsZWQgJiYgIShwcmV2ICYmIG5leHQpKSB7XG4gICAgICBjcmVhdGVBcnJvd3MoKTtcbiAgICB9XG5cbiAgICBpZiAocHJldiAmJiBuZXh0KSB7XG4gICAgICBhc3NpZ24oYXJyb3dzLCB7XG4gICAgICAgIHByZXY6IHByZXYsXG4gICAgICAgIG5leHQ6IG5leHRcbiAgICAgIH0pO1xuICAgICAgZGlzcGxheSh3cmFwcGVyLCBlbmFibGVkID8gXCJcIiA6IFwibm9uZVwiKTtcbiAgICAgIGFkZENsYXNzKHdyYXBwZXIsIHdyYXBwZXJDbGFzc2VzID0gQ0xBU1NfQVJST1dTICsgXCItLVwiICsgb3B0aW9ucy5kaXJlY3Rpb24pO1xuXG4gICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICBsaXN0ZW4oKTtcbiAgICAgICAgdXBkYXRlKCk7XG4gICAgICAgIHNldEF0dHJpYnV0ZShbcHJldiwgbmV4dF0sIEFSSUFfQ09OVFJPTFMsIHRyYWNrLmlkKTtcbiAgICAgICAgZW1pdChFVkVOVF9BUlJPV1NfTU9VTlRFRCwgcHJldiwgbmV4dCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICBldmVudC5kZXN0cm95KCk7XG4gICAgcmVtb3ZlQ2xhc3Mod3JhcHBlciwgd3JhcHBlckNsYXNzZXMpO1xuXG4gICAgaWYgKGNyZWF0ZWQpIHtcbiAgICAgIHJlbW92ZShwbGFjZWhvbGRlciA/IFtwcmV2LCBuZXh0XSA6IHdyYXBwZXIpO1xuICAgICAgcHJldiA9IG5leHQgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZW1vdmVBdHRyaWJ1dGUoW3ByZXYsIG5leHRdLCBBTExfQVRUUklCVVRFUyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbGlzdGVuKCkge1xuICAgIG9uKFtFVkVOVF9NT1VOVEVELCBFVkVOVF9NT1ZFRCwgRVZFTlRfUkVGUkVTSCwgRVZFTlRfU0NST0xMRUQsIEVWRU5UX0VORF9JTkRFWF9DSEFOR0VEXSwgdXBkYXRlKTtcbiAgICBiaW5kKG5leHQsIFwiY2xpY2tcIiwgYXBwbHkoZ28sIFwiPlwiKSk7XG4gICAgYmluZChwcmV2LCBcImNsaWNrXCIsIGFwcGx5KGdvLCBcIjxcIikpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ28oY29udHJvbCkge1xuICAgIENvbnRyb2xsZXIuZ28oY29udHJvbCwgdHJ1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVBcnJvd3MoKSB7XG4gICAgd3JhcHBlciA9IHBsYWNlaG9sZGVyIHx8IGNyZWF0ZShcImRpdlwiLCBjbGFzc2VzLmFycm93cyk7XG4gICAgcHJldiA9IGNyZWF0ZUFycm93KHRydWUpO1xuICAgIG5leHQgPSBjcmVhdGVBcnJvdyhmYWxzZSk7XG4gICAgY3JlYXRlZCA9IHRydWU7XG4gICAgYXBwZW5kKHdyYXBwZXIsIFtwcmV2LCBuZXh0XSk7XG4gICAgIXBsYWNlaG9sZGVyICYmIGJlZm9yZSh3cmFwcGVyLCB0cmFjayk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVBcnJvdyhwcmV2Mikge1xuICAgIHZhciBhcnJvdyA9IFwiPGJ1dHRvbiBjbGFzcz1cXFwiXCIgKyBjbGFzc2VzLmFycm93ICsgXCIgXCIgKyAocHJldjIgPyBjbGFzc2VzLnByZXYgOiBjbGFzc2VzLm5leHQpICsgXCJcXFwiIHR5cGU9XFxcImJ1dHRvblxcXCI+PHN2ZyB4bWxucz1cXFwiXCIgKyBYTUxfTkFNRV9TUEFDRSArIFwiXFxcIiB2aWV3Qm94PVxcXCIwIDAgXCIgKyBTSVpFICsgXCIgXCIgKyBTSVpFICsgXCJcXFwiIHdpZHRoPVxcXCJcIiArIFNJWkUgKyBcIlxcXCIgaGVpZ2h0PVxcXCJcIiArIFNJWkUgKyBcIlxcXCIgZm9jdXNhYmxlPVxcXCJmYWxzZVxcXCI+PHBhdGggZD1cXFwiXCIgKyAob3B0aW9ucy5hcnJvd1BhdGggfHwgUEFUSCkgKyBcIlxcXCIgLz5cIjtcbiAgICByZXR1cm4gcGFyc2VIdG1sKGFycm93KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICBpZiAocHJldiAmJiBuZXh0KSB7XG4gICAgICB2YXIgaW5kZXggPSBTcGxpZGUyLmluZGV4O1xuICAgICAgdmFyIHByZXZJbmRleCA9IENvbnRyb2xsZXIuZ2V0UHJldigpO1xuICAgICAgdmFyIG5leHRJbmRleCA9IENvbnRyb2xsZXIuZ2V0TmV4dCgpO1xuICAgICAgdmFyIHByZXZMYWJlbCA9IHByZXZJbmRleCA+IC0xICYmIGluZGV4IDwgcHJldkluZGV4ID8gaTE4bi5sYXN0IDogaTE4bi5wcmV2O1xuICAgICAgdmFyIG5leHRMYWJlbCA9IG5leHRJbmRleCA+IC0xICYmIGluZGV4ID4gbmV4dEluZGV4ID8gaTE4bi5maXJzdCA6IGkxOG4ubmV4dDtcbiAgICAgIHByZXYuZGlzYWJsZWQgPSBwcmV2SW5kZXggPCAwO1xuICAgICAgbmV4dC5kaXNhYmxlZCA9IG5leHRJbmRleCA8IDA7XG4gICAgICBzZXRBdHRyaWJ1dGUocHJldiwgQVJJQV9MQUJFTCwgcHJldkxhYmVsKTtcbiAgICAgIHNldEF0dHJpYnV0ZShuZXh0LCBBUklBX0xBQkVMLCBuZXh0TGFiZWwpO1xuICAgICAgZW1pdChFVkVOVF9BUlJPV1NfVVBEQVRFRCwgcHJldiwgbmV4dCwgcHJldkluZGV4LCBuZXh0SW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYXJyb3dzOiBhcnJvd3MsXG4gICAgbW91bnQ6IG1vdW50LFxuICAgIGRlc3Ryb3k6IGRlc3Ryb3ksXG4gICAgdXBkYXRlOiB1cGRhdGVcbiAgfTtcbn1cblxudmFyIElOVEVSVkFMX0RBVEFfQVRUUklCVVRFID0gREFUQV9BVFRSSUJVVEUgKyBcIi1pbnRlcnZhbFwiO1xuXG5mdW5jdGlvbiBBdXRvcGxheShTcGxpZGUyLCBDb21wb25lbnRzMiwgb3B0aW9ucykge1xuICB2YXIgX0V2ZW50SW50ZXJmYWNlNiA9IEV2ZW50SW50ZXJmYWNlKFNwbGlkZTIpLFxuICAgICAgb24gPSBfRXZlbnRJbnRlcmZhY2U2Lm9uLFxuICAgICAgYmluZCA9IF9FdmVudEludGVyZmFjZTYuYmluZCxcbiAgICAgIGVtaXQgPSBfRXZlbnRJbnRlcmZhY2U2LmVtaXQ7XG5cbiAgdmFyIGludGVydmFsID0gUmVxdWVzdEludGVydmFsKG9wdGlvbnMuaW50ZXJ2YWwsIFNwbGlkZTIuZ28uYmluZChTcGxpZGUyLCBcIj5cIiksIG9uQW5pbWF0aW9uRnJhbWUpO1xuICB2YXIgaXNQYXVzZWQgPSBpbnRlcnZhbC5pc1BhdXNlZDtcbiAgdmFyIEVsZW1lbnRzID0gQ29tcG9uZW50czIuRWxlbWVudHMsXG4gICAgICBfQ29tcG9uZW50czIkRWxlbWVudHM0ID0gQ29tcG9uZW50czIuRWxlbWVudHMsXG4gICAgICByb290ID0gX0NvbXBvbmVudHMyJEVsZW1lbnRzNC5yb290LFxuICAgICAgdG9nZ2xlID0gX0NvbXBvbmVudHMyJEVsZW1lbnRzNC50b2dnbGU7XG4gIHZhciBhdXRvcGxheSA9IG9wdGlvbnMuYXV0b3BsYXk7XG4gIHZhciBob3ZlcmVkO1xuICB2YXIgZm9jdXNlZDtcbiAgdmFyIHN0b3BwZWQgPSBhdXRvcGxheSA9PT0gXCJwYXVzZVwiO1xuXG4gIGZ1bmN0aW9uIG1vdW50KCkge1xuICAgIGlmIChhdXRvcGxheSkge1xuICAgICAgbGlzdGVuKCk7XG4gICAgICB0b2dnbGUgJiYgc2V0QXR0cmlidXRlKHRvZ2dsZSwgQVJJQV9DT05UUk9MUywgRWxlbWVudHMudHJhY2suaWQpO1xuICAgICAgc3RvcHBlZCB8fCBwbGF5KCk7XG4gICAgICB1cGRhdGUoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBsaXN0ZW4oKSB7XG4gICAgaWYgKG9wdGlvbnMucGF1c2VPbkhvdmVyKSB7XG4gICAgICBiaW5kKHJvb3QsIFwibW91c2VlbnRlciBtb3VzZWxlYXZlXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGhvdmVyZWQgPSBlLnR5cGUgPT09IFwibW91c2VlbnRlclwiO1xuICAgICAgICBhdXRvVG9nZ2xlKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5wYXVzZU9uRm9jdXMpIHtcbiAgICAgIGJpbmQocm9vdCwgXCJmb2N1c2luIGZvY3Vzb3V0XCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGZvY3VzZWQgPSBlLnR5cGUgPT09IFwiZm9jdXNpblwiO1xuICAgICAgICBhdXRvVG9nZ2xlKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodG9nZ2xlKSB7XG4gICAgICBiaW5kKHRvZ2dsZSwgXCJjbGlja1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHN0b3BwZWQgPyBwbGF5KCkgOiBwYXVzZSh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uKFtFVkVOVF9NT1ZFLCBFVkVOVF9TQ1JPTEwsIEVWRU5UX1JFRlJFU0hdLCBpbnRlcnZhbC5yZXdpbmQpO1xuICAgIG9uKEVWRU5UX01PVkUsIG9uTW92ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBwbGF5KCkge1xuICAgIGlmIChpc1BhdXNlZCgpICYmIENvbXBvbmVudHMyLlNsaWRlcy5pc0Vub3VnaCgpKSB7XG4gICAgICBpbnRlcnZhbC5zdGFydCghb3B0aW9ucy5yZXNldFByb2dyZXNzKTtcbiAgICAgIGZvY3VzZWQgPSBob3ZlcmVkID0gc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgdXBkYXRlKCk7XG4gICAgICBlbWl0KEVWRU5UX0FVVE9QTEFZX1BMQVkpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBhdXNlKHN0b3ApIHtcbiAgICBpZiAoc3RvcCA9PT0gdm9pZCAwKSB7XG4gICAgICBzdG9wID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBzdG9wcGVkID0gISFzdG9wO1xuICAgIHVwZGF0ZSgpO1xuXG4gICAgaWYgKCFpc1BhdXNlZCgpKSB7XG4gICAgICBpbnRlcnZhbC5wYXVzZSgpO1xuICAgICAgZW1pdChFVkVOVF9BVVRPUExBWV9QQVVTRSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gYXV0b1RvZ2dsZSgpIHtcbiAgICBpZiAoIXN0b3BwZWQpIHtcbiAgICAgIGhvdmVyZWQgfHwgZm9jdXNlZCA/IHBhdXNlKGZhbHNlKSA6IHBsYXkoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGUoKSB7XG4gICAgaWYgKHRvZ2dsZSkge1xuICAgICAgdG9nZ2xlQ2xhc3ModG9nZ2xlLCBDTEFTU19BQ1RJVkUsICFzdG9wcGVkKTtcbiAgICAgIHNldEF0dHJpYnV0ZSh0b2dnbGUsIEFSSUFfTEFCRUwsIG9wdGlvbnMuaTE4bltzdG9wcGVkID8gXCJwbGF5XCIgOiBcInBhdXNlXCJdKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbkFuaW1hdGlvbkZyYW1lKHJhdGUpIHtcbiAgICB2YXIgYmFyID0gRWxlbWVudHMuYmFyO1xuICAgIGJhciAmJiBzdHlsZShiYXIsIFwid2lkdGhcIiwgcmF0ZSAqIDEwMCArIFwiJVwiKTtcbiAgICBlbWl0KEVWRU5UX0FVVE9QTEFZX1BMQVlJTkcsIHJhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25Nb3ZlKGluZGV4KSB7XG4gICAgdmFyIFNsaWRlID0gQ29tcG9uZW50czIuU2xpZGVzLmdldEF0KGluZGV4KTtcbiAgICBpbnRlcnZhbC5zZXQoU2xpZGUgJiYgK2dldEF0dHJpYnV0ZShTbGlkZS5zbGlkZSwgSU5URVJWQUxfREFUQV9BVFRSSUJVVEUpIHx8IG9wdGlvbnMuaW50ZXJ2YWwpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtb3VudDogbW91bnQsXG4gICAgZGVzdHJveTogaW50ZXJ2YWwuY2FuY2VsLFxuICAgIHBsYXk6IHBsYXksXG4gICAgcGF1c2U6IHBhdXNlLFxuICAgIGlzUGF1c2VkOiBpc1BhdXNlZFxuICB9O1xufVxuXG5mdW5jdGlvbiBDb3ZlcihTcGxpZGUyLCBDb21wb25lbnRzMiwgb3B0aW9ucykge1xuICB2YXIgX0V2ZW50SW50ZXJmYWNlNyA9IEV2ZW50SW50ZXJmYWNlKFNwbGlkZTIpLFxuICAgICAgb24gPSBfRXZlbnRJbnRlcmZhY2U3Lm9uO1xuXG4gIGZ1bmN0aW9uIG1vdW50KCkge1xuICAgIGlmIChvcHRpb25zLmNvdmVyKSB7XG4gICAgICBvbihFVkVOVF9MQVpZTE9BRF9MT0FERUQsIGFwcGx5KHRvZ2dsZSwgdHJ1ZSkpO1xuICAgICAgb24oW0VWRU5UX01PVU5URUQsIEVWRU5UX1VQREFURUQsIEVWRU5UX1JFRlJFU0hdLCBhcHBseShjb3ZlciwgdHJ1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNvdmVyKGNvdmVyMikge1xuICAgIENvbXBvbmVudHMyLlNsaWRlcy5mb3JFYWNoKGZ1bmN0aW9uIChTbGlkZSkge1xuICAgICAgdmFyIGltZyA9IGNoaWxkKFNsaWRlLmNvbnRhaW5lciB8fCBTbGlkZS5zbGlkZSwgXCJpbWdcIik7XG5cbiAgICAgIGlmIChpbWcgJiYgaW1nLnNyYykge1xuICAgICAgICB0b2dnbGUoY292ZXIyLCBpbWcsIFNsaWRlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvZ2dsZShjb3ZlcjIsIGltZywgU2xpZGUpIHtcbiAgICBTbGlkZS5zdHlsZShcImJhY2tncm91bmRcIiwgY292ZXIyID8gXCJjZW50ZXIvY292ZXIgbm8tcmVwZWF0IHVybChcXFwiXCIgKyBpbWcuc3JjICsgXCJcXFwiKVwiIDogXCJcIiwgdHJ1ZSk7XG4gICAgZGlzcGxheShpbWcsIGNvdmVyMiA/IFwibm9uZVwiIDogXCJcIik7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1vdW50OiBtb3VudCxcbiAgICBkZXN0cm95OiBhcHBseShjb3ZlciwgZmFsc2UpXG4gIH07XG59XG5cbnZhciBCT1VOQ0VfRElGRl9USFJFU0hPTEQgPSAxMDtcbnZhciBCT1VOQ0VfRFVSQVRJT04gPSA2MDA7XG52YXIgRlJJQ1RJT05fRkFDVE9SID0gMC42O1xudmFyIEJBU0VfVkVMT0NJVFkgPSAxLjU7XG52YXIgTUlOX0RVUkFUSU9OID0gODAwO1xuXG5mdW5jdGlvbiBTY3JvbGwoU3BsaWRlMiwgQ29tcG9uZW50czIsIG9wdGlvbnMpIHtcbiAgdmFyIF9FdmVudEludGVyZmFjZTggPSBFdmVudEludGVyZmFjZShTcGxpZGUyKSxcbiAgICAgIG9uID0gX0V2ZW50SW50ZXJmYWNlOC5vbixcbiAgICAgIGVtaXQgPSBfRXZlbnRJbnRlcmZhY2U4LmVtaXQ7XG5cbiAgdmFyIHNldCA9IFNwbGlkZTIuc3RhdGUuc2V0O1xuICB2YXIgTW92ZSA9IENvbXBvbmVudHMyLk1vdmU7XG4gIHZhciBnZXRQb3NpdGlvbiA9IE1vdmUuZ2V0UG9zaXRpb24sXG4gICAgICBnZXRMaW1pdCA9IE1vdmUuZ2V0TGltaXQsXG4gICAgICBleGNlZWRlZExpbWl0ID0gTW92ZS5leGNlZWRlZExpbWl0LFxuICAgICAgdHJhbnNsYXRlID0gTW92ZS50cmFuc2xhdGU7XG4gIHZhciBpc1NsaWRlID0gU3BsaWRlMi5pcyhTTElERSk7XG4gIHZhciBpbnRlcnZhbDtcbiAgdmFyIGNhbGxiYWNrO1xuICB2YXIgZnJpY3Rpb24gPSAxO1xuXG4gIGZ1bmN0aW9uIG1vdW50KCkge1xuICAgIG9uKEVWRU5UX01PVkUsIGNsZWFyKTtcbiAgICBvbihbRVZFTlRfVVBEQVRFRCwgRVZFTlRfUkVGUkVTSF0sIGNhbmNlbCk7XG4gIH1cblxuICBmdW5jdGlvbiBzY3JvbGwoZGVzdGluYXRpb24sIGR1cmF0aW9uLCBzbmFwLCBvblNjcm9sbGVkLCBub0NvbnN0cmFpbikge1xuICAgIHZhciBmcm9tID0gZ2V0UG9zaXRpb24oKTtcbiAgICBjbGVhcigpO1xuXG4gICAgaWYgKHNuYXAgJiYgKCFpc1NsaWRlIHx8ICFleGNlZWRlZExpbWl0KCkpKSB7XG4gICAgICB2YXIgc2l6ZSA9IENvbXBvbmVudHMyLkxheW91dC5zbGlkZXJTaXplKCk7XG4gICAgICB2YXIgb2Zmc2V0ID0gc2lnbihkZXN0aW5hdGlvbikgKiBzaXplICogZmxvb3IoYWJzKGRlc3RpbmF0aW9uKSAvIHNpemUpIHx8IDA7XG4gICAgICBkZXN0aW5hdGlvbiA9IE1vdmUudG9Qb3NpdGlvbihDb21wb25lbnRzMi5Db250cm9sbGVyLnRvRGVzdChkZXN0aW5hdGlvbiAlIHNpemUpKSArIG9mZnNldDtcbiAgICB9XG5cbiAgICB2YXIgbm9EaXN0YW5jZSA9IGFwcHJveGltYXRlbHlFcXVhbChmcm9tLCBkZXN0aW5hdGlvbiwgMSk7XG4gICAgZnJpY3Rpb24gPSAxO1xuICAgIGR1cmF0aW9uID0gbm9EaXN0YW5jZSA/IDAgOiBkdXJhdGlvbiB8fCBtYXgoYWJzKGRlc3RpbmF0aW9uIC0gZnJvbSkgLyBCQVNFX1ZFTE9DSVRZLCBNSU5fRFVSQVRJT04pO1xuICAgIGNhbGxiYWNrID0gb25TY3JvbGxlZDtcbiAgICBpbnRlcnZhbCA9IFJlcXVlc3RJbnRlcnZhbChkdXJhdGlvbiwgb25FbmQsIGFwcGx5KHVwZGF0ZSwgZnJvbSwgZGVzdGluYXRpb24sIG5vQ29uc3RyYWluKSwgMSk7XG4gICAgc2V0KFNDUk9MTElORyk7XG4gICAgZW1pdChFVkVOVF9TQ1JPTEwpO1xuICAgIGludGVydmFsLnN0YXJ0KCk7XG4gIH1cblxuICBmdW5jdGlvbiBvbkVuZCgpIHtcbiAgICBzZXQoSURMRSk7XG4gICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcbiAgICBlbWl0KEVWRU5UX1NDUk9MTEVEKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZShmcm9tLCB0bywgbm9Db25zdHJhaW4sIHJhdGUpIHtcbiAgICB2YXIgcG9zaXRpb24gPSBnZXRQb3NpdGlvbigpO1xuICAgIHZhciB0YXJnZXQgPSBmcm9tICsgKHRvIC0gZnJvbSkgKiBlYXNpbmcocmF0ZSk7XG4gICAgdmFyIGRpZmYgPSAodGFyZ2V0IC0gcG9zaXRpb24pICogZnJpY3Rpb247XG4gICAgdHJhbnNsYXRlKHBvc2l0aW9uICsgZGlmZik7XG5cbiAgICBpZiAoaXNTbGlkZSAmJiAhbm9Db25zdHJhaW4gJiYgZXhjZWVkZWRMaW1pdCgpKSB7XG4gICAgICBmcmljdGlvbiAqPSBGUklDVElPTl9GQUNUT1I7XG5cbiAgICAgIGlmIChhYnMoZGlmZikgPCBCT1VOQ0VfRElGRl9USFJFU0hPTEQpIHtcbiAgICAgICAgc2Nyb2xsKGdldExpbWl0KGV4Y2VlZGVkTGltaXQodHJ1ZSkpLCBCT1VOQ0VfRFVSQVRJT04sIGZhbHNlLCBjYWxsYmFjaywgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgaWYgKGludGVydmFsKSB7XG4gICAgICBpbnRlcnZhbC5jYW5jZWwoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgaWYgKGludGVydmFsICYmICFpbnRlcnZhbC5pc1BhdXNlZCgpKSB7XG4gICAgICBjbGVhcigpO1xuICAgICAgb25FbmQoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBlYXNpbmcodCkge1xuICAgIHZhciBlYXNpbmdGdW5jID0gb3B0aW9ucy5lYXNpbmdGdW5jO1xuICAgIHJldHVybiBlYXNpbmdGdW5jID8gZWFzaW5nRnVuYyh0KSA6IDEgLSBNYXRoLnBvdygxIC0gdCwgNCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1vdW50OiBtb3VudCxcbiAgICBkZXN0cm95OiBjbGVhcixcbiAgICBzY3JvbGw6IHNjcm9sbCxcbiAgICBjYW5jZWw6IGNhbmNlbFxuICB9O1xufVxuXG52YXIgU0NST0xMX0xJU1RFTkVSX09QVElPTlMgPSB7XG4gIHBhc3NpdmU6IGZhbHNlLFxuICBjYXB0dXJlOiB0cnVlXG59O1xuXG5mdW5jdGlvbiBEcmFnKFNwbGlkZTIsIENvbXBvbmVudHMyLCBvcHRpb25zKSB7XG4gIHZhciBfRXZlbnRJbnRlcmZhY2U5ID0gRXZlbnRJbnRlcmZhY2UoU3BsaWRlMiksXG4gICAgICBvbiA9IF9FdmVudEludGVyZmFjZTkub24sXG4gICAgICBlbWl0ID0gX0V2ZW50SW50ZXJmYWNlOS5lbWl0LFxuICAgICAgYmluZCA9IF9FdmVudEludGVyZmFjZTkuYmluZCxcbiAgICAgIHVuYmluZCA9IF9FdmVudEludGVyZmFjZTkudW5iaW5kO1xuXG4gIHZhciBzdGF0ZSA9IFNwbGlkZTIuc3RhdGU7XG4gIHZhciBNb3ZlID0gQ29tcG9uZW50czIuTW92ZSxcbiAgICAgIFNjcm9sbCA9IENvbXBvbmVudHMyLlNjcm9sbCxcbiAgICAgIENvbnRyb2xsZXIgPSBDb21wb25lbnRzMi5Db250cm9sbGVyLFxuICAgICAgdHJhY2sgPSBDb21wb25lbnRzMi5FbGVtZW50cy50cmFjayxcbiAgICAgIHJlZHVjZSA9IENvbXBvbmVudHMyLk1lZGlhLnJlZHVjZTtcbiAgdmFyIF9Db21wb25lbnRzMiREaXJlY3RpbzIgPSBDb21wb25lbnRzMi5EaXJlY3Rpb24sXG4gICAgICByZXNvbHZlID0gX0NvbXBvbmVudHMyJERpcmVjdGlvMi5yZXNvbHZlLFxuICAgICAgb3JpZW50ID0gX0NvbXBvbmVudHMyJERpcmVjdGlvMi5vcmllbnQ7XG4gIHZhciBnZXRQb3NpdGlvbiA9IE1vdmUuZ2V0UG9zaXRpb24sXG4gICAgICBleGNlZWRlZExpbWl0ID0gTW92ZS5leGNlZWRlZExpbWl0O1xuICB2YXIgYmFzZVBvc2l0aW9uO1xuICB2YXIgYmFzZUV2ZW50O1xuICB2YXIgcHJldkJhc2VFdmVudDtcbiAgdmFyIGlzRnJlZTtcbiAgdmFyIGRyYWdnaW5nO1xuICB2YXIgZXhjZWVkZWQgPSBmYWxzZTtcbiAgdmFyIGNsaWNrUHJldmVudGVkO1xuICB2YXIgZGlzYWJsZWQ7XG4gIHZhciB0YXJnZXQ7XG5cbiAgZnVuY3Rpb24gbW91bnQoKSB7XG4gICAgYmluZCh0cmFjaywgUE9JTlRFUl9NT1ZFX0VWRU5UUywgbm9vcCwgU0NST0xMX0xJU1RFTkVSX09QVElPTlMpO1xuICAgIGJpbmQodHJhY2ssIFBPSU5URVJfVVBfRVZFTlRTLCBub29wLCBTQ1JPTExfTElTVEVORVJfT1BUSU9OUyk7XG4gICAgYmluZCh0cmFjaywgUE9JTlRFUl9ET1dOX0VWRU5UUywgb25Qb2ludGVyRG93biwgU0NST0xMX0xJU1RFTkVSX09QVElPTlMpO1xuICAgIGJpbmQodHJhY2ssIFwiY2xpY2tcIiwgb25DbGljaywge1xuICAgICAgY2FwdHVyZTogdHJ1ZVxuICAgIH0pO1xuICAgIGJpbmQodHJhY2ssIFwiZHJhZ3N0YXJ0XCIsIHByZXZlbnQpO1xuICAgIG9uKFtFVkVOVF9NT1VOVEVELCBFVkVOVF9VUERBVEVEXSwgaW5pdCk7XG4gIH1cblxuICBmdW5jdGlvbiBpbml0KCkge1xuICAgIHZhciBkcmFnID0gb3B0aW9ucy5kcmFnO1xuICAgIGRpc2FibGUoIWRyYWcpO1xuICAgIGlzRnJlZSA9IGRyYWcgPT09IFwiZnJlZVwiO1xuICB9XG5cbiAgZnVuY3Rpb24gb25Qb2ludGVyRG93bihlKSB7XG4gICAgY2xpY2tQcmV2ZW50ZWQgPSBmYWxzZTtcblxuICAgIGlmICghZGlzYWJsZWQpIHtcbiAgICAgIHZhciBpc1RvdWNoID0gaXNUb3VjaEV2ZW50KGUpO1xuXG4gICAgICBpZiAoaXNEcmFnZ2FibGUoZS50YXJnZXQpICYmIChpc1RvdWNoIHx8ICFlLmJ1dHRvbikpIHtcbiAgICAgICAgaWYgKCFDb250cm9sbGVyLmlzQnVzeSgpKSB7XG4gICAgICAgICAgdGFyZ2V0ID0gaXNUb3VjaCA/IHRyYWNrIDogd2luZG93O1xuICAgICAgICAgIGRyYWdnaW5nID0gc3RhdGUuaXMoW01PVklORywgU0NST0xMSU5HXSk7XG4gICAgICAgICAgcHJldkJhc2VFdmVudCA9IG51bGw7XG4gICAgICAgICAgYmluZCh0YXJnZXQsIFBPSU5URVJfTU9WRV9FVkVOVFMsIG9uUG9pbnRlck1vdmUsIFNDUk9MTF9MSVNURU5FUl9PUFRJT05TKTtcbiAgICAgICAgICBiaW5kKHRhcmdldCwgUE9JTlRFUl9VUF9FVkVOVFMsIG9uUG9pbnRlclVwLCBTQ1JPTExfTElTVEVORVJfT1BUSU9OUyk7XG4gICAgICAgICAgTW92ZS5jYW5jZWwoKTtcbiAgICAgICAgICBTY3JvbGwuY2FuY2VsKCk7XG4gICAgICAgICAgc2F2ZShlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2ZW50KGUsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25Qb2ludGVyTW92ZShlKSB7XG4gICAgaWYgKCFzdGF0ZS5pcyhEUkFHR0lORykpIHtcbiAgICAgIHN0YXRlLnNldChEUkFHR0lORyk7XG4gICAgICBlbWl0KEVWRU5UX0RSQUcpO1xuICAgIH1cblxuICAgIGlmIChlLmNhbmNlbGFibGUpIHtcbiAgICAgIGlmIChkcmFnZ2luZykge1xuICAgICAgICBNb3ZlLnRyYW5zbGF0ZShiYXNlUG9zaXRpb24gKyBjb25zdHJhaW4oZGlmZkNvb3JkKGUpKSk7XG4gICAgICAgIHZhciBleHBpcmVkID0gZGlmZlRpbWUoZSkgPiBMT0dfSU5URVJWQUw7XG4gICAgICAgIHZhciBoYXNFeGNlZWRlZCA9IGV4Y2VlZGVkICE9PSAoZXhjZWVkZWQgPSBleGNlZWRlZExpbWl0KCkpO1xuXG4gICAgICAgIGlmIChleHBpcmVkIHx8IGhhc0V4Y2VlZGVkKSB7XG4gICAgICAgICAgc2F2ZShlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNsaWNrUHJldmVudGVkID0gdHJ1ZTtcbiAgICAgICAgZW1pdChFVkVOVF9EUkFHR0lORyk7XG4gICAgICAgIHByZXZlbnQoZSk7XG4gICAgICB9IGVsc2UgaWYgKGlzU2xpZGVyRGlyZWN0aW9uKGUpKSB7XG4gICAgICAgIGRyYWdnaW5nID0gc2hvdWxkU3RhcnQoZSk7XG4gICAgICAgIHByZXZlbnQoZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25Qb2ludGVyVXAoZSkge1xuICAgIGlmIChzdGF0ZS5pcyhEUkFHR0lORykpIHtcbiAgICAgIHN0YXRlLnNldChJRExFKTtcbiAgICAgIGVtaXQoRVZFTlRfRFJBR0dFRCk7XG4gICAgfVxuXG4gICAgaWYgKGRyYWdnaW5nKSB7XG4gICAgICBtb3ZlKGUpO1xuICAgICAgcHJldmVudChlKTtcbiAgICB9XG5cbiAgICB1bmJpbmQodGFyZ2V0LCBQT0lOVEVSX01PVkVfRVZFTlRTLCBvblBvaW50ZXJNb3ZlKTtcbiAgICB1bmJpbmQodGFyZ2V0LCBQT0lOVEVSX1VQX0VWRU5UUywgb25Qb2ludGVyVXApO1xuICAgIGRyYWdnaW5nID0gZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICBpZiAoIWRpc2FibGVkICYmIGNsaWNrUHJldmVudGVkKSB7XG4gICAgICBwcmV2ZW50KGUsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNhdmUoZSkge1xuICAgIHByZXZCYXNlRXZlbnQgPSBiYXNlRXZlbnQ7XG4gICAgYmFzZUV2ZW50ID0gZTtcbiAgICBiYXNlUG9zaXRpb24gPSBnZXRQb3NpdGlvbigpO1xuICB9XG5cbiAgZnVuY3Rpb24gbW92ZShlKSB7XG4gICAgdmFyIHZlbG9jaXR5ID0gY29tcHV0ZVZlbG9jaXR5KGUpO1xuICAgIHZhciBkZXN0aW5hdGlvbiA9IGNvbXB1dGVEZXN0aW5hdGlvbih2ZWxvY2l0eSk7XG4gICAgdmFyIHJld2luZCA9IG9wdGlvbnMucmV3aW5kICYmIG9wdGlvbnMucmV3aW5kQnlEcmFnO1xuICAgIHJlZHVjZShmYWxzZSk7XG5cbiAgICBpZiAoaXNGcmVlKSB7XG4gICAgICBDb250cm9sbGVyLnNjcm9sbChkZXN0aW5hdGlvbiwgMCwgb3B0aW9ucy5zbmFwKTtcbiAgICB9IGVsc2UgaWYgKFNwbGlkZTIuaXMoRkFERSkpIHtcbiAgICAgIENvbnRyb2xsZXIuZ28ob3JpZW50KHNpZ24odmVsb2NpdHkpKSA8IDAgPyByZXdpbmQgPyBcIjxcIiA6IFwiLVwiIDogcmV3aW5kID8gXCI+XCIgOiBcIitcIik7XG4gICAgfSBlbHNlIGlmIChTcGxpZGUyLmlzKFNMSURFKSAmJiBleGNlZWRlZCAmJiByZXdpbmQpIHtcbiAgICAgIENvbnRyb2xsZXIuZ28oZXhjZWVkZWRMaW1pdCh0cnVlKSA/IFwiPlwiIDogXCI8XCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBDb250cm9sbGVyLmdvKENvbnRyb2xsZXIudG9EZXN0KGRlc3RpbmF0aW9uKSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcmVkdWNlKHRydWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvdWxkU3RhcnQoZSkge1xuICAgIHZhciB0aHJlc2hvbGRzID0gb3B0aW9ucy5kcmFnTWluVGhyZXNob2xkO1xuICAgIHZhciBpc09iaiA9IGlzT2JqZWN0KHRocmVzaG9sZHMpO1xuICAgIHZhciBtb3VzZSA9IGlzT2JqICYmIHRocmVzaG9sZHMubW91c2UgfHwgMDtcbiAgICB2YXIgdG91Y2ggPSAoaXNPYmogPyB0aHJlc2hvbGRzLnRvdWNoIDogK3RocmVzaG9sZHMpIHx8IDEwO1xuICAgIHJldHVybiBhYnMoZGlmZkNvb3JkKGUpKSA+IChpc1RvdWNoRXZlbnQoZSkgPyB0b3VjaCA6IG1vdXNlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzU2xpZGVyRGlyZWN0aW9uKGUpIHtcbiAgICByZXR1cm4gYWJzKGRpZmZDb29yZChlKSkgPiBhYnMoZGlmZkNvb3JkKGUsIHRydWUpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXB1dGVWZWxvY2l0eShlKSB7XG4gICAgaWYgKFNwbGlkZTIuaXMoTE9PUCkgfHwgIWV4Y2VlZGVkKSB7XG4gICAgICB2YXIgdGltZSA9IGRpZmZUaW1lKGUpO1xuXG4gICAgICBpZiAodGltZSAmJiB0aW1lIDwgTE9HX0lOVEVSVkFMKSB7XG4gICAgICAgIHJldHVybiBkaWZmQ29vcmQoZSkgLyB0aW1lO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgZnVuY3Rpb24gY29tcHV0ZURlc3RpbmF0aW9uKHZlbG9jaXR5KSB7XG4gICAgcmV0dXJuIGdldFBvc2l0aW9uKCkgKyBzaWduKHZlbG9jaXR5KSAqIG1pbihhYnModmVsb2NpdHkpICogKG9wdGlvbnMuZmxpY2tQb3dlciB8fCA2MDApLCBpc0ZyZWUgPyBJbmZpbml0eSA6IENvbXBvbmVudHMyLkxheW91dC5saXN0U2l6ZSgpICogKG9wdGlvbnMuZmxpY2tNYXhQYWdlcyB8fCAxKSk7XG4gIH1cblxuICBmdW5jdGlvbiBkaWZmQ29vcmQoZSwgb3J0aG9nb25hbCkge1xuICAgIHJldHVybiBjb29yZE9mKGUsIG9ydGhvZ29uYWwpIC0gY29vcmRPZihnZXRCYXNlRXZlbnQoZSksIG9ydGhvZ29uYWwpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGlmZlRpbWUoZSkge1xuICAgIHJldHVybiB0aW1lT2YoZSkgLSB0aW1lT2YoZ2V0QmFzZUV2ZW50KGUpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEJhc2VFdmVudChlKSB7XG4gICAgcmV0dXJuIGJhc2VFdmVudCA9PT0gZSAmJiBwcmV2QmFzZUV2ZW50IHx8IGJhc2VFdmVudDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvb3JkT2YoZSwgb3J0aG9nb25hbCkge1xuICAgIHJldHVybiAoaXNUb3VjaEV2ZW50KGUpID8gZS5jaGFuZ2VkVG91Y2hlc1swXSA6IGUpW1wicGFnZVwiICsgcmVzb2x2ZShvcnRob2dvbmFsID8gXCJZXCIgOiBcIlhcIildO1xuICB9XG5cbiAgZnVuY3Rpb24gY29uc3RyYWluKGRpZmYpIHtcbiAgICByZXR1cm4gZGlmZiAvIChleGNlZWRlZCAmJiBTcGxpZGUyLmlzKFNMSURFKSA/IEZSSUNUSU9OIDogMSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc0RyYWdnYWJsZSh0YXJnZXQyKSB7XG4gICAgdmFyIG5vRHJhZyA9IG9wdGlvbnMubm9EcmFnO1xuICAgIHJldHVybiAhbWF0Y2hlcyh0YXJnZXQyLCBcIi5cIiArIENMQVNTX1BBR0lOQVRJT05fUEFHRSArIFwiLCAuXCIgKyBDTEFTU19BUlJPVykgJiYgKCFub0RyYWcgfHwgIW1hdGNoZXModGFyZ2V0Miwgbm9EcmFnKSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc1RvdWNoRXZlbnQoZSkge1xuICAgIHJldHVybiB0eXBlb2YgVG91Y2hFdmVudCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBlIGluc3RhbmNlb2YgVG91Y2hFdmVudDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzRHJhZ2dpbmcoKSB7XG4gICAgcmV0dXJuIGRyYWdnaW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gZGlzYWJsZSh2YWx1ZSkge1xuICAgIGRpc2FibGVkID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1vdW50OiBtb3VudCxcbiAgICBkaXNhYmxlOiBkaXNhYmxlLFxuICAgIGlzRHJhZ2dpbmc6IGlzRHJhZ2dpbmdcbiAgfTtcbn1cblxudmFyIE5PUk1BTElaQVRJT05fTUFQID0ge1xuICBTcGFjZWJhcjogXCIgXCIsXG4gIFJpZ2h0OiBBUlJPV19SSUdIVCxcbiAgTGVmdDogQVJST1dfTEVGVCxcbiAgVXA6IEFSUk9XX1VQLFxuICBEb3duOiBBUlJPV19ET1dOXG59O1xuXG5mdW5jdGlvbiBub3JtYWxpemVLZXkoa2V5KSB7XG4gIGtleSA9IGlzU3RyaW5nKGtleSkgPyBrZXkgOiBrZXkua2V5O1xuICByZXR1cm4gTk9STUFMSVpBVElPTl9NQVBba2V5XSB8fCBrZXk7XG59XG5cbnZhciBLRVlCT0FSRF9FVkVOVCA9IFwia2V5ZG93blwiO1xuXG5mdW5jdGlvbiBLZXlib2FyZChTcGxpZGUyLCBDb21wb25lbnRzMiwgb3B0aW9ucykge1xuICB2YXIgX0V2ZW50SW50ZXJmYWNlMTAgPSBFdmVudEludGVyZmFjZShTcGxpZGUyKSxcbiAgICAgIG9uID0gX0V2ZW50SW50ZXJmYWNlMTAub24sXG4gICAgICBiaW5kID0gX0V2ZW50SW50ZXJmYWNlMTAuYmluZCxcbiAgICAgIHVuYmluZCA9IF9FdmVudEludGVyZmFjZTEwLnVuYmluZDtcblxuICB2YXIgcm9vdCA9IFNwbGlkZTIucm9vdDtcbiAgdmFyIHJlc29sdmUgPSBDb21wb25lbnRzMi5EaXJlY3Rpb24ucmVzb2x2ZTtcbiAgdmFyIHRhcmdldDtcbiAgdmFyIGRpc2FibGVkO1xuXG4gIGZ1bmN0aW9uIG1vdW50KCkge1xuICAgIGluaXQoKTtcbiAgICBvbihFVkVOVF9VUERBVEVELCBkZXN0cm95KTtcbiAgICBvbihFVkVOVF9VUERBVEVELCBpbml0KTtcbiAgICBvbihFVkVOVF9NT1ZFLCBvbk1vdmUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICB2YXIga2V5Ym9hcmQgPSBvcHRpb25zLmtleWJvYXJkO1xuXG4gICAgaWYgKGtleWJvYXJkKSB7XG4gICAgICB0YXJnZXQgPSBrZXlib2FyZCA9PT0gXCJnbG9iYWxcIiA/IHdpbmRvdyA6IHJvb3Q7XG4gICAgICBiaW5kKHRhcmdldCwgS0VZQk9BUkRfRVZFTlQsIG9uS2V5ZG93bik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICB1bmJpbmQodGFyZ2V0LCBLRVlCT0FSRF9FVkVOVCk7XG4gIH1cblxuICBmdW5jdGlvbiBkaXNhYmxlKHZhbHVlKSB7XG4gICAgZGlzYWJsZWQgPSB2YWx1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uTW92ZSgpIHtcbiAgICB2YXIgX2Rpc2FibGVkID0gZGlzYWJsZWQ7XG4gICAgZGlzYWJsZWQgPSB0cnVlO1xuICAgIG5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgIGRpc2FibGVkID0gX2Rpc2FibGVkO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gb25LZXlkb3duKGUpIHtcbiAgICBpZiAoIWRpc2FibGVkKSB7XG4gICAgICB2YXIga2V5ID0gbm9ybWFsaXplS2V5KGUpO1xuXG4gICAgICBpZiAoa2V5ID09PSByZXNvbHZlKEFSUk9XX0xFRlQpKSB7XG4gICAgICAgIFNwbGlkZTIuZ28oXCI8XCIpO1xuICAgICAgfSBlbHNlIGlmIChrZXkgPT09IHJlc29sdmUoQVJST1dfUklHSFQpKSB7XG4gICAgICAgIFNwbGlkZTIuZ28oXCI+XCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbW91bnQ6IG1vdW50LFxuICAgIGRlc3Ryb3k6IGRlc3Ryb3ksXG4gICAgZGlzYWJsZTogZGlzYWJsZVxuICB9O1xufVxuXG52YXIgU1JDX0RBVEFfQVRUUklCVVRFID0gREFUQV9BVFRSSUJVVEUgKyBcIi1sYXp5XCI7XG52YXIgU1JDU0VUX0RBVEFfQVRUUklCVVRFID0gU1JDX0RBVEFfQVRUUklCVVRFICsgXCItc3Jjc2V0XCI7XG52YXIgSU1BR0VfU0VMRUNUT1IgPSBcIltcIiArIFNSQ19EQVRBX0FUVFJJQlVURSArIFwiXSwgW1wiICsgU1JDU0VUX0RBVEFfQVRUUklCVVRFICsgXCJdXCI7XG5cbmZ1bmN0aW9uIExhenlMb2FkKFNwbGlkZTIsIENvbXBvbmVudHMyLCBvcHRpb25zKSB7XG4gIHZhciBfRXZlbnRJbnRlcmZhY2UxMSA9IEV2ZW50SW50ZXJmYWNlKFNwbGlkZTIpLFxuICAgICAgb24gPSBfRXZlbnRJbnRlcmZhY2UxMS5vbixcbiAgICAgIG9mZiA9IF9FdmVudEludGVyZmFjZTExLm9mZixcbiAgICAgIGJpbmQgPSBfRXZlbnRJbnRlcmZhY2UxMS5iaW5kLFxuICAgICAgZW1pdCA9IF9FdmVudEludGVyZmFjZTExLmVtaXQ7XG5cbiAgdmFyIGlzU2VxdWVudGlhbCA9IG9wdGlvbnMubGF6eUxvYWQgPT09IFwic2VxdWVudGlhbFwiO1xuICB2YXIgZXZlbnRzID0gW0VWRU5UX01PVkVELCBFVkVOVF9TQ1JPTExFRF07XG4gIHZhciBlbnRyaWVzID0gW107XG5cbiAgZnVuY3Rpb24gbW91bnQoKSB7XG4gICAgaWYgKG9wdGlvbnMubGF6eUxvYWQpIHtcbiAgICAgIGluaXQoKTtcbiAgICAgIG9uKEVWRU5UX1JFRlJFU0gsIGluaXQpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgZW1wdHkoZW50cmllcyk7XG4gICAgcmVnaXN0ZXIoKTtcblxuICAgIGlmIChpc1NlcXVlbnRpYWwpIHtcbiAgICAgIGxvYWROZXh0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9mZihldmVudHMpO1xuICAgICAgb24oZXZlbnRzLCBjaGVjayk7XG4gICAgICBjaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlZ2lzdGVyKCkge1xuICAgIENvbXBvbmVudHMyLlNsaWRlcy5mb3JFYWNoKGZ1bmN0aW9uIChTbGlkZSkge1xuICAgICAgcXVlcnlBbGwoU2xpZGUuc2xpZGUsIElNQUdFX1NFTEVDVE9SKS5mb3JFYWNoKGZ1bmN0aW9uIChpbWcpIHtcbiAgICAgICAgdmFyIHNyYyA9IGdldEF0dHJpYnV0ZShpbWcsIFNSQ19EQVRBX0FUVFJJQlVURSk7XG4gICAgICAgIHZhciBzcmNzZXQgPSBnZXRBdHRyaWJ1dGUoaW1nLCBTUkNTRVRfREFUQV9BVFRSSUJVVEUpO1xuXG4gICAgICAgIGlmIChzcmMgIT09IGltZy5zcmMgfHwgc3Jjc2V0ICE9PSBpbWcuc3Jjc2V0KSB7XG4gICAgICAgICAgdmFyIGNsYXNzTmFtZSA9IG9wdGlvbnMuY2xhc3Nlcy5zcGlubmVyO1xuICAgICAgICAgIHZhciBwYXJlbnQgPSBpbWcucGFyZW50RWxlbWVudDtcbiAgICAgICAgICB2YXIgc3Bpbm5lciA9IGNoaWxkKHBhcmVudCwgXCIuXCIgKyBjbGFzc05hbWUpIHx8IGNyZWF0ZShcInNwYW5cIiwgY2xhc3NOYW1lLCBwYXJlbnQpO1xuICAgICAgICAgIGVudHJpZXMucHVzaChbaW1nLCBTbGlkZSwgc3Bpbm5lcl0pO1xuICAgICAgICAgIGltZy5zcmMgfHwgZGlzcGxheShpbWcsIFwibm9uZVwiKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBjaGVjaygpIHtcbiAgICBlbnRyaWVzID0gZW50cmllcy5maWx0ZXIoZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIHZhciBkaXN0YW5jZSA9IG9wdGlvbnMucGVyUGFnZSAqICgob3B0aW9ucy5wcmVsb2FkUGFnZXMgfHwgMSkgKyAxKSAtIDE7XG4gICAgICByZXR1cm4gZGF0YVsxXS5pc1dpdGhpbihTcGxpZGUyLmluZGV4LCBkaXN0YW5jZSkgPyBsb2FkKGRhdGEpIDogdHJ1ZTtcbiAgICB9KTtcbiAgICBlbnRyaWVzLmxlbmd0aCB8fCBvZmYoZXZlbnRzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvYWQoZGF0YSkge1xuICAgIHZhciBpbWcgPSBkYXRhWzBdO1xuICAgIGFkZENsYXNzKGRhdGFbMV0uc2xpZGUsIENMQVNTX0xPQURJTkcpO1xuICAgIGJpbmQoaW1nLCBcImxvYWQgZXJyb3JcIiwgYXBwbHkob25Mb2FkLCBkYXRhKSk7XG4gICAgc2V0QXR0cmlidXRlKGltZywgXCJzcmNcIiwgZ2V0QXR0cmlidXRlKGltZywgU1JDX0RBVEFfQVRUUklCVVRFKSk7XG4gICAgc2V0QXR0cmlidXRlKGltZywgXCJzcmNzZXRcIiwgZ2V0QXR0cmlidXRlKGltZywgU1JDU0VUX0RBVEFfQVRUUklCVVRFKSk7XG4gICAgcmVtb3ZlQXR0cmlidXRlKGltZywgU1JDX0RBVEFfQVRUUklCVVRFKTtcbiAgICByZW1vdmVBdHRyaWJ1dGUoaW1nLCBTUkNTRVRfREFUQV9BVFRSSUJVVEUpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25Mb2FkKGRhdGEsIGUpIHtcbiAgICB2YXIgaW1nID0gZGF0YVswXSxcbiAgICAgICAgU2xpZGUgPSBkYXRhWzFdO1xuICAgIHJlbW92ZUNsYXNzKFNsaWRlLnNsaWRlLCBDTEFTU19MT0FESU5HKTtcblxuICAgIGlmIChlLnR5cGUgIT09IFwiZXJyb3JcIikge1xuICAgICAgcmVtb3ZlKGRhdGFbMl0pO1xuICAgICAgZGlzcGxheShpbWcsIFwiXCIpO1xuICAgICAgZW1pdChFVkVOVF9MQVpZTE9BRF9MT0FERUQsIGltZywgU2xpZGUpO1xuICAgICAgZW1pdChFVkVOVF9SRVNJWkUpO1xuICAgIH1cblxuICAgIGlzU2VxdWVudGlhbCAmJiBsb2FkTmV4dCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gbG9hZE5leHQoKSB7XG4gICAgZW50cmllcy5sZW5ndGggJiYgbG9hZChlbnRyaWVzLnNoaWZ0KCkpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtb3VudDogbW91bnQsXG4gICAgZGVzdHJveTogYXBwbHkoZW1wdHksIGVudHJpZXMpLFxuICAgIGNoZWNrOiBjaGVja1xuICB9O1xufVxuXG5mdW5jdGlvbiBQYWdpbmF0aW9uKFNwbGlkZTIsIENvbXBvbmVudHMyLCBvcHRpb25zKSB7XG4gIHZhciBldmVudCA9IEV2ZW50SW50ZXJmYWNlKFNwbGlkZTIpO1xuICB2YXIgb24gPSBldmVudC5vbixcbiAgICAgIGVtaXQgPSBldmVudC5lbWl0LFxuICAgICAgYmluZCA9IGV2ZW50LmJpbmQ7XG4gIHZhciBTbGlkZXMgPSBDb21wb25lbnRzMi5TbGlkZXMsXG4gICAgICBFbGVtZW50cyA9IENvbXBvbmVudHMyLkVsZW1lbnRzLFxuICAgICAgQ29udHJvbGxlciA9IENvbXBvbmVudHMyLkNvbnRyb2xsZXI7XG4gIHZhciBoYXNGb2N1cyA9IENvbnRyb2xsZXIuaGFzRm9jdXMsXG4gICAgICBnZXRJbmRleCA9IENvbnRyb2xsZXIuZ2V0SW5kZXgsXG4gICAgICBnbyA9IENvbnRyb2xsZXIuZ287XG4gIHZhciByZXNvbHZlID0gQ29tcG9uZW50czIuRGlyZWN0aW9uLnJlc29sdmU7XG4gIHZhciBwbGFjZWhvbGRlciA9IEVsZW1lbnRzLnBhZ2luYXRpb247XG4gIHZhciBpdGVtcyA9IFtdO1xuICB2YXIgbGlzdDtcbiAgdmFyIHBhZ2luYXRpb25DbGFzc2VzO1xuXG4gIGZ1bmN0aW9uIG1vdW50KCkge1xuICAgIGRlc3Ryb3koKTtcbiAgICBvbihbRVZFTlRfVVBEQVRFRCwgRVZFTlRfUkVGUkVTSCwgRVZFTlRfRU5EX0lOREVYX0NIQU5HRURdLCBtb3VudCk7XG4gICAgdmFyIGVuYWJsZWQgPSBvcHRpb25zLnBhZ2luYXRpb247XG4gICAgcGxhY2Vob2xkZXIgJiYgZGlzcGxheShwbGFjZWhvbGRlciwgZW5hYmxlZCA/IFwiXCIgOiBcIm5vbmVcIik7XG5cbiAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgb24oW0VWRU5UX01PVkUsIEVWRU5UX1NDUk9MTCwgRVZFTlRfU0NST0xMRURdLCB1cGRhdGUpO1xuICAgICAgY3JlYXRlUGFnaW5hdGlvbigpO1xuICAgICAgdXBkYXRlKCk7XG4gICAgICBlbWl0KEVWRU5UX1BBR0lOQVRJT05fTU9VTlRFRCwge1xuICAgICAgICBsaXN0OiBsaXN0LFxuICAgICAgICBpdGVtczogaXRlbXNcbiAgICAgIH0sIGdldEF0KFNwbGlkZTIuaW5kZXgpKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgIGlmIChsaXN0KSB7XG4gICAgICByZW1vdmUocGxhY2Vob2xkZXIgPyBzbGljZShsaXN0LmNoaWxkcmVuKSA6IGxpc3QpO1xuICAgICAgcmVtb3ZlQ2xhc3MobGlzdCwgcGFnaW5hdGlvbkNsYXNzZXMpO1xuICAgICAgZW1wdHkoaXRlbXMpO1xuICAgICAgbGlzdCA9IG51bGw7XG4gICAgfVxuXG4gICAgZXZlbnQuZGVzdHJveSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUGFnaW5hdGlvbigpIHtcbiAgICB2YXIgbGVuZ3RoID0gU3BsaWRlMi5sZW5ndGg7XG4gICAgdmFyIGNsYXNzZXMgPSBvcHRpb25zLmNsYXNzZXMsXG4gICAgICAgIGkxOG4gPSBvcHRpb25zLmkxOG4sXG4gICAgICAgIHBlclBhZ2UgPSBvcHRpb25zLnBlclBhZ2U7XG4gICAgdmFyIG1heCA9IGhhc0ZvY3VzKCkgPyBDb250cm9sbGVyLmdldEVuZCgpICsgMSA6IGNlaWwobGVuZ3RoIC8gcGVyUGFnZSk7XG4gICAgbGlzdCA9IHBsYWNlaG9sZGVyIHx8IGNyZWF0ZShcInVsXCIsIGNsYXNzZXMucGFnaW5hdGlvbiwgRWxlbWVudHMudHJhY2sucGFyZW50RWxlbWVudCk7XG4gICAgYWRkQ2xhc3MobGlzdCwgcGFnaW5hdGlvbkNsYXNzZXMgPSBDTEFTU19QQUdJTkFUSU9OICsgXCItLVwiICsgZ2V0RGlyZWN0aW9uKCkpO1xuICAgIHNldEF0dHJpYnV0ZShsaXN0LCBST0xFLCBcInRhYmxpc3RcIik7XG4gICAgc2V0QXR0cmlidXRlKGxpc3QsIEFSSUFfTEFCRUwsIGkxOG4uc2VsZWN0KTtcbiAgICBzZXRBdHRyaWJ1dGUobGlzdCwgQVJJQV9PUklFTlRBVElPTiwgZ2V0RGlyZWN0aW9uKCkgPT09IFRUQiA/IFwidmVydGljYWxcIiA6IFwiXCIpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXg7IGkrKykge1xuICAgICAgdmFyIGxpID0gY3JlYXRlKFwibGlcIiwgbnVsbCwgbGlzdCk7XG4gICAgICB2YXIgYnV0dG9uID0gY3JlYXRlKFwiYnV0dG9uXCIsIHtcbiAgICAgICAgY2xhc3M6IGNsYXNzZXMucGFnZSxcbiAgICAgICAgdHlwZTogXCJidXR0b25cIlxuICAgICAgfSwgbGkpO1xuICAgICAgdmFyIGNvbnRyb2xzID0gU2xpZGVzLmdldEluKGkpLm1hcChmdW5jdGlvbiAoU2xpZGUpIHtcbiAgICAgICAgcmV0dXJuIFNsaWRlLnNsaWRlLmlkO1xuICAgICAgfSk7XG4gICAgICB2YXIgdGV4dCA9ICFoYXNGb2N1cygpICYmIHBlclBhZ2UgPiAxID8gaTE4bi5wYWdlWCA6IGkxOG4uc2xpZGVYO1xuICAgICAgYmluZChidXR0b24sIFwiY2xpY2tcIiwgYXBwbHkob25DbGljaywgaSkpO1xuXG4gICAgICBpZiAob3B0aW9ucy5wYWdpbmF0aW9uS2V5Ym9hcmQpIHtcbiAgICAgICAgYmluZChidXR0b24sIFwia2V5ZG93blwiLCBhcHBseShvbktleWRvd24sIGkpKTtcbiAgICAgIH1cblxuICAgICAgc2V0QXR0cmlidXRlKGxpLCBST0xFLCBcInByZXNlbnRhdGlvblwiKTtcbiAgICAgIHNldEF0dHJpYnV0ZShidXR0b24sIFJPTEUsIFwidGFiXCIpO1xuICAgICAgc2V0QXR0cmlidXRlKGJ1dHRvbiwgQVJJQV9DT05UUk9MUywgY29udHJvbHMuam9pbihcIiBcIikpO1xuICAgICAgc2V0QXR0cmlidXRlKGJ1dHRvbiwgQVJJQV9MQUJFTCwgZm9ybWF0KHRleHQsIGkgKyAxKSk7XG4gICAgICBzZXRBdHRyaWJ1dGUoYnV0dG9uLCBUQUJfSU5ERVgsIC0xKTtcbiAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICBsaTogbGksXG4gICAgICAgIGJ1dHRvbjogYnV0dG9uLFxuICAgICAgICBwYWdlOiBpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbkNsaWNrKHBhZ2UpIHtcbiAgICBnbyhcIj5cIiArIHBhZ2UsIHRydWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25LZXlkb3duKHBhZ2UsIGUpIHtcbiAgICB2YXIgbGVuZ3RoID0gaXRlbXMubGVuZ3RoO1xuICAgIHZhciBrZXkgPSBub3JtYWxpemVLZXkoZSk7XG4gICAgdmFyIGRpciA9IGdldERpcmVjdGlvbigpO1xuICAgIHZhciBuZXh0UGFnZSA9IC0xO1xuXG4gICAgaWYgKGtleSA9PT0gcmVzb2x2ZShBUlJPV19SSUdIVCwgZmFsc2UsIGRpcikpIHtcbiAgICAgIG5leHRQYWdlID0gKytwYWdlICUgbGVuZ3RoO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSByZXNvbHZlKEFSUk9XX0xFRlQsIGZhbHNlLCBkaXIpKSB7XG4gICAgICBuZXh0UGFnZSA9ICgtLXBhZ2UgKyBsZW5ndGgpICUgbGVuZ3RoO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcIkhvbWVcIikge1xuICAgICAgbmV4dFBhZ2UgPSAwO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcIkVuZFwiKSB7XG4gICAgICBuZXh0UGFnZSA9IGxlbmd0aCAtIDE7XG4gICAgfVxuXG4gICAgdmFyIGl0ZW0gPSBpdGVtc1tuZXh0UGFnZV07XG5cbiAgICBpZiAoaXRlbSkge1xuICAgICAgZm9jdXMoaXRlbS5idXR0b24pO1xuICAgICAgZ28oXCI+XCIgKyBuZXh0UGFnZSk7XG4gICAgICBwcmV2ZW50KGUsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldERpcmVjdGlvbigpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5wYWdpbmF0aW9uRGlyZWN0aW9uIHx8IG9wdGlvbnMuZGlyZWN0aW9uO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0QXQoaW5kZXgpIHtcbiAgICByZXR1cm4gaXRlbXNbQ29udHJvbGxlci50b1BhZ2UoaW5kZXgpXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICB2YXIgcHJldiA9IGdldEF0KGdldEluZGV4KHRydWUpKTtcbiAgICB2YXIgY3VyciA9IGdldEF0KGdldEluZGV4KCkpO1xuXG4gICAgaWYgKHByZXYpIHtcbiAgICAgIHZhciBidXR0b24gPSBwcmV2LmJ1dHRvbjtcbiAgICAgIHJlbW92ZUNsYXNzKGJ1dHRvbiwgQ0xBU1NfQUNUSVZFKTtcbiAgICAgIHJlbW92ZUF0dHJpYnV0ZShidXR0b24sIEFSSUFfU0VMRUNURUQpO1xuICAgICAgc2V0QXR0cmlidXRlKGJ1dHRvbiwgVEFCX0lOREVYLCAtMSk7XG4gICAgfVxuXG4gICAgaWYgKGN1cnIpIHtcbiAgICAgIHZhciBfYnV0dG9uID0gY3Vyci5idXR0b247XG4gICAgICBhZGRDbGFzcyhfYnV0dG9uLCBDTEFTU19BQ1RJVkUpO1xuICAgICAgc2V0QXR0cmlidXRlKF9idXR0b24sIEFSSUFfU0VMRUNURUQsIHRydWUpO1xuICAgICAgc2V0QXR0cmlidXRlKF9idXR0b24sIFRBQl9JTkRFWCwgXCJcIik7XG4gICAgfVxuXG4gICAgZW1pdChFVkVOVF9QQUdJTkFUSU9OX1VQREFURUQsIHtcbiAgICAgIGxpc3Q6IGxpc3QsXG4gICAgICBpdGVtczogaXRlbXNcbiAgICB9LCBwcmV2LCBjdXJyKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaXRlbXM6IGl0ZW1zLFxuICAgIG1vdW50OiBtb3VudCxcbiAgICBkZXN0cm95OiBkZXN0cm95LFxuICAgIGdldEF0OiBnZXRBdCxcbiAgICB1cGRhdGU6IHVwZGF0ZVxuICB9O1xufVxuXG52YXIgVFJJR0dFUl9LRVlTID0gW1wiIFwiLCBcIkVudGVyXCJdO1xuXG5mdW5jdGlvbiBTeW5jKFNwbGlkZTIsIENvbXBvbmVudHMyLCBvcHRpb25zKSB7XG4gIHZhciBpc05hdmlnYXRpb24gPSBvcHRpb25zLmlzTmF2aWdhdGlvbixcbiAgICAgIHNsaWRlRm9jdXMgPSBvcHRpb25zLnNsaWRlRm9jdXM7XG4gIHZhciBldmVudHMgPSBbXTtcblxuICBmdW5jdGlvbiBtb3VudCgpIHtcbiAgICBTcGxpZGUyLnNwbGlkZXMuZm9yRWFjaChmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICBpZiAoIXRhcmdldC5pc1BhcmVudCkge1xuICAgICAgICBzeW5jKFNwbGlkZTIsIHRhcmdldC5zcGxpZGUpO1xuICAgICAgICBzeW5jKHRhcmdldC5zcGxpZGUsIFNwbGlkZTIpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGlzTmF2aWdhdGlvbikge1xuICAgICAgbmF2aWdhdGUoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgIGV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgZXZlbnQuZGVzdHJveSgpO1xuICAgIH0pO1xuICAgIGVtcHR5KGV2ZW50cyk7XG4gIH1cblxuICBmdW5jdGlvbiByZW1vdW50KCkge1xuICAgIGRlc3Ryb3koKTtcbiAgICBtb3VudCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gc3luYyhzcGxpZGUsIHRhcmdldCkge1xuICAgIHZhciBldmVudCA9IEV2ZW50SW50ZXJmYWNlKHNwbGlkZSk7XG4gICAgZXZlbnQub24oRVZFTlRfTU9WRSwgZnVuY3Rpb24gKGluZGV4LCBwcmV2LCBkZXN0KSB7XG4gICAgICB0YXJnZXQuZ28odGFyZ2V0LmlzKExPT1ApID8gZGVzdCA6IGluZGV4KTtcbiAgICB9KTtcbiAgICBldmVudHMucHVzaChldmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiBuYXZpZ2F0ZSgpIHtcbiAgICB2YXIgZXZlbnQgPSBFdmVudEludGVyZmFjZShTcGxpZGUyKTtcbiAgICB2YXIgb24gPSBldmVudC5vbjtcbiAgICBvbihFVkVOVF9DTElDSywgb25DbGljayk7XG4gICAgb24oRVZFTlRfU0xJREVfS0VZRE9XTiwgb25LZXlkb3duKTtcbiAgICBvbihbRVZFTlRfTU9VTlRFRCwgRVZFTlRfVVBEQVRFRF0sIHVwZGF0ZSk7XG4gICAgZXZlbnRzLnB1c2goZXZlbnQpO1xuICAgIGV2ZW50LmVtaXQoRVZFTlRfTkFWSUdBVElPTl9NT1VOVEVELCBTcGxpZGUyLnNwbGlkZXMpO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgIHNldEF0dHJpYnV0ZShDb21wb25lbnRzMi5FbGVtZW50cy5saXN0LCBBUklBX09SSUVOVEFUSU9OLCBvcHRpb25zLmRpcmVjdGlvbiA9PT0gVFRCID8gXCJ2ZXJ0aWNhbFwiIDogXCJcIik7XG4gIH1cblxuICBmdW5jdGlvbiBvbkNsaWNrKFNsaWRlKSB7XG4gICAgU3BsaWRlMi5nbyhTbGlkZS5pbmRleCk7XG4gIH1cblxuICBmdW5jdGlvbiBvbktleWRvd24oU2xpZGUsIGUpIHtcbiAgICBpZiAoaW5jbHVkZXMoVFJJR0dFUl9LRVlTLCBub3JtYWxpemVLZXkoZSkpKSB7XG4gICAgICBvbkNsaWNrKFNsaWRlKTtcbiAgICAgIHByZXZlbnQoZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzZXR1cDogYXBwbHkoQ29tcG9uZW50czIuTWVkaWEuc2V0LCB7XG4gICAgICBzbGlkZUZvY3VzOiBpc1VuZGVmaW5lZChzbGlkZUZvY3VzKSA/IGlzTmF2aWdhdGlvbiA6IHNsaWRlRm9jdXNcbiAgICB9LCB0cnVlKSxcbiAgICBtb3VudDogbW91bnQsXG4gICAgZGVzdHJveTogZGVzdHJveSxcbiAgICByZW1vdW50OiByZW1vdW50XG4gIH07XG59XG5cbmZ1bmN0aW9uIFdoZWVsKFNwbGlkZTIsIENvbXBvbmVudHMyLCBvcHRpb25zKSB7XG4gIHZhciBfRXZlbnRJbnRlcmZhY2UxMiA9IEV2ZW50SW50ZXJmYWNlKFNwbGlkZTIpLFxuICAgICAgYmluZCA9IF9FdmVudEludGVyZmFjZTEyLmJpbmQ7XG5cbiAgdmFyIGxhc3RUaW1lID0gMDtcblxuICBmdW5jdGlvbiBtb3VudCgpIHtcbiAgICBpZiAob3B0aW9ucy53aGVlbCkge1xuICAgICAgYmluZChDb21wb25lbnRzMi5FbGVtZW50cy50cmFjaywgXCJ3aGVlbFwiLCBvbldoZWVsLCBTQ1JPTExfTElTVEVORVJfT1BUSU9OUyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25XaGVlbChlKSB7XG4gICAgaWYgKGUuY2FuY2VsYWJsZSkge1xuICAgICAgdmFyIGRlbHRhWSA9IGUuZGVsdGFZO1xuICAgICAgdmFyIGJhY2t3YXJkcyA9IGRlbHRhWSA8IDA7XG4gICAgICB2YXIgdGltZVN0YW1wID0gdGltZU9mKGUpO1xuXG4gICAgICB2YXIgX21pbiA9IG9wdGlvbnMud2hlZWxNaW5UaHJlc2hvbGQgfHwgMDtcblxuICAgICAgdmFyIHNsZWVwID0gb3B0aW9ucy53aGVlbFNsZWVwIHx8IDA7XG5cbiAgICAgIGlmIChhYnMoZGVsdGFZKSA+IF9taW4gJiYgdGltZVN0YW1wIC0gbGFzdFRpbWUgPiBzbGVlcCkge1xuICAgICAgICBTcGxpZGUyLmdvKGJhY2t3YXJkcyA/IFwiPFwiIDogXCI+XCIpO1xuICAgICAgICBsYXN0VGltZSA9IHRpbWVTdGFtcDtcbiAgICAgIH1cblxuICAgICAgc2hvdWxkUHJldmVudChiYWNrd2FyZHMpICYmIHByZXZlbnQoZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2hvdWxkUHJldmVudChiYWNrd2FyZHMpIHtcbiAgICByZXR1cm4gIW9wdGlvbnMucmVsZWFzZVdoZWVsIHx8IFNwbGlkZTIuc3RhdGUuaXMoTU9WSU5HKSB8fCBDb21wb25lbnRzMi5Db250cm9sbGVyLmdldEFkamFjZW50KGJhY2t3YXJkcykgIT09IC0xO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtb3VudDogbW91bnRcbiAgfTtcbn1cblxudmFyIFNSX1JFTU9WQUxfREVMQVkgPSA5MDtcblxuZnVuY3Rpb24gTGl2ZShTcGxpZGUyLCBDb21wb25lbnRzMiwgb3B0aW9ucykge1xuICB2YXIgX0V2ZW50SW50ZXJmYWNlMTMgPSBFdmVudEludGVyZmFjZShTcGxpZGUyKSxcbiAgICAgIG9uID0gX0V2ZW50SW50ZXJmYWNlMTMub247XG5cbiAgdmFyIHRyYWNrID0gQ29tcG9uZW50czIuRWxlbWVudHMudHJhY2s7XG4gIHZhciBlbmFibGVkID0gb3B0aW9ucy5saXZlICYmICFvcHRpb25zLmlzTmF2aWdhdGlvbjtcbiAgdmFyIHNyID0gY3JlYXRlKFwic3BhblwiLCBDTEFTU19TUik7XG4gIHZhciBpbnRlcnZhbCA9IFJlcXVlc3RJbnRlcnZhbChTUl9SRU1PVkFMX0RFTEFZLCBhcHBseSh0b2dnbGUsIGZhbHNlKSk7XG5cbiAgZnVuY3Rpb24gbW91bnQoKSB7XG4gICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgIGRpc2FibGUoIUNvbXBvbmVudHMyLkF1dG9wbGF5LmlzUGF1c2VkKCkpO1xuICAgICAgc2V0QXR0cmlidXRlKHRyYWNrLCBBUklBX0FUT01JQywgdHJ1ZSk7XG4gICAgICBzci50ZXh0Q29udGVudCA9IFwiXFx1MjAyNlwiO1xuICAgICAgb24oRVZFTlRfQVVUT1BMQVlfUExBWSwgYXBwbHkoZGlzYWJsZSwgdHJ1ZSkpO1xuICAgICAgb24oRVZFTlRfQVVUT1BMQVlfUEFVU0UsIGFwcGx5KGRpc2FibGUsIGZhbHNlKSk7XG4gICAgICBvbihbRVZFTlRfTU9WRUQsIEVWRU5UX1NDUk9MTEVEXSwgYXBwbHkodG9nZ2xlLCB0cnVlKSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdG9nZ2xlKGFjdGl2ZSkge1xuICAgIHNldEF0dHJpYnV0ZSh0cmFjaywgQVJJQV9CVVNZLCBhY3RpdmUpO1xuXG4gICAgaWYgKGFjdGl2ZSkge1xuICAgICAgYXBwZW5kKHRyYWNrLCBzcik7XG4gICAgICBpbnRlcnZhbC5zdGFydCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZW1vdmUoc3IpO1xuICAgICAgaW50ZXJ2YWwuY2FuY2VsKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICByZW1vdmVBdHRyaWJ1dGUodHJhY2ssIFtBUklBX0xJVkUsIEFSSUFfQVRPTUlDLCBBUklBX0JVU1ldKTtcbiAgICByZW1vdmUoc3IpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGlzYWJsZShkaXNhYmxlZCkge1xuICAgIGlmIChlbmFibGVkKSB7XG4gICAgICBzZXRBdHRyaWJ1dGUodHJhY2ssIEFSSUFfTElWRSwgZGlzYWJsZWQgPyBcIm9mZlwiIDogXCJwb2xpdGVcIik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtb3VudDogbW91bnQsXG4gICAgZGlzYWJsZTogZGlzYWJsZSxcbiAgICBkZXN0cm95OiBkZXN0cm95XG4gIH07XG59XG5cbnZhciBDb21wb25lbnRDb25zdHJ1Y3RvcnMgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgTWVkaWE6IE1lZGlhLFxuICBEaXJlY3Rpb246IERpcmVjdGlvbixcbiAgRWxlbWVudHM6IEVsZW1lbnRzLFxuICBTbGlkZXM6IFNsaWRlcyxcbiAgTGF5b3V0OiBMYXlvdXQsXG4gIENsb25lczogQ2xvbmVzLFxuICBNb3ZlOiBNb3ZlLFxuICBDb250cm9sbGVyOiBDb250cm9sbGVyLFxuICBBcnJvd3M6IEFycm93cyxcbiAgQXV0b3BsYXk6IEF1dG9wbGF5LFxuICBDb3ZlcjogQ292ZXIsXG4gIFNjcm9sbDogU2Nyb2xsLFxuICBEcmFnOiBEcmFnLFxuICBLZXlib2FyZDogS2V5Ym9hcmQsXG4gIExhenlMb2FkOiBMYXp5TG9hZCxcbiAgUGFnaW5hdGlvbjogUGFnaW5hdGlvbixcbiAgU3luYzogU3luYyxcbiAgV2hlZWw6IFdoZWVsLFxuICBMaXZlOiBMaXZlXG59KTtcbnZhciBJMThOID0ge1xuICBwcmV2OiBcIlByZXZpb3VzIHNsaWRlXCIsXG4gIG5leHQ6IFwiTmV4dCBzbGlkZVwiLFxuICBmaXJzdDogXCJHbyB0byBmaXJzdCBzbGlkZVwiLFxuICBsYXN0OiBcIkdvIHRvIGxhc3Qgc2xpZGVcIixcbiAgc2xpZGVYOiBcIkdvIHRvIHNsaWRlICVzXCIsXG4gIHBhZ2VYOiBcIkdvIHRvIHBhZ2UgJXNcIixcbiAgcGxheTogXCJTdGFydCBhdXRvcGxheVwiLFxuICBwYXVzZTogXCJQYXVzZSBhdXRvcGxheVwiLFxuICBjYXJvdXNlbDogXCJjYXJvdXNlbFwiLFxuICBzbGlkZTogXCJzbGlkZVwiLFxuICBzZWxlY3Q6IFwiU2VsZWN0IGEgc2xpZGUgdG8gc2hvd1wiLFxuICBzbGlkZUxhYmVsOiBcIiVzIG9mICVzXCJcbn07XG52YXIgREVGQVVMVFMgPSB7XG4gIHR5cGU6IFwic2xpZGVcIixcbiAgcm9sZTogXCJyZWdpb25cIixcbiAgc3BlZWQ6IDQwMCxcbiAgcGVyUGFnZTogMSxcbiAgY2xvbmVTdGF0dXM6IHRydWUsXG4gIGFycm93czogdHJ1ZSxcbiAgcGFnaW5hdGlvbjogdHJ1ZSxcbiAgcGFnaW5hdGlvbktleWJvYXJkOiB0cnVlLFxuICBpbnRlcnZhbDogNWUzLFxuICBwYXVzZU9uSG92ZXI6IHRydWUsXG4gIHBhdXNlT25Gb2N1czogdHJ1ZSxcbiAgcmVzZXRQcm9ncmVzczogdHJ1ZSxcbiAgZWFzaW5nOiBcImN1YmljLWJlemllcigwLjI1LCAxLCAwLjUsIDEpXCIsXG4gIGRyYWc6IHRydWUsXG4gIGRpcmVjdGlvbjogXCJsdHJcIixcbiAgdHJpbVNwYWNlOiB0cnVlLFxuICBmb2N1c2FibGVOb2RlczogXCJhLCBidXR0b24sIHRleHRhcmVhLCBpbnB1dCwgc2VsZWN0LCBpZnJhbWVcIixcbiAgbGl2ZTogdHJ1ZSxcbiAgY2xhc3NlczogQ0xBU1NFUyxcbiAgaTE4bjogSTE4TixcbiAgcmVkdWNlZE1vdGlvbjoge1xuICAgIHNwZWVkOiAwLFxuICAgIHJld2luZFNwZWVkOiAwLFxuICAgIGF1dG9wbGF5OiBcInBhdXNlXCJcbiAgfVxufTtcblxuZnVuY3Rpb24gRmFkZShTcGxpZGUyLCBDb21wb25lbnRzMiwgb3B0aW9ucykge1xuICB2YXIgU2xpZGVzID0gQ29tcG9uZW50czIuU2xpZGVzO1xuXG4gIGZ1bmN0aW9uIG1vdW50KCkge1xuICAgIEV2ZW50SW50ZXJmYWNlKFNwbGlkZTIpLm9uKFtFVkVOVF9NT1VOVEVELCBFVkVOVF9SRUZSRVNIXSwgaW5pdCk7XG4gIH1cblxuICBmdW5jdGlvbiBpbml0KCkge1xuICAgIFNsaWRlcy5mb3JFYWNoKGZ1bmN0aW9uIChTbGlkZSkge1xuICAgICAgU2xpZGUuc3R5bGUoXCJ0cmFuc2Zvcm1cIiwgXCJ0cmFuc2xhdGVYKC1cIiArIDEwMCAqIFNsaWRlLmluZGV4ICsgXCIlKVwiKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGluZGV4LCBkb25lKSB7XG4gICAgU2xpZGVzLnN0eWxlKFwidHJhbnNpdGlvblwiLCBcIm9wYWNpdHkgXCIgKyBvcHRpb25zLnNwZWVkICsgXCJtcyBcIiArIG9wdGlvbnMuZWFzaW5nKTtcbiAgICBuZXh0VGljayhkb25lKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbW91bnQ6IG1vdW50LFxuICAgIHN0YXJ0OiBzdGFydCxcbiAgICBjYW5jZWw6IG5vb3BcbiAgfTtcbn1cblxuZnVuY3Rpb24gU2xpZGUoU3BsaWRlMiwgQ29tcG9uZW50czIsIG9wdGlvbnMpIHtcbiAgdmFyIE1vdmUgPSBDb21wb25lbnRzMi5Nb3ZlLFxuICAgICAgQ29udHJvbGxlciA9IENvbXBvbmVudHMyLkNvbnRyb2xsZXIsXG4gICAgICBTY3JvbGwgPSBDb21wb25lbnRzMi5TY3JvbGw7XG4gIHZhciBsaXN0ID0gQ29tcG9uZW50czIuRWxlbWVudHMubGlzdDtcbiAgdmFyIHRyYW5zaXRpb24gPSBhcHBseShzdHlsZSwgbGlzdCwgXCJ0cmFuc2l0aW9uXCIpO1xuICB2YXIgZW5kQ2FsbGJhY2s7XG5cbiAgZnVuY3Rpb24gbW91bnQoKSB7XG4gICAgRXZlbnRJbnRlcmZhY2UoU3BsaWRlMikuYmluZChsaXN0LCBcInRyYW5zaXRpb25lbmRcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChlLnRhcmdldCA9PT0gbGlzdCAmJiBlbmRDYWxsYmFjaykge1xuICAgICAgICBjYW5jZWwoKTtcbiAgICAgICAgZW5kQ2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGluZGV4LCBkb25lKSB7XG4gICAgdmFyIGRlc3RpbmF0aW9uID0gTW92ZS50b1Bvc2l0aW9uKGluZGV4LCB0cnVlKTtcbiAgICB2YXIgcG9zaXRpb24gPSBNb3ZlLmdldFBvc2l0aW9uKCk7XG4gICAgdmFyIHNwZWVkID0gZ2V0U3BlZWQoaW5kZXgpO1xuXG4gICAgaWYgKGFicyhkZXN0aW5hdGlvbiAtIHBvc2l0aW9uKSA+PSAxICYmIHNwZWVkID49IDEpIHtcbiAgICAgIGlmIChvcHRpb25zLnVzZVNjcm9sbCkge1xuICAgICAgICBTY3JvbGwuc2Nyb2xsKGRlc3RpbmF0aW9uLCBzcGVlZCwgZmFsc2UsIGRvbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhbnNpdGlvbihcInRyYW5zZm9ybSBcIiArIHNwZWVkICsgXCJtcyBcIiArIG9wdGlvbnMuZWFzaW5nKTtcbiAgICAgICAgTW92ZS50cmFuc2xhdGUoZGVzdGluYXRpb24sIHRydWUpO1xuICAgICAgICBlbmRDYWxsYmFjayA9IGRvbmU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIE1vdmUuanVtcChpbmRleCk7XG4gICAgICBkb25lKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsKCkge1xuICAgIHRyYW5zaXRpb24oXCJcIik7XG4gICAgU2Nyb2xsLmNhbmNlbCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U3BlZWQoaW5kZXgpIHtcbiAgICB2YXIgcmV3aW5kU3BlZWQgPSBvcHRpb25zLnJld2luZFNwZWVkO1xuXG4gICAgaWYgKFNwbGlkZTIuaXMoU0xJREUpICYmIHJld2luZFNwZWVkKSB7XG4gICAgICB2YXIgcHJldiA9IENvbnRyb2xsZXIuZ2V0SW5kZXgodHJ1ZSk7XG4gICAgICB2YXIgZW5kID0gQ29udHJvbGxlci5nZXRFbmQoKTtcblxuICAgICAgaWYgKHByZXYgPT09IDAgJiYgaW5kZXggPj0gZW5kIHx8IHByZXYgPj0gZW5kICYmIGluZGV4ID09PSAwKSB7XG4gICAgICAgIHJldHVybiByZXdpbmRTcGVlZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9ucy5zcGVlZDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbW91bnQ6IG1vdW50LFxuICAgIHN0YXJ0OiBzdGFydCxcbiAgICBjYW5jZWw6IGNhbmNlbFxuICB9O1xufVxuXG52YXIgX1NwbGlkZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIF9TcGxpZGUodGFyZ2V0LCBvcHRpb25zKSB7XG4gICAgdGhpcy5ldmVudCA9IEV2ZW50SW50ZXJmYWNlKCk7XG4gICAgdGhpcy5Db21wb25lbnRzID0ge307XG4gICAgdGhpcy5zdGF0ZSA9IFN0YXRlKENSRUFURUQpO1xuICAgIHRoaXMuc3BsaWRlcyA9IFtdO1xuICAgIHRoaXMuX28gPSB7fTtcbiAgICB0aGlzLl9FID0ge307XG4gICAgdmFyIHJvb3QgPSBpc1N0cmluZyh0YXJnZXQpID8gcXVlcnkoZG9jdW1lbnQsIHRhcmdldCkgOiB0YXJnZXQ7XG4gICAgYXNzZXJ0KHJvb3QsIHJvb3QgKyBcIiBpcyBpbnZhbGlkLlwiKTtcbiAgICB0aGlzLnJvb3QgPSByb290O1xuICAgIG9wdGlvbnMgPSBtZXJnZSh7XG4gICAgICBsYWJlbDogZ2V0QXR0cmlidXRlKHJvb3QsIEFSSUFfTEFCRUwpIHx8IFwiXCIsXG4gICAgICBsYWJlbGxlZGJ5OiBnZXRBdHRyaWJ1dGUocm9vdCwgQVJJQV9MQUJFTExFREJZKSB8fCBcIlwiXG4gICAgfSwgREVGQVVMVFMsIF9TcGxpZGUuZGVmYXVsdHMsIG9wdGlvbnMgfHwge30pO1xuXG4gICAgdHJ5IHtcbiAgICAgIG1lcmdlKG9wdGlvbnMsIEpTT04ucGFyc2UoZ2V0QXR0cmlidXRlKHJvb3QsIERBVEFfQVRUUklCVVRFKSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGFzc2VydChmYWxzZSwgXCJJbnZhbGlkIEpTT05cIik7XG4gICAgfVxuXG4gICAgdGhpcy5fbyA9IE9iamVjdC5jcmVhdGUobWVyZ2Uoe30sIG9wdGlvbnMpKTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBfU3BsaWRlLnByb3RvdHlwZTtcblxuICBfcHJvdG8ubW91bnQgPSBmdW5jdGlvbiBtb3VudChFeHRlbnNpb25zLCBUcmFuc2l0aW9uKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBzdGF0ZSA9IHRoaXMuc3RhdGUsXG4gICAgICAgIENvbXBvbmVudHMyID0gdGhpcy5Db21wb25lbnRzO1xuICAgIGFzc2VydChzdGF0ZS5pcyhbQ1JFQVRFRCwgREVTVFJPWUVEXSksIFwiQWxyZWFkeSBtb3VudGVkIVwiKTtcbiAgICBzdGF0ZS5zZXQoQ1JFQVRFRCk7XG4gICAgdGhpcy5fQyA9IENvbXBvbmVudHMyO1xuICAgIHRoaXMuX1QgPSBUcmFuc2l0aW9uIHx8IHRoaXMuX1QgfHwgKHRoaXMuaXMoRkFERSkgPyBGYWRlIDogU2xpZGUpO1xuICAgIHRoaXMuX0UgPSBFeHRlbnNpb25zIHx8IHRoaXMuX0U7XG4gICAgdmFyIENvbnN0cnVjdG9ycyA9IGFzc2lnbih7fSwgQ29tcG9uZW50Q29uc3RydWN0b3JzLCB0aGlzLl9FLCB7XG4gICAgICBUcmFuc2l0aW9uOiB0aGlzLl9UXG4gICAgfSk7XG4gICAgZm9yT3duKENvbnN0cnVjdG9ycywgZnVuY3Rpb24gKENvbXBvbmVudCwga2V5KSB7XG4gICAgICB2YXIgY29tcG9uZW50ID0gQ29tcG9uZW50KF90aGlzLCBDb21wb25lbnRzMiwgX3RoaXMuX28pO1xuICAgICAgQ29tcG9uZW50czJba2V5XSA9IGNvbXBvbmVudDtcbiAgICAgIGNvbXBvbmVudC5zZXR1cCAmJiBjb21wb25lbnQuc2V0dXAoKTtcbiAgICB9KTtcbiAgICBmb3JPd24oQ29tcG9uZW50czIsIGZ1bmN0aW9uIChjb21wb25lbnQpIHtcbiAgICAgIGNvbXBvbmVudC5tb3VudCAmJiBjb21wb25lbnQubW91bnQoKTtcbiAgICB9KTtcbiAgICB0aGlzLmVtaXQoRVZFTlRfTU9VTlRFRCk7XG4gICAgYWRkQ2xhc3ModGhpcy5yb290LCBDTEFTU19JTklUSUFMSVpFRCk7XG4gICAgc3RhdGUuc2V0KElETEUpO1xuICAgIHRoaXMuZW1pdChFVkVOVF9SRUFEWSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgX3Byb3RvLnN5bmMgPSBmdW5jdGlvbiBzeW5jKHNwbGlkZSkge1xuICAgIHRoaXMuc3BsaWRlcy5wdXNoKHtcbiAgICAgIHNwbGlkZTogc3BsaWRlXG4gICAgfSk7XG4gICAgc3BsaWRlLnNwbGlkZXMucHVzaCh7XG4gICAgICBzcGxpZGU6IHRoaXMsXG4gICAgICBpc1BhcmVudDogdHJ1ZVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuc3RhdGUuaXMoSURMRSkpIHtcbiAgICAgIHRoaXMuX0MuU3luYy5yZW1vdW50KCk7XG5cbiAgICAgIHNwbGlkZS5Db21wb25lbnRzLlN5bmMucmVtb3VudCgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIF9wcm90by5nbyA9IGZ1bmN0aW9uIGdvKGNvbnRyb2wpIHtcbiAgICB0aGlzLl9DLkNvbnRyb2xsZXIuZ28oY29udHJvbCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBfcHJvdG8ub24gPSBmdW5jdGlvbiBvbihldmVudHMsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5ldmVudC5vbihldmVudHMsIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBfcHJvdG8ub2ZmID0gZnVuY3Rpb24gb2ZmKGV2ZW50cykge1xuICAgIHRoaXMuZXZlbnQub2ZmKGV2ZW50cyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgX3Byb3RvLmVtaXQgPSBmdW5jdGlvbiBlbWl0KGV2ZW50KSB7XG4gICAgdmFyIF90aGlzJGV2ZW50O1xuXG4gICAgKF90aGlzJGV2ZW50ID0gdGhpcy5ldmVudCkuZW1pdC5hcHBseShfdGhpcyRldmVudCwgW2V2ZW50XS5jb25jYXQoc2xpY2UoYXJndW1lbnRzLCAxKSkpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgX3Byb3RvLmFkZCA9IGZ1bmN0aW9uIGFkZChzbGlkZXMsIGluZGV4KSB7XG4gICAgdGhpcy5fQy5TbGlkZXMuYWRkKHNsaWRlcywgaW5kZXgpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgX3Byb3RvLnJlbW92ZSA9IGZ1bmN0aW9uIHJlbW92ZShtYXRjaGVyKSB7XG4gICAgdGhpcy5fQy5TbGlkZXMucmVtb3ZlKG1hdGNoZXIpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgX3Byb3RvLmlzID0gZnVuY3Rpb24gaXModHlwZSkge1xuICAgIHJldHVybiB0aGlzLl9vLnR5cGUgPT09IHR5cGU7XG4gIH07XG5cbiAgX3Byb3RvLnJlZnJlc2ggPSBmdW5jdGlvbiByZWZyZXNoKCkge1xuICAgIHRoaXMuZW1pdChFVkVOVF9SRUZSRVNIKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBfcHJvdG8uZGVzdHJveSA9IGZ1bmN0aW9uIGRlc3Ryb3koY29tcGxldGVseSkge1xuICAgIGlmIChjb21wbGV0ZWx5ID09PSB2b2lkIDApIHtcbiAgICAgIGNvbXBsZXRlbHkgPSB0cnVlO1xuICAgIH1cblxuICAgIHZhciBldmVudCA9IHRoaXMuZXZlbnQsXG4gICAgICAgIHN0YXRlID0gdGhpcy5zdGF0ZTtcblxuICAgIGlmIChzdGF0ZS5pcyhDUkVBVEVEKSkge1xuICAgICAgRXZlbnRJbnRlcmZhY2UodGhpcykub24oRVZFTlRfUkVBRFksIHRoaXMuZGVzdHJveS5iaW5kKHRoaXMsIGNvbXBsZXRlbHkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yT3duKHRoaXMuX0MsIGZ1bmN0aW9uIChjb21wb25lbnQpIHtcbiAgICAgICAgY29tcG9uZW50LmRlc3Ryb3kgJiYgY29tcG9uZW50LmRlc3Ryb3koY29tcGxldGVseSk7XG4gICAgICB9LCB0cnVlKTtcbiAgICAgIGV2ZW50LmVtaXQoRVZFTlRfREVTVFJPWSk7XG4gICAgICBldmVudC5kZXN0cm95KCk7XG4gICAgICBjb21wbGV0ZWx5ICYmIGVtcHR5KHRoaXMuc3BsaWRlcyk7XG4gICAgICBzdGF0ZS5zZXQoREVTVFJPWUVEKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBfY3JlYXRlQ2xhc3MoX1NwbGlkZSwgW3tcbiAgICBrZXk6IFwib3B0aW9uc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX287XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldChvcHRpb25zKSB7XG4gICAgICB0aGlzLl9DLk1lZGlhLnNldChvcHRpb25zLCB0cnVlLCB0cnVlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibGVuZ3RoXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fQy5TbGlkZXMuZ2V0TGVuZ3RoKHRydWUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbmRleFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX0MuQ29udHJvbGxlci5nZXRJbmRleCgpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBfU3BsaWRlO1xufSgpO1xuXG52YXIgU3BsaWRlID0gX1NwbGlkZTtcblNwbGlkZS5kZWZhdWx0cyA9IHt9O1xuU3BsaWRlLlNUQVRFUyA9IFNUQVRFUztcbnZhciBDTEFTU19SRU5ERVJFRCA9IFwiaXMtcmVuZGVyZWRcIjtcbnZhciBSRU5ERVJFUl9ERUZBVUxUX0NPTkZJRyA9IHtcbiAgbGlzdFRhZzogXCJ1bFwiLFxuICBzbGlkZVRhZzogXCJsaVwiXG59O1xuXG52YXIgU3R5bGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBTdHlsZShpZCwgb3B0aW9ucykge1xuICAgIHRoaXMuc3R5bGVzID0ge307XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gIH1cblxuICB2YXIgX3Byb3RvMiA9IFN0eWxlLnByb3RvdHlwZTtcblxuICBfcHJvdG8yLnJ1bGUgPSBmdW5jdGlvbiBydWxlKHNlbGVjdG9yLCBwcm9wLCB2YWx1ZSwgYnJlYWtwb2ludCkge1xuICAgIGJyZWFrcG9pbnQgPSBicmVha3BvaW50IHx8IFwiZGVmYXVsdFwiO1xuICAgIHZhciBzZWxlY3RvcnMgPSB0aGlzLnN0eWxlc1ticmVha3BvaW50XSA9IHRoaXMuc3R5bGVzW2JyZWFrcG9pbnRdIHx8IHt9O1xuICAgIHZhciBzdHlsZXMgPSBzZWxlY3RvcnNbc2VsZWN0b3JdID0gc2VsZWN0b3JzW3NlbGVjdG9yXSB8fCB7fTtcbiAgICBzdHlsZXNbcHJvcF0gPSB2YWx1ZTtcbiAgfTtcblxuICBfcHJvdG8yLmJ1aWxkID0gZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB2YXIgY3NzID0gXCJcIjtcblxuICAgIGlmICh0aGlzLnN0eWxlcy5kZWZhdWx0KSB7XG4gICAgICBjc3MgKz0gdGhpcy5idWlsZFNlbGVjdG9ycyh0aGlzLnN0eWxlcy5kZWZhdWx0KTtcbiAgICB9XG5cbiAgICBPYmplY3Qua2V5cyh0aGlzLnN0eWxlcykuc29ydChmdW5jdGlvbiAobiwgbSkge1xuICAgICAgcmV0dXJuIF90aGlzMi5vcHRpb25zLm1lZGlhUXVlcnkgPT09IFwibWluXCIgPyArbiAtICttIDogK20gLSArbjtcbiAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChicmVha3BvaW50KSB7XG4gICAgICBpZiAoYnJlYWtwb2ludCAhPT0gXCJkZWZhdWx0XCIpIHtcbiAgICAgICAgY3NzICs9IFwiQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogXCIgKyBicmVha3BvaW50ICsgXCJweCkge1wiO1xuICAgICAgICBjc3MgKz0gX3RoaXMyLmJ1aWxkU2VsZWN0b3JzKF90aGlzMi5zdHlsZXNbYnJlYWtwb2ludF0pO1xuICAgICAgICBjc3MgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNzcztcbiAgfTtcblxuICBfcHJvdG8yLmJ1aWxkU2VsZWN0b3JzID0gZnVuY3Rpb24gYnVpbGRTZWxlY3RvcnMoc2VsZWN0b3JzKSB7XG4gICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICB2YXIgY3NzID0gXCJcIjtcbiAgICBmb3JPd24oc2VsZWN0b3JzLCBmdW5jdGlvbiAoc3R5bGVzLCBzZWxlY3Rvcikge1xuICAgICAgc2VsZWN0b3IgPSAoXCIjXCIgKyBfdGhpczMuaWQgKyBcIiBcIiArIHNlbGVjdG9yKS50cmltKCk7XG4gICAgICBjc3MgKz0gc2VsZWN0b3IgKyBcIiB7XCI7XG4gICAgICBmb3JPd24oc3R5bGVzLCBmdW5jdGlvbiAodmFsdWUsIHByb3ApIHtcbiAgICAgICAgaWYgKHZhbHVlIHx8IHZhbHVlID09PSAwKSB7XG4gICAgICAgICAgY3NzICs9IHByb3AgKyBcIjogXCIgKyB2YWx1ZSArIFwiO1wiO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNzcyArPSBcIn1cIjtcbiAgICB9KTtcbiAgICByZXR1cm4gY3NzO1xuICB9O1xuXG4gIHJldHVybiBTdHlsZTtcbn0oKTtcblxudmFyIFNwbGlkZVJlbmRlcmVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU3BsaWRlUmVuZGVyZXIoY29udGVudHMsIG9wdGlvbnMsIGNvbmZpZywgZGVmYXVsdHMpIHtcbiAgICB0aGlzLnNsaWRlcyA9IFtdO1xuICAgIHRoaXMub3B0aW9ucyA9IHt9O1xuICAgIHRoaXMuYnJlYWtwb2ludHMgPSBbXTtcbiAgICBtZXJnZShERUZBVUxUUywgZGVmYXVsdHMgfHwge30pO1xuICAgIG1lcmdlKG1lcmdlKHRoaXMub3B0aW9ucywgREVGQVVMVFMpLCBvcHRpb25zIHx8IHt9KTtcbiAgICB0aGlzLmNvbnRlbnRzID0gY29udGVudHM7XG4gICAgdGhpcy5jb25maWcgPSBhc3NpZ24oe30sIFJFTkRFUkVSX0RFRkFVTFRfQ09ORklHLCBjb25maWcgfHwge30pO1xuICAgIHRoaXMuaWQgPSB0aGlzLmNvbmZpZy5pZCB8fCB1bmlxdWVJZChcInNwbGlkZVwiKTtcbiAgICB0aGlzLlN0eWxlID0gbmV3IFN0eWxlKHRoaXMuaWQsIHRoaXMub3B0aW9ucyk7XG4gICAgdGhpcy5EaXJlY3Rpb24gPSBEaXJlY3Rpb24obnVsbCwgbnVsbCwgdGhpcy5vcHRpb25zKTtcbiAgICBhc3NlcnQodGhpcy5jb250ZW50cy5sZW5ndGgsIFwiUHJvdmlkZSBhdCBsZWFzdCAxIGNvbnRlbnQuXCIpO1xuICAgIHRoaXMuaW5pdCgpO1xuICB9XG5cbiAgU3BsaWRlUmVuZGVyZXIuY2xlYW4gPSBmdW5jdGlvbiBjbGVhbihzcGxpZGUpIHtcbiAgICB2YXIgX0V2ZW50SW50ZXJmYWNlMTQgPSBFdmVudEludGVyZmFjZShzcGxpZGUpLFxuICAgICAgICBvbiA9IF9FdmVudEludGVyZmFjZTE0Lm9uO1xuXG4gICAgdmFyIHJvb3QgPSBzcGxpZGUucm9vdDtcbiAgICB2YXIgY2xvbmVzID0gcXVlcnlBbGwocm9vdCwgXCIuXCIgKyBDTEFTU19DTE9ORSk7XG4gICAgb24oRVZFTlRfTU9VTlRFRCwgZnVuY3Rpb24gKCkge1xuICAgICAgcmVtb3ZlKGNoaWxkKHJvb3QsIFwic3R5bGVcIikpO1xuICAgIH0pO1xuICAgIHJlbW92ZShjbG9uZXMpO1xuICB9O1xuXG4gIHZhciBfcHJvdG8zID0gU3BsaWRlUmVuZGVyZXIucHJvdG90eXBlO1xuXG4gIF9wcm90bzMuaW5pdCA9IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgdGhpcy5wYXJzZUJyZWFrcG9pbnRzKCk7XG4gICAgdGhpcy5pbml0U2xpZGVzKCk7XG4gICAgdGhpcy5yZWdpc3RlclJvb3RTdHlsZXMoKTtcbiAgICB0aGlzLnJlZ2lzdGVyVHJhY2tTdHlsZXMoKTtcbiAgICB0aGlzLnJlZ2lzdGVyU2xpZGVTdHlsZXMoKTtcbiAgICB0aGlzLnJlZ2lzdGVyTGlzdFN0eWxlcygpO1xuICB9O1xuXG4gIF9wcm90bzMuaW5pdFNsaWRlcyA9IGZ1bmN0aW9uIGluaXRTbGlkZXMoKSB7XG4gICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICBwdXNoKHRoaXMuc2xpZGVzLCB0aGlzLmNvbnRlbnRzLm1hcChmdW5jdGlvbiAoY29udGVudCwgaW5kZXgpIHtcbiAgICAgIGNvbnRlbnQgPSBpc1N0cmluZyhjb250ZW50KSA/IHtcbiAgICAgICAgaHRtbDogY29udGVudFxuICAgICAgfSA6IGNvbnRlbnQ7XG4gICAgICBjb250ZW50LnN0eWxlcyA9IGNvbnRlbnQuc3R5bGVzIHx8IHt9O1xuICAgICAgY29udGVudC5hdHRycyA9IGNvbnRlbnQuYXR0cnMgfHwge307XG5cbiAgICAgIF90aGlzNC5jb3Zlcihjb250ZW50KTtcblxuICAgICAgdmFyIGNsYXNzZXMgPSBfdGhpczQub3B0aW9ucy5jbGFzc2VzLnNsaWRlICsgXCIgXCIgKyAoaW5kZXggPT09IDAgPyBDTEFTU19BQ1RJVkUgOiBcIlwiKTtcbiAgICAgIGFzc2lnbihjb250ZW50LmF0dHJzLCB7XG4gICAgICAgIGNsYXNzOiAoY2xhc3NlcyArIFwiIFwiICsgKGNvbnRlbnQuYXR0cnMuY2xhc3MgfHwgXCJcIikpLnRyaW0oKSxcbiAgICAgICAgc3R5bGU6IF90aGlzNC5idWlsZFN0eWxlcyhjb250ZW50LnN0eWxlcylcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfSkpO1xuXG4gICAgaWYgKHRoaXMuaXNMb29wKCkpIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVDbG9uZXModGhpcy5zbGlkZXMpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8zLnJlZ2lzdGVyUm9vdFN0eWxlcyA9IGZ1bmN0aW9uIHJlZ2lzdGVyUm9vdFN0eWxlcygpIHtcbiAgICB2YXIgX3RoaXM1ID0gdGhpcztcblxuICAgIHRoaXMuYnJlYWtwb2ludHMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgIHZhciB3aWR0aCA9IF9yZWYyWzBdLFxuICAgICAgICAgIG9wdGlvbnMgPSBfcmVmMlsxXTtcblxuICAgICAgX3RoaXM1LlN0eWxlLnJ1bGUoXCIgXCIsIFwibWF4LXdpZHRoXCIsIHVuaXQob3B0aW9ucy53aWR0aCksIHdpZHRoKTtcbiAgICB9KTtcbiAgfTtcblxuICBfcHJvdG8zLnJlZ2lzdGVyVHJhY2tTdHlsZXMgPSBmdW5jdGlvbiByZWdpc3RlclRyYWNrU3R5bGVzKCkge1xuICAgIHZhciBfdGhpczYgPSB0aGlzO1xuXG4gICAgdmFyIFN0eWxlMiA9IHRoaXMuU3R5bGU7XG4gICAgdmFyIHNlbGVjdG9yID0gXCIuXCIgKyBDTEFTU19UUkFDSztcbiAgICB0aGlzLmJyZWFrcG9pbnRzLmZvckVhY2goZnVuY3Rpb24gKF9yZWYzKSB7XG4gICAgICB2YXIgd2lkdGggPSBfcmVmM1swXSxcbiAgICAgICAgICBvcHRpb25zID0gX3JlZjNbMV07XG4gICAgICBTdHlsZTIucnVsZShzZWxlY3RvciwgX3RoaXM2LnJlc29sdmUoXCJwYWRkaW5nTGVmdFwiKSwgX3RoaXM2LmNzc1BhZGRpbmcob3B0aW9ucywgZmFsc2UpLCB3aWR0aCk7XG4gICAgICBTdHlsZTIucnVsZShzZWxlY3RvciwgX3RoaXM2LnJlc29sdmUoXCJwYWRkaW5nUmlnaHRcIiksIF90aGlzNi5jc3NQYWRkaW5nKG9wdGlvbnMsIHRydWUpLCB3aWR0aCk7XG4gICAgICBTdHlsZTIucnVsZShzZWxlY3RvciwgXCJoZWlnaHRcIiwgX3RoaXM2LmNzc1RyYWNrSGVpZ2h0KG9wdGlvbnMpLCB3aWR0aCk7XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvMy5yZWdpc3Rlckxpc3RTdHlsZXMgPSBmdW5jdGlvbiByZWdpc3Rlckxpc3RTdHlsZXMoKSB7XG4gICAgdmFyIF90aGlzNyA9IHRoaXM7XG5cbiAgICB2YXIgU3R5bGUyID0gdGhpcy5TdHlsZTtcbiAgICB2YXIgc2VsZWN0b3IgPSBcIi5cIiArIENMQVNTX0xJU1Q7XG4gICAgdGhpcy5icmVha3BvaW50cy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmNCkge1xuICAgICAgdmFyIHdpZHRoID0gX3JlZjRbMF0sXG4gICAgICAgICAgb3B0aW9ucyA9IF9yZWY0WzFdO1xuICAgICAgU3R5bGUyLnJ1bGUoc2VsZWN0b3IsIFwidHJhbnNmb3JtXCIsIF90aGlzNy5idWlsZFRyYW5zbGF0ZShvcHRpb25zKSwgd2lkdGgpO1xuXG4gICAgICBpZiAoIV90aGlzNy5jc3NTbGlkZUhlaWdodChvcHRpb25zKSkge1xuICAgICAgICBTdHlsZTIucnVsZShzZWxlY3RvciwgXCJhc3BlY3QtcmF0aW9cIiwgX3RoaXM3LmNzc0FzcGVjdFJhdGlvKG9wdGlvbnMpLCB3aWR0aCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvMy5yZWdpc3RlclNsaWRlU3R5bGVzID0gZnVuY3Rpb24gcmVnaXN0ZXJTbGlkZVN0eWxlcygpIHtcbiAgICB2YXIgX3RoaXM4ID0gdGhpcztcblxuICAgIHZhciBTdHlsZTIgPSB0aGlzLlN0eWxlO1xuICAgIHZhciBzZWxlY3RvciA9IFwiLlwiICsgQ0xBU1NfU0xJREU7XG4gICAgdGhpcy5icmVha3BvaW50cy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmNSkge1xuICAgICAgdmFyIHdpZHRoID0gX3JlZjVbMF0sXG4gICAgICAgICAgb3B0aW9ucyA9IF9yZWY1WzFdO1xuICAgICAgU3R5bGUyLnJ1bGUoc2VsZWN0b3IsIFwid2lkdGhcIiwgX3RoaXM4LmNzc1NsaWRlV2lkdGgob3B0aW9ucyksIHdpZHRoKTtcbiAgICAgIFN0eWxlMi5ydWxlKHNlbGVjdG9yLCBcImhlaWdodFwiLCBfdGhpczguY3NzU2xpZGVIZWlnaHQob3B0aW9ucykgfHwgXCIxMDAlXCIsIHdpZHRoKTtcbiAgICAgIFN0eWxlMi5ydWxlKHNlbGVjdG9yLCBfdGhpczgucmVzb2x2ZShcIm1hcmdpblJpZ2h0XCIpLCB1bml0KG9wdGlvbnMuZ2FwKSB8fCBcIjBweFwiLCB3aWR0aCk7XG4gICAgICBTdHlsZTIucnVsZShzZWxlY3RvciArIFwiID4gaW1nXCIsIFwiZGlzcGxheVwiLCBvcHRpb25zLmNvdmVyID8gXCJub25lXCIgOiBcImlubGluZVwiLCB3aWR0aCk7XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvMy5idWlsZFRyYW5zbGF0ZSA9IGZ1bmN0aW9uIGJ1aWxkVHJhbnNsYXRlKG9wdGlvbnMpIHtcbiAgICB2YXIgX3RoaXMkRGlyZWN0aW9uID0gdGhpcy5EaXJlY3Rpb24sXG4gICAgICAgIHJlc29sdmUgPSBfdGhpcyREaXJlY3Rpb24ucmVzb2x2ZSxcbiAgICAgICAgb3JpZW50ID0gX3RoaXMkRGlyZWN0aW9uLm9yaWVudDtcbiAgICB2YXIgdmFsdWVzID0gW107XG4gICAgdmFsdWVzLnB1c2godGhpcy5jc3NPZmZzZXRDbG9uZXMob3B0aW9ucykpO1xuICAgIHZhbHVlcy5wdXNoKHRoaXMuY3NzT2Zmc2V0R2FwcyhvcHRpb25zKSk7XG5cbiAgICBpZiAodGhpcy5pc0NlbnRlcihvcHRpb25zKSkge1xuICAgICAgdmFsdWVzLnB1c2godGhpcy5idWlsZENzc1ZhbHVlKG9yaWVudCgtNTApLCBcIiVcIikpO1xuICAgICAgdmFsdWVzLnB1c2guYXBwbHkodmFsdWVzLCB0aGlzLmNzc09mZnNldENlbnRlcihvcHRpb25zKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlcy5maWx0ZXIoQm9vbGVhbikubWFwKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIFwidHJhbnNsYXRlXCIgKyByZXNvbHZlKFwiWFwiKSArIFwiKFwiICsgdmFsdWUgKyBcIilcIjtcbiAgICB9KS5qb2luKFwiIFwiKTtcbiAgfTtcblxuICBfcHJvdG8zLmNzc09mZnNldENsb25lcyA9IGZ1bmN0aW9uIGNzc09mZnNldENsb25lcyhvcHRpb25zKSB7XG4gICAgdmFyIF90aGlzJERpcmVjdGlvbjIgPSB0aGlzLkRpcmVjdGlvbixcbiAgICAgICAgcmVzb2x2ZSA9IF90aGlzJERpcmVjdGlvbjIucmVzb2x2ZSxcbiAgICAgICAgb3JpZW50ID0gX3RoaXMkRGlyZWN0aW9uMi5vcmllbnQ7XG4gICAgdmFyIGNsb25lQ291bnQgPSB0aGlzLmdldENsb25lQ291bnQoKTtcblxuICAgIGlmICh0aGlzLmlzRml4ZWRXaWR0aChvcHRpb25zKSkge1xuICAgICAgdmFyIF90aGlzJHBhcnNlQ3NzVmFsdWUgPSB0aGlzLnBhcnNlQ3NzVmFsdWUob3B0aW9uc1tyZXNvbHZlKFwiZml4ZWRXaWR0aFwiKV0pLFxuICAgICAgICAgIHZhbHVlID0gX3RoaXMkcGFyc2VDc3NWYWx1ZS52YWx1ZSxcbiAgICAgICAgICB1bml0MiA9IF90aGlzJHBhcnNlQ3NzVmFsdWUudW5pdDtcblxuICAgICAgcmV0dXJuIHRoaXMuYnVpbGRDc3NWYWx1ZShvcmllbnQodmFsdWUpICogY2xvbmVDb3VudCwgdW5pdDIpO1xuICAgIH1cblxuICAgIHZhciBwZXJjZW50ID0gMTAwICogY2xvbmVDb3VudCAvIG9wdGlvbnMucGVyUGFnZTtcbiAgICByZXR1cm4gb3JpZW50KHBlcmNlbnQpICsgXCIlXCI7XG4gIH07XG5cbiAgX3Byb3RvMy5jc3NPZmZzZXRDZW50ZXIgPSBmdW5jdGlvbiBjc3NPZmZzZXRDZW50ZXIob3B0aW9ucykge1xuICAgIHZhciBfdGhpcyREaXJlY3Rpb24zID0gdGhpcy5EaXJlY3Rpb24sXG4gICAgICAgIHJlc29sdmUgPSBfdGhpcyREaXJlY3Rpb24zLnJlc29sdmUsXG4gICAgICAgIG9yaWVudCA9IF90aGlzJERpcmVjdGlvbjMub3JpZW50O1xuXG4gICAgaWYgKHRoaXMuaXNGaXhlZFdpZHRoKG9wdGlvbnMpKSB7XG4gICAgICB2YXIgX3RoaXMkcGFyc2VDc3NWYWx1ZTIgPSB0aGlzLnBhcnNlQ3NzVmFsdWUob3B0aW9uc1tyZXNvbHZlKFwiZml4ZWRXaWR0aFwiKV0pLFxuICAgICAgICAgIHZhbHVlID0gX3RoaXMkcGFyc2VDc3NWYWx1ZTIudmFsdWUsXG4gICAgICAgICAgdW5pdDIgPSBfdGhpcyRwYXJzZUNzc1ZhbHVlMi51bml0O1xuXG4gICAgICByZXR1cm4gW3RoaXMuYnVpbGRDc3NWYWx1ZShvcmllbnQodmFsdWUgLyAyKSwgdW5pdDIpXTtcbiAgICB9XG5cbiAgICB2YXIgdmFsdWVzID0gW107XG4gICAgdmFyIHBlclBhZ2UgPSBvcHRpb25zLnBlclBhZ2UsXG4gICAgICAgIGdhcCA9IG9wdGlvbnMuZ2FwO1xuICAgIHZhbHVlcy5wdXNoKG9yaWVudCg1MCAvIHBlclBhZ2UpICsgXCIlXCIpO1xuXG4gICAgaWYgKGdhcCkge1xuICAgICAgdmFyIF90aGlzJHBhcnNlQ3NzVmFsdWUzID0gdGhpcy5wYXJzZUNzc1ZhbHVlKGdhcCksXG4gICAgICAgICAgX3ZhbHVlID0gX3RoaXMkcGFyc2VDc3NWYWx1ZTMudmFsdWUsXG4gICAgICAgICAgX3VuaXQgPSBfdGhpcyRwYXJzZUNzc1ZhbHVlMy51bml0O1xuXG4gICAgICB2YXIgZ2FwT2Zmc2V0ID0gKF92YWx1ZSAvIHBlclBhZ2UgLSBfdmFsdWUpIC8gMjtcbiAgICAgIHZhbHVlcy5wdXNoKHRoaXMuYnVpbGRDc3NWYWx1ZShvcmllbnQoZ2FwT2Zmc2V0KSwgX3VuaXQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9O1xuXG4gIF9wcm90bzMuY3NzT2Zmc2V0R2FwcyA9IGZ1bmN0aW9uIGNzc09mZnNldEdhcHMob3B0aW9ucykge1xuICAgIHZhciBjbG9uZUNvdW50ID0gdGhpcy5nZXRDbG9uZUNvdW50KCk7XG5cbiAgICBpZiAoY2xvbmVDb3VudCAmJiBvcHRpb25zLmdhcCkge1xuICAgICAgdmFyIG9yaWVudCA9IHRoaXMuRGlyZWN0aW9uLm9yaWVudDtcblxuICAgICAgdmFyIF90aGlzJHBhcnNlQ3NzVmFsdWU0ID0gdGhpcy5wYXJzZUNzc1ZhbHVlKG9wdGlvbnMuZ2FwKSxcbiAgICAgICAgICB2YWx1ZSA9IF90aGlzJHBhcnNlQ3NzVmFsdWU0LnZhbHVlLFxuICAgICAgICAgIHVuaXQyID0gX3RoaXMkcGFyc2VDc3NWYWx1ZTQudW5pdDtcblxuICAgICAgaWYgKHRoaXMuaXNGaXhlZFdpZHRoKG9wdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkQ3NzVmFsdWUob3JpZW50KHZhbHVlICogY2xvbmVDb3VudCksIHVuaXQyKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHBlclBhZ2UgPSBvcHRpb25zLnBlclBhZ2U7XG4gICAgICB2YXIgZ2FwcyA9IGNsb25lQ291bnQgLyBwZXJQYWdlO1xuICAgICAgcmV0dXJuIHRoaXMuYnVpbGRDc3NWYWx1ZShvcmllbnQoZ2FwcyAqIHZhbHVlKSwgdW5pdDIpO1xuICAgIH1cblxuICAgIHJldHVybiBcIlwiO1xuICB9O1xuXG4gIF9wcm90bzMucmVzb2x2ZSA9IGZ1bmN0aW9uIHJlc29sdmUocHJvcCkge1xuICAgIHJldHVybiBjYW1lbFRvS2ViYWIodGhpcy5EaXJlY3Rpb24ucmVzb2x2ZShwcm9wKSk7XG4gIH07XG5cbiAgX3Byb3RvMy5jc3NQYWRkaW5nID0gZnVuY3Rpb24gY3NzUGFkZGluZyhvcHRpb25zLCByaWdodCkge1xuICAgIHZhciBwYWRkaW5nID0gb3B0aW9ucy5wYWRkaW5nO1xuICAgIHZhciBwcm9wID0gdGhpcy5EaXJlY3Rpb24ucmVzb2x2ZShyaWdodCA/IFwicmlnaHRcIiA6IFwibGVmdFwiLCB0cnVlKTtcbiAgICByZXR1cm4gcGFkZGluZyAmJiB1bml0KHBhZGRpbmdbcHJvcF0gfHwgKGlzT2JqZWN0KHBhZGRpbmcpID8gMCA6IHBhZGRpbmcpKSB8fCBcIjBweFwiO1xuICB9O1xuXG4gIF9wcm90bzMuY3NzVHJhY2tIZWlnaHQgPSBmdW5jdGlvbiBjc3NUcmFja0hlaWdodChvcHRpb25zKSB7XG4gICAgdmFyIGhlaWdodCA9IFwiXCI7XG5cbiAgICBpZiAodGhpcy5pc1ZlcnRpY2FsKCkpIHtcbiAgICAgIGhlaWdodCA9IHRoaXMuY3NzSGVpZ2h0KG9wdGlvbnMpO1xuICAgICAgYXNzZXJ0KGhlaWdodCwgJ1wiaGVpZ2h0XCIgaXMgbWlzc2luZy4nKTtcbiAgICAgIGhlaWdodCA9IFwiY2FsYyhcIiArIGhlaWdodCArIFwiIC0gXCIgKyB0aGlzLmNzc1BhZGRpbmcob3B0aW9ucywgZmFsc2UpICsgXCIgLSBcIiArIHRoaXMuY3NzUGFkZGluZyhvcHRpb25zLCB0cnVlKSArIFwiKVwiO1xuICAgIH1cblxuICAgIHJldHVybiBoZWlnaHQ7XG4gIH07XG5cbiAgX3Byb3RvMy5jc3NIZWlnaHQgPSBmdW5jdGlvbiBjc3NIZWlnaHQob3B0aW9ucykge1xuICAgIHJldHVybiB1bml0KG9wdGlvbnMuaGVpZ2h0KTtcbiAgfTtcblxuICBfcHJvdG8zLmNzc1NsaWRlV2lkdGggPSBmdW5jdGlvbiBjc3NTbGlkZVdpZHRoKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5hdXRvV2lkdGggPyBcIlwiIDogdW5pdChvcHRpb25zLmZpeGVkV2lkdGgpIHx8ICh0aGlzLmlzVmVydGljYWwoKSA/IFwiXCIgOiB0aGlzLmNzc1NsaWRlU2l6ZShvcHRpb25zKSk7XG4gIH07XG5cbiAgX3Byb3RvMy5jc3NTbGlkZUhlaWdodCA9IGZ1bmN0aW9uIGNzc1NsaWRlSGVpZ2h0KG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdW5pdChvcHRpb25zLmZpeGVkSGVpZ2h0KSB8fCAodGhpcy5pc1ZlcnRpY2FsKCkgPyBvcHRpb25zLmF1dG9IZWlnaHQgPyBcIlwiIDogdGhpcy5jc3NTbGlkZVNpemUob3B0aW9ucykgOiB0aGlzLmNzc0hlaWdodChvcHRpb25zKSk7XG4gIH07XG5cbiAgX3Byb3RvMy5jc3NTbGlkZVNpemUgPSBmdW5jdGlvbiBjc3NTbGlkZVNpemUob3B0aW9ucykge1xuICAgIHZhciBnYXAgPSB1bml0KG9wdGlvbnMuZ2FwKTtcbiAgICByZXR1cm4gXCJjYWxjKCgxMDAlXCIgKyAoZ2FwICYmIFwiICsgXCIgKyBnYXApICsgXCIpL1wiICsgKG9wdGlvbnMucGVyUGFnZSB8fCAxKSArIChnYXAgJiYgXCIgLSBcIiArIGdhcCkgKyBcIilcIjtcbiAgfTtcblxuICBfcHJvdG8zLmNzc0FzcGVjdFJhdGlvID0gZnVuY3Rpb24gY3NzQXNwZWN0UmF0aW8ob3B0aW9ucykge1xuICAgIHZhciBoZWlnaHRSYXRpbyA9IG9wdGlvbnMuaGVpZ2h0UmF0aW87XG4gICAgcmV0dXJuIGhlaWdodFJhdGlvID8gXCJcIiArIDEgLyBoZWlnaHRSYXRpbyA6IFwiXCI7XG4gIH07XG5cbiAgX3Byb3RvMy5idWlsZENzc1ZhbHVlID0gZnVuY3Rpb24gYnVpbGRDc3NWYWx1ZSh2YWx1ZSwgdW5pdDIpIHtcbiAgICByZXR1cm4gXCJcIiArIHZhbHVlICsgdW5pdDI7XG4gIH07XG5cbiAgX3Byb3RvMy5wYXJzZUNzc1ZhbHVlID0gZnVuY3Rpb24gcGFyc2VDc3NWYWx1ZSh2YWx1ZSkge1xuICAgIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgIHZhciBudW1iZXIgPSBwYXJzZUZsb2F0KHZhbHVlKSB8fCAwO1xuICAgICAgdmFyIHVuaXQyID0gdmFsdWUucmVwbGFjZSgvXFxkKihcXC5cXGQqKT8vLCBcIlwiKSB8fCBcInB4XCI7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogbnVtYmVyLFxuICAgICAgICB1bml0OiB1bml0MlxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgdW5pdDogXCJweFwiXG4gICAgfTtcbiAgfTtcblxuICBfcHJvdG8zLnBhcnNlQnJlYWtwb2ludHMgPSBmdW5jdGlvbiBwYXJzZUJyZWFrcG9pbnRzKCkge1xuICAgIHZhciBfdGhpczkgPSB0aGlzO1xuXG4gICAgdmFyIGJyZWFrcG9pbnRzID0gdGhpcy5vcHRpb25zLmJyZWFrcG9pbnRzO1xuICAgIHRoaXMuYnJlYWtwb2ludHMucHVzaChbXCJkZWZhdWx0XCIsIHRoaXMub3B0aW9uc10pO1xuXG4gICAgaWYgKGJyZWFrcG9pbnRzKSB7XG4gICAgICBmb3JPd24oYnJlYWtwb2ludHMsIGZ1bmN0aW9uIChvcHRpb25zLCB3aWR0aCkge1xuICAgICAgICBfdGhpczkuYnJlYWtwb2ludHMucHVzaChbd2lkdGgsIG1lcmdlKG1lcmdlKHt9LCBfdGhpczkub3B0aW9ucyksIG9wdGlvbnMpXSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvMy5pc0ZpeGVkV2lkdGggPSBmdW5jdGlvbiBpc0ZpeGVkV2lkdGgob3B0aW9ucykge1xuICAgIHJldHVybiAhIW9wdGlvbnNbdGhpcy5EaXJlY3Rpb24ucmVzb2x2ZShcImZpeGVkV2lkdGhcIildO1xuICB9O1xuXG4gIF9wcm90bzMuaXNMb29wID0gZnVuY3Rpb24gaXNMb29wKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMudHlwZSA9PT0gTE9PUDtcbiAgfTtcblxuICBfcHJvdG8zLmlzQ2VudGVyID0gZnVuY3Rpb24gaXNDZW50ZXIob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmZvY3VzID09PSBcImNlbnRlclwiKSB7XG4gICAgICBpZiAodGhpcy5pc0xvb3AoKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy50eXBlID09PSBTTElERSkge1xuICAgICAgICByZXR1cm4gIXRoaXMub3B0aW9ucy50cmltU3BhY2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIF9wcm90bzMuaXNWZXJ0aWNhbCA9IGZ1bmN0aW9uIGlzVmVydGljYWwoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5kaXJlY3Rpb24gPT09IFRUQjtcbiAgfTtcblxuICBfcHJvdG8zLmJ1aWxkQ2xhc3NlcyA9IGZ1bmN0aW9uIGJ1aWxkQ2xhc3NlcygpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICByZXR1cm4gW0NMQVNTX1JPT1QsIENMQVNTX1JPT1QgKyBcIi0tXCIgKyBvcHRpb25zLnR5cGUsIENMQVNTX1JPT1QgKyBcIi0tXCIgKyBvcHRpb25zLmRpcmVjdGlvbiwgb3B0aW9ucy5kcmFnICYmIENMQVNTX1JPT1QgKyBcIi0tZHJhZ2dhYmxlXCIsIG9wdGlvbnMuaXNOYXZpZ2F0aW9uICYmIENMQVNTX1JPT1QgKyBcIi0tbmF2XCIsIENMQVNTX0FDVElWRSwgIXRoaXMuY29uZmlnLmhpZGRlbiAmJiBDTEFTU19SRU5ERVJFRF0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oXCIgXCIpO1xuICB9O1xuXG4gIF9wcm90bzMuYnVpbGRBdHRycyA9IGZ1bmN0aW9uIGJ1aWxkQXR0cnMoYXR0cnMpIHtcbiAgICB2YXIgYXR0ciA9IFwiXCI7XG4gICAgZm9yT3duKGF0dHJzLCBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgYXR0ciArPSB2YWx1ZSA/IFwiIFwiICsgY2FtZWxUb0tlYmFiKGtleSkgKyBcIj1cXFwiXCIgKyB2YWx1ZSArIFwiXFxcIlwiIDogXCJcIjtcbiAgICB9KTtcbiAgICByZXR1cm4gYXR0ci50cmltKCk7XG4gIH07XG5cbiAgX3Byb3RvMy5idWlsZFN0eWxlcyA9IGZ1bmN0aW9uIGJ1aWxkU3R5bGVzKHN0eWxlcykge1xuICAgIHZhciBzdHlsZSA9IFwiXCI7XG4gICAgZm9yT3duKHN0eWxlcywgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIHN0eWxlICs9IFwiIFwiICsgY2FtZWxUb0tlYmFiKGtleSkgKyBcIjpcIiArIHZhbHVlICsgXCI7XCI7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN0eWxlLnRyaW0oKTtcbiAgfTtcblxuICBfcHJvdG8zLnJlbmRlclNsaWRlcyA9IGZ1bmN0aW9uIHJlbmRlclNsaWRlcygpIHtcbiAgICB2YXIgX3RoaXMxMCA9IHRoaXM7XG5cbiAgICB2YXIgdGFnID0gdGhpcy5jb25maWcuc2xpZGVUYWc7XG4gICAgcmV0dXJuIHRoaXMuc2xpZGVzLm1hcChmdW5jdGlvbiAoY29udGVudCkge1xuICAgICAgcmV0dXJuIFwiPFwiICsgdGFnICsgXCIgXCIgKyBfdGhpczEwLmJ1aWxkQXR0cnMoY29udGVudC5hdHRycykgKyBcIj5cIiArIChjb250ZW50Lmh0bWwgfHwgXCJcIikgKyBcIjwvXCIgKyB0YWcgKyBcIj5cIjtcbiAgICB9KS5qb2luKFwiXCIpO1xuICB9O1xuXG4gIF9wcm90bzMuY292ZXIgPSBmdW5jdGlvbiBjb3Zlcihjb250ZW50KSB7XG4gICAgdmFyIHN0eWxlcyA9IGNvbnRlbnQuc3R5bGVzLFxuICAgICAgICBfY29udGVudCRodG1sID0gY29udGVudC5odG1sLFxuICAgICAgICBodG1sID0gX2NvbnRlbnQkaHRtbCA9PT0gdm9pZCAwID8gXCJcIiA6IF9jb250ZW50JGh0bWw7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmNvdmVyICYmICF0aGlzLm9wdGlvbnMubGF6eUxvYWQpIHtcbiAgICAgIHZhciBzcmMgPSBodG1sLm1hdGNoKC88aW1nLio/c3JjXFxzKj1cXHMqKFsnXCJdKSguKz8pXFwxLio/Pi8pO1xuXG4gICAgICBpZiAoc3JjICYmIHNyY1syXSkge1xuICAgICAgICBzdHlsZXMuYmFja2dyb3VuZCA9IFwiY2VudGVyL2NvdmVyIG5vLXJlcGVhdCB1cmwoJ1wiICsgc3JjWzJdICsgXCInKVwiO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBfcHJvdG8zLmdlbmVyYXRlQ2xvbmVzID0gZnVuY3Rpb24gZ2VuZXJhdGVDbG9uZXMoY29udGVudHMpIHtcbiAgICB2YXIgY2xhc3NlcyA9IHRoaXMub3B0aW9ucy5jbGFzc2VzO1xuICAgIHZhciBjb3VudCA9IHRoaXMuZ2V0Q2xvbmVDb3VudCgpO1xuICAgIHZhciBzbGlkZXMgPSBjb250ZW50cy5zbGljZSgpO1xuXG4gICAgd2hpbGUgKHNsaWRlcy5sZW5ndGggPCBjb3VudCkge1xuICAgICAgcHVzaChzbGlkZXMsIHNsaWRlcyk7XG4gICAgfVxuXG4gICAgcHVzaChzbGlkZXMuc2xpY2UoLWNvdW50KS5yZXZlcnNlKCksIHNsaWRlcy5zbGljZSgwLCBjb3VudCkpLmZvckVhY2goZnVuY3Rpb24gKGNvbnRlbnQsIGluZGV4KSB7XG4gICAgICB2YXIgYXR0cnMgPSBhc3NpZ24oe30sIGNvbnRlbnQuYXR0cnMsIHtcbiAgICAgICAgY2xhc3M6IGNvbnRlbnQuYXR0cnMuY2xhc3MgKyBcIiBcIiArIGNsYXNzZXMuY2xvbmVcbiAgICAgIH0pO1xuICAgICAgdmFyIGNsb25lID0gYXNzaWduKHt9LCBjb250ZW50LCB7XG4gICAgICAgIGF0dHJzOiBhdHRyc1xuICAgICAgfSk7XG4gICAgICBpbmRleCA8IGNvdW50ID8gY29udGVudHMudW5zaGlmdChjbG9uZSkgOiBjb250ZW50cy5wdXNoKGNsb25lKTtcbiAgICB9KTtcbiAgfTtcblxuICBfcHJvdG8zLmdldENsb25lQ291bnQgPSBmdW5jdGlvbiBnZXRDbG9uZUNvdW50KCkge1xuICAgIGlmICh0aGlzLmlzTG9vcCgpKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcblxuICAgICAgaWYgKG9wdGlvbnMuY2xvbmVzKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLmNsb25lcztcbiAgICAgIH1cblxuICAgICAgdmFyIHBlclBhZ2UgPSBtYXguYXBwbHkodm9pZCAwLCB0aGlzLmJyZWFrcG9pbnRzLm1hcChmdW5jdGlvbiAoX3JlZjYpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMyID0gX3JlZjZbMV07XG4gICAgICAgIHJldHVybiBvcHRpb25zMi5wZXJQYWdlO1xuICAgICAgfSkpO1xuICAgICAgcmV0dXJuIHBlclBhZ2UgKiAoKG9wdGlvbnMuZmxpY2tNYXhQYWdlcyB8fCAxKSArIDEpO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9O1xuXG4gIF9wcm90bzMucmVuZGVyQXJyb3dzID0gZnVuY3Rpb24gcmVuZGVyQXJyb3dzKCkge1xuICAgIHZhciBodG1sID0gXCJcIjtcbiAgICBodG1sICs9IFwiPGRpdiBjbGFzcz1cXFwiXCIgKyB0aGlzLm9wdGlvbnMuY2xhc3Nlcy5hcnJvd3MgKyBcIlxcXCI+XCI7XG4gICAgaHRtbCArPSB0aGlzLnJlbmRlckFycm93KHRydWUpO1xuICAgIGh0bWwgKz0gdGhpcy5yZW5kZXJBcnJvdyhmYWxzZSk7XG4gICAgaHRtbCArPSBcIjwvZGl2PlwiO1xuICAgIHJldHVybiBodG1sO1xuICB9O1xuXG4gIF9wcm90bzMucmVuZGVyQXJyb3cgPSBmdW5jdGlvbiByZW5kZXJBcnJvdyhwcmV2KSB7XG4gICAgdmFyIF90aGlzJG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgIGNsYXNzZXMgPSBfdGhpcyRvcHRpb25zLmNsYXNzZXMsXG4gICAgICAgIGkxOG4gPSBfdGhpcyRvcHRpb25zLmkxOG47XG4gICAgdmFyIGF0dHJzID0ge1xuICAgICAgY2xhc3M6IGNsYXNzZXMuYXJyb3cgKyBcIiBcIiArIChwcmV2ID8gY2xhc3Nlcy5wcmV2IDogY2xhc3Nlcy5uZXh0KSxcbiAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICBhcmlhTGFiZWw6IHByZXYgPyBpMThuLnByZXYgOiBpMThuLm5leHRcbiAgICB9O1xuICAgIHJldHVybiBcIjxidXR0b24gXCIgKyB0aGlzLmJ1aWxkQXR0cnMoYXR0cnMpICsgXCI+PHN2ZyB4bWxucz1cXFwiXCIgKyBYTUxfTkFNRV9TUEFDRSArIFwiXFxcIiB2aWV3Qm94PVxcXCIwIDAgXCIgKyBTSVpFICsgXCIgXCIgKyBTSVpFICsgXCJcXFwiIHdpZHRoPVxcXCJcIiArIFNJWkUgKyBcIlxcXCIgaGVpZ2h0PVxcXCJcIiArIFNJWkUgKyBcIlxcXCI+PHBhdGggZD1cXFwiXCIgKyAodGhpcy5vcHRpb25zLmFycm93UGF0aCB8fCBQQVRIKSArIFwiXFxcIiAvPjwvc3ZnPjwvYnV0dG9uPlwiO1xuICB9O1xuXG4gIF9wcm90bzMuaHRtbCA9IGZ1bmN0aW9uIGh0bWwoKSB7XG4gICAgdmFyIF90aGlzJGNvbmZpZyA9IHRoaXMuY29uZmlnLFxuICAgICAgICByb290Q2xhc3MgPSBfdGhpcyRjb25maWcucm9vdENsYXNzLFxuICAgICAgICBsaXN0VGFnID0gX3RoaXMkY29uZmlnLmxpc3RUYWcsXG4gICAgICAgIGFycm93cyA9IF90aGlzJGNvbmZpZy5hcnJvd3MsXG4gICAgICAgIGJlZm9yZVRyYWNrID0gX3RoaXMkY29uZmlnLmJlZm9yZVRyYWNrLFxuICAgICAgICBhZnRlclRyYWNrID0gX3RoaXMkY29uZmlnLmFmdGVyVHJhY2ssXG4gICAgICAgIHNsaWRlciA9IF90aGlzJGNvbmZpZy5zbGlkZXIsXG4gICAgICAgIGJlZm9yZVNsaWRlciA9IF90aGlzJGNvbmZpZy5iZWZvcmVTbGlkZXIsXG4gICAgICAgIGFmdGVyU2xpZGVyID0gX3RoaXMkY29uZmlnLmFmdGVyU2xpZGVyO1xuICAgIHZhciBodG1sID0gXCJcIjtcbiAgICBodG1sICs9IFwiPGRpdiBpZD1cXFwiXCIgKyB0aGlzLmlkICsgXCJcXFwiIGNsYXNzPVxcXCJcIiArIHRoaXMuYnVpbGRDbGFzc2VzKCkgKyBcIiBcIiArIChyb290Q2xhc3MgfHwgXCJcIikgKyBcIlxcXCI+XCI7XG4gICAgaHRtbCArPSBcIjxzdHlsZT5cIiArIHRoaXMuU3R5bGUuYnVpbGQoKSArIFwiPC9zdHlsZT5cIjtcblxuICAgIGlmIChzbGlkZXIpIHtcbiAgICAgIGh0bWwgKz0gYmVmb3JlU2xpZGVyIHx8IFwiXCI7XG4gICAgICBodG1sICs9IFwiPGRpdiBjbGFzcz1cXFwic3BsaWRlX19zbGlkZXJcXFwiPlwiO1xuICAgIH1cblxuICAgIGh0bWwgKz0gYmVmb3JlVHJhY2sgfHwgXCJcIjtcblxuICAgIGlmIChhcnJvd3MpIHtcbiAgICAgIGh0bWwgKz0gdGhpcy5yZW5kZXJBcnJvd3MoKTtcbiAgICB9XG5cbiAgICBodG1sICs9IFwiPGRpdiBjbGFzcz1cXFwic3BsaWRlX190cmFja1xcXCI+XCI7XG4gICAgaHRtbCArPSBcIjxcIiArIGxpc3RUYWcgKyBcIiBjbGFzcz1cXFwic3BsaWRlX19saXN0XFxcIj5cIjtcbiAgICBodG1sICs9IHRoaXMucmVuZGVyU2xpZGVzKCk7XG4gICAgaHRtbCArPSBcIjwvXCIgKyBsaXN0VGFnICsgXCI+XCI7XG4gICAgaHRtbCArPSBcIjwvZGl2PlwiO1xuICAgIGh0bWwgKz0gYWZ0ZXJUcmFjayB8fCBcIlwiO1xuXG4gICAgaWYgKHNsaWRlcikge1xuICAgICAgaHRtbCArPSBcIjwvZGl2PlwiO1xuICAgICAgaHRtbCArPSBhZnRlclNsaWRlciB8fCBcIlwiO1xuICAgIH1cblxuICAgIGh0bWwgKz0gXCI8L2Rpdj5cIjtcbiAgICByZXR1cm4gaHRtbDtcbiAgfTtcblxuICByZXR1cm4gU3BsaWRlUmVuZGVyZXI7XG59KCk7XG5cbmV4cG9ydCB7IENMQVNTRVMsIENMQVNTX0FDVElWRSwgQ0xBU1NfQVJST1csIENMQVNTX0FSUk9XUywgQ0xBU1NfQVJST1dfTkVYVCwgQ0xBU1NfQVJST1dfUFJFViwgQ0xBU1NfQ0xPTkUsIENMQVNTX0NPTlRBSU5FUiwgQ0xBU1NfRk9DVVNfSU4sIENMQVNTX0lOSVRJQUxJWkVELCBDTEFTU19MSVNULCBDTEFTU19MT0FESU5HLCBDTEFTU19ORVhULCBDTEFTU19PVkVSRkxPVywgQ0xBU1NfUEFHSU5BVElPTiwgQ0xBU1NfUEFHSU5BVElPTl9QQUdFLCBDTEFTU19QUkVWLCBDTEFTU19QUk9HUkVTUywgQ0xBU1NfUFJPR1JFU1NfQkFSLCBDTEFTU19ST09ULCBDTEFTU19TTElERSwgQ0xBU1NfU1BJTk5FUiwgQ0xBU1NfU1IsIENMQVNTX1RPR0dMRSwgQ0xBU1NfVE9HR0xFX1BBVVNFLCBDTEFTU19UT0dHTEVfUExBWSwgQ0xBU1NfVFJBQ0ssIENMQVNTX1ZJU0lCTEUsIERFRkFVTFRTLCBFVkVOVF9BQ1RJVkUsIEVWRU5UX0FSUk9XU19NT1VOVEVELCBFVkVOVF9BUlJPV1NfVVBEQVRFRCwgRVZFTlRfQVVUT1BMQVlfUEFVU0UsIEVWRU5UX0FVVE9QTEFZX1BMQVksIEVWRU5UX0FVVE9QTEFZX1BMQVlJTkcsIEVWRU5UX0NMSUNLLCBFVkVOVF9ERVNUUk9ZLCBFVkVOVF9EUkFHLCBFVkVOVF9EUkFHR0VELCBFVkVOVF9EUkFHR0lORywgRVZFTlRfRU5EX0lOREVYX0NIQU5HRUQsIEVWRU5UX0hJRERFTiwgRVZFTlRfSU5BQ1RJVkUsIEVWRU5UX0xBWllMT0FEX0xPQURFRCwgRVZFTlRfTU9VTlRFRCwgRVZFTlRfTU9WRSwgRVZFTlRfTU9WRUQsIEVWRU5UX05BVklHQVRJT05fTU9VTlRFRCwgRVZFTlRfT1ZFUkZMT1csIEVWRU5UX1BBR0lOQVRJT05fTU9VTlRFRCwgRVZFTlRfUEFHSU5BVElPTl9VUERBVEVELCBFVkVOVF9SRUFEWSwgRVZFTlRfUkVGUkVTSCwgRVZFTlRfUkVTSVpFLCBFVkVOVF9SRVNJWkVELCBFVkVOVF9TQ1JPTEwsIEVWRU5UX1NDUk9MTEVELCBFVkVOVF9TSElGVEVELCBFVkVOVF9TTElERV9LRVlET1dOLCBFVkVOVF9VUERBVEVELCBFVkVOVF9WSVNJQkxFLCBFdmVudEJpbmRlciwgRXZlbnRJbnRlcmZhY2UsIEZBREUsIExPT1AsIExUUiwgUlRMLCBSZXF1ZXN0SW50ZXJ2YWwsIFNMSURFLCBTVEFUVVNfQ0xBU1NFUywgU3BsaWRlLCBTcGxpZGVSZW5kZXJlciwgU3RhdGUsIFRUQiwgVGhyb3R0bGUsIFNwbGlkZSBhcyBkZWZhdWx0IH07XG4iLG51bGxdLCJuYW1lcyI6WyJfX2F3YWl0ZXIiLCJ0aGlzQXJnIiwiX2FyZ3VtZW50cyIsIlAiLCJnZW5lcmF0b3IiLCJhZG9wdCIsInZhbHVlIiwicmVzb2x2ZSIsIlByb21pc2UiLCJyZWplY3QiLCJmdWxmaWxsZWQiLCJzdGVwIiwibmV4dCIsImUiLCJyZWplY3RlZCIsInJlc3VsdCIsImRvbmUiLCJ0aGVuIiwiYXBwbHkiLCJTdXBwcmVzc2VkRXJyb3IiLCJlcnJvciIsInN1cHByZXNzZWQiLCJtZXNzYWdlIiwiRXJyb3IiLCJuYW1lIiwidG9wIiwiYm90dG9tIiwicmlnaHQiLCJsZWZ0IiwiYXV0byIsImJhc2VQbGFjZW1lbnRzIiwic3RhcnQiLCJlbmQiLCJjbGlwcGluZ1BhcmVudHMiLCJ2aWV3cG9ydCIsInBvcHBlciIsInJlZmVyZW5jZSIsInZhcmlhdGlvblBsYWNlbWVudHMiLCJyZWR1Y2UiLCJhY2MiLCJwbGFjZW1lbnQiLCJjb25jYXQiLCJwbGFjZW1lbnRzIiwiYmVmb3JlUmVhZCIsInJlYWQiLCJhZnRlclJlYWQiLCJiZWZvcmVNYWluIiwibWFpbiIsImFmdGVyTWFpbiIsImJlZm9yZVdyaXRlIiwid3JpdGUiLCJhZnRlcldyaXRlIiwibW9kaWZpZXJQaGFzZXMiLCJnZXROb2RlTmFtZSIsImVsZW1lbnQiLCJub2RlTmFtZSIsInRvTG93ZXJDYXNlIiwiZ2V0V2luZG93Iiwibm9kZSIsIndpbmRvdyIsInRvU3RyaW5nIiwib3duZXJEb2N1bWVudCIsImRlZmF1bHRWaWV3IiwiaXNFbGVtZW50IiwiT3duRWxlbWVudCIsIkVsZW1lbnQiLCJpc0hUTUxFbGVtZW50IiwiSFRNTEVsZW1lbnQiLCJpc1NoYWRvd1Jvb3QiLCJTaGFkb3dSb290IiwiYXBwbHlTdHlsZXMiLCJfcmVmIiwic3RhdGUiLCJPYmplY3QiLCJrZXlzIiwiZWxlbWVudHMiLCJmb3JFYWNoIiwic3R5bGUiLCJzdHlsZXMiLCJhdHRyaWJ1dGVzIiwiYXNzaWduIiwicmVtb3ZlQXR0cmlidXRlIiwic2V0QXR0cmlidXRlIiwiZWZmZWN0IiwiX3JlZjIiLCJpbml0aWFsU3R5bGVzIiwicG9zaXRpb24iLCJvcHRpb25zIiwic3RyYXRlZ3kiLCJtYXJnaW4iLCJhcnJvdyIsInN0eWxlUHJvcGVydGllcyIsImhhc093blByb3BlcnR5IiwicHJvcGVydHkiLCJhdHRyaWJ1dGUiLCJlbmFibGVkIiwicGhhc2UiLCJmbiIsInJlcXVpcmVzIiwiZ2V0QmFzZVBsYWNlbWVudCIsInNwbGl0IiwibWF4IiwiTWF0aCIsIm1pbiIsInJvdW5kIiwiZ2V0VUFTdHJpbmciLCJ1YURhdGEiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnREYXRhIiwiYnJhbmRzIiwiQXJyYXkiLCJpc0FycmF5IiwibWFwIiwiaXRlbSIsImJyYW5kIiwidmVyc2lvbiIsImpvaW4iLCJ1c2VyQWdlbnQiLCJpc0xheW91dFZpZXdwb3J0IiwidGVzdCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImluY2x1ZGVTY2FsZSIsImlzRml4ZWRTdHJhdGVneSIsImNsaWVudFJlY3QiLCJzY2FsZVgiLCJzY2FsZVkiLCJvZmZzZXRXaWR0aCIsIndpZHRoIiwib2Zmc2V0SGVpZ2h0IiwiaGVpZ2h0IiwidmlzdWFsVmlld3BvcnQiLCJhZGRWaXN1YWxPZmZzZXRzIiwieCIsIm9mZnNldExlZnQiLCJ5Iiwib2Zmc2V0VG9wIiwiZ2V0TGF5b3V0UmVjdCIsImFicyIsImNvbnRhaW5zIiwicGFyZW50IiwiY2hpbGQiLCJyb290Tm9kZSIsImdldFJvb3ROb2RlIiwiaXNTYW1lTm9kZSIsInBhcmVudE5vZGUiLCJob3N0IiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImlzVGFibGVFbGVtZW50IiwiaW5kZXhPZiIsImdldERvY3VtZW50RWxlbWVudCIsImRvY3VtZW50IiwiZG9jdW1lbnRFbGVtZW50IiwiZ2V0UGFyZW50Tm9kZSIsImFzc2lnbmVkU2xvdCIsImdldFRydWVPZmZzZXRQYXJlbnQiLCJvZmZzZXRQYXJlbnQiLCJnZXRDb250YWluaW5nQmxvY2siLCJpc0ZpcmVmb3giLCJpc0lFIiwiZWxlbWVudENzcyIsImN1cnJlbnROb2RlIiwiY3NzIiwidHJhbnNmb3JtIiwicGVyc3BlY3RpdmUiLCJjb250YWluIiwid2lsbENoYW5nZSIsImZpbHRlciIsImdldE9mZnNldFBhcmVudCIsImdldE1haW5BeGlzRnJvbVBsYWNlbWVudCIsIndpdGhpbiIsIm1hdGhNYXgiLCJtYXRoTWluIiwid2l0aGluTWF4Q2xhbXAiLCJ2IiwiZ2V0RnJlc2hTaWRlT2JqZWN0IiwibWVyZ2VQYWRkaW5nT2JqZWN0IiwicGFkZGluZ09iamVjdCIsImV4cGFuZFRvSGFzaE1hcCIsImhhc2hNYXAiLCJrZXkiLCJ0b1BhZGRpbmdPYmplY3QiLCJwYWRkaW5nIiwicmVjdHMiLCJfc3RhdGUkbW9kaWZpZXJzRGF0YSQiLCJhcnJvd0VsZW1lbnQiLCJwb3BwZXJPZmZzZXRzIiwibW9kaWZpZXJzRGF0YSIsImJhc2VQbGFjZW1lbnQiLCJheGlzIiwiaXNWZXJ0aWNhbCIsImxlbiIsImFycm93UmVjdCIsIm1pblByb3AiLCJtYXhQcm9wIiwiZW5kRGlmZiIsInN0YXJ0RGlmZiIsImFycm93T2Zmc2V0UGFyZW50IiwiY2xpZW50U2l6ZSIsImNsaWVudEhlaWdodCIsImNsaWVudFdpZHRoIiwiY2VudGVyVG9SZWZlcmVuY2UiLCJjZW50ZXIiLCJvZmZzZXQiLCJheGlzUHJvcCIsImNlbnRlck9mZnNldCIsIl9vcHRpb25zJGVsZW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwicmVxdWlyZXNJZkV4aXN0cyIsImdldFZhcmlhdGlvbiIsInVuc2V0U2lkZXMiLCJyb3VuZE9mZnNldHNCeURQUiIsIndpbiIsImRwciIsImRldmljZVBpeGVsUmF0aW8iLCJtYXBUb1N0eWxlcyIsIl9PYmplY3QkYXNzaWduMiIsInBvcHBlclJlY3QiLCJ2YXJpYXRpb24iLCJvZmZzZXRzIiwiZ3B1QWNjZWxlcmF0aW9uIiwiYWRhcHRpdmUiLCJyb3VuZE9mZnNldHMiLCJpc0ZpeGVkIiwiX29mZnNldHMkeCIsIl9vZmZzZXRzJHkiLCJfcmVmMyIsImhhc1giLCJoYXNZIiwic2lkZVgiLCJzaWRlWSIsImhlaWdodFByb3AiLCJ3aWR0aFByb3AiLCJvZmZzZXRZIiwib2Zmc2V0WCIsImNvbW1vblN0eWxlcyIsIl9yZWY0IiwiX09iamVjdCRhc3NpZ24iLCJjb21wdXRlU3R5bGVzIiwiX3JlZjUiLCJfb3B0aW9ucyRncHVBY2NlbGVyYXQiLCJfb3B0aW9ucyRhZGFwdGl2ZSIsIl9vcHRpb25zJHJvdW5kT2Zmc2V0cyIsImRhdGEiLCJwYXNzaXZlIiwiaW5zdGFuY2UiLCJfb3B0aW9ucyRzY3JvbGwiLCJzY3JvbGwiLCJfb3B0aW9ucyRyZXNpemUiLCJyZXNpemUiLCJzY3JvbGxQYXJlbnRzIiwic2Nyb2xsUGFyZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsInVwZGF0ZSIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJoYXNoIiwiZ2V0T3Bwb3NpdGVQbGFjZW1lbnQiLCJyZXBsYWNlIiwibWF0Y2hlZCIsImdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50IiwiZ2V0V2luZG93U2Nyb2xsIiwic2Nyb2xsTGVmdCIsInBhZ2VYT2Zmc2V0Iiwic2Nyb2xsVG9wIiwicGFnZVlPZmZzZXQiLCJnZXRXaW5kb3dTY3JvbGxCYXJYIiwiZ2V0Vmlld3BvcnRSZWN0IiwiaHRtbCIsImxheW91dFZpZXdwb3J0IiwiZ2V0RG9jdW1lbnRSZWN0IiwiX2VsZW1lbnQkb3duZXJEb2N1bWVuIiwid2luU2Nyb2xsIiwiYm9keSIsInNjcm9sbFdpZHRoIiwic2Nyb2xsSGVpZ2h0IiwiZGlyZWN0aW9uIiwiaXNTY3JvbGxQYXJlbnQiLCJfZ2V0Q29tcHV0ZWRTdHlsZSIsIm92ZXJmbG93Iiwib3ZlcmZsb3dYIiwib3ZlcmZsb3dZIiwiZ2V0U2Nyb2xsUGFyZW50IiwibGlzdFNjcm9sbFBhcmVudHMiLCJsaXN0IiwiaXNCb2R5IiwidGFyZ2V0IiwidXBkYXRlZExpc3QiLCJyZWN0VG9DbGllbnRSZWN0IiwicmVjdCIsImdldElubmVyQm91bmRpbmdDbGllbnRSZWN0IiwiY2xpZW50VG9wIiwiY2xpZW50TGVmdCIsImdldENsaWVudFJlY3RGcm9tTWl4ZWRUeXBlIiwiY2xpcHBpbmdQYXJlbnQiLCJnZXRDbGlwcGluZ1BhcmVudHMiLCJjYW5Fc2NhcGVDbGlwcGluZyIsImNsaXBwZXJFbGVtZW50IiwiZ2V0Q2xpcHBpbmdSZWN0IiwiYm91bmRhcnkiLCJyb290Qm91bmRhcnkiLCJtYWluQ2xpcHBpbmdQYXJlbnRzIiwiZmlyc3RDbGlwcGluZ1BhcmVudCIsImNsaXBwaW5nUmVjdCIsImFjY1JlY3QiLCJjb21wdXRlT2Zmc2V0cyIsImNvbW1vblgiLCJjb21tb25ZIiwibWFpbkF4aXMiLCJkZXRlY3RPdmVyZmxvdyIsIl9vcHRpb25zIiwiX29wdGlvbnMkcGxhY2VtZW50IiwiX29wdGlvbnMkc3RyYXRlZ3kiLCJfb3B0aW9ucyRib3VuZGFyeSIsIl9vcHRpb25zJHJvb3RCb3VuZGFyeSIsIl9vcHRpb25zJGVsZW1lbnRDb250ZSIsImVsZW1lbnRDb250ZXh0IiwiX29wdGlvbnMkYWx0Qm91bmRhcnkiLCJhbHRCb3VuZGFyeSIsIl9vcHRpb25zJHBhZGRpbmciLCJhbHRDb250ZXh0IiwiY2xpcHBpbmdDbGllbnRSZWN0IiwiY29udGV4dEVsZW1lbnQiLCJyZWZlcmVuY2VDbGllbnRSZWN0IiwicG9wcGVyQ2xpZW50UmVjdCIsImVsZW1lbnRDbGllbnRSZWN0Iiwib3ZlcmZsb3dPZmZzZXRzIiwib2Zmc2V0RGF0YSIsIm11bHRpcGx5IiwiY29tcHV0ZUF1dG9QbGFjZW1lbnQiLCJmbGlwVmFyaWF0aW9ucyIsIl9vcHRpb25zJGFsbG93ZWRBdXRvUCIsImFsbG93ZWRBdXRvUGxhY2VtZW50cyIsImFsbFBsYWNlbWVudHMiLCJhbGxvd2VkUGxhY2VtZW50cyIsImxlbmd0aCIsIm92ZXJmbG93cyIsInNvcnQiLCJhIiwiYiIsImdldEV4cGFuZGVkRmFsbGJhY2tQbGFjZW1lbnRzIiwib3Bwb3NpdGVQbGFjZW1lbnQiLCJmbGlwIiwiX3NraXAiLCJfb3B0aW9ucyRtYWluQXhpcyIsImNoZWNrTWFpbkF4aXMiLCJfb3B0aW9ucyRhbHRBeGlzIiwiYWx0QXhpcyIsImNoZWNrQWx0QXhpcyIsInNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyIsImZhbGxiYWNrUGxhY2VtZW50cyIsIl9vcHRpb25zJGZsaXBWYXJpYXRpbyIsInByZWZlcnJlZFBsYWNlbWVudCIsImlzQmFzZVBsYWNlbWVudCIsInJlZmVyZW5jZVJlY3QiLCJjaGVja3NNYXAiLCJNYXAiLCJtYWtlRmFsbGJhY2tDaGVja3MiLCJmaXJzdEZpdHRpbmdQbGFjZW1lbnQiLCJpIiwiX2Jhc2VQbGFjZW1lbnQiLCJpc1N0YXJ0VmFyaWF0aW9uIiwibWFpblZhcmlhdGlvblNpZGUiLCJhbHRWYXJpYXRpb25TaWRlIiwiY2hlY2tzIiwicHVzaCIsImV2ZXJ5IiwiY2hlY2siLCJzZXQiLCJudW1iZXJPZkNoZWNrcyIsIl9sb29wIiwiX2kiLCJmaXR0aW5nUGxhY2VtZW50IiwiZmluZCIsImdldCIsInNsaWNlIiwiX3JldCIsInJlc2V0IiwiZ2V0U2lkZU9mZnNldHMiLCJwcmV2ZW50ZWRPZmZzZXRzIiwiaXNBbnlTaWRlRnVsbHlDbGlwcGVkIiwic29tZSIsInNpZGUiLCJoaWRlIiwicHJldmVudE92ZXJmbG93IiwicmVmZXJlbmNlT3ZlcmZsb3ciLCJwb3BwZXJBbHRPdmVyZmxvdyIsInJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0cyIsInBvcHBlckVzY2FwZU9mZnNldHMiLCJpc1JlZmVyZW5jZUhpZGRlbiIsImhhc1BvcHBlckVzY2FwZWQiLCJkaXN0YW5jZUFuZFNraWRkaW5nVG9YWSIsImludmVydERpc3RhbmNlIiwic2tpZGRpbmciLCJkaXN0YW5jZSIsIl9vcHRpb25zJG9mZnNldCIsIl9kYXRhJHN0YXRlJHBsYWNlbWVudCIsImdldEFsdEF4aXMiLCJfb3B0aW9ucyR0ZXRoZXIiLCJ0ZXRoZXIiLCJfb3B0aW9ucyR0ZXRoZXJPZmZzZXQiLCJ0ZXRoZXJPZmZzZXQiLCJ0ZXRoZXJPZmZzZXRWYWx1ZSIsIm5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZSIsIm9mZnNldE1vZGlmaWVyU3RhdGUiLCJfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQiLCJtYWluU2lkZSIsImFsdFNpZGUiLCJhZGRpdGl2ZSIsIm1pbkxlbiIsIm1heExlbiIsImFycm93UGFkZGluZ09iamVjdCIsImFycm93UGFkZGluZ01pbiIsImFycm93UGFkZGluZ01heCIsImFycm93TGVuIiwibWluT2Zmc2V0IiwibWF4T2Zmc2V0IiwiY2xpZW50T2Zmc2V0Iiwib2Zmc2V0TW9kaWZpZXJWYWx1ZSIsInRldGhlck1pbiIsInRldGhlck1heCIsInByZXZlbnRlZE9mZnNldCIsIl9vZmZzZXRNb2RpZmllclN0YXRlJDIiLCJfbWFpblNpZGUiLCJfYWx0U2lkZSIsIl9vZmZzZXQiLCJfbGVuIiwiX21pbiIsIl9tYXgiLCJpc09yaWdpblNpZGUiLCJfb2Zmc2V0TW9kaWZpZXJWYWx1ZSIsIl90ZXRoZXJNaW4iLCJfdGV0aGVyTWF4IiwiX3ByZXZlbnRlZE9mZnNldCIsImdldEhUTUxFbGVtZW50U2Nyb2xsIiwiZ2V0Tm9kZVNjcm9sbCIsImlzRWxlbWVudFNjYWxlZCIsImdldENvbXBvc2l0ZVJlY3QiLCJlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCIsImlzT2Zmc2V0UGFyZW50QW5FbGVtZW50Iiwib2Zmc2V0UGFyZW50SXNTY2FsZWQiLCJvcmRlciIsIm1vZGlmaWVycyIsInZpc2l0ZWQiLCJTZXQiLCJtb2RpZmllciIsImFkZCIsImRlcCIsImhhcyIsImRlcE1vZGlmaWVyIiwib3JkZXJNb2RpZmllcnMiLCJvcmRlcmVkTW9kaWZpZXJzIiwiZGVib3VuY2UiLCJwZW5kaW5nIiwidW5kZWZpbmVkIiwibWVyZ2VCeU5hbWUiLCJtZXJnZWQiLCJjdXJyZW50IiwiZXhpc3RpbmciLCJERUZBVUxUX09QVElPTlMiLCJhcmVWYWxpZEVsZW1lbnRzIiwiYXJndW1lbnRzIiwiYXJncyIsIl9rZXkiLCJwb3BwZXJHZW5lcmF0b3IiLCJnZW5lcmF0b3JPcHRpb25zIiwiX2dlbmVyYXRvck9wdGlvbnMiLCJfZ2VuZXJhdG9yT3B0aW9ucyRkZWYiLCJkZWZhdWx0TW9kaWZpZXJzIiwiX2dlbmVyYXRvck9wdGlvbnMkZGVmMiIsImRlZmF1bHRPcHRpb25zIiwiY3JlYXRlUG9wcGVyIiwiZWZmZWN0Q2xlYW51cEZucyIsImlzRGVzdHJveWVkIiwic2V0T3B0aW9ucyIsInNldE9wdGlvbnNBY3Rpb24iLCJjbGVhbnVwTW9kaWZpZXJFZmZlY3RzIiwibSIsInJ1bk1vZGlmaWVyRWZmZWN0cyIsImZvcmNlVXBkYXRlIiwiX3N0YXRlJGVsZW1lbnRzIiwiaW5kZXgiLCJfc3RhdGUkb3JkZXJlZE1vZGlmaWUiLCJfc3RhdGUkb3JkZXJlZE1vZGlmaWUyIiwiZGVzdHJveSIsIm9uRmlyc3RVcGRhdGUiLCJfcmVmJG9wdGlvbnMiLCJjbGVhbnVwRm4iLCJub29wRm4iLCJldmVudExpc3RlbmVycyIsImVsZW1lbnRNYXAiLCJEYXRhIiwiaW5zdGFuY2VNYXAiLCJzaXplIiwiY29uc29sZSIsImZyb20iLCJyZW1vdmUiLCJkZWxldGUiLCJyb290IiwiZmFjdG9yeSIsIm1vZHVsZSIsImV4cG9ydHMiLCJUb2FzdGlmeSIsInRoaXMiLCJnbG9iYWwiLCJsaWIiLCJpbml0IiwiZGVmYXVsdHMiLCJvbGRlc3RGaXJzdCIsInRleHQiLCJkdXJhdGlvbiIsInNlbGVjdG9yIiwiY2FsbGJhY2siLCJkZXN0aW5hdGlvbiIsIm5ld1dpbmRvdyIsImNsb3NlIiwiZ3Jhdml0eSIsInBvc2l0aW9uTGVmdCIsImJhY2tncm91bmRDb2xvciIsImF2YXRhciIsImNsYXNzTmFtZSIsInN0b3BPbkZvY3VzIiwib25DbGljayIsImVzY2FwZU1hcmt1cCIsImFyaWFMaXZlIiwiYmFja2dyb3VuZCIsInByb3RvdHlwZSIsInRvYXN0aWZ5IiwiY29uc3RydWN0b3IiLCJ0b2FzdEVsZW1lbnQiLCJidWlsZFRvYXN0IiwiZGl2RWxlbWVudCIsImNyZWF0ZUVsZW1lbnQiLCJ3YXJuIiwibm9kZVR5cGUiLCJOb2RlIiwiRUxFTUVOVF9OT0RFIiwiYXBwZW5kQ2hpbGQiLCJpbm5lclRleHQiLCJpbm5lckhUTUwiLCJhdmF0YXJFbGVtZW50Iiwic3JjIiwiaW5zZXJ0QWRqYWNlbnRFbGVtZW50IiwiY2xvc2VFbGVtZW50IiwidHlwZSIsImV2ZW50Iiwic3RvcFByb3BhZ2F0aW9uIiwicmVtb3ZlRWxlbWVudCIsImNsZWFyVGltZW91dCIsInRpbWVPdXRWYWx1ZSIsImJpbmQiLCJpbm5lcldpZHRoIiwic2NyZWVuIiwic2VsZiIsInNldFRpbWVvdXQiLCJvcGVuIiwibG9jYXRpb24iLCJnZXRBeGlzT2Zmc2V0QVZhbHVlIiwieE9mZnNldCIsInlPZmZzZXQiLCJzaG93VG9hc3QiLCJyb290RWxlbWVudCIsImdldEVsZW1lbnRCeUlkIiwiZWxlbWVudFRvSW5zZXJ0IiwiZmlyc3RDaGlsZCIsImxhc3RDaGlsZCIsImluc2VydEJlZm9yZSIsInJlcG9zaXRpb24iLCJoaWRlVG9hc3QiLCJyZW1vdmVDaGlsZCIsImNhbGwiLCJ0b3BMZWZ0T2Zmc2V0U2l6ZSIsInRvcFJpZ2h0T2Zmc2V0U2l6ZSIsIm9mZnNldFNpemUiLCJhbGxUb2FzdHMiLCJnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIiwiY2xhc3NVc2VkIiwiY29udGFpbnNDbGFzcyIsInN1YnN0ciIsImlzTmFOIiwiZWxlbSIsInlvdXJDbGFzcyIsInRyaW0iLCJUb2FzdCIsInZhcmlhbnQiLCJnZXRDb2xvckJ5TmFtZSIsImNvbG9yIiwic2hvdyIsInF1ZXJ5U2VsZWN0b3JUeXBlZCIsInBhcmVudHMiLCJlbCIsImN1cnJlbnRFbCIsInBhcmVudEVsZW1lbnQiLCJtYXRjaGVzIiwiUHJvZHVjdE1hbmFnZXIiLCJCQVNFX1VSTCIsIkRPTSIsInRhYmxlIiwidEJvZHkiLCJpbnB1dE5hbWUiLCJpbnB1dFByaWNlIiwiYnRuQWRkIiwidGVtcGxhdGVSb3ciLCJidG5TYXZlIiwiYnRuUmVzZXQiLCJtb2RhbEVkaXQiLCJmb3JtRWRpdCIsImlucHV0RWRpdE5hbWUiLCJpbnB1dEVkaXRQcmljZSIsImlucHV0RWRpdElkIiwiaW5wdXRFZGl0UG9zaXRpb24iLCJidG5VcGRhdGUiLCJtb2RhbERlbGV0ZSIsInByb2R1Y3ROYW1lIiwiYnRuQ29uZmlybURlbGV0ZSIsImxvZyIsImJzTW9kYWxFZGl0IiwiTW9kYWwiLCJiYWNrZHJvcCIsImtleWJvYXJkIiwiYnNNb2RhbERlbGV0ZSIsImluaXRQcm9kdWN0cyIsIm9uQ2xpY2tSZXNldCIsIm9uQ2xpY2tTYXZlIiwib25DbGlja0FkZCIsImRpc2FibGVkIiwib25DbGlja0NvbmZpcm1EZWxldGUiLCJvblN1Ym1pdEVkaXQiLCJvbktleVVwIiwiY3VycmVudFRhcmdldCIsInJlc2V0UHJvZHVjdHMiLCJzdWNjZXNzIiwibXNnIiwibG9hZFByb2R1Y3RzIiwiYnRuRWwiLCJpY29uIiwiY2xhc3NMaXN0Iiwic2F2ZVByb2R1Y3RzIiwicHJldmVudERlZmF1bHQiLCJwcm9kdWN0IiwicHJpY2UiLCJOdW1iZXIiLCJfaWQiLCJ1cGRhdGVQcm9kdWN0IiwicmVzZXRGaWVsZHMiLCJjcmVhdGVQcm9kdWN0IiwiZGlzYWJsZU5vbkZ1bmN0aW9uYWxCdXR0b25zIiwib25DbGlja0VkaXQiLCJjdXJyZW50Um93IiwiaWQiLCJTdHJpbmciLCJkYXRhc2V0IiwiZ2V0UHJvZHVjdCIsInNob3dNb2RhbEVkaXQiLCJvbkNsaWNrUmVtb3ZlIiwidGV4dENvbnRlbnQiLCJkZWxldGVQcm9kdWN0Iiwib25DbGlja01vdmVVcCIsImN1cnJlbnRSb3dFbCIsInByZXZpb3VzRWxlbWVudFNpYmxpbmciLCJiZWZvcmUiLCJvbkNsaWNrTW92ZURvd24iLCJuZXh0RWxlbWVudFNpYmxpbmciLCJhZnRlciIsIm9uTW91c2VEb3duRHJhZyIsImRyYWdnYWJsZSIsIm9uTW91c2VVcERyYWciLCJvbkRyYWdTdGFydCIsImlkeCIsImNoaWxkcmVuIiwiX2EiLCJkYXRhVHJhbnNmZXIiLCJzZXREYXRhIiwib25EcmFnT3ZlciIsIm9uRHJvcCIsInRhcmdldElkeCIsInNvdXJjZUlkeCIsInBhcnNlSW50IiwiZ2V0RGF0YSIsImRyYWdnZWRFbCIsInJlc3BvbnNlIiwiZmV0Y2giLCJtZXRob2QiLCJoZWFkZXJzIiwiSlNPTiIsInN0cmluZ2lmeSIsIm9rIiwianNvbiIsInNhdmUiLCJnZXRQcm9kdWN0cyIsInByb2R1Y3RzIiwiYWRkUHJvZHVjdCIsInRyRWwiLCJjb250ZW50IiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJjbG9uZU5vZGUiLCJ0ZE5hbWVFbCIsInRkUHJpY2VFbCIsImJ0blJlbW92ZUVsIiwiYnRuTW92ZVVwRWwiLCJidG5Nb3ZlRG93bkVsIiwiYnRuRHJhZ0VsIiwiYnRuRWRpdEVsIiwicXVlcnlTZWxlY3RvckFsbCIsInRyIiwiYnRuTW92ZVVwIiwiYnRuTW92ZURvd24iLCJfZGVmaW5lUHJvcGVydGllcyIsInByb3BzIiwiZGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImRlZmluZVByb3BlcnR5IiwiX2NyZWF0ZUNsYXNzIiwiQ29uc3RydWN0b3IiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJNRURJQV9QUkVGRVJTX1JFRFVDRURfTU9USU9OIiwiQ1JFQVRFRCIsIk1PVU5URUQiLCJJRExFIiwiTU9WSU5HIiwiU0NST0xMSU5HIiwiRFJBR0dJTkciLCJERVNUUk9ZRUQiLCJTVEFURVMiLCJlbXB0eSIsImFycmF5IiwiYXJyYXlMaWtlIiwiZnVuYyIsIm5leHRUaWNrIiwibm9vcCIsInJhZiIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsInR5cGVPZiIsInN1YmplY3QiLCJpc09iamVjdCIsImlzTnVsbCIsImlzRnVuY3Rpb24iLCJpc1N0cmluZyIsImlzVW5kZWZpbmVkIiwidG9BcnJheSIsInZhbHVlcyIsIml0ZXJhdGVlIiwiaW5jbHVkZXMiLCJpdGVtcyIsInRvZ2dsZUNsYXNzIiwiZWxtIiwiY2xhc3NlcyIsImFkZENsYXNzIiwiYXBwZW5kIiwibm9kZXMiLCJyZWYiLCJjaGlsZHJlbjIiLCJvd25LZXlzIiwiZm9yT3duIiwib2JqZWN0IiwicmV2ZXJzZSIsInNvdXJjZSIsIm1lcmdlIiwib21pdCIsImVsbXMiLCJhdHRycyIsImF0dHIiLCJ2YWx1ZTIiLCJjcmVhdGUiLCJ0YWciLCJwcm9wIiwiZGlzcGxheSIsImRpc3BsYXkyIiwiZm9jdXMiLCJwcmV2ZW50U2Nyb2xsIiwiZ2V0QXR0cmlidXRlIiwiaGFzQ2xhc3MiLCJwYXJzZUh0bWwiLCJET01QYXJzZXIiLCJwYXJzZUZyb21TdHJpbmciLCJwcmV2ZW50Iiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwicXVlcnkiLCJxdWVyeUFsbCIsInJlbW92ZUNsYXNzIiwidGltZU9mIiwidGltZVN0YW1wIiwidW5pdCIsIlBST0pFQ1RfQ09ERSIsIkRBVEFfQVRUUklCVVRFIiwiYXNzZXJ0IiwiY29uZGl0aW9uIiwiZmxvb3IiLCJjZWlsIiwiYXBwcm94aW1hdGVseUVxdWFsIiwiZXBzaWxvbiIsImJldHdlZW4iLCJudW1iZXIiLCJleGNsdXNpdmUiLCJtaW5pbXVtIiwibWF4aW11bSIsImNsYW1wIiwic2lnbiIsImZvcm1hdCIsInN0cmluZyIsInJlcGxhY2VtZW50cyIsInJlcGxhY2VtZW50IiwicGFkIiwiaWRzIiwidW5pcXVlSWQiLCJwcmVmaXgiLCJFdmVudEJpbmRlciIsImxpc3RlbmVycyIsInRhcmdldHMiLCJldmVudHMiLCJmb3JFYWNoRXZlbnQiLCJuYW1lc3BhY2UiLCJpc0V2ZW50VGFyZ2V0IiwicmVtb3ZlciIsInVuYmluZCIsImxpc3RlbmVyIiwiZGlzcGF0Y2giLCJkZXRhaWwiLCJidWJibGVzIiwiQ3VzdG9tRXZlbnQiLCJjcmVhdGVFdmVudCIsImluaXRDdXN0b21FdmVudCIsImRpc3BhdGNoRXZlbnQiLCJldmVudHMyIiwiZXZlbnROUyIsImZyYWdtZW50IiwiRVZFTlRfTU9VTlRFRCIsIkVWRU5UX1JFQURZIiwiRVZFTlRfTU9WRSIsIkVWRU5UX01PVkVEIiwiRVZFTlRfQ0xJQ0siLCJFVkVOVF9BQ1RJVkUiLCJFVkVOVF9JTkFDVElWRSIsIkVWRU5UX1ZJU0lCTEUiLCJFVkVOVF9ISURERU4iLCJFVkVOVF9SRUZSRVNIIiwiRVZFTlRfVVBEQVRFRCIsIkVWRU5UX1JFU0laRSIsIkVWRU5UX1JFU0laRUQiLCJFVkVOVF9EUkFHIiwiRVZFTlRfRFJBR0dJTkciLCJFVkVOVF9EUkFHR0VEIiwiRVZFTlRfU0NST0xMIiwiRVZFTlRfU0NST0xMRUQiLCJFVkVOVF9PVkVSRkxPVyIsIkVWRU5UX0RFU1RST1kiLCJFVkVOVF9BUlJPV1NfTU9VTlRFRCIsIkVWRU5UX0FSUk9XU19VUERBVEVEIiwiRVZFTlRfUEFHSU5BVElPTl9NT1VOVEVEIiwiRVZFTlRfUEFHSU5BVElPTl9VUERBVEVEIiwiRVZFTlRfTkFWSUdBVElPTl9NT1VOVEVEIiwiRVZFTlRfQVVUT1BMQVlfUExBWSIsIkVWRU5UX0FVVE9QTEFZX1BMQVlJTkciLCJFVkVOVF9BVVRPUExBWV9QQVVTRSIsIkVWRU5UX0xBWllMT0FEX0xPQURFRCIsIkVWRU5UX1NMSURFX0tFWURPV04iLCJFVkVOVF9TSElGVEVEIiwiRVZFTlRfRU5EX0lOREVYX0NIQU5HRUQiLCJFdmVudEludGVyZmFjZSIsIlNwbGlkZTIiLCJidXMiLCJjcmVhdGVEb2N1bWVudEZyYWdtZW50IiwiYmluZGVyIiwib24iLCJlbWl0Iiwib2ZmIiwiUmVxdWVzdEludGVydmFsIiwiaW50ZXJ2YWwiLCJvbkludGVydmFsIiwib25VcGRhdGUiLCJsaW1pdCIsIm5vdyIsIkRhdGUiLCJzdGFydFRpbWUiLCJyYXRlIiwicGF1c2VkIiwiY291bnQiLCJwYXVzZSIsInJlc3VtZSIsImNhbmNlbCIsInJld2luZCIsImNhbmNlbEFuaW1hdGlvbkZyYW1lIiwidGltZSIsImlzUGF1c2VkIiwiU3RhdGUiLCJpbml0aWFsU3RhdGUiLCJpcyIsInN0YXRlcyIsIlRocm90dGxlIiwiTWVkaWEiLCJDb21wb25lbnRzMiIsImJyZWFrcG9pbnRzIiwicmVkdWNlZE1vdGlvbiIsInF1ZXJpZXMiLCJzZXR1cCIsImlzTWluIiwibWVkaWFRdWVyeSIsIm4iLCJyZWdpc3RlciIsImNvbXBsZXRlbHkiLCJvcHRpb25zMiIsInF1ZXJ5TGlzdCIsIm1hdGNoTWVkaWEiLCJkZXN0cm95ZWQiLCJtZXJnZWQyIiwiZW50cnkiLCJtb3VudCIsInJlZnJlc2giLCJlbmFibGUiLCJvcHRzIiwiYmFzZSIsIm5vdGlmeSIsImdldFByb3RvdHlwZU9mIiwiQVJST1ciLCJBUlJPV19MRUZUIiwiQVJST1dfUklHSFQiLCJBUlJPV19VUCIsIkFSUk9XX0RPV04iLCJSVEwiLCJUVEIiLCJPUklFTlRBVElPTl9NQVAiLCJYIiwiWSIsIkFycm93TGVmdCIsIkFycm93UmlnaHQiLCJEaXJlY3Rpb24iLCJheGlzT25seSIsIm1hdGNoIiwiY2hhckF0IiwidG9VcHBlckNhc2UiLCJvcmllbnQiLCJST0xFIiwiVEFCX0lOREVYIiwiRElTQUJMRUQiLCJBUklBX1BSRUZJWCIsIkFSSUFfQ09OVFJPTFMiLCJBUklBX0NVUlJFTlQiLCJBUklBX1NFTEVDVEVEIiwiQVJJQV9MQUJFTCIsIkFSSUFfTEFCRUxMRURCWSIsIkFSSUFfSElEREVOIiwiQVJJQV9PUklFTlRBVElPTiIsIkFSSUFfUk9MRURFU0NSSVBUSU9OIiwiQVJJQV9MSVZFIiwiQVJJQV9CVVNZIiwiQVJJQV9BVE9NSUMiLCJBTExfQVRUUklCVVRFUyIsIkNMQVNTX1BSRUZJWCIsIlNUQVRVU19DTEFTU19QUkVGSVgiLCJDTEFTU19ST09UIiwiQ0xBU1NfVFJBQ0siLCJDTEFTU19MSVNUIiwiQ0xBU1NfU0xJREUiLCJDTEFTU19DTE9ORSIsIkNMQVNTX0NPTlRBSU5FUiIsIkNMQVNTX0FSUk9XUyIsIkNMQVNTX0FSUk9XIiwiQ0xBU1NfQVJST1dfUFJFViIsIkNMQVNTX0FSUk9XX05FWFQiLCJDTEFTU19QQUdJTkFUSU9OIiwiQ0xBU1NfUEFHSU5BVElPTl9QQUdFIiwiQ0xBU1NfUFJPR1JFU1MiLCJDTEFTU19QUk9HUkVTU19CQVIiLCJDTEFTU19UT0dHTEUiLCJDTEFTU19TUElOTkVSIiwiQ0xBU1NfU1IiLCJDTEFTU19JTklUSUFMSVpFRCIsIkNMQVNTX0FDVElWRSIsIkNMQVNTX1BSRVYiLCJDTEFTU19ORVhUIiwiQ0xBU1NfVklTSUJMRSIsIkNMQVNTX0xPQURJTkciLCJDTEFTU19GT0NVU19JTiIsIkNMQVNTX09WRVJGTE9XIiwiU1RBVFVTX0NMQVNTRVMiLCJDTEFTU0VTIiwic2xpZGUiLCJjbG9uZSIsImFycm93cyIsInByZXYiLCJwYWdpbmF0aW9uIiwicGFnZSIsInNwaW5uZXIiLCJjbG9zZXN0IiwiRlJJQ1RJT04iLCJMT0dfSU5URVJWQUwiLCJQT0lOVEVSX0RPV05fRVZFTlRTIiwiUE9JTlRFUl9NT1ZFX0VWRU5UUyIsIlBPSU5URVJfVVBfRVZFTlRTIiwiRWxlbWVudHMiLCJfRXZlbnRJbnRlcmZhY2UiLCJpMThuIiwic2xpZGVzIiwicm9vdENsYXNzZXMiLCJ0cmFja0NsYXNzZXMiLCJ0cmFjayIsImlzVXNpbmdLZXkiLCJjb2xsZWN0IiwiY2FwdHVyZSIsImdldENsYXNzZXMiLCJsYWJlbCIsImxhYmVsbGVkYnkiLCJiYXIiLCJ0b2dnbGUiLCJyb2xlIiwidGFnTmFtZSIsImNhcm91c2VsIiwiZHJhZyIsImlzTmF2aWdhdGlvbiIsIlNMSURFIiwiTE9PUCIsIkZBREUiLCJTbGlkZSQxIiwic2xpZGVJbmRleCIsIkNvbXBvbmVudHMiLCJ1cGRhdGVPbk1vdmUiLCJzbGlkZUZvY3VzIiwiaXNDbG9uZSIsImNvbnRhaW5lciIsInNsaWRlTGFiZWwiLCJsaXN0ZW4iLCJpbml0TmF2aWdhdGlvbiIsIm9uTW92ZSIsImNvbnRyb2xzIiwic3BsaWRlcyIsIlNsaWRlMiIsInNwbGlkZSIsIlNsaWRlcyIsImdldEF0Iiwic2xpZGVYIiwiY3VyciIsInVwZGF0ZUFjdGl2aXR5IiwidXBkYXRlVmlzaWJpbGl0eSIsImFjdGl2ZSIsImlzQWN0aXZlIiwidmlzaWJsZSIsImlzVmlzaWJsZSIsImhpZGRlbiIsImZvY3VzYWJsZU5vZGVzIiwiYWN0aXZlRWxlbWVudCIsInN0eWxlJDEiLCJ1c2VDb250YWluZXIiLCJjbG9uZVN0YXR1cyIsInRyYWNrUmVjdCIsInNsaWRlUmVjdCIsImlzV2l0aGluIiwiZGlmZiIsIl9FdmVudEludGVyZmFjZTIiLCJfQ29tcG9uZW50czIkRWxlbWVudHMiLCJTbGlkZXMyIiwiZm9yRWFjaCQxIiwiU2xpZGUxIiwiZXhjbHVkZUNsb25lcyIsImdldEluIiwiQ29udHJvbGxlciIsInRvSW5kZXgiLCJoYXNGb2N1cyIsInBlclBhZ2UiLCJvYnNlcnZlSW1hZ2VzIiwicmVtb3ZlJDEiLCJtYXRjaGVyIiwiaW1hZ2VzIiwiaW1nIiwiZ2V0TGVuZ3RoIiwiaXNFbm91Z2giLCJMYXlvdXQiLCJfRXZlbnRJbnRlcmZhY2UzIiwiX0NvbXBvbmVudHMyJEVsZW1lbnRzMiIsInN0eWxlU2xpZGVzIiwidmVydGljYWwiLCJyb290UmVjdCIsImNzc1BhZGRpbmciLCJmb3JjZSIsIm5ld1JlY3QiLCJjc3NUcmFja0hlaWdodCIsImdhcCIsImNzc1NsaWRlV2lkdGgiLCJjc3NTbGlkZUhlaWdodCIsImlzT3ZlcmZsb3ciLCJjc3NIZWlnaHQiLCJoZWlnaHRSYXRpbyIsImF1dG9XaWR0aCIsImZpeGVkV2lkdGgiLCJjc3NTbGlkZVNpemUiLCJmaXhlZEhlaWdodCIsImF1dG9IZWlnaHQiLCJsaXN0U2l6ZSIsInNsaWRlU2l6ZSIsIndpdGhvdXRHYXAiLCJTbGlkZSIsImdldEdhcCIsInRvdGFsU2l6ZSIsInNsaWRlclNpemUiLCJwYXJzZUZsb2F0IiwiZ2V0UGFkZGluZyIsIk1VTFRJUExJRVIiLCJDbG9uZXMiLCJjbG9uZXMiLCJjbG9uZUNvdW50IiwicmVtb3VudCIsIm9ic2VydmUiLCJjb21wdXRlQ2xvbmVDb3VudCIsImdlbmVyYXRlIiwiaXNIZWFkIiwiY2xvbmVEZWVwIiwiY2xvbmVzMiIsImZpeGVkU2l6ZSIsImZpeGVkQ291bnQiLCJNb3ZlIiwiX0V2ZW50SW50ZXJmYWNlNCIsIl9Db21wb25lbnRzMiRMYXlvdXQiLCJfQ29tcG9uZW50czIkRGlyZWN0aW8iLCJfQ29tcG9uZW50czIkRWxlbWVudHMzIiwiVHJhbnNpdGlvbiIsImlzQnVzeSIsIlNjcm9sbCIsImp1bXAiLCJtb3ZlIiwiZGVzdCIsImNhblNoaWZ0IiwidHJhbnNsYXRlIiwic2hpZnQiLCJnZXRQb3NpdGlvbiIsInRvUG9zaXRpb24iLCJwcmV2ZW50TG9vcCIsImxvb3AiLCJleGNlZWRlZE1heCIsImdldEVuZCIsImV4Y2VlZGVkTWluIiwiYmFja3dhcmRzIiwiZXhjZXNzIiwiZ2V0TGltaXQiLCJtaW5EaXN0YW5jZSIsIkluZmluaXR5IiwidHJpbW1pbmciLCJ0cmltU3BhY2UiLCJzaGlmdGVkIiwiZXhjZWVkZWRMaW1pdCIsIl9FdmVudEludGVyZmFjZTUiLCJfQ29tcG9uZW50czIkU2xpZGVzIiwib21pdEVuZCIsImlzTG9vcCIsImlzU2xpZGUiLCJnZXROZXh0IiwiZ2V0QWRqYWNlbnQiLCJnZXRQcmV2IiwiY3VyckluZGV4IiwiZW5kSW5kZXgiLCJwcmV2SW5kZXgiLCJzbGlkZUNvdW50IiwicGVyTW92ZSIsIm9uUmVzaXplZCIsImdvIiwiY29udHJvbCIsImFsbG93U2FtZUluZGV4IiwicGFyc2UiLCJzZXRJbmRleCIsInNuYXAiLCJpbmRpY2F0b3IiLCJjb21wdXRlRGVzdEluZGV4Iiwic25hcFBhZ2UiLCJjb21wdXRlTW92YWJsZURlc3RJbmRleCIsInRvUGFnZSIsInRvRGVzdCIsImdldEluZGV4Iiwid2FpdEZvclRyYW5zaXRpb24iLCJYTUxfTkFNRV9TUEFDRSIsIlBBVEgiLCJTSVpFIiwiQXJyb3dzIiwicGxhY2Vob2xkZXIiLCJ3cmFwcGVyIiwiY3JlYXRlZCIsIndyYXBwZXJDbGFzc2VzIiwiY3JlYXRlQXJyb3dzIiwiY3JlYXRlQXJyb3ciLCJwcmV2MiIsImFycm93UGF0aCIsIm5leHRJbmRleCIsInByZXZMYWJlbCIsImxhc3QiLCJuZXh0TGFiZWwiLCJmaXJzdCIsIklOVEVSVkFMX0RBVEFfQVRUUklCVVRFIiwiQXV0b3BsYXkiLCJfRXZlbnRJbnRlcmZhY2U2Iiwib25BbmltYXRpb25GcmFtZSIsIl9Db21wb25lbnRzMiRFbGVtZW50czQiLCJhdXRvcGxheSIsImhvdmVyZWQiLCJmb2N1c2VkIiwic3RvcHBlZCIsInBsYXkiLCJwYXVzZU9uSG92ZXIiLCJhdXRvVG9nZ2xlIiwicGF1c2VPbkZvY3VzIiwicmVzZXRQcm9ncmVzcyIsInN0b3AiLCJDb3ZlciIsIl9FdmVudEludGVyZmFjZTciLCJjb3ZlciIsImNvdmVyMiIsIkJPVU5DRV9ESUZGX1RIUkVTSE9MRCIsIkJPVU5DRV9EVVJBVElPTiIsIkZSSUNUSU9OX0ZBQ1RPUiIsIkJBU0VfVkVMT0NJVFkiLCJNSU5fRFVSQVRJT04iLCJfRXZlbnRJbnRlcmZhY2U4IiwiZnJpY3Rpb24iLCJjbGVhciIsIm9uU2Nyb2xsZWQiLCJub0NvbnN0cmFpbiIsIm5vRGlzdGFuY2UiLCJvbkVuZCIsInRvIiwiZWFzaW5nIiwidCIsImVhc2luZ0Z1bmMiLCJwb3ciLCJTQ1JPTExfTElTVEVORVJfT1BUSU9OUyIsIkRyYWciLCJfRXZlbnRJbnRlcmZhY2U5IiwiX0NvbXBvbmVudHMyJERpcmVjdGlvMiIsImJhc2VQb3NpdGlvbiIsImJhc2VFdmVudCIsInByZXZCYXNlRXZlbnQiLCJpc0ZyZWUiLCJkcmFnZ2luZyIsImV4Y2VlZGVkIiwiY2xpY2tQcmV2ZW50ZWQiLCJvblBvaW50ZXJEb3duIiwiZGlzYWJsZSIsImlzVG91Y2giLCJpc1RvdWNoRXZlbnQiLCJpc0RyYWdnYWJsZSIsImJ1dHRvbiIsIm9uUG9pbnRlck1vdmUiLCJvblBvaW50ZXJVcCIsImNhbmNlbGFibGUiLCJjb25zdHJhaW4iLCJkaWZmQ29vcmQiLCJleHBpcmVkIiwiZGlmZlRpbWUiLCJoYXNFeGNlZWRlZCIsImlzU2xpZGVyRGlyZWN0aW9uIiwic2hvdWxkU3RhcnQiLCJ2ZWxvY2l0eSIsImNvbXB1dGVWZWxvY2l0eSIsImNvbXB1dGVEZXN0aW5hdGlvbiIsInJld2luZEJ5RHJhZyIsInRocmVzaG9sZHMiLCJkcmFnTWluVGhyZXNob2xkIiwiaXNPYmoiLCJtb3VzZSIsInRvdWNoIiwiZmxpY2tQb3dlciIsImZsaWNrTWF4UGFnZXMiLCJvcnRob2dvbmFsIiwiY29vcmRPZiIsImdldEJhc2VFdmVudCIsImNoYW5nZWRUb3VjaGVzIiwidGFyZ2V0MiIsIm5vRHJhZyIsIlRvdWNoRXZlbnQiLCJpc0RyYWdnaW5nIiwiTk9STUFMSVpBVElPTl9NQVAiLCJTcGFjZWJhciIsIlJpZ2h0IiwiTGVmdCIsIlVwIiwiRG93biIsIm5vcm1hbGl6ZUtleSIsIktFWUJPQVJEX0VWRU5UIiwiS2V5Ym9hcmQiLCJfRXZlbnRJbnRlcmZhY2UxMCIsIm9uS2V5ZG93biIsIl9kaXNhYmxlZCIsIlNSQ19EQVRBX0FUVFJJQlVURSIsIlNSQ1NFVF9EQVRBX0FUVFJJQlVURSIsIklNQUdFX1NFTEVDVE9SIiwiTGF6eUxvYWQiLCJfRXZlbnRJbnRlcmZhY2UxMSIsImlzU2VxdWVudGlhbCIsImxhenlMb2FkIiwiZW50cmllcyIsImxvYWROZXh0Iiwic3Jjc2V0IiwicHJlbG9hZFBhZ2VzIiwibG9hZCIsIm9uTG9hZCIsIlBhZ2luYXRpb24iLCJwYWdpbmF0aW9uQ2xhc3NlcyIsImNyZWF0ZVBhZ2luYXRpb24iLCJnZXREaXJlY3Rpb24iLCJzZWxlY3QiLCJsaSIsImNsYXNzIiwicGFnZVgiLCJwYWdpbmF0aW9uS2V5Ym9hcmQiLCJkaXIiLCJuZXh0UGFnZSIsInBhZ2luYXRpb25EaXJlY3Rpb24iLCJfYnV0dG9uIiwiVFJJR0dFUl9LRVlTIiwiU3luYyIsImlzUGFyZW50Iiwic3luYyIsIm5hdmlnYXRlIiwiV2hlZWwiLCJfRXZlbnRJbnRlcmZhY2UxMiIsImxhc3RUaW1lIiwid2hlZWwiLCJvbldoZWVsIiwiZGVsdGFZIiwid2hlZWxNaW5UaHJlc2hvbGQiLCJzbGVlcCIsIndoZWVsU2xlZXAiLCJzaG91bGRQcmV2ZW50IiwicmVsZWFzZVdoZWVsIiwiU1JfUkVNT1ZBTF9ERUxBWSIsIkxpdmUiLCJfRXZlbnRJbnRlcmZhY2UxMyIsImxpdmUiLCJzciIsIkNvbXBvbmVudENvbnN0cnVjdG9ycyIsImZyZWV6ZSIsIl9fcHJvdG9fXyIsIkkxOE4iLCJERUZBVUxUUyIsInNwZWVkIiwicmV3aW5kU3BlZWQiLCJGYWRlIiwidHJhbnNpdGlvbiIsImVuZENhbGxiYWNrIiwiZ2V0U3BlZWQiLCJ1c2VTY3JvbGwiLCJfU3BsaWRlIiwiX28iLCJfRSIsIl9wcm90byIsIkV4dGVuc2lvbnMiLCJfdGhpcyIsIl9DIiwiX1QiLCJDb25zdHJ1Y3RvcnMiLCJDb21wb25lbnQiLCJjb21wb25lbnQiLCJfdGhpcyRldmVudCIsIlNwbGlkZSIsInJvdXRlciIsInBhdGgiLCJwYXRobmFtZSJdLCJtYXBwaW5ncyI6Ijs7O0lBa0hPLFNBQVNBLFNBQVNBLENBQUNDLE9BQU8sQ0FBRUMsVUFBVSxDQUFFQyxDQUFDLENBQUVDLFNBQVMsQ0FBRSxDQUN6RCxTQUFTQyxLQUFLQSxDQUFDQyxLQUFLLENBQUUsQ0FBRSxPQUFPQSxLQUFLLFlBQVlILENBQUMsQ0FBR0csS0FBSyxDQUFHLElBQUlILENBQUMsQ0FBQyxTQUFVSSxPQUFPLENBQUUsQ0FBRUEsT0FBTyxDQUFDRCxLQUFLLENBQUMsQ0FBRSxDQUFDLENBQUMsQ0FBRSxDQUMzRyxXQUFZSCxDQUFDLEdBQUtBLENBQUMsQ0FBR0ssT0FBTyxDQUFDLEVBQUUsU0FBVUQsT0FBTyxDQUFFRSxNQUFNLENBQUUsQ0FDdkQsU0FBU0MsU0FBU0EsQ0FBQ0osS0FBSyxDQUFFLENBQUUsR0FB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QUN2UixPQUFPLENBQUUsSUFBSSxDQUFFLElBQUksQ0FBQyxDQUN4QyxDQUNGLENBQUMsQ0FBRSxDQUNENEYsR0FBRyxDQUFFLFFBQVEsQ0FDYmlNLEdBQUcsQ0FBRSxTQUFTQSxHQUFHQSxFQUFHLENBQ2xCLE9BQU8sSUFBSSxDQUFDMjhCLEVBQUUsQ0FBQzNULE1BQU0sQ0FBQ29DLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FDdkMsQ0FDRixDQUFDLENBQUUsQ0FDRHIzQixHQUFHLENBQUUsT0FBTyxDQUNaaU0sR0FBRyxDQUFFLFNBQVNBLEdBQUdBLEVBQUcsQ0FDbEIsT0FBTyxJQUFJLENBQUMyOEIsRUFBRSxDQUFDaFMsVUFBVSxDQUFDOEcsUUFBUSxFQUFFLENBQ3RDLENBQ0YsQ0FBQyxDQUFDLENBQUMsQ0FFSCxPQUFPNEssT0FBTyxDQUNoQixDQUFDLEVBQUUsQ0FFSCxJQUFJWSxNQUFNLENBQUdaLE9BQU8sQ0FDcEJZLE1BQU0sQ0FBQzUwQixRQUFRLENBQUcsRUFBRSxDQUNwQjQwQixNQUFNLENBQUNqbkIsTUFBTSxDQUFHQSxNQUFNOztJQ2psR3RCO0lBS0EsQ0FBQyxJQUFLO0lBS0osTUFBTTVOLElBQUksQ0FBR0EsSUFBSyxDQUNoQlosT0FBTyxDQUFDeUgsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUNuQml1QixNQUFNLEVBQUUsQ0FDVixDQUFDLENBRUQ7SUFFQTtJQUVBO0lBQ0EsTUFBTUEsTUFBTSxDQUFHQSxJQUFLLENBQ2xCLE1BQU1DLElBQUksQ0FBRzV3QyxNQUFNLENBQUMrZSxRQUFRLENBQUM4eEIsUUFBUSxDQUVyQzUxQixPQUFPLENBQUN5SCxHQUFHLENBQUNrdUIsSUFBSSxDQUFDLENBRWpCLE9BQVFBLElBQUksRUFDVixLQUFLLEdBQUcsQ0FDUixLQUFLLGFBQWEsQ0FDaEIzMUIsT0FBTyxDQUFDeUgsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUNILElBQUlndUIsTUFBTSxDQUFDLFNBQVMsQ0FBRSxDQUNwQ3Z5QixJQUFJLENBQUUsTUFBTSxDQUNaK2hCLFdBQVcsQ0FBRSxNQUFNLENBQ25CNTdCLE1BQU0sQ0FBRSxNQUFNLENBQ2Q2N0IsVUFBVSxDQUFFLEtBQ2IsQ0FBQyxDQUFDbkwsS0FBSyxHQUVSO0lBQ0EsTUFDRixLQUFLLGdDQUFnQyxDQUNuQy9aLE9BQU8sQ0FBQ3lILEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUNuQnJCLGNBQWMsR0FDekIsTUFDRixRQUNFcEcsT0FBTyxDQUFDdUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQ2xDLENBQ0YsQ0FBQyxDQUVEM0IsSUFBSSxFQUFFLENBQ1IsQ0FBQyxHQUFHOzs7Ozs7IiwieF9nb29nbGVfaWdub3JlTGlzdCI6WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsNTIsNTMsNTQsNTUsNTYsNjBdfQ==","sourceRoot":"../dev/scripts"} \ No newline at end of file diff --git a/webseite-gulp-ts/frontend/assets/map/main.css.map b/webseite-gulp-ts/frontend/assets/map/main.css.map deleted file mode 100644 index 9b90656..0000000 --- a/webseite-gulp-ts/frontend/assets/map/main.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["main.css","01_frameworks/bootstrap-5.3.8/mixins/_banner.scss","02_fonts/_index.scss","01_frameworks/bootstrap-5.3.8/_root.scss","01_frameworks/bootstrap-5.3.8/vendor/_rfs.scss","01_frameworks/bootstrap-5.3.8/mixins/_color-mode.scss","01_frameworks/bootstrap-5.3.8/_reboot.scss","01_frameworks/bootstrap-5.3.8/_variables.scss","01_frameworks/bootstrap-5.3.8/mixins/_border-radius.scss","01_frameworks/bootstrap-5.3.8/_type.scss","01_frameworks/bootstrap-5.3.8/mixins/_lists.scss","01_frameworks/bootstrap-5.3.8/_images.scss","01_frameworks/bootstrap-5.3.8/mixins/_image.scss","01_frameworks/bootstrap-5.3.8/_containers.scss","01_frameworks/bootstrap-5.3.8/mixins/_container.scss","01_frameworks/bootstrap-5.3.8/mixins/_breakpoints.scss","01_frameworks/bootstrap-5.3.8/_grid.scss","01_frameworks/bootstrap-5.3.8/mixins/_grid.scss","01_frameworks/bootstrap-5.3.8/_tables.scss","01_frameworks/bootstrap-5.3.8/mixins/_table-variants.scss","01_frameworks/bootstrap-5.3.8/forms/_labels.scss","01_frameworks/bootstrap-5.3.8/forms/_form-text.scss","01_frameworks/bootstrap-5.3.8/forms/_form-control.scss","01_frameworks/bootstrap-5.3.8/mixins/_transition.scss","01_frameworks/bootstrap-5.3.8/mixins/_gradients.scss","01_frameworks/bootstrap-5.3.8/forms/_form-select.scss","01_frameworks/bootstrap-5.3.8/forms/_form-check.scss","01_frameworks/bootstrap-5.3.8/forms/_form-range.scss","01_frameworks/bootstrap-5.3.8/forms/_floating-labels.scss","01_frameworks/bootstrap-5.3.8/forms/_input-group.scss","01_frameworks/bootstrap-5.3.8/mixins/_forms.scss","01_frameworks/bootstrap-5.3.8/_buttons.scss","01_frameworks/bootstrap-5.3.8/mixins/_buttons.scss","01_frameworks/bootstrap-5.3.8/_transitions.scss","01_frameworks/bootstrap-5.3.8/_dropdown.scss","01_frameworks/bootstrap-5.3.8/mixins/_caret.scss","01_frameworks/bootstrap-5.3.8/_button-group.scss","01_frameworks/bootstrap-5.3.8/_nav.scss","01_frameworks/bootstrap-5.3.8/_navbar.scss","01_frameworks/bootstrap-5.3.8/_card.scss","01_frameworks/bootstrap-5.3.8/_accordion.scss","01_frameworks/bootstrap-5.3.8/_breadcrumb.scss","01_frameworks/bootstrap-5.3.8/_pagination.scss","01_frameworks/bootstrap-5.3.8/mixins/_pagination.scss","01_frameworks/bootstrap-5.3.8/_badge.scss","01_frameworks/bootstrap-5.3.8/_alert.scss","01_frameworks/bootstrap-5.3.8/_progress.scss","01_frameworks/bootstrap-5.3.8/_list-group.scss","01_frameworks/bootstrap-5.3.8/_close.scss","01_frameworks/bootstrap-5.3.8/_toasts.scss","01_frameworks/bootstrap-5.3.8/_modal.scss","01_frameworks/bootstrap-5.3.8/mixins/_backdrop.scss","01_frameworks/bootstrap-5.3.8/_tooltip.scss","01_frameworks/bootstrap-5.3.8/mixins/_reset-text.scss","01_frameworks/bootstrap-5.3.8/_popover.scss","01_frameworks/bootstrap-5.3.8/_carousel.scss","01_frameworks/bootstrap-5.3.8/mixins/_clearfix.scss","01_frameworks/bootstrap-5.3.8/_spinners.scss","01_frameworks/bootstrap-5.3.8/_offcanvas.scss","01_frameworks/bootstrap-5.3.8/_placeholders.scss","01_frameworks/bootstrap-5.3.8/helpers/_color-bg.scss","01_frameworks/bootstrap-5.3.8/helpers/_colored-links.scss","01_frameworks/bootstrap-5.3.8/helpers/_focus-ring.scss","01_frameworks/bootstrap-5.3.8/helpers/_icon-link.scss","01_frameworks/bootstrap-5.3.8/helpers/_ratio.scss","01_frameworks/bootstrap-5.3.8/helpers/_position.scss","01_frameworks/bootstrap-5.3.8/helpers/_stacks.scss","01_frameworks/bootstrap-5.3.8/helpers/_visually-hidden.scss","01_frameworks/bootstrap-5.3.8/mixins/_visually-hidden.scss","01_frameworks/bootstrap-5.3.8/helpers/_stretched-link.scss","01_frameworks/bootstrap-5.3.8/helpers/_text-truncation.scss","01_frameworks/bootstrap-5.3.8/mixins/_text-truncate.scss","01_frameworks/bootstrap-5.3.8/helpers/_vr.scss","01_frameworks/bootstrap-5.3.8/mixins/_utilities.scss","01_frameworks/bootstrap-5.3.8/utilities/_api.scss","02_fonts/_playfair-display-v40-latin.scss","02_fonts/_source-sans-3-v19-latin.scss","03_base/_utils.scss","03_base/_colors.scss","03_base/_theme.scss","03_base/_typography.scss","04_plugins/splide-4.1.4/core/object/objects/container.scss","04_plugins/splide-4.1.4/core/object/objects/list.scss","04_plugins/splide-4.1.4/core/object/objects/pagination.scss","04_plugins/splide-4.1.4/core/object/objects/progress.scss","04_plugins/splide-4.1.4/core/object/objects/root.scss","04_plugins/splide-4.1.4/core/object/objects/slide.scss","04_plugins/splide-4.1.4/core/object/objects/spinner.scss","04_plugins/splide-4.1.4/template/default/index.scss","04_plugins/splide-4.1.4/core/object/objects/sr.scss","04_plugins/splide-4.1.4/core/object/objects/toggle.scss","04_plugins/splide-4.1.4/core/object/objects/track.scss","04_plugins/splide-4.1.4/core/foundation/animations.scss","04_plugins/splide-4.1.4/core/object/modifiers/draggable.scss","04_plugins/splide-4.1.4/core/object/modifiers/fade.scss","04_plugins/splide-4.1.4/core/object/modifiers/rtl.scss","04_plugins/splide-4.1.4/core/object/modifiers/ttb.scss","04_plugins/splide-4.1.4/template/default/object/objects/arrow.scss","04_plugins/splide-4.1.4/template/default/foundation/colors.scss","04_plugins/splide-4.1.4/template/default/foundation/mixins.scss","04_plugins/splide-4.1.4/template/default/object/objects/pagination.scss","04_plugins/splide-4.1.4/template/default/object/objects/progress.scss","04_plugins/splide-4.1.4/template/default/object/objects/slide.scss","04_plugins/splide-4.1.4/template/default/object/objects/toggle.scss","04_plugins/splide-4.1.4/template/default/object/modifiers/nav.scss","04_plugins/splide-4.1.4/template/default/object/modifiers/rtl.scss","04_plugins/splide-4.1.4/template/default/object/modifiers/ttb.scss","04_plugins/toastify-1.12/_toastify.scss","05_modules/_footer-main.scss","05_modules/_header-main.scss","05_modules/_logo-main.scss","05_modules/_menu-main.scss","05_modules/_product-manager.scss"],"names":[],"mappings":"AAAA,gBAAgB;ACCd;;;;EAAA;ACCM,mFAAA;ACFR;;EASI,kBAAA;EAAA,oBAAA;EAAA,oBAAA;EAAA,kBAAA;EAAA,iBAAA;EAAA,oBAAA;EAAA,oBAAA;EAAA,mBAAA;EAAA,kBAAA;EAAA,kBAAA;EAAA,gBAAA;EAAA,gBAAA;EAAA,kBAAA;EAAA,uBAAA;EAIA,sBAAA;EAAA,sBAAA;EAAA,sBAAA;EAAA,sBAAA;EAAA,sBAAA;EAAA,sBAAA;EAAA,sBAAA;EAAA,sBAAA;EAAA,sBAAA;EAIA,qBAAA;EAAA,uBAAA;EAAA,qBAAA;EAAA,kBAAA;EAAA,qBAAA;EAAA,oBAAA;EAAA,mBAAA;EAAA,kBAAA;EAIA,8BAAA;EAAA,iCAAA;EAAA,6BAAA;EAAA,2BAAA;EAAA,6BAAA;EAAA,4BAAA;EAAA,6BAAA;EAAA,yBAAA;EAIA,8EAAA;EAAA,iFAAA;EAAA,8EAAA;EAAA,2EAAA;EAAA,mEAAA;EAAA,6EAAA;EAAA,iCAAA;EAAA,gCAAA;EAIA,2EAAA;EAAA,6EAAA;EAAA,2EAAA;EAAA,wEAAA;EAAA,gEAAA;EAAA,0EAAA;EAAA,yEAAA;EAAA,4BAAA;EAIA,+EAAA;EAAA,iFAAA;EAAA,+EAAA;EAAA,4EAAA;EAAA,qEAAA;EAAA,8EAAA;EAAA,iCAAA;EAAA,gCAAA;EAGF,6BAAA;EACA,uBAAA;EAMA,qNAAA;EACA,yGAAA;EACA,yFAAA;EAOA,gDAAA;EC2OI,yBALI;EDpOR,0BAAA;EACA,0BAAA;EAKA,wBAAA;EACA,+BAAA;EACA,kBAAA;EACA,+BAAA;EAEA,yBAAA;EACA,gCAAA;EAEA,4CAAA;EACA,oCAAA;EACA,0BAAA;EACA,oCAAA;EAEA,0CAAA;EACA,mCAAA;EACA,yBAAA;EACA,mCAAA;EAGA,2BAAA;EAEA,wBAAA;EACA,iCAAA;EACA,+BAAA;EAEA,yEAAA;EACA,sCAAA;EAMA,wBAAA;EACA,6BAAA;EACA,2DAAA;EAGA,sBAAA;EACA,wBAAA;EACA,0BAAA;EACA,mDAAA;EAEA,4BAAA;EACA,8BAAA;EACA,6BAAA;EACA,2BAAA;EACA,4BAAA;EACA,mDAAA;EACA,8BAAA;EAGA,kDAAA;EACA,2DAAA;EACA,oDAAA;EACA,2DAAA;EAIA,8BAAA;EACA,6BAAA;EACA,+CAAA;EAIA,8BAAA;EACA,qCAAA;EACA,gCAAA;EACA,uCAAA;AHDF;;AK/GI;EFsHA,kBAAA;EAGA,wBAAA;EACA,kCAAA;EACA,qBAAA;EACA,4BAAA;EAEA,yBAAA;EACA,sCAAA;EAEA,+CAAA;EACA,uCAAA;EACA,0BAAA;EACA,iCAAA;EAEA,6CAAA;EACA,sCAAA;EACA,qEAAA;EACA,gCAAA;EAGE,+EAAA;EAAA,iFAAA;EAAA,+EAAA;EAAA,4EAAA;EAAA,qEAAA;EAAA,8EAAA;EAAA,iCAAA;EAAA,gCAAA;EAIA,yEAAA;EAAA,0EAAA;EAAA,yEAAA;EAAA,uEAAA;EAAA,8DAAA;EAAA,wEAAA;EAAA,6BAAA;EAAA,4BAAA;EAIA,8EAAA;EAAA,iFAAA;EAAA,8EAAA;EAAA,2EAAA;EAAA,mEAAA;EAAA,8EAAA;EAAA,iCAAA;EAAA,gCAAA;EAGF,2BAAA;EAEA,oEAAA;EACA,0EAAA;EACA,kCAAA;EACA,wCAAA;EAEA,yDAAA;EACA,6BAAA;EACA,0DAAA;EAEA,0BAAA;EACA,wDAAA;EAEA,0EAAA;EACA,iFAAA;EACA,4EAAA;EACA,mFAAA;AHDJ;;AMvKA;;;EAGE,sBAAA;AN0KF;;AM3JI;EANJ;IAOM,uBAAA;EN+JJ;AACF;;AMlJA;EACE,SAAA;EACA,uCAAA;EF6OI,mCALI;EEtOR,uCAAA;EACA,uCAAA;EACA,2BAAA;EACA,qCAAA;EACA,mCAAA;EACA,8BAAA;EACA,6CAAA;ANqJF;;AM5IA;EACE,cAAA;EACA,cCmnB4B;EDlnB5B,SAAA;EACA,wCAAA;EACA,aCynB4B;AP1e9B;;AMrIA;EACE,aAAA;EACA,qBCwjB4B;EDrjB5B,gBCwjB4B;EDvjB5B,gBCwjB4B;EDvjB5B,8BAAA;ANsIF;;AMnIA;EFuMQ,iCAAA;AJhER;AI5FI;EE3CJ;IF8MQ,iBAAA;EJnEN;AACF;;AMvIA;EFkMQ,iCAAA;AJvDR;AIrGI;EEtCJ;IFyMQ,eAAA;EJ1DN;AACF;;AM3IA;EF6LQ,+BAAA;AJ9CR;AI9GI;EEjCJ;IFoMQ,kBAAA;EJjDN;AACF;;AM/IA;EFwLQ,iCAAA;AJrCR;AIvHI;EE5BJ;IF+LQ,iBAAA;EJxCN;AACF;;AMnJA;EF+KM,kBALI;AJnBV;;AMlJA;EF0KM,eALI;AJfV;;AM3IA;EACE,aAAA;EACA,mBCwV0B;AP1M5B;;AMpIA;EACE,yCAAA;UAAA,iCAAA;EACA,YAAA;EACA,sCAAA;UAAA,8BAAA;ANuIF;;AMjIA;EACE,mBAAA;EACA,kBAAA;EACA,oBAAA;ANoIF;;AM9HA;;EAEE,kBAAA;ANiIF;;AM9HA;;;EAGE,aAAA;EACA,mBAAA;ANiIF;;AM9HA;;;;EAIE,gBAAA;ANiIF;;AM9HA;EACE,gBC6b4B;AP5T9B;;AM5HA;EACE,qBAAA;EACA,cAAA;AN+HF;;AMzHA;EACE,gBAAA;AN4HF;;AMpHA;;EAEE,mBCsa4B;AP/S9B;;AM/GA;EF6EM,kBALI;AJ2CV;;AM5GA;EACE,iBCqf4B;EDpf5B,gCAAA;EACA,wCAAA;AN+GF;;AMtGA;;EAEE,kBAAA;EFwDI,iBALI;EEjDR,cAAA;EACA,wBAAA;ANyGF;;AMtGA;EAAM,eAAA;AN0GN;;AMzGA;EAAM,WAAA;AN6GN;;AMxGA;EACE,gEAAA;EACA,0BCgNwC;APrG1C;AMzGE;EACE,mDAAA;AN2GJ;;AMhGE;EAEE,cAAA;EACA,qBAAA;ANkGJ;;AM3FA;;;;EAIE,qCCgV4B;EHlUxB,cALI;AJsFV;;AMvFA;EACE,cAAA;EACA,aAAA;EACA,mBAAA;EACA,cAAA;EFEI,kBALI;AJ8FV;AMtFE;EFHI,kBALI;EEUN,cAAA;EACA,kBAAA;ANwFJ;;AMpFA;EFVM,kBALI;EEiBR,2BAAA;EACA,qBAAA;ANuFF;AMpFE;EACE,cAAA;ANsFJ;;AMlFA;EACE,2BAAA;EFtBI,kBALI;EE6BR,wBC25CkC;ED15ClC,sCC25CkC;EChsDhC,sBAAA;AR2XJ;AMnFE;EACE,UAAA;EF7BE,cALI;AJwHV;;AM3EA;EACE,gBAAA;AN8EF;;AMxEA;;EAEE,sBAAA;AN2EF;;AMnEA;EACE,oBAAA;EACA,yBAAA;ANsEF;;AMnEA;EACE,mBC4X4B;ED3X5B,sBC2X4B;ED1X5B,gCC4Z4B;ED3Z5B,gBAAA;ANsEF;;AM/DA;EAEE,mBAAA;EACA,gCAAA;ANiEF;;AM9DA;;;;;;EAME,qBAAA;EACA,mBAAA;EACA,eAAA;ANiEF;;AMzDA;EACE,qBAAA;AN4DF;;AMtDA;EAEE,gBAAA;ANwDF;;AMhDA;EACE,UAAA;ANmDF;;AM9CA;;;;;EAKE,SAAA;EACA,oBAAA;EF5HI,kBALI;EEmIR,oBAAA;ANiDF;;AM7CA;;EAEE,oBAAA;ANgDF;;AM3CA;EACE,eAAA;AN8CF;;AM3CA;EAGE,iBAAA;AN4CF;AMzCE;EACE,UAAA;AN2CJ;;AMpCA;EACE,wBAAA;ANuCF;;AM/BA;;;;EAIE,0BAAA;ANkCF;AM/BI;;;;EACE,eAAA;ANoCN;;AM7BA;EACE,UAAA;EACA,kBAAA;ANgCF;;AM3BA;EACE,gBAAA;AN8BF;;AMpBA;EACE,YAAA;EACA,UAAA;EACA,SAAA;EACA,SAAA;ANuBF;;AMfA;EACE,WAAA;EACA,WAAA;EACA,UAAA;EACA,qBCmN4B;EDjN5B,oBAAA;EFnNM,iCAAA;AJqOR;AIjYI;EEyWJ;IFtMQ,iBAAA;EJkON;AACF;AMpBE;EACE,WAAA;ANsBJ;;AMfA;;;;;;;EAOE,UAAA;ANkBF;;AMfA;EACE,YAAA;ANkBF;;AMTA;EACE,6BAAA;EACA,oBAAA;ANYF;AMTE;EACE,eAAA;EACA,oBAAA;ANWJ;;AMFA;;;;;;;CAAA;AAWA;EACE,wBAAA;ANEF;;AMGA;EACE,UAAA;ANAF;;AMOA;EACE,aAAA;EACA,0BAAA;ANJF;;AMSA;EACE,qBAAA;ANNF;;AMWA;EACE,SAAA;ANRF;;AMeA;EACE,kBAAA;EACA,eAAA;ANZF;;AMoBA;EACE,wBAAA;ANjBF;;AMyBA;EACE,wBAAA;ANtBF;;ASrjBA;ELmQM,kBALI;EK5PR,gBFwoB4B;APhF9B;;ASnjBE;EAGE,gBF0nBkB;EEznBlB,gBFymB0B;EH7WtB,iCAAA;AJyTR;AIrdI;EKpGF;ILuQM,eAAA;EJsTN;AACF;;AS9jBE;EAGE,gBF0nBkB;EEznBlB,gBFymB0B;EH7WtB,iCAAA;AJoUR;AIheI;EKpGF;ILuQM,iBAAA;EJiUN;AACF;;ASzkBE;EAGE,gBF0nBkB;EEznBlB,gBFymB0B;EH7WtB,iCAAA;AJ+UR;AI3eI;EKpGF;ILuQM,eAAA;EJ4UN;AACF;;ASplBE;EAGE,gBF0nBkB;EEznBlB,gBFymB0B;EH7WtB,iCAAA;AJ0VR;AItfI;EKpGF;ILuQM,iBAAA;EJuVN;AACF;;AS/lBE;EAGE,gBF0nBkB;EEznBlB,gBFymB0B;EH7WtB,iCAAA;AJqWR;AIjgBI;EKpGF;ILuQM,eAAA;EJkWN;AACF;;AS1mBE;EAGE,gBF0nBkB;EEznBlB,gBFymB0B;EH7WtB,iCAAA;AJgXR;AI5gBI;EKpGF;ILuQM,iBAAA;EJ6WN;AACF;;AS7lBA;ECvDE,eAAA;EACA,gBAAA;AVwpBF;;AS7lBA;EC5DE,eAAA;EACA,gBAAA;AV6pBF;;AS/lBA;EACE,qBAAA;ATkmBF;AShmBE;EACE,oBFsoB0B;APpC9B;;ASxlBA;EL8MM,kBALI;EKvMR,yBAAA;AT2lBF;;ASvlBA;EACE,mBFiUO;EH1HH,kBALI;AJyZV;ASxlBE;EACE,gBAAA;AT0lBJ;;AStlBA;EACE,iBAAA;EACA,mBFuTO;EH1HH,kBALI;EKtLR,cFtFS;AP+qBX;ASvlBE;EACE,aAAA;ATylBJ;;AWzrBA;ECIE,eAAA;EAGA,YAAA;AZurBF;;AWxrBA;EACE,gBJ+jDkC;EI9jDlC,mCJ+jDkC;EI9jDlC,2DAAA;EHGE,sCAAA;EIRF,eAAA;EAGA,YAAA;AZgsBF;;AWlrBA;EAEE,qBAAA;AXorBF;;AWjrBA;EACE,qBAAA;EACA,cAAA;AXorBF;;AWjrBA;EPyPM,kBALI;EOlPR,gCJkjDkC;AP93BpC;;AattBE;;;;;;;ECHA,qBAAA;EACA,gBAAA;EACA,WAAA;EACA,6CAAA;EACA,4CAAA;EACA,kBAAA;EACA,iBAAA;AdmuBF;;Ae7qBI;EF5CE;IACE,gBNkee;EP2PrB;AACF;AenrBI;EF5CE;IACE,gBNkee;EPgQrB;AACF;AexrBI;EF5CE;IACE,gBNkee;EPqQrB;AACF;Ae7rBI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E,yBAAA;EACA,0BAAA;EACA,0BforB0B;EenrB1B,2BfsyBoC;EiBp4BtC,uCjBqiCgC;Eer8B9B,oBAAA;EACA,qBAAA;EACA,mBAAA;EACA,eAAA;EACA,+CfgsB0B;Ee/rB1B,gBAAA;ECzFE,qID0FF;AtBqhEJ;AuB3mEM;ED0EJ;ICzEM,gBAAA;EvB8mEN;AACF;AsBvhEE;EACE,wCf47B8B;AP6lClC;;AsBhhEA;EACE,cAAA;EACA,WAAA;EACA,mBAAA;EACA,gBAAA;EACA,gBfwf4B;Eevf5B,2Bf2xBsC;Ee1xBtC,6BAAA;EACA,yBAAA;EACA,sCAAA;AtBmhEF;AsBjhEE;EACE,UAAA;AtBmhEJ;AsBhhEE;EAEE,gBAAA;EACA,eAAA;AtBihEJ;;AsBtgEA;EACE,mEf4wBsC;Ee3wBtC,uBAAA;ElByII,mBALI;EIvQN,yCAAA;AR8oEJ;AsBvgEE;EACE,uBAAA;EACA,wBAAA;EACA,yBfooB0B;APq4C9B;;AsBrgEA;EACE,iEfgwBsC;Ee/vBtC,oBAAA;ElB4HI,kBALI;EIvQN,yCAAA;AR0pEJ;AsBtgEE;EACE,oBAAA;EACA,qBAAA;EACA,uBf2nB0B;AP64C9B;;AsBhgEE;EACE,oEf6uBoC;APsxCxC;AsBhgEE;EACE,mEf0uBoC;APwxCxC;AsB//DE;EACE,iEfuuBoC;AP0xCxC;;AsB5/DA;EACE,WfquBsC;EepuBtC,gEf8tBsC;Ee7tBtC,iBfilB4B;AP86C9B;AsB7/DE;EACE,eAAA;AtB+/DJ;AsB5/DE;EACE,oBAAA;EdvLA,sCAAA;ARsrEJ;AsB3/DE;EACE,oBAAA;Ed5LA,sCAAA;AR0rEJ;AsB1/DE;EAAoB,+Df8sBkB;AP+yCxC;AsB5/DE;EAAoB,6Df8sBkB;APizCxC;;AyB9sEA;EACE,wPAAA;EAEA,cAAA;EACA,WAAA;EACA,0CAAA;ErBqRI,eALI;EqB7QR,gBlB+lB4B;EkB9lB5B,gBlBsmB4B;EkBrmB5B,2BlBy3BsC;EkBx3BtC,wBAAA;KAAA,qBAAA;UAAA,gBAAA;EACA,mClBk3BsC;EkBj3BtC,mFAAA;EACA,4BAAA;EACA,yClB+9BkC;EkB99BlC,0BlB+9BkC;EkB99BlC,2DAAA;EjBHE,sCAAA;EeHE,wEESJ;AzB8sEF;AuBntEM;EEfN;IFgBQ,gBAAA;EvBstEN;AACF;AyBjtEE;EACE,gElBs3BoC;EkBr3BpC,UAAA;EAKE,kDlBi+B4B;AP8uClC;AyB3sEE;EAEE,sBlB6uB0B;EkB5uB1B,sBAAA;AzB4sEJ;AyBzsEE;EAEE,wClBu1BoC;APm3CxC;AyBrsEE;EACE,kBAAA;EACA,uCAAA;AzBusEJ;;AyBnsEA;EACE,oBlBsuB4B;EkBruB5B,uBlBquB4B;EkBpuB5B,oBlBquB4B;EHlgBxB,mBALI;EIvQN,yCAAA;ARivEJ;;AyBnsEA;EACE,mBlBkuB4B;EkBjuB5B,sBlBiuB4B;EkBhuB5B,kBlBiuB4B;EHtgBxB,kBALI;EIvQN,yCAAA;ARyvEJ;;AyBjsEI;EACE,wPAAA;AzBosEN;;A0B5wEA;EACE,cAAA;EACA,kBnBq6BwC;EmBp6BxC,mBnBq6BwC;EmBp6BxC,uBnBq6BwC;AP02C1C;A0B7wEE;EACE,WAAA;EACA,mBAAA;A1B+wEJ;;A0B3wEA;EACE,oBnB25BwC;EmB15BxC,eAAA;EACA,iBAAA;A1B8wEF;A0B5wEE;EACE,YAAA;EACA,oBAAA;EACA,cAAA;A1B8wEJ;;A0B1wEA;EACE,qCAAA;EAEA,cAAA;EACA,UnB04BwC;EmBz4BxC,WnBy4BwC;EmBx4BxC,kBAAA;EACA,mBAAA;EACA,wBAAA;KAAA,qBAAA;UAAA,gBAAA;EACA,yCAAA;EACA,+CAAA;EACA,4BAAA;EACA,2BAAA;EACA,wBAAA;EACA,2DnB24BwC;EmB14BxC,iCAAA;UAAA,yBAAA;A1B4wEF;A0BzwEE;ElB3BE,qBAAA;ARuyEJ;A0BxwEE;EAEE,kBnBm4BsC;APs4C1C;A0BtwEE;EACE,uBnB03BsC;AP84C1C;A0BrwEE;EACE,gEnBs1BoC;EmBr1BpC,UAAA;EACA,kDnB8foB;APywDxB;A0BpwEE;EACE,yBnB5BM;EmB6BN,qBnB7BM;APmyEV;A0BpwEI;EAII,uPAAA;A1BmwER;A0B/vEI;EAII,+JAAA;A1B8vER;A0BzvEE;EACE,yBnBjDM;EmBkDN,qBnBlDM;EmBuDJ,iPAAA;A1BuvEN;A0BnvEE;EACE,oBAAA;EACA,YAAA;EACA,YnBk2BuC;APm5C3C;A0B9uEI;EACE,eAAA;EACA,YnBy1BqC;APu5C3C;;A0BluEA;EACE,mBnBo1BgC;APi5ClC;A0BnuEE;EACE,2KAAA;EAEA,UnB80B8B;EmB70B9B,mBAAA;EACA,0CAAA;EACA,gCAAA;ElBjHA,kBAAA;EeHE,iDGsHF;A1BouEJ;AuBt1EM;EG0GJ;IHzGM,gBAAA;EvBy1EN;AACF;A0BvuEI;EACE,0MAAA;A1ByuEN;A0BtuEI;EACE,iCnB60B4B;EmBx0B1B,0JAAA;A1BouER;A0B/tEE;EACE,oBnBwzB8B;EmBvzB9B,eAAA;A1BiuEJ;A0B/tEI;EACE,oBAAA;EACA,cAAA;A1BiuEN;;A0B5tEA;EACE,qBAAA;EACA,kBnBsyBgC;APy7ClC;;A0B5tEA;EACE,kBAAA;EACA,sBAAA;EACA,oBAAA;A1B+tEF;A0B3tEI;EACE,oBAAA;EACA,YAAA;EACA,anBspBwB;APukD9B;;A0BttEI;EACE,iLAAA;A1BytEN;;A2B54EA;EACE,WAAA;EACA,cAAA;EACA,UAAA;EACA,wBAAA;KAAA,qBAAA;UAAA,gBAAA;EACA,6BAAA;A3B+4EF;A2B74EE;EACE,UAAA;A3B+4EJ;A2B34EI;EAA0B,kEpB8gCa;APg4C3C;A2B74EI;EAA0B,kEpB6gCa;APm4C3C;A2B74EE;EACE,SAAA;A3B+4EJ;A2B54EE;EACE,WpB+/BuC;EoB9/BvC,YpB8/BuC;EoB7/BvC,oBAAA;EACA,wBAAA;UAAA,gBAAA;EH1BF,yBjBkCQ;EoBNN,SpB6/BuC;EC1gCvC,mBAAA;EeHE,oHImBF;EJnBE,4GImBF;A3B64EJ;AuB55EM;EIMJ;IJLM,wBAAA;IAAA,gBAAA;EvB+5EN;AACF;A2Bh5EI;EHjCF,qEjB8hCyC;APs5C3C;A2B94EE;EACE,WpBw+B8B;EoBv+B9B,cpBw+B8B;EoBv+B9B,kBAAA;EACA,epBu+B8B;EoBt+B9B,wCpBu+B8B;EoBt+B9B,yBAAA;EnB7BA,mBAAA;AR86EJ;A2B54EE;EACE,WpBo+BuC;EoBn+BvC,YpBm+BuC;EoBl+BvC,qBAAA;OAAA,gBAAA;EHpDF,yBjBkCQ;EoBoBN,SpBm+BuC;EC1gCvC,mBAAA;EeHE,iHI6CF;EJ7CE,4GI6CF;A3B64EJ;AuBt7EM;EIiCJ;IJhCM,qBAAA;IAAA,gBAAA;EvBy7EN;AACF;A2Bh5EI;EH3DF,qEjB8hCyC;APg7C3C;A2B94EE;EACE,WpB88B8B;EoB78B9B,cpB88B8B;EoB78B9B,kBAAA;EACA,epB68B8B;EoB58B9B,wCpB68B8B;EoB58B9B,yBAAA;EnBvDA,mBAAA;ARw8EJ;A2B54EE;EACE,oBAAA;A3B84EJ;A2B54EI;EACE,2CpBg9BqC;AP87C3C;A2B34EI;EACE,2CpB48BqC;APi8C3C;;A4Bp+EA;EACE,kBAAA;A5Bu+EF;A4Br+EE;;;EAGE,uDrBwiCoC;EqBviCpC,2DrBuiCoC;EqBtiCpC,iBrBuiCoC;APg8CxC;A4Bp+EE;EACE,kBAAA;EACA,MAAA;EACA,OAAA;EACA,UAAA;EACA,eAAA;EACA,YAAA;EACA,qBAAA;EACA,gBAAA;EACA,2CAAA;EACA,iBAAA;EACA,uBAAA;EACA,mBAAA;EACA,oBAAA;EACA,gDAAA;EACA,qBAAA;ELVE,gEKWF;A5Bs+EJ;AuB7+EM;EKTJ;ILUM,gBAAA;EvBg/EN;AACF;A4Bx+EE;;EAEE,qBAAA;A5B0+EJ;A4Bx+EI;EACE,kBAAA;A5B2+EN;A4B5+EI;;EACE,kBAAA;A5B2+EN;A4Bx+EI;EAEE,qBrB0gCkC;EqBzgClC,wBrB0gCkC;APi+CxC;A4B9+EI;;;EAEE,qBrB0gCkC;EqBzgClC,wBrB0gCkC;APi+CxC;A4Bx+EI;;EACE,qBrBqgCkC;EqBpgClC,wBrBqgCkC;APs+CxC;A4Bv+EE;EACE,qBrB+/BoC;EqB9/BpC,wBrB+/BoC;EqB9/BpC,qBrBguB0B;APywD9B;A4Bl+EI;EACE,8DrBy/BkC;AP8+CxC;A4Bx+EI;;;;EACE,8DrBy/BkC;AP8+CxC;A4Bl+EI;EACE,8DrBm/BkC;APi/CxC;A4B/9EI;EACE,kBAAA;EACA,oBAAA;EACA,WAAA;EACA,arBw+BkC;EqBv+BlC,WAAA;EACA,mCrBqzBkC;ECh3BpC,sCAAA;AR8hFJ;A4Bz+EI;;EACE,kBAAA;EACA,oBAAA;EACA,WAAA;EACA,arBw+BkC;EqBv+BlC,WAAA;EACA,mCrBqzBkC;ECh3BpC,sCAAA;AR8hFJ;A4B/9EE;EACE,wCrBkzBoC;AP+qDxC;A4B79EI;EACE,sCAAA;A5B+9EN;A4B39EE;;EAEE,crBhFO;AP6iFX;;A6BvjFA;EACE,kBAAA;EACA,aAAA;EACA,eAAA;EACA,oBAAA;EACA,WAAA;A7B0jFF;A6BxjFE;;;EAGE,kBAAA;EACA,cAAA;EACA,SAAA;EACA,YAAA;A7B0jFJ;A6BtjFE;;;EAGE,UAAA;A7BwjFJ;A6BljFE;EACE,kBAAA;EACA,UAAA;A7BojFJ;A6BljFI;EACE,UAAA;A7BojFN;;A6BziFA;EACE,aAAA;EACA,mBAAA;EACA,yBAAA;EzB8OI,eALI;EyBvOR,gBtByjB4B;EsBxjB5B,gBtBgkB4B;EsB/jB5B,2BtBm1BsC;EsBl1BtC,kBAAA;EACA,mBAAA;EACA,uCtB06BsC;EsBz6BtC,2DAAA;ErBtCE,sCAAA;ARmlFJ;;A6BniFA;;;;EAIE,oBAAA;EzBwNI,kBALI;EIvQN,yCAAA;AR4lFJ;;A6BniFA;;;;EAIE,uBAAA;EzB+MI,mBALI;EIvQN,yCAAA;ARqmFJ;;A6BniFA;;EAEE,mBAAA;A7BsiFF;;A6BzhFI;;;;ErBjEA,0BAAA;EACA,6BAAA;ARimFJ;A6BxhFI;;;;ErB1EA,0BAAA;EACA,6BAAA;ARwmFJ;A6BlhFE;EACE,8CAAA;ErB1EA,yBAAA;EACA,4BAAA;AR+lFJ;A6BlhFE;;ErB9EE,yBAAA;EACA,4BAAA;ARomFJ;;A8B5nFE;EACE,aAAA;EACA,WAAA;EACA,mBvBu0BoC;EHrkBlC,kBALI;E0B1PN,iCvBkjCqB;AP4kDzB;;A8B3nFE;EACE,kBAAA;EACA,SAAA;EACA,UAAA;EACA,aAAA;EACA,eAAA;EACA,uBAAA;EACA,kBAAA;E1BqPE,mBALI;E0B7ON,WvBqiCqB;EuBpiCrB,mCvBoiCqB;EC/jCrB,sCAAA;ARypFJ;;A8BznFI;;;;EAEE,cAAA;A9B8nFN;;A8B7qFI;EAqDE,+CvBuhCmB;EuBphCjB,oCvB81BgC;EuB71BhC,0PAAA;EACA,4BAAA;EACA,2DAAA;EACA,gEAAA;A9B0nFR;A8BvnFM;EACE,+CvB4gCiB;EuBvgCf,2DvBugCe;AP8mDzB;;A8B1rFI;EA+EI,oCvBu0BgC;EuBt0BhC,kFAAA;A9B+mFR;;A8B/rFI;EAuFE,+CvBq/BmB;APunDzB;A8BzmFQ;EAEE,kQAAA;EACA,uBvBq5B8B;EuBp5B9B,+DAAA;EACA,2EAAA;A9B0mFV;A8BtmFM;EACE,+CvBw+BiB;EuBn+Bf,2DvBm+Be;APioDzB;;A8B7sFI;EAkHI,yCAAA;A9B+lFR;;A8BjtFI;EAyHE,+CvBm9BmB;APyoDzB;A8B1lFM;EACE,4CvBg9BiB;AP4oDzB;A8BzlFM;EACE,2DvB48BiB;AP+oDzB;A8BxlFM;EACE,iCvBw8BiB;APkpDzB;;A8BrlFI;EACE,kBAAA;A9BwlFN;;A8BluFI;;;;;EAoJM,UAAA;A9BslFV;;A8BttFE;EACE,aAAA;EACA,WAAA;EACA,mBvBu0BoC;EHrkBlC,kBALI;E0B1PN,mCvBkjCqB;APsqDzB;;A8BrtFE;EACE,kBAAA;EACA,SAAA;EACA,UAAA;EACA,aAAA;EACA,eAAA;EACA,uBAAA;EACA,kBAAA;E1BqPE,mBALI;E0B7ON,WvBqiCqB;EuBpiCrB,kCvBoiCqB;EC/jCrB,sCAAA;ARmvFJ;;A8BntFI;;;;EAEE,cAAA;A9BwtFN;;A8BvwFI;EAqDE,iDvBuhCmB;EuBphCjB,oCvB81BgC;EuB71BhC,4UAAA;EACA,4BAAA;EACA,2DAAA;EACA,gEAAA;A9BotFR;A8BjtFM;EACE,iDvB4gCiB;EuBvgCf,0DvBugCe;APwsDzB;;A8BpxFI;EA+EI,oCvBu0BgC;EuBt0BhC,kFAAA;A9BysFR;;A8BzxFI;EAuFE,iDvBq/BmB;APitDzB;A8BnsFQ;EAEE,oVAAA;EACA,uBvBq5B8B;EuBp5B9B,+DAAA;EACA,2EAAA;A9BosFV;A8BhsFM;EACE,iDvBw+BiB;EuBn+Bf,0DvBm+Be;AP2tDzB;;A8B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yEv8NQ;EAOI,2BAAA;AzEo8NZ;;AyE38NQ;EAOI,2BAAA;AzEw8NZ;;AyE/8NQ;EAOI,6BAAA;AzE48NZ;;AyEn9NQ;EAOI,8BAAA;AzEg9NZ;;AyEv9NQ;EAOI,6BAAA;AzEo9NZ;;AyE39NQ;EAOI,2BAAA;AzEw9NZ;;AyE/9NQ;EAOI,6BAAA;AzE49NZ;;AyEn+NQ;EAOI,8BAAA;AzEg+NZ;;AyEv+NQ;EAOI,6BAAA;AzEo+NZ;;AyE3+NQ;EAOI,0BAAA;AzEw+NZ;;AyE/+NQ;EAOI,gCAAA;AzE4+NZ;;AyEn/NQ;EAOI,yBAAA;AzEg/NZ;;AyEv/NQ;EAOI,wBAAA;AzEo/NZ;;AyE3/NQ;EAOI,+BAAA;AzEw/NZ;;AyE//NQ;EAOI,yBAAA;AzE4/NZ;;AyEngOQ;EAOI,6BAAA;AzEggOZ;;AyEvgOQ;EAOI,8BAAA;AzEogOZ;;AyE3gOQ;EAOI,wBAAA;AzEwgOZ;;AyE/gOQ;EAOI,+BAAA;AzE4gOZ;;AyEnhOQ;EAOI,wBAAA;AzEghOZ;;AyEvhOQ;EAOI,2CAAA;AzEohOZ;;AyE3hOQ;EAOI,8CAAA;AzEwhOZ;;AyE/hOQ;EAOI,8CAAA;AzE4hOZ;;AyEniOQ;EAOI,2BAAA;AzEgiOZ;;AyEjjOQ;EACE,gFAAA;AzEojOV;;AyErjOQ;EACE,kFAAA;AzEwjOV;;AyEzjOQ;EACE,gFAAA;AzE4jOV;;AyE7jOQ;EACE,6EAAA;AzEgkOV;;AyEjkOQ;EACE,gFAAA;AzEokOV;;AyErkOQ;EACE,+EAAA;AzEwkOV;;AyEzkOQ;EACE,8EAAA;AzE4kOV;;AyE7kOQ;EACE,6EAAA;AzEglOV;;AyEvkOQ;EAOI,2BAAA;AzEokOZ;;AyE3kOQ;EAOI,6BAAA;AzEwkOZ;;AyE/kOQ;EAOI,6BAAA;AzE4kOZ;;AyEnlOQ;EAOI,0BAAA;AzEglOZ;;AyEvlOQ;EAOI,2BAAA;AzEolOZ;;AyE3lOQ;EAOI,iBAAA;AzEwlOZ;;AyE/lOQ;EAOI,mBAAA;AzE4lOZ;;AyEnmOQ;EAOI,oBAAA;AzEgmOZ;;AyEvmOQ;EAOI,oBAAA;AzEomOZ;;AyE3mOQ;EAOI,sBAAA;AzEwmOZ;;AyE/mOQ;EAOI,uBAAA;AzE4mOZ;;AyEnnOQ;EAOI,kBAAA;AzEgnOZ;;AyEvnOQ;EAOI,oBAAA;AzEonOZ;;AyE3nOQ;EAOI,qBAAA;AzEwnOZ;;AyE/nOQ;EAOI,mBAAA;AzE4nOZ;;AyEnoOQ;EAOI,qBAAA;AzEgoOZ;;AyEvoOQ;EAOI,sBAAA;AzEooOZ;;AyE3oOQ;EAOI,2CAAA;AzEwoOZ;;AyE/oOQ;EAOI,sCAAA;AzE4oOZ;;AyEnpOQ;EAOI,sCAAA;AzEgpOZ;;AyEvpOQ;EAOI,uFAAA;AzEopOZ;;AyE3pOQ;EAOI,oBAAA;AzEwpOZ;;AyE/pOQ;EAOI,2FAAA;AzE4pOZ;;AyEnqOQ;EAOI,wBAAA;AzEgqOZ;;AyEvqOQ;EAOI,6FAAA;AzEoqOZ;;AyE3qOQ;EAOI,0BAAA;AzEwqOZ;;AyE/qOQ;EAOI,8FAAA;AzE4qOZ;;AyEnrOQ;EAOI,2BAAA;AzEgrOZ;;AyEvrOQ;EAOI,4FAAA;AzEorOZ;;AyE3rOQ;EAOI,yBAAA;AzEwrOZ;;AyE/rOQ;EAIQ,sBAAA;EAGJ,8EAAA;AzE6rOZ;;AyEpsOQ;EAIQ,sBAAA;EAGJ,gFAAA;AzEksOZ;;AyEzsOQ;EAIQ,sBAAA;EAGJ,8EAAA;AzEusOZ;;AyE9sOQ;EAIQ,sBAAA;EAGJ,2EAAA;AzE4sOZ;;AyEntOQ;EAIQ,sBAAA;EAGJ,8EAAA;AzEitOZ;;AyExtOQ;EAIQ,sBAAA;EAGJ,6EAAA;AzEstOZ;;AyE7tOQ;EAIQ,sBAAA;EAGJ,4EAAA;AzE2tOZ;;AyEluOQ;EAIQ,sBAAA;EAGJ,2EAAA;AzEguOZ;;AyEvuOQ;EAIQ,sBAAA;EAGJ,4EAAA;AzEquOZ;;AyE5uOQ;EAIQ,sBAAA;EAGJ,4EAAA;AzE0uOZ;;AyEjvOQ;EAOI,wDAAA;AzE8uOZ;;AyErvOQ;EAOI,0DAAA;AzEkvOZ;;AyEzvOQ;EAOI,wDAAA;AzEsvOZ;;AyE7vOQ;EAOI,qDAAA;AzE0vOZ;;AyEjwOQ;EAOI,wDAAA;AzE8vOZ;;AyErwOQ;EAOI,uDAAA;AzEkwOZ;;AyEzwOQ;EAOI,sDAAA;AzEswOZ;;AyE7wOQ;EAOI,qDAAA;AzE0wOZ;;AyEjxOQ;EAOI,4BAAA;AzE8wOZ;;AyErxOQ;EAOI,4BAAA;AzEkxOZ;;AyEzxOQ;EAOI,4BAAA;AzEsxOZ;;AyE7xOQ;EAOI,4BAAA;AzE0xOZ;;AyEjyOQ;EAOI,4BAAA;AzE8xOZ;;AyE/yOQ;EACE,wBAAA;AzEkzOV;;AyEnzOQ;EACE,yBAAA;AzEszOV;;AyEvzOQ;EACE,wBAAA;AzE0zOV;;AyE3zOQ;EACE,yBAAA;AzE8zOV;;AyE/zOQ;EACE,sBAAA;AzEk0OV;;AyEzzOQ;EAOI,qBAAA;AzEszOZ;;AyE7zOQ;EAOI,qBAAA;AzE0zOZ;;AyEj0OQ;EAOI,qBAAA;AzE8zOZ;;AyEr0OQ;EAOI,sBAAA;AzEk0OZ;;AyEz0OQ;EAOI,sBAAA;AzEs0OZ;;AyE70OQ;EAOI,0BAAA;AzE00OZ;;AyEj1OQ;EAOI,uBAAA;AzE80OZ;;AyEr1OQ;EAOI,2BAAA;AzEk1OZ;;AyEz1OQ;EAOI,sBAAA;AzEs1OZ;;AyE71OQ;EAOI,sBAAA;AzE01OZ;;AyEj2OQ;EAOI,sBAAA;AzE81OZ;;AyEr2OQ;EAOI,uBAAA;AzEk2OZ;;AyEz2OQ;EAOI,uBAAA;AzEs2OZ;;AyE72OQ;EAOI,2BAAA;AzE02OZ;;AyEj3OQ;EAOI,wBAAA;AzE82OZ;;AyEr3OQ;EAOI,4BAAA;AzEk3OZ;;AyEz3OQ;EAOI,yBAAA;AzEs3OZ;;AyE73OQ;EAOI,8BAAA;AzE03OZ;;AyEj4OQ;EAOI,iCAAA;AzE83OZ;;AyEr4OQ;EAOI,sCAAA;AzEk4OZ;;AyEz4OQ;EAOI,yCAAA;AzEs4OZ;;AyE74OQ;EAOI,uBAAA;AzE04OZ;;AyEj5OQ;EAOI,uBAAA;AzE84OZ;;AyEr5OQ;EAOI,yBAAA;AzEk5OZ;;AyEz5OQ;EAOI,yBAAA;AzEs5OZ;;AyE75OQ;EAOI,0BAAA;AzE05OZ;;AyEj6OQ;EAOI,4BAAA;AzE85OZ;;AyEr6OQ;EAOI,kCAAA;AzEk6OZ;;AyEz6OQ;EAOI,sCAAA;AzEs6OZ;;AyE76OQ;EAOI,oCAAA;AzE06OZ;;AyEj7OQ;EAOI,kCAAA;AzE86OZ;;AyEr7OQ;EAOI,yCAAA;AzEk7OZ;;AyEz7OQ;EAOI,wCAAA;AzEs7OZ;;AyE77OQ;EAOI,wCAAA;AzE07OZ;;AyEj8OQ;EAOI,kCAAA;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AA;EzE61RV;EyEp2RM;IAOI,iCAAA;EzEg2RV;EyEv2RM;IAOI,sCAAA;EzEm2RV;EyE12RM;IAOI,yCAAA;EzEs2RV;EyE72RM;IAOI,uBAAA;EzEy2RV;EyEh3RM;IAOI,uBAAA;EzE42RV;EyEn3RM;IAOI,yBAAA;EzE+2RV;EyEt3RM;IAOI,yBAAA;EzEk3RV;EyEz3RM;IAOI,0BAAA;EzEq3RV;EyE53RM;IAOI,4BAAA;EzEw3RV;EyE/3RM;IAOI,kCAAA;EzE23RV;EyEl4RM;IAOI,sCAAA;EzE83RV;EyEr4RM;IAOI,oCAAA;EzEi4RV;EyEx4RM;IAOI,kCAAA;EzEo4RV;EyE34RM;IAOI,yCAAA;EzEu4RV;EyE94RM;IAOI,wCAAA;EzE04RV;EyEj5RM;IAOI,wCAAA;EzE64RV;EyEp5RM;IAOI,kCAAA;EzEg5RV;EyEv5RM;IAOI,gCAAA;EzEm5RV;EyE15RM;IAOI,8BAAA;EzEs5RV;EyE75RM;IAOI,gCAAA;EzEy5RV;EyEh6RM;IAOI,+BAAA;EzE45RV;EyEn6RM;IAOI,oCAAA;EzE+5RV;EyEt6RM;IAOI,kCAAA;EzEk6RV;EyEz6RM;IAOI,gCAAA;EzEq6RV;EyE56RM;IAOI,uCAAA;EzEw6RV;EyE/6RM;IAOI,sCAAA;EzE26RV;EyEl7RM;IAOI,iCAAA;EzE86RV;EyEr7RM;IAOI,2BAAA;EzEi7RV;EyEx7RM;IAOI,iCAAA;EzEo7RV;EyE37RM;IAOI,+BAAA;EzEu7RV;EyE97RM;IAOI,6BAAA;EzE07RV;EyEj8RM;IAOI,+BAAA;EzE67RV;EyEp8RM;IAOI,8BAAA;EzEg8RV;EyEv8RM;IAOI,oBAAA;EzEm8RV;EyE18RM;IAOI,mBAAA;EzEs8RV;EyE78RM;IAOI,mBAAA;EzEy8RV;EyEh9RM;IAOI,mBAAA;EzE48RV;EyEn9RM;IAOI,mBAAA;EzE+8RV;EyEt9RM;IAOI,mBAAA;EzEk9RV;EyEz9RM;IAOI,mBAAA;EzEq9RV;EyE59RM;IAOI,mBAAA;EzEw9RV;EyE/9RM;IAOI,oBAAA;EzE29RV;EyEl+RM;IAOI,0BAAA;EzE89RV;EyEr+RM;IAOI,yBAAA;EzEi+RV;E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V;EyEt2SM;IAOI,gCAAA;EzEk2SV;EyEz2SM;IAOI,yBAAA;EzEq2SV;EyE52SM;IAOI,wBAAA;EzEw2SV;EyE/2SM;IAOI,+BAAA;EzE22SV;EyEl3SM;IAOI,yBAAA;EzE82SV;EyEr3SM;IAOI,6BAAA;EzEi3SV;EyEx3SM;IAOI,8BAAA;EzEo3SV;EyE33SM;IAOI,wBAAA;EzEu3SV;EyE93SM;IAOI,+BAAA;EzE03SV;EyEj4SM;IAOI,wBAAA;EzE63SV;EyEp4SM;IAOI,yBAAA;EzEg4SV;EyEv4SM;IAOI,8BAAA;EzEm4SV;EyE14SM;IAOI,iCAAA;EzEs4SV;EyE74SM;IAOI,sCAAA;EzEy4SV;EyEh5SM;IAOI,yCAAA;EzE44SV;EyEn5SM;IAOI,uBAAA;EzE+4SV;EyEt5SM;IAOI,uBAAA;EzEk5SV;EyEz5SM;IAOI,yBAAA;EzEq5SV;EyE55SM;IAOI,yBAAA;EzEw5SV;EyE/5SM;IAOI,0BAAA;EzE25SV;EyEl6SM;IAOI,4BAAA;EzE85SV;EyEr6SM;IAOI,kCAAA;EzEi6SV;EyEx6SM;IAOI,sCAAA;EzEo6SV;EyE36SM;IAOI,oCAAA;EzEu6SV;EyE96SM;IAOI,kCAAA;EzE06SV;EyEj7SM;IAOI,yCAAA;EzE66SV;EyEp7SM;IAOI,wCAAA;EzEg7SV;EyEv7SM;IAOI,wCAAA;EzEm7SV;EyE17SM;IAOI,kCAAA;EzEs7SV;EyE77SM;IAOI,gCAAA;EzEy7SV;EyEh8SM;IAOI,8BAAA;EzE47SV;EyEn8SM;IAOI,gCAAA;EzE+7SV;EyEt8SM;IAOI,+BAAA;EzEk8SV;EyEz8SM;IAOI,oCAAA;EzEq8SV;EyE58SM;IAOI,kCAAA;EzEw8SV;EyE/8SM;IAOI,gCAAA;EzE28SV;EyEl9SM;IAOI,uCAAA;EzE88SV;EyEr9SM;IAOI,sCAAA;EzEi9SV;EyEx9SM;IAOI,iCAAA;EzEo9SV;EyE39SM;IAOI,2BAAA;EzEu9SV;EyE99SM;IAOI,iCAAA;EzE09SV;EyEj+SM;IAOI,+BAAA;EzE69SV;EyEp+SM;IAOI,6BAAA;EzEg+SV;EyEv+SM;IAOI,+BAAA;EzEm+SV;EyE1+SM;IA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OI,wBAAA;EzE++VV;EyEt/VM;IAOI,yBAAA;EzEk/VV;EyEz/VM;IAOI,8BAAA;EzEq/VV;EyE5/VM;IAOI,iCAAA;EzEw/VV;EyE//VM;IAOI,sCAAA;EzE2/VV;EyElgWM;IAOI,yCAAA;EzE8/VV;EyErgWM;IAOI,uBAAA;EzEigWV;EyExgWM;IAOI,uBAAA;EzEogWV;EyE3gWM;IAOI,yBAAA;EzEugWV;EyE9gWM;IAOI,yBAAA;EzE0gWV;EyEjhWM;IAOI,0BAAA;EzE6gWV;EyEphWM;IAOI,4BAAA;EzEghWV;EyEvhWM;IAOI,kCAAA;EzEmhWV;EyE1hWM;IAOI,sCAAA;EzEshWV;EyE7hWM;IAOI,oCAAA;EzEyhWV;EyEhiWM;IAOI,kCAAA;EzE4hWV;EyEniWM;IAOI,yCAAA;EzE+hWV;EyEtiWM;IAOI,wCAAA;EzEkiWV;EyEziWM;IAOI,wCAAA;EzEqiWV;EyE5iWM;IAOI,kCAAA;EzEwiWV;EyE/iWM;IAOI,gCAAA;EzE2iWV;EyEljWM;IAOI,8BAAA;EzE8iWV;EyErjWM;IAOI,gCAAA;EzEijWV;EyExjWM;IAOI,+BAAA;EzEojWV;EyE3jWM;IAOI,oCAAA;EzEujWV;EyE9jWM;IAOI,kCAAA;EzE0jWV;EyEjkWM;IAOI,gCAAA;EzE6jWV;EyEpkWM;IAOI,uCAAA;EzEgkWV;EyEvkWM;IAOI,sCAAA;EzEmkWV;EyE1kWM;IAOI,iCAAA;EzEskWV;EyE7kWM;IAOI,2BAAA;EzEykWV;EyEhlWM;IAOI,iCAAA;EzE4kWV;EyEnlWM;IAOI,+BAAA;EzE+kWV;EyEtlWM;IAOI,6BAAA;EzEklWV;EyEzlWM;IAOI,+BAAA;EzEqlWV;EyE5lWM;IAOI,8BAAA;EzEwlWV;EyE/lWM;IAOI,oBAAA;EzE2lWV;EyElmWM;IAOI,mBAAA;EzE8lWV;EyErmWM;IAOI,mBAAA;EzEimWV;EyExmWM;IAOI,mBAAA;EzEomWV;EyE3mWM;IAOI,mBAAA;EzEumWV;EyE9mWM;IAOI,mBAAA;EzE0mWV;EyEjnWM;IAOI,mBAAA;EzE6mWV;EyEpnWM;IAOI,mBAAA;EzEgnWV;EyEvnWM;IAOI,oBAAA;EzE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","file":"main.css","sourcesContent":["@charset \"UTF-8\";\n/*!\n * Bootstrap v5.3.8 (https://getbootstrap.com/)\n * Copyright 2011-2025 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n@import 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.3.0/css/all.min.css';\n:root,\n[data-bs-theme=light] {\n --bs-blue: #0d6efd;\n --bs-indigo: #6610f2;\n --bs-purple: #6f42c1;\n --bs-pink: #d63384;\n --bs-red: #dc3545;\n --bs-orange: #fd7e14;\n --bs-yellow: #ffc107;\n --bs-green: #198754;\n --bs-teal: #20c997;\n --bs-cyan: #0dcaf0;\n --bs-black: #000;\n --bs-white: #fff;\n --bs-gray: #6c757d;\n --bs-gray-dark: #343a40;\n --bs-gray-100: #f8f9fa;\n --bs-gray-200: #e9ecef;\n --bs-gray-300: #dee2e6;\n --bs-gray-400: #ced4da;\n --bs-gray-500: #adb5bd;\n --bs-gray-600: #6c757d;\n --bs-gray-700: #495057;\n --bs-gray-800: #343a40;\n --bs-gray-900: #212529;\n --bs-primary: #0d6efd;\n --bs-secondary: #6c757d;\n --bs-success: #198754;\n --bs-info: #0dcaf0;\n --bs-warning: #ffc107;\n --bs-danger: #dc3545;\n --bs-light: #f8f9fa;\n --bs-dark: #212529;\n --bs-primary-rgb: 13, 110, 253;\n --bs-secondary-rgb: 108, 117, 125;\n --bs-success-rgb: 25, 135, 84;\n --bs-info-rgb: 13, 202, 240;\n --bs-warning-rgb: 255, 193, 7;\n --bs-danger-rgb: 220, 53, 69;\n --bs-light-rgb: 248, 249, 250;\n --bs-dark-rgb: 33, 37, 41;\n --bs-primary-text-emphasis: rgb(2.0392156863%, 17.2549019608%, 39.6862745098%);\n --bs-secondary-text-emphasis: rgb(16.9411764706%, 18.3529411765%, 19.6078431373%);\n --bs-success-text-emphasis: rgb(3.9215686275%, 21.1764705882%, 13.1764705882%);\n --bs-info-text-emphasis: rgb(2.0392156863%, 31.6862745098%, 37.6470588235%);\n --bs-warning-text-emphasis: rgb(40%, 30.2745098039%, 1.0980392157%);\n --bs-danger-text-emphasis: rgb(34.5098039216%, 8.3137254902%, 10.8235294118%);\n --bs-light-text-emphasis: #495057;\n --bs-dark-text-emphasis: #495057;\n --bs-primary-bg-subtle: rgb(81.0196078431%, 88.6274509804%, 99.8431372549%);\n --bs-secondary-bg-subtle: rgb(88.4705882353%, 89.1764705882%, 89.8039215686%);\n --bs-success-bg-subtle: rgb(81.9607843137%, 90.5882352941%, 86.5882352941%);\n --bs-info-bg-subtle: rgb(81.0196078431%, 95.8431372549%, 98.8235294118%);\n --bs-warning-bg-subtle: rgb(100%, 95.137254902%, 80.5490196078%);\n --bs-danger-bg-subtle: rgb(97.2549019608%, 84.1568627451%, 85.4117647059%);\n --bs-light-bg-subtle: rgb(98.6274509804%, 98.8235294118%, 99.0196078431%);\n --bs-dark-bg-subtle: #ced4da;\n --bs-primary-border-subtle: rgb(62.0392156863%, 77.2549019608%, 99.6862745098%);\n --bs-secondary-border-subtle: rgb(76.9411764706%, 78.3529411765%, 79.6078431373%);\n --bs-success-border-subtle: rgb(63.9215686275%, 81.1764705882%, 73.1764705882%);\n --bs-info-border-subtle: rgb(62.0392156863%, 91.6862745098%, 97.6470588235%);\n --bs-warning-border-subtle: rgb(100%, 90.2745098039%, 61.0980392157%);\n --bs-danger-border-subtle: rgb(94.5098039216%, 68.3137254902%, 70.8235294118%);\n --bs-light-border-subtle: #e9ecef;\n --bs-dark-border-subtle: #adb5bd;\n --bs-white-rgb: 255, 255, 255;\n --bs-black-rgb: 0, 0, 0;\n --bs-font-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));\n --bs-body-font-family: var(--bs-font-sans-serif);\n --bs-body-font-size: 1rem;\n --bs-body-font-weight: 400;\n --bs-body-line-height: 1.5;\n --bs-body-color: #212529;\n --bs-body-color-rgb: 33, 37, 41;\n --bs-body-bg: #fff;\n --bs-body-bg-rgb: 255, 255, 255;\n --bs-emphasis-color: #000;\n --bs-emphasis-color-rgb: 0, 0, 0;\n --bs-secondary-color: rgba(33, 37, 41, 0.75);\n --bs-secondary-color-rgb: 33, 37, 41;\n --bs-secondary-bg: #e9ecef;\n --bs-secondary-bg-rgb: 233, 236, 239;\n --bs-tertiary-color: rgba(33, 37, 41, 0.5);\n --bs-tertiary-color-rgb: 33, 37, 41;\n --bs-tertiary-bg: #f8f9fa;\n --bs-tertiary-bg-rgb: 248, 249, 250;\n --bs-heading-color: inherit;\n --bs-link-color: #0d6efd;\n --bs-link-color-rgb: 13, 110, 253;\n --bs-link-decoration: underline;\n --bs-link-hover-color: rgb(4.0784313725%, 34.5098039216%, 79.3725490196%);\n --bs-link-hover-color-rgb: 10, 88, 202;\n --bs-code-color: #d63384;\n --bs-highlight-color: #212529;\n --bs-highlight-bg: rgb(100%, 95.137254902%, 80.5490196078%);\n --bs-border-width: 1px;\n --bs-border-style: solid;\n --bs-border-color: #dee2e6;\n --bs-border-color-translucent: rgba(0, 0, 0, 0.175);\n --bs-border-radius: 0.375rem;\n --bs-border-radius-sm: 0.25rem;\n --bs-border-radius-lg: 0.5rem;\n --bs-border-radius-xl: 1rem;\n --bs-border-radius-xxl: 2rem;\n --bs-border-radius-2xl: var(--bs-border-radius-xxl);\n --bs-border-radius-pill: 50rem;\n --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);\n --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);\n --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);\n --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);\n --bs-focus-ring-width: 0.25rem;\n --bs-focus-ring-opacity: 0.25;\n --bs-focus-ring-color: rgba(13, 110, 253, 0.25);\n --bs-form-valid-color: #198754;\n --bs-form-valid-border-color: #198754;\n --bs-form-invalid-color: #dc3545;\n --bs-form-invalid-border-color: #dc3545;\n}\n\n[data-bs-theme=dark] {\n color-scheme: dark;\n --bs-body-color: #dee2e6;\n --bs-body-color-rgb: 222, 226, 230;\n --bs-body-bg: #212529;\n --bs-body-bg-rgb: 33, 37, 41;\n --bs-emphasis-color: #fff;\n --bs-emphasis-color-rgb: 255, 255, 255;\n --bs-secondary-color: rgba(222, 226, 230, 0.75);\n --bs-secondary-color-rgb: 222, 226, 230;\n --bs-secondary-bg: #343a40;\n --bs-secondary-bg-rgb: 52, 58, 64;\n --bs-tertiary-color: rgba(222, 226, 230, 0.5);\n --bs-tertiary-color-rgb: 222, 226, 230;\n --bs-tertiary-bg: rgb(16.6666666667%, 18.6274509804%, 20.5882352941%);\n --bs-tertiary-bg-rgb: 43, 48, 53;\n --bs-primary-text-emphasis: rgb(43.0588235294%, 65.8823529412%, 99.5294117647%);\n --bs-secondary-text-emphasis: rgb(65.4117647059%, 67.5294117647%, 69.4117647059%);\n --bs-success-text-emphasis: rgb(45.8823529412%, 71.7647058824%, 59.7647058824%);\n --bs-info-text-emphasis: rgb(43.0588235294%, 87.5294117647%, 96.4705882353%);\n --bs-warning-text-emphasis: rgb(100%, 85.4117647059%, 41.6470588235%);\n --bs-danger-text-emphasis: rgb(91.7647058824%, 52.4705882353%, 56.2352941176%);\n --bs-light-text-emphasis: #f8f9fa;\n --bs-dark-text-emphasis: #dee2e6;\n --bs-primary-bg-subtle: rgb(1.0196078431%, 8.6274509804%, 19.8431372549%);\n --bs-secondary-bg-subtle: rgb(8.4705882353%, 9.1764705882%, 9.8039215686%);\n --bs-success-bg-subtle: rgb(1.9607843137%, 10.5882352941%, 6.5882352941%);\n --bs-info-bg-subtle: rgb(1.0196078431%, 15.8431372549%, 18.8235294118%);\n --bs-warning-bg-subtle: rgb(20%, 15.137254902%, 0.5490196078%);\n --bs-danger-bg-subtle: rgb(17.2549019608%, 4.1568627451%, 5.4117647059%);\n --bs-light-bg-subtle: #343a40;\n --bs-dark-bg-subtle: #1a1d20;\n --bs-primary-border-subtle: rgb(3.0588235294%, 25.8823529412%, 59.5294117647%);\n --bs-secondary-border-subtle: rgb(25.4117647059%, 27.5294117647%, 29.4117647059%);\n --bs-success-border-subtle: rgb(5.8823529412%, 31.7647058824%, 19.7647058824%);\n --bs-info-border-subtle: rgb(3.0588235294%, 47.5294117647%, 56.4705882353%);\n --bs-warning-border-subtle: rgb(60%, 45.4117647059%, 1.6470588235%);\n --bs-danger-border-subtle: rgb(51.7647058824%, 12.4705882353%, 16.2352941176%);\n --bs-light-border-subtle: #495057;\n --bs-dark-border-subtle: #343a40;\n --bs-heading-color: inherit;\n --bs-link-color: rgb(43.0588235294%, 65.8823529412%, 99.5294117647%);\n --bs-link-hover-color: rgb(54.4470588235%, 72.7058823529%, 99.6235294118%);\n --bs-link-color-rgb: 110, 168, 254;\n --bs-link-hover-color-rgb: 139, 185, 254;\n --bs-code-color: rgb(90.3529411765%, 52%, 71.0588235294%);\n --bs-highlight-color: #dee2e6;\n --bs-highlight-bg: rgb(40%, 30.2745098039%, 1.0980392157%);\n --bs-border-color: #495057;\n --bs-border-color-translucent: rgba(255, 255, 255, 0.15);\n --bs-form-valid-color: rgb(45.8823529412%, 71.7647058824%, 59.7647058824%);\n --bs-form-valid-border-color: rgb(45.8823529412%, 71.7647058824%, 59.7647058824%);\n --bs-form-invalid-color: rgb(91.7647058824%, 52.4705882353%, 56.2352941176%);\n --bs-form-invalid-border-color: rgb(91.7647058824%, 52.4705882353%, 56.2352941176%);\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n :root {\n scroll-behavior: smooth;\n }\n}\n\nbody {\n margin: 0;\n font-family: var(--bs-body-font-family);\n font-size: var(--bs-body-font-size);\n font-weight: var(--bs-body-font-weight);\n line-height: var(--bs-body-line-height);\n color: var(--bs-body-color);\n text-align: var(--bs-body-text-align);\n background-color: var(--bs-body-bg);\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nhr {\n margin: 1rem 0;\n color: inherit;\n border: 0;\n border-top: var(--bs-border-width) solid;\n opacity: 0.25;\n}\n\nh6, .h6, h5, .h5, h4, .h4, h3, .h3, h2, .h2, h1, .h1 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n font-weight: 500;\n line-height: 1.2;\n color: var(--bs-heading-color);\n}\n\nh1, .h1 {\n font-size: calc(1.375rem + 1.5vw);\n}\n@media (min-width: 1200px) {\n h1, .h1 {\n font-size: 2.5rem;\n }\n}\n\nh2, .h2 {\n font-size: calc(1.325rem + 0.9vw);\n}\n@media (min-width: 1200px) {\n h2, .h2 {\n font-size: 2rem;\n }\n}\n\nh3, .h3 {\n font-size: calc(1.3rem + 0.6vw);\n}\n@media (min-width: 1200px) {\n h3, .h3 {\n font-size: 1.75rem;\n }\n}\n\nh4, .h4 {\n font-size: calc(1.275rem + 0.3vw);\n}\n@media (min-width: 1200px) {\n h4, .h4 {\n font-size: 1.5rem;\n }\n}\n\nh5, .h5 {\n font-size: 1.25rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title] {\n text-decoration: underline dotted;\n cursor: help;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: 0.5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall, .small {\n font-size: 0.875em;\n}\n\nmark, .mark {\n padding: 0.1875em;\n color: var(--bs-highlight-color);\n background-color: var(--bs-highlight-bg);\n}\n\nsub,\nsup {\n position: relative;\n font-size: 0.75em;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\na {\n color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));\n text-decoration: underline;\n}\na:hover {\n --bs-link-color-rgb: var(--bs-link-hover-color-rgb);\n}\n\na:not([href]):not([class]), a:not([href]):not([class]):hover {\n color: inherit;\n text-decoration: none;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: var(--bs-font-monospace);\n font-size: 1em;\n}\n\npre {\n display: block;\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n font-size: 0.875em;\n}\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\ncode {\n font-size: 0.875em;\n color: var(--bs-code-color);\n word-wrap: break-word;\n}\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.1875rem 0.375rem;\n font-size: 0.875em;\n color: var(--bs-body-bg);\n background-color: var(--bs-body-color);\n border-radius: 0.25rem;\n}\nkbd kbd {\n padding: 0;\n font-size: 1em;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n color: var(--bs-secondary-color);\n text-align: left;\n}\n\nth {\n text-align: inherit;\n text-align: -webkit-match-parent;\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\nlabel {\n display: inline-block;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\n[role=button] {\n cursor: pointer;\n}\n\nselect {\n word-wrap: normal;\n}\nselect:disabled {\n opacity: 1;\n}\n\n[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {\n display: none !important;\n}\n\nbutton,\n[type=button],\n[type=reset],\n[type=submit] {\n -webkit-appearance: button;\n}\nbutton:not(:disabled),\n[type=button]:not(:disabled),\n[type=reset]:not(:disabled),\n[type=submit]:not(:disabled) {\n cursor: pointer;\n}\n\n::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ntextarea {\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n float: left;\n width: 100%;\n padding: 0;\n margin-bottom: 0.5rem;\n line-height: inherit;\n font-size: calc(1.275rem + 0.3vw);\n}\n@media (min-width: 1200px) {\n legend {\n font-size: 1.5rem;\n }\n}\nlegend + * {\n clear: left;\n}\n\n::-webkit-datetime-edit-fields-wrapper,\n::-webkit-datetime-edit-text,\n::-webkit-datetime-edit-minute,\n::-webkit-datetime-edit-hour-field,\n::-webkit-datetime-edit-day-field,\n::-webkit-datetime-edit-month-field,\n::-webkit-datetime-edit-year-field {\n padding: 0;\n}\n\n::-webkit-inner-spin-button {\n height: auto;\n}\n\n[type=search] {\n -webkit-appearance: textfield;\n outline-offset: -2px;\n}\n[type=search]::-webkit-search-cancel-button {\n cursor: pointer;\n filter: grayscale(1);\n}\n\n/* rtl:raw:\n[type=\"tel\"],\n[type=\"url\"],\n[type=\"email\"],\n[type=\"number\"] {\n direction: ltr;\n}\n*/\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-color-swatch-wrapper {\n padding: 0;\n}\n\n::file-selector-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\niframe {\n border: 0;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[hidden] {\n display: none !important;\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-weight: 300;\n line-height: 1.2;\n font-size: calc(1.625rem + 4.5vw);\n}\n@media (min-width: 1200px) {\n .display-1 {\n font-size: 5rem;\n }\n}\n\n.display-2 {\n font-weight: 300;\n line-height: 1.2;\n font-size: calc(1.575rem + 3.9vw);\n}\n@media (min-width: 1200px) {\n .display-2 {\n font-size: 4.5rem;\n }\n}\n\n.display-3 {\n font-weight: 300;\n line-height: 1.2;\n font-size: calc(1.525rem + 3.3vw);\n}\n@media (min-width: 1200px) {\n .display-3 {\n font-size: 4rem;\n }\n}\n\n.display-4 {\n font-weight: 300;\n line-height: 1.2;\n font-size: calc(1.475rem + 2.7vw);\n}\n@media (min-width: 1200px) {\n .display-4 {\n font-size: 3.5rem;\n }\n}\n\n.display-5 {\n font-weight: 300;\n line-height: 1.2;\n font-size: calc(1.425rem + 2.1vw);\n}\n@media (min-width: 1200px) {\n .display-5 {\n font-size: 3rem;\n }\n}\n\n.display-6 {\n font-weight: 300;\n line-height: 1.2;\n font-size: calc(1.375rem + 1.5vw);\n}\n@media (min-width: 1200px) {\n .display-6 {\n font-size: 2.5rem;\n }\n}\n\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n.list-inline-item:not(:last-child) {\n margin-right: 0.5rem;\n}\n\n.initialism {\n font-size: 0.875em;\n text-transform: uppercase;\n}\n\n.blockquote {\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n.blockquote > :last-child {\n margin-bottom: 0;\n}\n\n.blockquote-footer {\n margin-top: -1rem;\n margin-bottom: 1rem;\n font-size: 0.875em;\n color: #6c757d;\n}\n.blockquote-footer::before {\n content: \"— \";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.25rem;\n background-color: var(--bs-body-bg);\n border: var(--bs-border-width) solid var(--bs-border-color);\n border-radius: var(--bs-border-radius);\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.5rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 0.875em;\n color: var(--bs-secondary-color);\n}\n\n.container,\n.container-fluid,\n.container-xxl,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container-sm, .container {\n max-width: 540px;\n }\n}\n@media (min-width: 768px) {\n .container-md, .container-sm, .container {\n max-width: 720px;\n }\n}\n@media (min-width: 992px) {\n .container-lg, .container-md, .container-sm, .container {\n max-width: 960px;\n }\n}\n@media (min-width: 1200px) {\n .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1140px;\n }\n}\n@media (min-width: 1400px) {\n .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1320px;\n }\n}\n:root {\n --bs-breakpoint-xs: 0;\n --bs-breakpoint-sm: 576px;\n --bs-breakpoint-md: 768px;\n --bs-breakpoint-lg: 992px;\n --bs-breakpoint-xl: 1200px;\n --bs-breakpoint-xxl: 1400px;\n}\n\n.row {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n margin-top: calc(-1 * var(--bs-gutter-y));\n margin-right: calc(-0.5 * var(--bs-gutter-x));\n margin-left: calc(-0.5 * var(--bs-gutter-x));\n}\n.row > * {\n flex-shrink: 0;\n width: 100%;\n max-width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-top: var(--bs-gutter-y);\n}\n\n.col {\n flex: 1 0 0;\n}\n\n.row-cols-auto > * {\n flex: 0 0 auto;\n width: auto;\n}\n\n.row-cols-1 > * {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.row-cols-2 > * {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.row-cols-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.row-cols-4 > * {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.row-cols-5 > * {\n flex: 0 0 auto;\n width: 20%;\n}\n\n.row-cols-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n}\n\n.col-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n}\n\n.col-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-3 {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.col-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.col-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n}\n\n.col-6 {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.col-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n}\n\n.col-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n}\n\n.col-9 {\n flex: 0 0 auto;\n width: 75%;\n}\n\n.col-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n}\n\n.col-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n}\n\n.col-12 {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.offset-1 {\n margin-left: 8.33333333%;\n}\n\n.offset-2 {\n margin-left: 16.66666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.33333333%;\n}\n\n.offset-5 {\n margin-left: 41.66666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.33333333%;\n}\n\n.offset-8 {\n margin-left: 66.66666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.33333333%;\n}\n\n.offset-11 {\n margin-left: 91.66666667%;\n}\n\n.g-0,\n.gx-0 {\n --bs-gutter-x: 0;\n}\n\n.g-0,\n.gy-0 {\n --bs-gutter-y: 0;\n}\n\n.g-1,\n.gx-1 {\n --bs-gutter-x: 0.25rem;\n}\n\n.g-1,\n.gy-1 {\n --bs-gutter-y: 0.25rem;\n}\n\n.g-2,\n.gx-2 {\n --bs-gutter-x: 0.5rem;\n}\n\n.g-2,\n.gy-2 {\n --bs-gutter-y: 0.5rem;\n}\n\n.g-3,\n.gx-3 {\n --bs-gutter-x: 1rem;\n}\n\n.g-3,\n.gy-3 {\n --bs-gutter-y: 1rem;\n}\n\n.g-4,\n.gx-4 {\n --bs-gutter-x: 1.5rem;\n}\n\n.g-4,\n.gy-4 {\n --bs-gutter-y: 1.5rem;\n}\n\n.g-5,\n.gx-5 {\n --bs-gutter-x: 3rem;\n}\n\n.g-5,\n.gy-5 {\n --bs-gutter-y: 3rem;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex: 1 0 0;\n }\n .row-cols-sm-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-sm-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-sm-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-sm-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-sm-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-sm-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-sm-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-sm-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-sm-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-sm-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-sm-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-sm-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-sm-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-sm-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-sm-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.33333333%;\n }\n .offset-sm-2 {\n margin-left: 16.66666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.33333333%;\n }\n .offset-sm-5 {\n margin-left: 41.66666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.33333333%;\n }\n .offset-sm-8 {\n margin-left: 66.66666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.33333333%;\n }\n .offset-sm-11 {\n margin-left: 91.66666667%;\n }\n .g-sm-0,\n .gx-sm-0 {\n --bs-gutter-x: 0;\n }\n .g-sm-0,\n .gy-sm-0 {\n --bs-gutter-y: 0;\n }\n .g-sm-1,\n .gx-sm-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-sm-1,\n .gy-sm-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-sm-2,\n .gx-sm-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-sm-2,\n .gy-sm-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-sm-3,\n .gx-sm-3 {\n --bs-gutter-x: 1rem;\n }\n .g-sm-3,\n .gy-sm-3 {\n --bs-gutter-y: 1rem;\n }\n .g-sm-4,\n .gx-sm-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-sm-4,\n .gy-sm-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-sm-5,\n .gx-sm-5 {\n --bs-gutter-x: 3rem;\n }\n .g-sm-5,\n .gy-sm-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 768px) {\n .col-md {\n flex: 1 0 0;\n }\n .row-cols-md-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-md-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-md-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-md-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-md-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-md-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-md-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-md-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-md-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-md-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-md-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-md-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-md-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-md-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-md-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-md-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-md-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-md-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.33333333%;\n }\n .offset-md-2 {\n margin-left: 16.66666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.33333333%;\n }\n .offset-md-5 {\n margin-left: 41.66666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.33333333%;\n }\n .offset-md-8 {\n margin-left: 66.66666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.33333333%;\n }\n .offset-md-11 {\n margin-left: 91.66666667%;\n }\n .g-md-0,\n .gx-md-0 {\n --bs-gutter-x: 0;\n }\n .g-md-0,\n .gy-md-0 {\n --bs-gutter-y: 0;\n }\n .g-md-1,\n .gx-md-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-md-1,\n .gy-md-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-md-2,\n .gx-md-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-md-2,\n .gy-md-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-md-3,\n .gx-md-3 {\n --bs-gutter-x: 1rem;\n }\n .g-md-3,\n .gy-md-3 {\n --bs-gutter-y: 1rem;\n }\n .g-md-4,\n .gx-md-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-md-4,\n .gy-md-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-md-5,\n .gx-md-5 {\n --bs-gutter-x: 3rem;\n }\n .g-md-5,\n .gy-md-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 992px) {\n .col-lg {\n flex: 1 0 0;\n }\n .row-cols-lg-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-lg-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-lg-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-lg-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-lg-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-lg-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-lg-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-lg-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-lg-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-lg-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-lg-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-lg-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-lg-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-lg-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-lg-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.33333333%;\n }\n .offset-lg-2 {\n margin-left: 16.66666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.33333333%;\n }\n .offset-lg-5 {\n margin-left: 41.66666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.33333333%;\n }\n .offset-lg-8 {\n margin-left: 66.66666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.33333333%;\n }\n .offset-lg-11 {\n margin-left: 91.66666667%;\n }\n .g-lg-0,\n .gx-lg-0 {\n --bs-gutter-x: 0;\n }\n .g-lg-0,\n .gy-lg-0 {\n --bs-gutter-y: 0;\n }\n .g-lg-1,\n .gx-lg-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-lg-1,\n .gy-lg-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-lg-2,\n .gx-lg-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-lg-2,\n .gy-lg-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-lg-3,\n .gx-lg-3 {\n --bs-gutter-x: 1rem;\n }\n .g-lg-3,\n .gy-lg-3 {\n --bs-gutter-y: 1rem;\n }\n .g-lg-4,\n .gx-lg-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-lg-4,\n .gy-lg-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-lg-5,\n .gx-lg-5 {\n --bs-gutter-x: 3rem;\n }\n .g-lg-5,\n .gy-lg-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1200px) {\n .col-xl {\n flex: 1 0 0;\n }\n .row-cols-xl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xl-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-xl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xl-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xl-11 {\n margin-left: 91.66666667%;\n }\n .g-xl-0,\n .gx-xl-0 {\n --bs-gutter-x: 0;\n }\n .g-xl-0,\n .gy-xl-0 {\n --bs-gutter-y: 0;\n }\n .g-xl-1,\n .gx-xl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xl-1,\n .gy-xl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xl-2,\n .gx-xl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xl-2,\n .gy-xl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xl-3,\n .gx-xl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xl-3,\n .gy-xl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xl-4,\n .gx-xl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xl-4,\n .gy-xl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xl-5,\n .gx-xl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xl-5,\n .gy-xl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1400px) {\n .col-xxl {\n flex: 1 0 0;\n }\n .row-cols-xxl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xxl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xxl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xxl-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-xxl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xxl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xxl-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xxl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xxl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xxl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xxl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xxl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xxl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xxl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xxl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xxl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xxl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xxl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xxl-0 {\n margin-left: 0;\n }\n .offset-xxl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xxl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xxl-3 {\n margin-left: 25%;\n }\n .offset-xxl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xxl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xxl-6 {\n margin-left: 50%;\n }\n .offset-xxl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xxl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xxl-9 {\n margin-left: 75%;\n }\n .offset-xxl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xxl-11 {\n margin-left: 91.66666667%;\n }\n .g-xxl-0,\n .gx-xxl-0 {\n --bs-gutter-x: 0;\n }\n .g-xxl-0,\n .gy-xxl-0 {\n --bs-gutter-y: 0;\n }\n .g-xxl-1,\n .gx-xxl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xxl-1,\n .gy-xxl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xxl-2,\n .gx-xxl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xxl-2,\n .gy-xxl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xxl-3,\n .gx-xxl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xxl-3,\n .gy-xxl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xxl-4,\n .gx-xxl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xxl-4,\n .gy-xxl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xxl-5,\n .gx-xxl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xxl-5,\n .gy-xxl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n.table {\n --bs-table-color-type: initial;\n --bs-table-bg-type: initial;\n --bs-table-color-state: initial;\n --bs-table-bg-state: initial;\n --bs-table-color: var(--bs-emphasis-color);\n --bs-table-bg: var(--bs-body-bg);\n --bs-table-border-color: var(--bs-border-color);\n --bs-table-accent-bg: transparent;\n --bs-table-striped-color: var(--bs-emphasis-color);\n --bs-table-striped-bg: rgba(var(--bs-emphasis-color-rgb), 0.05);\n --bs-table-active-color: var(--bs-emphasis-color);\n --bs-table-active-bg: rgba(var(--bs-emphasis-color-rgb), 0.1);\n --bs-table-hover-color: var(--bs-emphasis-color);\n --bs-table-hover-bg: rgba(var(--bs-emphasis-color-rgb), 0.075);\n width: 100%;\n margin-bottom: 1rem;\n vertical-align: top;\n border-color: var(--bs-table-border-color);\n}\n.table > :not(caption) > * > * {\n padding: 0.5rem 0.5rem;\n color: var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));\n background-color: var(--bs-table-bg);\n border-bottom-width: var(--bs-border-width);\n box-shadow: inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)));\n}\n.table > tbody {\n vertical-align: inherit;\n}\n.table > thead {\n vertical-align: bottom;\n}\n\n.table-group-divider {\n border-top: calc(var(--bs-border-width) * 2) solid currentcolor;\n}\n\n.caption-top {\n caption-side: top;\n}\n\n.table-sm > :not(caption) > * > * {\n padding: 0.25rem 0.25rem;\n}\n\n.table-bordered > :not(caption) > * {\n border-width: var(--bs-border-width) 0;\n}\n.table-bordered > :not(caption) > * > * {\n border-width: 0 var(--bs-border-width);\n}\n\n.table-borderless > :not(caption) > * > * {\n border-bottom-width: 0;\n}\n.table-borderless > :not(:first-child) {\n border-top-width: 0;\n}\n\n.table-striped > tbody > tr:nth-of-type(odd) > * {\n --bs-table-color-type: var(--bs-table-striped-color);\n --bs-table-bg-type: var(--bs-table-striped-bg);\n}\n\n.table-striped-columns > :not(caption) > tr > :nth-child(even) {\n --bs-table-color-type: var(--bs-table-striped-color);\n --bs-table-bg-type: var(--bs-table-striped-bg);\n}\n\n.table-active {\n --bs-table-color-state: var(--bs-table-active-color);\n --bs-table-bg-state: var(--bs-table-active-bg);\n}\n\n.table-hover > tbody > tr:hover > * {\n --bs-table-color-state: var(--bs-table-hover-color);\n --bs-table-bg-state: var(--bs-table-hover-bg);\n}\n\n.table-primary {\n --bs-table-color: #000;\n --bs-table-bg: rgb(81.0196078431%, 88.6274509804%, 99.8431372549%);\n --bs-table-border-color: rgb(64.8156862745%, 70.9019607843%, 79.8745098039%);\n --bs-table-striped-bg: rgb(76.968627451%, 84.1960784314%, 94.8509803922%);\n --bs-table-striped-color: #000;\n --bs-table-active-bg: rgb(72.9176470588%, 79.7647058824%, 89.8588235294%);\n --bs-table-active-color: #000;\n --bs-table-hover-bg: rgb(74.9431372549%, 81.9803921569%, 92.3549019608%);\n --bs-table-hover-color: #000;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-secondary {\n --bs-table-color: #000;\n --bs-table-bg: rgb(88.4705882353%, 89.1764705882%, 89.8039215686%);\n --bs-table-border-color: rgb(70.7764705882%, 71.3411764706%, 71.8431372549%);\n --bs-table-striped-bg: rgb(84.0470588235%, 84.7176470588%, 85.3137254902%);\n --bs-table-striped-color: #000;\n --bs-table-active-bg: rgb(79.6235294118%, 80.2588235294%, 80.8235294118%);\n --bs-table-active-color: #000;\n --bs-table-hover-bg: rgb(81.8352941176%, 82.4882352941%, 83.068627451%);\n --bs-table-hover-color: #000;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-success {\n --bs-table-color: #000;\n --bs-table-bg: rgb(81.9607843137%, 90.5882352941%, 86.5882352941%);\n --bs-table-border-color: rgb(65.568627451%, 72.4705882353%, 69.2705882353%);\n --bs-table-striped-bg: rgb(77.862745098%, 86.0588235294%, 82.2588235294%);\n --bs-table-striped-color: #000;\n --bs-table-active-bg: rgb(73.7647058824%, 81.5294117647%, 77.9294117647%);\n --bs-table-active-color: #000;\n --bs-table-hover-bg: rgb(75.8137254902%, 83.7941176471%, 80.0941176471%);\n --bs-table-hover-color: #000;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-info {\n --bs-table-color: #000;\n --bs-table-bg: rgb(81.0196078431%, 95.8431372549%, 98.8235294118%);\n --bs-table-border-color: rgb(64.8156862745%, 76.6745098039%, 79.0588235294%);\n --bs-table-striped-bg: rgb(76.968627451%, 91.0509803922%, 93.8823529412%);\n --bs-table-striped-color: #000;\n --bs-table-active-bg: rgb(72.9176470588%, 86.2588235294%, 88.9411764706%);\n --bs-table-active-color: #000;\n --bs-table-hover-bg: rgb(74.9431372549%, 88.6549019608%, 91.4117647059%);\n --bs-table-hover-color: #000;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-warning {\n --bs-table-color: #000;\n --bs-table-bg: rgb(100%, 95.137254902%, 80.5490196078%);\n --bs-table-border-color: rgb(80%, 76.1098039216%, 64.4392156863%);\n --bs-table-striped-bg: rgb(95%, 90.3803921569%, 76.5215686275%);\n --bs-table-striped-color: #000;\n --bs-table-active-bg: rgb(90%, 85.6235294118%, 72.4941176471%);\n --bs-table-active-color: #000;\n --bs-table-hover-bg: rgb(92.5%, 88.0019607843%, 74.5078431373%);\n --bs-table-hover-color: #000;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-danger {\n --bs-table-color: #000;\n --bs-table-bg: rgb(97.2549019608%, 84.1568627451%, 85.4117647059%);\n --bs-table-border-color: rgb(77.8039215686%, 67.3254901961%, 68.3294117647%);\n --bs-table-striped-bg: rgb(92.3921568627%, 79.9490196078%, 81.1411764706%);\n --bs-table-striped-color: #000;\n --bs-table-active-bg: rgb(87.5294117647%, 75.7411764706%, 76.8705882353%);\n --bs-table-active-color: #000;\n --bs-table-hover-bg: rgb(89.9607843137%, 77.8450980392%, 79.0058823529%);\n --bs-table-hover-color: #000;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-light {\n --bs-table-color: #000;\n --bs-table-bg: #f8f9fa;\n --bs-table-border-color: rgb(77.8039215686%, 78.1176470588%, 78.431372549%);\n --bs-table-striped-bg: rgb(92.3921568627%, 92.7647058824%, 93.137254902%);\n --bs-table-striped-color: #000;\n --bs-table-active-bg: rgb(87.5294117647%, 87.8823529412%, 88.2352941176%);\n --bs-table-active-color: #000;\n --bs-table-hover-bg: rgb(89.9607843137%, 90.3235294118%, 90.6862745098%);\n --bs-table-hover-color: #000;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-dark {\n --bs-table-color: #fff;\n --bs-table-bg: #212529;\n --bs-table-border-color: rgb(30.3529411765%, 31.6078431373%, 32.862745098%);\n --bs-table-striped-bg: rgb(17.2941176471%, 18.7843137255%, 20.2745098039%);\n --bs-table-striped-color: #fff;\n --bs-table-active-bg: rgb(21.6470588235%, 23.0588235294%, 24.4705882353%);\n --bs-table-active-color: #fff;\n --bs-table-hover-bg: rgb(19.4705882353%, 20.9215686275%, 22.3725490196%);\n --bs-table-hover-color: #fff;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-responsive {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n@media (max-width: 575.98px) {\n .table-responsive-sm {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n}\n@media (max-width: 767.98px) {\n .table-responsive-md {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n}\n@media (max-width: 991.98px) {\n .table-responsive-lg {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n}\n@media (max-width: 1199.98px) {\n .table-responsive-xl {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n}\n@media (max-width: 1399.98px) {\n .table-responsive-xxl {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n}\n.form-label {\n margin-bottom: 0.5rem;\n}\n\n.col-form-label {\n padding-top: calc(0.375rem + var(--bs-border-width));\n padding-bottom: calc(0.375rem + var(--bs-border-width));\n margin-bottom: 0;\n font-size: inherit;\n line-height: 1.5;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.5rem + var(--bs-border-width));\n padding-bottom: calc(0.5rem + var(--bs-border-width));\n font-size: 1.25rem;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.25rem + var(--bs-border-width));\n padding-bottom: calc(0.25rem + var(--bs-border-width));\n font-size: 0.875rem;\n}\n\n.form-text {\n margin-top: 0.25rem;\n font-size: 0.875em;\n color: var(--bs-secondary-color);\n}\n\n.form-control {\n display: block;\n width: 100%;\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: var(--bs-body-color);\n appearance: none;\n background-color: var(--bs-body-bg);\n background-clip: padding-box;\n border: var(--bs-border-width) solid var(--bs-border-color);\n border-radius: var(--bs-border-radius);\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-control {\n transition: none;\n }\n}\n.form-control[type=file] {\n overflow: hidden;\n}\n.form-control[type=file]:not(:disabled):not([readonly]) {\n cursor: pointer;\n}\n.form-control:focus {\n color: var(--bs-body-color);\n background-color: var(--bs-body-bg);\n border-color: rgb(52.5490196078%, 71.568627451%, 99.6078431373%);\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-control::-webkit-date-and-time-value {\n min-width: 85px;\n height: 1.5em;\n margin: 0;\n}\n.form-control::-webkit-datetime-edit {\n display: block;\n padding: 0;\n}\n.form-control::placeholder {\n color: var(--bs-secondary-color);\n opacity: 1;\n}\n.form-control:disabled {\n background-color: var(--bs-secondary-bg);\n opacity: 1;\n}\n.form-control::file-selector-button {\n padding: 0.375rem 0.75rem;\n margin: -0.375rem -0.75rem;\n margin-inline-end: 0.75rem;\n color: var(--bs-body-color);\n background-color: var(--bs-tertiary-bg);\n pointer-events: none;\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n border-inline-end-width: var(--bs-border-width);\n border-radius: 0;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-control::file-selector-button {\n transition: none;\n }\n}\n.form-control:hover:not(:disabled):not([readonly])::file-selector-button {\n background-color: var(--bs-secondary-bg);\n}\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding: 0.375rem 0;\n margin-bottom: 0;\n line-height: 1.5;\n color: var(--bs-body-color);\n background-color: transparent;\n border: solid transparent;\n border-width: var(--bs-border-width) 0;\n}\n.form-control-plaintext:focus {\n outline: 0;\n}\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n}\n\n.form-control-sm {\n min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2));\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n border-radius: var(--bs-border-radius-sm);\n}\n.form-control-sm::file-selector-button {\n padding: 0.25rem 0.5rem;\n margin: -0.25rem -0.5rem;\n margin-inline-end: 0.5rem;\n}\n\n.form-control-lg {\n min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n border-radius: var(--bs-border-radius-lg);\n}\n.form-control-lg::file-selector-button {\n padding: 0.5rem 1rem;\n margin: -0.5rem -1rem;\n margin-inline-end: 1rem;\n}\n\ntextarea.form-control {\n min-height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2));\n}\ntextarea.form-control-sm {\n min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2));\n}\ntextarea.form-control-lg {\n min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));\n}\n\n.form-control-color {\n width: 3rem;\n height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2));\n padding: 0.375rem;\n}\n.form-control-color:not(:disabled):not([readonly]) {\n cursor: pointer;\n}\n.form-control-color::-moz-color-swatch {\n border: 0 !important;\n border-radius: var(--bs-border-radius);\n}\n.form-control-color::-webkit-color-swatch {\n border: 0 !important;\n border-radius: var(--bs-border-radius);\n}\n.form-control-color.form-control-sm {\n height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2));\n}\n.form-control-color.form-control-lg {\n height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));\n}\n\n.form-select {\n --bs-form-select-bg-img: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");\n display: block;\n width: 100%;\n padding: 0.375rem 2.25rem 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: var(--bs-body-color);\n appearance: none;\n background-color: var(--bs-body-bg);\n background-image: var(--bs-form-select-bg-img), var(--bs-form-select-bg-icon, none);\n background-repeat: no-repeat;\n background-position: right 0.75rem center;\n background-size: 16px 12px;\n border: var(--bs-border-width) solid var(--bs-border-color);\n border-radius: var(--bs-border-radius);\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-select {\n transition: none;\n }\n}\n.form-select:focus {\n border-color: rgb(52.5490196078%, 71.568627451%, 99.6078431373%);\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-select[multiple], .form-select[size]:not([size=\"1\"]) {\n padding-right: 0.75rem;\n background-image: none;\n}\n.form-select:disabled {\n background-color: var(--bs-secondary-bg);\n}\n.form-select:-moz-focusring {\n color: transparent;\n text-shadow: 0 0 0 var(--bs-body-color);\n}\n\n.form-select-sm {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n padding-left: 0.5rem;\n font-size: 0.875rem;\n border-radius: var(--bs-border-radius-sm);\n}\n\n.form-select-lg {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n padding-left: 1rem;\n font-size: 1.25rem;\n border-radius: var(--bs-border-radius-lg);\n}\n\n[data-bs-theme=dark] .form-select {\n --bs-form-select-bg-img: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");\n}\n\n.form-check {\n display: block;\n min-height: 1.5rem;\n padding-left: 1.5em;\n margin-bottom: 0.125rem;\n}\n.form-check .form-check-input {\n float: left;\n margin-left: -1.5em;\n}\n\n.form-check-reverse {\n padding-right: 1.5em;\n padding-left: 0;\n text-align: right;\n}\n.form-check-reverse .form-check-input {\n float: right;\n margin-right: -1.5em;\n margin-left: 0;\n}\n\n.form-check-input {\n --bs-form-check-bg: var(--bs-body-bg);\n flex-shrink: 0;\n width: 1em;\n height: 1em;\n margin-top: 0.25em;\n vertical-align: top;\n appearance: none;\n background-color: var(--bs-form-check-bg);\n background-image: var(--bs-form-check-bg-image);\n background-repeat: no-repeat;\n background-position: center;\n background-size: contain;\n border: var(--bs-border-width) solid var(--bs-border-color);\n print-color-adjust: exact;\n}\n.form-check-input[type=checkbox] {\n border-radius: 0.25em;\n}\n.form-check-input[type=radio] {\n border-radius: 50%;\n}\n.form-check-input:active {\n filter: brightness(90%);\n}\n.form-check-input:focus {\n border-color: rgb(52.5490196078%, 71.568627451%, 99.6078431373%);\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-check-input:checked {\n background-color: #0d6efd;\n border-color: #0d6efd;\n}\n.form-check-input:checked[type=checkbox] {\n --bs-form-check-bg-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e\");\n}\n.form-check-input:checked[type=radio] {\n --bs-form-check-bg-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e\");\n}\n.form-check-input[type=checkbox]:indeterminate {\n background-color: #0d6efd;\n border-color: #0d6efd;\n --bs-form-check-bg-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e\");\n}\n.form-check-input:disabled {\n pointer-events: none;\n filter: none;\n opacity: 0.5;\n}\n.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label {\n cursor: default;\n opacity: 0.5;\n}\n\n.form-switch {\n padding-left: 2.5em;\n}\n.form-switch .form-check-input {\n --bs-form-switch-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e\");\n width: 2em;\n margin-left: -2.5em;\n background-image: var(--bs-form-switch-bg);\n background-position: left center;\n border-radius: 2em;\n transition: background-position 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-switch .form-check-input {\n transition: none;\n }\n}\n.form-switch .form-check-input:focus {\n --bs-form-switch-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgb%2852.5490196078%, 71.568627451%, 99.6078431373%%29'/%3e%3c/svg%3e\");\n}\n.form-switch .form-check-input:checked {\n background-position: right center;\n --bs-form-switch-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e\");\n}\n.form-switch.form-check-reverse {\n padding-right: 2.5em;\n padding-left: 0;\n}\n.form-switch.form-check-reverse .form-check-input {\n margin-right: -2.5em;\n margin-left: 0;\n}\n\n.form-check-inline {\n display: inline-block;\n margin-right: 1rem;\n}\n\n.btn-check {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.btn-check[disabled] + .btn, .btn-check:disabled + .btn {\n pointer-events: none;\n filter: none;\n opacity: 0.65;\n}\n\n[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus) {\n --bs-form-switch-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e\");\n}\n\n.form-range {\n width: 100%;\n height: 1.5rem;\n padding: 0;\n appearance: none;\n background-color: transparent;\n}\n.form-range:focus {\n outline: 0;\n}\n.form-range:focus::-webkit-slider-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-range:focus::-moz-range-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-range::-moz-focus-outer {\n border: 0;\n}\n.form-range::-webkit-slider-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: -0.25rem;\n appearance: none;\n background-color: #0d6efd;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-range::-webkit-slider-thumb {\n transition: none;\n }\n}\n.form-range::-webkit-slider-thumb:active {\n background-color: rgb(71.5294117647%, 82.9411764706%, 99.7647058824%);\n}\n.form-range::-webkit-slider-runnable-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: var(--bs-secondary-bg);\n border-color: transparent;\n border-radius: 1rem;\n}\n.form-range::-moz-range-thumb {\n width: 1rem;\n height: 1rem;\n appearance: none;\n background-color: #0d6efd;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-range::-moz-range-thumb {\n transition: none;\n }\n}\n.form-range::-moz-range-thumb:active {\n background-color: rgb(71.5294117647%, 82.9411764706%, 99.7647058824%);\n}\n.form-range::-moz-range-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: var(--bs-secondary-bg);\n border-color: transparent;\n border-radius: 1rem;\n}\n.form-range:disabled {\n pointer-events: none;\n}\n.form-range:disabled::-webkit-slider-thumb {\n background-color: var(--bs-secondary-color);\n}\n.form-range:disabled::-moz-range-thumb {\n background-color: var(--bs-secondary-color);\n}\n\n.form-floating {\n position: relative;\n}\n.form-floating > .form-control,\n.form-floating > .form-control-plaintext,\n.form-floating > .form-select {\n height: calc(3.5rem + calc(var(--bs-border-width) * 2));\n min-height: calc(3.5rem + calc(var(--bs-border-width) * 2));\n line-height: 1.25;\n}\n.form-floating > label {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 2;\n max-width: 100%;\n height: 100%;\n padding: 1rem 0.75rem;\n overflow: hidden;\n color: rgba(var(--bs-body-color-rgb), 0.65);\n text-align: start;\n text-overflow: ellipsis;\n white-space: nowrap;\n pointer-events: none;\n border: var(--bs-border-width) solid transparent;\n transform-origin: 0 0;\n transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-floating > label {\n transition: none;\n }\n}\n.form-floating > .form-control,\n.form-floating > .form-control-plaintext {\n padding: 1rem 0.75rem;\n}\n.form-floating > .form-control::placeholder,\n.form-floating > .form-control-plaintext::placeholder {\n color: transparent;\n}\n.form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown),\n.form-floating > .form-control-plaintext:focus,\n.form-floating > .form-control-plaintext:not(:placeholder-shown) {\n padding-top: 1.625rem;\n padding-bottom: 0.625rem;\n}\n.form-floating > .form-control:-webkit-autofill,\n.form-floating > .form-control-plaintext:-webkit-autofill {\n padding-top: 1.625rem;\n padding-bottom: 0.625rem;\n}\n.form-floating > .form-select {\n padding-top: 1.625rem;\n padding-bottom: 0.625rem;\n padding-left: 0.75rem;\n}\n.form-floating > .form-control:focus ~ label,\n.form-floating > .form-control:not(:placeholder-shown) ~ label,\n.form-floating > .form-control-plaintext ~ label,\n.form-floating > .form-select ~ label {\n transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);\n}\n.form-floating > .form-control:-webkit-autofill ~ label {\n transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);\n}\n.form-floating > textarea:focus ~ label::after,\n.form-floating > textarea:not(:placeholder-shown) ~ label::after {\n position: absolute;\n inset: 1rem 0.375rem;\n z-index: -1;\n height: 1.5em;\n content: \"\";\n background-color: var(--bs-body-bg);\n border-radius: var(--bs-border-radius);\n}\n.form-floating > textarea:disabled ~ label::after {\n background-color: var(--bs-secondary-bg);\n}\n.form-floating > .form-control-plaintext ~ label {\n border-width: var(--bs-border-width) 0;\n}\n.form-floating > :disabled ~ label,\n.form-floating > .form-control:disabled ~ label {\n color: #6c757d;\n}\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: stretch;\n width: 100%;\n}\n.input-group > .form-control,\n.input-group > .form-select,\n.input-group > .form-floating {\n position: relative;\n flex: 1 1 auto;\n width: 1%;\n min-width: 0;\n}\n.input-group > .form-control:focus,\n.input-group > .form-select:focus,\n.input-group > .form-floating:focus-within {\n z-index: 5;\n}\n.input-group .btn {\n position: relative;\n z-index: 2;\n}\n.input-group .btn:focus {\n z-index: 5;\n}\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: var(--bs-body-color);\n text-align: center;\n white-space: nowrap;\n background-color: var(--bs-tertiary-bg);\n border: var(--bs-border-width) solid var(--bs-border-color);\n border-radius: var(--bs-border-radius);\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .form-select,\n.input-group-lg > .input-group-text,\n.input-group-lg > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n border-radius: var(--bs-border-radius-lg);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .form-select,\n.input-group-sm > .input-group-text,\n.input-group-sm > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n border-radius: var(--bs-border-radius-sm);\n}\n\n.input-group-lg > .form-select,\n.input-group-sm > .form-select {\n padding-right: 3rem;\n}\n\n.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),\n.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3),\n.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-control,\n.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-select {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),\n.input-group.has-validation > .dropdown-toggle:nth-last-child(n+4),\n.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-control,\n.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-select {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) {\n margin-left: calc(-1 * var(--bs-border-width));\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.input-group > .form-floating:not(:first-child) > .form-control,\n.input-group > .form-floating:not(:first-child) > .form-select {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.valid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 0.875em;\n color: var(--bs-form-valid-color);\n}\n\n.valid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: 0.1rem;\n font-size: 0.875rem;\n color: #fff;\n background-color: var(--bs-success);\n border-radius: var(--bs-border-radius);\n}\n\n.was-validated :valid ~ .valid-feedback,\n.was-validated :valid ~ .valid-tooltip,\n.is-valid ~ .valid-feedback,\n.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n border-color: var(--bs-form-valid-border-color);\n padding-right: calc(1.5em + 0.75rem);\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-position: right calc(0.375em + 0.1875rem) center;\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n border-color: var(--bs-form-valid-border-color);\n box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25);\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .form-select:valid, .form-select.is-valid {\n border-color: var(--bs-form-valid-border-color);\n}\n.was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size=\"1\"], .form-select.is-valid:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size=\"1\"] {\n --bs-form-select-bg-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1'/%3e%3c/svg%3e\");\n padding-right: 4.125rem;\n background-position: right 0.75rem center, center right 2.25rem;\n background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-select:valid:focus, .form-select.is-valid:focus {\n border-color: var(--bs-form-valid-border-color);\n box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25);\n}\n\n.was-validated .form-control-color:valid, .form-control-color.is-valid {\n width: calc(3rem + calc(1.5em + 0.75rem));\n}\n\n.was-validated .form-check-input:valid, .form-check-input.is-valid {\n border-color: var(--bs-form-valid-border-color);\n}\n.was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked {\n background-color: var(--bs-form-valid-color);\n}\n.was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus {\n box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25);\n}\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n color: var(--bs-form-valid-color);\n}\n\n.form-check-inline .form-check-input ~ .valid-feedback {\n margin-left: 0.5em;\n}\n\n.was-validated .input-group > .form-control:not(:focus):valid, .input-group > .form-control:not(:focus).is-valid,\n.was-validated .input-group > .form-select:not(:focus):valid,\n.input-group > .form-select:not(:focus).is-valid,\n.was-validated .input-group > .form-floating:not(:focus-within):valid,\n.input-group > .form-floating:not(:focus-within).is-valid {\n z-index: 3;\n}\n\n.invalid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 0.875em;\n color: var(--bs-form-invalid-color);\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: 0.1rem;\n font-size: 0.875rem;\n color: #fff;\n background-color: var(--bs-danger);\n border-radius: var(--bs-border-radius);\n}\n\n.was-validated :invalid ~ .invalid-feedback,\n.was-validated :invalid ~ .invalid-tooltip,\n.is-invalid ~ .invalid-feedback,\n.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n border-color: var(--bs-form-invalid-border-color);\n padding-right: calc(1.5em + 0.75rem);\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-position: right calc(0.375em + 0.1875rem) center;\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n border-color: var(--bs-form-invalid-border-color);\n box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25);\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .form-select:invalid, .form-select.is-invalid {\n border-color: var(--bs-form-invalid-border-color);\n}\n.was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size=\"1\"], .form-select.is-invalid:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size=\"1\"] {\n --bs-form-select-bg-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e\");\n padding-right: 4.125rem;\n background-position: right 0.75rem center, center right 2.25rem;\n background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-select:invalid:focus, .form-select.is-invalid:focus {\n border-color: var(--bs-form-invalid-border-color);\n box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25);\n}\n\n.was-validated .form-control-color:invalid, .form-control-color.is-invalid {\n width: calc(3rem + calc(1.5em + 0.75rem));\n}\n\n.was-validated .form-check-input:invalid, .form-check-input.is-invalid {\n border-color: var(--bs-form-invalid-border-color);\n}\n.was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked {\n background-color: var(--bs-form-invalid-color);\n}\n.was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus {\n box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25);\n}\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n color: var(--bs-form-invalid-color);\n}\n\n.form-check-inline .form-check-input ~ .invalid-feedback {\n margin-left: 0.5em;\n}\n\n.was-validated .input-group > .form-control:not(:focus):invalid, .input-group > .form-control:not(:focus).is-invalid,\n.was-validated .input-group > .form-select:not(:focus):invalid,\n.input-group > .form-select:not(:focus).is-invalid,\n.was-validated .input-group > .form-floating:not(:focus-within):invalid,\n.input-group > .form-floating:not(:focus-within).is-invalid {\n z-index: 4;\n}\n\n.btn {\n --bs-btn-padding-x: 0.75rem;\n --bs-btn-padding-y: 0.375rem;\n --bs-btn-font-family: ;\n --bs-btn-font-size: 1rem;\n --bs-btn-font-weight: 400;\n --bs-btn-line-height: 1.5;\n --bs-btn-color: var(--bs-body-color);\n --bs-btn-bg: transparent;\n --bs-btn-border-width: var(--bs-border-width);\n --bs-btn-border-color: transparent;\n --bs-btn-border-radius: var(--bs-border-radius);\n --bs-btn-hover-border-color: transparent;\n --bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n --bs-btn-disabled-opacity: 0.65;\n --bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);\n display: inline-block;\n padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x);\n font-family: var(--bs-btn-font-family);\n font-size: var(--bs-btn-font-size);\n font-weight: var(--bs-btn-font-weight);\n line-height: var(--bs-btn-line-height);\n color: var(--bs-btn-color);\n text-align: center;\n text-decoration: none;\n vertical-align: middle;\n cursor: pointer;\n user-select: none;\n border: var(--bs-btn-border-width) solid var(--bs-btn-border-color);\n border-radius: var(--bs-btn-border-radius);\n background-color: var(--bs-btn-bg);\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .btn {\n transition: none;\n }\n}\n.btn:hover {\n color: var(--bs-btn-hover-color);\n background-color: var(--bs-btn-hover-bg);\n border-color: var(--bs-btn-hover-border-color);\n}\n.btn-check + .btn:hover {\n color: var(--bs-btn-color);\n background-color: var(--bs-btn-bg);\n border-color: var(--bs-btn-border-color);\n}\n.btn:focus-visible {\n color: var(--bs-btn-hover-color);\n background-color: var(--bs-btn-hover-bg);\n border-color: var(--bs-btn-hover-border-color);\n outline: 0;\n box-shadow: var(--bs-btn-focus-box-shadow);\n}\n.btn-check:focus-visible + .btn {\n border-color: var(--bs-btn-hover-border-color);\n outline: 0;\n box-shadow: var(--bs-btn-focus-box-shadow);\n}\n.btn-check:checked + .btn, :not(.btn-check) + .btn:active, .btn:first-child:active, .btn.active, .btn.show {\n color: var(--bs-btn-active-color);\n background-color: var(--bs-btn-active-bg);\n border-color: var(--bs-btn-active-border-color);\n}\n.btn-check:checked + .btn:focus-visible, :not(.btn-check) + .btn:active:focus-visible, .btn:first-child:active:focus-visible, .btn.active:focus-visible, .btn.show:focus-visible {\n box-shadow: var(--bs-btn-focus-box-shadow);\n}\n.btn-check:checked:focus-visible + .btn {\n box-shadow: var(--bs-btn-focus-box-shadow);\n}\n.btn:disabled, .btn.disabled, fieldset:disabled .btn {\n color: var(--bs-btn-disabled-color);\n pointer-events: none;\n background-color: var(--bs-btn-disabled-bg);\n border-color: var(--bs-btn-disabled-border-color);\n opacity: var(--bs-btn-disabled-opacity);\n}\n\n.btn-primary {\n --bs-btn-color: #fff;\n --bs-btn-bg: #0d6efd;\n --bs-btn-border-color: #0d6efd;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: rgb(4.3333333333%, 36.6666666667%, 84.3333333333%);\n --bs-btn-hover-border-color: rgb(4.0784313725%, 34.5098039216%, 79.3725490196%);\n --bs-btn-focus-shadow-rgb: 49, 132, 253;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: rgb(4.0784313725%, 34.5098039216%, 79.3725490196%);\n --bs-btn-active-border-color: rgb(3.8235294118%, 32.3529411765%, 74.4117647059%);\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #fff;\n --bs-btn-disabled-bg: #0d6efd;\n --bs-btn-disabled-border-color: #0d6efd;\n}\n\n.btn-secondary {\n --bs-btn-color: #fff;\n --bs-btn-bg: #6c757d;\n --bs-btn-border-color: #6c757d;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: rgb(36%, 39%, 41.6666666667%);\n --bs-btn-hover-border-color: rgb(33.8823529412%, 36.7058823529%, 39.2156862745%);\n --bs-btn-focus-shadow-rgb: 130, 138, 145;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: rgb(33.8823529412%, 36.7058823529%, 39.2156862745%);\n --bs-btn-active-border-color: rgb(31.7647058824%, 34.4117647059%, 36.7647058824%);\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #fff;\n --bs-btn-disabled-bg: #6c757d;\n --bs-btn-disabled-border-color: #6c757d;\n}\n\n.btn-success {\n --bs-btn-color: #fff;\n --bs-btn-bg: #198754;\n --bs-btn-border-color: #198754;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: rgb(8.3333333333%, 45%, 28%);\n --bs-btn-hover-border-color: rgb(7.8431372549%, 42.3529411765%, 26.3529411765%);\n --bs-btn-focus-shadow-rgb: 60, 153, 110;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: rgb(7.8431372549%, 42.3529411765%, 26.3529411765%);\n --bs-btn-active-border-color: rgb(7.3529411765%, 39.7058823529%, 24.7058823529%);\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #fff;\n --bs-btn-disabled-bg: #198754;\n --bs-btn-disabled-border-color: #198754;\n}\n\n.btn-info {\n --bs-btn-color: #000;\n --bs-btn-bg: #0dcaf0;\n --bs-btn-border-color: #0dcaf0;\n --bs-btn-hover-color: #000;\n --bs-btn-hover-bg: rgb(19.3333333333%, 82.3333333333%, 95%);\n --bs-btn-hover-border-color: rgb(14.5882352941%, 81.2941176471%, 94.7058823529%);\n --bs-btn-focus-shadow-rgb: 11, 172, 204;\n --bs-btn-active-color: #000;\n --bs-btn-active-bg: rgb(24.0784313725%, 83.3725490196%, 95.2941176471%);\n --bs-btn-active-border-color: rgb(14.5882352941%, 81.2941176471%, 94.7058823529%);\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #000;\n --bs-btn-disabled-bg: #0dcaf0;\n --bs-btn-disabled-border-color: #0dcaf0;\n}\n\n.btn-warning {\n --bs-btn-color: #000;\n --bs-btn-bg: #ffc107;\n --bs-btn-border-color: #ffc107;\n --bs-btn-hover-color: #000;\n --bs-btn-hover-bg: rgb(100%, 79.3333333333%, 17.3333333333%);\n --bs-btn-hover-border-color: rgb(100%, 78.1176470588%, 12.4705882353%);\n --bs-btn-focus-shadow-rgb: 217, 164, 6;\n --bs-btn-active-color: #000;\n --bs-btn-active-bg: rgb(100%, 80.5490196078%, 22.1960784314%);\n --bs-btn-active-border-color: rgb(100%, 78.1176470588%, 12.4705882353%);\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #000;\n --bs-btn-disabled-bg: #ffc107;\n --bs-btn-disabled-border-color: #ffc107;\n}\n\n.btn-danger {\n --bs-btn-color: #fff;\n --bs-btn-bg: #dc3545;\n --bs-btn-border-color: #dc3545;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: rgb(73.3333333333%, 17.6666666667%, 23%);\n --bs-btn-hover-border-color: rgb(69.0196078431%, 16.6274509804%, 21.6470588235%);\n --bs-btn-focus-shadow-rgb: 225, 83, 97;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: rgb(69.0196078431%, 16.6274509804%, 21.6470588235%);\n --bs-btn-active-border-color: rgb(64.7058823529%, 15.5882352941%, 20.2941176471%);\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #fff;\n --bs-btn-disabled-bg: #dc3545;\n --bs-btn-disabled-border-color: #dc3545;\n}\n\n.btn-light {\n --bs-btn-color: #000;\n --bs-btn-bg: #f8f9fa;\n --bs-btn-border-color: #f8f9fa;\n --bs-btn-hover-color: #000;\n --bs-btn-hover-bg: rgb(82.6666666667%, 83%, 83.3333333333%);\n --bs-btn-hover-border-color: rgb(77.8039215686%, 78.1176470588%, 78.431372549%);\n --bs-btn-focus-shadow-rgb: 211, 212, 213;\n --bs-btn-active-color: #000;\n --bs-btn-active-bg: rgb(77.8039215686%, 78.1176470588%, 78.431372549%);\n --bs-btn-active-border-color: rgb(72.9411764706%, 73.2352941176%, 73.5294117647%);\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #000;\n --bs-btn-disabled-bg: #f8f9fa;\n --bs-btn-disabled-border-color: #f8f9fa;\n}\n\n.btn-dark {\n --bs-btn-color: #fff;\n --bs-btn-bg: #212529;\n --bs-btn-border-color: #212529;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: rgb(26%, 27.3333333333%, 28.6666666667%);\n --bs-btn-hover-border-color: rgb(21.6470588235%, 23.0588235294%, 24.4705882353%);\n --bs-btn-focus-shadow-rgb: 66, 70, 73;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: rgb(30.3529411765%, 31.6078431373%, 32.862745098%);\n --bs-btn-active-border-color: rgb(21.6470588235%, 23.0588235294%, 24.4705882353%);\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #fff;\n --bs-btn-disabled-bg: #212529;\n --bs-btn-disabled-border-color: #212529;\n}\n\n.btn-outline-primary {\n --bs-btn-color: #0d6efd;\n --bs-btn-border-color: #0d6efd;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #0d6efd;\n --bs-btn-hover-border-color: #0d6efd;\n --bs-btn-focus-shadow-rgb: 13, 110, 253;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #0d6efd;\n --bs-btn-active-border-color: #0d6efd;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #0d6efd;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #0d6efd;\n --bs-gradient: none;\n}\n\n.btn-outline-secondary {\n --bs-btn-color: #6c757d;\n --bs-btn-border-color: #6c757d;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #6c757d;\n --bs-btn-hover-border-color: #6c757d;\n --bs-btn-focus-shadow-rgb: 108, 117, 125;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #6c757d;\n --bs-btn-active-border-color: #6c757d;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #6c757d;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #6c757d;\n --bs-gradient: none;\n}\n\n.btn-outline-success {\n --bs-btn-color: #198754;\n --bs-btn-border-color: #198754;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #198754;\n --bs-btn-hover-border-color: #198754;\n --bs-btn-focus-shadow-rgb: 25, 135, 84;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #198754;\n --bs-btn-active-border-color: #198754;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #198754;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #198754;\n --bs-gradient: none;\n}\n\n.btn-outline-info {\n --bs-btn-color: #0dcaf0;\n --bs-btn-border-color: #0dcaf0;\n --bs-btn-hover-color: #000;\n --bs-btn-hover-bg: #0dcaf0;\n --bs-btn-hover-border-color: #0dcaf0;\n --bs-btn-focus-shadow-rgb: 13, 202, 240;\n --bs-btn-active-color: #000;\n --bs-btn-active-bg: #0dcaf0;\n --bs-btn-active-border-color: #0dcaf0;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #0dcaf0;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #0dcaf0;\n --bs-gradient: none;\n}\n\n.btn-outline-warning {\n --bs-btn-color: #ffc107;\n --bs-btn-border-color: #ffc107;\n --bs-btn-hover-color: #000;\n --bs-btn-hover-bg: #ffc107;\n --bs-btn-hover-border-color: #ffc107;\n --bs-btn-focus-shadow-rgb: 255, 193, 7;\n --bs-btn-active-color: #000;\n --bs-btn-active-bg: #ffc107;\n --bs-btn-active-border-color: #ffc107;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #ffc107;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #ffc107;\n --bs-gradient: none;\n}\n\n.btn-outline-danger {\n --bs-btn-color: #dc3545;\n --bs-btn-border-color: #dc3545;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #dc3545;\n --bs-btn-hover-border-color: #dc3545;\n --bs-btn-focus-shadow-rgb: 220, 53, 69;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #dc3545;\n --bs-btn-active-border-color: #dc3545;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #dc3545;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #dc3545;\n --bs-gradient: none;\n}\n\n.btn-outline-light {\n --bs-btn-color: #f8f9fa;\n --bs-btn-border-color: #f8f9fa;\n --bs-btn-hover-color: #000;\n --bs-btn-hover-bg: #f8f9fa;\n --bs-btn-hover-border-color: #f8f9fa;\n --bs-btn-focus-shadow-rgb: 248, 249, 250;\n --bs-btn-active-color: #000;\n --bs-btn-active-bg: #f8f9fa;\n --bs-btn-active-border-color: #f8f9fa;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #f8f9fa;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #f8f9fa;\n --bs-gradient: none;\n}\n\n.btn-outline-dark {\n --bs-btn-color: #212529;\n --bs-btn-border-color: #212529;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #212529;\n --bs-btn-hover-border-color: #212529;\n --bs-btn-focus-shadow-rgb: 33, 37, 41;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #212529;\n --bs-btn-active-border-color: #212529;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #212529;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #212529;\n --bs-gradient: none;\n}\n\n.btn-link {\n --bs-btn-font-weight: 400;\n --bs-btn-color: var(--bs-link-color);\n --bs-btn-bg: transparent;\n --bs-btn-border-color: transparent;\n --bs-btn-hover-color: var(--bs-link-hover-color);\n --bs-btn-hover-border-color: transparent;\n --bs-btn-active-color: var(--bs-link-hover-color);\n --bs-btn-active-border-color: transparent;\n --bs-btn-disabled-color: #6c757d;\n --bs-btn-disabled-border-color: transparent;\n --bs-btn-box-shadow: 0 0 0 #000;\n --bs-btn-focus-shadow-rgb: 49, 132, 253;\n text-decoration: underline;\n}\n.btn-link:focus-visible {\n color: var(--bs-btn-color);\n}\n.btn-link:hover {\n color: var(--bs-btn-hover-color);\n}\n\n.btn-lg, .btn-group-lg > .btn {\n --bs-btn-padding-y: 0.5rem;\n --bs-btn-padding-x: 1rem;\n --bs-btn-font-size: 1.25rem;\n --bs-btn-border-radius: var(--bs-border-radius-lg);\n}\n\n.btn-sm, .btn-group-sm > .btn {\n --bs-btn-padding-y: 0.25rem;\n --bs-btn-padding-x: 0.5rem;\n --bs-btn-font-size: 0.875rem;\n --bs-btn-border-radius: var(--bs-border-radius-sm);\n}\n\n.fade {\n transition: opacity 0.15s linear;\n}\n@media (prefers-reduced-motion: reduce) {\n .fade {\n transition: none;\n }\n}\n.fade:not(.show) {\n opacity: 0;\n}\n\n.collapse:not(.show) {\n display: none;\n}\n\n.collapsing {\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .collapsing {\n transition: none;\n }\n}\n.collapsing.collapse-horizontal {\n width: 0;\n height: auto;\n transition: width 0.35s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .collapsing.collapse-horizontal {\n transition: none;\n }\n}\n\n.dropup,\n.dropend,\n.dropdown,\n.dropstart,\n.dropup-center,\n.dropdown-center {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n}\n.dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid;\n border-right: 0.3em solid transparent;\n border-bottom: 0;\n border-left: 0.3em solid transparent;\n}\n.dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropdown-menu {\n --bs-dropdown-zindex: 1000;\n --bs-dropdown-min-width: 10rem;\n --bs-dropdown-padding-x: 0;\n --bs-dropdown-padding-y: 0.5rem;\n --bs-dropdown-spacer: 0.125rem;\n --bs-dropdown-font-size: 1rem;\n --bs-dropdown-color: var(--bs-body-color);\n --bs-dropdown-bg: var(--bs-body-bg);\n --bs-dropdown-border-color: var(--bs-border-color-translucent);\n --bs-dropdown-border-radius: var(--bs-border-radius);\n --bs-dropdown-border-width: var(--bs-border-width);\n --bs-dropdown-inner-border-radius: calc(var(--bs-border-radius) - var(--bs-border-width));\n --bs-dropdown-divider-bg: var(--bs-border-color-translucent);\n --bs-dropdown-divider-margin-y: 0.5rem;\n --bs-dropdown-box-shadow: var(--bs-box-shadow);\n --bs-dropdown-link-color: var(--bs-body-color);\n --bs-dropdown-link-hover-color: var(--bs-body-color);\n --bs-dropdown-link-hover-bg: var(--bs-tertiary-bg);\n --bs-dropdown-link-active-color: #fff;\n --bs-dropdown-link-active-bg: #0d6efd;\n --bs-dropdown-link-disabled-color: var(--bs-tertiary-color);\n --bs-dropdown-item-padding-x: 1rem;\n --bs-dropdown-item-padding-y: 0.25rem;\n --bs-dropdown-header-color: #6c757d;\n --bs-dropdown-header-padding-x: 1rem;\n --bs-dropdown-header-padding-y: 0.5rem;\n position: absolute;\n z-index: var(--bs-dropdown-zindex);\n display: none;\n min-width: var(--bs-dropdown-min-width);\n padding: var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);\n margin: 0;\n font-size: var(--bs-dropdown-font-size);\n color: var(--bs-dropdown-color);\n text-align: left;\n list-style: none;\n background-color: var(--bs-dropdown-bg);\n background-clip: padding-box;\n border: var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);\n border-radius: var(--bs-dropdown-border-radius);\n}\n.dropdown-menu[data-bs-popper] {\n top: 100%;\n left: 0;\n margin-top: var(--bs-dropdown-spacer);\n}\n\n.dropdown-menu-start {\n --bs-position: start;\n}\n.dropdown-menu-start[data-bs-popper] {\n right: auto;\n left: 0;\n}\n\n.dropdown-menu-end {\n --bs-position: end;\n}\n.dropdown-menu-end[data-bs-popper] {\n right: 0;\n left: auto;\n}\n\n@media (min-width: 576px) {\n .dropdown-menu-sm-start {\n --bs-position: start;\n }\n .dropdown-menu-sm-start[data-bs-popper] {\n right: auto;\n left: 0;\n }\n .dropdown-menu-sm-end {\n --bs-position: end;\n }\n .dropdown-menu-sm-end[data-bs-popper] {\n right: 0;\n left: auto;\n }\n}\n@media (min-width: 768px) {\n .dropdown-menu-md-start {\n --bs-position: start;\n }\n .dropdown-menu-md-start[data-bs-popper] {\n right: auto;\n left: 0;\n }\n .dropdown-menu-md-end {\n --bs-position: end;\n }\n .dropdown-menu-md-end[data-bs-popper] {\n right: 0;\n left: auto;\n }\n}\n@media (min-width: 992px) {\n .dropdown-menu-lg-start {\n --bs-position: start;\n }\n .dropdown-menu-lg-start[data-bs-popper] {\n right: auto;\n left: 0;\n }\n .dropdown-menu-lg-end {\n --bs-position: end;\n }\n .dropdown-menu-lg-end[data-bs-popper] {\n right: 0;\n left: auto;\n }\n}\n@media (min-width: 1200px) {\n .dropdown-menu-xl-start {\n --bs-position: start;\n }\n .dropdown-menu-xl-start[data-bs-popper] {\n right: auto;\n left: 0;\n }\n .dropdown-menu-xl-end {\n --bs-position: end;\n }\n .dropdown-menu-xl-end[data-bs-popper] {\n right: 0;\n left: auto;\n }\n}\n@media (min-width: 1400px) {\n .dropdown-menu-xxl-start {\n --bs-position: start;\n }\n .dropdown-menu-xxl-start[data-bs-popper] {\n right: auto;\n left: 0;\n }\n .dropdown-menu-xxl-end {\n --bs-position: end;\n }\n .dropdown-menu-xxl-end[data-bs-popper] {\n right: 0;\n left: auto;\n }\n}\n.dropup .dropdown-menu[data-bs-popper] {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: var(--bs-dropdown-spacer);\n}\n.dropup .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0;\n border-right: 0.3em solid transparent;\n border-bottom: 0.3em solid;\n border-left: 0.3em solid transparent;\n}\n.dropup .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropend .dropdown-menu[data-bs-popper] {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: var(--bs-dropdown-spacer);\n}\n.dropend .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0;\n border-bottom: 0.3em solid transparent;\n border-left: 0.3em solid;\n}\n.dropend .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n.dropend .dropdown-toggle::after {\n vertical-align: 0;\n}\n\n.dropstart .dropdown-menu[data-bs-popper] {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: var(--bs-dropdown-spacer);\n}\n.dropstart .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n}\n.dropstart .dropdown-toggle::after {\n display: none;\n}\n.dropstart .dropdown-toggle::before {\n display: inline-block;\n margin-right: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0.3em solid;\n border-bottom: 0.3em solid transparent;\n}\n.dropstart .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n.dropstart .dropdown-toggle::before {\n vertical-align: 0;\n}\n\n.dropdown-divider {\n height: 0;\n margin: var(--bs-dropdown-divider-margin-y) 0;\n overflow: hidden;\n border-top: 1px solid var(--bs-dropdown-divider-bg);\n opacity: 1;\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);\n clear: both;\n font-weight: 400;\n color: var(--bs-dropdown-link-color);\n text-align: inherit;\n text-decoration: none;\n white-space: nowrap;\n background-color: transparent;\n border: 0;\n border-radius: var(--bs-dropdown-item-border-radius, 0);\n}\n.dropdown-item:hover, .dropdown-item:focus {\n color: var(--bs-dropdown-link-hover-color);\n background-color: var(--bs-dropdown-link-hover-bg);\n}\n.dropdown-item.active, .dropdown-item:active {\n color: var(--bs-dropdown-link-active-color);\n text-decoration: none;\n background-color: var(--bs-dropdown-link-active-bg);\n}\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: var(--bs-dropdown-link-disabled-color);\n pointer-events: none;\n background-color: transparent;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n display: block;\n padding: var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);\n margin-bottom: 0;\n font-size: 0.875rem;\n color: var(--bs-dropdown-header-color);\n white-space: nowrap;\n}\n\n.dropdown-item-text {\n display: block;\n padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);\n color: var(--bs-dropdown-link-color);\n}\n\n.dropdown-menu-dark {\n --bs-dropdown-color: #dee2e6;\n --bs-dropdown-bg: #343a40;\n --bs-dropdown-border-color: var(--bs-border-color-translucent);\n --bs-dropdown-box-shadow: ;\n --bs-dropdown-link-color: #dee2e6;\n --bs-dropdown-link-hover-color: #fff;\n --bs-dropdown-divider-bg: var(--bs-border-color-translucent);\n --bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);\n --bs-dropdown-link-active-color: #fff;\n --bs-dropdown-link-active-bg: #0d6efd;\n --bs-dropdown-link-disabled-color: #adb5bd;\n --bs-dropdown-header-color: #adb5bd;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n flex: 1 1 auto;\n}\n.btn-group > .btn-check:checked + .btn,\n.btn-group > .btn-check:focus + .btn,\n.btn-group > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn-check:checked + .btn,\n.btn-group-vertical > .btn-check:focus + .btn,\n.btn-group-vertical > .btn:hover,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 1;\n}\n\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n}\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group {\n border-radius: var(--bs-border-radius);\n}\n.btn-group > :not(.btn-check:first-child) + .btn,\n.btn-group > .btn-group:not(:first-child) {\n margin-left: calc(-1 * var(--bs-border-width));\n}\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn.dropdown-toggle-split:first-child,\n.btn-group > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn:nth-child(n+3),\n.btn-group > :not(.btn-check) + .btn,\n.btn-group > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.dropdown-toggle-split {\n padding-right: 0.5625rem;\n padding-left: 0.5625rem;\n}\n.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after {\n margin-left: 0;\n}\n.dropstart .dropdown-toggle-split::before {\n margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.375rem;\n padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 0.75rem;\n padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n width: 100%;\n}\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n margin-top: calc(-1 * var(--bs-border-width));\n}\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:nth-child(n+3),\n.btn-group-vertical > :not(.btn-check) + .btn,\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav {\n --bs-nav-link-padding-x: 1rem;\n --bs-nav-link-padding-y: 0.5rem;\n --bs-nav-link-font-weight: ;\n --bs-nav-link-color: var(--bs-link-color);\n --bs-nav-link-hover-color: var(--bs-link-hover-color);\n --bs-nav-link-disabled-color: var(--bs-secondary-color);\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);\n font-size: var(--bs-nav-link-font-size);\n font-weight: var(--bs-nav-link-font-weight);\n color: var(--bs-nav-link-color);\n text-decoration: none;\n background: none;\n border: 0;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .nav-link {\n transition: none;\n }\n}\n.nav-link:hover, .nav-link:focus {\n color: var(--bs-nav-link-hover-color);\n}\n.nav-link:focus-visible {\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.nav-link.disabled, .nav-link:disabled {\n color: var(--bs-nav-link-disabled-color);\n pointer-events: none;\n cursor: default;\n}\n\n.nav-tabs {\n --bs-nav-tabs-border-width: var(--bs-border-width);\n --bs-nav-tabs-border-color: var(--bs-border-color);\n --bs-nav-tabs-border-radius: var(--bs-border-radius);\n --bs-nav-tabs-link-hover-border-color: var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);\n --bs-nav-tabs-link-active-color: var(--bs-emphasis-color);\n --bs-nav-tabs-link-active-bg: var(--bs-body-bg);\n --bs-nav-tabs-link-active-border-color: var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);\n border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color);\n}\n.nav-tabs .nav-link {\n margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width));\n border: var(--bs-nav-tabs-border-width) solid transparent;\n border-top-left-radius: var(--bs-nav-tabs-border-radius);\n border-top-right-radius: var(--bs-nav-tabs-border-radius);\n}\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n isolation: isolate;\n border-color: var(--bs-nav-tabs-link-hover-border-color);\n}\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: var(--bs-nav-tabs-link-active-color);\n background-color: var(--bs-nav-tabs-link-active-bg);\n border-color: var(--bs-nav-tabs-link-active-border-color);\n}\n.nav-tabs .dropdown-menu {\n margin-top: calc(-1 * var(--bs-nav-tabs-border-width));\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav-pills {\n --bs-nav-pills-border-radius: var(--bs-border-radius);\n --bs-nav-pills-link-active-color: #fff;\n --bs-nav-pills-link-active-bg: #0d6efd;\n}\n.nav-pills .nav-link {\n border-radius: var(--bs-nav-pills-border-radius);\n}\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n color: var(--bs-nav-pills-link-active-color);\n background-color: var(--bs-nav-pills-link-active-bg);\n}\n\n.nav-underline {\n --bs-nav-underline-gap: 1rem;\n --bs-nav-underline-border-width: 0.125rem;\n --bs-nav-underline-link-active-color: var(--bs-emphasis-color);\n gap: var(--bs-nav-underline-gap);\n}\n.nav-underline .nav-link {\n padding-right: 0;\n padding-left: 0;\n border-bottom: var(--bs-nav-underline-border-width) solid transparent;\n}\n.nav-underline .nav-link:hover, .nav-underline .nav-link:focus {\n border-bottom-color: currentcolor;\n}\n.nav-underline .nav-link.active,\n.nav-underline .show > .nav-link {\n font-weight: 700;\n color: var(--bs-nav-underline-link-active-color);\n border-bottom-color: currentcolor;\n}\n\n.nav-fill > .nav-link,\n.nav-fill .nav-item {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified > .nav-link,\n.nav-justified .nav-item {\n flex-grow: 1;\n flex-basis: 0;\n text-align: center;\n}\n\n.nav-fill .nav-item .nav-link,\n.nav-justified .nav-item .nav-link {\n width: 100%;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n --bs-navbar-padding-x: 0;\n --bs-navbar-padding-y: 0.5rem;\n --bs-navbar-color: rgba(var(--bs-emphasis-color-rgb), 0.65);\n --bs-navbar-hover-color: rgba(var(--bs-emphasis-color-rgb), 0.8);\n --bs-navbar-disabled-color: rgba(var(--bs-emphasis-color-rgb), 0.3);\n --bs-navbar-active-color: rgba(var(--bs-emphasis-color-rgb), 1);\n --bs-navbar-brand-padding-y: 0.3125rem;\n --bs-navbar-brand-margin-end: 1rem;\n --bs-navbar-brand-font-size: 1.25rem;\n --bs-navbar-brand-color: rgba(var(--bs-emphasis-color-rgb), 1);\n --bs-navbar-brand-hover-color: rgba(var(--bs-emphasis-color-rgb), 1);\n --bs-navbar-nav-link-padding-x: 0.5rem;\n --bs-navbar-toggler-padding-y: 0.25rem;\n --bs-navbar-toggler-padding-x: 0.75rem;\n --bs-navbar-toggler-font-size: 1.25rem;\n --bs-navbar-toggler-icon-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n --bs-navbar-toggler-border-color: rgba(var(--bs-emphasis-color-rgb), 0.15);\n --bs-navbar-toggler-border-radius: var(--bs-border-radius);\n --bs-navbar-toggler-focus-width: 0.25rem;\n --bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n padding: var(--bs-navbar-padding-y) var(--bs-navbar-padding-x);\n}\n.navbar > .container,\n.navbar > .container-fluid,\n.navbar > .container-sm,\n.navbar > .container-md,\n.navbar > .container-lg,\n.navbar > .container-xl,\n.navbar > .container-xxl {\n display: flex;\n flex-wrap: inherit;\n align-items: center;\n justify-content: space-between;\n}\n.navbar-brand {\n padding-top: var(--bs-navbar-brand-padding-y);\n padding-bottom: var(--bs-navbar-brand-padding-y);\n margin-right: var(--bs-navbar-brand-margin-end);\n font-size: var(--bs-navbar-brand-font-size);\n color: var(--bs-navbar-brand-color);\n text-decoration: none;\n white-space: nowrap;\n}\n.navbar-brand:hover, .navbar-brand:focus {\n color: var(--bs-navbar-brand-hover-color);\n}\n\n.navbar-nav {\n --bs-nav-link-padding-x: 0;\n --bs-nav-link-padding-y: 0.5rem;\n --bs-nav-link-font-weight: ;\n --bs-nav-link-color: var(--bs-navbar-color);\n --bs-nav-link-hover-color: var(--bs-navbar-hover-color);\n --bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n.navbar-nav .nav-link.active, .navbar-nav .nav-link.show {\n color: var(--bs-navbar-active-color);\n}\n.navbar-nav .dropdown-menu {\n position: static;\n}\n\n.navbar-text {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n color: var(--bs-navbar-color);\n}\n.navbar-text a,\n.navbar-text a:hover,\n.navbar-text a:focus {\n color: var(--bs-navbar-active-color);\n}\n\n.navbar-collapse {\n flex-grow: 1;\n flex-basis: 100%;\n align-items: center;\n}\n\n.navbar-toggler {\n padding: var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);\n font-size: var(--bs-navbar-toggler-font-size);\n line-height: 1;\n color: var(--bs-navbar-color);\n background-color: transparent;\n border: var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);\n border-radius: var(--bs-navbar-toggler-border-radius);\n transition: var(--bs-navbar-toggler-transition);\n}\n@media (prefers-reduced-motion: reduce) {\n .navbar-toggler {\n transition: none;\n }\n}\n.navbar-toggler:hover {\n text-decoration: none;\n}\n.navbar-toggler:focus {\n text-decoration: none;\n outline: 0;\n box-shadow: 0 0 0 var(--bs-navbar-toggler-focus-width);\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n background-image: var(--bs-navbar-toggler-icon-bg);\n background-repeat: no-repeat;\n background-position: center;\n background-size: 100%;\n}\n\n.navbar-nav-scroll {\n max-height: var(--bs-scroll-height, 75vh);\n overflow-y: auto;\n}\n\n@media (min-width: 576px) {\n .navbar-expand-sm {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-sm .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-right: var(--bs-navbar-nav-link-padding-x);\n padding-left: var(--bs-navbar-nav-link-padding-x);\n }\n .navbar-expand-sm .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-sm .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n .navbar-expand-sm .offcanvas {\n position: static;\n z-index: auto;\n flex-grow: 1;\n width: auto !important;\n height: auto !important;\n visibility: visible !important;\n background-color: transparent !important;\n border: 0 !important;\n transform: none !important;\n transition: none;\n }\n .navbar-expand-sm .offcanvas .offcanvas-header {\n display: none;\n }\n .navbar-expand-sm .offcanvas .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n}\n@media (min-width: 768px) {\n .navbar-expand-md {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-md .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-right: var(--bs-navbar-nav-link-padding-x);\n padding-left: var(--bs-navbar-nav-link-padding-x);\n }\n .navbar-expand-md .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-md .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n .navbar-expand-md .offcanvas {\n position: static;\n z-index: auto;\n flex-grow: 1;\n width: auto !important;\n height: auto !important;\n visibility: visible !important;\n background-color: transparent !important;\n border: 0 !important;\n transform: none !important;\n transition: none;\n }\n .navbar-expand-md .offcanvas .offcanvas-header {\n display: none;\n }\n .navbar-expand-md .offcanvas .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n}\n@media (min-width: 992px) {\n .navbar-expand-lg {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-lg .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-right: var(--bs-navbar-nav-link-padding-x);\n padding-left: var(--bs-navbar-nav-link-padding-x);\n }\n .navbar-expand-lg .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-lg .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n .navbar-expand-lg .offcanvas {\n position: static;\n z-index: auto;\n flex-grow: 1;\n width: auto !important;\n height: auto !important;\n visibility: visible !important;\n background-color: transparent !important;\n border: 0 !important;\n transform: none !important;\n transition: none;\n }\n .navbar-expand-lg .offcanvas .offcanvas-header {\n display: none;\n }\n .navbar-expand-lg .offcanvas .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n}\n@media (min-width: 1200px) {\n .navbar-expand-xl {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-xl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-right: var(--bs-navbar-nav-link-padding-x);\n padding-left: var(--bs-navbar-nav-link-padding-x);\n }\n .navbar-expand-xl .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-xl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n .navbar-expand-xl .offcanvas {\n position: static;\n z-index: auto;\n flex-grow: 1;\n width: auto !important;\n height: auto !important;\n visibility: visible !important;\n background-color: transparent !important;\n border: 0 !important;\n transform: none !important;\n transition: none;\n }\n .navbar-expand-xl .offcanvas .offcanvas-header {\n display: none;\n }\n .navbar-expand-xl .offcanvas .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n}\n@media (min-width: 1400px) {\n .navbar-expand-xxl {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-xxl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xxl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xxl .navbar-nav .nav-link {\n padding-right: var(--bs-navbar-nav-link-padding-x);\n padding-left: var(--bs-navbar-nav-link-padding-x);\n }\n .navbar-expand-xxl .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-xxl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xxl .navbar-toggler {\n display: none;\n }\n .navbar-expand-xxl .offcanvas {\n position: static;\n z-index: auto;\n flex-grow: 1;\n width: auto !important;\n height: auto !important;\n visibility: visible !important;\n background-color: transparent !important;\n border: 0 !important;\n transform: none !important;\n transition: none;\n }\n .navbar-expand-xxl .offcanvas .offcanvas-header {\n display: none;\n }\n .navbar-expand-xxl .offcanvas .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n}\n.navbar-expand {\n flex-wrap: nowrap;\n justify-content: flex-start;\n}\n.navbar-expand .navbar-nav {\n flex-direction: row;\n}\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n.navbar-expand .navbar-nav .nav-link {\n padding-right: var(--bs-navbar-nav-link-padding-x);\n padding-left: var(--bs-navbar-nav-link-padding-x);\n}\n.navbar-expand .navbar-nav-scroll {\n overflow: visible;\n}\n.navbar-expand .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n}\n.navbar-expand .navbar-toggler {\n display: none;\n}\n.navbar-expand .offcanvas {\n position: static;\n z-index: auto;\n flex-grow: 1;\n width: auto !important;\n height: auto !important;\n visibility: visible !important;\n background-color: transparent !important;\n border: 0 !important;\n transform: none !important;\n transition: none;\n}\n.navbar-expand .offcanvas .offcanvas-header {\n display: none;\n}\n.navbar-expand .offcanvas .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n}\n\n.navbar-dark,\n.navbar[data-bs-theme=dark] {\n --bs-navbar-color: rgba(255, 255, 255, 0.55);\n --bs-navbar-hover-color: rgba(255, 255, 255, 0.75);\n --bs-navbar-disabled-color: rgba(255, 255, 255, 0.25);\n --bs-navbar-active-color: #fff;\n --bs-navbar-brand-color: #fff;\n --bs-navbar-brand-hover-color: #fff;\n --bs-navbar-toggler-border-color: rgba(255, 255, 255, 0.1);\n --bs-navbar-toggler-icon-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n[data-bs-theme=dark] .navbar-toggler-icon {\n --bs-navbar-toggler-icon-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.card {\n --bs-card-spacer-y: 1rem;\n --bs-card-spacer-x: 1rem;\n --bs-card-title-spacer-y: 0.5rem;\n --bs-card-title-color: ;\n --bs-card-subtitle-color: ;\n --bs-card-border-width: var(--bs-border-width);\n --bs-card-border-color: var(--bs-border-color-translucent);\n --bs-card-border-radius: var(--bs-border-radius);\n --bs-card-box-shadow: ;\n --bs-card-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width)));\n --bs-card-cap-padding-y: 0.5rem;\n --bs-card-cap-padding-x: 1rem;\n --bs-card-cap-bg: rgba(var(--bs-body-color-rgb), 0.03);\n --bs-card-cap-color: ;\n --bs-card-height: ;\n --bs-card-color: ;\n --bs-card-bg: var(--bs-body-bg);\n --bs-card-img-overlay-padding: 1rem;\n --bs-card-group-margin: 0.75rem;\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n height: var(--bs-card-height);\n color: var(--bs-body-color);\n word-wrap: break-word;\n background-color: var(--bs-card-bg);\n background-clip: border-box;\n border: var(--bs-card-border-width) solid var(--bs-card-border-color);\n border-radius: var(--bs-card-border-radius);\n}\n.card > hr {\n margin-right: 0;\n margin-left: 0;\n}\n.card > .list-group {\n border-top: inherit;\n border-bottom: inherit;\n}\n.card > .list-group:first-child {\n border-top-width: 0;\n border-top-left-radius: var(--bs-card-inner-border-radius);\n border-top-right-radius: var(--bs-card-inner-border-radius);\n}\n.card > .list-group:last-child {\n border-bottom-width: 0;\n border-bottom-right-radius: var(--bs-card-inner-border-radius);\n border-bottom-left-radius: var(--bs-card-inner-border-radius);\n}\n.card > .card-header + .list-group,\n.card > .list-group + .card-footer {\n border-top: 0;\n}\n\n.card-body {\n flex: 1 1 auto;\n padding: var(--bs-card-spacer-y) var(--bs-card-spacer-x);\n color: var(--bs-card-color);\n}\n\n.card-title {\n margin-bottom: var(--bs-card-title-spacer-y);\n color: var(--bs-card-title-color);\n}\n\n.card-subtitle {\n margin-top: calc(-0.5 * var(--bs-card-title-spacer-y));\n margin-bottom: 0;\n color: var(--bs-card-subtitle-color);\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link + .card-link {\n margin-left: var(--bs-card-spacer-x);\n}\n\n.card-header {\n padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);\n margin-bottom: 0;\n color: var(--bs-card-cap-color);\n background-color: var(--bs-card-cap-bg);\n border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color);\n}\n.card-header:first-child {\n border-radius: var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0;\n}\n\n.card-footer {\n padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);\n color: var(--bs-card-cap-color);\n background-color: var(--bs-card-cap-bg);\n border-top: var(--bs-card-border-width) solid var(--bs-card-border-color);\n}\n.card-footer:last-child {\n border-radius: 0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius);\n}\n\n.card-header-tabs {\n margin-right: calc(-0.5 * var(--bs-card-cap-padding-x));\n margin-bottom: calc(-1 * var(--bs-card-cap-padding-y));\n margin-left: calc(-0.5 * var(--bs-card-cap-padding-x));\n border-bottom: 0;\n}\n.card-header-tabs .nav-link.active {\n background-color: var(--bs-card-bg);\n border-bottom-color: var(--bs-card-bg);\n}\n\n.card-header-pills {\n margin-right: calc(-0.5 * var(--bs-card-cap-padding-x));\n margin-left: calc(-0.5 * var(--bs-card-cap-padding-x));\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: var(--bs-card-img-overlay-padding);\n border-radius: var(--bs-card-inner-border-radius);\n}\n\n.card-img,\n.card-img-top,\n.card-img-bottom {\n width: 100%;\n}\n\n.card-img,\n.card-img-top {\n border-top-left-radius: var(--bs-card-inner-border-radius);\n border-top-right-radius: var(--bs-card-inner-border-radius);\n}\n\n.card-img,\n.card-img-bottom {\n border-bottom-right-radius: var(--bs-card-inner-border-radius);\n border-bottom-left-radius: var(--bs-card-inner-border-radius);\n}\n\n.card-group > .card {\n margin-bottom: var(--bs-card-group-margin);\n}\n@media (min-width: 576px) {\n .card-group {\n display: flex;\n flex-flow: row wrap;\n }\n .card-group > .card {\n flex: 1 0 0;\n margin-bottom: 0;\n }\n .card-group > .card + .card {\n margin-left: 0;\n border-left: 0;\n }\n .card-group > .card:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:last-child) > .card-img-top,\n .card-group > .card:not(:last-child) > .card-header {\n border-top-right-radius: 0;\n }\n .card-group > .card:not(:last-child) > .card-img-bottom,\n .card-group > .card:not(:last-child) > .card-footer {\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .card-group > .card:not(:first-child) > .card-img-top,\n .card-group > .card:not(:first-child) > .card-header {\n border-top-left-radius: 0;\n }\n .card-group > .card:not(:first-child) > .card-img-bottom,\n .card-group > .card:not(:first-child) > .card-footer {\n border-bottom-left-radius: 0;\n }\n}\n\n.accordion {\n --bs-accordion-color: var(--bs-body-color);\n --bs-accordion-bg: var(--bs-body-bg);\n --bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;\n --bs-accordion-border-color: var(--bs-border-color);\n --bs-accordion-border-width: var(--bs-border-width);\n --bs-accordion-border-radius: var(--bs-border-radius);\n --bs-accordion-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width)));\n --bs-accordion-btn-padding-x: 1.25rem;\n --bs-accordion-btn-padding-y: 1rem;\n --bs-accordion-btn-color: var(--bs-body-color);\n --bs-accordion-btn-bg: var(--bs-accordion-bg);\n --bs-accordion-btn-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23212529' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");\n --bs-accordion-btn-icon-width: 1.25rem;\n --bs-accordion-btn-icon-transform: rotate(-180deg);\n --bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;\n --bs-accordion-btn-active-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='rgb%282.0392156863%, 17.2549019608%, 39.6862745098%%29' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");\n --bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n --bs-accordion-body-padding-x: 1.25rem;\n --bs-accordion-body-padding-y: 1rem;\n --bs-accordion-active-color: var(--bs-primary-text-emphasis);\n --bs-accordion-active-bg: var(--bs-primary-bg-subtle);\n}\n\n.accordion-button {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n padding: var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);\n font-size: 1rem;\n color: var(--bs-accordion-btn-color);\n text-align: left;\n background-color: var(--bs-accordion-btn-bg);\n border: 0;\n border-radius: 0;\n overflow-anchor: none;\n transition: var(--bs-accordion-transition);\n}\n@media (prefers-reduced-motion: reduce) {\n .accordion-button {\n transition: none;\n }\n}\n.accordion-button:not(.collapsed) {\n color: var(--bs-accordion-active-color);\n background-color: var(--bs-accordion-active-bg);\n box-shadow: inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color);\n}\n.accordion-button:not(.collapsed)::after {\n background-image: var(--bs-accordion-btn-active-icon);\n transform: var(--bs-accordion-btn-icon-transform);\n}\n.accordion-button::after {\n flex-shrink: 0;\n width: var(--bs-accordion-btn-icon-width);\n height: var(--bs-accordion-btn-icon-width);\n margin-left: auto;\n content: \"\";\n background-image: var(--bs-accordion-btn-icon);\n background-repeat: no-repeat;\n background-size: var(--bs-accordion-btn-icon-width);\n transition: var(--bs-accordion-btn-icon-transition);\n}\n@media (prefers-reduced-motion: reduce) {\n .accordion-button::after {\n transition: none;\n }\n}\n.accordion-button:hover {\n z-index: 2;\n}\n.accordion-button:focus {\n z-index: 3;\n outline: 0;\n box-shadow: var(--bs-accordion-btn-focus-box-shadow);\n}\n\n.accordion-header {\n margin-bottom: 0;\n}\n\n.accordion-item {\n color: var(--bs-accordion-color);\n background-color: var(--bs-accordion-bg);\n border: var(--bs-accordion-border-width) solid var(--bs-accordion-border-color);\n}\n.accordion-item:first-of-type {\n border-top-left-radius: var(--bs-accordion-border-radius);\n border-top-right-radius: var(--bs-accordion-border-radius);\n}\n.accordion-item:first-of-type > .accordion-header .accordion-button {\n border-top-left-radius: var(--bs-accordion-inner-border-radius);\n border-top-right-radius: var(--bs-accordion-inner-border-radius);\n}\n.accordion-item:not(:first-of-type) {\n border-top: 0;\n}\n.accordion-item:last-of-type {\n border-bottom-right-radius: var(--bs-accordion-border-radius);\n border-bottom-left-radius: var(--bs-accordion-border-radius);\n}\n.accordion-item:last-of-type > .accordion-header .accordion-button.collapsed {\n border-bottom-right-radius: var(--bs-accordion-inner-border-radius);\n border-bottom-left-radius: var(--bs-accordion-inner-border-radius);\n}\n.accordion-item:last-of-type > .accordion-collapse {\n border-bottom-right-radius: var(--bs-accordion-border-radius);\n border-bottom-left-radius: var(--bs-accordion-border-radius);\n}\n\n.accordion-body {\n padding: var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x);\n}\n\n.accordion-flush > .accordion-item {\n border-right: 0;\n border-left: 0;\n border-radius: 0;\n}\n.accordion-flush > .accordion-item:first-child {\n border-top: 0;\n}\n.accordion-flush > .accordion-item:last-child {\n border-bottom: 0;\n}\n.accordion-flush > .accordion-item > .accordion-collapse,\n.accordion-flush > .accordion-item > .accordion-header .accordion-button,\n.accordion-flush > .accordion-item > .accordion-header .accordion-button.collapsed {\n border-radius: 0;\n}\n\n[data-bs-theme=dark] .accordion-button::after {\n --bs-accordion-btn-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='rgb%2843.0588235294%, 65.8823529412%, 99.5294117647%%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e\");\n --bs-accordion-btn-active-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='rgb%2843.0588235294%, 65.8823529412%, 99.5294117647%%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e\");\n}\n\n.breadcrumb {\n --bs-breadcrumb-padding-x: 0;\n --bs-breadcrumb-padding-y: 0;\n --bs-breadcrumb-margin-bottom: 1rem;\n --bs-breadcrumb-bg: ;\n --bs-breadcrumb-border-radius: ;\n --bs-breadcrumb-divider-color: var(--bs-secondary-color);\n --bs-breadcrumb-item-padding-x: 0.5rem;\n --bs-breadcrumb-item-active-color: var(--bs-secondary-color);\n display: flex;\n flex-wrap: wrap;\n padding: var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);\n margin-bottom: var(--bs-breadcrumb-margin-bottom);\n font-size: var(--bs-breadcrumb-font-size);\n list-style: none;\n background-color: var(--bs-breadcrumb-bg);\n border-radius: var(--bs-breadcrumb-border-radius);\n}\n\n.breadcrumb-item + .breadcrumb-item {\n padding-left: var(--bs-breadcrumb-item-padding-x);\n}\n.breadcrumb-item + .breadcrumb-item::before {\n float: left;\n padding-right: var(--bs-breadcrumb-item-padding-x);\n color: var(--bs-breadcrumb-divider-color);\n content: var(--bs-breadcrumb-divider, \"/\") /* rtl: var(--bs-breadcrumb-divider, \"/\") */;\n}\n.breadcrumb-item.active {\n color: var(--bs-breadcrumb-item-active-color);\n}\n\n.pagination {\n --bs-pagination-padding-x: 0.75rem;\n --bs-pagination-padding-y: 0.375rem;\n --bs-pagination-font-size: 1rem;\n --bs-pagination-color: var(--bs-link-color);\n --bs-pagination-bg: var(--bs-body-bg);\n --bs-pagination-border-width: var(--bs-border-width);\n --bs-pagination-border-color: var(--bs-border-color);\n --bs-pagination-border-radius: var(--bs-border-radius);\n --bs-pagination-hover-color: var(--bs-link-hover-color);\n --bs-pagination-hover-bg: var(--bs-tertiary-bg);\n --bs-pagination-hover-border-color: var(--bs-border-color);\n --bs-pagination-focus-color: var(--bs-link-hover-color);\n --bs-pagination-focus-bg: var(--bs-secondary-bg);\n --bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n --bs-pagination-active-color: #fff;\n --bs-pagination-active-bg: #0d6efd;\n --bs-pagination-active-border-color: #0d6efd;\n --bs-pagination-disabled-color: var(--bs-secondary-color);\n --bs-pagination-disabled-bg: var(--bs-secondary-bg);\n --bs-pagination-disabled-border-color: var(--bs-border-color);\n display: flex;\n padding-left: 0;\n list-style: none;\n}\n\n.page-link {\n position: relative;\n display: block;\n padding: var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);\n font-size: var(--bs-pagination-font-size);\n color: var(--bs-pagination-color);\n text-decoration: none;\n background-color: var(--bs-pagination-bg);\n border: var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .page-link {\n transition: none;\n }\n}\n.page-link:hover {\n z-index: 2;\n color: var(--bs-pagination-hover-color);\n background-color: var(--bs-pagination-hover-bg);\n border-color: var(--bs-pagination-hover-border-color);\n}\n.page-link:focus {\n z-index: 3;\n color: var(--bs-pagination-focus-color);\n background-color: var(--bs-pagination-focus-bg);\n outline: 0;\n box-shadow: var(--bs-pagination-focus-box-shadow);\n}\n.page-link.active, .active > .page-link {\n z-index: 3;\n color: var(--bs-pagination-active-color);\n background-color: var(--bs-pagination-active-bg);\n border-color: var(--bs-pagination-active-border-color);\n}\n.page-link.disabled, .disabled > .page-link {\n color: var(--bs-pagination-disabled-color);\n pointer-events: none;\n background-color: var(--bs-pagination-disabled-bg);\n border-color: var(--bs-pagination-disabled-border-color);\n}\n\n.page-item:not(:first-child) .page-link {\n margin-left: calc(-1 * var(--bs-border-width));\n}\n.page-item:first-child .page-link {\n border-top-left-radius: var(--bs-pagination-border-radius);\n border-bottom-left-radius: var(--bs-pagination-border-radius);\n}\n.page-item:last-child .page-link {\n border-top-right-radius: var(--bs-pagination-border-radius);\n border-bottom-right-radius: var(--bs-pagination-border-radius);\n}\n\n.pagination-lg {\n --bs-pagination-padding-x: 1.5rem;\n --bs-pagination-padding-y: 0.75rem;\n --bs-pagination-font-size: 1.25rem;\n --bs-pagination-border-radius: var(--bs-border-radius-lg);\n}\n\n.pagination-sm {\n --bs-pagination-padding-x: 0.5rem;\n --bs-pagination-padding-y: 0.25rem;\n --bs-pagination-font-size: 0.875rem;\n --bs-pagination-border-radius: var(--bs-border-radius-sm);\n}\n\n.badge {\n --bs-badge-padding-x: 0.65em;\n --bs-badge-padding-y: 0.35em;\n --bs-badge-font-size: 0.75em;\n --bs-badge-font-weight: 700;\n --bs-badge-color: #fff;\n --bs-badge-border-radius: var(--bs-border-radius);\n display: inline-block;\n padding: var(--bs-badge-padding-y) var(--bs-badge-padding-x);\n font-size: var(--bs-badge-font-size);\n font-weight: var(--bs-badge-font-weight);\n line-height: 1;\n color: var(--bs-badge-color);\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: var(--bs-badge-border-radius);\n}\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.alert {\n --bs-alert-bg: transparent;\n --bs-alert-padding-x: 1rem;\n --bs-alert-padding-y: 1rem;\n --bs-alert-margin-bottom: 1rem;\n --bs-alert-color: inherit;\n --bs-alert-border-color: transparent;\n --bs-alert-border: var(--bs-border-width) solid var(--bs-alert-border-color);\n --bs-alert-border-radius: var(--bs-border-radius);\n --bs-alert-link-color: inherit;\n position: relative;\n padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x);\n margin-bottom: var(--bs-alert-margin-bottom);\n color: var(--bs-alert-color);\n background-color: var(--bs-alert-bg);\n border: var(--bs-alert-border);\n border-radius: var(--bs-alert-border-radius);\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: 700;\n color: var(--bs-alert-link-color);\n}\n\n.alert-dismissible {\n padding-right: 3rem;\n}\n.alert-dismissible .btn-close {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n padding: 1.25rem 1rem;\n}\n\n.alert-primary {\n --bs-alert-color: var(--bs-primary-text-emphasis);\n --bs-alert-bg: var(--bs-primary-bg-subtle);\n --bs-alert-border-color: var(--bs-primary-border-subtle);\n --bs-alert-link-color: var(--bs-primary-text-emphasis);\n}\n\n.alert-secondary {\n --bs-alert-color: var(--bs-secondary-text-emphasis);\n --bs-alert-bg: var(--bs-secondary-bg-subtle);\n --bs-alert-border-color: var(--bs-secondary-border-subtle);\n --bs-alert-link-color: var(--bs-secondary-text-emphasis);\n}\n\n.alert-success {\n --bs-alert-color: var(--bs-success-text-emphasis);\n --bs-alert-bg: var(--bs-success-bg-subtle);\n --bs-alert-border-color: var(--bs-success-border-subtle);\n --bs-alert-link-color: var(--bs-success-text-emphasis);\n}\n\n.alert-info {\n --bs-alert-color: var(--bs-info-text-emphasis);\n --bs-alert-bg: var(--bs-info-bg-subtle);\n --bs-alert-border-color: var(--bs-info-border-subtle);\n --bs-alert-link-color: var(--bs-info-text-emphasis);\n}\n\n.alert-warning {\n --bs-alert-color: var(--bs-warning-text-emphasis);\n --bs-alert-bg: var(--bs-warning-bg-subtle);\n --bs-alert-border-color: var(--bs-warning-border-subtle);\n --bs-alert-link-color: var(--bs-warning-text-emphasis);\n}\n\n.alert-danger {\n --bs-alert-color: var(--bs-danger-text-emphasis);\n --bs-alert-bg: var(--bs-danger-bg-subtle);\n --bs-alert-border-color: var(--bs-danger-border-subtle);\n --bs-alert-link-color: var(--bs-danger-text-emphasis);\n}\n\n.alert-light {\n --bs-alert-color: var(--bs-light-text-emphasis);\n --bs-alert-bg: var(--bs-light-bg-subtle);\n --bs-alert-border-color: var(--bs-light-border-subtle);\n --bs-alert-link-color: var(--bs-light-text-emphasis);\n}\n\n.alert-dark {\n --bs-alert-color: var(--bs-dark-text-emphasis);\n --bs-alert-bg: var(--bs-dark-bg-subtle);\n --bs-alert-border-color: var(--bs-dark-border-subtle);\n --bs-alert-link-color: var(--bs-dark-text-emphasis);\n}\n\n@keyframes progress-bar-stripes {\n 0% {\n background-position-x: var(--bs-progress-height);\n }\n}\n.progress,\n.progress-stacked {\n --bs-progress-height: 1rem;\n --bs-progress-font-size: 0.75rem;\n --bs-progress-bg: var(--bs-secondary-bg);\n --bs-progress-border-radius: var(--bs-border-radius);\n --bs-progress-box-shadow: var(--bs-box-shadow-inset);\n --bs-progress-bar-color: #fff;\n --bs-progress-bar-bg: #0d6efd;\n --bs-progress-bar-transition: width 0.6s ease;\n display: flex;\n height: var(--bs-progress-height);\n overflow: hidden;\n font-size: var(--bs-progress-font-size);\n background-color: var(--bs-progress-bg);\n border-radius: var(--bs-progress-border-radius);\n}\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n overflow: hidden;\n color: var(--bs-progress-bar-color);\n text-align: center;\n white-space: nowrap;\n background-color: var(--bs-progress-bar-bg);\n transition: var(--bs-progress-bar-transition);\n}\n@media (prefers-reduced-motion: reduce) {\n .progress-bar {\n transition: none;\n }\n}\n\n.progress-bar-striped {\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: var(--bs-progress-height) var(--bs-progress-height);\n}\n\n.progress-stacked > .progress {\n overflow: visible;\n}\n\n.progress-stacked > .progress > .progress-bar {\n width: 100%;\n}\n\n.progress-bar-animated {\n animation: 1s linear infinite progress-bar-stripes;\n}\n@media (prefers-reduced-motion: reduce) {\n .progress-bar-animated {\n animation: none;\n }\n}\n\n.list-group {\n --bs-list-group-color: var(--bs-body-color);\n --bs-list-group-bg: var(--bs-body-bg);\n --bs-list-group-border-color: var(--bs-border-color);\n --bs-list-group-border-width: var(--bs-border-width);\n --bs-list-group-border-radius: var(--bs-border-radius);\n --bs-list-group-item-padding-x: 1rem;\n --bs-list-group-item-padding-y: 0.5rem;\n --bs-list-group-action-color: var(--bs-secondary-color);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-tertiary-bg);\n --bs-list-group-action-active-color: var(--bs-body-color);\n --bs-list-group-action-active-bg: var(--bs-secondary-bg);\n --bs-list-group-disabled-color: var(--bs-secondary-color);\n --bs-list-group-disabled-bg: var(--bs-body-bg);\n --bs-list-group-active-color: #fff;\n --bs-list-group-active-bg: #0d6efd;\n --bs-list-group-active-border-color: #0d6efd;\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n border-radius: var(--bs-list-group-border-radius);\n}\n\n.list-group-numbered {\n list-style-type: none;\n counter-reset: section;\n}\n.list-group-numbered > .list-group-item::before {\n content: counters(section, \".\") \". \";\n counter-increment: section;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);\n color: var(--bs-list-group-color);\n text-decoration: none;\n background-color: var(--bs-list-group-bg);\n border: var(--bs-list-group-border-width) solid var(--bs-list-group-border-color);\n}\n.list-group-item:first-child {\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n}\n.list-group-item:last-child {\n border-bottom-right-radius: inherit;\n border-bottom-left-radius: inherit;\n}\n.list-group-item.disabled, .list-group-item:disabled {\n color: var(--bs-list-group-disabled-color);\n pointer-events: none;\n background-color: var(--bs-list-group-disabled-bg);\n}\n.list-group-item.active {\n z-index: 2;\n color: var(--bs-list-group-active-color);\n background-color: var(--bs-list-group-active-bg);\n border-color: var(--bs-list-group-active-border-color);\n}\n.list-group-item + .list-group-item {\n border-top-width: 0;\n}\n.list-group-item + .list-group-item.active {\n margin-top: calc(-1 * var(--bs-list-group-border-width));\n border-top-width: var(--bs-list-group-border-width);\n}\n\n.list-group-item-action {\n width: 100%;\n color: var(--bs-list-group-action-color);\n text-align: inherit;\n}\n.list-group-item-action:not(.active):hover, .list-group-item-action:not(.active):focus {\n z-index: 1;\n color: var(--bs-list-group-action-hover-color);\n text-decoration: none;\n background-color: var(--bs-list-group-action-hover-bg);\n}\n.list-group-item-action:not(.active):active {\n color: var(--bs-list-group-action-active-color);\n background-color: var(--bs-list-group-action-active-bg);\n}\n\n.list-group-horizontal {\n flex-direction: row;\n}\n.list-group-horizontal > .list-group-item:first-child:not(:last-child) {\n border-bottom-left-radius: var(--bs-list-group-border-radius);\n border-top-right-radius: 0;\n}\n.list-group-horizontal > .list-group-item:last-child:not(:first-child) {\n border-top-right-radius: var(--bs-list-group-border-radius);\n border-bottom-left-radius: 0;\n}\n.list-group-horizontal > .list-group-item.active {\n margin-top: 0;\n}\n.list-group-horizontal > .list-group-item + .list-group-item {\n border-top-width: var(--bs-list-group-border-width);\n border-left-width: 0;\n}\n.list-group-horizontal > .list-group-item + .list-group-item.active {\n margin-left: calc(-1 * var(--bs-list-group-border-width));\n border-left-width: var(--bs-list-group-border-width);\n}\n\n@media (min-width: 576px) {\n .list-group-horizontal-sm {\n flex-direction: row;\n }\n .list-group-horizontal-sm > .list-group-item:first-child:not(:last-child) {\n border-bottom-left-radius: var(--bs-list-group-border-radius);\n border-top-right-radius: 0;\n }\n .list-group-horizontal-sm > .list-group-item:last-child:not(:first-child) {\n border-top-right-radius: var(--bs-list-group-border-radius);\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-sm > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-sm > .list-group-item + .list-group-item {\n border-top-width: var(--bs-list-group-border-width);\n border-left-width: 0;\n }\n .list-group-horizontal-sm > .list-group-item + .list-group-item.active {\n margin-left: calc(-1 * var(--bs-list-group-border-width));\n border-left-width: var(--bs-list-group-border-width);\n }\n}\n@media (min-width: 768px) {\n .list-group-horizontal-md {\n flex-direction: row;\n }\n .list-group-horizontal-md > .list-group-item:first-child:not(:last-child) {\n border-bottom-left-radius: var(--bs-list-group-border-radius);\n border-top-right-radius: 0;\n }\n .list-group-horizontal-md > .list-group-item:last-child:not(:first-child) {\n border-top-right-radius: var(--bs-list-group-border-radius);\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-md > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-md > .list-group-item + .list-group-item {\n border-top-width: var(--bs-list-group-border-width);\n border-left-width: 0;\n }\n .list-group-horizontal-md > .list-group-item + .list-group-item.active {\n margin-left: calc(-1 * var(--bs-list-group-border-width));\n border-left-width: var(--bs-list-group-border-width);\n }\n}\n@media (min-width: 992px) {\n .list-group-horizontal-lg {\n flex-direction: row;\n }\n .list-group-horizontal-lg > .list-group-item:first-child:not(:last-child) {\n border-bottom-left-radius: var(--bs-list-group-border-radius);\n border-top-right-radius: 0;\n }\n .list-group-horizontal-lg > .list-group-item:last-child:not(:first-child) {\n border-top-right-radius: var(--bs-list-group-border-radius);\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-lg > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-lg > .list-group-item + .list-group-item {\n border-top-width: var(--bs-list-group-border-width);\n border-left-width: 0;\n }\n .list-group-horizontal-lg > .list-group-item + .list-group-item.active {\n margin-left: calc(-1 * var(--bs-list-group-border-width));\n border-left-width: var(--bs-list-group-border-width);\n }\n}\n@media (min-width: 1200px) {\n .list-group-horizontal-xl {\n flex-direction: row;\n }\n .list-group-horizontal-xl > .list-group-item:first-child:not(:last-child) {\n border-bottom-left-radius: var(--bs-list-group-border-radius);\n border-top-right-radius: 0;\n }\n .list-group-horizontal-xl > .list-group-item:last-child:not(:first-child) {\n border-top-right-radius: var(--bs-list-group-border-radius);\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-xl > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-xl > .list-group-item + .list-group-item {\n border-top-width: var(--bs-list-group-border-width);\n border-left-width: 0;\n }\n .list-group-horizontal-xl > .list-group-item + .list-group-item.active {\n margin-left: calc(-1 * var(--bs-list-group-border-width));\n border-left-width: var(--bs-list-group-border-width);\n }\n}\n@media (min-width: 1400px) {\n .list-group-horizontal-xxl {\n flex-direction: row;\n }\n .list-group-horizontal-xxl > .list-group-item:first-child:not(:last-child) {\n border-bottom-left-radius: var(--bs-list-group-border-radius);\n border-top-right-radius: 0;\n }\n .list-group-horizontal-xxl > .list-group-item:last-child:not(:first-child) {\n border-top-right-radius: var(--bs-list-group-border-radius);\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-xxl > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-xxl > .list-group-item + .list-group-item {\n border-top-width: var(--bs-list-group-border-width);\n border-left-width: 0;\n }\n .list-group-horizontal-xxl > .list-group-item + .list-group-item.active {\n margin-left: calc(-1 * var(--bs-list-group-border-width));\n border-left-width: var(--bs-list-group-border-width);\n }\n}\n.list-group-flush {\n border-radius: 0;\n}\n.list-group-flush > .list-group-item {\n border-width: 0 0 var(--bs-list-group-border-width);\n}\n.list-group-flush > .list-group-item:last-child {\n border-bottom-width: 0;\n}\n\n.list-group-item-primary {\n --bs-list-group-color: var(--bs-primary-text-emphasis);\n --bs-list-group-bg: var(--bs-primary-bg-subtle);\n --bs-list-group-border-color: var(--bs-primary-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-primary-border-subtle);\n --bs-list-group-active-color: var(--bs-primary-bg-subtle);\n --bs-list-group-active-bg: var(--bs-primary-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-primary-text-emphasis);\n}\n\n.list-group-item-secondary {\n --bs-list-group-color: var(--bs-secondary-text-emphasis);\n --bs-list-group-bg: var(--bs-secondary-bg-subtle);\n --bs-list-group-border-color: var(--bs-secondary-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);\n --bs-list-group-active-color: var(--bs-secondary-bg-subtle);\n --bs-list-group-active-bg: var(--bs-secondary-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-secondary-text-emphasis);\n}\n\n.list-group-item-success {\n --bs-list-group-color: var(--bs-success-text-emphasis);\n --bs-list-group-bg: var(--bs-success-bg-subtle);\n --bs-list-group-border-color: var(--bs-success-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-success-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-success-border-subtle);\n --bs-list-group-active-color: var(--bs-success-bg-subtle);\n --bs-list-group-active-bg: var(--bs-success-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-success-text-emphasis);\n}\n\n.list-group-item-info {\n --bs-list-group-color: var(--bs-info-text-emphasis);\n --bs-list-group-bg: var(--bs-info-bg-subtle);\n --bs-list-group-border-color: var(--bs-info-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-info-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-info-border-subtle);\n --bs-list-group-active-color: var(--bs-info-bg-subtle);\n --bs-list-group-active-bg: var(--bs-info-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-info-text-emphasis);\n}\n\n.list-group-item-warning {\n --bs-list-group-color: var(--bs-warning-text-emphasis);\n --bs-list-group-bg: var(--bs-warning-bg-subtle);\n --bs-list-group-border-color: var(--bs-warning-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-warning-border-subtle);\n --bs-list-group-active-color: var(--bs-warning-bg-subtle);\n --bs-list-group-active-bg: var(--bs-warning-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-warning-text-emphasis);\n}\n\n.list-group-item-danger {\n --bs-list-group-color: var(--bs-danger-text-emphasis);\n --bs-list-group-bg: var(--bs-danger-bg-subtle);\n --bs-list-group-border-color: var(--bs-danger-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-danger-border-subtle);\n --bs-list-group-active-color: var(--bs-danger-bg-subtle);\n --bs-list-group-active-bg: var(--bs-danger-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-danger-text-emphasis);\n}\n\n.list-group-item-light {\n --bs-list-group-color: var(--bs-light-text-emphasis);\n --bs-list-group-bg: var(--bs-light-bg-subtle);\n --bs-list-group-border-color: var(--bs-light-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-light-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-light-border-subtle);\n --bs-list-group-active-color: var(--bs-light-bg-subtle);\n --bs-list-group-active-bg: var(--bs-light-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-light-text-emphasis);\n}\n\n.list-group-item-dark {\n --bs-list-group-color: var(--bs-dark-text-emphasis);\n --bs-list-group-bg: var(--bs-dark-bg-subtle);\n --bs-list-group-border-color: var(--bs-dark-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-dark-border-subtle);\n --bs-list-group-active-color: var(--bs-dark-bg-subtle);\n --bs-list-group-active-bg: var(--bs-dark-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-dark-text-emphasis);\n}\n\n.btn-close {\n --bs-btn-close-color: #000;\n --bs-btn-close-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414'/%3e%3c/svg%3e\");\n --bs-btn-close-opacity: 0.5;\n --bs-btn-close-hover-opacity: 0.75;\n --bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n --bs-btn-close-focus-opacity: 1;\n --bs-btn-close-disabled-opacity: 0.25;\n box-sizing: content-box;\n width: 1em;\n height: 1em;\n padding: 0.25em 0.25em;\n color: var(--bs-btn-close-color);\n background: transparent var(--bs-btn-close-bg) center/1em auto no-repeat;\n filter: var(--bs-btn-close-filter);\n border: 0;\n border-radius: 0.375rem;\n opacity: var(--bs-btn-close-opacity);\n}\n.btn-close:hover {\n color: var(--bs-btn-close-color);\n text-decoration: none;\n opacity: var(--bs-btn-close-hover-opacity);\n}\n.btn-close:focus {\n outline: 0;\n box-shadow: var(--bs-btn-close-focus-shadow);\n opacity: var(--bs-btn-close-focus-opacity);\n}\n.btn-close:disabled, .btn-close.disabled {\n pointer-events: none;\n user-select: none;\n opacity: var(--bs-btn-close-disabled-opacity);\n}\n\n.btn-close-white {\n --bs-btn-close-filter: invert(1) grayscale(100%) brightness(200%);\n}\n\n:root,\n[data-bs-theme=light] {\n --bs-btn-close-filter: ;\n}\n\n[data-bs-theme=dark] {\n --bs-btn-close-filter: invert(1) grayscale(100%) brightness(200%);\n}\n\n.toast {\n --bs-toast-zindex: 1090;\n --bs-toast-padding-x: 0.75rem;\n --bs-toast-padding-y: 0.5rem;\n --bs-toast-spacing: 1.5rem;\n --bs-toast-max-width: 350px;\n --bs-toast-font-size: 0.875rem;\n --bs-toast-color: ;\n --bs-toast-bg: rgba(var(--bs-body-bg-rgb), 0.85);\n --bs-toast-border-width: var(--bs-border-width);\n --bs-toast-border-color: var(--bs-border-color-translucent);\n --bs-toast-border-radius: var(--bs-border-radius);\n --bs-toast-box-shadow: var(--bs-box-shadow);\n --bs-toast-header-color: var(--bs-secondary-color);\n --bs-toast-header-bg: rgba(var(--bs-body-bg-rgb), 0.85);\n --bs-toast-header-border-color: var(--bs-border-color-translucent);\n width: var(--bs-toast-max-width);\n max-width: 100%;\n font-size: var(--bs-toast-font-size);\n color: var(--bs-toast-color);\n pointer-events: auto;\n background-color: var(--bs-toast-bg);\n background-clip: padding-box;\n border: var(--bs-toast-border-width) solid var(--bs-toast-border-color);\n box-shadow: var(--bs-toast-box-shadow);\n border-radius: var(--bs-toast-border-radius);\n}\n.toast.showing {\n opacity: 0;\n}\n.toast:not(.show) {\n display: none;\n}\n\n.toast-container {\n --bs-toast-zindex: 1090;\n position: absolute;\n z-index: var(--bs-toast-zindex);\n width: max-content;\n max-width: 100%;\n pointer-events: none;\n}\n.toast-container > :not(:last-child) {\n margin-bottom: var(--bs-toast-spacing);\n}\n\n.toast-header {\n display: flex;\n align-items: center;\n padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x);\n color: var(--bs-toast-header-color);\n background-color: var(--bs-toast-header-bg);\n background-clip: padding-box;\n border-bottom: var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);\n border-top-left-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));\n border-top-right-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));\n}\n.toast-header .btn-close {\n margin-right: calc(-0.5 * var(--bs-toast-padding-x));\n margin-left: var(--bs-toast-padding-x);\n}\n\n.toast-body {\n padding: var(--bs-toast-padding-x);\n word-wrap: break-word;\n}\n\n.modal {\n --bs-modal-zindex: 1055;\n --bs-modal-width: 500px;\n --bs-modal-padding: 1rem;\n --bs-modal-margin: 0.5rem;\n --bs-modal-color: var(--bs-body-color);\n --bs-modal-bg: var(--bs-body-bg);\n --bs-modal-border-color: var(--bs-border-color-translucent);\n --bs-modal-border-width: var(--bs-border-width);\n --bs-modal-border-radius: var(--bs-border-radius-lg);\n --bs-modal-box-shadow: var(--bs-box-shadow-sm);\n --bs-modal-inner-border-radius: calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));\n --bs-modal-header-padding-x: 1rem;\n --bs-modal-header-padding-y: 1rem;\n --bs-modal-header-padding: 1rem 1rem;\n --bs-modal-header-border-color: var(--bs-border-color);\n --bs-modal-header-border-width: var(--bs-border-width);\n --bs-modal-title-line-height: 1.5;\n --bs-modal-footer-gap: 0.5rem;\n --bs-modal-footer-bg: ;\n --bs-modal-footer-border-color: var(--bs-border-color);\n --bs-modal-footer-border-width: var(--bs-border-width);\n position: fixed;\n top: 0;\n left: 0;\n z-index: var(--bs-modal-zindex);\n display: none;\n width: 100%;\n height: 100%;\n overflow-x: hidden;\n overflow-y: auto;\n outline: 0;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: var(--bs-modal-margin);\n pointer-events: none;\n}\n.modal.fade .modal-dialog {\n transform: translate(0, -50px);\n transition: transform 0.3s ease-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .modal.fade .modal-dialog {\n transition: none;\n }\n}\n.modal.show .modal-dialog {\n transform: none;\n}\n.modal.modal-static .modal-dialog {\n transform: scale(1.02);\n}\n\n.modal-dialog-scrollable {\n height: calc(100% - var(--bs-modal-margin) * 2);\n}\n.modal-dialog-scrollable .modal-content {\n max-height: 100%;\n overflow: hidden;\n}\n.modal-dialog-scrollable .modal-body {\n overflow-y: auto;\n}\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: calc(100% - var(--bs-modal-margin) * 2);\n}\n\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n color: var(--bs-modal-color);\n pointer-events: auto;\n background-color: var(--bs-modal-bg);\n background-clip: padding-box;\n border: var(--bs-modal-border-width) solid var(--bs-modal-border-color);\n border-radius: var(--bs-modal-border-radius);\n outline: 0;\n}\n\n.modal-backdrop {\n --bs-backdrop-zindex: 1050;\n --bs-backdrop-bg: #000;\n --bs-backdrop-opacity: 0.5;\n position: fixed;\n top: 0;\n left: 0;\n z-index: var(--bs-backdrop-zindex);\n width: 100vw;\n height: 100vh;\n background-color: var(--bs-backdrop-bg);\n}\n.modal-backdrop.fade {\n opacity: 0;\n}\n.modal-backdrop.show {\n opacity: var(--bs-backdrop-opacity);\n}\n\n.modal-header {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n padding: var(--bs-modal-header-padding);\n border-bottom: var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);\n border-top-left-radius: var(--bs-modal-inner-border-radius);\n border-top-right-radius: var(--bs-modal-inner-border-radius);\n}\n.modal-header .btn-close {\n padding: calc(var(--bs-modal-header-padding-y) * 0.5) calc(var(--bs-modal-header-padding-x) * 0.5);\n margin-top: calc(-0.5 * var(--bs-modal-header-padding-y));\n margin-right: calc(-0.5 * var(--bs-modal-header-padding-x));\n margin-bottom: calc(-0.5 * var(--bs-modal-header-padding-y));\n margin-left: auto;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: var(--bs-modal-title-line-height);\n}\n\n.modal-body {\n position: relative;\n flex: 1 1 auto;\n padding: var(--bs-modal-padding);\n}\n\n.modal-footer {\n display: flex;\n flex-shrink: 0;\n flex-wrap: wrap;\n align-items: center;\n justify-content: flex-end;\n padding: calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * 0.5);\n background-color: var(--bs-modal-footer-bg);\n border-top: var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);\n border-bottom-right-radius: var(--bs-modal-inner-border-radius);\n border-bottom-left-radius: var(--bs-modal-inner-border-radius);\n}\n.modal-footer > * {\n margin: calc(var(--bs-modal-footer-gap) * 0.5);\n}\n\n@media (min-width: 576px) {\n .modal {\n --bs-modal-margin: 1.75rem;\n --bs-modal-box-shadow: var(--bs-box-shadow);\n }\n .modal-dialog {\n max-width: var(--bs-modal-width);\n margin-right: auto;\n margin-left: auto;\n }\n .modal-sm {\n --bs-modal-width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg,\n .modal-xl {\n --bs-modal-width: 800px;\n }\n}\n@media (min-width: 1200px) {\n .modal-xl {\n --bs-modal-width: 1140px;\n }\n}\n.modal-fullscreen {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n}\n.modal-fullscreen .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n}\n.modal-fullscreen .modal-header,\n.modal-fullscreen .modal-footer {\n border-radius: 0;\n}\n.modal-fullscreen .modal-body {\n overflow-y: auto;\n}\n\n@media (max-width: 575.98px) {\n .modal-fullscreen-sm-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n .modal-fullscreen-sm-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n }\n .modal-fullscreen-sm-down .modal-header,\n .modal-fullscreen-sm-down .modal-footer {\n border-radius: 0;\n }\n .modal-fullscreen-sm-down .modal-body {\n overflow-y: auto;\n }\n}\n@media (max-width: 767.98px) {\n .modal-fullscreen-md-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n .modal-fullscreen-md-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n }\n .modal-fullscreen-md-down .modal-header,\n .modal-fullscreen-md-down .modal-footer {\n border-radius: 0;\n }\n .modal-fullscreen-md-down .modal-body {\n overflow-y: auto;\n }\n}\n@media (max-width: 991.98px) {\n .modal-fullscreen-lg-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n .modal-fullscreen-lg-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n }\n .modal-fullscreen-lg-down .modal-header,\n .modal-fullscreen-lg-down .modal-footer {\n border-radius: 0;\n }\n .modal-fullscreen-lg-down .modal-body {\n overflow-y: auto;\n }\n}\n@media (max-width: 1199.98px) {\n .modal-fullscreen-xl-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n .modal-fullscreen-xl-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n }\n .modal-fullscreen-xl-down .modal-header,\n .modal-fullscreen-xl-down .modal-footer {\n border-radius: 0;\n }\n .modal-fullscreen-xl-down .modal-body {\n overflow-y: auto;\n }\n}\n@media (max-width: 1399.98px) {\n .modal-fullscreen-xxl-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n .modal-fullscreen-xxl-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n }\n .modal-fullscreen-xxl-down .modal-header,\n .modal-fullscreen-xxl-down .modal-footer {\n border-radius: 0;\n }\n .modal-fullscreen-xxl-down .modal-body {\n overflow-y: auto;\n }\n}\n.tooltip {\n --bs-tooltip-zindex: 1080;\n --bs-tooltip-max-width: 200px;\n --bs-tooltip-padding-x: 0.5rem;\n --bs-tooltip-padding-y: 0.25rem;\n --bs-tooltip-margin: ;\n --bs-tooltip-font-size: 0.875rem;\n --bs-tooltip-color: var(--bs-body-bg);\n --bs-tooltip-bg: var(--bs-emphasis-color);\n --bs-tooltip-border-radius: var(--bs-border-radius);\n --bs-tooltip-opacity: 0.9;\n --bs-tooltip-arrow-width: 0.8rem;\n --bs-tooltip-arrow-height: 0.4rem;\n z-index: var(--bs-tooltip-zindex);\n display: block;\n margin: var(--bs-tooltip-margin);\n font-family: var(--bs-font-sans-serif);\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n white-space: normal;\n word-spacing: normal;\n line-break: auto;\n font-size: var(--bs-tooltip-font-size);\n word-wrap: break-word;\n opacity: 0;\n}\n.tooltip.show {\n opacity: var(--bs-tooltip-opacity);\n}\n.tooltip .tooltip-arrow {\n display: block;\n width: var(--bs-tooltip-arrow-width);\n height: var(--bs-tooltip-arrow-height);\n}\n.tooltip .tooltip-arrow::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-tooltip-top .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow {\n bottom: calc(-1 * var(--bs-tooltip-arrow-height));\n}\n.bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before {\n top: -1px;\n border-width: var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0;\n border-top-color: var(--bs-tooltip-bg);\n}\n\n/* rtl:begin:ignore */\n.bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow {\n left: calc(-1 * var(--bs-tooltip-arrow-height));\n width: var(--bs-tooltip-arrow-height);\n height: var(--bs-tooltip-arrow-width);\n}\n.bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before {\n right: -1px;\n border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0;\n border-right-color: var(--bs-tooltip-bg);\n}\n\n/* rtl:end:ignore */\n.bs-tooltip-bottom .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow {\n top: calc(-1 * var(--bs-tooltip-arrow-height));\n}\n.bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before {\n bottom: -1px;\n border-width: 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height);\n border-bottom-color: var(--bs-tooltip-bg);\n}\n\n/* rtl:begin:ignore */\n.bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow {\n right: calc(-1 * var(--bs-tooltip-arrow-height));\n width: var(--bs-tooltip-arrow-height);\n height: var(--bs-tooltip-arrow-width);\n}\n.bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before {\n left: -1px;\n border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height);\n border-left-color: var(--bs-tooltip-bg);\n}\n\n/* rtl:end:ignore */\n.tooltip-inner {\n max-width: var(--bs-tooltip-max-width);\n padding: var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);\n color: var(--bs-tooltip-color);\n text-align: center;\n background-color: var(--bs-tooltip-bg);\n border-radius: var(--bs-tooltip-border-radius);\n}\n\n.popover {\n --bs-popover-zindex: 1070;\n --bs-popover-max-width: 276px;\n --bs-popover-font-size: 0.875rem;\n --bs-popover-bg: var(--bs-body-bg);\n --bs-popover-border-width: var(--bs-border-width);\n --bs-popover-border-color: var(--bs-border-color-translucent);\n --bs-popover-border-radius: var(--bs-border-radius-lg);\n --bs-popover-inner-border-radius: calc(var(--bs-border-radius-lg) - var(--bs-border-width));\n --bs-popover-box-shadow: var(--bs-box-shadow);\n --bs-popover-header-padding-x: 1rem;\n --bs-popover-header-padding-y: 0.5rem;\n --bs-popover-header-font-size: 1rem;\n --bs-popover-header-color: inherit;\n --bs-popover-header-bg: var(--bs-secondary-bg);\n --bs-popover-body-padding-x: 1rem;\n --bs-popover-body-padding-y: 1rem;\n --bs-popover-body-color: var(--bs-body-color);\n --bs-popover-arrow-width: 1rem;\n --bs-popover-arrow-height: 0.5rem;\n --bs-popover-arrow-border: var(--bs-popover-border-color);\n z-index: var(--bs-popover-zindex);\n display: block;\n max-width: var(--bs-popover-max-width);\n font-family: var(--bs-font-sans-serif);\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n white-space: normal;\n word-spacing: normal;\n line-break: auto;\n font-size: var(--bs-popover-font-size);\n word-wrap: break-word;\n background-color: var(--bs-popover-bg);\n background-clip: padding-box;\n border: var(--bs-popover-border-width) solid var(--bs-popover-border-color);\n border-radius: var(--bs-popover-border-radius);\n}\n.popover .popover-arrow {\n display: block;\n width: var(--bs-popover-arrow-width);\n height: var(--bs-popover-arrow-height);\n}\n.popover .popover-arrow::before, .popover .popover-arrow::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n border-width: 0;\n}\n\n.bs-popover-top > .popover-arrow, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow {\n bottom: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));\n}\n.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before, .bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after {\n border-width: var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0;\n}\n.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before {\n bottom: 0;\n border-top-color: var(--bs-popover-arrow-border);\n}\n.bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after {\n bottom: var(--bs-popover-border-width);\n border-top-color: var(--bs-popover-bg);\n}\n\n/* rtl:begin:ignore */\n.bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow {\n left: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));\n width: var(--bs-popover-arrow-height);\n height: var(--bs-popover-arrow-width);\n}\n.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before, .bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after {\n border-width: calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0;\n}\n.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before {\n left: 0;\n border-right-color: var(--bs-popover-arrow-border);\n}\n.bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after {\n left: var(--bs-popover-border-width);\n border-right-color: var(--bs-popover-bg);\n}\n\n/* rtl:end:ignore */\n.bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow {\n top: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));\n}\n.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before, .bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after {\n border-width: 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height);\n}\n.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before {\n top: 0;\n border-bottom-color: var(--bs-popover-arrow-border);\n}\n.bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after {\n top: var(--bs-popover-border-width);\n border-bottom-color: var(--bs-popover-bg);\n}\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: var(--bs-popover-arrow-width);\n margin-left: calc(-0.5 * var(--bs-popover-arrow-width));\n content: \"\";\n border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-header-bg);\n}\n\n/* rtl:begin:ignore */\n.bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow {\n right: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));\n width: var(--bs-popover-arrow-height);\n height: var(--bs-popover-arrow-width);\n}\n.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before, .bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after {\n border-width: calc(var(--bs-popover-arrow-width) * 0.5) 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height);\n}\n.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before {\n right: 0;\n border-left-color: var(--bs-popover-arrow-border);\n}\n.bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after {\n right: var(--bs-popover-border-width);\n border-left-color: var(--bs-popover-bg);\n}\n\n/* rtl:end:ignore */\n.popover-header {\n padding: var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);\n margin-bottom: 0;\n font-size: var(--bs-popover-header-font-size);\n color: var(--bs-popover-header-color);\n background-color: var(--bs-popover-header-bg);\n border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-border-color);\n border-top-left-radius: var(--bs-popover-inner-border-radius);\n border-top-right-radius: var(--bs-popover-inner-border-radius);\n}\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);\n color: var(--bs-popover-body-color);\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n.carousel-inner::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n backface-visibility: hidden;\n transition: transform 0.6s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .carousel-item {\n transition: none;\n }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next:not(.carousel-item-start),\n.active.carousel-item-end {\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-end),\n.active.carousel-item-start {\n transform: translateX(-100%);\n}\n\n.carousel-fade .carousel-item {\n opacity: 0;\n transition-property: opacity;\n transform: none;\n}\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-start,\n.carousel-fade .carousel-item-prev.carousel-item-end {\n z-index: 1;\n opacity: 1;\n}\n.carousel-fade .active.carousel-item-start,\n.carousel-fade .active.carousel-item-end {\n z-index: 0;\n opacity: 0;\n transition: opacity 0s 0.6s;\n}\n@media (prefers-reduced-motion: reduce) {\n .carousel-fade .active.carousel-item-start,\n .carousel-fade .active.carousel-item-end {\n transition: none;\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 15%;\n padding: 0;\n color: #fff;\n text-align: center;\n background: none;\n filter: var(--bs-carousel-control-icon-filter);\n border: 0;\n opacity: 0.5;\n transition: opacity 0.15s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .carousel-control-prev,\n .carousel-control-next {\n transition: none;\n }\n}\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n opacity: 0.9;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n background-repeat: no-repeat;\n background-position: 50%;\n background-size: 100% 100%;\n}\n\n.carousel-control-prev-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0'/%3e%3c/svg%3e\") /*rtl:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e\")*/;\n}\n\n.carousel-control-next-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e\") /*rtl:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0'/%3e%3c/svg%3e\")*/;\n}\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 2;\n display: flex;\n justify-content: center;\n padding: 0;\n margin-right: 15%;\n margin-bottom: 1rem;\n margin-left: 15%;\n}\n.carousel-indicators [data-bs-target] {\n box-sizing: content-box;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n padding: 0;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n cursor: pointer;\n background-color: var(--bs-carousel-indicator-active-bg);\n background-clip: padding-box;\n border: 0;\n border-top: 10px solid transparent;\n border-bottom: 10px solid transparent;\n opacity: 0.5;\n transition: opacity 0.6s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .carousel-indicators [data-bs-target] {\n transition: none;\n }\n}\n.carousel-indicators .active {\n opacity: 1;\n}\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 1.25rem;\n left: 15%;\n padding-top: 1.25rem;\n padding-bottom: 1.25rem;\n color: var(--bs-carousel-caption-color);\n text-align: center;\n}\n\n.carousel-dark {\n --bs-carousel-indicator-active-bg: #000;\n --bs-carousel-caption-color: #000;\n --bs-carousel-control-icon-filter: invert(1) grayscale(100);\n}\n\n:root,\n[data-bs-theme=light] {\n --bs-carousel-indicator-active-bg: #fff;\n --bs-carousel-caption-color: #fff;\n --bs-carousel-control-icon-filter: ;\n}\n\n[data-bs-theme=dark] {\n --bs-carousel-indicator-active-bg: #000;\n --bs-carousel-caption-color: #000;\n --bs-carousel-control-icon-filter: invert(1) grayscale(100);\n}\n\n.spinner-grow,\n.spinner-border {\n display: inline-block;\n flex-shrink: 0;\n width: var(--bs-spinner-width);\n height: var(--bs-spinner-height);\n vertical-align: var(--bs-spinner-vertical-align);\n border-radius: 50%;\n animation: var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name);\n}\n\n@keyframes spinner-border {\n to {\n transform: rotate(360deg) /* rtl:ignore */;\n }\n}\n.spinner-border {\n --bs-spinner-width: 2rem;\n --bs-spinner-height: 2rem;\n --bs-spinner-vertical-align: -0.125em;\n --bs-spinner-border-width: 0.25em;\n --bs-spinner-animation-speed: 0.75s;\n --bs-spinner-animation-name: spinner-border;\n border: var(--bs-spinner-border-width) solid currentcolor;\n border-right-color: transparent;\n}\n\n.spinner-border-sm {\n --bs-spinner-width: 1rem;\n --bs-spinner-height: 1rem;\n --bs-spinner-border-width: 0.2em;\n}\n\n@keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n transform: none;\n }\n}\n.spinner-grow {\n --bs-spinner-width: 2rem;\n --bs-spinner-height: 2rem;\n --bs-spinner-vertical-align: -0.125em;\n --bs-spinner-animation-speed: 0.75s;\n --bs-spinner-animation-name: spinner-grow;\n background-color: currentcolor;\n opacity: 0;\n}\n\n.spinner-grow-sm {\n --bs-spinner-width: 1rem;\n --bs-spinner-height: 1rem;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .spinner-border,\n .spinner-grow {\n --bs-spinner-animation-speed: 1.5s;\n }\n}\n.offcanvas, .offcanvas-xxl, .offcanvas-xl, .offcanvas-lg, .offcanvas-md, .offcanvas-sm {\n --bs-offcanvas-zindex: 1045;\n --bs-offcanvas-width: 400px;\n --bs-offcanvas-height: 30vh;\n --bs-offcanvas-padding-x: 1rem;\n --bs-offcanvas-padding-y: 1rem;\n --bs-offcanvas-color: var(--bs-body-color);\n --bs-offcanvas-bg: var(--bs-body-bg);\n --bs-offcanvas-border-width: var(--bs-border-width);\n --bs-offcanvas-border-color: var(--bs-border-color-translucent);\n --bs-offcanvas-box-shadow: var(--bs-box-shadow-sm);\n --bs-offcanvas-transition: transform 0.3s ease-in-out;\n --bs-offcanvas-title-line-height: 1.5;\n}\n\n@media (max-width: 575.98px) {\n .offcanvas-sm {\n position: fixed;\n bottom: 0;\n z-index: var(--bs-offcanvas-zindex);\n display: flex;\n flex-direction: column;\n max-width: 100%;\n color: var(--bs-offcanvas-color);\n visibility: hidden;\n background-color: var(--bs-offcanvas-bg);\n background-clip: padding-box;\n outline: 0;\n transition: var(--bs-offcanvas-transition);\n }\n}\n@media (max-width: 575.98px) and (prefers-reduced-motion: reduce) {\n .offcanvas-sm {\n transition: none;\n }\n}\n@media (max-width: 575.98px) {\n .offcanvas-sm.offcanvas-start {\n top: 0;\n left: 0;\n width: var(--bs-offcanvas-width);\n border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(-100%);\n }\n .offcanvas-sm.offcanvas-end {\n top: 0;\n right: 0;\n width: var(--bs-offcanvas-width);\n border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(100%);\n }\n .offcanvas-sm.offcanvas-top {\n top: 0;\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(-100%);\n }\n .offcanvas-sm.offcanvas-bottom {\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(100%);\n }\n .offcanvas-sm.showing, .offcanvas-sm.show:not(.hiding) {\n transform: none;\n }\n .offcanvas-sm.showing, .offcanvas-sm.hiding, .offcanvas-sm.show {\n visibility: visible;\n }\n}\n@media (min-width: 576px) {\n .offcanvas-sm {\n --bs-offcanvas-height: auto;\n --bs-offcanvas-border-width: 0;\n background-color: transparent !important;\n }\n .offcanvas-sm .offcanvas-header {\n display: none;\n }\n .offcanvas-sm .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n background-color: transparent !important;\n }\n}\n\n@media (max-width: 767.98px) {\n .offcanvas-md {\n position: fixed;\n bottom: 0;\n z-index: var(--bs-offcanvas-zindex);\n display: flex;\n flex-direction: column;\n max-width: 100%;\n color: var(--bs-offcanvas-color);\n visibility: hidden;\n background-color: var(--bs-offcanvas-bg);\n background-clip: padding-box;\n outline: 0;\n transition: var(--bs-offcanvas-transition);\n }\n}\n@media (max-width: 767.98px) and (prefers-reduced-motion: reduce) {\n .offcanvas-md {\n transition: none;\n }\n}\n@media (max-width: 767.98px) {\n .offcanvas-md.offcanvas-start {\n top: 0;\n left: 0;\n width: var(--bs-offcanvas-width);\n border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(-100%);\n }\n .offcanvas-md.offcanvas-end {\n top: 0;\n right: 0;\n width: var(--bs-offcanvas-width);\n border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(100%);\n }\n .offcanvas-md.offcanvas-top {\n top: 0;\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(-100%);\n }\n .offcanvas-md.offcanvas-bottom {\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(100%);\n }\n .offcanvas-md.showing, .offcanvas-md.show:not(.hiding) {\n transform: none;\n }\n .offcanvas-md.showing, .offcanvas-md.hiding, .offcanvas-md.show {\n visibility: visible;\n }\n}\n@media (min-width: 768px) {\n .offcanvas-md {\n --bs-offcanvas-height: auto;\n --bs-offcanvas-border-width: 0;\n background-color: transparent !important;\n }\n .offcanvas-md .offcanvas-header {\n display: none;\n }\n .offcanvas-md .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n background-color: transparent !important;\n }\n}\n\n@media (max-width: 991.98px) {\n .offcanvas-lg {\n position: fixed;\n bottom: 0;\n z-index: var(--bs-offcanvas-zindex);\n display: flex;\n flex-direction: column;\n max-width: 100%;\n color: var(--bs-offcanvas-color);\n visibility: hidden;\n background-color: var(--bs-offcanvas-bg);\n background-clip: padding-box;\n outline: 0;\n transition: var(--bs-offcanvas-transition);\n }\n}\n@media (max-width: 991.98px) and (prefers-reduced-motion: reduce) {\n .offcanvas-lg {\n transition: none;\n }\n}\n@media (max-width: 991.98px) {\n .offcanvas-lg.offcanvas-start {\n top: 0;\n left: 0;\n width: var(--bs-offcanvas-width);\n border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(-100%);\n }\n .offcanvas-lg.offcanvas-end {\n top: 0;\n right: 0;\n width: var(--bs-offcanvas-width);\n border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(100%);\n }\n .offcanvas-lg.offcanvas-top {\n top: 0;\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(-100%);\n }\n .offcanvas-lg.offcanvas-bottom {\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(100%);\n }\n .offcanvas-lg.showing, .offcanvas-lg.show:not(.hiding) {\n transform: none;\n }\n .offcanvas-lg.showing, .offcanvas-lg.hiding, .offcanvas-lg.show {\n visibility: visible;\n }\n}\n@media (min-width: 992px) {\n .offcanvas-lg {\n --bs-offcanvas-height: auto;\n --bs-offcanvas-border-width: 0;\n background-color: transparent !important;\n }\n .offcanvas-lg .offcanvas-header {\n display: none;\n }\n .offcanvas-lg .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n background-color: transparent !important;\n }\n}\n\n@media (max-width: 1199.98px) {\n .offcanvas-xl {\n position: fixed;\n bottom: 0;\n z-index: var(--bs-offcanvas-zindex);\n display: flex;\n flex-direction: column;\n max-width: 100%;\n color: var(--bs-offcanvas-color);\n visibility: hidden;\n background-color: var(--bs-offcanvas-bg);\n background-clip: padding-box;\n outline: 0;\n transition: var(--bs-offcanvas-transition);\n }\n}\n@media (max-width: 1199.98px) and (prefers-reduced-motion: reduce) {\n .offcanvas-xl {\n transition: none;\n }\n}\n@media (max-width: 1199.98px) {\n .offcanvas-xl.offcanvas-start {\n top: 0;\n left: 0;\n width: var(--bs-offcanvas-width);\n border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(-100%);\n }\n .offcanvas-xl.offcanvas-end {\n top: 0;\n right: 0;\n width: var(--bs-offcanvas-width);\n border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(100%);\n }\n .offcanvas-xl.offcanvas-top {\n top: 0;\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(-100%);\n }\n .offcanvas-xl.offcanvas-bottom {\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(100%);\n }\n .offcanvas-xl.showing, .offcanvas-xl.show:not(.hiding) {\n transform: none;\n }\n .offcanvas-xl.showing, .offcanvas-xl.hiding, .offcanvas-xl.show {\n visibility: visible;\n }\n}\n@media (min-width: 1200px) {\n .offcanvas-xl {\n --bs-offcanvas-height: auto;\n --bs-offcanvas-border-width: 0;\n background-color: transparent !important;\n }\n .offcanvas-xl .offcanvas-header {\n display: none;\n }\n .offcanvas-xl .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n background-color: transparent !important;\n }\n}\n\n@media (max-width: 1399.98px) {\n .offcanvas-xxl {\n position: fixed;\n bottom: 0;\n z-index: var(--bs-offcanvas-zindex);\n display: flex;\n flex-direction: column;\n max-width: 100%;\n color: var(--bs-offcanvas-color);\n visibility: hidden;\n background-color: var(--bs-offcanvas-bg);\n background-clip: padding-box;\n outline: 0;\n transition: var(--bs-offcanvas-transition);\n }\n}\n@media (max-width: 1399.98px) and (prefers-reduced-motion: reduce) {\n .offcanvas-xxl {\n transition: none;\n }\n}\n@media (max-width: 1399.98px) {\n .offcanvas-xxl.offcanvas-start {\n top: 0;\n left: 0;\n width: var(--bs-offcanvas-width);\n border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(-100%);\n }\n .offcanvas-xxl.offcanvas-end {\n top: 0;\n right: 0;\n width: var(--bs-offcanvas-width);\n border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(100%);\n }\n .offcanvas-xxl.offcanvas-top {\n top: 0;\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(-100%);\n }\n .offcanvas-xxl.offcanvas-bottom {\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(100%);\n }\n .offcanvas-xxl.showing, .offcanvas-xxl.show:not(.hiding) {\n transform: none;\n }\n .offcanvas-xxl.showing, .offcanvas-xxl.hiding, .offcanvas-xxl.show {\n visibility: visible;\n }\n}\n@media (min-width: 1400px) {\n .offcanvas-xxl {\n --bs-offcanvas-height: auto;\n --bs-offcanvas-border-width: 0;\n background-color: transparent !important;\n }\n .offcanvas-xxl .offcanvas-header {\n display: none;\n }\n .offcanvas-xxl .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n background-color: transparent !important;\n }\n}\n\n.offcanvas {\n position: fixed;\n bottom: 0;\n z-index: var(--bs-offcanvas-zindex);\n display: flex;\n flex-direction: column;\n max-width: 100%;\n color: var(--bs-offcanvas-color);\n visibility: hidden;\n background-color: var(--bs-offcanvas-bg);\n background-clip: padding-box;\n outline: 0;\n transition: var(--bs-offcanvas-transition);\n}\n@media (prefers-reduced-motion: reduce) {\n .offcanvas {\n transition: none;\n }\n}\n.offcanvas.offcanvas-start {\n top: 0;\n left: 0;\n width: var(--bs-offcanvas-width);\n border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(-100%);\n}\n.offcanvas.offcanvas-end {\n top: 0;\n right: 0;\n width: var(--bs-offcanvas-width);\n border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(100%);\n}\n.offcanvas.offcanvas-top {\n top: 0;\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(-100%);\n}\n.offcanvas.offcanvas-bottom {\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(100%);\n}\n.offcanvas.showing, .offcanvas.show:not(.hiding) {\n transform: none;\n}\n.offcanvas.showing, .offcanvas.hiding, .offcanvas.show {\n visibility: visible;\n}\n\n.offcanvas-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1040;\n width: 100vw;\n height: 100vh;\n background-color: #000;\n}\n.offcanvas-backdrop.fade {\n opacity: 0;\n}\n.offcanvas-backdrop.show {\n opacity: 0.5;\n}\n\n.offcanvas-header {\n display: flex;\n align-items: center;\n padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);\n}\n.offcanvas-header .btn-close {\n padding: calc(var(--bs-offcanvas-padding-y) * 0.5) calc(var(--bs-offcanvas-padding-x) * 0.5);\n margin-top: calc(-0.5 * var(--bs-offcanvas-padding-y));\n margin-right: calc(-0.5 * var(--bs-offcanvas-padding-x));\n margin-bottom: calc(-0.5 * var(--bs-offcanvas-padding-y));\n margin-left: auto;\n}\n\n.offcanvas-title {\n margin-bottom: 0;\n line-height: var(--bs-offcanvas-title-line-height);\n}\n\n.offcanvas-body {\n flex-grow: 1;\n padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);\n overflow-y: auto;\n}\n\n.placeholder {\n display: inline-block;\n min-height: 1em;\n vertical-align: middle;\n cursor: wait;\n background-color: currentcolor;\n opacity: 0.5;\n}\n.placeholder.btn::before {\n display: inline-block;\n content: \"\";\n}\n\n.placeholder-xs {\n min-height: 0.6em;\n}\n\n.placeholder-sm {\n min-height: 0.8em;\n}\n\n.placeholder-lg {\n min-height: 1.2em;\n}\n\n.placeholder-glow .placeholder {\n animation: placeholder-glow 2s ease-in-out infinite;\n}\n\n@keyframes placeholder-glow {\n 50% {\n opacity: 0.2;\n }\n}\n.placeholder-wave {\n mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);\n mask-size: 200% 100%;\n animation: placeholder-wave 2s linear infinite;\n}\n\n@keyframes placeholder-wave {\n 100% {\n mask-position: -200% 0%;\n }\n}\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.text-bg-primary {\n color: #fff !important;\n background-color: RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-secondary {\n color: #fff !important;\n background-color: RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-success {\n color: #fff !important;\n background-color: RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-info {\n color: #000 !important;\n background-color: RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-warning {\n color: #000 !important;\n background-color: RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-danger {\n color: #fff !important;\n background-color: RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-light {\n color: #000 !important;\n background-color: RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-dark {\n color: #fff !important;\n background-color: RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.link-primary {\n color: RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-primary:hover, .link-primary:focus {\n color: RGBA(10, 88, 202, var(--bs-link-opacity, 1)) !important;\n text-decoration-color: RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-secondary {\n color: RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-secondary:hover, .link-secondary:focus {\n color: RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important;\n text-decoration-color: RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-success {\n color: RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-success:hover, .link-success:focus {\n color: RGBA(20, 108, 67, var(--bs-link-opacity, 1)) !important;\n text-decoration-color: RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-info {\n color: RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-info:hover, .link-info:focus {\n color: RGBA(61, 213, 243, var(--bs-link-opacity, 1)) !important;\n text-decoration-color: RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-warning {\n color: RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-warning:hover, .link-warning:focus {\n color: RGBA(255, 205, 57, var(--bs-link-opacity, 1)) !important;\n text-decoration-color: RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-danger {\n color: RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-danger:hover, .link-danger:focus {\n color: RGBA(176, 42, 55, var(--bs-link-opacity, 1)) !important;\n text-decoration-color: RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-light {\n color: RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-light:hover, .link-light:focus {\n color: RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important;\n text-decoration-color: RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-dark {\n color: RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-dark:hover, .link-dark:focus {\n color: RGBA(26, 30, 33, var(--bs-link-opacity, 1)) !important;\n text-decoration-color: RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-body-emphasis {\n color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-body-emphasis:hover, .link-body-emphasis:focus {\n color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;\n text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important;\n}\n\n.focus-ring:focus {\n outline: 0;\n box-shadow: var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color);\n}\n\n.icon-link {\n display: inline-flex;\n gap: 0.375rem;\n align-items: center;\n text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));\n text-underline-offset: 0.25em;\n backface-visibility: hidden;\n}\n.icon-link > .bi {\n flex-shrink: 0;\n width: 1em;\n height: 1em;\n fill: currentcolor;\n transition: 0.2s ease-in-out transform;\n}\n@media (prefers-reduced-motion: reduce) {\n .icon-link > .bi {\n transition: none;\n }\n}\n\n.icon-link-hover:hover > .bi, .icon-link-hover:focus-visible > .bi {\n transform: var(--bs-icon-link-transform, translate3d(0.25em, 0, 0));\n}\n\n.ratio {\n position: relative;\n width: 100%;\n}\n.ratio::before {\n display: block;\n padding-top: var(--bs-aspect-ratio);\n content: \"\";\n}\n.ratio > * {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n.ratio-1x1 {\n --bs-aspect-ratio: 100%;\n}\n\n.ratio-4x3 {\n --bs-aspect-ratio: 75%;\n}\n\n.ratio-16x9 {\n --bs-aspect-ratio: 56.25%;\n}\n\n.ratio-21x9 {\n --bs-aspect-ratio: 42.8571428571%;\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030;\n}\n\n.sticky-top {\n position: sticky;\n top: 0;\n z-index: 1020;\n}\n\n.sticky-bottom {\n position: sticky;\n bottom: 0;\n z-index: 1020;\n}\n\n@media (min-width: 576px) {\n .sticky-sm-top {\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n .sticky-sm-bottom {\n position: sticky;\n bottom: 0;\n z-index: 1020;\n }\n}\n@media (min-width: 768px) {\n .sticky-md-top {\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n .sticky-md-bottom {\n position: sticky;\n bottom: 0;\n z-index: 1020;\n }\n}\n@media (min-width: 992px) {\n .sticky-lg-top {\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n .sticky-lg-bottom {\n position: sticky;\n bottom: 0;\n z-index: 1020;\n }\n}\n@media (min-width: 1200px) {\n .sticky-xl-top {\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n .sticky-xl-bottom {\n position: sticky;\n bottom: 0;\n z-index: 1020;\n }\n}\n@media (min-width: 1400px) {\n .sticky-xxl-top {\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n .sticky-xxl-bottom {\n position: sticky;\n bottom: 0;\n z-index: 1020;\n }\n}\n.hstack {\n display: flex;\n flex-direction: row;\n align-items: center;\n align-self: stretch;\n}\n\n.vstack {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-self: stretch;\n}\n\n.visually-hidden,\n.visually-hidden-focusable:not(:focus):not(:focus-within) {\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n margin: -1px !important;\n overflow: hidden !important;\n clip: rect(0, 0, 0, 0) !important;\n white-space: nowrap !important;\n border: 0 !important;\n}\n.visually-hidden:not(caption),\n.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption) {\n position: absolute !important;\n}\n.visually-hidden *,\n.visually-hidden-focusable:not(:focus):not(:focus-within) * {\n overflow: hidden !important;\n}\n\n.stretched-link::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n content: \"\";\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.vr {\n display: inline-block;\n align-self: stretch;\n width: var(--bs-border-width);\n min-height: 1em;\n background-color: currentcolor;\n opacity: 0.25;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.float-start {\n float: left !important;\n}\n\n.float-end {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n.object-fit-contain {\n object-fit: contain !important;\n}\n\n.object-fit-cover {\n object-fit: cover !important;\n}\n\n.object-fit-fill {\n object-fit: fill !important;\n}\n\n.object-fit-scale {\n object-fit: scale-down !important;\n}\n\n.object-fit-none {\n object-fit: none !important;\n}\n\n.opacity-0 {\n opacity: 0 !important;\n}\n\n.opacity-25 {\n opacity: 0.25 !important;\n}\n\n.opacity-50 {\n opacity: 0.5 !important;\n}\n\n.opacity-75 {\n opacity: 0.75 !important;\n}\n\n.opacity-100 {\n opacity: 1 !important;\n}\n\n.overflow-auto {\n overflow: auto !important;\n}\n\n.overflow-hidden {\n overflow: hidden !important;\n}\n\n.overflow-visible {\n overflow: visible !important;\n}\n\n.overflow-scroll {\n overflow: scroll !important;\n}\n\n.overflow-x-auto {\n overflow-x: auto !important;\n}\n\n.overflow-x-hidden {\n overflow-x: hidden !important;\n}\n\n.overflow-x-visible {\n overflow-x: visible !important;\n}\n\n.overflow-x-scroll {\n overflow-x: scroll !important;\n}\n\n.overflow-y-auto {\n overflow-y: auto !important;\n}\n\n.overflow-y-hidden {\n overflow-y: hidden !important;\n}\n\n.overflow-y-visible {\n overflow-y: visible !important;\n}\n\n.overflow-y-scroll {\n overflow-y: scroll !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-grid {\n display: grid !important;\n}\n\n.d-inline-grid {\n display: inline-grid !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n.shadow {\n box-shadow: var(--bs-box-shadow) !important;\n}\n\n.shadow-sm {\n box-shadow: var(--bs-box-shadow-sm) !important;\n}\n\n.shadow-lg {\n box-shadow: var(--bs-box-shadow-lg) !important;\n}\n\n.shadow-none {\n box-shadow: none !important;\n}\n\n.focus-ring-primary {\n --bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-secondary {\n --bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-success {\n --bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-info {\n --bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-warning {\n --bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-danger {\n --bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-light {\n --bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-dark {\n --bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity));\n}\n\n.position-static {\n position: static !important;\n}\n\n.position-relative {\n position: relative !important;\n}\n\n.position-absolute {\n position: absolute !important;\n}\n\n.position-fixed {\n position: fixed !important;\n}\n\n.position-sticky {\n position: sticky !important;\n}\n\n.top-0 {\n top: 0 !important;\n}\n\n.top-50 {\n top: 50% !important;\n}\n\n.top-100 {\n top: 100% !important;\n}\n\n.bottom-0 {\n bottom: 0 !important;\n}\n\n.bottom-50 {\n bottom: 50% !important;\n}\n\n.bottom-100 {\n bottom: 100% !important;\n}\n\n.start-0 {\n left: 0 !important;\n}\n\n.start-50 {\n left: 50% !important;\n}\n\n.start-100 {\n left: 100% !important;\n}\n\n.end-0 {\n right: 0 !important;\n}\n\n.end-50 {\n right: 50% !important;\n}\n\n.end-100 {\n right: 100% !important;\n}\n\n.translate-middle {\n transform: translate(-50%, -50%) !important;\n}\n\n.translate-middle-x {\n transform: translateX(-50%) !important;\n}\n\n.translate-middle-y {\n transform: translateY(-50%) !important;\n}\n\n.border {\n border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top {\n border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-end {\n border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-end-0 {\n border-right: 0 !important;\n}\n\n.border-bottom {\n border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-start {\n border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-start-0 {\n border-left: 0 !important;\n}\n\n.border-primary {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-secondary {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-success {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-info {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-warning {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-danger {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-light {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-dark {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-black {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-white {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-primary-subtle {\n border-color: var(--bs-primary-border-subtle) !important;\n}\n\n.border-secondary-subtle {\n border-color: var(--bs-secondary-border-subtle) !important;\n}\n\n.border-success-subtle {\n border-color: var(--bs-success-border-subtle) !important;\n}\n\n.border-info-subtle {\n border-color: var(--bs-info-border-subtle) !important;\n}\n\n.border-warning-subtle {\n border-color: var(--bs-warning-border-subtle) !important;\n}\n\n.border-danger-subtle {\n border-color: var(--bs-danger-border-subtle) !important;\n}\n\n.border-light-subtle {\n border-color: var(--bs-light-border-subtle) !important;\n}\n\n.border-dark-subtle {\n border-color: var(--bs-dark-border-subtle) !important;\n}\n\n.border-1 {\n border-width: 1px !important;\n}\n\n.border-2 {\n border-width: 2px !important;\n}\n\n.border-3 {\n border-width: 3px !important;\n}\n\n.border-4 {\n border-width: 4px !important;\n}\n\n.border-5 {\n border-width: 5px !important;\n}\n\n.border-opacity-10 {\n --bs-border-opacity: 0.1;\n}\n\n.border-opacity-25 {\n --bs-border-opacity: 0.25;\n}\n\n.border-opacity-50 {\n --bs-border-opacity: 0.5;\n}\n\n.border-opacity-75 {\n --bs-border-opacity: 0.75;\n}\n\n.border-opacity-100 {\n --bs-border-opacity: 1;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.w-auto {\n width: auto !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.vw-100 {\n width: 100vw !important;\n}\n\n.min-vw-100 {\n min-width: 100vw !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.h-auto {\n height: auto !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.vh-100 {\n height: 100vh !important;\n}\n\n.min-vh-100 {\n min-height: 100vh !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n justify-content: space-evenly !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n.order-first {\n order: -1 !important;\n}\n\n.order-0 {\n order: 0 !important;\n}\n\n.order-1 {\n order: 1 !important;\n}\n\n.order-2 {\n order: 2 !important;\n}\n\n.order-3 {\n order: 3 !important;\n}\n\n.order-4 {\n order: 4 !important;\n}\n\n.order-5 {\n order: 5 !important;\n}\n\n.order-last {\n order: 6 !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mx-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n}\n\n.mx-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n}\n\n.mx-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n}\n\n.mx-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n}\n\n.mx-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n}\n\n.mx-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n}\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n.my-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n}\n\n.my-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n}\n\n.my-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mt-1 {\n margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n margin-top: 1rem !important;\n}\n\n.mt-4 {\n margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n margin-top: 3rem !important;\n}\n\n.mt-auto {\n margin-top: auto !important;\n}\n\n.me-0 {\n margin-right: 0 !important;\n}\n\n.me-1 {\n margin-right: 0.25rem !important;\n}\n\n.me-2 {\n margin-right: 0.5rem !important;\n}\n\n.me-3 {\n margin-right: 1rem !important;\n}\n\n.me-4 {\n margin-right: 1.5rem !important;\n}\n\n.me-5 {\n margin-right: 3rem !important;\n}\n\n.me-auto {\n margin-right: auto !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.mb-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n margin-bottom: auto !important;\n}\n\n.ms-0 {\n margin-left: 0 !important;\n}\n\n.ms-1 {\n margin-left: 0.25rem !important;\n}\n\n.ms-2 {\n margin-left: 0.5rem !important;\n}\n\n.ms-3 {\n margin-left: 1rem !important;\n}\n\n.ms-4 {\n margin-left: 1.5rem !important;\n}\n\n.ms-5 {\n margin-left: 3rem !important;\n}\n\n.ms-auto {\n margin-left: auto !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.px-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n}\n\n.px-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n}\n\n.px-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n}\n\n.px-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n}\n\n.px-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n}\n\n.px-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n.py-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n}\n\n.py-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pt-1 {\n padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n padding-top: 1rem !important;\n}\n\n.pt-4 {\n padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n padding-top: 3rem !important;\n}\n\n.pe-0 {\n padding-right: 0 !important;\n}\n\n.pe-1 {\n padding-right: 0.25rem !important;\n}\n\n.pe-2 {\n padding-right: 0.5rem !important;\n}\n\n.pe-3 {\n padding-right: 1rem !important;\n}\n\n.pe-4 {\n padding-right: 1.5rem !important;\n}\n\n.pe-5 {\n padding-right: 3rem !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pb-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n padding-left: 0 !important;\n}\n\n.ps-1 {\n padding-left: 0.25rem !important;\n}\n\n.ps-2 {\n padding-left: 0.5rem !important;\n}\n\n.ps-3 {\n padding-left: 1rem !important;\n}\n\n.ps-4 {\n padding-left: 1.5rem !important;\n}\n\n.ps-5 {\n padding-left: 3rem !important;\n}\n\n.gap-0 {\n gap: 0 !important;\n}\n\n.gap-1 {\n gap: 0.25rem !important;\n}\n\n.gap-2 {\n gap: 0.5rem !important;\n}\n\n.gap-3 {\n gap: 1rem !important;\n}\n\n.gap-4 {\n gap: 1.5rem !important;\n}\n\n.gap-5 {\n gap: 3rem !important;\n}\n\n.row-gap-0 {\n row-gap: 0 !important;\n}\n\n.row-gap-1 {\n row-gap: 0.25rem !important;\n}\n\n.row-gap-2 {\n row-gap: 0.5rem !important;\n}\n\n.row-gap-3 {\n row-gap: 1rem !important;\n}\n\n.row-gap-4 {\n row-gap: 1.5rem !important;\n}\n\n.row-gap-5 {\n row-gap: 3rem !important;\n}\n\n.column-gap-0 {\n column-gap: 0 !important;\n}\n\n.column-gap-1 {\n column-gap: 0.25rem !important;\n}\n\n.column-gap-2 {\n column-gap: 0.5rem !important;\n}\n\n.column-gap-3 {\n column-gap: 1rem !important;\n}\n\n.column-gap-4 {\n column-gap: 1.5rem !important;\n}\n\n.column-gap-5 {\n column-gap: 3rem !important;\n}\n\n.font-monospace {\n font-family: var(--bs-font-monospace) !important;\n}\n\n.fs-1 {\n font-size: calc(1.375rem + 1.5vw) !important;\n}\n\n.fs-2 {\n font-size: calc(1.325rem + 0.9vw) !important;\n}\n\n.fs-3 {\n font-size: calc(1.3rem + 0.6vw) !important;\n}\n\n.fs-4 {\n font-size: calc(1.275rem + 0.3vw) !important;\n}\n\n.fs-5 {\n font-size: 1.25rem !important;\n}\n\n.fs-6 {\n font-size: 1rem !important;\n}\n\n.fst-italic {\n font-style: italic !important;\n}\n\n.fst-normal {\n font-style: normal !important;\n}\n\n.fw-lighter {\n font-weight: lighter !important;\n}\n\n.fw-light {\n font-weight: 300 !important;\n}\n\n.fw-normal {\n font-weight: 400 !important;\n}\n\n.fw-medium {\n font-weight: 500 !important;\n}\n\n.fw-semibold {\n font-weight: 600 !important;\n}\n\n.fw-bold {\n font-weight: 700 !important;\n}\n\n.fw-bolder {\n font-weight: bolder !important;\n}\n\n.lh-1 {\n line-height: 1 !important;\n}\n\n.lh-sm {\n line-height: 1.25 !important;\n}\n\n.lh-base {\n line-height: 1.5 !important;\n}\n\n.lh-lg {\n line-height: 2 !important;\n}\n\n.text-start {\n text-align: left !important;\n}\n\n.text-end {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n.text-decoration-none {\n text-decoration: none !important;\n}\n\n.text-decoration-underline {\n text-decoration: underline !important;\n}\n\n.text-decoration-line-through {\n text-decoration: line-through !important;\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.text-wrap {\n white-space: normal !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n/* rtl:begin:remove */\n.text-break {\n word-wrap: break-word !important;\n word-break: break-word !important;\n}\n\n/* rtl:end:remove */\n.text-primary {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-secondary {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-success {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-info {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-warning {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-danger {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-light {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-dark {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-black {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-white {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-body {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-muted {\n --bs-text-opacity: 1;\n color: var(--bs-secondary-color) !important;\n}\n\n.text-black-50 {\n --bs-text-opacity: 1;\n color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n --bs-text-opacity: 1;\n color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-body-secondary {\n --bs-text-opacity: 1;\n color: var(--bs-secondary-color) !important;\n}\n\n.text-body-tertiary {\n --bs-text-opacity: 1;\n color: var(--bs-tertiary-color) !important;\n}\n\n.text-body-emphasis {\n --bs-text-opacity: 1;\n color: var(--bs-emphasis-color) !important;\n}\n\n.text-reset {\n --bs-text-opacity: 1;\n color: inherit !important;\n}\n\n.text-opacity-25 {\n --bs-text-opacity: 0.25;\n}\n\n.text-opacity-50 {\n --bs-text-opacity: 0.5;\n}\n\n.text-opacity-75 {\n --bs-text-opacity: 0.75;\n}\n\n.text-opacity-100 {\n --bs-text-opacity: 1;\n}\n\n.text-primary-emphasis {\n color: var(--bs-primary-text-emphasis) !important;\n}\n\n.text-secondary-emphasis {\n color: var(--bs-secondary-text-emphasis) !important;\n}\n\n.text-success-emphasis {\n color: var(--bs-success-text-emphasis) !important;\n}\n\n.text-info-emphasis {\n color: var(--bs-info-text-emphasis) !important;\n}\n\n.text-warning-emphasis {\n color: var(--bs-warning-text-emphasis) !important;\n}\n\n.text-danger-emphasis {\n color: var(--bs-danger-text-emphasis) !important;\n}\n\n.text-light-emphasis {\n color: var(--bs-light-text-emphasis) !important;\n}\n\n.text-dark-emphasis {\n color: var(--bs-dark-text-emphasis) !important;\n}\n\n.link-opacity-10 {\n --bs-link-opacity: 0.1;\n}\n\n.link-opacity-10-hover:hover {\n --bs-link-opacity: 0.1;\n}\n\n.link-opacity-25 {\n --bs-link-opacity: 0.25;\n}\n\n.link-opacity-25-hover:hover {\n --bs-link-opacity: 0.25;\n}\n\n.link-opacity-50 {\n --bs-link-opacity: 0.5;\n}\n\n.link-opacity-50-hover:hover {\n --bs-link-opacity: 0.5;\n}\n\n.link-opacity-75 {\n --bs-link-opacity: 0.75;\n}\n\n.link-opacity-75-hover:hover {\n --bs-link-opacity: 0.75;\n}\n\n.link-opacity-100 {\n --bs-link-opacity: 1;\n}\n\n.link-opacity-100-hover:hover {\n --bs-link-opacity: 1;\n}\n\n.link-offset-1 {\n text-underline-offset: 0.125em !important;\n}\n\n.link-offset-1-hover:hover {\n text-underline-offset: 0.125em !important;\n}\n\n.link-offset-2 {\n text-underline-offset: 0.25em !important;\n}\n\n.link-offset-2-hover:hover {\n text-underline-offset: 0.25em !important;\n}\n\n.link-offset-3 {\n text-underline-offset: 0.375em !important;\n}\n\n.link-offset-3-hover:hover {\n text-underline-offset: 0.375em !important;\n}\n\n.link-underline-primary {\n --bs-link-underline-opacity: 1;\n text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-secondary {\n --bs-link-underline-opacity: 1;\n text-decoration-color: rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-success {\n --bs-link-underline-opacity: 1;\n text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-info {\n --bs-link-underline-opacity: 1;\n text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-warning {\n --bs-link-underline-opacity: 1;\n text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-danger {\n --bs-link-underline-opacity: 1;\n text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-light {\n --bs-link-underline-opacity: 1;\n text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-dark {\n --bs-link-underline-opacity: 1;\n text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline {\n --bs-link-underline-opacity: 1;\n text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-underline-opacity-0 {\n --bs-link-underline-opacity: 0;\n}\n\n.link-underline-opacity-0-hover:hover {\n --bs-link-underline-opacity: 0;\n}\n\n.link-underline-opacity-10 {\n --bs-link-underline-opacity: 0.1;\n}\n\n.link-underline-opacity-10-hover:hover {\n --bs-link-underline-opacity: 0.1;\n}\n\n.link-underline-opacity-25 {\n --bs-link-underline-opacity: 0.25;\n}\n\n.link-underline-opacity-25-hover:hover {\n --bs-link-underline-opacity: 0.25;\n}\n\n.link-underline-opacity-50 {\n --bs-link-underline-opacity: 0.5;\n}\n\n.link-underline-opacity-50-hover:hover {\n --bs-link-underline-opacity: 0.5;\n}\n\n.link-underline-opacity-75 {\n --bs-link-underline-opacity: 0.75;\n}\n\n.link-underline-opacity-75-hover:hover {\n --bs-link-underline-opacity: 0.75;\n}\n\n.link-underline-opacity-100 {\n --bs-link-underline-opacity: 1;\n}\n\n.link-underline-opacity-100-hover:hover {\n --bs-link-underline-opacity: 1;\n}\n\n.bg-primary {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-secondary {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-success {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-info {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-warning {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-danger {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-light {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-dark {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-black {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-white {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-body {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-transparent {\n --bs-bg-opacity: 1;\n background-color: transparent !important;\n}\n\n.bg-body-secondary {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-body-tertiary {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-opacity-10 {\n --bs-bg-opacity: 0.1;\n}\n\n.bg-opacity-25 {\n --bs-bg-opacity: 0.25;\n}\n\n.bg-opacity-50 {\n --bs-bg-opacity: 0.5;\n}\n\n.bg-opacity-75 {\n --bs-bg-opacity: 0.75;\n}\n\n.bg-opacity-100 {\n --bs-bg-opacity: 1;\n}\n\n.bg-primary-subtle {\n background-color: var(--bs-primary-bg-subtle) !important;\n}\n\n.bg-secondary-subtle {\n background-color: var(--bs-secondary-bg-subtle) !important;\n}\n\n.bg-success-subtle {\n background-color: var(--bs-success-bg-subtle) !important;\n}\n\n.bg-info-subtle {\n background-color: var(--bs-info-bg-subtle) !important;\n}\n\n.bg-warning-subtle {\n background-color: var(--bs-warning-bg-subtle) !important;\n}\n\n.bg-danger-subtle {\n background-color: var(--bs-danger-bg-subtle) !important;\n}\n\n.bg-light-subtle {\n background-color: var(--bs-light-bg-subtle) !important;\n}\n\n.bg-dark-subtle {\n background-color: var(--bs-dark-bg-subtle) !important;\n}\n\n.bg-gradient {\n background-image: var(--bs-gradient) !important;\n}\n\n.user-select-all {\n user-select: all !important;\n}\n\n.user-select-auto {\n user-select: auto !important;\n}\n\n.user-select-none {\n user-select: none !important;\n}\n\n.pe-none {\n pointer-events: none !important;\n}\n\n.pe-auto {\n pointer-events: auto !important;\n}\n\n.rounded {\n border-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n\n.rounded-1 {\n border-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-2 {\n border-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-3 {\n border-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-4 {\n border-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-5 {\n border-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-top {\n border-top-left-radius: var(--bs-border-radius) !important;\n border-top-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-top-0 {\n border-top-left-radius: 0 !important;\n border-top-right-radius: 0 !important;\n}\n\n.rounded-top-1 {\n border-top-left-radius: var(--bs-border-radius-sm) !important;\n border-top-right-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-top-2 {\n border-top-left-radius: var(--bs-border-radius) !important;\n border-top-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-top-3 {\n border-top-left-radius: var(--bs-border-radius-lg) !important;\n border-top-right-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-top-4 {\n border-top-left-radius: var(--bs-border-radius-xl) !important;\n border-top-right-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-top-5 {\n border-top-left-radius: var(--bs-border-radius-xxl) !important;\n border-top-right-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-top-circle {\n border-top-left-radius: 50% !important;\n border-top-right-radius: 50% !important;\n}\n\n.rounded-top-pill {\n border-top-left-radius: var(--bs-border-radius-pill) !important;\n border-top-right-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-end {\n border-top-right-radius: var(--bs-border-radius) !important;\n border-bottom-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-end-0 {\n border-top-right-radius: 0 !important;\n border-bottom-right-radius: 0 !important;\n}\n\n.rounded-end-1 {\n border-top-right-radius: var(--bs-border-radius-sm) !important;\n border-bottom-right-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-end-2 {\n border-top-right-radius: var(--bs-border-radius) !important;\n border-bottom-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-end-3 {\n border-top-right-radius: var(--bs-border-radius-lg) !important;\n border-bottom-right-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-end-4 {\n border-top-right-radius: var(--bs-border-radius-xl) !important;\n border-bottom-right-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-end-5 {\n border-top-right-radius: var(--bs-border-radius-xxl) !important;\n border-bottom-right-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-end-circle {\n border-top-right-radius: 50% !important;\n border-bottom-right-radius: 50% !important;\n}\n\n.rounded-end-pill {\n border-top-right-radius: var(--bs-border-radius-pill) !important;\n border-bottom-right-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: var(--bs-border-radius) !important;\n border-bottom-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-bottom-0 {\n border-bottom-right-radius: 0 !important;\n border-bottom-left-radius: 0 !important;\n}\n\n.rounded-bottom-1 {\n border-bottom-right-radius: var(--bs-border-radius-sm) !important;\n border-bottom-left-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-bottom-2 {\n border-bottom-right-radius: var(--bs-border-radius) !important;\n border-bottom-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-bottom-3 {\n border-bottom-right-radius: var(--bs-border-radius-lg) !important;\n border-bottom-left-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-bottom-4 {\n border-bottom-right-radius: var(--bs-border-radius-xl) !important;\n border-bottom-left-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-bottom-5 {\n border-bottom-right-radius: var(--bs-border-radius-xxl) !important;\n border-bottom-left-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-bottom-circle {\n border-bottom-right-radius: 50% !important;\n border-bottom-left-radius: 50% !important;\n}\n\n.rounded-bottom-pill {\n border-bottom-right-radius: var(--bs-border-radius-pill) !important;\n border-bottom-left-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-start {\n border-bottom-left-radius: var(--bs-border-radius) !important;\n border-top-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-start-0 {\n border-bottom-left-radius: 0 !important;\n border-top-left-radius: 0 !important;\n}\n\n.rounded-start-1 {\n border-bottom-left-radius: var(--bs-border-radius-sm) !important;\n border-top-left-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-start-2 {\n border-bottom-left-radius: var(--bs-border-radius) !important;\n border-top-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-start-3 {\n border-bottom-left-radius: var(--bs-border-radius-lg) !important;\n border-top-left-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-start-4 {\n border-bottom-left-radius: var(--bs-border-radius-xl) !important;\n border-top-left-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-start-5 {\n border-bottom-left-radius: var(--bs-border-radius-xxl) !important;\n border-top-left-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-start-circle {\n border-bottom-left-radius: 50% !important;\n border-top-left-radius: 50% !important;\n}\n\n.rounded-start-pill {\n border-bottom-left-radius: var(--bs-border-radius-pill) !important;\n border-top-left-radius: var(--bs-border-radius-pill) !important;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n.z-n1 {\n z-index: -1 !important;\n}\n\n.z-0 {\n z-index: 0 !important;\n}\n\n.z-1 {\n z-index: 1 !important;\n}\n\n.z-2 {\n z-index: 2 !important;\n}\n\n.z-3 {\n z-index: 3 !important;\n}\n\n@media (min-width: 576px) {\n .float-sm-start {\n float: left !important;\n }\n .float-sm-end {\n float: right !important;\n }\n .float-sm-none {\n float: none !important;\n }\n .object-fit-sm-contain {\n object-fit: contain !important;\n }\n .object-fit-sm-cover {\n object-fit: cover !important;\n }\n .object-fit-sm-fill {\n object-fit: fill !important;\n }\n .object-fit-sm-scale {\n object-fit: scale-down !important;\n }\n .object-fit-sm-none {\n object-fit: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-grid {\n display: grid !important;\n }\n .d-sm-inline-grid {\n display: inline-grid !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n .d-sm-none {\n display: none !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .justify-content-sm-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n .order-sm-first {\n order: -1 !important;\n }\n .order-sm-0 {\n order: 0 !important;\n }\n .order-sm-1 {\n order: 1 !important;\n }\n .order-sm-2 {\n order: 2 !important;\n }\n .order-sm-3 {\n order: 3 !important;\n }\n .order-sm-4 {\n order: 4 !important;\n }\n .order-sm-5 {\n order: 5 !important;\n }\n .order-sm-last {\n order: 6 !important;\n }\n .m-sm-0 {\n margin: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mx-sm-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-sm-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-sm-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-sm-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-sm-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-sm-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-sm-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-sm-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-sm-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-sm-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-sm-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-sm-0 {\n margin-top: 0 !important;\n }\n .mt-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mt-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mt-sm-3 {\n margin-top: 1rem !important;\n }\n .mt-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mt-sm-5 {\n margin-top: 3rem !important;\n }\n .mt-sm-auto {\n margin-top: auto !important;\n }\n .me-sm-0 {\n margin-right: 0 !important;\n }\n .me-sm-1 {\n margin-right: 0.25rem !important;\n }\n .me-sm-2 {\n margin-right: 0.5rem !important;\n }\n .me-sm-3 {\n margin-right: 1rem !important;\n }\n .me-sm-4 {\n margin-right: 1.5rem !important;\n }\n .me-sm-5 {\n margin-right: 3rem !important;\n }\n .me-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-0 {\n margin-bottom: 0 !important;\n }\n .mb-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-sm-3 {\n margin-bottom: 1rem !important;\n }\n .mb-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-sm-5 {\n margin-bottom: 3rem !important;\n }\n .mb-sm-auto {\n margin-bottom: auto !important;\n }\n .ms-sm-0 {\n margin-left: 0 !important;\n }\n .ms-sm-1 {\n margin-left: 0.25rem !important;\n }\n .ms-sm-2 {\n margin-left: 0.5rem !important;\n }\n .ms-sm-3 {\n margin-left: 1rem !important;\n }\n .ms-sm-4 {\n margin-left: 1.5rem !important;\n }\n .ms-sm-5 {\n margin-left: 3rem !important;\n }\n .ms-sm-auto {\n margin-left: auto !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .px-sm-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-sm-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-sm-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-sm-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-sm-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-sm-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-sm-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-sm-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-sm-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-sm-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-sm-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-sm-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-sm-0 {\n padding-top: 0 !important;\n }\n .pt-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pt-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pt-sm-3 {\n padding-top: 1rem !important;\n }\n .pt-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pt-sm-5 {\n padding-top: 3rem !important;\n }\n .pe-sm-0 {\n padding-right: 0 !important;\n }\n .pe-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pe-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pe-sm-3 {\n padding-right: 1rem !important;\n }\n .pe-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pe-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-0 {\n padding-bottom: 0 !important;\n }\n .pb-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pb-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-sm-5 {\n padding-bottom: 3rem !important;\n }\n .ps-sm-0 {\n padding-left: 0 !important;\n }\n .ps-sm-1 {\n padding-left: 0.25rem !important;\n }\n .ps-sm-2 {\n padding-left: 0.5rem !important;\n }\n .ps-sm-3 {\n padding-left: 1rem !important;\n }\n .ps-sm-4 {\n padding-left: 1.5rem !important;\n }\n .ps-sm-5 {\n padding-left: 3rem !important;\n }\n .gap-sm-0 {\n gap: 0 !important;\n }\n .gap-sm-1 {\n gap: 0.25rem !important;\n }\n .gap-sm-2 {\n gap: 0.5rem !important;\n }\n .gap-sm-3 {\n gap: 1rem !important;\n }\n .gap-sm-4 {\n gap: 1.5rem !important;\n }\n .gap-sm-5 {\n gap: 3rem !important;\n }\n .row-gap-sm-0 {\n row-gap: 0 !important;\n }\n .row-gap-sm-1 {\n row-gap: 0.25rem !important;\n }\n .row-gap-sm-2 {\n row-gap: 0.5rem !important;\n }\n .row-gap-sm-3 {\n row-gap: 1rem !important;\n }\n .row-gap-sm-4 {\n row-gap: 1.5rem !important;\n }\n .row-gap-sm-5 {\n row-gap: 3rem !important;\n }\n .column-gap-sm-0 {\n column-gap: 0 !important;\n }\n .column-gap-sm-1 {\n column-gap: 0.25rem !important;\n }\n .column-gap-sm-2 {\n column-gap: 0.5rem !important;\n }\n .column-gap-sm-3 {\n column-gap: 1rem !important;\n }\n .column-gap-sm-4 {\n column-gap: 1.5rem !important;\n }\n .column-gap-sm-5 {\n column-gap: 3rem !important;\n }\n .text-sm-start {\n text-align: left !important;\n }\n .text-sm-end {\n text-align: right !important;\n }\n .text-sm-center {\n text-align: center !important;\n }\n}\n@media (min-width: 768px) {\n .float-md-start {\n float: left !important;\n }\n .float-md-end {\n float: right !important;\n }\n .float-md-none {\n float: none !important;\n }\n .object-fit-md-contain {\n object-fit: contain !important;\n }\n .object-fit-md-cover {\n object-fit: cover !important;\n }\n .object-fit-md-fill {\n object-fit: fill !important;\n }\n .object-fit-md-scale {\n object-fit: scale-down !important;\n }\n .object-fit-md-none {\n object-fit: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-grid {\n display: grid !important;\n }\n .d-md-inline-grid {\n display: inline-grid !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n .d-md-none {\n display: none !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .justify-content-md-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n .order-md-first {\n order: -1 !important;\n }\n .order-md-0 {\n order: 0 !important;\n }\n .order-md-1 {\n order: 1 !important;\n }\n .order-md-2 {\n order: 2 !important;\n }\n .order-md-3 {\n order: 3 !important;\n }\n .order-md-4 {\n order: 4 !important;\n }\n .order-md-5 {\n order: 5 !important;\n }\n .order-md-last {\n order: 6 !important;\n }\n .m-md-0 {\n margin: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mx-md-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-md-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-md-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-md-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-md-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-md-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-md-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-md-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-md-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-md-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-md-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-md-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-md-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-md-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-md-0 {\n margin-top: 0 !important;\n }\n .mt-md-1 {\n margin-top: 0.25rem !important;\n }\n .mt-md-2 {\n margin-top: 0.5rem !important;\n }\n .mt-md-3 {\n margin-top: 1rem !important;\n }\n .mt-md-4 {\n margin-top: 1.5rem !important;\n }\n .mt-md-5 {\n margin-top: 3rem !important;\n }\n .mt-md-auto {\n margin-top: auto !important;\n }\n .me-md-0 {\n margin-right: 0 !important;\n }\n .me-md-1 {\n margin-right: 0.25rem !important;\n }\n .me-md-2 {\n margin-right: 0.5rem !important;\n }\n .me-md-3 {\n margin-right: 1rem !important;\n }\n .me-md-4 {\n margin-right: 1.5rem !important;\n }\n .me-md-5 {\n margin-right: 3rem !important;\n }\n .me-md-auto {\n margin-right: auto !important;\n }\n .mb-md-0 {\n margin-bottom: 0 !important;\n }\n .mb-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-md-3 {\n margin-bottom: 1rem !important;\n }\n .mb-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-md-5 {\n margin-bottom: 3rem !important;\n }\n .mb-md-auto {\n margin-bottom: auto !important;\n }\n .ms-md-0 {\n margin-left: 0 !important;\n }\n .ms-md-1 {\n margin-left: 0.25rem !important;\n }\n .ms-md-2 {\n margin-left: 0.5rem !important;\n }\n .ms-md-3 {\n margin-left: 1rem !important;\n }\n .ms-md-4 {\n margin-left: 1.5rem !important;\n }\n .ms-md-5 {\n margin-left: 3rem !important;\n }\n .ms-md-auto {\n margin-left: auto !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .px-md-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-md-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-md-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-md-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-md-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-md-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-md-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-md-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-md-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-md-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-md-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-md-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-md-0 {\n padding-top: 0 !important;\n }\n .pt-md-1 {\n padding-top: 0.25rem !important;\n }\n .pt-md-2 {\n padding-top: 0.5rem !important;\n }\n .pt-md-3 {\n padding-top: 1rem !important;\n }\n .pt-md-4 {\n padding-top: 1.5rem !important;\n }\n .pt-md-5 {\n padding-top: 3rem !important;\n }\n .pe-md-0 {\n padding-right: 0 !important;\n }\n .pe-md-1 {\n padding-right: 0.25rem !important;\n }\n .pe-md-2 {\n padding-right: 0.5rem !important;\n }\n .pe-md-3 {\n padding-right: 1rem !important;\n }\n .pe-md-4 {\n padding-right: 1.5rem !important;\n }\n .pe-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-0 {\n padding-bottom: 0 !important;\n }\n .pb-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-md-3 {\n padding-bottom: 1rem !important;\n }\n .pb-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-md-5 {\n padding-bottom: 3rem !important;\n }\n .ps-md-0 {\n padding-left: 0 !important;\n }\n .ps-md-1 {\n padding-left: 0.25rem !important;\n }\n .ps-md-2 {\n padding-left: 0.5rem !important;\n }\n .ps-md-3 {\n padding-left: 1rem !important;\n }\n .ps-md-4 {\n padding-left: 1.5rem !important;\n }\n .ps-md-5 {\n padding-left: 3rem !important;\n }\n .gap-md-0 {\n gap: 0 !important;\n }\n .gap-md-1 {\n gap: 0.25rem !important;\n }\n .gap-md-2 {\n gap: 0.5rem !important;\n }\n .gap-md-3 {\n gap: 1rem !important;\n }\n .gap-md-4 {\n gap: 1.5rem !important;\n }\n .gap-md-5 {\n gap: 3rem !important;\n }\n .row-gap-md-0 {\n row-gap: 0 !important;\n }\n .row-gap-md-1 {\n row-gap: 0.25rem !important;\n }\n .row-gap-md-2 {\n row-gap: 0.5rem !important;\n }\n .row-gap-md-3 {\n row-gap: 1rem !important;\n }\n .row-gap-md-4 {\n row-gap: 1.5rem !important;\n }\n .row-gap-md-5 {\n row-gap: 3rem !important;\n }\n .column-gap-md-0 {\n column-gap: 0 !important;\n }\n .column-gap-md-1 {\n column-gap: 0.25rem !important;\n }\n .column-gap-md-2 {\n column-gap: 0.5rem !important;\n }\n .column-gap-md-3 {\n column-gap: 1rem !important;\n }\n .column-gap-md-4 {\n column-gap: 1.5rem !important;\n }\n .column-gap-md-5 {\n column-gap: 3rem !important;\n }\n .text-md-start {\n text-align: left !important;\n }\n .text-md-end {\n text-align: right !important;\n }\n .text-md-center {\n text-align: center !important;\n }\n}\n@media (min-width: 992px) {\n .float-lg-start {\n float: left !important;\n }\n .float-lg-end {\n float: right !important;\n }\n .float-lg-none {\n float: none !important;\n }\n .object-fit-lg-contain {\n object-fit: contain !important;\n }\n .object-fit-lg-cover {\n object-fit: cover !important;\n }\n .object-fit-lg-fill {\n object-fit: fill !important;\n }\n .object-fit-lg-scale {\n object-fit: scale-down !important;\n }\n .object-fit-lg-none {\n object-fit: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-grid {\n display: grid !important;\n }\n .d-lg-inline-grid {\n display: inline-grid !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n .d-lg-none {\n display: none !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .justify-content-lg-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n .order-lg-first {\n order: -1 !important;\n }\n .order-lg-0 {\n order: 0 !important;\n }\n .order-lg-1 {\n order: 1 !important;\n }\n .order-lg-2 {\n order: 2 !important;\n }\n .order-lg-3 {\n order: 3 !important;\n }\n .order-lg-4 {\n order: 4 !important;\n }\n .order-lg-5 {\n order: 5 !important;\n }\n .order-lg-last {\n order: 6 !important;\n }\n .m-lg-0 {\n margin: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mx-lg-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-lg-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-lg-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-lg-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-lg-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-lg-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-lg-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-lg-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-lg-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-lg-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-lg-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-lg-0 {\n margin-top: 0 !important;\n }\n .mt-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mt-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mt-lg-3 {\n margin-top: 1rem !important;\n }\n .mt-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mt-lg-5 {\n margin-top: 3rem !important;\n }\n .mt-lg-auto {\n margin-top: auto !important;\n }\n .me-lg-0 {\n margin-right: 0 !important;\n }\n .me-lg-1 {\n margin-right: 0.25rem !important;\n }\n .me-lg-2 {\n margin-right: 0.5rem !important;\n }\n .me-lg-3 {\n margin-right: 1rem !important;\n }\n .me-lg-4 {\n margin-right: 1.5rem !important;\n }\n .me-lg-5 {\n margin-right: 3rem !important;\n }\n .me-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-0 {\n margin-bottom: 0 !important;\n }\n .mb-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-lg-3 {\n margin-bottom: 1rem !important;\n }\n .mb-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-lg-5 {\n margin-bottom: 3rem !important;\n }\n .mb-lg-auto {\n margin-bottom: auto !important;\n }\n .ms-lg-0 {\n margin-left: 0 !important;\n }\n .ms-lg-1 {\n margin-left: 0.25rem !important;\n }\n .ms-lg-2 {\n margin-left: 0.5rem !important;\n }\n .ms-lg-3 {\n margin-left: 1rem !important;\n }\n .ms-lg-4 {\n margin-left: 1.5rem !important;\n }\n .ms-lg-5 {\n margin-left: 3rem !important;\n }\n .ms-lg-auto {\n margin-left: auto !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .px-lg-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-lg-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-lg-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-lg-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-lg-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-lg-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-lg-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-lg-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-lg-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-lg-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-lg-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-lg-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-lg-0 {\n padding-top: 0 !important;\n }\n .pt-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pt-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pt-lg-3 {\n padding-top: 1rem !important;\n }\n .pt-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pt-lg-5 {\n padding-top: 3rem !important;\n }\n .pe-lg-0 {\n padding-right: 0 !important;\n }\n .pe-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pe-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pe-lg-3 {\n padding-right: 1rem !important;\n }\n .pe-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pe-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-0 {\n padding-bottom: 0 !important;\n }\n .pb-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pb-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-lg-5 {\n padding-bottom: 3rem !important;\n }\n .ps-lg-0 {\n padding-left: 0 !important;\n }\n .ps-lg-1 {\n padding-left: 0.25rem !important;\n }\n .ps-lg-2 {\n padding-left: 0.5rem !important;\n }\n .ps-lg-3 {\n padding-left: 1rem !important;\n }\n .ps-lg-4 {\n padding-left: 1.5rem !important;\n }\n .ps-lg-5 {\n padding-left: 3rem !important;\n }\n .gap-lg-0 {\n gap: 0 !important;\n }\n .gap-lg-1 {\n gap: 0.25rem !important;\n }\n .gap-lg-2 {\n gap: 0.5rem !important;\n }\n .gap-lg-3 {\n gap: 1rem !important;\n }\n .gap-lg-4 {\n gap: 1.5rem !important;\n }\n .gap-lg-5 {\n gap: 3rem !important;\n }\n .row-gap-lg-0 {\n row-gap: 0 !important;\n }\n .row-gap-lg-1 {\n row-gap: 0.25rem !important;\n }\n .row-gap-lg-2 {\n row-gap: 0.5rem !important;\n }\n .row-gap-lg-3 {\n row-gap: 1rem !important;\n }\n .row-gap-lg-4 {\n row-gap: 1.5rem !important;\n }\n .row-gap-lg-5 {\n row-gap: 3rem !important;\n }\n .column-gap-lg-0 {\n column-gap: 0 !important;\n }\n .column-gap-lg-1 {\n column-gap: 0.25rem !important;\n }\n .column-gap-lg-2 {\n column-gap: 0.5rem !important;\n }\n .column-gap-lg-3 {\n column-gap: 1rem !important;\n }\n .column-gap-lg-4 {\n column-gap: 1.5rem !important;\n }\n .column-gap-lg-5 {\n column-gap: 3rem !important;\n }\n .text-lg-start {\n text-align: left !important;\n }\n .text-lg-end {\n text-align: right !important;\n }\n .text-lg-center {\n text-align: center !important;\n }\n}\n@media (min-width: 1200px) {\n .float-xl-start {\n float: left !important;\n }\n .float-xl-end {\n float: right !important;\n }\n .float-xl-none {\n float: none !important;\n }\n .object-fit-xl-contain {\n object-fit: contain !important;\n }\n .object-fit-xl-cover {\n object-fit: cover !important;\n }\n .object-fit-xl-fill {\n object-fit: fill !important;\n }\n .object-fit-xl-scale {\n object-fit: scale-down !important;\n }\n .object-fit-xl-none {\n object-fit: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-grid {\n display: grid !important;\n }\n .d-xl-inline-grid {\n display: inline-grid !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n .d-xl-none {\n display: none !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .justify-content-xl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n .order-xl-first {\n order: -1 !important;\n }\n .order-xl-0 {\n order: 0 !important;\n }\n .order-xl-1 {\n order: 1 !important;\n }\n .order-xl-2 {\n order: 2 !important;\n }\n .order-xl-3 {\n order: 3 !important;\n }\n .order-xl-4 {\n order: 4 !important;\n }\n .order-xl-5 {\n order: 5 !important;\n }\n .order-xl-last {\n order: 6 !important;\n }\n .m-xl-0 {\n margin: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mx-xl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-xl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-xl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-xl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xl-0 {\n margin-top: 0 !important;\n }\n .mt-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xl-3 {\n margin-top: 1rem !important;\n }\n .mt-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xl-5 {\n margin-top: 3rem !important;\n }\n .mt-xl-auto {\n margin-top: auto !important;\n }\n .me-xl-0 {\n margin-right: 0 !important;\n }\n .me-xl-1 {\n margin-right: 0.25rem !important;\n }\n .me-xl-2 {\n margin-right: 0.5rem !important;\n }\n .me-xl-3 {\n margin-right: 1rem !important;\n }\n .me-xl-4 {\n margin-right: 1.5rem !important;\n }\n .me-xl-5 {\n margin-right: 3rem !important;\n }\n .me-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xl-auto {\n margin-bottom: auto !important;\n }\n .ms-xl-0 {\n margin-left: 0 !important;\n }\n .ms-xl-1 {\n margin-left: 0.25rem !important;\n }\n .ms-xl-2 {\n margin-left: 0.5rem !important;\n }\n .ms-xl-3 {\n margin-left: 1rem !important;\n }\n .ms-xl-4 {\n margin-left: 1.5rem !important;\n }\n .ms-xl-5 {\n margin-left: 3rem !important;\n }\n .ms-xl-auto {\n margin-left: auto !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .px-xl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-xl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-xl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-xl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-xl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-xl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xl-0 {\n padding-top: 0 !important;\n }\n .pt-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xl-3 {\n padding-top: 1rem !important;\n }\n .pt-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xl-5 {\n padding-top: 3rem !important;\n }\n .pe-xl-0 {\n padding-right: 0 !important;\n }\n .pe-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pe-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pe-xl-3 {\n padding-right: 1rem !important;\n }\n .pe-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pe-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xl-0 {\n padding-left: 0 !important;\n }\n .ps-xl-1 {\n padding-left: 0.25rem !important;\n }\n .ps-xl-2 {\n padding-left: 0.5rem !important;\n }\n .ps-xl-3 {\n padding-left: 1rem !important;\n }\n .ps-xl-4 {\n padding-left: 1.5rem !important;\n }\n .ps-xl-5 {\n padding-left: 3rem !important;\n }\n .gap-xl-0 {\n gap: 0 !important;\n }\n .gap-xl-1 {\n gap: 0.25rem !important;\n }\n .gap-xl-2 {\n gap: 0.5rem !important;\n }\n .gap-xl-3 {\n gap: 1rem !important;\n }\n .gap-xl-4 {\n gap: 1.5rem !important;\n }\n .gap-xl-5 {\n gap: 3rem !important;\n }\n .row-gap-xl-0 {\n row-gap: 0 !important;\n }\n .row-gap-xl-1 {\n row-gap: 0.25rem !important;\n }\n .row-gap-xl-2 {\n row-gap: 0.5rem !important;\n }\n .row-gap-xl-3 {\n row-gap: 1rem !important;\n }\n .row-gap-xl-4 {\n row-gap: 1.5rem !important;\n }\n .row-gap-xl-5 {\n row-gap: 3rem !important;\n }\n .column-gap-xl-0 {\n column-gap: 0 !important;\n }\n .column-gap-xl-1 {\n column-gap: 0.25rem !important;\n }\n .column-gap-xl-2 {\n column-gap: 0.5rem !important;\n }\n .column-gap-xl-3 {\n column-gap: 1rem !important;\n }\n .column-gap-xl-4 {\n column-gap: 1.5rem !important;\n }\n .column-gap-xl-5 {\n column-gap: 3rem !important;\n }\n .text-xl-start {\n text-align: left !important;\n }\n .text-xl-end {\n text-align: right !important;\n }\n .text-xl-center {\n text-align: center !important;\n }\n}\n@media (min-width: 1400px) {\n .float-xxl-start {\n float: left !important;\n }\n .float-xxl-end {\n float: right !important;\n }\n .float-xxl-none {\n float: none !important;\n }\n .object-fit-xxl-contain {\n object-fit: contain !important;\n }\n .object-fit-xxl-cover {\n object-fit: cover !important;\n }\n .object-fit-xxl-fill {\n object-fit: fill !important;\n }\n .object-fit-xxl-scale {\n object-fit: scale-down !important;\n }\n .object-fit-xxl-none {\n object-fit: none !important;\n }\n .d-xxl-inline {\n display: inline !important;\n }\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n .d-xxl-block {\n display: block !important;\n }\n .d-xxl-grid {\n display: grid !important;\n }\n .d-xxl-inline-grid {\n display: inline-grid !important;\n }\n .d-xxl-table {\n display: table !important;\n }\n .d-xxl-table-row {\n display: table-row !important;\n }\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n .d-xxl-flex {\n display: flex !important;\n }\n .d-xxl-inline-flex {\n display: inline-flex !important;\n }\n .d-xxl-none {\n display: none !important;\n }\n .flex-xxl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xxl-row {\n flex-direction: row !important;\n }\n .flex-xxl-column {\n flex-direction: column !important;\n }\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xxl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xxl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xxl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xxl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xxl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xxl-center {\n justify-content: center !important;\n }\n .justify-content-xxl-between {\n justify-content: space-between !important;\n }\n .justify-content-xxl-around {\n justify-content: space-around !important;\n }\n .justify-content-xxl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xxl-start {\n align-items: flex-start !important;\n }\n .align-items-xxl-end {\n align-items: flex-end !important;\n }\n .align-items-xxl-center {\n align-items: center !important;\n }\n .align-items-xxl-baseline {\n align-items: baseline !important;\n }\n .align-items-xxl-stretch {\n align-items: stretch !important;\n }\n .align-content-xxl-start {\n align-content: flex-start !important;\n }\n .align-content-xxl-end {\n align-content: flex-end !important;\n }\n .align-content-xxl-center {\n align-content: center !important;\n }\n .align-content-xxl-between {\n align-content: space-between !important;\n }\n .align-content-xxl-around {\n align-content: space-around !important;\n }\n .align-content-xxl-stretch {\n align-content: stretch !important;\n }\n .align-self-xxl-auto {\n align-self: auto !important;\n }\n .align-self-xxl-start {\n align-self: flex-start !important;\n }\n .align-self-xxl-end {\n align-self: flex-end !important;\n }\n .align-self-xxl-center {\n align-self: center !important;\n }\n .align-self-xxl-baseline {\n align-self: baseline !important;\n }\n .align-self-xxl-stretch {\n align-self: stretch !important;\n }\n .order-xxl-first {\n order: -1 !important;\n }\n .order-xxl-0 {\n order: 0 !important;\n }\n .order-xxl-1 {\n order: 1 !important;\n }\n .order-xxl-2 {\n order: 2 !important;\n }\n .order-xxl-3 {\n order: 3 !important;\n }\n .order-xxl-4 {\n order: 4 !important;\n }\n .order-xxl-5 {\n order: 5 !important;\n }\n .order-xxl-last {\n order: 6 !important;\n }\n .m-xxl-0 {\n margin: 0 !important;\n }\n .m-xxl-1 {\n margin: 0.25rem !important;\n }\n .m-xxl-2 {\n margin: 0.5rem !important;\n }\n .m-xxl-3 {\n margin: 1rem !important;\n }\n .m-xxl-4 {\n margin: 1.5rem !important;\n }\n .m-xxl-5 {\n margin: 3rem !important;\n }\n .m-xxl-auto {\n margin: auto !important;\n }\n .mx-xxl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-xxl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-xxl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-xxl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-xxl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-xxl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-xxl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xxl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xxl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xxl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xxl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xxl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xxl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xxl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xxl-0 {\n margin-top: 0 !important;\n }\n .mt-xxl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xxl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xxl-3 {\n margin-top: 1rem !important;\n }\n .mt-xxl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xxl-5 {\n margin-top: 3rem !important;\n }\n .mt-xxl-auto {\n margin-top: auto !important;\n }\n .me-xxl-0 {\n margin-right: 0 !important;\n }\n .me-xxl-1 {\n margin-right: 0.25rem !important;\n }\n .me-xxl-2 {\n margin-right: 0.5rem !important;\n }\n .me-xxl-3 {\n margin-right: 1rem !important;\n }\n .me-xxl-4 {\n margin-right: 1.5rem !important;\n }\n .me-xxl-5 {\n margin-right: 3rem !important;\n }\n .me-xxl-auto {\n margin-right: auto !important;\n }\n .mb-xxl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xxl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xxl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xxl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xxl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xxl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xxl-auto {\n margin-bottom: auto !important;\n }\n .ms-xxl-0 {\n margin-left: 0 !important;\n }\n .ms-xxl-1 {\n margin-left: 0.25rem !important;\n }\n .ms-xxl-2 {\n margin-left: 0.5rem !important;\n }\n .ms-xxl-3 {\n margin-left: 1rem !important;\n }\n .ms-xxl-4 {\n margin-left: 1.5rem !important;\n }\n .ms-xxl-5 {\n margin-left: 3rem !important;\n }\n .ms-xxl-auto {\n margin-left: auto !important;\n }\n .p-xxl-0 {\n padding: 0 !important;\n }\n .p-xxl-1 {\n padding: 0.25rem !important;\n }\n .p-xxl-2 {\n padding: 0.5rem !important;\n }\n .p-xxl-3 {\n padding: 1rem !important;\n }\n .p-xxl-4 {\n padding: 1.5rem !important;\n }\n .p-xxl-5 {\n padding: 3rem !important;\n }\n .px-xxl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-xxl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-xxl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-xxl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-xxl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-xxl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xxl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xxl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xxl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xxl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xxl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xxl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xxl-0 {\n padding-top: 0 !important;\n }\n .pt-xxl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xxl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xxl-3 {\n padding-top: 1rem !important;\n }\n .pt-xxl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xxl-5 {\n padding-top: 3rem !important;\n }\n .pe-xxl-0 {\n padding-right: 0 !important;\n }\n .pe-xxl-1 {\n padding-right: 0.25rem !important;\n }\n .pe-xxl-2 {\n padding-right: 0.5rem !important;\n }\n .pe-xxl-3 {\n padding-right: 1rem !important;\n }\n .pe-xxl-4 {\n padding-right: 1.5rem !important;\n }\n .pe-xxl-5 {\n padding-right: 3rem !important;\n }\n .pb-xxl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xxl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xxl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xxl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xxl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xxl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xxl-0 {\n padding-left: 0 !important;\n }\n .ps-xxl-1 {\n padding-left: 0.25rem !important;\n }\n .ps-xxl-2 {\n padding-left: 0.5rem !important;\n }\n .ps-xxl-3 {\n padding-left: 1rem !important;\n }\n .ps-xxl-4 {\n padding-left: 1.5rem !important;\n }\n .ps-xxl-5 {\n padding-left: 3rem !important;\n }\n .gap-xxl-0 {\n gap: 0 !important;\n }\n .gap-xxl-1 {\n gap: 0.25rem !important;\n }\n .gap-xxl-2 {\n gap: 0.5rem !important;\n }\n .gap-xxl-3 {\n gap: 1rem !important;\n }\n .gap-xxl-4 {\n gap: 1.5rem !important;\n }\n .gap-xxl-5 {\n gap: 3rem !important;\n }\n .row-gap-xxl-0 {\n row-gap: 0 !important;\n }\n .row-gap-xxl-1 {\n row-gap: 0.25rem !important;\n }\n .row-gap-xxl-2 {\n row-gap: 0.5rem !important;\n }\n .row-gap-xxl-3 {\n row-gap: 1rem !important;\n }\n .row-gap-xxl-4 {\n row-gap: 1.5rem !important;\n }\n .row-gap-xxl-5 {\n row-gap: 3rem !important;\n }\n .column-gap-xxl-0 {\n column-gap: 0 !important;\n }\n .column-gap-xxl-1 {\n column-gap: 0.25rem !important;\n }\n .column-gap-xxl-2 {\n column-gap: 0.5rem !important;\n }\n .column-gap-xxl-3 {\n column-gap: 1rem !important;\n }\n .column-gap-xxl-4 {\n column-gap: 1.5rem !important;\n }\n .column-gap-xxl-5 {\n column-gap: 3rem !important;\n }\n .text-xxl-start {\n text-align: left !important;\n }\n .text-xxl-end {\n text-align: right !important;\n }\n .text-xxl-center {\n text-align: center !important;\n }\n}\n@media (min-width: 1200px) {\n .fs-1 {\n font-size: 2.5rem !important;\n }\n .fs-2 {\n font-size: 2rem !important;\n }\n .fs-3 {\n font-size: 1.75rem !important;\n }\n .fs-4 {\n font-size: 1.5rem !important;\n }\n}\n@media print {\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-grid {\n display: grid !important;\n }\n .d-print-inline-grid {\n display: inline-grid !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n .d-print-none {\n display: none !important;\n }\n}\n@font-face {\n font-display: swap;\n font-family: \"Playfair Display\";\n font-style: normal;\n font-weight: 400;\n src: url(\"../fonts/playfair-display-v40-latin/playfair-display-v40-latin-regular.woff2\") format(\"woff2\");\n}\n@font-face {\n font-display: swap;\n font-family: \"Playfair Display\";\n font-style: italic;\n font-weight: 400;\n src: url(\"../fonts/playfair-display-v40-latin/playfair-display-v40-latin-italic.woff2\") format(\"woff2\");\n}\n@font-face {\n font-display: swap;\n font-family: \"Playfair Display\";\n font-style: normal;\n font-weight: 500;\n src: url(\"../fonts/playfair-display-v40-latin/playfair-display-v40-latin-500.woff2\") format(\"woff2\");\n}\n@font-face {\n font-display: swap;\n font-family: \"Playfair Display\";\n font-style: italic;\n font-weight: 500;\n src: url(\"../fonts/playfair-display-v40-latin/playfair-display-v40-latin-500italic.woff2\") format(\"woff2\");\n}\n@font-face {\n font-display: swap;\n font-family: \"Playfair Display\";\n font-style: normal;\n font-weight: 600;\n src: url(\"../fonts/playfair-display-v40-latin/playfair-display-v40-latin-600.woff2\") format(\"woff2\");\n}\n@font-face {\n font-display: swap;\n font-family: \"Playfair Display\";\n font-style: italic;\n font-weight: 600;\n src: url(\"../fonts/playfair-display-v40-latin/playfair-display-v40-latin-600italic.woff2\") format(\"woff2\");\n}\n@font-face {\n font-display: swap;\n font-family: \"Playfair Display\";\n font-style: normal;\n font-weight: 700;\n src: url(\"../fonts/playfair-display-v40-latin/playfair-display-v40-latin-700.woff2\") format(\"woff2\");\n}\n@font-face {\n font-display: swap;\n font-family: \"Playfair Display\";\n font-style: italic;\n font-weight: 700;\n src: url(\"../fonts/playfair-display-v40-latin/playfair-display-v40-latin-700italic.woff2\") format(\"woff2\");\n}\n@font-face {\n font-display: swap;\n font-family: \"Playfair Display\";\n font-style: normal;\n font-weight: 800;\n src: url(\"../fonts/playfair-display-v40-latin/playfair-display-v40-latin-800.woff2\") format(\"woff2\");\n}\n@font-face {\n font-display: swap;\n font-family: \"Playfair Display\";\n font-style: italic;\n font-weight: 800;\n src: url(\"../fonts/playfair-display-v40-latin/playfair-display-v40-latin-800italic.woff2\") format(\"woff2\");\n}\n@font-face {\n font-display: swap;\n font-family: \"Playfair Display\";\n font-style: normal;\n font-weight: 900;\n src: url(\"../fonts/playfair-display-v40-latin/playfair-display-v40-latin-900.woff2\") format(\"woff2\");\n}\n@font-face {\n font-display: swap;\n font-family: \"Playfair Display\";\n font-style: italic;\n font-weight: 900;\n src: url(\"../fonts/playfair-display-v40-latin/playfair-display-v40-latin-900italic.woff2\") format(\"woff2\");\n}\n@font-face {\n font-display: swap;\n font-family: \"Source Sans 3\";\n font-style: normal;\n font-weight: 200;\n src: url(\"../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-200.woff2\") format(\"woff2\");\n}\n@font-face {\n font-display: swap;\n font-family: \"Source Sans 3\";\n font-style: italic;\n font-weight: 200;\n src: url(\"../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-200italic.woff2\") format(\"woff2\");\n}\n@font-face {\n font-display: swap;\n font-family: \"Source Sans 3\";\n font-style: normal;\n font-weight: 300;\n src: url(\"../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-300.woff2\") format(\"woff2\");\n}\n@font-face {\n font-display: swap;\n font-family: \"Source Sans 3\";\n font-style: italic;\n font-weight: 300;\n src: url(\"../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-300italic.woff2\") format(\"woff2\");\n}\n@font-face {\n font-display: swap;\n font-family: \"Source Sans 3\";\n font-style: normal;\n font-weight: 400;\n src: url(\"../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-regular.woff2\") format(\"woff2\");\n}\n@font-face {\n font-display: swap;\n font-family: \"Source Sans 3\";\n font-style: italic;\n font-weight: 400;\n src: url(\"../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-italic.woff2\") format(\"woff2\");\n}\n@font-face {\n font-display: swap;\n font-family: \"Source Sans 3\";\n font-style: normal;\n font-weight: 500;\n src: url(\"../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-500.woff2\") format(\"woff2\");\n}\n@font-face {\n font-display: swap;\n font-family: \"Source Sans 3\";\n font-style: italic;\n font-weight: 500;\n src: url(\"../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-500italic.woff2\") format(\"woff2\");\n}\n@font-face {\n font-display: swap;\n font-family: \"Source Sans 3\";\n font-style: normal;\n font-weight: 600;\n src: url(\"../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-600.woff2\") format(\"woff2\");\n}\n@font-face {\n font-display: swap;\n font-family: \"Source Sans 3\";\n font-style: italic;\n font-weight: 600;\n src: url(\"../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-600italic.woff2\") format(\"woff2\");\n}\n@font-face {\n font-display: swap;\n font-family: \"Source Sans 3\";\n font-style: normal;\n font-weight: 700;\n src: url(\"../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-700.woff2\") format(\"woff2\");\n}\n@font-face {\n font-display: swap;\n font-family: \"Source Sans 3\";\n font-style: italic;\n font-weight: 700;\n src: url(\"../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-700italic.woff2\") format(\"woff2\");\n}\n@font-face {\n font-display: swap;\n font-family: \"Source Sans 3\";\n font-style: normal;\n font-weight: 800;\n src: url(\"../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-800.woff2\") format(\"woff2\");\n}\n@font-face {\n font-display: swap;\n font-family: \"Source Sans 3\";\n font-style: italic;\n font-weight: 800;\n src: url(\"../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-800italic.woff2\") format(\"woff2\");\n}\n@font-face {\n font-display: swap;\n font-family: \"Source Sans 3\";\n font-style: normal;\n font-weight: 900;\n src: url(\"../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-900.woff2\") format(\"woff2\");\n}\n@font-face {\n font-display: swap;\n font-family: \"Source Sans 3\";\n font-style: italic;\n font-weight: 900;\n src: url(\"../fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-900italic.woff2\") format(\"woff2\");\n}\n.sr-only {\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n margin: -1px !important;\n overflow: hidden !important;\n clip: rect(0, 0, 0, 0) !important;\n white-space: nowrap !important;\n border: 0 !important;\n}\n\n/* Color Theme Swatches in Hex */\n*,\nhtml {\n box-sizing: border-box;\n}\n\nhtml,\nbody {\n height: 100%;\n padding: 0;\n margin: 0;\n}\n\nbody {\n font-family: \"Source Sans 3\", \"Segoe UI\", Tahoma, Geneva, Verdana, sans-serif;\n}\n\nbody {\n display: flex;\n flex-direction: column;\n}\n\nmain,\n#main {\n flex: 1 0 auto;\n}\n\nbody > footer,\n.footer-main {\n flex-shrink: 0;\n}\n\nh1, .h1,\nh2,\n.h2,\nh3,\n.h3,\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n font-family: \"Playfair Display\", Cambria, Cochin, Georgia, Times, \"Times New Roman\", serif;\n font-weight: 700;\n}\n\n.splide__container {\n box-sizing: border-box;\n position: relative;\n}\n\n.splide__list {\n backface-visibility: hidden;\n display: flex;\n height: 100%;\n margin: 0 !important;\n padding: 0 !important;\n}\n\n.splide.is-initialized:not(.is-active) .splide__list {\n display: block;\n}\n\n.splide__pagination {\n align-items: center;\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n margin: 0;\n pointer-events: none;\n}\n\n.splide__pagination li {\n display: inline-block;\n line-height: 1;\n list-style-type: none;\n margin: 0;\n pointer-events: auto;\n}\n\n.splide:not(.is-overflow) .splide__pagination {\n display: none;\n}\n\n.splide__progress__bar {\n width: 0;\n}\n\n.splide {\n position: relative;\n visibility: hidden;\n}\n\n.splide.is-initialized, .splide.is-rendered {\n visibility: visible;\n}\n\n.splide__slide {\n backface-visibility: hidden;\n box-sizing: border-box;\n flex-shrink: 0;\n list-style-type: none !important;\n margin: 0;\n position: relative;\n}\n\n.splide__slide img {\n vertical-align: bottom;\n}\n\n.splide__spinner {\n animation: splide-loading 1s infinite linear;\n border: 2px solid #999;\n border-left-color: transparent;\n border-radius: 50%;\n bottom: 0;\n contain: strict;\n display: inline-block;\n height: 20px;\n left: 0;\n margin: auto;\n position: absolute;\n right: 0;\n top: 0;\n width: 20px;\n}\n\n.splide__sr {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n}\n\n.splide__toggle__pause {\n display: none;\n}\n\n.splide__toggle.is-active .splide__toggle__play {\n display: none;\n}\n\n.splide__toggle.is-active .splide__toggle__pause {\n display: inline;\n}\n\n.splide__track {\n overflow: hidden;\n position: relative;\n z-index: 0;\n}\n\n@keyframes splide-loading {\n 0% {\n transform: rotateZ(0);\n }\n 100% {\n transform: rotateZ(360deg);\n }\n}\n.splide__track--draggable {\n -webkit-touch-callout: none;\n user-select: none;\n}\n\n.splide__track--fade > .splide__list > .splide__slide {\n margin: 0 !important;\n opacity: 0;\n z-index: 0;\n}\n\n.splide__track--fade > .splide__list > .splide__slide.is-active {\n opacity: 1;\n z-index: 1;\n}\n\n.splide--rtl {\n direction: rtl;\n}\n\n.splide__track--ttb > .splide__list {\n display: block;\n}\n\n.splide__arrow {\n background: #ccc;\n border: 0;\n cursor: pointer;\n padding: 0;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n z-index: 1;\n opacity: 0.7;\n align-items: center;\n border-radius: 50%;\n display: flex;\n justify-content: center;\n height: 2em;\n width: 2em;\n}\n\n.splide__arrow svg {\n fill: #000;\n height: 1.2em;\n width: 1.2em;\n}\n\n.splide__arrow:hover:not(:disabled) {\n opacity: 0.9;\n}\n\n.splide__arrow:disabled {\n opacity: 0.3;\n}\n\n.splide__arrow:focus-visible {\n outline: #0bf 3px solid;\n outline-offset: 3px;\n}\n\n.splide__arrow--prev {\n left: 1em;\n}\n\n.splide__arrow--prev svg {\n transform: scaleX(-1);\n}\n\n.splide__arrow--next {\n right: 1em;\n}\n\n.splide.is-focus-in .splide__arrow:focus {\n outline: #0bf 3px solid;\n outline-offset: 3px;\n}\n\n.splide__pagination {\n bottom: 0.5em;\n left: 0;\n padding: 0 1em;\n position: absolute;\n right: 0;\n z-index: 1;\n}\n\n.splide__pagination__page {\n background: #ccc;\n border: 0;\n border-radius: 50%;\n display: inline-block;\n height: 8px;\n margin: 3px;\n padding: 0;\n position: relative;\n transition: transform 0.2s linear;\n width: 8px;\n opacity: 0.7;\n}\n\n.splide__pagination__page.is-active {\n background: #fff;\n z-index: 1;\n transform: scale(1.4);\n}\n\n.splide__pagination__page:hover {\n cursor: pointer;\n opacity: 0.9;\n}\n\n.splide__pagination__page:focus-visible {\n outline: #0bf 3px solid;\n outline-offset: 3px;\n}\n\n.splide.is-focus-in .splide__pagination__page:focus {\n outline: #0bf 3px solid;\n outline-offset: 3px;\n}\n\n.splide__progress__bar {\n background: #ccc;\n height: 1rem;\n}\n\n.splide__slide {\n -webkit-tap-highlight-color: transparent;\n}\n\n.splide__slide:focus {\n outline: 0;\n}\n\n@supports (outline-offset: -3px) {\n .splide__slide:focus-visible {\n outline: #0bf 3px solid;\n outline-offset: -3px;\n }\n}\n.splide__slide:focus-visible {\n /* IE does not support outline-offset */\n}\n\n@media screen and (-ms-high-contrast: none) {\n .splide__slide:focus-visible {\n border: #0bf 3px solid;\n }\n}\n@supports (outline-offset: -3px) {\n .splide.is-focus-in .splide__slide:focus {\n outline: #0bf 3px solid;\n outline-offset: -3px;\n }\n}\n.splide.is-focus-in .splide__slide:focus {\n /* IE does not support outline-offset */\n}\n\n@media screen and (-ms-high-contrast: none) {\n .splide.is-focus-in .splide__slide:focus {\n border: #0bf 3px solid;\n }\n}\n@media screen and (-ms-high-contrast: none) {\n .splide.is-focus-in .splide__track > .splide__list > .splide__slide:focus {\n border-color: #0bf;\n }\n}\n.splide__toggle {\n cursor: pointer;\n}\n\n.splide__toggle:focus-visible {\n outline: #0bf 3px solid;\n outline-offset: 3px;\n}\n\n.splide.is-focus-in .splide__toggle:focus {\n outline: #0bf 3px solid;\n outline-offset: 3px;\n}\n\n.splide__track--nav > .splide__list > .splide__slide {\n border: 3px solid transparent;\n cursor: pointer;\n}\n\n.splide__track--nav > .splide__list > .splide__slide.is-active {\n border: 3px solid #000;\n}\n\n.splide__arrows--rtl .splide__arrow--prev {\n left: auto;\n right: 1em;\n}\n\n.splide__arrows--rtl .splide__arrow--prev svg {\n transform: scaleX(1);\n}\n\n.splide__arrows--rtl .splide__arrow--next {\n left: 1em;\n right: auto;\n}\n\n.splide__arrows--rtl .splide__arrow--next svg {\n transform: scaleX(-1);\n}\n\n.splide__arrows--ttb .splide__arrow {\n left: 50%;\n transform: translate(-50%, 0);\n}\n\n.splide__arrows--ttb .splide__arrow--prev {\n top: 1em;\n}\n\n.splide__arrows--ttb .splide__arrow--prev svg {\n transform: rotateZ(-90deg);\n}\n\n.splide__arrows--ttb .splide__arrow--next {\n bottom: 1em;\n top: auto;\n}\n\n.splide__arrows--ttb .splide__arrow--next svg {\n transform: rotateZ(90deg);\n}\n\n.splide__pagination--ttb {\n bottom: 0;\n display: flex;\n flex-direction: column;\n left: auto;\n padding: 1em 0;\n right: 0.5em;\n top: 0;\n}\n\n@keyframes splide-loading {\n 0% {\n transform: rotateZ(0);\n }\n 100% {\n transform: rotateZ(360deg);\n }\n}\n.splide__track--draggable {\n -webkit-touch-callout: none;\n user-select: none;\n}\n\n.splide__track--fade > .splide__list > .splide__slide {\n margin: 0 !important;\n opacity: 0;\n z-index: 0;\n}\n\n.splide__track--fade > .splide__list > .splide__slide.is-active {\n opacity: 1;\n z-index: 1;\n}\n\n.splide--rtl {\n direction: rtl;\n}\n\n.splide__track--ttb > .splide__list {\n display: block;\n}\n\n.splide__container {\n box-sizing: border-box;\n position: relative;\n}\n\n.splide__list {\n backface-visibility: hidden;\n display: flex;\n height: 100%;\n margin: 0 !important;\n padding: 0 !important;\n}\n\n.splide.is-initialized:not(.is-active) .splide__list {\n display: block;\n}\n\n.splide__pagination {\n align-items: center;\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n margin: 0;\n pointer-events: none;\n}\n\n.splide__pagination li {\n display: inline-block;\n line-height: 1;\n list-style-type: none;\n margin: 0;\n pointer-events: auto;\n}\n\n.splide:not(.is-overflow) .splide__pagination {\n display: none;\n}\n\n.splide__progress__bar {\n width: 0;\n}\n\n.splide {\n position: relative;\n visibility: hidden;\n}\n\n.splide.is-initialized, .splide.is-rendered {\n visibility: visible;\n}\n\n.splide__slide {\n backface-visibility: hidden;\n box-sizing: border-box;\n flex-shrink: 0;\n list-style-type: none !important;\n margin: 0;\n position: relative;\n}\n\n.splide__slide img {\n vertical-align: bottom;\n}\n\n.splide__spinner {\n animation: splide-loading 1s infinite linear;\n border: 2px solid #999;\n border-left-color: transparent;\n border-radius: 50%;\n bottom: 0;\n contain: strict;\n display: inline-block;\n height: 20px;\n left: 0;\n margin: auto;\n position: absolute;\n right: 0;\n top: 0;\n width: 20px;\n}\n\n.splide__sr {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n}\n\n.splide__toggle__pause {\n display: none;\n}\n\n.splide__toggle.is-active .splide__toggle__play {\n display: none;\n}\n\n.splide__toggle.is-active .splide__toggle__pause {\n display: inline;\n}\n\n.splide__track {\n overflow: hidden;\n position: relative;\n z-index: 0;\n}\n\n/*!\n * Toastify js 1.12.0\n * https://github.com/apvarun/toastify-js\n * @license MIT licensed\n *\n * Copyright (C) 2018 Varun A P\n */\n.toastify {\n padding: 12px 20px;\n color: #ffffff;\n display: inline-block;\n box-shadow: 0 3px 6px -1px rgba(0, 0, 0, 0.12), 0 10px 36px -4px rgba(77, 96, 232, 0.3);\n background: -webkit-linear-gradient(315deg, #73a5ff, #5477f5);\n background: linear-gradient(135deg, #73a5ff, #5477f5);\n position: fixed;\n opacity: 0;\n transition: all 0.4s cubic-bezier(0.215, 0.61, 0.355, 1);\n border-radius: 2px;\n cursor: pointer;\n text-decoration: none;\n max-width: calc(50% - 20px);\n z-index: 2147483647;\n}\n\n.toastify.on {\n opacity: 1;\n}\n\n.toast-close {\n background: transparent;\n border: 0;\n color: white;\n cursor: pointer;\n font-family: inherit;\n font-size: 1em;\n opacity: 0.4;\n padding: 0 5px;\n}\n\n.toastify-right {\n right: 15px;\n}\n\n.toastify-left {\n left: 15px;\n}\n\n.toastify-top {\n top: -150px;\n}\n\n.toastify-bottom {\n bottom: -150px;\n}\n\n.toastify-rounded {\n border-radius: 25px;\n}\n\n.toastify-avatar {\n width: 1.5em;\n height: 1.5em;\n margin: -7px 5px;\n border-radius: 2px;\n}\n\n.toastify-center {\n margin-left: auto;\n margin-right: auto;\n left: 0;\n right: 0;\n max-width: fit-content;\n max-width: -moz-fit-content;\n}\n\n@media only screen and (max-width: 360px) {\n .toastify-right,\n .toastify-left {\n margin-left: auto;\n margin-right: auto;\n left: 0;\n right: 0;\n max-width: fit-content;\n }\n}\n.footer-main {\n background: #283e4a;\n background: linear-gradient(180deg, rgb(40, 62, 74) 0%, rgb(24, 32, 38) 100%);\n padding: 2rem 0;\n}\n.footer-main .col {\n color: white;\n}\n.footer-main .col h2, .footer-main .col .h2,\n.footer-main .col h3,\n.footer-main .col .h3,\n.footer-main .col h4,\n.footer-main .col .h4,\n.footer-main .col h5,\n.footer-main .col .h5 {\n font-size: 1.5rem;\n color: #f06060;\n padding: 0.5rem 0;\n margin-bottom: 1rem;\n letter-spacing: 2px;\n}\n\n.header-main {\n position: relative;\n width: 100%;\n min-height: 400px;\n}\n.header-main .content-box {\n position: relative;\n z-index: 2;\n display: flex;\n justify-content: center;\n align-items: center;\n width: auto;\n margin: 0 auto;\n height: 100%;\n max-width: 360px;\n max-height: 380px;\n}\n.header-main {\n background: #f2ebbf url(\"../img/header-image.webp\") center no-repeat;\n background-size: cover;\n}\n.header-main--min {\n height: 150px;\n background-color: #8cbeb2;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n.header-main--min .content-box figure {\n width: 150px;\n}\n.header-main .splide {\n position: absolute;\n z-index: 1;\n height: 100%;\n width: 100%;\n top: 0;\n overflow: hidden;\n}\n.header-main .splide .splide__track {\n height: 100%;\n}\n.header-main .splide .splide__track .splider-content::after {\n content: \"\";\n position: absolute;\n z-index: 1;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.2);\n}\n.header-main .splide .splide__track .splider-content {\n height: 100%;\n padding: 0;\n}\n.header-main .splide .splide__track .splider-content img {\n object-fit: cover;\n width: 100%;\n height: 100%;\n}\n\nfigure.logo-main {\n width: 280px;\n}\nfigure.logo-main figcaption {\n position: absolute;\n clip: rect(1px, 1px, 1px, 1px);\n clip-path: inset(0 0 99.9% 99.9%);\n overflow: hidden;\n height: 1px;\n width: 1px;\n padding: 0;\n border: 0;\n}\n\n.menu-main {\n background-color: #f06060;\n}\n.menu-main ul {\n padding: 0;\n margin: 0;\n list-style: none;\n}\n.menu-main ul ul {\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n margin: -1px !important;\n overflow: hidden !important;\n clip: rect(0, 0, 0, 0) !important;\n white-space: nowrap !important;\n border: 0 !important;\n}\n.menu-main ul > li:hover ul,\n.menu-main ul > li:focus ul,\n.menu-main ul > li:focus-within ul {\n width: inherit !important;\n height: inherit !important;\n padding: inherit !important;\n margin: inherit !important;\n overflow: inherit !important;\n clip: inherit !important;\n white-space: inherit !important;\n border: inherit !important;\n}\n.menu-main ul.list {\n display: flex;\n justify-content: center;\n}\n.menu-main ul.list li a {\n display: inline-block;\n text-decoration: none;\n text-transform: uppercase;\n color: white;\n padding: 0.5rem 1rem;\n transition: all 0.4s ease-out;\n}\n.menu-main ul.list li a:hover, .menu-main ul.list li a:focus {\n background-color: white;\n color: #f06060;\n}\n.menu-main ul.sublist {\n position: absolute;\n background-color: rgba(240, 96, 96, 0.8);\n}\n.menu-main ul.sublist li a {\n display: inline-block;\n background-color: #f06060;\n color: white;\n padding: 0.5rem 1rem;\n transition: all 0.4s ease-out;\n}\n.menu-main ul.sublist li a:hover, .menu-main ul.sublist li a:focus {\n background-color: white;\n color: #f06060;\n}\n\n.product-manager .nav-products-actions {\n margin: 1rem 0;\n display: flex;\n justify-content: flex-end;\n}\n.product-manager .nav-products-actions .list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n gap: 1rem;\n}\n.product-manager table .th-actions {\n width: 200px;\n}\n.product-manager table tbody td {\n vertical-align: middle;\n}\n.product-manager table tbody td button {\n margin: 3px;\n}\n.product-manager table tfoot .row > * {\n margin-bottom: 1rem;\n}\n@media (min-width: 992px) {\n .product-manager table tfoot .row > * {\n margin-bottom: 0;\n }\n}","@mixin bsBanner($file) {\n /*!\n * Bootstrap #{$file} v5.3.8 (https://getbootstrap.com/)\n * Copyright 2011-2025 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n}\n","@import 'playfair-display-v40-latin';\n@import 'source-sans-3-v19-latin';\n@import 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.3.0/css/all.min.css';\n",":root,\n[data-bs-theme=\"light\"] {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$prefix}#{$color}-rgb: #{$value};\n }\n\n @each $color, $value in $theme-colors-text {\n --#{$prefix}#{$color}-text-emphasis: #{$value};\n }\n\n @each $color, $value in $theme-colors-bg-subtle {\n --#{$prefix}#{$color}-bg-subtle: #{$value};\n }\n\n @each $color, $value in $theme-colors-border-subtle {\n --#{$prefix}#{$color}-border-subtle: #{$value};\n }\n\n --#{$prefix}white-rgb: #{to-rgb($white)};\n --#{$prefix}black-rgb: #{to-rgb($black)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$prefix}gradient: #{$gradient};\n\n // Root and body\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$prefix}root-font-size: #{$font-size-root};\n }\n --#{$prefix}body-font-family: #{inspect($font-family-base)};\n @include rfs($font-size-base, --#{$prefix}body-font-size);\n --#{$prefix}body-font-weight: #{$font-weight-base};\n --#{$prefix}body-line-height: #{$line-height-base};\n @if $body-text-align != null {\n --#{$prefix}body-text-align: #{$body-text-align};\n }\n\n --#{$prefix}body-color: #{$body-color};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color)};\n --#{$prefix}body-bg: #{$body-bg};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg)};\n\n --#{$prefix}emphasis-color: #{$body-emphasis-color};\n --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color)};\n\n --#{$prefix}secondary-color: #{$body-secondary-color};\n --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color)};\n --#{$prefix}secondary-bg: #{$body-secondary-bg};\n --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg)};\n\n --#{$prefix}tertiary-color: #{$body-tertiary-color};\n --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color)};\n --#{$prefix}tertiary-bg: #{$body-tertiary-bg};\n --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg)};\n // scss-docs-end root-body-variables\n\n --#{$prefix}heading-color: #{$headings-color};\n\n --#{$prefix}link-color: #{$link-color};\n --#{$prefix}link-color-rgb: #{to-rgb($link-color)};\n --#{$prefix}link-decoration: #{$link-decoration};\n\n --#{$prefix}link-hover-color: #{$link-hover-color};\n --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color)};\n\n @if $link-hover-decoration != null {\n --#{$prefix}link-hover-decoration: #{$link-hover-decoration};\n }\n\n --#{$prefix}code-color: #{$code-color};\n --#{$prefix}highlight-color: #{$mark-color};\n --#{$prefix}highlight-bg: #{$mark-bg};\n\n // scss-docs-start root-border-var\n --#{$prefix}border-width: #{$border-width};\n --#{$prefix}border-style: #{$border-style};\n --#{$prefix}border-color: #{$border-color};\n --#{$prefix}border-color-translucent: #{$border-color-translucent};\n\n --#{$prefix}border-radius: #{$border-radius};\n --#{$prefix}border-radius-sm: #{$border-radius-sm};\n --#{$prefix}border-radius-lg: #{$border-radius-lg};\n --#{$prefix}border-radius-xl: #{$border-radius-xl};\n --#{$prefix}border-radius-xxl: #{$border-radius-xxl};\n --#{$prefix}border-radius-2xl: var(--#{$prefix}border-radius-xxl); // Deprecated in v5.3.0 for consistency\n --#{$prefix}border-radius-pill: #{$border-radius-pill};\n // scss-docs-end root-border-var\n\n --#{$prefix}box-shadow: #{$box-shadow};\n --#{$prefix}box-shadow-sm: #{$box-shadow-sm};\n --#{$prefix}box-shadow-lg: #{$box-shadow-lg};\n --#{$prefix}box-shadow-inset: #{$box-shadow-inset};\n\n // Focus styles\n // scss-docs-start root-focus-variables\n --#{$prefix}focus-ring-width: #{$focus-ring-width};\n --#{$prefix}focus-ring-opacity: #{$focus-ring-opacity};\n --#{$prefix}focus-ring-color: #{$focus-ring-color};\n // scss-docs-end root-focus-variables\n\n // scss-docs-start root-form-validation-variables\n --#{$prefix}form-valid-color: #{$form-valid-color};\n --#{$prefix}form-valid-border-color: #{$form-valid-border-color};\n --#{$prefix}form-invalid-color: #{$form-invalid-color};\n --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color};\n // scss-docs-end root-form-validation-variables\n}\n\n@if $enable-dark-mode {\n @include color-mode(dark, true) {\n color-scheme: dark;\n\n // scss-docs-start root-dark-mode-vars\n --#{$prefix}body-color: #{$body-color-dark};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color-dark)};\n --#{$prefix}body-bg: #{$body-bg-dark};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg-dark)};\n\n --#{$prefix}emphasis-color: #{$body-emphasis-color-dark};\n --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color-dark)};\n\n --#{$prefix}secondary-color: #{$body-secondary-color-dark};\n --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color-dark)};\n --#{$prefix}secondary-bg: #{$body-secondary-bg-dark};\n --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg-dark)};\n\n --#{$prefix}tertiary-color: #{$body-tertiary-color-dark};\n --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color-dark)};\n --#{$prefix}tertiary-bg: #{$body-tertiary-bg-dark};\n --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg-dark)};\n\n @each $color, $value in $theme-colors-text-dark {\n --#{$prefix}#{$color}-text-emphasis: #{$value};\n }\n\n @each $color, $value in $theme-colors-bg-subtle-dark {\n --#{$prefix}#{$color}-bg-subtle: #{$value};\n }\n\n @each $color, $value in $theme-colors-border-subtle-dark {\n --#{$prefix}#{$color}-border-subtle: #{$value};\n }\n\n --#{$prefix}heading-color: #{$headings-color-dark};\n\n --#{$prefix}link-color: #{$link-color-dark};\n --#{$prefix}link-hover-color: #{$link-hover-color-dark};\n --#{$prefix}link-color-rgb: #{to-rgb($link-color-dark)};\n --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color-dark)};\n\n --#{$prefix}code-color: #{$code-color-dark};\n --#{$prefix}highlight-color: #{$mark-color-dark};\n --#{$prefix}highlight-bg: #{$mark-bg-dark};\n\n --#{$prefix}border-color: #{$border-color-dark};\n --#{$prefix}border-color-translucent: #{$border-color-translucent-dark};\n\n --#{$prefix}form-valid-color: #{$form-valid-color-dark};\n --#{$prefix}form-valid-border-color: #{$form-valid-border-color-dark};\n --#{$prefix}form-invalid-color: #{$form-invalid-color-dark};\n --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color-dark};\n // scss-docs-end root-dark-mode-vars\n }\n}\n","// stylelint-disable scss/dimension-no-non-numeric-values\n\n// SCSS RFS mixin\n//\n// Automated responsive values for font sizes, paddings, margins and much more\n//\n// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE)\n\n// Configuration\n\n// Base value\n$rfs-base-value: 1.25rem !default;\n$rfs-unit: rem !default;\n\n@if $rfs-unit != rem and $rfs-unit != px {\n @error \"`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.\";\n}\n\n// Breakpoint at where values start decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n}\n\n// Resize values based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != number or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Mode. Possibilities: \"min-media-query\", \"max-media-query\"\n$rfs-mode: min-media-query !default;\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-rfs to false\n$enable-rfs: true !default;\n\n// Cache $rfs-base-value unit\n$rfs-base-value-unit: unit($rfs-base-value);\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n\n// Remove px-unit from $rfs-base-value for calculations\n@if $rfs-base-value-unit == px {\n $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1);\n}\n@else if $rfs-base-value-unit == rem {\n $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value));\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == px {\n $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));\n}\n\n// Calculate the media query value\n$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});\n$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);\n$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);\n\n// Internal mixin used to determine which media query needs to be used\n@mixin _rfs-media-query {\n @if $rfs-two-dimensional {\n @if $rfs-mode == max-media-query {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {\n @content;\n }\n }\n}\n\n// Internal mixin that adds disable classes to the selector if needed.\n@mixin _rfs-rule {\n @if $rfs-class == disable and $rfs-mode == max-media-query {\n // Adding an extra class increases specificity, which prevents the media query to override the property\n &,\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @else if $rfs-class == enable and $rfs-mode == min-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Internal mixin that adds enable classes to the selector if needed.\n@mixin _rfs-media-query-rule {\n\n @if $rfs-class == enable {\n @if $rfs-mode == min-media-query {\n @content;\n }\n\n @include _rfs-media-query () {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n }\n @else {\n @if $rfs-class == disable and $rfs-mode == min-media-query {\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @include _rfs-media-query () {\n @content;\n }\n }\n}\n\n// Helper function to get the formatted non-responsive value\n@function rfs-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: \"\";\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + \" 0\";\n }\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n @if $unit == px {\n // Convert to rem if needed\n $val: $val + \" \" + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value);\n }\n @else if $unit == rem {\n // Convert to px if needed\n $val: $val + \" \" + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value);\n } @else {\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n $val: $val + \" \" + $value;\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// Helper function to get the responsive value calculated by RFS\n@function rfs-fluid-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: \"\";\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + \" 0\";\n } @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $unit or $unit != px and $unit != rem {\n $val: $val + \" \" + $value;\n } @else {\n // Remove unit from $value for calculations\n $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value)));\n\n // Only add the media query if the value is greater than the minimum value\n @if abs($value) <= $rfs-base-value or not $enable-rfs {\n $val: $val + \" \" + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px);\n }\n @else {\n // Calculate the minimum value\n $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor);\n\n // Calculate difference between $value and the minimum value\n $value-diff: abs($value) - $value-min;\n\n // Base value formatting\n $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px);\n\n // Use negative value if needed\n $min-width: if($value < 0, -$min-width, $min-width);\n\n // Use `vmin` if two-dimensional is enabled\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit};\n\n // Return the calculated value\n $val: $val + \" calc(\" + $min-width + if($value < 0, \" - \", \" + \") + $variable-width + \")\";\n }\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// RFS mixin\n@mixin rfs($values, $property: font-size) {\n @if $values != null {\n $val: rfs-value($values);\n $fluid-val: rfs-fluid-value($values);\n\n // Do not print the media query if responsive & non-responsive values are the same\n @if $val == $fluid-val {\n #{$property}: $val;\n }\n @else {\n @include _rfs-rule () {\n #{$property}: if($rfs-mode == max-media-query, $val, $fluid-val);\n\n // Include safari iframe resize fix if needed\n min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);\n }\n\n @include _rfs-media-query-rule () {\n #{$property}: if($rfs-mode == max-media-query, $fluid-val, $val);\n }\n }\n }\n}\n\n// Shorthand helper mixins\n@mixin font-size($value) {\n @include rfs($value);\n}\n\n@mixin padding($value) {\n @include rfs($value, padding);\n}\n\n@mixin padding-top($value) {\n @include rfs($value, padding-top);\n}\n\n@mixin padding-right($value) {\n @include rfs($value, padding-right);\n}\n\n@mixin padding-bottom($value) {\n @include rfs($value, padding-bottom);\n}\n\n@mixin padding-left($value) {\n @include rfs($value, padding-left);\n}\n\n@mixin margin($value) {\n @include rfs($value, margin);\n}\n\n@mixin margin-top($value) {\n @include rfs($value, margin-top);\n}\n\n@mixin margin-right($value) {\n @include rfs($value, margin-right);\n}\n\n@mixin margin-bottom($value) {\n @include rfs($value, margin-bottom);\n}\n\n@mixin margin-left($value) {\n @include rfs($value, margin-left);\n}\n","// scss-docs-start color-mode-mixin\n@mixin color-mode($mode: light, $root: false) {\n @if $color-mode-type == \"media-query\" {\n @if $root == true {\n @media (prefers-color-scheme: $mode) {\n :root {\n @content;\n }\n }\n } @else {\n @media (prefers-color-scheme: $mode) {\n @content;\n }\n }\n } @else {\n [data-bs-theme=\"#{$mode}\"] {\n @content;\n }\n }\n}\n// scss-docs-end color-mode-mixin\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n @include font-size(var(--#{$prefix}root-font-size));\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$prefix}body-font-family);\n @include font-size(var(--#{$prefix}body-font-size));\n font-weight: var(--#{$prefix}body-font-weight);\n line-height: var(--#{$prefix}body-line-height);\n color: var(--#{$prefix}body-color);\n text-align: var(--#{$prefix}body-text-align);\n background-color: var(--#{$prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n opacity: $hr-opacity;\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, `

      `-`

      ` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: var(--#{$prefix}heading-color);\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

      `s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 2. Add explicit cursor to indicate changed behavior.\n// 3. Prevent the text-decoration to be skipped.\n\nabbr[title] {\n text-decoration: underline dotted; // 1\n cursor: help; // 2\n text-decoration-skip-ink: none; // 3\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n color: var(--#{$prefix}highlight-color);\n background-color: var(--#{$prefix}highlight-bg);\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-opacity, 1));\n text-decoration: $link-decoration;\n\n &:hover {\n --#{$prefix}link-color-rgb: var(--#{$prefix}link-hover-color-rgb);\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: var(--#{$prefix}code-color);\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `

      ... - trEl.dataset.position = String(position); // ... - - DOM.tBody.appendChild(trEl); // Im DOM hinzufügen - }; - - const showModalEdit = (product: Product) => { - const { name = '', price = 0, _id: id, position } = product; - - DOM.inputEditName.value = name; - DOM.inputEditPrice.value = String(price); - - DOM.inputEditId.value = String(id); - DOM.inputEditPosition.value = String(position); - }; - - const resetFields = () => { - DOM.btnAdd.disabled = true; - DOM.inputPrice.value = ''; - DOM.inputName.value = ''; - - DOM.formEdit.reset(); - }; - - const disableNonFunctionalButtons = () => { - Array.from(DOM.tBody.querySelectorAll('tr')).forEach((tr) => { - const btnMoveUp = querySelectorTyped('.button-product-move-up', tr); - const btnMoveDown = querySelectorTyped('.button-product-move-down', tr); - - btnMoveUp.disabled = !tr.previousElementSibling; - btnMoveDown.disabled = !tr.nextElementSibling; - }); - }; - - init(); - - return { - init, - initProducts, - resetFields, - }; -}; - -// Freigabe für import -export default ProductManager; diff --git a/webseite-gulp-ts/frontend/dev/scripts/modules/Toast.ts b/webseite-gulp-ts/frontend/dev/scripts/modules/Toast.ts deleted file mode 100644 index 5507da6..0000000 --- a/webseite-gulp-ts/frontend/dev/scripts/modules/Toast.ts +++ /dev/null @@ -1,59 +0,0 @@ -import Toastify from 'toastify-js'; // das Modul wird von node_modules ausgelesen und gebundlet. Funktioniert nur mit JS-Bundler - -const Toast = (text: string = '', variant: string = 'primary') => { - const getColorByName = (variant: string = ''): string => { - let color; - switch (variant.trim().toLowerCase()) { - case 'primary': - color = '#0d6efd'; - break; - case 'secondary': - color = '#6c757d'; - break; - case 'warning': - color = '#ffc720'; - break; - case 'success': - color = '#13653f'; - break; - case 'info': - color = '#25cff2'; - break; - case 'error': - case 'danger': - color = '#a52834'; - break; - case 'light': - color = '#babbbc'; - break; - case 'dark': - color = '#373b3e'; - break; - - default: - console.warn('variant not found'); - color = 'white'; - } - return color; - }; - - const show = (): void => { - Toastify({ - text: text, - duration: 2000, - className: variant, - gravity: 'top', // `top` or `bottom` - position: 'center', // `left`, `center` or `right` - stopOnFocus: true, // Prevents dismissing of toast on hover - style: { - background: getColorByName(variant), - }, - }).showToast(); - }; - - return { - show, - }; -}; - -export default Toast; diff --git a/webseite-gulp-ts/frontend/dev/scripts/utils/helpers.ts b/webseite-gulp-ts/frontend/dev/scripts/utils/helpers.ts deleted file mode 100644 index ac412a5..0000000 --- a/webseite-gulp-ts/frontend/dev/scripts/utils/helpers.ts +++ /dev/null @@ -1,21 +0,0 @@ -// Generische Helferfunktion zum Selektieren von Element mit Überprüfung, ob das Element existiert -export const querySelectorTyped = ( - selector: string, - parent: Element | Document = document, -): T => { - const element = parent.querySelector(selector); - if (!element) { - throw new Error(`Element with selector "${selector}" not found.`); - } - return element; -}; - -// Helferfunktion aus jQuery (youmightnotjquery) -export const parents = (el: HTMLElement, selector?: string): HTMLElement[] => { - const parents: HTMLElement[] = []; - let currentEl: HTMLElement | null = el; - while ((currentEl = currentEl.parentElement) && currentEl !== null && currentEl !== document.documentElement) { - if (!selector || currentEl.matches(selector)) parents.push(currentEl as HTMLElement); - } - return parents; -}; diff --git a/webseite-gulp-ts/frontend/dev/scss/01_frameworks/_index.scss b/webseite-gulp-ts/frontend/dev/scss/01_frameworks/_index.scss deleted file mode 100644 index dcefbc9..0000000 --- a/webseite-gulp-ts/frontend/dev/scss/01_frameworks/_index.scss +++ /dev/null @@ -1,3 +0,0 @@ -// @import 'bootstrap-5.3.8/bootstrap-grid'; -@import 'bootstrap-5.3.8/bootstrap'; -// @import 'bulma-1.04/index' diff --git a/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_accordion.scss b/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_accordion.scss deleted file mode 100644 index e9f267f..0000000 --- a/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_accordion.scss +++ /dev/null @@ -1,153 +0,0 @@ -// -// Base styles -// - -.accordion { - // scss-docs-start accordion-css-vars - --#{$prefix}accordion-color: #{$accordion-color}; - --#{$prefix}accordion-bg: #{$accordion-bg}; - --#{$prefix}accordion-transition: #{$accordion-transition}; - --#{$prefix}accordion-border-color: #{$accordion-border-color}; - --#{$prefix}accordion-border-width: #{$accordion-border-width}; - --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; - --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; - --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; - --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; - --#{$prefix}accordion-btn-color: #{$accordion-button-color}; - --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; - --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; - --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; - --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; - --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; - --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; - --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; - --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; - --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; - // scss-docs-end accordion-css-vars -} - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); - @include font-size($font-size-base); - color: var(--#{$prefix}accordion-btn-color); - text-align: left; // Reset button style - background-color: var(--#{$prefix}accordion-btn-bg); - border: 0; - @include border-radius(0); - overflow-anchor: none; - @include transition(var(--#{$prefix}accordion-transition)); - - &:not(.collapsed) { - color: var(--#{$prefix}accordion-active-color); - background-color: var(--#{$prefix}accordion-active-bg); - box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list - - &::after { - background-image: var(--#{$prefix}accordion-btn-active-icon); - transform: var(--#{$prefix}accordion-btn-icon-transform); - } - } - - // Accordion icon - &::after { - flex-shrink: 0; - width: var(--#{$prefix}accordion-btn-icon-width); - height: var(--#{$prefix}accordion-btn-icon-width); - margin-left: auto; - content: ""; - background-image: var(--#{$prefix}accordion-btn-icon); - background-repeat: no-repeat; - background-size: var(--#{$prefix}accordion-btn-icon-width); - @include transition(var(--#{$prefix}accordion-btn-icon-transition)); - } - - &:hover { - z-index: 2; - } - - &:focus { - z-index: 3; - outline: 0; - box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); - } -} - -.accordion-header { - margin-bottom: 0; -} - -.accordion-item { - color: var(--#{$prefix}accordion-color); - background-color: var(--#{$prefix}accordion-bg); - border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); - - &:first-of-type { - @include border-top-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - &:not(:first-of-type) { - border-top: 0; - } - - // Only set a border-radius on the last item if the accordion is collapsed - &:last-of-type { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - &.collapsed { - @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - > .accordion-collapse { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - } - } -} - -.accordion-body { - padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); -} - - -// Flush accordion items -// -// Remove borders and border-radius to keep accordion items edge-to-edge. - -.accordion-flush { - > .accordion-item { - border-right: 0; - border-left: 0; - @include border-radius(0); - - &:first-child { border-top: 0; } - &:last-child { border-bottom: 0; } - - // stylelint-disable selector-max-class - > .accordion-collapse, - > .accordion-header .accordion-button, - > .accordion-header .accordion-button.collapsed { - @include border-radius(0); - } - // stylelint-enable selector-max-class - } -} - -@if $enable-dark-mode { - @include color-mode(dark) { - .accordion-button::after { - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; - } - } -} diff --git a/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_alert.scss b/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_alert.scss deleted file mode 100644 index b8cff9b..0000000 --- a/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_alert.scss +++ /dev/null @@ -1,68 +0,0 @@ -// -// Base styles -// - -.alert { - // scss-docs-start alert-css-vars - --#{$prefix}alert-bg: transparent; - --#{$prefix}alert-padding-x: #{$alert-padding-x}; - --#{$prefix}alert-padding-y: #{$alert-padding-y}; - --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; - --#{$prefix}alert-color: inherit; - --#{$prefix}alert-border-color: transparent; - --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); - --#{$prefix}alert-border-radius: #{$alert-border-radius}; - --#{$prefix}alert-link-color: inherit; - // scss-docs-end alert-css-vars - - position: relative; - padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); - margin-bottom: var(--#{$prefix}alert-margin-bottom); - color: var(--#{$prefix}alert-color); - background-color: var(--#{$prefix}alert-bg); - border: var(--#{$prefix}alert-border); - @include border-radius(var(--#{$prefix}alert-border-radius)); -} - -// Headings for larger alerts -.alert-heading { - // Specified to prevent conflicts of changing $headings-color - color: inherit; -} - -// Provide class for links that match alerts -.alert-link { - font-weight: $alert-link-font-weight; - color: var(--#{$prefix}alert-link-color); -} - - -// Dismissible alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissible { - padding-right: $alert-dismissible-padding-r; - - // Adjust close link position - .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: $stretched-link-z-index + 1; - padding: $alert-padding-y * 1.25 $alert-padding-x; - } -} - - -// scss-docs-start alert-modifiers -// Generate contextual modifier classes for colorizing the alert -@each $state in map-keys($theme-colors) { - .alert-#{$state} { - --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); - --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); - --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); - --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); - } -} -// scss-docs-end alert-modifiers diff --git a/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_badge.scss b/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_badge.scss deleted file mode 100644 index cc3d269..0000000 --- a/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_badge.scss +++ /dev/null @@ -1,38 +0,0 @@ -// Base class -// -// Requires one of the contextual, color modifier classes for `color` and -// `background-color`. - -.badge { - // scss-docs-start badge-css-vars - --#{$prefix}badge-padding-x: #{$badge-padding-x}; - --#{$prefix}badge-padding-y: #{$badge-padding-y}; - @include rfs($badge-font-size, --#{$prefix}badge-font-size); - --#{$prefix}badge-font-weight: #{$badge-font-weight}; - --#{$prefix}badge-color: #{$badge-color}; - --#{$prefix}badge-border-radius: #{$badge-border-radius}; - // scss-docs-end badge-css-vars - - display: inline-block; - padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x); - @include font-size(var(--#{$prefix}badge-font-size)); - font-weight: var(--#{$prefix}badge-font-weight); - line-height: 1; - color: var(--#{$prefix}badge-color); - text-align: center; - white-space: nowrap; - vertical-align: baseline; - @include border-radius(var(--#{$prefix}badge-border-radius)); - @include gradient-bg(); - - // Empty badges collapse automatically - &:empty { - display: none; - } -} - -// Quick fix for badges in buttons -.btn .badge { - position: relative; - top: -1px; -} diff --git a/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss b/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss deleted file mode 100644 index b8252ff..0000000 --- a/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss +++ /dev/null @@ -1,40 +0,0 @@ -.breadcrumb { - // scss-docs-start breadcrumb-css-vars - --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x}; - --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y}; - --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom}; - @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size); - --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg}; - --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius}; - --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color}; - --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x}; - --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color}; - // scss-docs-end breadcrumb-css-vars - - display: flex; - flex-wrap: wrap; - padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x); - margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom); - @include font-size(var(--#{$prefix}breadcrumb-font-size)); - list-style: none; - background-color: var(--#{$prefix}breadcrumb-bg); - @include border-radius(var(--#{$prefix}breadcrumb-border-radius)); -} - -.breadcrumb-item { - // The separator between breadcrumbs (by default, a forward-slash: "/") - + .breadcrumb-item { - padding-left: var(--#{$prefix}breadcrumb-item-padding-x); - - &::before { - float: left; // Suppress inline spacings and underlining of the separator - padding-right: var(--#{$prefix}breadcrumb-item-padding-x); - color: var(--#{$prefix}breadcrumb-divider-color); - content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; - } - } - - &.active { - color: var(--#{$prefix}breadcrumb-item-active-color); - } -} diff --git a/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_button-group.scss b/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_button-group.scss deleted file mode 100644 index 78e1252..0000000 --- a/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_button-group.scss +++ /dev/null @@ -1,147 +0,0 @@ -// Make the div behave like a button -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; // match .btn alignment given font-size hack above - - > .btn { - position: relative; - flex: 1 1 auto; - } - - // Bring the hover, focused, and "active" buttons to the front to overlay - // the borders properly - > .btn-check:checked + .btn, - > .btn-check:focus + .btn, - > .btn:hover, - > .btn:focus, - > .btn:active, - > .btn.active { - z-index: 1; - } -} - -// Optional: Group multiple button groups together for a toolbar -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; - - .input-group { - width: auto; - } -} - -.btn-group { - @include border-radius($btn-border-radius); - - // Prevent double borders when buttons are next to each other - > :not(.btn-check:first-child) + .btn, - > .btn-group:not(:first-child) { - margin-left: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn.dropdown-toggle-split:first-child, - > .btn-group:not(:last-child) > .btn { - @include border-end-radius(0); - } - - // The left radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-start-radius(0); - } -} - -// Sizing -// -// Remix the default button sizing classes into new ones for easier manipulation. - -.btn-group-sm > .btn { @extend .btn-sm; } -.btn-group-lg > .btn { @extend .btn-lg; } - - -// -// Split button dropdowns -// - -.dropdown-toggle-split { - padding-right: $btn-padding-x * .75; - padding-left: $btn-padding-x * .75; - - &::after, - .dropup &::after, - .dropend &::after { - margin-left: 0; - } - - .dropstart &::before { - margin-right: 0; - } -} - -.btn-sm + .dropdown-toggle-split { - padding-right: $btn-padding-x-sm * .75; - padding-left: $btn-padding-x-sm * .75; -} - -.btn-lg + .dropdown-toggle-split { - padding-right: $btn-padding-x-lg * .75; - padding-left: $btn-padding-x-lg * .75; -} - - -// The clickable button for toggling the menu -// Set the same inset shadow as the :active state -.btn-group.show .dropdown-toggle { - @include box-shadow($btn-active-box-shadow); - - // Show no shadow for `.btn-link` since it has no other button styles. - &.btn-link { - @include box-shadow(none); - } -} - - -// -// Vertical button groups -// - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; - - > .btn, - > .btn-group { - width: 100%; - } - - > .btn:not(:first-child), - > .btn-group:not(:first-child) { - margin-top: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn-group:not(:last-child) > .btn { - @include border-bottom-radius(0); - } - - // The top radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-top-radius(0); - } -} diff --git a/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_buttons.scss b/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_buttons.scss deleted file mode 100644 index caa4518..0000000 --- a/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_buttons.scss +++ /dev/null @@ -1,216 +0,0 @@ -// -// Base styles -// - -.btn { - // scss-docs-start btn-css-vars - --#{$prefix}btn-padding-x: #{$btn-padding-x}; - --#{$prefix}btn-padding-y: #{$btn-padding-y}; - --#{$prefix}btn-font-family: #{$btn-font-family}; - @include rfs($btn-font-size, --#{$prefix}btn-font-size); - --#{$prefix}btn-font-weight: #{$btn-font-weight}; - --#{$prefix}btn-line-height: #{$btn-line-height}; - --#{$prefix}btn-color: #{$btn-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-width: #{$btn-border-width}; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-border-radius: #{$btn-border-radius}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-box-shadow: #{$btn-box-shadow}; - --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity}; - --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5); - // scss-docs-end btn-css-vars - - display: inline-block; - padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x); - font-family: var(--#{$prefix}btn-font-family); - @include font-size(var(--#{$prefix}btn-font-size)); - font-weight: var(--#{$prefix}btn-font-weight); - line-height: var(--#{$prefix}btn-line-height); - color: var(--#{$prefix}btn-color); - text-align: center; - text-decoration: if($link-decoration == none, null, none); - white-space: $btn-white-space; - vertical-align: middle; - cursor: if($enable-button-pointers, pointer, null); - user-select: none; - border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color); - @include border-radius(var(--#{$prefix}btn-border-radius)); - @include gradient-bg(var(--#{$prefix}btn-bg)); - @include box-shadow(var(--#{$prefix}btn-box-shadow)); - @include transition($btn-transition); - - &:hover { - color: var(--#{$prefix}btn-hover-color); - text-decoration: if($link-hover-decoration == underline, none, null); - background-color: var(--#{$prefix}btn-hover-bg); - border-color: var(--#{$prefix}btn-hover-border-color); - } - - .btn-check + &:hover { - // override for the checkbox/radio buttons - color: var(--#{$prefix}btn-color); - background-color: var(--#{$prefix}btn-bg); - border-color: var(--#{$prefix}btn-border-color); - } - - &:focus-visible { - color: var(--#{$prefix}btn-hover-color); - @include gradient-bg(var(--#{$prefix}btn-hover-bg)); - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:focus-visible + & { - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:checked + &, - :not(.btn-check) + &:active, - &:first-child:active, - &.active, - &.show { - color: var(--#{$prefix}btn-active-color); - background-color: var(--#{$prefix}btn-active-bg); - // Remove CSS gradients if they're enabled - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-active-border-color); - @include box-shadow(var(--#{$prefix}btn-active-shadow)); - - &:focus-visible { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - } - - .btn-check:checked:focus-visible + & { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - &:disabled, - &.disabled, - fieldset:disabled & { - color: var(--#{$prefix}btn-disabled-color); - pointer-events: none; - background-color: var(--#{$prefix}btn-disabled-bg); - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-disabled-border-color); - opacity: var(--#{$prefix}btn-disabled-opacity); - @include box-shadow(none); - } -} - - -// -// Alternate buttons -// - -// scss-docs-start btn-variant-loops -@each $color, $value in $theme-colors { - .btn-#{$color} { - @if $color == "light" { - @include button-variant( - $value, - $value, - $hover-background: shade-color($value, $btn-hover-bg-shade-amount), - $hover-border: shade-color($value, $btn-hover-border-shade-amount), - $active-background: shade-color($value, $btn-active-bg-shade-amount), - $active-border: shade-color($value, $btn-active-border-shade-amount) - ); - } @else if $color == "dark" { - @include button-variant( - $value, - $value, - $hover-background: tint-color($value, $btn-hover-bg-tint-amount), - $hover-border: tint-color($value, $btn-hover-border-tint-amount), - $active-background: tint-color($value, $btn-active-bg-tint-amount), - $active-border: tint-color($value, $btn-active-border-tint-amount) - ); - } @else { - @include button-variant($value, $value); - } - } -} - -@each $color, $value in $theme-colors { - .btn-outline-#{$color} { - @include button-outline-variant($value); - } -} -// scss-docs-end btn-variant-loops - - -// -// Link buttons -// - -// Make a button look and behave like a link -.btn-link { - --#{$prefix}btn-font-weight: #{$font-weight-normal}; - --#{$prefix}btn-color: #{$btn-link-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-hover-color: #{$btn-link-hover-color}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-active-color: #{$btn-link-hover-color}; - --#{$prefix}btn-active-border-color: transparent; - --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color}; - --#{$prefix}btn-disabled-border-color: transparent; - --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows - --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb}; - - text-decoration: $link-decoration; - @if $enable-gradients { - background-image: none; - } - - &:hover, - &:focus-visible { - text-decoration: $link-hover-decoration; - } - - &:focus-visible { - color: var(--#{$prefix}btn-color); - } - - &:hover { - color: var(--#{$prefix}btn-hover-color); - } - - // No need for an active state here -} - - -// -// Button Sizes -// - -.btn-lg { - @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); -} - -.btn-sm { - @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); -} diff --git a/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_card.scss b/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_card.scss deleted file mode 100644 index dcebe6a..0000000 --- a/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_card.scss +++ /dev/null @@ -1,238 +0,0 @@ -// -// Base styles -// - -.card { - // scss-docs-start card-css-vars - --#{$prefix}card-spacer-y: #{$card-spacer-y}; - --#{$prefix}card-spacer-x: #{$card-spacer-x}; - --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y}; - --#{$prefix}card-title-color: #{$card-title-color}; - --#{$prefix}card-subtitle-color: #{$card-subtitle-color}; - --#{$prefix}card-border-width: #{$card-border-width}; - --#{$prefix}card-border-color: #{$card-border-color}; - --#{$prefix}card-border-radius: #{$card-border-radius}; - --#{$prefix}card-box-shadow: #{$card-box-shadow}; - --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius}; - --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y}; - --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x}; - --#{$prefix}card-cap-bg: #{$card-cap-bg}; - --#{$prefix}card-cap-color: #{$card-cap-color}; - --#{$prefix}card-height: #{$card-height}; - --#{$prefix}card-color: #{$card-color}; - --#{$prefix}card-bg: #{$card-bg}; - --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding}; - --#{$prefix}card-group-margin: #{$card-group-margin}; - // scss-docs-end card-css-vars - - position: relative; - display: flex; - flex-direction: column; - min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 - height: var(--#{$prefix}card-height); - color: var(--#{$prefix}body-color); - word-wrap: break-word; - background-color: var(--#{$prefix}card-bg); - background-clip: border-box; - border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - @include border-radius(var(--#{$prefix}card-border-radius)); - @include box-shadow(var(--#{$prefix}card-box-shadow)); - - > hr { - margin-right: 0; - margin-left: 0; - } - - > .list-group { - border-top: inherit; - border-bottom: inherit; - - &:first-child { - border-top-width: 0; - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); - } - - &:last-child { - border-bottom-width: 0; - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); - } - } - - // Due to specificity of the above selector (`.card > .list-group`), we must - // use a child selector here to prevent double borders. - > .card-header + .list-group, - > .list-group + .card-footer { - border-top: 0; - } -} - -.card-body { - // Enable `flex-grow: 1` for decks and groups so that card blocks take up - // as much space as possible, ensuring footers are aligned to the bottom. - flex: 1 1 auto; - padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x); - color: var(--#{$prefix}card-color); -} - -.card-title { - margin-bottom: var(--#{$prefix}card-title-spacer-y); - color: var(--#{$prefix}card-title-color); -} - -.card-subtitle { - margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list - margin-bottom: 0; - color: var(--#{$prefix}card-subtitle-color); -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link { - &:hover { - text-decoration: if($link-hover-decoration == underline, none, null); - } - - + .card-link { - margin-left: var(--#{$prefix}card-spacer-x); - } -} - -// -// Optional textual caps -// - -.card-header { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - margin-bottom: 0; // Removes the default margin-bottom of - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:first-child { - @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0); - } -} - -.card-footer { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:last-child { - @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius)); - } -} - - -// -// Header navs -// - -.card-header-tabs { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - border-bottom: 0; - - .nav-link.active { - background-color: var(--#{$prefix}card-bg); - border-bottom-color: var(--#{$prefix}card-bg); - } -} - -.card-header-pills { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list -} - -// Card image -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: var(--#{$prefix}card-img-overlay-padding); - @include border-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch -} - -.card-img, -.card-img-top { - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-bottom { - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); -} - - -// -// Card groups -// - -.card-group { - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - margin-bottom: var(--#{$prefix}card-group-margin); - } - - @include media-breakpoint-up(sm) { - display: flex; - flex-flow: row wrap; - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - flex: 1 0 0; - margin-bottom: 0; - - + .card { - margin-left: 0; - border-left: 0; - } - - // Handle rounded corners - @if $enable-rounded { - &:not(:last-child) { - @include border-end-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-right-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-right-radius: 0; - } - } - - &:not(:first-child) { - @include border-start-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-left-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-left-radius: 0; - } - } - } - } - } -} diff --git a/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_carousel.scss b/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_carousel.scss deleted file mode 100644 index 5ebf6b1..0000000 --- a/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_carousel.scss +++ /dev/null @@ -1,226 +0,0 @@ -// Notes on the classes: -// -// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) -// even when their scroll action started on a carousel, but for compatibility (with Firefox) -// we're preventing all actions instead -// 2. The .carousel-item-start and .carousel-item-end is used to indicate where -// the active slide is heading. -// 3. .active.carousel-item is the current slide. -// 4. .active.carousel-item-start and .active.carousel-item-end is the current -// slide in its in-transition state. Only one of these occurs at a time. -// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end -// is the upcoming slide in transition. - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; - @include clearfix(); -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - @include transition($carousel-transition); -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); -} - - -// -// Alternate transitions -// - -.carousel-fade { - .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; - } - - .carousel-item.active, - .carousel-item-next.carousel-item-start, - .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; - } - - .active.carousel-item-start, - .active.carousel-item-end { - z-index: 0; - opacity: 0; - @include transition(opacity 0s $carousel-transition-duration); - } -} - - -// -// Left/right controls for nav -// - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - // Use flex for alignment (1-3) - display: flex; // 1. allow flex styles - align-items: center; // 2. vertically center contents - justify-content: center; // 3. horizontally center contents - width: $carousel-control-width; - padding: 0; - color: $carousel-control-color; - text-align: center; - background: none; - filter: var(--#{$prefix}carousel-control-icon-filter); - border: 0; - opacity: $carousel-control-opacity; - @include transition($carousel-control-transition); - - // Hover/focus state - &:hover, - &:focus { - color: $carousel-control-color; - text-decoration: none; - outline: 0; - opacity: $carousel-control-hover-opacity; - } -} -.carousel-control-prev { - left: 0; - background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); -} -.carousel-control-next { - right: 0; - background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); -} - -// Icons for within -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: $carousel-control-icon-width; - height: $carousel-control-icon-width; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; -} - -.carousel-control-prev-icon { - background-image: escape-svg($carousel-control-prev-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-next-icon-bg) + "*/"}; -} -.carousel-control-next-icon { - background-image: escape-svg($carousel-control-next-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-prev-icon-bg) + "*/"}; -} - -// Optional indicator pips/controls -// -// Add a container (such as a list) with the following class and add an item (ideally a focusable control, -// like a button) with data-bs-target for each slide your carousel holds. - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - // Use the .carousel-control's width as margin so we don't overlay those - margin-right: $carousel-control-width; - margin-bottom: 1rem; - margin-left: $carousel-control-width; - - [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: $carousel-indicator-width; - height: $carousel-indicator-height; - padding: 0; - margin-right: $carousel-indicator-spacer; - margin-left: $carousel-indicator-spacer; - text-indent: -999px; - cursor: pointer; - background-color: var(--#{$prefix}carousel-indicator-active-bg); - background-clip: padding-box; - border: 0; - // Use transparent borders to increase the hit area by 10px on top and bottom. - border-top: $carousel-indicator-hit-area-height solid transparent; - border-bottom: $carousel-indicator-hit-area-height solid transparent; - opacity: $carousel-indicator-opacity; - @include transition($carousel-indicator-transition); - } - - .active { - opacity: $carousel-indicator-active-opacity; - } -} - - -// Optional captions -// -// - -.carousel-caption { - position: absolute; - right: (100% - $carousel-caption-width) * .5; - bottom: $carousel-caption-spacer; - left: (100% - $carousel-caption-width) * .5; - padding-top: $carousel-caption-padding-y; - padding-bottom: $carousel-caption-padding-y; - color: var(--#{$prefix}carousel-caption-color); - text-align: center; -} - -// Dark mode carousel - -@mixin carousel-dark() { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg-dark}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color-dark}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter-dark}; -} - -.carousel-dark { - @include carousel-dark(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include carousel-dark(); - } -} diff --git a/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_close.scss b/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_close.scss deleted file mode 100644 index d53c96f..0000000 --- a/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_close.scss +++ /dev/null @@ -1,66 +0,0 @@ -// Transparent background and border properties included for button version. -// iOS requires the button element instead of an anchor tag. -// If you want the anchor version, it requires `href="#"`. -// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile - -.btn-close { - // scss-docs-start close-css-vars - --#{$prefix}btn-close-color: #{$btn-close-color}; - --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) }; - --#{$prefix}btn-close-opacity: #{$btn-close-opacity}; - --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity}; - --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow}; - --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity}; - --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity}; - // scss-docs-end close-css-vars - - box-sizing: content-box; - width: $btn-close-width; - height: $btn-close-height; - padding: $btn-close-padding-y $btn-close-padding-x; - color: var(--#{$prefix}btn-close-color); - background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements - filter: var(--#{$prefix}btn-close-filter); - border: 0; // for button elements - @include border-radius(); - opacity: var(--#{$prefix}btn-close-opacity); - - // Override 's hover style - &:hover { - color: var(--#{$prefix}btn-close-color); - text-decoration: none; - opacity: var(--#{$prefix}btn-close-hover-opacity); - } - - &:focus { - outline: 0; - box-shadow: var(--#{$prefix}btn-close-focus-shadow); - opacity: var(--#{$prefix}btn-close-focus-opacity); - } - - &:disabled, - &.disabled { - pointer-events: none; - user-select: none; - opacity: var(--#{$prefix}btn-close-disabled-opacity); - } -} - -@mixin btn-close-white() { - --#{$prefix}btn-close-filter: #{$btn-close-filter-dark}; -} - -.btn-close-white { - @include btn-close-white(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}btn-close-filter: #{$btn-close-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include btn-close-white(); - } -} diff --git a/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_containers.scss b/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_containers.scss deleted file mode 100644 index 83b3138..0000000 --- a/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_containers.scss +++ /dev/null @@ -1,41 +0,0 @@ -// Container widths -// -// Set the container width, and override it for fixed navbars in media queries. - -@if $enable-container-classes { - // Single container class with breakpoint max-widths - .container, - // 100% wide container at all breakpoints - .container-fluid { - @include make-container(); - } - - // Responsive containers that are 100% wide until a breakpoint - @each $breakpoint, $container-max-width in $container-max-widths { - .container-#{$breakpoint} { - @extend .container-fluid; - } - - @include media-breakpoint-up($breakpoint, $grid-breakpoints) { - %responsive-container-#{$breakpoint} { - max-width: $container-max-width; - } - - // Extend each breakpoint which is smaller or equal to the current breakpoint - $extend-breakpoint: true; - - @each $name, $width in $grid-breakpoints { - @if ($extend-breakpoint) { - .container#{breakpoint-infix($name, $grid-breakpoints)} { - @extend %responsive-container-#{$breakpoint}; - } - - // Once the current breakpoint is reached, stop extending - @if ($breakpoint == $name) { - $extend-breakpoint: false; - } - } - } - } - } -} diff --git a/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_dropdown.scss b/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_dropdown.scss deleted file mode 100644 index 587ebb4..0000000 --- a/webseite-gulp-ts/frontend/dev/scss/01_frameworks/bootstrap-5.3.8/_dropdown.scss +++ /dev/null @@ -1,250 +0,0 @@ -// The dropdown wrapper (`
      `) -.dropup, -.dropend, -.dropdown, -.dropstart, -.dropup-center, -.dropdown-center { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; - - // Generate the caret automatically - @include caret(); -} - -// The dropdown menu -.dropdown-menu { - // scss-docs-start dropdown-css-vars - --#{$prefix}dropdown-zindex: #{$zindex-dropdown}; - --#{$prefix}dropdown-min-width: #{$dropdown-min-width}; - --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x}; - --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y}; - --#{$prefix}dropdown-spacer: #{$dropdown-spacer}; - @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size); - --#{$prefix}dropdown-color: #{$dropdown-color}; - --#{$prefix}dropdown-bg: #{$dropdown-bg}; - --#{$prefix}dropdown-border-color: #{$dropdown-border-color}; - --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius}; - --#{$prefix}dropdown-border-width: #{$dropdown-border-width}; - --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius}; - --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg}; - --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y}; - --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow}; - --#{$prefix}dropdown-link-color: #{$dropdown-link-color}; - --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color}; - --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg}; - --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color}; - --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg}; - --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color}; - --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x}; - --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y}; - --#{$prefix}dropdown-header-color: #{$dropdown-header-color}; - --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x}; - --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y}; - // scss-docs-end dropdown-css-vars - - position: absolute; - z-index: var(--#{$prefix}dropdown-zindex); - display: none; // none by default, but block on "open" of the menu - min-width: var(--#{$prefix}dropdown-min-width); - padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x); - margin: 0; // Override default margin of ul - @include font-size(var(--#{$prefix}dropdown-font-size)); - color: var(--#{$prefix}dropdown-color); - text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) - list-style: none; - background-color: var(--#{$prefix}dropdown-bg); - background-clip: padding-box; - border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color); - @include border-radius(var(--#{$prefix}dropdown-border-radius)); - @include box-shadow(var(--#{$prefix}dropdown-box-shadow)); - - &[data-bs-popper] { - top: 100%; - left: 0; - margin-top: var(--#{$prefix}dropdown-spacer); - } - - @if $dropdown-padding-y == 0 { - > .dropdown-item:first-child, - > li:first-child .dropdown-item { - @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - > .dropdown-item:last-child, - > li:last-child .dropdown-item { - @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - - } -} - -// scss-docs-start responsive-breakpoints -// We deliberately hardcode the `bs-` prefix because we check -// this custom property in JS to determine Popper's positioning - -@each $breakpoint in map-keys($grid-breakpoints) { - @include media-breakpoint-up($breakpoint) { - $infix: breakpoint-infix($breakpoint, $grid-breakpoints); - - .dropdown-menu#{$infix}-start { - --bs-position: start; - - &[data-bs-popper] { - right: auto; - left: 0; - } - } - - .dropdown-menu#{$infix}-end { - --bs-position: end; - - &[data-bs-popper] { - right: 0; - left: auto; - } - } - } -} -// scss-docs-end responsive-breakpoints - -// Allow for dropdowns to go bottom up (aka, dropup-menu) -// Just add .dropup after the standard .dropdown class and you're set. -.dropup { - .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(up); - } -} - -.dropend { - .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(end); - &::after { - vertical-align: 0; - } - } -} - -.dropstart { - .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(start); - &::before { - vertical-align: 0; - } - } -} - - -// Dividers (basically an `
      `) within the dropdown -.dropdown-divider { - height: 0; - margin: var(--#{$prefix}dropdown-divider-margin-y) 0; - overflow: hidden; - border-top: 1px solid var(--#{$prefix}dropdown-divider-bg); - opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
      element -} - -// Links, buttons, and more within the dropdown menu -// -// `
      - - - - - - {canManage && ( - - )} - - ); -}; - -export default memo(RowProduct); diff --git a/webseite-react-php-jwt/react-app/src/components/tables/content/RowUser.jsx b/webseite-react-php-jwt/react-app/src/components/tables/content/RowUser.jsx deleted file mode 100644 index f01825a..0000000 --- a/webseite-react-php-jwt/react-app/src/components/tables/content/RowUser.jsx +++ /dev/null @@ -1,16 +0,0 @@ -import { memo } from 'react'; - -const RowUser = (props) => { - const { id, username, email, created_at: createdAt = '' } = props; - - return ( - - - - - - - ); -}; - -export default memo(RowUser); diff --git a/webseite-react-php-jwt/react-app/src/docs/PLAN.md b/webseite-react-php-jwt/react-app/src/docs/PLAN.md deleted file mode 100644 index 2a6277e..0000000 --- a/webseite-react-php-jwt/react-app/src/docs/PLAN.md +++ /dev/null @@ -1,84 +0,0 @@ -# Projekt-Roadmap: Phasenplan - -Übersicht über die schrittweise Entwicklung von der lokalen Client-App bis zum modernen Next.js + Convex Stack deployed via Coolify. - ---- - -## Phasen-Übersicht - -| Phase | Fokus | Verzeichnis / Module | Stack | Hosting / Ziel | -| :---------- | :-------------------------- | :-------------------------------------------------- | :-------------------------------------------- | :------------------------------- | -| **Phase 1** | Client-Prototyp & State | `/react-app` | React + Vite, `useContext`, `useReducer` | Lokal | -| **Phase 2** | Classic Fullstack & MariaDB | `/react-server/frontend`
      `/react-server/backend` | React SPA + Slim PHP (REST API, PDO, MariaDB) | Apache Webspace / Shared Hosting | -| **Phase 3** | Modern Fullstack Rewrite | `/next-app` | Next.js (App Router, RSC/SSG) + Convex BaaS | Lokal / Staging | -| **Phase 4** | Production Deployment | `/next-app` + Infrastruktur | Coolify (Self-hosted PaaS) + Convex Cloud | VPS / Production Server | - ---- - -## Phase 1: Client-Only SPA (`/react-app`) - -**Ziel:** Schnelles Prototyping der Benutzeroberfläche und Etablierung des lokalen UI-State-Managements ohne Backend-Abhängigkeit. - -- **Stack & Setup:** - - React + Vite - - Globaler State via `useContext` und `useReducer` (zur Vermeidung von Prop Drilling und State Uplifting) - - Mock-Daten / LocalStorage für initiale Datenhaltung -- **Meilensteine:** - - [ ] Grundlegendes Layout und Komponentenstruktur aufbauen - - [ ] State-Reducer für UI- und Dummy-Datenflüsse implementieren - - [ ] Service-Layer für Datenzugriffe vorbereiten (gekapselte Mock-APIs) - ---- - -## Phase 2: Klassisches Client-Server-Modell (`/react-server`) - -**Ziel:** Anbindung einer relationalen Datenbank über eine schlanke REST-API, lauffähig auf Standard-PHP/Apache-Webspaces ohne Node-Hosting-Zwang. - -- **Struktur:** - - `/react-server/frontend`: Die React-App aus Phase 1 (Vite Build / statisches Bundle in `dist/`) - - `/react-server/backend`: Schlanke PHP-Schnittstelle -- **Stack & Setup:** - - Backend: Slim Framework (PHP) + PDO - - Datenbank: MariaDB / MySQL - - Routing & Server: Apache `.htaccess` (URL-Rewriting für Slim & SPA-Routing) - - CORS-Middleware für lokale Entwicklung -- **Meilensteine:** - - [ ] MariaDB-Datenbankschema erstellen - - [ ] REST-Endpunkte in Slim PHP anlegen (`GET`, `POST`, `PUT`, `DELETE`) - - [ ] Frontend-API-Services von Mock-Daten auf HTTP-Requests (`fetch`) umstellen - - [ ] Deployment auf klassischem Apache-Webspace testen - ---- - -## Phase 3: Modern Stack Rewrite & Vibe Coding (`/next-app`) - -**Ziel:** Kompletter Neuaufbau mit moderner Architektur, nativer SEO-Unterstützung und reaktiver Echtzeit-Datenbank. - -- **Stack & Setup:** - - Next.js (App Router, React Server Components, SSG) - - Convex (BaaS, Schema-Validierung, WebSocket-Echtzeit, Server Functions) - - SEO: `sitemap.ts`, `robots.ts`, native `generateMetadata`-API -- **Meilensteine:** - - [ ] Neues Next.js-Projekt aufsetzen (`/next-app`) - - [ ] `convex/schema.ts` definieren (Übernahme der Datenstruktur aus MariaDB) - - [ ] Convex Backend Functions (Queries & Mutations) implementieren - - [ ] UI-Komponenten auf Next.js App Router und Convex-Hooks (`useQuery`, `useMutation`) portieren - - [ ] Statische Seiten / SSG für suchmaschinenrelevante Bereiche konfigurieren - ---- - -## Phase 4: Deployment & Infrastruktur mit Coolify - -**Ziel:** Automatisiertes, wartungsarmes Hosting der Next.js-Applikation über eine eigene Coolify-Instanz. - -- **Stack & Setup:** - - Coolify (Self-hosted PaaS via Docker auf VPS) - - Next.js Standalone Build - - Convex Cloud / Self-Hosted Backend Connection - - Automatisches Git-Deployment (Webhooks, CI/CD) -- **Meilensteine:** - - [ ] `output: "standalone"` in `next.config.js` konfigurieren - - [ ] Dockerfile für Next.js optimieren (Multi-Stage Build für geringe Image-Größe) - - [ ] Applikation in Coolify als Service / Git-Repository verknüpfen - - [ ] Environment Variables einrichten (`CONVEX_DEPLOYMENT`, `NEXT_PUBLIC_CONVEX_URL`, etc.) - - [ ] SSL-Zertifikate, Domain-Routing und Health-Checks in Coolify verifizieren diff --git a/webseite-react-php-jwt/react-app/src/main.jsx b/webseite-react-php-jwt/react-app/src/main.jsx deleted file mode 100644 index 5df8118..0000000 --- a/webseite-react-php-jwt/react-app/src/main.jsx +++ /dev/null @@ -1,16 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; -import { BrowserRouter } from 'react-router-dom'; - -import './styles/main.scss'; -import 'bootstrap'; - -import App from './App.jsx'; - -createRoot(document.getElementById('root')).render( - - - - - -); diff --git a/webseite-react-php-jwt/react-app/src/pages/AboutPage.jsx b/webseite-react-php-jwt/react-app/src/pages/AboutPage.jsx deleted file mode 100644 index 3c843dc..0000000 --- a/webseite-react-php-jwt/react-app/src/pages/AboutPage.jsx +++ /dev/null @@ -1,14 +0,0 @@ -const AboutPage = () => { - return ( -
      -
      -

      About us

      -

      - Lorem ipsum dolor sit amet consectetur adipisicing elit. Qui rerum, fugit ipsa optio laboriosam sed est quae - explicabo! Reiciendis, iure soluta ad libero esse cupiditate pariatur nostrum accusantium! Obcaecati, in. -

      -
      -
      - ); -}; -export default AboutPage; diff --git a/webseite-react-php-jwt/react-app/src/pages/ContactPage.jsx b/webseite-react-php-jwt/react-app/src/pages/ContactPage.jsx deleted file mode 100644 index 79c2bb3..0000000 --- a/webseite-react-php-jwt/react-app/src/pages/ContactPage.jsx +++ /dev/null @@ -1,11 +0,0 @@ -const ContactPage = () => { - return ( -
      -
      -

      Contact

      -

      Lorem ipsum dolor sit amet consectetur

      -
      -
      - ); -}; -export default ContactPage; diff --git a/webseite-react-php-jwt/react-app/src/pages/HomePage.jsx b/webseite-react-php-jwt/react-app/src/pages/HomePage.jsx deleted file mode 100644 index 36cb7fd..0000000 --- a/webseite-react-php-jwt/react-app/src/pages/HomePage.jsx +++ /dev/null @@ -1,10 +0,0 @@ -const HomePage = () => { - return ( -
      -
      -

      Hello from SPA!

      -
      -
      - ); -}; -export default HomePage; diff --git a/webseite-react-php-jwt/react-app/src/pages/ProjectsPage.jsx b/webseite-react-php-jwt/react-app/src/pages/ProjectsPage.jsx deleted file mode 100644 index 3564b62..0000000 --- a/webseite-react-php-jwt/react-app/src/pages/ProjectsPage.jsx +++ /dev/null @@ -1,10 +0,0 @@ -import { Outlet } from 'react-router-dom'; - -const ProjectsPage = () => { - return ( -
      - -
      - ); -}; -export default ProjectsPage; diff --git a/webseite-react-php-jwt/react-app/src/pages/projects/TableProductsPage.jsx b/webseite-react-php-jwt/react-app/src/pages/projects/TableProductsPage.jsx deleted file mode 100644 index d8de4aa..0000000 --- a/webseite-react-php-jwt/react-app/src/pages/projects/TableProductsPage.jsx +++ /dev/null @@ -1,15 +0,0 @@ -import TableProducts from '../../components/tables/TableProducts'; - -const TableProductsPage = () => { - return ( -
      -
      -

      Table Products

      -

      Produkte öffentlich sichtbar – Bearbeiten und Löschen nur nach Login

      - -
      -
      - ); -}; - -export default TableProductsPage; diff --git a/webseite-react-php-jwt/react-app/src/pages/projects/TableUsersPage.jsx b/webseite-react-php-jwt/react-app/src/pages/projects/TableUsersPage.jsx deleted file mode 100644 index c797c47..0000000 --- a/webseite-react-php-jwt/react-app/src/pages/projects/TableUsersPage.jsx +++ /dev/null @@ -1,15 +0,0 @@ -import TableUsers from '../../components/tables/TableUsers'; - -const TableUsersPage = () => { - return ( -
      -
      -

      Table Users

      -

      Benutzer aus der Slim REST API

      - -
      -
      - ); -}; - -export default TableUsersPage; diff --git a/webseite-react-php-jwt/react-app/src/routes/Router.jsx b/webseite-react-php-jwt/react-app/src/routes/Router.jsx deleted file mode 100644 index ad2d501..0000000 --- a/webseite-react-php-jwt/react-app/src/routes/Router.jsx +++ /dev/null @@ -1,23 +0,0 @@ -import { Route, Routes } from 'react-router-dom'; -import HomePage from '../pages/HomePage'; -import AboutPage from '../pages/AboutPage'; -import ContactPage from '../pages/ContactPage'; -import ProjectsPage from '../pages/ProjectsPage'; -import TableProductsPage from '../pages/projects/TableProductsPage'; -import TableUsersPage from '../pages/projects/TableUsersPage'; - -const Router = () => { - return ( - - } /> - } /> - - }> - } /> - } /> - - } /> - - ); -}; -export default Router; diff --git a/webseite-react-php-jwt/react-app/src/stores/auth/AuthStore.jsx b/webseite-react-php-jwt/react-app/src/stores/auth/AuthStore.jsx deleted file mode 100644 index a86df00..0000000 --- a/webseite-react-php-jwt/react-app/src/stores/auth/AuthStore.jsx +++ /dev/null @@ -1,127 +0,0 @@ -import { - createContext, - useCallback, - useContext, - useEffect, - useLayoutEffect, - useMemo, - useReducer, -} from 'react'; - -import { setAuthToken, setOnUnauthorized } from '../http'; -import { fetchMe, getApiErrorMessage, loginRequest, logoutRequest } from './api'; -import { createInitialState, persistAuth } from './initialState'; -import { AUTH_ACTIONS, authReducer } from './reducer'; - -const AuthStateContext = createContext(null); -const AuthActionsContext = createContext(null); - -export const AuthProvider = (props) => { - const { children } = props; - const [state, dispatch] = useReducer(authReducer, undefined, createInitialState); - - useLayoutEffect(() => { - setAuthToken(state.token); - }, [state.token]); - - useEffect(() => { - persistAuth(state.user, state.token); - }, [state.user, state.token]); - - useEffect(() => { - return setOnUnauthorized(() => { - persistAuth(null, null); - dispatch({ type: AUTH_ACTIONS.CLEAR }); - }); - }, []); - - useEffect(() => { - if (!state.token) { - return undefined; - } - - const controller = new AbortController(); - - const restore = async () => { - try { - const user = await fetchMe({ signal: controller.signal }); - dispatch({ - type: AUTH_ACTIONS.SET_SESSION, - payload: { user, token: state.token }, - }); - } catch (error) { - if (controller.signal.aborted) { - return; - } - - setAuthToken(null); - persistAuth(null, null); - dispatch({ type: AUTH_ACTIONS.CLEAR }); - } - }; - - restore(); - - return () => { - controller.abort(); - }; - }, []); - - const login = useCallback(async (username, password) => { - dispatch({ type: AUTH_ACTIONS.SET_LOADING, payload: true }); - - try { - const session = await loginRequest(username, password); - setAuthToken(session.token); - dispatch({ type: AUTH_ACTIONS.SET_SESSION, payload: session }); - return session.user; - } catch (error) { - const status = error.response?.status; - const message = - status === 401 ? 'Benutzername oder Passwort ist falsch' : getApiErrorMessage(error); - - dispatch({ type: AUTH_ACTIONS.SET_ERROR, payload: message }); - throw error; - } - }, []); - - const logout = useCallback(async () => { - try { - await logoutRequest(); - } catch { - // Session lokal trotzdem beenden - } finally { - setAuthToken(null); - persistAuth(null, null); - dispatch({ type: AUTH_ACTIONS.CLEAR }); - } - }, []); - - const actions = useMemo(() => ({ login, logout }), [login, logout]); - - return ( - - {children} - - ); -}; - -export const useAuthState = () => { - const state = useContext(AuthStateContext); - - if (state == null) { - throw new Error('useAuthState muss innerhalb von AuthProvider verwendet werden'); - } - - return state; -}; - -export const useAuthActions = () => { - const actions = useContext(AuthActionsContext); - - if (actions == null) { - throw new Error('useAuthActions muss innerhalb von AuthProvider verwendet werden'); - } - - return actions; -}; diff --git a/webseite-react-php-jwt/react-app/src/stores/auth/api.js b/webseite-react-php-jwt/react-app/src/stores/auth/api.js deleted file mode 100644 index 65fe683..0000000 --- a/webseite-react-php-jwt/react-app/src/stores/auth/api.js +++ /dev/null @@ -1,22 +0,0 @@ -import { apiClient, getApiErrorMessage } from '../http'; - -export { getApiErrorMessage }; - -export const loginRequest = async (username, password) => { - const { data } = await apiClient.post('/login', { username, password }); - - if (!data?.user || !data?.token) { - throw new Error('Ungültige API-Antwort: Session erwartet'); - } - - return data; -}; - -export const logoutRequest = async () => { - await apiClient.post('/logout'); -}; - -export const fetchMe = async (config = {}) => { - const { data } = await apiClient.get('/me', config); - return data; -}; diff --git a/webseite-react-php-jwt/react-app/src/stores/auth/index.js b/webseite-react-php-jwt/react-app/src/stores/auth/index.js deleted file mode 100644 index 92f0b15..0000000 --- a/webseite-react-php-jwt/react-app/src/stores/auth/index.js +++ /dev/null @@ -1,4 +0,0 @@ -export { createInitialState } from './initialState'; -export { AUTH_ACTIONS, authReducer } from './reducer'; -export { AuthProvider, useAuthActions, useAuthState } from './AuthStore'; -export { fetchMe, getApiErrorMessage, loginRequest, logoutRequest } from './api'; diff --git a/webseite-react-php-jwt/react-app/src/stores/auth/initialState.js b/webseite-react-php-jwt/react-app/src/stores/auth/initialState.js deleted file mode 100644 index 99632a7..0000000 --- a/webseite-react-php-jwt/react-app/src/stores/auth/initialState.js +++ /dev/null @@ -1,38 +0,0 @@ -const STORAGE_KEY = 'nerdshop.auth'; - -export const loadStoredAuth = () => { - try { - const raw = localStorage.getItem(STORAGE_KEY); - if (!raw) { - return { user: null, token: null }; - } - - const parsed = JSON.parse(raw); - if (parsed?.token && parsed?.user) { - return { user: parsed.user, token: parsed.token }; - } - } catch { - localStorage.removeItem(STORAGE_KEY); - } - - return { user: null, token: null }; -}; - -export const persistAuth = (user, token) => { - if (user && token) { - localStorage.setItem(STORAGE_KEY, JSON.stringify({ user, token })); - } else { - localStorage.removeItem(STORAGE_KEY); - } -}; - -export const createInitialState = () => { - const stored = loadStoredAuth(); - - return { - user: stored.user, - token: stored.token, - loading: Boolean(stored.token), - error: null, - }; -}; diff --git a/webseite-react-php-jwt/react-app/src/stores/auth/reducer.js b/webseite-react-php-jwt/react-app/src/stores/auth/reducer.js deleted file mode 100644 index 0070dbf..0000000 --- a/webseite-react-php-jwt/react-app/src/stores/auth/reducer.js +++ /dev/null @@ -1,41 +0,0 @@ -export const AUTH_ACTIONS = { - SET_LOADING: 'SET_LOADING', - SET_SESSION: 'SET_SESSION', - SET_ERROR: 'SET_ERROR', - CLEAR: 'CLEAR', -}; - -export const authReducer = (state, action) => { - switch (action.type) { - case AUTH_ACTIONS.SET_LOADING: - return { - ...state, - loading: action.payload, - error: action.payload ? null : state.error, - }; - case AUTH_ACTIONS.SET_SESSION: - return { - ...state, - user: action.payload.user, - token: action.payload.token, - loading: false, - error: null, - }; - case AUTH_ACTIONS.SET_ERROR: - return { - ...state, - loading: false, - error: action.payload, - }; - case AUTH_ACTIONS.CLEAR: - return { - user: null, - token: null, - loading: false, - error: null, - }; - default: - console.warn('no action found'); - return state; - } -}; diff --git a/webseite-react-php-jwt/react-app/src/stores/http.js b/webseite-react-php-jwt/react-app/src/stores/http.js deleted file mode 100644 index adf8bb7..0000000 --- a/webseite-react-php-jwt/react-app/src/stores/http.js +++ /dev/null @@ -1,83 +0,0 @@ -import axios from 'axios'; -import { loadStoredAuth } from './auth/initialState'; - -export const apiClient = axios.create({ - baseURL: import.meta.env.VITE_API_URL ?? '/api', - timeout: 8000, - headers: { 'Content-Type': 'application/json' }, -}); - -let authToken = null; -let onUnauthorized = null; - -const isLoginRequest = (config) => { - const url = config?.url ?? ''; - return url === '/login' || url.endsWith('/login'); -}; - -const resolveAuthToken = () => authToken || loadStoredAuth().token || null; - -const applyAuthorizationHeader = (headers, token) => { - const value = `Bearer ${token}`; - - if (headers && typeof headers.set === 'function') { - headers.set('Authorization', value); - return headers; - } - - return { ...(headers || {}), Authorization: value }; -}; - -export const setAuthToken = (token) => { - authToken = token || null; - - if (authToken) { - apiClient.defaults.headers.common.Authorization = `Bearer ${authToken}`; - } else { - delete apiClient.defaults.headers.common.Authorization; - } -}; - -setAuthToken(loadStoredAuth().token); - -export const setOnUnauthorized = (handler) => { - onUnauthorized = handler; - - return () => { - if (onUnauthorized === handler) { - onUnauthorized = null; - } - }; -}; - -apiClient.interceptors.request.use((config) => { - const token = resolveAuthToken(); - - if (token && !isLoginRequest(config)) { - config.headers = applyAuthorizationHeader(config.headers, token); - } - - return config; -}); - -apiClient.interceptors.response.use( - (response) => response, - (error) => { - const status = error.response?.status; - - if (status === 401 && !isLoginRequest(error.config)) { - setAuthToken(null); - onUnauthorized?.(); - } - - return Promise.reject(error); - } -); - -export const getApiErrorMessage = (error) => { - if (axios.isCancel(error) || error.code === 'ERR_CANCELED') { - return null; - } - - return error.response?.data?.error || error.message || 'Unbekannter API-Fehler'; -}; diff --git a/webseite-react-php-jwt/react-app/src/stores/products/ProductsStore.jsx b/webseite-react-php-jwt/react-app/src/stores/products/ProductsStore.jsx deleted file mode 100644 index 7899846..0000000 --- a/webseite-react-php-jwt/react-app/src/stores/products/ProductsStore.jsx +++ /dev/null @@ -1,294 +0,0 @@ -import { - createContext, - useCallback, - useContext, - useEffect, - useMemo, - useReducer, - useRef, -} from 'react'; - -import { apiClient } from '../http'; -import { createInitialState } from './initialState'; -import { PRODUCTS_ACTIONS, productsReducer } from './reducer'; - -import { - createProduct, - deleteProduct, - fetchProducts, - getApiErrorMessage, - patchProduct, - updateProduct, -} from './api'; - -const PERSIST_DELAY_MS = 400; - -const ProductsStateContext = createContext(null); -const ProductsDispatchContext = createContext(null); -const ProductsActionsContext = createContext(null); - -export const ProductsProvider = (props) => { - const { children, items = [], autoLoad = true } = props; - - const [state, dispatch] = useReducer( - productsReducer, - items, - createInitialState, // Der 3. Parameter dient der Lazy Initialization (verzögerten/faulen Initialisierung) des States. - ); - - // Warum macht man das? - - // Performance (Expensive Calculations): Wenn die Erstellung des Ausgangszustands rechenintensiv ist (z. B. Parsen von localStorage, Filtern/Sortieren großer Arrays), wird createInitialState nur ein einziges Mal beim Mounten ausgeführt – nicht bei jedem weiteren Render. - - // Wiederverwendbarkeit: Du kannst dieselbe createInitialState-Funktion auch innerhalb deines Reducers aufrufen, um z. B. bei einer RESET-Action den State sauber auf die Ausgangswerte zurückzusetzen. - - const pendingPatches = useRef(new Map()); - const persistTimers = useRef(new Map()); - - useEffect(() => { - if (!autoLoad) { - return undefined; - } - - const controller = new AbortController(); - - const load = async () => { - dispatch({ type: PRODUCTS_ACTIONS.SET_LOADING, payload: true }); - - try { - const loadedItems = await fetchProducts({ signal: controller.signal }); - dispatch({ type: PRODUCTS_ACTIONS.SET_ITEMS, payload: loadedItems }); - } catch (error) { - if (controller.signal.aborted) { - return; - } - - dispatch({ - type: PRODUCTS_ACTIONS.SET_ERROR, - payload: getApiErrorMessage(error), - }); - } - }; - - load(); - - return () => { - controller.abort(); - }; - }, [autoLoad]); - - const loadProducts = useCallback(async () => { - dispatch({ type: PRODUCTS_ACTIONS.SET_LOADING, payload: true }); - - try { - const loadedItems = await fetchProducts(); - dispatch({ type: PRODUCTS_ACTIONS.SET_ITEMS, payload: loadedItems }); - } catch (error) { - dispatch({ - type: PRODUCTS_ACTIONS.SET_ERROR, - payload: getApiErrorMessage(error), - }); - } - }, []); - - const flushPatch = useCallback( - async (id) => { - const patch = pendingPatches.current.get(id); - pendingPatches.current.delete(id); - - if (persistTimers.current.has(id)) { - clearTimeout(persistTimers.current.get(id)); - persistTimers.current.delete(id); - } - - if (!patch || Object.keys(patch).length === 0) { - return; - } - - try { - const updated = await patchProduct(id, patch); - dispatch({ type: PRODUCTS_ACTIONS.SET_ITEM, payload: updated }); - } catch (error) { - dispatch({ - type: PRODUCTS_ACTIONS.SET_ERROR, - payload: getApiErrorMessage(error), - }); - await loadProducts(); - } - }, - [loadProducts], - ); - - const schedulePatch = useCallback( - (id, patch) => { - const merged = { ...(pendingPatches.current.get(id) || {}), ...patch }; - pendingPatches.current.set(id, merged); - - if (persistTimers.current.has(id)) { - clearTimeout(persistTimers.current.get(id)); - } - - persistTimers.current.set( - id, - setTimeout(() => { - flushPatch(id); - }, PERSIST_DELAY_MS), - ); - }, - [flushPatch], - ); - - useEffect(() => { - const timers = persistTimers.current; - const patches = pendingPatches.current; - - return () => { - timers.forEach((timer) => clearTimeout(timer)); - timers.clear(); - - patches.forEach((patch, id) => { - if ( - patch && - Object.keys(patch).length > 0 && - apiClient.defaults.headers.common.Authorization - ) { - patchProduct(id, patch).catch(() => {}); - } - }); - patches.clear(); - }; - }, []); - - const updateAmount = useCallback( - (amount, id) => { - dispatch({ - type: PRODUCTS_ACTIONS.UPDATE_AMOUNT, - payload: { id, amount }, - }); - - const stock = Number(amount); - if (Number.isFinite(stock)) { - schedulePatch(id, { stock }); - } - }, - [schedulePatch], - ); - - const updatePrice = useCallback( - (price, id) => { - dispatch({ type: PRODUCTS_ACTIONS.UPDATE_PRICE, payload: { id, price } }); - - const numericPrice = Number(price); - if (Number.isFinite(numericPrice)) { - schedulePatch(id, { price: numericPrice }); - } - }, - [schedulePatch], - ); - - const addProduct = useCallback(async (product) => { - try { - const created = await createProduct(product); - dispatch({ type: PRODUCTS_ACTIONS.ADD_ITEM, payload: created }); - return created; - } catch (error) { - dispatch({ - type: PRODUCTS_ACTIONS.SET_ERROR, - payload: getApiErrorMessage(error), - }); - throw error; - } - }, []); - - const saveProduct = useCallback(async (id, product) => { - try { - const updated = await updateProduct(id, product); - dispatch({ type: PRODUCTS_ACTIONS.SET_ITEM, payload: updated }); - return updated; - } catch (error) { - dispatch({ - type: PRODUCTS_ACTIONS.SET_ERROR, - payload: getApiErrorMessage(error), - }); - throw error; - } - }, []); - - const removeProduct = useCallback(async (id) => { - try { - await deleteProduct(id); - dispatch({ type: PRODUCTS_ACTIONS.REMOVE_ITEM, payload: id }); - } catch (error) { - dispatch({ - type: PRODUCTS_ACTIONS.SET_ERROR, - payload: getApiErrorMessage(error), - }); - throw error; - } - }, []); - - const actions = useMemo( - () => ({ - loadProducts, - updateAmount, - updatePrice, - addProduct, - saveProduct, - removeProduct, - }), - [ - loadProducts, - updateAmount, - updatePrice, - addProduct, - saveProduct, - removeProduct, - ], - ); - - return ( - - - - {children} - - - - ); -}; - -export const useProductsState = () => { - const state = useContext(ProductsStateContext); - - if (state == null) { - throw new Error( - 'useProductsState muss innerhalb von ProductsProvider verwendet werden', - ); - } - - return state; -}; - -export const useProductsDispatch = () => { - const dispatch = useContext(ProductsDispatchContext); - - if (dispatch == null) { - throw new Error( - 'useProductsDispatch muss innerhalb von ProductsProvider verwendet werden', - ); - } - - return dispatch; -}; - -export const useProductsActions = () => { - const actions = useContext(ProductsActionsContext); - - if (actions == null) { - throw new Error( - 'useProductsActions muss innerhalb von ProductsProvider verwendet werden', - ); - } - - return actions; -}; diff --git a/webseite-react-php-jwt/react-app/src/stores/products/api.js b/webseite-react-php-jwt/react-app/src/stores/products/api.js deleted file mode 100644 index 39f66c3..0000000 --- a/webseite-react-php-jwt/react-app/src/stores/products/api.js +++ /dev/null @@ -1,37 +0,0 @@ -import { apiClient, getApiErrorMessage } from '../http'; - -export { getApiErrorMessage }; - -export const fetchProducts = async (config = {}) => { - const { data } = await apiClient.get('/products', config); - - if (!Array.isArray(data)) { - throw new Error('Ungültige API-Antwort: Produktliste erwartet'); - } - - return data; -}; - -export const fetchProduct = async (id, config = {}) => { - const { data } = await apiClient.get(`/products/${id}`, config); - return data; -}; - -export const createProduct = async (product) => { - const { data } = await apiClient.post('/products', product); - return data; -}; - -export const updateProduct = async (id, product) => { - const { data } = await apiClient.put(`/products/${id}`, product); - return data; -}; - -export const patchProduct = async (id, patch) => { - const { data } = await apiClient.patch(`/products/${id}`, patch); - return data; -}; - -export const deleteProduct = async (id) => { - await apiClient.delete(`/products/${id}`); -}; diff --git a/webseite-react-php-jwt/react-app/src/stores/products/index.js b/webseite-react-php-jwt/react-app/src/stores/products/index.js deleted file mode 100644 index ae3d40e..0000000 --- a/webseite-react-php-jwt/react-app/src/stores/products/index.js +++ /dev/null @@ -1,17 +0,0 @@ -export { createInitialState } from './initialState'; -export { PRODUCTS_ACTIONS, productsReducer } from './reducer'; -export { - ProductsProvider, - useProductsActions, - useProductsDispatch, - useProductsState, -} from './ProductsStore'; -export { - createProduct, - deleteProduct, - fetchProduct, - fetchProducts, - getApiErrorMessage, - patchProduct, - updateProduct, -} from './api'; diff --git a/webseite-react-php-jwt/react-app/src/stores/products/initialState.js b/webseite-react-php-jwt/react-app/src/stores/products/initialState.js deleted file mode 100644 index 56c4cc5..0000000 --- a/webseite-react-php-jwt/react-app/src/stores/products/initialState.js +++ /dev/null @@ -1,7 +0,0 @@ -export const createInitialState = (items) => { - return { - items: items || [], - loading: true, - error: null, - }; -}; diff --git a/webseite-react-php-jwt/react-app/src/stores/products/reducer.js b/webseite-react-php-jwt/react-app/src/stores/products/reducer.js deleted file mode 100644 index 4dc6615..0000000 --- a/webseite-react-php-jwt/react-app/src/stores/products/reducer.js +++ /dev/null @@ -1,73 +0,0 @@ -export const PRODUCTS_ACTIONS = { - SET_LOADING: 'SET_LOADING', - SET_ITEMS: 'SET_ITEMS', - SET_ITEM: 'SET_ITEM', - SET_ERROR: 'SET_ERROR', - ADD_ITEM: 'ADD_ITEM', - REMOVE_ITEM: 'REMOVE_ITEM', - UPDATE_AMOUNT: 'UPDATE_AMOUNT', - UPDATE_PRICE: 'UPDATE_PRICE', -}; - -export const productsReducer = (state, action) => { - switch (action.type) { - case PRODUCTS_ACTIONS.SET_LOADING: - return { - ...state, - loading: action.payload, - error: action.payload ? null : state.error, - }; - case PRODUCTS_ACTIONS.SET_ITEMS: - return { - ...state, - items: action.payload, - loading: false, - error: null, - }; - case PRODUCTS_ACTIONS.SET_ITEM: - return { - ...state, - items: state.items.map((item) => (item._id === action.payload._id ? action.payload : item)), - error: null, - }; - case PRODUCTS_ACTIONS.SET_ERROR: - return { - ...state, - loading: false, - error: action.payload, - }; - case PRODUCTS_ACTIONS.ADD_ITEM: - return { - ...state, - items: [...state.items, action.payload], - error: null, - }; - case PRODUCTS_ACTIONS.REMOVE_ITEM: - return { - ...state, - items: state.items.filter((item) => item._id !== action.payload), - error: null, - }; - case PRODUCTS_ACTIONS.UPDATE_AMOUNT: - return { - ...state, - items: state.items.map((item) => - item._id === action.payload.id - ? { ...item, stock: action.payload.amount } // - : item - ), - }; - case PRODUCTS_ACTIONS.UPDATE_PRICE: - return { - ...state, - items: state.items.map((item) => - item._id === action.payload.id - ? { ...item, price: action.payload.price } // - : item - ), - }; - default: - console.warn('no action found'); - return state; - } -}; diff --git a/webseite-react-php-jwt/react-app/src/stores/users/UsersStore.jsx b/webseite-react-php-jwt/react-app/src/stores/users/UsersStore.jsx deleted file mode 100644 index 192e685..0000000 --- a/webseite-react-php-jwt/react-app/src/stores/users/UsersStore.jsx +++ /dev/null @@ -1,72 +0,0 @@ -import { createContext, useCallback, useContext, useEffect, useMemo, useReducer } from 'react'; - -import { useAuthState } from '../auth'; -import { fetchUsers, getApiErrorMessage } from './api'; -import { createInitialState } from './initialState'; -import { USERS_ACTIONS, usersReducer } from './reducer'; - -const UsersStateContext = createContext(null); -const UsersActionsContext = createContext(null); - -export const UsersProvider = (props) => { - const { children, items = [], autoLoad = true } = props; - const { token } = useAuthState(); - const [state, dispatch] = useReducer(usersReducer, items, createInitialState); - - const loadUsers = useCallback(async (signal) => { - dispatch({ type: USERS_ACTIONS.SET_LOADING, payload: true }); - - try { - const loadedItems = await fetchUsers(signal ? { signal } : {}); - dispatch({ type: USERS_ACTIONS.SET_ITEMS, payload: loadedItems }); - } catch (error) { - const message = getApiErrorMessage(error); - if (message == null) { - return; - } - - dispatch({ type: USERS_ACTIONS.SET_ERROR, payload: message }); - } - }, []); - - useEffect(() => { - if (!autoLoad || !token) { - return undefined; - } - - const controller = new AbortController(); - loadUsers(controller.signal); - - return () => { - controller.abort(); - }; - }, [autoLoad, token, loadUsers]); - - const actions = useMemo(() => ({ loadUsers: () => loadUsers() }), [loadUsers]); - - return ( - - {children} - - ); -}; - -export const useUsersState = () => { - const state = useContext(UsersStateContext); - - if (state == null) { - throw new Error('useUsersState muss innerhalb von UsersProvider verwendet werden'); - } - - return state; -}; - -export const useUsersActions = () => { - const actions = useContext(UsersActionsContext); - - if (actions == null) { - throw new Error('useUsersActions muss innerhalb von UsersProvider verwendet werden'); - } - - return actions; -}; diff --git a/webseite-react-php-jwt/react-app/src/stores/users/api.js b/webseite-react-php-jwt/react-app/src/stores/users/api.js deleted file mode 100644 index 02c7df8..0000000 --- a/webseite-react-php-jwt/react-app/src/stores/users/api.js +++ /dev/null @@ -1,13 +0,0 @@ -import { apiClient, getApiErrorMessage } from '../http'; - -export { getApiErrorMessage }; - -export const fetchUsers = async (config = {}) => { - const { data } = await apiClient.get('/users', config); - - if (!Array.isArray(data)) { - throw new Error('Ungültige API-Antwort: Benutzerliste erwartet'); - } - - return data; -}; diff --git a/webseite-react-php-jwt/react-app/src/stores/users/index.js b/webseite-react-php-jwt/react-app/src/stores/users/index.js deleted file mode 100644 index 50981a4..0000000 --- a/webseite-react-php-jwt/react-app/src/stores/users/index.js +++ /dev/null @@ -1,4 +0,0 @@ -export { createInitialState } from './initialState'; -export { USERS_ACTIONS, usersReducer } from './reducer'; -export { UsersProvider, useUsersActions, useUsersState } from './UsersStore'; -export { fetchUsers, getApiErrorMessage } from './api'; diff --git a/webseite-react-php-jwt/react-app/src/stores/users/initialState.js b/webseite-react-php-jwt/react-app/src/stores/users/initialState.js deleted file mode 100644 index 56c4cc5..0000000 --- a/webseite-react-php-jwt/react-app/src/stores/users/initialState.js +++ /dev/null @@ -1,7 +0,0 @@ -export const createInitialState = (items) => { - return { - items: items || [], - loading: true, - error: null, - }; -}; diff --git a/webseite-react-php-jwt/react-app/src/stores/users/reducer.js b/webseite-react-php-jwt/react-app/src/stores/users/reducer.js deleted file mode 100644 index a0f5078..0000000 --- a/webseite-react-php-jwt/react-app/src/stores/users/reducer.js +++ /dev/null @@ -1,32 +0,0 @@ -export const USERS_ACTIONS = { - SET_LOADING: 'SET_LOADING', - SET_ITEMS: 'SET_ITEMS', - SET_ERROR: 'SET_ERROR', -}; - -export const usersReducer = (state, action) => { - switch (action.type) { - case USERS_ACTIONS.SET_LOADING: - return { - ...state, - loading: action.payload, - error: action.payload ? null : state.error, - }; - case USERS_ACTIONS.SET_ITEMS: - return { - ...state, - items: action.payload, - loading: false, - error: null, - }; - case USERS_ACTIONS.SET_ERROR: - return { - ...state, - loading: false, - error: action.payload, - }; - default: - console.warn('no action found'); - return state; - } -}; diff --git a/webseite-react-php-jwt/react-app/src/styles/abstracts/_bootstrap-mixins.scss b/webseite-react-php-jwt/react-app/src/styles/abstracts/_bootstrap-mixins.scss deleted file mode 100644 index 9a26f88..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/abstracts/_bootstrap-mixins.scss +++ /dev/null @@ -1,94 +0,0 @@ -@use 'variables' as *; - -// Breakpoint Functions -@function breakpoint-min($name, $breakpoints: $grid-breakpoints) { - $min: map-get($breakpoints, $name); - @return if($min != 0, $min, null); -} - -@function breakpoint-max($name, $breakpoints: $grid-breakpoints) { - $max: map-get($breakpoints, $name); - @return if($max and $max > 0, $max - 0.02, null); -} - -// Breakpoint Mixins -@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) { - $min: breakpoint-min($name, $breakpoints); - @if $min { - @media (min-width: $min) { - @content; - } - } @else { - @content; - } -} - -@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) { - $max: breakpoint-max($name, $breakpoints); - @if $max { - @media (max-width: $max) { - @content; - } - } @else { - @content; - } -} - -@mixin media-breakpoint-between( - $lower, - $upper, - $breakpoints: $grid-breakpoints -) { - $min: breakpoint-min($lower, $breakpoints); - $max: breakpoint-max($upper, $breakpoints); - - @if $min != null and $max != null { - @media (min-width: $min) and (max-width: $max) { - @content; - } - } @else if $max == null { - @include media-breakpoint-up($lower, $breakpoints) { - @content; - } - } @else if $min == null { - @include media-breakpoint-down($upper, $breakpoints) { - @content; - } - } -} - -@function breakpoint-next( - $name, - $breakpoints: $grid-breakpoints, - $breakpoint-names: map-keys($breakpoints) -) { - $n: index($breakpoint-names, $name); - @if not $n { - @error "breakpoint `#{$name}` not found in `#{$breakpoints}`"; - } - @return if( - $n < length($breakpoint-names), - nth($breakpoint-names, $n + 1), - null - ); -} - -@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) { - $min: breakpoint-min($name, $breakpoints); - $next: breakpoint-next($name, $breakpoints); - $max: breakpoint-max($next, $breakpoints); - - @if $min != null and $max != null { - @media (min-width: $min) and (max-width: $max) { - @content; - } - } @else if $max == null { - @include media-breakpoint-up($name, $breakpoints) { - @content; - } - } @else if $min == null { - @include media-breakpoint-down($next, $breakpoints) { - @content; - } - } -} diff --git a/webseite-react-php-jwt/react-app/src/styles/abstracts/_colors.scss b/webseite-react-php-jwt/react-app/src/styles/abstracts/_colors.scss deleted file mode 100644 index 9eb7fcd..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/abstracts/_colors.scss +++ /dev/null @@ -1,25 +0,0 @@ -@use 'sass:color'; - -/* Color Theme Swatches in Hex */ -$color-1: #5c4b51; -$color-2: #8cbeb2; -$color-3: #f2ebbf; -$color-4: #f3b562; -$color-5: #f06060; -$color-6: #293241; - -$color-dark-blue: $color-6; - -$color-red: $color-5; -$color-yellow: $color-4; -$color-brown: $color-1; -$color-black: #020202; -$color-white: #fff; - -$color-dark-text: $color-black; -$color-light-grey: #ccc; - -$bgColor: #efefef; -$color: salmon; - -$gradient-1: linear-gradient(0deg, color.change($color-dark-blue, $lightness: 10%) 0%, $color-dark-blue 100%); diff --git a/webseite-react-php-jwt/react-app/src/styles/abstracts/_index.scss b/webseite-react-php-jwt/react-app/src/styles/abstracts/_index.scss deleted file mode 100644 index adf64f8..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/abstracts/_index.scss +++ /dev/null @@ -1,4 +0,0 @@ -@forward 'colors'; -@forward 'typography'; -@forward 'variables'; -@forward 'bootstrap-mixins'; diff --git a/webseite-react-php-jwt/react-app/src/styles/abstracts/_typography.scss b/webseite-react-php-jwt/react-app/src/styles/abstracts/_typography.scss deleted file mode 100644 index 34c537f..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/abstracts/_typography.scss +++ /dev/null @@ -1,9 +0,0 @@ -$fallback-serif: Cambria, Cochin, Georgia, Times, 'Times New Roman', serif; -$fallback-sans-serif: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - -$font-headline: 'Open Sans', $fallback-sans-serif; -$font-subclaim: $fallback-sans-serif; - -$font-menu: 'Source Code Pro', $fallback-sans-serif; -$font-copy: 'Merriweather', $fallback-serif; -$font-quote: 'Amatic SC', $fallback-serif; diff --git a/webseite-react-php-jwt/react-app/src/styles/abstracts/_variables.scss b/webseite-react-php-jwt/react-app/src/styles/abstracts/_variables.scss deleted file mode 100644 index 415bc3f..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/abstracts/_variables.scss +++ /dev/null @@ -1,17 +0,0 @@ -// Einzelne Breakpoint-Variablen für einfachere Verwendung -$grid-breakpoints-xs: 0; -$grid-breakpoints-sm: 576px; -$grid-breakpoints-md: 768px; -$grid-breakpoints-lg: 992px; -$grid-breakpoints-xl: 1200px; -$grid-breakpoints-xxl: 1400px; - -// Bootstrap Breakpoints direkt definieren (ohne komplexe Dependencies) -$grid-breakpoints: ( - xs: 0, - sm: $grid-breakpoints-sm, - md: $grid-breakpoints-md, - lg: $grid-breakpoints-lg, - xl: $grid-breakpoints-xl, - xxl: $grid-breakpoints-xxl, -) !default; diff --git a/webseite-react-php-jwt/react-app/src/styles/base/_index.scss b/webseite-react-php-jwt/react-app/src/styles/base/_index.scss deleted file mode 100644 index 26fa81a..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/base/_index.scss +++ /dev/null @@ -1,2 +0,0 @@ -@forward 'theme'; -@forward 'utils'; diff --git a/webseite-react-php-jwt/react-app/src/styles/base/_theme.scss b/webseite-react-php-jwt/react-app/src/styles/base/_theme.scss deleted file mode 100644 index 286c1e9..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/base/_theme.scss +++ /dev/null @@ -1,82 +0,0 @@ -@use '../abstracts/' as *; - -// Allgemeine Formatierungen -*, -html { - box-sizing: border-box; -} - -html, -body { - height: 100%; - padding: 0; - margin: 0; -} - -body { - background-color: $bgColor; - display: flex; - flex-direction: column; - font-family: $font-copy; -} - -// Sticky footer https://css-tricks.com/couple-takes-sticky-footer/#aa-there-is-flexbox -body, -#root { - display: flex; - flex-direction: column; -} - -html, -body, -#root { - height: 100%; -} - -body > header, -main { - flex: 1 0 auto; -} - -body > footer, -.footer-main { - flex-shrink: 0; -} -// ------- - -h1, -h2, -h3, -h4, -h5, -h6 { - color: $color-5; - font-family: $font-headline; -} - -// Sticky footer -main { - flex: 1 0 auto; -} - -body > footer, -.footer-main { - flex-shrink: 0; -} - -.loading-spin { - animation-name: loadingSpin; - animation-duration: 1s; - animation-fill-mode: both; - animation-iteration-count: infinite; - animation-timing-function: steps(8); -} - -@keyframes loadingSpin { - 0% { - transform: rotate(0deg); - } - 100% { - transform: rotate(360deg); - } -} diff --git a/webseite-react-php-jwt/react-app/src/styles/base/_utils.scss b/webseite-react-php-jwt/react-app/src/styles/base/_utils.scss deleted file mode 100644 index 0576df4..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/base/_utils.scss +++ /dev/null @@ -1,43 +0,0 @@ -// Shadow Effects ========================== -// https://codepen.io/sdthornton/pen/wBZdXq -.drop-shadow-curved { - position: relative; - float: left; - width: 40%; - padding: 1em; - margin: 2em 10px 4em; - background: #fff; - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3), 0 0 40px rgba(0, 0, 0, 0.1) inset; - - &:before, - &:after { - content: ''; - width: 3px; - position: absolute; - z-index: -1; - - top: 10px; - bottom: 10px; - box-shadow: 0 0 15px rgba(0, 0, 0, 0.6); - border-radius: 10px / 100px; - } - &:before { - left: 0; - } - &:after { - right: 0; - } -} - -.sr-only { - overflow: hidden; - position: absolute; - width: 1px; - height: 1px; - margin: -1px; - border: 0; - padding: 0; - white-space: nowrap; - clip: rect(0 0 0 0); - pointer-events: none; -} diff --git a/webseite-react-php-jwt/react-app/src/styles/components/_button.scss b/webseite-react-php-jwt/react-app/src/styles/components/_button.scss deleted file mode 100644 index c83b1c1..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/components/_button.scss +++ /dev/null @@ -1,13 +0,0 @@ -.btn-custom { - &:hover, - &:focus { - background-color: #333; - color: #e0e0e0; - border: 1px solid #333; - } - background-color: #f0f0f0; - color: #333; - border: 1px solid #ccc; - padding: 8px 16px; - border-radius: 0; -} diff --git a/webseite-react-php-jwt/react-app/src/styles/components/_chuck-norris-jokes.scss b/webseite-react-php-jwt/react-app/src/styles/components/_chuck-norris-jokes.scss deleted file mode 100644 index d94589b..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/components/_chuck-norris-jokes.scss +++ /dev/null @@ -1,45 +0,0 @@ -.chuck-norris-jokes { - text-align: center; - - .chuck-container { - position: relative; - padding: 2rem; - border-radius: 12px; - color: white; - text-align: center; - overflow: hidden; - max-width: 580px; - margin: 2rem auto; - - height: 430px; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - background-image: url('/Chuck-Norris-Wallpaper-By-Thereverend3k.jpg'); - background-size: contain; - background-repeat: no-repeat; - background-position: center; - - &::before { - content: ''; - position: absolute; - inset: 0; - background: rgba(0, 0, 0, 0.6); - } - - .chuck-norris { - position: relative; - font-size: 1.8rem; - font-weight: 700; - line-height: 1.4; - color: #efefef; - } - - button { - position: relative; - font-size: 1.4rem; - margin-top: 1rem; - } - } -} diff --git a/webseite-react-php-jwt/react-app/src/styles/components/_footer-main.scss b/webseite-react-php-jwt/react-app/src/styles/components/_footer-main.scss deleted file mode 100644 index c55804e..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/components/_footer-main.scss +++ /dev/null @@ -1,29 +0,0 @@ -@use '../abstracts/' as *; - -.m-footer-main { - padding: 2rem 0; - background: $gradient-1; - color: white; - - a { - color: white; - } - - .row > [class^='col'], - .row > div { - justify-items: center; - text-align: center; - margin: 0 0 1rem; - @include media-breakpoint-up(md) { - justify-items: flex-start; - text-align: left; - } - } - - // for mobile view - padding: 2rem 2rem; - // for desktop view - @media (min-width: 768px) { - padding: 2rem 0; - } -} diff --git a/webseite-react-php-jwt/react-app/src/styles/components/_header-main.scss b/webseite-react-php-jwt/react-app/src/styles/components/_header-main.scss deleted file mode 100644 index 4cdf94b..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/components/_header-main.scss +++ /dev/null @@ -1,33 +0,0 @@ -@use '../abstracts/' as *; -.m-header-main { - display: flex; - position: relative; - justify-content: center; - align-items: center; - min-height: 400px; - max-height: 400px; - - background-image: url('/img/header-bg.jpg'); - background-position: center; - background-repeat: no-repeat; - background-origin: border-box; - background-size: cover; - - .content-box { - position: absolute; - z-index: 2; - } - - // radial gradient overlay - &::after { - content: ''; - position: absolute; - z-index: 1; - left: 0; - top: 0; - width: 100%; - height: 100%; - - background: radial-gradient(circle, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.7) 100%); - } -} diff --git a/webseite-react-php-jwt/react-app/src/styles/components/_index.scss b/webseite-react-php-jwt/react-app/src/styles/components/_index.scss deleted file mode 100644 index ad390a5..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/components/_index.scss +++ /dev/null @@ -1,11 +0,0 @@ -@forward 'chuck-norris-jokes'; -@forward 'footer-main'; -@forward 'header-main'; -@forward 'input-amount'; -@forward 'input-price'; -@forward 'logo-main'; -@forward 'nav-main'; -@forward 'nav-socials'; -@forward 'slider-splide'; -@forward 'table-products'; -@forward 'table-users'; diff --git a/webseite-react-php-jwt/react-app/src/styles/components/_input-amount.scss b/webseite-react-php-jwt/react-app/src/styles/components/_input-amount.scss deleted file mode 100644 index 59ad167..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/components/_input-amount.scss +++ /dev/null @@ -1,25 +0,0 @@ -.m-input-amount { - .input-group-text { - padding: 0; - margin: 0; - overflow: hidden; - button { - border-radius: 0; - } - } - input[type='number'] { - text-align: center; - max-width: 100px; - &::placeholder { - color: #ccc; - } - - &::-webkit-outer-spin-button, - &::-webkit-inner-spin-button { - -webkit-appearance: none; - margin: 0; - } - -o-appearance: textfield; /* Opera */ - appearance: textfield; /* Firefox */ - } -} diff --git a/webseite-react-php-jwt/react-app/src/styles/components/_input-price.scss b/webseite-react-php-jwt/react-app/src/styles/components/_input-price.scss deleted file mode 100644 index 1d46019..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/components/_input-price.scss +++ /dev/null @@ -1,6 +0,0 @@ -.m-input-price { - max-width: 200px; - input { - text-align: center; - } -} diff --git a/webseite-react-php-jwt/react-app/src/styles/components/_logo-main.scss b/webseite-react-php-jwt/react-app/src/styles/components/_logo-main.scss deleted file mode 100644 index 8d89bba..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/components/_logo-main.scss +++ /dev/null @@ -1,23 +0,0 @@ -@use '../abstracts/' as *; - -.logo-main { - min-width: 280px; - max-width: 320px; - @include media-breakpoint-up(md) { - max-width: 360px; - } - img, - svg { - width: 100%; - height: auto; - } - figcaption { - margin: -1px; - padding: 0; - height: 1px; - width: 1px; - clip: rect(0, 0, 0, 0); - visibility: hidden; - overflow: hidden; - } -} diff --git a/webseite-react-php-jwt/react-app/src/styles/components/_nav-main.scss b/webseite-react-php-jwt/react-app/src/styles/components/_nav-main.scss deleted file mode 100644 index 86d4729..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/components/_nav-main.scss +++ /dev/null @@ -1,46 +0,0 @@ -@use '../abstracts/' as *; - -.m-nav-main { - font-family: $font-menu; - &.bg-body-dark { - background-color: $color-dark-blue; - .navbar-nav .nav-link, - .navbar-brand { - color: $color-white; - } - } - - .nav-auth { - padding: 0.5rem 0; - } - - .nav-auth-session, - .nav-auth-form { - display: flex; - flex-wrap: wrap; - align-items: center; - gap: 0.5rem; - } - - .nav-auth-user { - color: $color-3; - font-weight: 600; - letter-spacing: 0.04em; - } - - .nav-auth-form { - position: relative; - max-width: 28rem; - - .form-control { - width: 8.5rem; - } - } - - .nav-auth-error { - flex-basis: 100%; - margin: 0; - color: $color-yellow; - font-size: 0.8rem; - } -} diff --git a/webseite-react-php-jwt/react-app/src/styles/components/_nav-socials.scss b/webseite-react-php-jwt/react-app/src/styles/components/_nav-socials.scss deleted file mode 100644 index 3a96df9..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/components/_nav-socials.scss +++ /dev/null @@ -1,74 +0,0 @@ -@use '../abstracts/' as *; -@use 'sass:color'; - -.m-nav-social { - ul { - list-style: none; - padding: 0; - margin: 0; - display: flex; - - justify-content: center; - @include media-breakpoint-up(md) { - justify-content: flex-start; - } - align-items: center; - li { - a { - color: white; - display: inline-block; - padding: 0.5rem; - background-color: color.scale($color-dark-blue, $lightness: 10%); - margin: 3px; - border-radius: 50%; - width: 48px; - height: 48px; - display: flex; - justify-content: center; - align-items: center; - text-decoration: none; - transition: all 0.4s ease-out; - &:hover, - &:focus { - background-color: color.scale($color-5, $lightness: 20%); - } - } - - a[aria-label='youtube'] { - &:hover, - &:focus { - background-color: #f00; - } - } - - a[aria-label='facebook'] { - &:hover, - &:focus { - background-color: #3b5998; - } - } - - a[aria-label='x-twitter'] { - &:hover, - &:focus { - background-color: #000000; - } - } - - a[aria-label='instagram'] { - &:hover, - &:focus { - background: linear-gradient( - 9deg, - rgba(254, 218, 117, 1) 10%, - rgba(250, 126, 30, 1) 30%, - rgba(239, 100, 57, 1) 43%, - rgba(214, 41, 118, 1) 55%, - rgba(150, 47, 191, 1) 67%, - rgba(79, 91, 213, 1) 81% - ); - } - } - } - } -} diff --git a/webseite-react-php-jwt/react-app/src/styles/components/_slider-splide.scss b/webseite-react-php-jwt/react-app/src/styles/components/_slider-splide.scss deleted file mode 100644 index facc6ed..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/components/_slider-splide.scss +++ /dev/null @@ -1,28 +0,0 @@ -.m-slider-splide, -.slider-splide { - height: 100%; - width: 100%; - - .splide { - height: 100%; - - img { - object-fit: cover; - width: 100%; - height: 100%; - } - .splide__track { - height: 100%; - } - .splide__arrows { - position: relative; - z-index: 999; - top: 50%; - } - .splide__pagination { - position: absolute; - bottom: 0.5rem; - z-index: 999; - } - } -} diff --git a/webseite-react-php-jwt/react-app/src/styles/components/_splide.scss b/webseite-react-php-jwt/react-app/src/styles/components/_splide.scss deleted file mode 100644 index cd00292..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/components/_splide.scss +++ /dev/null @@ -1,15 +0,0 @@ -.splider-content { - display: flex; - justify-content: center; - padding: 20px 0; - - figcaption { - margin: -1px; - padding: 0; - height: 1px; - width: 1px; - clip: rect(0, 0, 0, 0); - visibility: hidden; - overflow: hidden; - } -} diff --git a/webseite-react-php-jwt/react-app/src/styles/components/_table-products.scss b/webseite-react-php-jwt/react-app/src/styles/components/_table-products.scss deleted file mode 100644 index 602408e..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/components/_table-products.scss +++ /dev/null @@ -1,64 +0,0 @@ -@use '../abstracts/' as *; - -.m-table-products, -.table-products { - tr { - vertical-align: middle; - div { - margin: 0 !important; - } - } - - .col-total { - text-align: right; - width: 100px; - } - - .col-actions { - width: 7.5rem; - text-align: right; - white-space: nowrap; - } - - .btn-action { - display: inline-flex; - align-items: center; - justify-content: center; - width: 2rem; - height: 2rem; - padding: 0; - margin-left: 0.25rem; - border: 0; - line-height: 1; - } - - .btn-action-edit { - background-color: $color-dark-blue; - color: $color-white; - - &:hover, - &:focus-visible, - &.is-active { - background-color: $color-yellow; - color: $color-dark-blue; - } - } - - .btn-action-remove { - background-color: $color-red; - color: $color-white; - - &:hover, - &:focus-visible { - background-color: $color-brown; - color: $color-white; - } - } - - tfoot { - .col-total { - border-top: 2px solid $color-black; - font-weight: bold; - } - } -} diff --git a/webseite-react-php-jwt/react-app/src/styles/components/_table-users.scss b/webseite-react-php-jwt/react-app/src/styles/components/_table-users.scss deleted file mode 100644 index f5ad31d..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/components/_table-users.scss +++ /dev/null @@ -1,6 +0,0 @@ -.m-table-users, -.table-users { - tr { - vertical-align: middle; - } -} diff --git a/webseite-react-php-jwt/react-app/src/styles/components/_weather-box.scss b/webseite-react-php-jwt/react-app/src/styles/components/_weather-box.scss deleted file mode 100644 index 4c27b46..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/components/_weather-box.scss +++ /dev/null @@ -1,102 +0,0 @@ -@use 'sass:color'; - -.weather-box { - &.loaded { - // opacity: 1; - // https://cssreference.io/property/animation/ - animation-name: fadeInWeatherBox; - animation-duration: 1s; - animation-fill-mode: both; - } - - // WetterBox nicht anzeigen, wenn Informationen noch nicht vorliegen - opacity: 0; - - font-family: $font-copy; - max-width: 400px; - padding: 1rem; - border-radius: 1rem; - background-color: #fff; - display: flex; - - .weather-pic { - width: 45%; - figure { - overflow: hidden; - img, - svg { - width: 100%; - } - img { - border-radius: 1rem; - } - figcaption { - text-align: center; - } - .description { - text-align: center; - color: #ccc; - line-height: 1.5; - } - } - } - - .weather-information { - padding: 2.5rem 0 0; - width: 55%; - .text-temp { - text-align: center; - font-size: 3rem; - margin: 0; - color: #555; - } - - .text-temp-min-max { - text-align: center; - color: #ccc; - line-height: 1; - margin: 0 0 2rem; - } - - .temp-unit { - font-size: 2.5rem; - color: ligthen(#555, 20%); - // @debug color.scale(#555, $lightness: 20%); - } - - .wind-direction { - display: flex; - text-align: center; - line-height: 1; - margin: 0 0 2rem; - color: #555; - .fa-compass { - transition: all 0.8s ease-out; - font-size: 48px; - width: 48px; - height: 48px; - margin: 0 1rem 0 2rem; - } - - .text-wind-info { - margin: 0; - text-align: center; - line-height: 1.5; - } - .speed { - display: inline; - } - } - } -} - -@keyframes fadeInWeatherBox { - 0% { - opacity: 0; - transform: scale(1.5); - } - 100% { - opacity: 1; - transform: scale(1); - } -} diff --git a/webseite-react-php-jwt/react-app/src/styles/fonts/_amatic-sc-v28-latin.scss b/webseite-react-php-jwt/react-app/src/styles/fonts/_amatic-sc-v28-latin.scss deleted file mode 100644 index 83c742c..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/fonts/_amatic-sc-v28-latin.scss +++ /dev/null @@ -1,17 +0,0 @@ -// amatic-sc-regular - latin -@font-face { - font-display: swap; - font-family: 'Amatic SC'; - font-style: normal; - font-weight: 400; - src: url('/fonts/amatic-sc-v28-latin/amatic-sc-v28-latin-regular.woff2') format('woff2'); -} - -// amatic-sc-700 - latin -@font-face { - font-display: swap; - font-family: 'Amatic SC'; - font-style: normal; - font-weight: 700; - src: url('/fonts/amatic-sc-v28-latin/amatic-sc-v28-latin-700.woff2') format('woff2'); -} diff --git a/webseite-react-php-jwt/react-app/src/styles/fonts/_index.scss b/webseite-react-php-jwt/react-app/src/styles/fonts/_index.scss deleted file mode 100644 index 78431b8..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/fonts/_index.scss +++ /dev/null @@ -1,5 +0,0 @@ -@forward 'amatic-sc-v28-latin'; -@forward 'merriweather-v33-latin'; -@forward 'open-sans-v40-latin'; -@forward 'source-sans-3-v19-latin'; -@forward 'source-code-pro-v31-latin'; diff --git a/webseite-react-php-jwt/react-app/src/styles/fonts/_merriweather-v33-latin.scss b/webseite-react-php-jwt/react-app/src/styles/fonts/_merriweather-v33-latin.scss deleted file mode 100644 index f4afb52..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/fonts/_merriweather-v33-latin.scss +++ /dev/null @@ -1,123 +0,0 @@ -// merriweather-300 - latin -@font-face { - font-display: swap; - font-family: 'Merriweather'; - font-style: normal; - font-weight: 300; - src: url('/fonts/merriweather-v33-latin/merriweather-v33-latin-300.woff2') format('woff2'); -} - -// merriweather-300italic - latin -@font-face { - font-display: swap; - font-family: 'Merriweather'; - font-style: italic; - font-weight: 300; - src: url('/fonts/merriweather-v33-latin/merriweather-v33-latin-300italic.woff2') format('woff2'); -} - -// merriweather-regular - latin -@font-face { - font-display: swap; - font-family: 'Merriweather'; - font-style: normal; - font-weight: 400; - src: url('/fonts/merriweather-v33-latin/merriweather-v33-latin-regular.woff2') format('woff2'); -} - -// merriweather-italic - latin -@font-face { - font-display: swap; - font-family: 'Merriweather'; - font-style: italic; - font-weight: 400; - src: url('/fonts/merriweather-v33-latin/merriweather-v33-latin-italic.woff2') format('woff2'); -} -// merriweather-500 - latin -@font-face { - font-display: swap; - font-family: 'Merriweather'; - font-style: normal; - font-weight: 500; - src: url('/fonts/merriweather-v33-latin/merriweather-v33-latin-500.woff2') format('woff2'); -} -// merriweather-500italic - latin -@font-face { - font-display: swap; - font-family: 'Merriweather'; - font-style: italic; - font-weight: 500; - src: url('/fonts/merriweather-v33-latin/merriweather-v33-latin-500italic.woff2') format('woff2'); -} - -// merriweather-600 - latin -@font-face { - font-display: swap; - font-family: 'Merriweather'; - font-style: normal; - font-weight: 600; - src: url('/fonts/merriweather-v33-latin/merriweather-v33-latin-600.woff2') format('woff2'); -} - -// merriweather-600italic - latin -@font-face { - font-display: swap; - font-family: 'Merriweather'; - font-style: italic; - font-weight: 600; - src: url('/fonts/merriweather-v33-latin/merriweather-v33-latin-600italic.woff2') format('woff2'); -} - -// merriweather-700 - latin -@font-face { - font-display: swap; - font-family: 'Merriweather'; - font-style: normal; - font-weight: 700; - src: url('/fonts/merriweather-v33-latin/merriweather-v33-latin-700.woff2') format('woff2'); -} - -// merriweather-700italic - latin -@font-face { - font-display: swap; - font-family: 'Merriweather'; - font-style: italic; - font-weight: 700; - src: url('/fonts/merriweather-v33-latin/merriweather-v33-latin-700italic.woff2') format('woff2'); -} - -// merriweather-800 - latin -@font-face { - font-display: swap; - font-family: 'Merriweather'; - font-style: normal; - font-weight: 800; - src: url('/fonts/merriweather-v33-latin/merriweather-v33-latin-800.woff2') format('woff2'); -} - -// merriweather-800italic - latin -@font-face { - font-display: swap; - font-family: 'Merriweather'; - font-style: italic; - font-weight: 800; - src: url('/fonts/merriweather-v33-latin/merriweather-v33-latin-800italic.woff2') format('woff2'); -} - -// merriweather-900 - latin -@font-face { - font-display: swap; - font-family: 'Merriweather'; - font-style: normal; - font-weight: 900; - src: url('/fonts/merriweather-v33-latin/merriweather-v33-latin-900.woff2') format('woff2'); -} - -// merriweather-900italic - latin -@font-face { - font-display: swap; - font-family: 'Merriweather'; - font-style: italic; - font-weight: 900; - src: url('/fonts/merriweather-v33-latin/merriweather-v33-latin-900italic.woff2') format('woff2'); -} diff --git a/webseite-react-php-jwt/react-app/src/styles/fonts/_open-sans-v40-latin.scss b/webseite-react-php-jwt/react-app/src/styles/fonts/_open-sans-v40-latin.scss deleted file mode 100644 index 725d28c..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/fonts/_open-sans-v40-latin.scss +++ /dev/null @@ -1,108 +0,0 @@ -// open-sans-300 - latin -@font-face { - font-display: swap; - font-family: 'Open Sans'; - font-style: normal; - font-weight: 300; - src: url('/fonts/open-sans-v40-latin/open-sans-v40-latin-300.woff2') - format('woff2'); -} -// open-sans-300italic - latin -@font-face { - font-display: swap; - font-family: 'Open Sans'; - font-style: italic; - font-weight: 300; - src: url('/fonts/open-sans-v40-latin/open-sans-v40-latin-300italic.woff2') - format('woff2'); -} -// open-sans-regular - latin -@font-face { - font-display: swap; - font-family: 'Open Sans'; - font-style: normal; - font-weight: 400; - src: url('/fonts/open-sans-v40-latin/open-sans-v40-latin-regular.woff2') - format('woff2'); -} -// open-sans-italic - latin -@font-face { - font-display: swap; - font-family: 'Open Sans'; - font-style: italic; - font-weight: 400; - src: url('/fonts/open-sans-v40-latin/open-sans-v40-latin-italic.woff2') - format('woff2'); -} -// open-sans-500 - latin -@font-face { - font-display: swap; - font-family: 'Open Sans'; - font-style: normal; - font-weight: 500; - src: url('/fonts/open-sans-v40-latin/open-sans-v40-latin-500.woff2') - format('woff2'); -} -// open-sans-500italic - latin -@font-face { - font-display: swap; - font-family: 'Open Sans'; - font-style: italic; - font-weight: 500; - src: url('/fonts/open-sans-v40-latin/open-sans-v40-latin-500italic.woff2') - format('woff2'); -} -// open-sans-600 - latin -@font-face { - font-display: swap; - font-family: 'Open Sans'; - font-style: normal; - font-weight: 600; - src: url('/fonts/open-sans-v40-latin/open-sans-v40-latin-600.woff2') - format('woff2'); -} -// open-sans-600italic - latin -@font-face { - font-display: swap; - font-family: 'Open Sans'; - font-style: italic; - font-weight: 600; - src: url('/fonts/open-sans-v40-latin/open-sans-v40-latin-600italic.woff2') - format('woff2'); -} -// open-sans-700 - latin -@font-face { - font-display: swap; - font-family: 'Open Sans'; - font-style: normal; - font-weight: 700; - src: url('/fonts/open-sans-v40-latin/open-sans-v40-latin-700.woff2') - format('woff2'); -} -// open-sans-700italic - latin -@font-face { - font-display: swap; - font-family: 'Open Sans'; - font-style: italic; - font-weight: 700; - src: url('/fonts/open-sans-v40-latin/open-sans-v40-latin-700italic.woff2') - format('woff2'); -} -// open-sans-800 - latin -@font-face { - font-display: swap; - font-family: 'Open Sans'; - font-style: normal; - font-weight: 800; - src: url('/fonts/open-sans-v40-latin/open-sans-v40-latin-800.woff2') - format('woff2'); -} -// open-sans-800italic - latin -@font-face { - font-display: swap; - font-family: 'Open Sans'; - font-style: italic; - font-weight: 800; - src: url('/fonts/open-sans-v40-latin/open-sans-v40-latin-800italic.woff2') - format('woff2'); -} diff --git a/webseite-react-php-jwt/react-app/src/styles/fonts/_source-code-pro-v31-latin.scss b/webseite-react-php-jwt/react-app/src/styles/fonts/_source-code-pro-v31-latin.scss deleted file mode 100644 index e57093c..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/fonts/_source-code-pro-v31-latin.scss +++ /dev/null @@ -1,133 +0,0 @@ -// source-code-pro-200italic - latin -@font-face { - font-display: swap; - font-family: 'Source Code Pro'; - font-style: italic; - font-weight: 200; - src: url('/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-200italic.woff2') format('woff2'); -} - -// source-code-pro-300 - latin -@font-face { - font-display: swap; - font-family: 'Source Code Pro'; - font-style: normal; - font-weight: 300; - src: url('/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-300.woff2') format('woff2'); -} - -// source-code-pro-300italic - latin -@font-face { - font-display: swap; - font-family: 'Source Code Pro'; - font-style: italic; - font-weight: 300; - src: url('/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-300italic.woff2') format('woff2'); -} - -// source-code-pro-regular - latin -@font-face { - font-display: swap; - font-family: 'Source Code Pro'; - font-style: normal; - font-weight: 400; - src: url('/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-regular.woff2') format('woff2'); -} - -// source-code-pro-italic - latin -@font-face { - font-display: swap; - font-family: 'Source Code Pro'; - font-style: italic; - font-weight: 400; - src: url('/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-italic.woff2') format('woff2'); -} - -// source-code-pro-500 - latin -@font-face { - font-display: swap; - font-family: 'Source Code Pro'; - font-style: normal; - font-weight: 500; - src: url('/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-500.woff2') format('woff2'); -} - -// source-code-pro-500italic - latin -@font-face { - font-display: swap; - font-family: 'Source Code Pro'; - font-style: italic; - font-weight: 500; - src: url('/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-500italic.woff2') format('woff2'); -} - -// source-code-pro-600 - latin -@font-face { - font-display: swap; - font-family: 'Source Code Pro'; - font-style: normal; - font-weight: 600; - src: url('/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-600.woff2') format('woff2'); -} - -// source-code-pro-600italic - latin -@font-face { - font-display: swap; - font-family: 'Source Code Pro'; - font-style: italic; - font-weight: 600; - src: url('/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-600italic.woff2') format('woff2'); -} - -// source-code-pro-700 - latin -@font-face { - font-display: swap; - font-family: 'Source Code Pro'; - font-style: normal; - font-weight: 700; - src: url('/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-700.woff2') format('woff2'); -} - -// source-code-pro-700italic - latin -@font-face { - font-display: swap; - font-family: 'Source Code Pro'; - font-style: italic; - font-weight: 700; - src: url('/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-700italic.woff2') format('woff2'); -} - -// source-code-pro-800 - latin -@font-face { - font-display: swap; - font-family: 'Source Code Pro'; - font-style: normal; - font-weight: 800; - src: url('/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-800.woff2') format('woff2'); -} -// source-code-pro-800italic - latin -@font-face { - font-display: swap; - font-family: 'Source Code Pro'; - font-style: italic; - font-weight: 800; - src: url('/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-800italic.woff2') format('woff2'); -} - -// source-code-pro-900 - latin -@font-face { - font-display: swap; - font-family: 'Source Code Pro'; - font-style: normal; - font-weight: 900; - src: url('/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-900.woff2') format('woff2'); -} - -// source-code-pro-900italic - latin -@font-face { - font-display: swap; - font-family: 'Source Code Pro'; - font-style: italic; - font-weight: 900; - src: url('/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-900italic.woff2') format('woff2'); -} diff --git a/webseite-react-php-jwt/react-app/src/styles/fonts/_source-sans-3-v19-latin.scss b/webseite-react-php-jwt/react-app/src/styles/fonts/_source-sans-3-v19-latin.scss deleted file mode 100644 index 694a813..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/fonts/_source-sans-3-v19-latin.scss +++ /dev/null @@ -1,143 +0,0 @@ -// source-sans-3-200 - latin -@font-face { - font-display: swap; - font-family: 'Source Sans 3'; - font-style: normal; - font-weight: 200; - src: url('/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-200.woff2') format('woff2'); -} - -// source-sans-3-200italic - latin -@font-face { - font-display: swap; - font-family: 'Source Sans 3'; - font-style: italic; - font-weight: 200; - src: url('/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-200italic.woff2') format('woff2'); -} - -// source-sans-3-300 - latin -@font-face { - font-display: swap; - font-family: 'Source Sans 3'; - font-style: normal; - font-weight: 300; - src: url('/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-300.woff2') format('woff2'); -} - -// source-sans-3-300italic - latin -@font-face { - font-display: swap; - font-family: 'Source Sans 3'; - font-style: italic; - font-weight: 300; - src: url('/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-300italic.woff2') format('woff2'); -} - -// source-sans-3-regular - latin -@font-face { - font-display: swap; - font-family: 'Source Sans 3'; - font-style: normal; - font-weight: 400; - src: url('/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-regular.woff2') format('woff2'); -} - -// source-sans-3-italic - latin -@font-face { - font-display: swap; - font-family: 'Source Sans 3'; - font-style: italic; - font-weight: 400; - src: url('/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-italic.woff2') format('woff2'); -} - -// source-sans-3-500 - latin -@font-face { - font-display: swap; - font-family: 'Source Sans 3'; - font-style: normal; - font-weight: 500; - src: url('/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-500.woff2') format('woff2'); -} - -// source-sans-3-500italic - latin -@font-face { - font-display: swap; - font-family: 'Source Sans 3'; - font-style: italic; - font-weight: 500; - src: url('/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-500italic.woff2') format('woff2'); -} - -// source-sans-3-600 - latin -@font-face { - font-display: swap; - font-family: 'Source Sans 3'; - font-style: normal; - font-weight: 600; - src: url('/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-600.woff2') format('woff2'); -} - -// source-sans-3-600italic - latin -@font-face { - font-display: swap; - font-family: 'Source Sans 3'; - font-style: italic; - font-weight: 600; - src: url('/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-600italic.woff2') format('woff2'); -} - -// source-sans-3-700 - latin -@font-face { - font-display: swap; - font-family: 'Source Sans 3'; - font-style: normal; - font-weight: 700; - src: url('/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-700.woff2') format('woff2'); -} - -// source-sans-3-700italic - latin -@font-face { - font-display: swap; - font-family: 'Source Sans 3'; - font-style: italic; - font-weight: 700; - src: url('/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-700italic.woff2') format('woff2'); -} - -// source-sans-3-800 - latin -@font-face { - font-display: swap; - font-family: 'Source Sans 3'; - font-style: normal; - font-weight: 800; - src: url('/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-800.woff2') format('woff2'); -} - -// source-sans-3-800italic - latin -@font-face { - font-display: swap; - font-family: 'Source Sans 3'; - font-style: italic; - font-weight: 800; - src: url('/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-800italic.woff2') format('woff2'); -} - -// source-sans-3-900 - latin -@font-face { - font-display: swap; - font-family: 'Source Sans 3'; - font-style: normal; - font-weight: 900; - src: url('/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-900.woff2') format('woff2'); -} - -// source-sans-3-900italic - latin -@font-face { - font-display: swap; - font-family: 'Source Sans 3'; - font-style: italic; - font-weight: 900; - src: url('/fonts/source-sans-3-v19-latin/source-sans-3-v19-latin-900italic.woff2') format('woff2'); -} diff --git a/webseite-react-php-jwt/react-app/src/styles/icons/_index.scss b/webseite-react-php-jwt/react-app/src/styles/icons/_index.scss deleted file mode 100644 index 8515778..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/icons/_index.scss +++ /dev/null @@ -1,4 +0,0 @@ -@use 'fontawesome-7.1.0/solid.scss'; -@use 'fontawesome-7.1.0/regular.scss'; -@use 'fontawesome-7.1.0/brands.scss'; -@use 'fontawesome-7.1.0/fontawesome.scss'; diff --git a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_animated.scss b/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_animated.scss deleted file mode 100644 index 0ac7dd4..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_animated.scss +++ /dev/null @@ -1,150 +0,0 @@ -// animating icons -// -------------------------- -@use 'variables' as v; - -.#{v.$css-prefix}-beat { - animation-name: #{v.$css-prefix}-beat; - animation-delay: var(--#{v.$css-prefix}-animation-delay, 0s); - animation-direction: var(--#{v.$css-prefix}-animation-direction, normal); - animation-duration: var(--#{v.$css-prefix}-animation-duration, 1s); - animation-iteration-count: var(--#{v.$css-prefix}-animation-iteration-count, infinite); - animation-timing-function: var(--#{v.$css-prefix}-animation-timing, ease-in-out); -} - -.#{v.$css-prefix}-bounce { - animation-name: #{v.$css-prefix}-bounce; - animation-delay: var(--#{v.$css-prefix}-animation-delay, 0s); - animation-direction: var(--#{v.$css-prefix}-animation-direction, normal); - animation-duration: var(--#{v.$css-prefix}-animation-duration, 1s); - animation-iteration-count: var(--#{v.$css-prefix}-animation-iteration-count, infinite); - animation-timing-function: var(--#{v.$css-prefix}-animation-timing, cubic-bezier(0.280, 0.840, 0.420, 1)); -} - -.#{v.$css-prefix}-fade { - animation-name: #{v.$css-prefix}-fade; - animation-delay: var(--#{v.$css-prefix}-animation-delay, 0s); - animation-direction: var(--#{v.$css-prefix}-animation-direction, normal); - animation-duration: var(--#{v.$css-prefix}-animation-duration, 1s); - animation-iteration-count: var(--#{v.$css-prefix}-animation-iteration-count, infinite); - animation-timing-function: var(--#{v.$css-prefix}-animation-timing, cubic-bezier(.4,0,.6,1)); -} - -.#{v.$css-prefix}-beat-fade { - animation-name: #{v.$css-prefix}-beat-fade; - animation-delay: var(--#{v.$css-prefix}-animation-delay, 0s); - animation-direction: var(--#{v.$css-prefix}-animation-direction, normal); - animation-duration: var(--#{v.$css-prefix}-animation-duration, 1s); - animation-iteration-count: var(--#{v.$css-prefix}-animation-iteration-count, infinite); - animation-timing-function: var(--#{v.$css-prefix}-animation-timing, cubic-bezier(.4,0,.6,1)); -} - -.#{v.$css-prefix}-flip { - animation-name: #{v.$css-prefix}-flip; - animation-delay: var(--#{v.$css-prefix}-animation-delay, 0s); - animation-direction: var(--#{v.$css-prefix}-animation-direction, normal); - animation-duration: var(--#{v.$css-prefix}-animation-duration, 1s); - animation-iteration-count: var(--#{v.$css-prefix}-animation-iteration-count, infinite); - animation-timing-function: var(--#{v.$css-prefix}-animation-timing, ease-in-out); -} - -.#{v.$css-prefix}-shake { - animation-name: #{v.$css-prefix}-shake; - animation-delay: var(--#{v.$css-prefix}-animation-delay, 0s); - animation-direction: var(--#{v.$css-prefix}-animation-direction, normal); - animation-duration: var(--#{v.$css-prefix}-animation-duration, 1s); - animation-iteration-count: var(--#{v.$css-prefix}-animation-iteration-count, infinite); - animation-timing-function: var(--#{v.$css-prefix}-animation-timing, linear); -} - -.#{v.$css-prefix}-spin { - animation-name: #{v.$css-prefix}-spin; - animation-delay: var(--#{v.$css-prefix}-animation-delay, 0s); - animation-direction: var(--#{v.$css-prefix}-animation-direction, normal); - animation-duration: var(--#{v.$css-prefix}-animation-duration, 2s); - animation-iteration-count: var(--#{v.$css-prefix}-animation-iteration-count, infinite); - animation-timing-function: var(--#{v.$css-prefix}-animation-timing, linear); -} - -.#{v.$css-prefix}-spin-reverse { - --#{v.$css-prefix}-animation-direction: reverse; -} - -.#{v.$css-prefix}-pulse, -.#{v.$css-prefix}-spin-pulse { - animation-name: #{v.$css-prefix}-spin; - animation-direction: var(--#{v.$css-prefix}-animation-direction, normal); - animation-duration: var(--#{v.$css-prefix}-animation-duration, 1s); - animation-iteration-count: var(--#{v.$css-prefix}-animation-iteration-count, infinite); - animation-timing-function: var(--#{v.$css-prefix}-animation-timing, steps(8)); -} - -// if agent or operating system prefers reduced motion, disable animations -// see: https://www.smashingmagazine.com/2020/09/design-reduced-motion-sensitivities/ -// see: https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion -@media (prefers-reduced-motion: reduce) { - .#{v.$css-prefix}-beat, - .#{v.$css-prefix}-bounce, - .#{v.$css-prefix}-fade, - .#{v.$css-prefix}-beat-fade, - .#{v.$css-prefix}-flip, - .#{v.$css-prefix}-pulse, - .#{v.$css-prefix}-shake, - .#{v.$css-prefix}-spin, - .#{v.$css-prefix}-spin-pulse { - animation: none !important; - transition: none !important; - } -} - -@keyframes #{v.$css-prefix}-beat { - 0%, 90% { transform: scale(1); } - 45% { transform: scale(var(--#{v.$css-prefix}-beat-scale, 1.25)); } -} - -@keyframes #{v.$css-prefix}-bounce { - 0% { transform: scale(1,1) translateY(0); } - 10% { transform: scale(var(--#{v.$css-prefix}-bounce-start-scale-x, 1.1),var(--#{v.$css-prefix}-bounce-start-scale-y, 0.9)) translateY(0); } - 30% { transform: scale(var(--#{v.$css-prefix}-bounce-jump-scale-x, 0.9),var(--#{v.$css-prefix}-bounce-jump-scale-y, 1.1)) translateY(var(--#{v.$css-prefix}-bounce-height, -0.5em)); } - 50% { transform: scale(var(--#{v.$css-prefix}-bounce-land-scale-x, 1.05),var(--#{v.$css-prefix}-bounce-land-scale-y, 0.95)) translateY(0); } - 57% { transform: scale(1,1) translateY(var(--#{v.$css-prefix}-bounce-rebound, -0.125em)); } - 64% { transform: scale(1,1) translateY(0); } - 100% { transform: scale(1,1) translateY(0); } -} - -@keyframes #{v.$css-prefix}-fade { - 50% { opacity: var(--#{v.$css-prefix}-fade-opacity, 0.4); } -} - -@keyframes #{v.$css-prefix}-beat-fade { - 0%, 100% { - opacity: var(--#{v.$css-prefix}-beat-fade-opacity, 0.4); - transform: scale(1); - } - 50% { - opacity: 1; - transform: scale(var(--#{v.$css-prefix}-beat-fade-scale, 1.125)); - } -} - -@keyframes #{v.$css-prefix}-flip { - 50% { - transform: rotate3d(var(--#{v.$css-prefix}-flip-x, 0), var(--#{v.$css-prefix}-flip-y, 1), var(--#{v.$css-prefix}-flip-z, 0), var(--#{v.$css-prefix}-flip-angle, -180deg)); - } -} - -@keyframes #{v.$css-prefix}-shake { - 0% { transform: rotate(-15deg); } - 4% { transform: rotate(15deg); } - 8%, 24% { transform: rotate(-18deg); } - 12%, 28% { transform: rotate(18deg); } - 16% { transform: rotate(-22deg); } - 20% { transform: rotate(22deg); } - 32% { transform: rotate(-12deg); } - 36% { transform: rotate(12deg); } - 40%, 100% { transform: rotate(0deg); } -} - -@keyframes #{v.$css-prefix}-spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} diff --git a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_bordered.scss b/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_bordered.scss deleted file mode 100644 index 47408e4..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_bordered.scss +++ /dev/null @@ -1,24 +0,0 @@ -// bordered icons -// ------------------------- -@use 'variables' as v; - -/* Heads Up: Bordered Icons will not be supported in the future! - - This feature will be deprecated in the next major release of Font Awesome (v8)! - - You may continue to use it in this version *v7), but it will not be supported in Font Awesome v8. -*/ - -/* Notes: -* --@{v.$css-prefix}-border-width = 1/16 by default (to render as ~1px based on a 16px default font-size) -* --@{v.$css-prefix}-border-padding = - ** 3/16 for vertical padding (to give ~2px of vertical whitespace around an icon considering it's vertical alignment) - ** 4/16 for horizontal padding (to give ~4px of horizontal whitespace around an icon) -*/ - -.#{v.$css-prefix}-border { - border-color: var(--#{v.$css-prefix}-border-color, #{v.$border-color}); - border-radius: var(--#{v.$css-prefix}-border-radius, #{v.$border-radius}); - border-style: var(--#{v.$css-prefix}-border-style, #{v.$border-style}); - border-width: var(--#{v.$css-prefix}-border-width, #{v.$border-width}); - box-sizing: var(--#{v.$css-prefix}-border-box-sizing, #{v.$border-box-sizing}); - padding: var(--#{v.$css-prefix}-border-padding, #{v.$border-padding}); -} diff --git a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_core.scss b/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_core.scss deleted file mode 100644 index 5a9d9e5..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_core.scss +++ /dev/null @@ -1,43 +0,0 @@ -// base icon class definition -// ------------------------- -@use 'variables' as v; -@use 'mixins' as m; - -.#{v.$css-prefix}-solid, -.#{v.$css-prefix}-regular, -.#{v.$css-prefix}-brands, -.#{v.$css-prefix}-classic, -.fas, -.far, -.fab, -.#{v.$css-prefix} { - @include m.fa-icon(); -} - -:is( - .fas, - .far, - .fab, - .#{v.$css-prefix}-solid, - .#{v.$css-prefix}-regular, - .#{v.$css-prefix}-brands, - .#{v.$css-prefix}-classic, - .fa -)::before { - content: var(#{v.$icon-property})/""; -} - -@supports not (content: ''/'') { -:is( - .fas, - .far, - .fab, - .#{v.$css-prefix}-solid, - .#{v.$css-prefix}-regular, - .#{v.$css-prefix}-brands, - .#{v.$css-prefix}-classic, - .fa -)::before { - content: var(#{v.$icon-property}); - } -} \ No newline at end of file diff --git a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_fa.scss b/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_fa.scss deleted file mode 100644 index 0ab0481..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_fa.scss +++ /dev/null @@ -1,3 +0,0 @@ -@forward "functions"; -@forward "variables"; -@forward "mixins"; diff --git a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_functions.scss b/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_functions.scss deleted file mode 100644 index ab1ef1f..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_functions.scss +++ /dev/null @@ -1,8 +0,0 @@ -// functions -// -------------------------- -@use "sass:string"; - -// fa-content: convenience function used to set content property -@function fa-content($var) { - @return string.unquote("\"#{ $var }\""); -} diff --git a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_icons.scss b/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_icons.scss deleted file mode 100644 index 8f62efb..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_icons.scss +++ /dev/null @@ -1,15 +0,0 @@ -// specific icon class definition -// ------------------------- -@use "sass:string"; -@use 'variables' as v; - -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen - readers do not read off random characters that represent icons */ - - -@each $name, $icon in v.$icons { - .#{v.$css-prefix}-#{$name} { - #{v.$icon-property}: string.unquote("\"#{ $icon }\""); - } -} - diff --git a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_list.scss b/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_list.scss deleted file mode 100644 index d25b4ab..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_list.scss +++ /dev/null @@ -1,19 +0,0 @@ -// icons in a list -// ------------------------- -@use 'variables' as v; - -.#{v.$css-prefix}-ul { - list-style-type: none; - margin-inline-start: var(--#{v.$css-prefix}-li-margin, #{v.$li-margin}); - padding-inline-start: 0; - - > li { position: relative; } -} - -.#{v.$css-prefix}-li { - inset-inline-start: calc(-1 * var(--#{v.$css-prefix}-li-width, #{v.$li-width})); - position: absolute; - text-align: center; - width: var(--#{v.$css-prefix}-li-width, #{v.$li-width}); - line-height: inherit; -} diff --git a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_mixins.scss b/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_mixins.scss deleted file mode 100644 index 99fee68..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_mixins.scss +++ /dev/null @@ -1,28 +0,0 @@ -// mixins -// -------------------------- -@use 'variables' as v; - -// base rendering for an icon -@mixin fa-icon($family: v.$family) { - --_#{v.$css-prefix}-family: var(--#{v.$css-prefix}-family, var(--#{v.$css-prefix}-style-family, '#{$family}')); - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - display: var(--#{v.$css-prefix}-display, #{v.$display}); - font-family: var(--_#{v.$css-prefix}-family); - font-feature-settings: normal; - font-style: normal; - font-synthesis: none; - font-variant: normal; - font-weight: var(--#{v.$css-prefix}-style, #{v.$style}); - line-height: 1; - text-align: center; - text-rendering: auto; - width: var(--#{v.$css-prefix}-width, #{v.$fw-width}); -} - -// sets relative font-sizing and alignment (in _sizing) -@mixin fa-size ($font-size) { - font-size: calc(#{$font-size} / #{v.$size-scale-base} * 1em); /* converts a #{$font-size}px size into an em-based value that's relative to the scale's #{v.$size-scale-base}px base */ - line-height: calc(1 / #{$font-size} * 1em); /* sets the line-height of the icon back to that of it's parent */ - vertical-align: calc(((6 / #{$font-size}) - (3 / 8)) * 1em); /* vertically centers the icon taking into account the surrounding text's descender */ -} diff --git a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_pulled.scss b/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_pulled.scss deleted file mode 100644 index 349125f..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_pulled.scss +++ /dev/null @@ -1,15 +0,0 @@ -// pulled icons -// ------------------------- -@use 'variables' as v; - -.#{v.$css-prefix}-pull-left, -.#{v.$css-prefix}-pull-start { - float: inline-start; - margin-inline-end: var(--#{v.$css-prefix}-pull-margin, #{v.$pull-margin}); -} - -.#{v.$css-prefix}-pull-right, -.#{v.$css-prefix}-pull-end { - float: inline-end; - margin-inline-start: var(--#{v.$css-prefix}-pull-margin, #{v.$pull-margin}); -} diff --git a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_rotated-flipped.scss b/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_rotated-flipped.scss deleted file mode 100644 index 7f69940..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_rotated-flipped.scss +++ /dev/null @@ -1,32 +0,0 @@ -// rotating + flipping icons -// ------------------------- -@use 'variables' as v; - -.#{v.$css-prefix}-rotate-90 { - transform: rotate(90deg); -} - -.#{v.$css-prefix}-rotate-180 { - transform: rotate(180deg); -} - -.#{v.$css-prefix}-rotate-270 { - transform: rotate(270deg); -} - -.#{v.$css-prefix}-flip-horizontal { - transform: scale(-1, 1); -} - -.#{v.$css-prefix}-flip-vertical { - transform: scale(1, -1); -} - -.#{v.$css-prefix}-flip-both, -.#{v.$css-prefix}-flip-horizontal.#{v.$css-prefix}-flip-vertical { - transform: scale(-1, -1); -} - -.#{v.$css-prefix}-rotate-by { - transform: rotate(var(--#{v.$css-prefix}-rotate-angle, 0)); -} diff --git a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_shims.scss b/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_shims.scss deleted file mode 100644 index b36cee0..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_shims.scss +++ /dev/null @@ -1,2193 +0,0 @@ -@use "sass:string"; -@use 'variables' as v; - -.#{v.$css-prefix}.#{v.$css-prefix}-glass { - #{v.$icon-property}: string.unquote("\"#{ v.$var-martini-glass-empty }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-envelope-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-envelope-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-envelope }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-star-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-star-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-star }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-remove { - #{v.$icon-property}: string.unquote("\"#{ v.$var-xmark }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-close { - #{v.$icon-property}: string.unquote("\"#{ v.$var-xmark }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-gear { - #{v.$icon-property}: string.unquote("\"#{ v.$var-gear }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-trash-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-trash-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-trash-can }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-home { - #{v.$icon-property}: string.unquote("\"#{ v.$var-house }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-file }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-clock-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-clock-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-clock }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-arrow-circle-o-down { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-arrow-circle-o-down { - #{v.$icon-property}: string.unquote("\"#{ v.$var-circle-down }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-arrow-circle-o-up { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-arrow-circle-o-up { - #{v.$icon-property}: string.unquote("\"#{ v.$var-circle-up }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-play-circle-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-play-circle-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-circle-play }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-repeat { - #{v.$icon-property}: string.unquote("\"#{ v.$var-arrow-rotate-right }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-rotate-right { - #{v.$icon-property}: string.unquote("\"#{ v.$var-arrow-rotate-right }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-refresh { - #{v.$icon-property}: string.unquote("\"#{ v.$var-arrows-rotate }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-list-alt { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-list-alt { - #{v.$icon-property}: string.unquote("\"#{ v.$var-rectangle-list }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-dedent { - #{v.$icon-property}: string.unquote("\"#{ v.$var-outdent }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-video-camera { - #{v.$icon-property}: string.unquote("\"#{ v.$var-video }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-picture-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-picture-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-image }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-photo { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-photo { - #{v.$icon-property}: string.unquote("\"#{ v.$var-image }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-image { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-image { - #{v.$icon-property}: string.unquote("\"#{ v.$var-image }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-map-marker { - #{v.$icon-property}: string.unquote("\"#{ v.$var-location-dot }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-pencil-square-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-pencil-square-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-pen-to-square }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-edit { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-edit { - #{v.$icon-property}: string.unquote("\"#{ v.$var-pen-to-square }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-share-square-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-share-from-square }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-check-square-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-check-square-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square-check }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-arrows { - #{v.$icon-property}: string.unquote("\"#{ v.$var-up-down-left-right }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-times-circle-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-times-circle-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-circle-xmark }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-check-circle-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-check-circle-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-circle-check }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-mail-forward { - #{v.$icon-property}: string.unquote("\"#{ v.$var-share }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-expand { - #{v.$icon-property}: string.unquote("\"#{ v.$var-up-right-and-down-left-from-center }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-compress { - #{v.$icon-property}: string.unquote("\"#{ v.$var-down-left-and-up-right-to-center }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-eye { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-eye-slash { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-warning { - #{v.$icon-property}: string.unquote("\"#{ v.$var-triangle-exclamation }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-calendar { - #{v.$icon-property}: string.unquote("\"#{ v.$var-calendar-days }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-arrows-v { - #{v.$icon-property}: string.unquote("\"#{ v.$var-up-down }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-arrows-h { - #{v.$icon-property}: string.unquote("\"#{ v.$var-left-right }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-bar-chart { - #{v.$icon-property}: string.unquote("\"#{ v.$var-chart-column }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-bar-chart-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-chart-column }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-twitter-square { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-twitter-square { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square-twitter }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-facebook-square { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-facebook-square { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square-facebook }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-gears { - #{v.$icon-property}: string.unquote("\"#{ v.$var-gears }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-thumbs-o-up { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-thumbs-o-up { - #{v.$icon-property}: string.unquote("\"#{ v.$var-thumbs-up }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-thumbs-o-down { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-thumbs-o-down { - #{v.$icon-property}: string.unquote("\"#{ v.$var-thumbs-down }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-heart-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-heart-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-heart }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-sign-out { - #{v.$icon-property}: string.unquote("\"#{ v.$var-right-from-bracket }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-linkedin-square { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-linkedin-square { - #{v.$icon-property}: string.unquote("\"#{ v.$var-linkedin }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-thumb-tack { - #{v.$icon-property}: string.unquote("\"#{ v.$var-thumbtack }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-external-link { - #{v.$icon-property}: string.unquote("\"#{ v.$var-up-right-from-square }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-sign-in { - #{v.$icon-property}: string.unquote("\"#{ v.$var-right-to-bracket }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-github-square { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-github-square { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square-github }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-lemon-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-lemon-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-lemon }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-square-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-square-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-bookmark-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-bookmark-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-bookmark }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-twitter { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-facebook { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-facebook { - #{v.$icon-property}: string.unquote("\"#{ v.$var-facebook-f }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-facebook-f { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-facebook-f { - #{v.$icon-property}: string.unquote("\"#{ v.$var-facebook-f }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-github { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-credit-card { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-feed { - #{v.$icon-property}: string.unquote("\"#{ v.$var-rss }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-hdd-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-hdd-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-hard-drive }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-hand-o-right { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-hand-o-right { - #{v.$icon-property}: string.unquote("\"#{ v.$var-hand-point-right }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-hand-o-left { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-hand-o-left { - #{v.$icon-property}: string.unquote("\"#{ v.$var-hand-point-left }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-hand-o-up { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-hand-o-up { - #{v.$icon-property}: string.unquote("\"#{ v.$var-hand-point-up }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-hand-o-down { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-hand-o-down { - #{v.$icon-property}: string.unquote("\"#{ v.$var-hand-point-down }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-globe { - #{v.$icon-property}: string.unquote("\"#{ v.$var-earth-americas }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-tasks { - #{v.$icon-property}: string.unquote("\"#{ v.$var-bars-progress }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-arrows-alt { - #{v.$icon-property}: string.unquote("\"#{ v.$var-maximize }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-group { - #{v.$icon-property}: string.unquote("\"#{ v.$var-users }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-chain { - #{v.$icon-property}: string.unquote("\"#{ v.$var-link }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-cut { - #{v.$icon-property}: string.unquote("\"#{ v.$var-scissors }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-files-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-files-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-copy }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-floppy-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-floppy-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-floppy-disk }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-save { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-save { - #{v.$icon-property}: string.unquote("\"#{ v.$var-floppy-disk }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-navicon { - #{v.$icon-property}: string.unquote("\"#{ v.$var-bars }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-reorder { - #{v.$icon-property}: string.unquote("\"#{ v.$var-bars }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-magic { - #{v.$icon-property}: string.unquote("\"#{ v.$var-wand-magic-sparkles }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-pinterest { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-pinterest-square { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-pinterest-square { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square-pinterest }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-google-plus-square { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-google-plus-square { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square-google-plus }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-google-plus { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-google-plus { - #{v.$icon-property}: string.unquote("\"#{ v.$var-google-plus-g }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-money { - #{v.$icon-property}: string.unquote("\"#{ v.$var-money-bill-1 }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-unsorted { - #{v.$icon-property}: string.unquote("\"#{ v.$var-sort }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-sort-desc { - #{v.$icon-property}: string.unquote("\"#{ v.$var-sort-down }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-sort-asc { - #{v.$icon-property}: string.unquote("\"#{ v.$var-sort-up }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-linkedin { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-linkedin { - #{v.$icon-property}: string.unquote("\"#{ v.$var-linkedin-in }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-rotate-left { - #{v.$icon-property}: string.unquote("\"#{ v.$var-arrow-rotate-left }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-legal { - #{v.$icon-property}: string.unquote("\"#{ v.$var-gavel }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-tachometer { - #{v.$icon-property}: string.unquote("\"#{ v.$var-gauge-high }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-dashboard { - #{v.$icon-property}: string.unquote("\"#{ v.$var-gauge-high }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-comment-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-comment-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-comment }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-comments-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-comments-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-comments }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-flash { - #{v.$icon-property}: string.unquote("\"#{ v.$var-bolt }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-clipboard { - #{v.$icon-property}: string.unquote("\"#{ v.$var-paste }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-lightbulb-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-lightbulb-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-lightbulb }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-exchange { - #{v.$icon-property}: string.unquote("\"#{ v.$var-right-left }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-cloud-download { - #{v.$icon-property}: string.unquote("\"#{ v.$var-cloud-arrow-down }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-cloud-upload { - #{v.$icon-property}: string.unquote("\"#{ v.$var-cloud-arrow-up }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-bell-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-bell-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-bell }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-cutlery { - #{v.$icon-property}: string.unquote("\"#{ v.$var-utensils }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-text-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-text-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-file-lines }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-building-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-building-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-building }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-hospital-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-hospital-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-hospital }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-tablet { - #{v.$icon-property}: string.unquote("\"#{ v.$var-tablet-screen-button }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-mobile { - #{v.$icon-property}: string.unquote("\"#{ v.$var-mobile-screen-button }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-mobile-phone { - #{v.$icon-property}: string.unquote("\"#{ v.$var-mobile-screen-button }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-circle-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-circle-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-circle }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-mail-reply { - #{v.$icon-property}: string.unquote("\"#{ v.$var-reply }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-github-alt { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-folder-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-folder-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-folder }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-folder-open-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-folder-open-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-folder-open }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-smile-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-smile-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-face-smile }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-frown-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-frown-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-face-frown }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-meh-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-meh-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-face-meh }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-keyboard-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-keyboard-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-keyboard }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-flag-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-flag-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-flag }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-mail-reply-all { - #{v.$icon-property}: string.unquote("\"#{ v.$var-reply-all }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-star-half-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-star-half-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-star-half-stroke }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-star-half-empty { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-star-half-empty { - #{v.$icon-property}: string.unquote("\"#{ v.$var-star-half-stroke }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-star-half-full { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-star-half-full { - #{v.$icon-property}: string.unquote("\"#{ v.$var-star-half-stroke }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-code-fork { - #{v.$icon-property}: string.unquote("\"#{ v.$var-code-branch }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-chain-broken { - #{v.$icon-property}: string.unquote("\"#{ v.$var-link-slash }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-unlink { - #{v.$icon-property}: string.unquote("\"#{ v.$var-link-slash }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-calendar-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-calendar-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-calendar }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-maxcdn { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-html5 { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-css3 { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-unlock-alt { - #{v.$icon-property}: string.unquote("\"#{ v.$var-unlock }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-minus-square-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-minus-square-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square-minus }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-level-up { - #{v.$icon-property}: string.unquote("\"#{ v.$var-turn-up }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-level-down { - #{v.$icon-property}: string.unquote("\"#{ v.$var-turn-down }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-pencil-square { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square-pen }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-external-link-square { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square-up-right }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-compass { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-caret-square-o-down { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-caret-square-o-down { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square-caret-down }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-toggle-down { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-toggle-down { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square-caret-down }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-caret-square-o-up { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-caret-square-o-up { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square-caret-up }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-toggle-up { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-toggle-up { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square-caret-up }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-caret-square-o-right { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-caret-square-o-right { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square-caret-right }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-toggle-right { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-toggle-right { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square-caret-right }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-eur { - #{v.$icon-property}: string.unquote("\"#{ v.$var-euro-sign }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-euro { - #{v.$icon-property}: string.unquote("\"#{ v.$var-euro-sign }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-gbp { - #{v.$icon-property}: string.unquote("\"#{ v.$var-sterling-sign }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-usd { - #{v.$icon-property}: string.unquote("\"#{ v.$var-dollar-sign }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-dollar { - #{v.$icon-property}: string.unquote("\"#{ v.$var-dollar-sign }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-inr { - #{v.$icon-property}: string.unquote("\"#{ v.$var-indian-rupee-sign }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-rupee { - #{v.$icon-property}: string.unquote("\"#{ v.$var-indian-rupee-sign }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-jpy { - #{v.$icon-property}: string.unquote("\"#{ v.$var-yen-sign }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-cny { - #{v.$icon-property}: string.unquote("\"#{ v.$var-yen-sign }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-rmb { - #{v.$icon-property}: string.unquote("\"#{ v.$var-yen-sign }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-yen { - #{v.$icon-property}: string.unquote("\"#{ v.$var-yen-sign }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-rub { - #{v.$icon-property}: string.unquote("\"#{ v.$var-ruble-sign }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-ruble { - #{v.$icon-property}: string.unquote("\"#{ v.$var-ruble-sign }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-rouble { - #{v.$icon-property}: string.unquote("\"#{ v.$var-ruble-sign }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-krw { - #{v.$icon-property}: string.unquote("\"#{ v.$var-won-sign }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-won { - #{v.$icon-property}: string.unquote("\"#{ v.$var-won-sign }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-btc { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-bitcoin { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-bitcoin { - #{v.$icon-property}: string.unquote("\"#{ v.$var-btc }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-text { - #{v.$icon-property}: string.unquote("\"#{ v.$var-file-lines }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-sort-alpha-asc { - #{v.$icon-property}: string.unquote("\"#{ v.$var-arrow-down-a-z }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-sort-alpha-desc { - #{v.$icon-property}: string.unquote("\"#{ v.$var-arrow-down-z-a }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-sort-amount-asc { - #{v.$icon-property}: string.unquote("\"#{ v.$var-arrow-down-short-wide }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-sort-amount-desc { - #{v.$icon-property}: string.unquote("\"#{ v.$var-arrow-down-wide-short }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-sort-numeric-asc { - #{v.$icon-property}: string.unquote("\"#{ v.$var-arrow-down-1-9 }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-sort-numeric-desc { - #{v.$icon-property}: string.unquote("\"#{ v.$var-arrow-down-9-1 }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-youtube-square { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-youtube-square { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square-youtube }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-youtube { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-xing { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-xing-square { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-xing-square { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square-xing }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-youtube-play { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-youtube-play { - #{v.$icon-property}: string.unquote("\"#{ v.$var-youtube }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-dropbox { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-stack-overflow { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-instagram { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-flickr { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-adn { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-bitbucket { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-bitbucket-square { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-bitbucket-square { - #{v.$icon-property}: string.unquote("\"#{ v.$var-bitbucket }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-tumblr { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-tumblr-square { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-tumblr-square { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square-tumblr }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-long-arrow-down { - #{v.$icon-property}: string.unquote("\"#{ v.$var-down-long }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-long-arrow-up { - #{v.$icon-property}: string.unquote("\"#{ v.$var-up-long }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-long-arrow-left { - #{v.$icon-property}: string.unquote("\"#{ v.$var-left-long }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-long-arrow-right { - #{v.$icon-property}: string.unquote("\"#{ v.$var-right-long }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-apple { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-windows { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-android { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-linux { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-dribbble { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-skype { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-foursquare { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-trello { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-gratipay { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-gittip { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-gittip { - #{v.$icon-property}: string.unquote("\"#{ v.$var-gratipay }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-sun-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-sun-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-sun }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-moon-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-moon-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-moon }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-vk { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-weibo { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-renren { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-pagelines { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-stack-exchange { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-arrow-circle-o-right { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-arrow-circle-o-right { - #{v.$icon-property}: string.unquote("\"#{ v.$var-circle-right }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-arrow-circle-o-left { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-arrow-circle-o-left { - #{v.$icon-property}: string.unquote("\"#{ v.$var-circle-left }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-caret-square-o-left { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-caret-square-o-left { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square-caret-left }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-toggle-left { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-toggle-left { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square-caret-left }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-dot-circle-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-dot-circle-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-circle-dot }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-vimeo-square { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-vimeo-square { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square-vimeo }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-try { - #{v.$icon-property}: string.unquote("\"#{ v.$var-turkish-lira-sign }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-turkish-lira { - #{v.$icon-property}: string.unquote("\"#{ v.$var-turkish-lira-sign }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-plus-square-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-plus-square-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square-plus }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-slack { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-wordpress { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-openid { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-institution { - #{v.$icon-property}: string.unquote("\"#{ v.$var-building-columns }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-bank { - #{v.$icon-property}: string.unquote("\"#{ v.$var-building-columns }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-mortar-board { - #{v.$icon-property}: string.unquote("\"#{ v.$var-graduation-cap }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-yahoo { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-google { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-reddit { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-reddit-square { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-reddit-square { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square-reddit }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-stumbleupon-circle { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-stumbleupon { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-delicious { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-digg { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-pied-piper-pp { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-pied-piper-alt { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-drupal { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-joomla { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-behance { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-behance-square { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-behance-square { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square-behance }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-steam { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-steam-square { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-steam-square { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square-steam }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-automobile { - #{v.$icon-property}: string.unquote("\"#{ v.$var-car }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-cab { - #{v.$icon-property}: string.unquote("\"#{ v.$var-taxi }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-spotify { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-deviantart { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-soundcloud { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-pdf-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-pdf-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-file-pdf }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-word-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-word-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-file-word }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-excel-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-excel-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-file-excel }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-powerpoint-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-powerpoint-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-file-powerpoint }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-image-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-image-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-file-image }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-photo-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-photo-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-file-image }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-picture-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-picture-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-file-image }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-archive-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-archive-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-file-zipper }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-zip-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-zip-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-file-zipper }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-audio-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-audio-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-file-audio }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-sound-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-sound-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-file-audio }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-video-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-video-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-file-video }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-movie-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-movie-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-file-video }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-code-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-file-code-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-file-code }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-vine { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-codepen { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-jsfiddle { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-life-bouy { - #{v.$icon-property}: string.unquote("\"#{ v.$var-life-ring }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-life-buoy { - #{v.$icon-property}: string.unquote("\"#{ v.$var-life-ring }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-life-saver { - #{v.$icon-property}: string.unquote("\"#{ v.$var-life-ring }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-support { - #{v.$icon-property}: string.unquote("\"#{ v.$var-life-ring }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-circle-o-notch { - #{v.$icon-property}: string.unquote("\"#{ v.$var-circle-notch }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-rebel { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-ra { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-ra { - #{v.$icon-property}: string.unquote("\"#{ v.$var-rebel }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-resistance { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-resistance { - #{v.$icon-property}: string.unquote("\"#{ v.$var-rebel }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-empire { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-ge { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-ge { - #{v.$icon-property}: string.unquote("\"#{ v.$var-empire }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-git-square { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-git-square { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square-git }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-git { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-hacker-news { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-y-combinator-square { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-y-combinator-square { - #{v.$icon-property}: string.unquote("\"#{ v.$var-hacker-news }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-yc-square { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-yc-square { - #{v.$icon-property}: string.unquote("\"#{ v.$var-hacker-news }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-tencent-weibo { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-qq { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-weixin { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-wechat { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-wechat { - #{v.$icon-property}: string.unquote("\"#{ v.$var-weixin }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-send { - #{v.$icon-property}: string.unquote("\"#{ v.$var-paper-plane }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-paper-plane-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-paper-plane-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-paper-plane }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-send-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-send-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-paper-plane }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-circle-thin { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-circle-thin { - #{v.$icon-property}: string.unquote("\"#{ v.$var-circle }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-header { - #{v.$icon-property}: string.unquote("\"#{ v.$var-heading }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-futbol-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-futbol-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-futbol }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-soccer-ball-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-soccer-ball-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-futbol }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-slideshare { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-twitch { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-yelp { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-newspaper-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-newspaper-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-newspaper }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-paypal { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-google-wallet { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-cc-visa { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-cc-mastercard { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-cc-discover { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-cc-amex { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-cc-paypal { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-cc-stripe { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-bell-slash-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-bell-slash-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-bell-slash }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-trash { - #{v.$icon-property}: string.unquote("\"#{ v.$var-trash-can }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-copyright { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-eyedropper { - #{v.$icon-property}: string.unquote("\"#{ v.$var-eye-dropper }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-area-chart { - #{v.$icon-property}: string.unquote("\"#{ v.$var-chart-area }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-pie-chart { - #{v.$icon-property}: string.unquote("\"#{ v.$var-chart-pie }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-line-chart { - #{v.$icon-property}: string.unquote("\"#{ v.$var-chart-line }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-lastfm { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-lastfm-square { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-lastfm-square { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square-lastfm }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-ioxhost { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-angellist { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-cc { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-cc { - #{v.$icon-property}: string.unquote("\"#{ v.$var-closed-captioning }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-ils { - #{v.$icon-property}: string.unquote("\"#{ v.$var-shekel-sign }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-shekel { - #{v.$icon-property}: string.unquote("\"#{ v.$var-shekel-sign }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-sheqel { - #{v.$icon-property}: string.unquote("\"#{ v.$var-shekel-sign }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-buysellads { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-connectdevelop { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-dashcube { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-forumbee { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-leanpub { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-sellsy { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-shirtsinbulk { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-simplybuilt { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-skyatlas { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-diamond { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-diamond { - #{v.$icon-property}: string.unquote("\"#{ v.$var-gem }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-transgender { - #{v.$icon-property}: string.unquote("\"#{ v.$var-mars-and-venus }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-intersex { - #{v.$icon-property}: string.unquote("\"#{ v.$var-mars-and-venus }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-transgender-alt { - #{v.$icon-property}: string.unquote("\"#{ v.$var-transgender }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-facebook-official { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-facebook-official { - #{v.$icon-property}: string.unquote("\"#{ v.$var-facebook }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-pinterest-p { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-whatsapp { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-hotel { - #{v.$icon-property}: string.unquote("\"#{ v.$var-bed }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-viacoin { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-medium { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-y-combinator { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-yc { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-yc { - #{v.$icon-property}: string.unquote("\"#{ v.$var-y-combinator }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-optin-monster { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-opencart { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-expeditedssl { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-battery-4 { - #{v.$icon-property}: string.unquote("\"#{ v.$var-battery-full }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-battery { - #{v.$icon-property}: string.unquote("\"#{ v.$var-battery-full }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-battery-3 { - #{v.$icon-property}: string.unquote("\"#{ v.$var-battery-three-quarters }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-battery-2 { - #{v.$icon-property}: string.unquote("\"#{ v.$var-battery-half }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-battery-1 { - #{v.$icon-property}: string.unquote("\"#{ v.$var-battery-quarter }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-battery-0 { - #{v.$icon-property}: string.unquote("\"#{ v.$var-battery-empty }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-object-group { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-object-ungroup { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-sticky-note-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-sticky-note-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-note-sticky }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-cc-jcb { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-cc-diners-club { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-clone { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-hourglass-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-hourglass }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-hourglass-1 { - #{v.$icon-property}: string.unquote("\"#{ v.$var-hourglass-start }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-hourglass-2 { - #{v.$icon-property}: string.unquote("\"#{ v.$var-hourglass-half }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-hourglass-3 { - #{v.$icon-property}: string.unquote("\"#{ v.$var-hourglass-end }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-hand-rock-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-hand-rock-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-hand-back-fist }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-hand-grab-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-hand-grab-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-hand-back-fist }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-hand-paper-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-hand-paper-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-hand }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-hand-stop-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-hand-stop-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-hand }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-hand-scissors-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-hand-scissors-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-hand-scissors }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-hand-lizard-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-hand-lizard-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-hand-lizard }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-hand-spock-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-hand-spock-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-hand-spock }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-hand-pointer-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-hand-pointer-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-hand-pointer }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-hand-peace-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-hand-peace-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-hand-peace }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-registered { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-creative-commons { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-gg { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-gg-circle { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-odnoklassniki { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-odnoklassniki-square { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-odnoklassniki-square { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square-odnoklassniki }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-get-pocket { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-wikipedia-w { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-safari { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-chrome { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-firefox { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-opera { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-internet-explorer { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-television { - #{v.$icon-property}: string.unquote("\"#{ v.$var-tv }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-contao { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-500px { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-amazon { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-calendar-plus-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-calendar-plus-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-calendar-plus }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-calendar-minus-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-calendar-minus-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-calendar-minus }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-calendar-times-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-calendar-times-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-calendar-xmark }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-calendar-check-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-calendar-check-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-calendar-check }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-map-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-map-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-map }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-commenting { - #{v.$icon-property}: string.unquote("\"#{ v.$var-comment-dots }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-commenting-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-commenting-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-comment-dots }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-houzz { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-vimeo { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-vimeo { - #{v.$icon-property}: string.unquote("\"#{ v.$var-vimeo-v }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-black-tie { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-fonticons { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-reddit-alien { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-edge { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-credit-card-alt { - #{v.$icon-property}: string.unquote("\"#{ v.$var-credit-card }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-codiepie { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-modx { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-fort-awesome { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-usb { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-product-hunt { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-mixcloud { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-scribd { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-pause-circle-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-pause-circle-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-circle-pause }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-stop-circle-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-stop-circle-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-circle-stop }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-bluetooth { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-bluetooth-b { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-gitlab { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-wpbeginner { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-wpforms { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-envira { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-wheelchair-alt { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-wheelchair-alt { - #{v.$icon-property}: string.unquote("\"#{ v.$var-accessible-icon }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-question-circle-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-question-circle-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-circle-question }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-volume-control-phone { - #{v.$icon-property}: string.unquote("\"#{ v.$var-phone-volume }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-asl-interpreting { - #{v.$icon-property}: string.unquote("\"#{ v.$var-hands-asl-interpreting }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-deafness { - #{v.$icon-property}: string.unquote("\"#{ v.$var-ear-deaf }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-hard-of-hearing { - #{v.$icon-property}: string.unquote("\"#{ v.$var-ear-deaf }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-glide { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-glide-g { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-signing { - #{v.$icon-property}: string.unquote("\"#{ v.$var-hands }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-viadeo { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-viadeo-square { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-viadeo-square { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square-viadeo }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-snapchat { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-snapchat-ghost { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-snapchat-ghost { - #{v.$icon-property}: string.unquote("\"#{ v.$var-snapchat }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-snapchat-square { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-snapchat-square { - #{v.$icon-property}: string.unquote("\"#{ v.$var-square-snapchat }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-pied-piper { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-first-order { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-yoast { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-themeisle { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-google-plus-official { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-google-plus-official { - #{v.$icon-property}: string.unquote("\"#{ v.$var-google-plus }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-google-plus-circle { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-google-plus-circle { - #{v.$icon-property}: string.unquote("\"#{ v.$var-google-plus }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-font-awesome { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-fa { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-fa { - #{v.$icon-property}: string.unquote("\"#{ v.$var-font-awesome }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-handshake-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-handshake-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-handshake }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-envelope-open-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-envelope-open-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-envelope-open }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-linode { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-address-book-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-address-book-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-address-book }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-vcard { - #{v.$icon-property}: string.unquote("\"#{ v.$var-address-card }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-address-card-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-address-card-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-address-card }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-vcard-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-vcard-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-address-card }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-user-circle-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-user-circle-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-circle-user }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-user-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-user-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-user }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-id-badge { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-drivers-license { - #{v.$icon-property}: string.unquote("\"#{ v.$var-id-card }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-id-card-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-id-card-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-id-card }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-drivers-license-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-drivers-license-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-id-card }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-quora { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-free-code-camp { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-telegram { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-thermometer-4 { - #{v.$icon-property}: string.unquote("\"#{ v.$var-temperature-full }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-thermometer { - #{v.$icon-property}: string.unquote("\"#{ v.$var-temperature-full }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-thermometer-3 { - #{v.$icon-property}: string.unquote("\"#{ v.$var-temperature-three-quarters }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-thermometer-2 { - #{v.$icon-property}: string.unquote("\"#{ v.$var-temperature-half }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-thermometer-1 { - #{v.$icon-property}: string.unquote("\"#{ v.$var-temperature-quarter }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-thermometer-0 { - #{v.$icon-property}: string.unquote("\"#{ v.$var-temperature-empty }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-bathtub { - #{v.$icon-property}: string.unquote("\"#{ v.$var-bath }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-s15 { - #{v.$icon-property}: string.unquote("\"#{ v.$var-bath }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-window-maximize { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-window-restore { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-times-rectangle { - #{v.$icon-property}: string.unquote("\"#{ v.$var-rectangle-xmark }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-window-close-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-window-close-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-rectangle-xmark }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-times-rectangle-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-times-rectangle-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-rectangle-xmark }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-bandcamp { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-grav { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-etsy { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-imdb { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-ravelry { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-eercast { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-eercast { - #{v.$icon-property}: string.unquote("\"#{ v.$var-sellcast }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-snowflake-o { - font-family: 'Font Awesome 7 Free'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-snowflake-o { - #{v.$icon-property}: string.unquote("\"#{ v.$var-snowflake }\""); -} -.#{v.$css-prefix}.#{v.$css-prefix}-superpowers { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-wpexplorer { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} -.#{v.$css-prefix}.#{v.$css-prefix}-meetup { - font-family: 'Font Awesome 7 Brands'; - font-weight: 400; -} diff --git a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_sizing.scss b/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_sizing.scss deleted file mode 100644 index 90a5573..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_sizing.scss +++ /dev/null @@ -1,18 +0,0 @@ -// sizing icons -// ------------------------- -@use 'variables' as v; -@use 'mixins' as m; - -// literal magnification scale -@for $i from 1 through 10 { - .#{v.$css-prefix}-#{$i}x { - font-size: $i * 1em; - } -} - -// step-based scale (with alignment) -@each $size, $value in v.$sizes { - .#{v.$css-prefix}-#{$size} { - @include m.fa-size($value); - } -} diff --git a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_stacked.scss b/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_stacked.scss deleted file mode 100644 index dbc86e1..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_stacked.scss +++ /dev/null @@ -1,35 +0,0 @@ -// stacking icons -// ------------------------- -@use 'variables' as v; - -.#{v.$css-prefix}-stack { - display: inline-block; - height: 2em; - line-height: 2em; - position: relative; - vertical-align: v.$stack-vertical-align; - width: v.$stack-width; -} - -.#{v.$css-prefix}-stack-1x, -.#{v.$css-prefix}-stack-2x { - --#{v.$css-prefix}-width: 100%; - - inset: 0; - position: absolute; - text-align: center; - width: var(--#{v.$css-prefix}-width); - z-index: var(--#{v.$css-prefix}-stack-z-index, #{v.$stack-z-index}); -} - -.#{v.$css-prefix}-stack-1x { - line-height: inherit; -} - -.#{v.$css-prefix}-stack-2x { - font-size: 2em; -} - -.#{v.$css-prefix}-inverse { - color: var(--#{v.$css-prefix}-inverse, #{v.$inverse}); -} diff --git a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_variables.scss b/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_variables.scss deleted file mode 100644 index 9c38f6b..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_variables.scss +++ /dev/null @@ -1,5134 +0,0 @@ -// variables -// -------------------------- - -$css-prefix: fa !default; -$style: 900 !default; -$family: 'Font Awesome 7 Free' !default; - -$icon-property: --fa !default; - -$display: inline-block !default; - -$fw-width: calc((20 / 16) * 1em) !default; -$inverse: #fff !default; - -$border-box-sizing: content-box !default; -$border-color: #eee !default; -$border-padding: 0.1875em 0.25em !default; -$border-radius: 0.1em !default; -$border-style: solid !default; -$border-width: 0.0625em !default; - -$size-scale-2xs: 10 !default; -$size-scale-xs: 12 !default; -$size-scale-sm: 14 !default; -$size-scale-base: 16 !default; -$size-scale-lg: 20 !default; -$size-scale-xl: 24 !default; -$size-scale-2xl: 32 !default; - -$sizes: ( - '2xs': $size-scale-2xs, - 'xs': $size-scale-xs, - 'sm': $size-scale-sm, - 'lg': $size-scale-lg, - 'xl': $size-scale-xl, - '2xl': $size-scale-2xl, -) !default; - -$li-width: 2em !default; -$li-margin: calc($li-width * (5 / 4)) !default; - -$pull-margin: 0.3em !default; - -$primary-opacity: 1 !default; -$secondary-opacity: 0.4 !default; - -$stack-vertical-align: middle !default; -$stack-width: ($fw-width * 2) !default; -$stack-z-index: auto !default; - -// web fonts-related variables -$font-display: block !default; -$font-path: '../fonts/fontawesome-7.1.0' !default; - -// deprecated: these older SCSS variables will be removed with Font Awesome's next major release -$style-family: $family; - -$var-0: \30; -$var-1: \31; -$var-2: \32; -$var-3: \33; -$var-4: \34; -$var-5: \35; -$var-6: \36; -$var-7: \37; -$var-8: \38; -$var-9: \39; -$var-exclamation: \21; -$var-hashtag: \23; -$var-dollar-sign: \24; -$var-dollar: \24; -$var-usd: \24; -$var-percent: \25; -$var-percentage: \25; -$var-asterisk: \2a; -$var-plus: \2b; -$var-add: \2b; -$var-less-than: \3c; -$var-equals: \3d; -$var-greater-than: \3e; -$var-question: \3f; -$var-at: \40; -$var-a: \41; -$var-b: \42; -$var-c: \43; -$var-d: \44; -$var-e: \45; -$var-f: \46; -$var-g: \47; -$var-h: \48; -$var-i: \49; -$var-j: \4a; -$var-k: \4b; -$var-l: \4c; -$var-m: \4d; -$var-n: \4e; -$var-o: \4f; -$var-p: \50; -$var-q: \51; -$var-r: \52; -$var-s: \53; -$var-t: \54; -$var-u: \55; -$var-v: \56; -$var-w: \57; -$var-x: \58; -$var-y: \59; -$var-z: \5a; -$var-faucet: \e005; -$var-faucet-drip: \e006; -$var-house-chimney-window: \e00d; -$var-house-signal: \e012; -$var-temperature-arrow-down: \e03f; -$var-temperature-down: \e03f; -$var-temperature-arrow-up: \e040; -$var-temperature-up: \e040; -$var-trailer: \e041; -$var-bacteria: \e059; -$var-bacterium: \e05a; -$var-box-tissue: \e05b; -$var-hand-holding-medical: \e05c; -$var-hand-sparkles: \e05d; -$var-hands-bubbles: \e05e; -$var-hands-wash: \e05e; -$var-handshake-slash: \e060; -$var-handshake-alt-slash: \e060; -$var-handshake-simple-slash: \e060; -$var-head-side-cough: \e061; -$var-head-side-cough-slash: \e062; -$var-head-side-mask: \e063; -$var-head-side-virus: \e064; -$var-house-chimney-user: \e065; -$var-house-laptop: \e066; -$var-laptop-house: \e066; -$var-lungs-virus: \e067; -$var-people-arrows: \e068; -$var-people-arrows-left-right: \e068; -$var-plane-slash: \e069; -$var-pump-medical: \e06a; -$var-pump-soap: \e06b; -$var-shield-virus: \e06c; -$var-sink: \e06d; -$var-soap: \e06e; -$var-stopwatch-20: \e06f; -$var-shop-slash: \e070; -$var-store-alt-slash: \e070; -$var-store-slash: \e071; -$var-toilet-paper-slash: \e072; -$var-users-slash: \e073; -$var-virus: \e074; -$var-virus-slash: \e075; -$var-viruses: \e076; -$var-vest: \e085; -$var-vest-patches: \e086; -$var-arrow-trend-down: \e097; -$var-arrow-trend-up: \e098; -$var-arrow-up-from-bracket: \e09a; -$var-austral-sign: \e0a9; -$var-baht-sign: \e0ac; -$var-bitcoin-sign: \e0b4; -$var-bolt-lightning: \e0b7; -$var-book-bookmark: \e0bb; -$var-camera-rotate: \e0d8; -$var-cedi-sign: \e0df; -$var-chart-column: \e0e3; -$var-chart-gantt: \e0e4; -$var-clapperboard: \e131; -$var-clover: \e139; -$var-code-compare: \e13a; -$var-code-fork: \e13b; -$var-code-pull-request: \e13c; -$var-colon-sign: \e140; -$var-cruzeiro-sign: \e152; -$var-display: \e163; -$var-dong-sign: \e169; -$var-elevator: \e16d; -$var-filter-circle-xmark: \e17b; -$var-florin-sign: \e184; -$var-folder-closed: \e185; -$var-franc-sign: \e18f; -$var-guarani-sign: \e19a; -$var-gun: \e19b; -$var-hands-clapping: \e1a8; -$var-house-user: \e1b0; -$var-home-user: \e1b0; -$var-indian-rupee-sign: \e1bc; -$var-indian-rupee: \e1bc; -$var-inr: \e1bc; -$var-kip-sign: \e1c4; -$var-lari-sign: \e1c8; -$var-litecoin-sign: \e1d3; -$var-manat-sign: \e1d5; -$var-mask-face: \e1d7; -$var-mill-sign: \e1ed; -$var-money-bills: \e1f3; -$var-naira-sign: \e1f6; -$var-notdef: \e1fe; -$var-panorama: \e209; -$var-peseta-sign: \e221; -$var-peso-sign: \e222; -$var-plane-up: \e22d; -$var-rupiah-sign: \e23d; -$var-stairs: \e289; -$var-timeline: \e29c; -$var-truck-front: \e2b7; -$var-turkish-lira-sign: \e2bb; -$var-try: \e2bb; -$var-turkish-lira: \e2bb; -$var-vault: \e2c5; -$var-wand-magic-sparkles: \e2ca; -$var-magic-wand-sparkles: \e2ca; -$var-wheat-awn: \e2cd; -$var-wheat-alt: \e2cd; -$var-wheelchair-move: \e2ce; -$var-wheelchair-alt: \e2ce; -$var-bangladeshi-taka-sign: \e2e6; -$var-bowl-rice: \e2eb; -$var-person-pregnant: \e31e; -$var-house-chimney: \e3af; -$var-home-lg: \e3af; -$var-house-crack: \e3b1; -$var-house-medical: \e3b2; -$var-cent-sign: \e3f5; -$var-plus-minus: \e43c; -$var-sailboat: \e445; -$var-section: \e447; -$var-shrimp: \e448; -$var-brazilian-real-sign: \e46c; -$var-chart-simple: \e473; -$var-diagram-next: \e476; -$var-diagram-predecessor: \e477; -$var-diagram-successor: \e47a; -$var-earth-oceania: \e47b; -$var-globe-oceania: \e47b; -$var-bug-slash: \e490; -$var-file-circle-plus: \e494; -$var-shop-lock: \e4a5; -$var-virus-covid: \e4a8; -$var-virus-covid-slash: \e4a9; -$var-anchor-circle-check: \e4aa; -$var-anchor-circle-exclamation: \e4ab; -$var-anchor-circle-xmark: \e4ac; -$var-anchor-lock: \e4ad; -$var-arrow-down-up-across-line: \e4af; -$var-arrow-down-up-lock: \e4b0; -$var-arrow-right-to-city: \e4b3; -$var-arrow-up-from-ground-water: \e4b5; -$var-arrow-up-from-water-pump: \e4b6; -$var-arrow-up-right-dots: \e4b7; -$var-arrows-down-to-line: \e4b8; -$var-arrows-down-to-people: \e4b9; -$var-arrows-left-right-to-line: \e4ba; -$var-arrows-spin: \e4bb; -$var-arrows-split-up-and-left: \e4bc; -$var-arrows-to-circle: \e4bd; -$var-arrows-to-dot: \e4be; -$var-arrows-to-eye: \e4bf; -$var-arrows-turn-right: \e4c0; -$var-arrows-turn-to-dots: \e4c1; -$var-arrows-up-to-line: \e4c2; -$var-bore-hole: \e4c3; -$var-bottle-droplet: \e4c4; -$var-bottle-water: \e4c5; -$var-bowl-food: \e4c6; -$var-boxes-packing: \e4c7; -$var-bridge: \e4c8; -$var-bridge-circle-check: \e4c9; -$var-bridge-circle-exclamation: \e4ca; -$var-bridge-circle-xmark: \e4cb; -$var-bridge-lock: \e4cc; -$var-bridge-water: \e4ce; -$var-bucket: \e4cf; -$var-bugs: \e4d0; -$var-building-circle-arrow-right: \e4d1; -$var-building-circle-check: \e4d2; -$var-building-circle-exclamation: \e4d3; -$var-building-circle-xmark: \e4d4; -$var-building-flag: \e4d5; -$var-building-lock: \e4d6; -$var-building-ngo: \e4d7; -$var-building-shield: \e4d8; -$var-building-un: \e4d9; -$var-building-user: \e4da; -$var-building-wheat: \e4db; -$var-burst: \e4dc; -$var-car-on: \e4dd; -$var-car-tunnel: \e4de; -$var-child-combatant: \e4e0; -$var-child-rifle: \e4e0; -$var-children: \e4e1; -$var-circle-nodes: \e4e2; -$var-clipboard-question: \e4e3; -$var-cloud-showers-water: \e4e4; -$var-computer: \e4e5; -$var-cubes-stacked: \e4e6; -$var-envelope-circle-check: \e4e8; -$var-explosion: \e4e9; -$var-ferry: \e4ea; -$var-file-circle-exclamation: \e4eb; -$var-file-circle-minus: \e4ed; -$var-file-circle-question: \e4ef; -$var-file-shield: \e4f0; -$var-fire-burner: \e4f1; -$var-fish-fins: \e4f2; -$var-flask-vial: \e4f3; -$var-glass-water: \e4f4; -$var-glass-water-droplet: \e4f5; -$var-group-arrows-rotate: \e4f6; -$var-hand-holding-hand: \e4f7; -$var-handcuffs: \e4f8; -$var-hands-bound: \e4f9; -$var-hands-holding-child: \e4fa; -$var-hands-holding-circle: \e4fb; -$var-heart-circle-bolt: \e4fc; -$var-heart-circle-check: \e4fd; -$var-heart-circle-exclamation: \e4fe; -$var-heart-circle-minus: \e4ff; -$var-heart-circle-plus: \e500; -$var-heart-circle-xmark: \e501; -$var-helicopter-symbol: \e502; -$var-helmet-un: \e503; -$var-hill-avalanche: \e507; -$var-hill-rockslide: \e508; -$var-house-circle-check: \e509; -$var-house-circle-exclamation: \e50a; -$var-house-circle-xmark: \e50b; -$var-house-fire: \e50c; -$var-house-flag: \e50d; -$var-house-flood-water: \e50e; -$var-house-flood-water-circle-arrow-right: \e50f; -$var-house-lock: \e510; -$var-house-medical-circle-check: \e511; -$var-house-medical-circle-exclamation: \e512; -$var-house-medical-circle-xmark: \e513; -$var-house-medical-flag: \e514; -$var-house-tsunami: \e515; -$var-jar: \e516; -$var-jar-wheat: \e517; -$var-jet-fighter-up: \e518; -$var-jug-detergent: \e519; -$var-kitchen-set: \e51a; -$var-land-mine-on: \e51b; -$var-landmark-flag: \e51c; -$var-laptop-file: \e51d; -$var-lines-leaning: \e51e; -$var-location-pin-lock: \e51f; -$var-locust: \e520; -$var-magnifying-glass-arrow-right: \e521; -$var-magnifying-glass-chart: \e522; -$var-mars-and-venus-burst: \e523; -$var-mask-ventilator: \e524; -$var-mattress-pillow: \e525; -$var-mobile-retro: \e527; -$var-money-bill-transfer: \e528; -$var-money-bill-trend-up: \e529; -$var-money-bill-wheat: \e52a; -$var-mosquito: \e52b; -$var-mosquito-net: \e52c; -$var-mound: \e52d; -$var-mountain-city: \e52e; -$var-mountain-sun: \e52f; -$var-oil-well: \e532; -$var-people-group: \e533; -$var-people-line: \e534; -$var-people-pulling: \e535; -$var-people-robbery: \e536; -$var-people-roof: \e537; -$var-person-arrow-down-to-line: \e538; -$var-person-arrow-up-from-line: \e539; -$var-person-breastfeeding: \e53a; -$var-person-burst: \e53b; -$var-person-cane: \e53c; -$var-person-chalkboard: \e53d; -$var-person-circle-check: \e53e; -$var-person-circle-exclamation: \e53f; -$var-person-circle-minus: \e540; -$var-person-circle-plus: \e541; -$var-person-circle-question: \e542; -$var-person-circle-xmark: \e543; -$var-person-dress-burst: \e544; -$var-person-drowning: \e545; -$var-person-falling: \e546; -$var-person-falling-burst: \e547; -$var-person-half-dress: \e548; -$var-person-harassing: \e549; -$var-person-military-pointing: \e54a; -$var-person-military-rifle: \e54b; -$var-person-military-to-person: \e54c; -$var-person-rays: \e54d; -$var-person-rifle: \e54e; -$var-person-shelter: \e54f; -$var-person-walking-arrow-loop-left: \e551; -$var-person-walking-arrow-right: \e552; -$var-person-walking-dashed-line-arrow-right: \e553; -$var-person-walking-luggage: \e554; -$var-plane-circle-check: \e555; -$var-plane-circle-exclamation: \e556; -$var-plane-circle-xmark: \e557; -$var-plane-lock: \e558; -$var-plate-wheat: \e55a; -$var-plug-circle-bolt: \e55b; -$var-plug-circle-check: \e55c; -$var-plug-circle-exclamation: \e55d; -$var-plug-circle-minus: \e55e; -$var-plug-circle-plus: \e55f; -$var-plug-circle-xmark: \e560; -$var-ranking-star: \e561; -$var-road-barrier: \e562; -$var-road-bridge: \e563; -$var-road-circle-check: \e564; -$var-road-circle-exclamation: \e565; -$var-road-circle-xmark: \e566; -$var-road-lock: \e567; -$var-road-spikes: \e568; -$var-rug: \e569; -$var-sack-xmark: \e56a; -$var-school-circle-check: \e56b; -$var-school-circle-exclamation: \e56c; -$var-school-circle-xmark: \e56d; -$var-school-flag: \e56e; -$var-school-lock: \e56f; -$var-sheet-plastic: \e571; -$var-shield-cat: \e572; -$var-shield-dog: \e573; -$var-shield-heart: \e574; -$var-square-nfi: \e576; -$var-square-person-confined: \e577; -$var-square-virus: \e578; -$var-staff-snake: \e579; -$var-rod-asclepius: \e579; -$var-rod-snake: \e579; -$var-staff-aesculapius: \e579; -$var-sun-plant-wilt: \e57a; -$var-tarp: \e57b; -$var-tarp-droplet: \e57c; -$var-tent: \e57d; -$var-tent-arrow-down-to-line: \e57e; -$var-tent-arrow-left-right: \e57f; -$var-tent-arrow-turn-left: \e580; -$var-tent-arrows-down: \e581; -$var-tents: \e582; -$var-toilet-portable: \e583; -$var-toilets-portable: \e584; -$var-tower-cell: \e585; -$var-tower-observation: \e586; -$var-tree-city: \e587; -$var-trowel: \e589; -$var-trowel-bricks: \e58a; -$var-truck-arrow-right: \e58b; -$var-truck-droplet: \e58c; -$var-truck-field: \e58d; -$var-truck-field-un: \e58e; -$var-truck-plane: \e58f; -$var-users-between-lines: \e591; -$var-users-line: \e592; -$var-users-rays: \e593; -$var-users-rectangle: \e594; -$var-users-viewfinder: \e595; -$var-vial-circle-check: \e596; -$var-vial-virus: \e597; -$var-wheat-awn-circle-exclamation: \e598; -$var-worm: \e599; -$var-xmarks-lines: \e59a; -$var-child-dress: \e59c; -$var-child-reaching: \e59d; -$var-file-circle-check: \e5a0; -$var-file-circle-xmark: \e5a1; -$var-person-through-window: \e5a9; -$var-plant-wilt: \e5aa; -$var-stapler: \e5af; -$var-train-tram: \e5b4; -$var-table-cells-column-lock: \e678; -$var-table-cells-row-lock: \e67a; -$var-web-awesome: \e682; -$var-thumbtack-slash: \e68f; -$var-thumb-tack-slash: \e68f; -$var-table-cells-row-unlock: \e691; -$var-chart-diagram: \e695; -$var-comment-nodes: \e696; -$var-file-fragment: \e697; -$var-file-half-dashed: \e698; -$var-hexagon-nodes: \e699; -$var-hexagon-nodes-bolt: \e69a; -$var-square-binary: \e69b; -$var-pentagon: \e790; -$var-non-binary: \e807; -$var-spiral: \e80a; -$var-mobile-vibrate: \e816; -$var-single-quote-left: \e81b; -$var-single-quote-right: \e81c; -$var-bus-side: \e81d; -$var-septagon: \e820; -$var-heptagon: \e820; -$var-martini-glass-empty: \f000; -$var-glass-martini: \f000; -$var-music: \f001; -$var-magnifying-glass: \f002; -$var-search: \f002; -$var-heart: \f004; -$var-star: \f005; -$var-user: \f007; -$var-user-alt: \f007; -$var-user-large: \f007; -$var-film: \f008; -$var-film-alt: \f008; -$var-film-simple: \f008; -$var-table-cells-large: \f009; -$var-th-large: \f009; -$var-table-cells: \f00a; -$var-th: \f00a; -$var-table-list: \f00b; -$var-th-list: \f00b; -$var-check: \f00c; -$var-xmark: \f00d; -$var-close: \f00d; -$var-multiply: \f00d; -$var-remove: \f00d; -$var-times: \f00d; -$var-magnifying-glass-plus: \f00e; -$var-search-plus: \f00e; -$var-magnifying-glass-minus: \f010; -$var-search-minus: \f010; -$var-power-off: \f011; -$var-signal: \f012; -$var-signal-5: \f012; -$var-signal-perfect: \f012; -$var-gear: \f013; -$var-cog: \f013; -$var-house: \f015; -$var-home: \f015; -$var-home-alt: \f015; -$var-home-lg-alt: \f015; -$var-clock: \f017; -$var-clock-four: \f017; -$var-road: \f018; -$var-download: \f019; -$var-inbox: \f01c; -$var-arrow-rotate-right: \f01e; -$var-arrow-right-rotate: \f01e; -$var-arrow-rotate-forward: \f01e; -$var-redo: \f01e; -$var-arrows-rotate: \f021; -$var-refresh: \f021; -$var-sync: \f021; -$var-rectangle-list: \f022; -$var-list-alt: \f022; -$var-lock: \f023; -$var-flag: \f024; -$var-headphones: \f025; -$var-headphones-alt: \f025; -$var-headphones-simple: \f025; -$var-volume-off: \f026; -$var-volume-low: \f027; -$var-volume-down: \f027; -$var-volume-high: \f028; -$var-volume-up: \f028; -$var-qrcode: \f029; -$var-barcode: \f02a; -$var-tag: \f02b; -$var-tags: \f02c; -$var-book: \f02d; -$var-bookmark: \f02e; -$var-print: \f02f; -$var-camera: \f030; -$var-camera-alt: \f030; -$var-font: \f031; -$var-bold: \f032; -$var-italic: \f033; -$var-text-height: \f034; -$var-text-width: \f035; -$var-align-left: \f036; -$var-align-center: \f037; -$var-align-right: \f038; -$var-align-justify: \f039; -$var-list: \f03a; -$var-list-squares: \f03a; -$var-outdent: \f03b; -$var-dedent: \f03b; -$var-indent: \f03c; -$var-video: \f03d; -$var-video-camera: \f03d; -$var-image: \f03e; -$var-location-pin: \f041; -$var-map-marker: \f041; -$var-circle-half-stroke: \f042; -$var-adjust: \f042; -$var-droplet: \f043; -$var-tint: \f043; -$var-pen-to-square: \f044; -$var-edit: \f044; -$var-arrows-up-down-left-right: \f047; -$var-arrows: \f047; -$var-backward-step: \f048; -$var-step-backward: \f048; -$var-backward-fast: \f049; -$var-fast-backward: \f049; -$var-backward: \f04a; -$var-play: \f04b; -$var-pause: \f04c; -$var-stop: \f04d; -$var-forward: \f04e; -$var-forward-fast: \f050; -$var-fast-forward: \f050; -$var-forward-step: \f051; -$var-step-forward: \f051; -$var-eject: \f052; -$var-chevron-left: \f053; -$var-chevron-right: \f054; -$var-circle-plus: \f055; -$var-plus-circle: \f055; -$var-circle-minus: \f056; -$var-minus-circle: \f056; -$var-circle-xmark: \f057; -$var-times-circle: \f057; -$var-xmark-circle: \f057; -$var-circle-check: \f058; -$var-check-circle: \f058; -$var-circle-question: \f059; -$var-question-circle: \f059; -$var-circle-info: \f05a; -$var-info-circle: \f05a; -$var-crosshairs: \f05b; -$var-ban: \f05e; -$var-cancel: \f05e; -$var-arrow-left: \f060; -$var-arrow-right: \f061; -$var-arrow-up: \f062; -$var-arrow-down: \f063; -$var-share: \f064; -$var-mail-forward: \f064; -$var-expand: \f065; -$var-compress: \f066; -$var-minus: \f068; -$var-subtract: \f068; -$var-circle-exclamation: \f06a; -$var-exclamation-circle: \f06a; -$var-gift: \f06b; -$var-leaf: \f06c; -$var-fire: \f06d; -$var-eye: \f06e; -$var-eye-slash: \f070; -$var-triangle-exclamation: \f071; -$var-exclamation-triangle: \f071; -$var-warning: \f071; -$var-plane: \f072; -$var-calendar-days: \f073; -$var-calendar-alt: \f073; -$var-shuffle: \f074; -$var-random: \f074; -$var-comment: \f075; -$var-magnet: \f076; -$var-chevron-up: \f077; -$var-chevron-down: \f078; -$var-retweet: \f079; -$var-cart-shopping: \f07a; -$var-shopping-cart: \f07a; -$var-folder: \f07b; -$var-folder-blank: \f07b; -$var-folder-open: \f07c; -$var-arrows-up-down: \f07d; -$var-arrows-v: \f07d; -$var-arrows-left-right: \f07e; -$var-arrows-h: \f07e; -$var-chart-bar: \f080; -$var-bar-chart: \f080; -$var-camera-retro: \f083; -$var-key: \f084; -$var-gears: \f085; -$var-cogs: \f085; -$var-comments: \f086; -$var-star-half: \f089; -$var-arrow-right-from-bracket: \f08b; -$var-sign-out: \f08b; -$var-thumbtack: \f08d; -$var-thumb-tack: \f08d; -$var-arrow-up-right-from-square: \f08e; -$var-external-link: \f08e; -$var-arrow-right-to-bracket: \f090; -$var-sign-in: \f090; -$var-trophy: \f091; -$var-upload: \f093; -$var-lemon: \f094; -$var-phone: \f095; -$var-square-phone: \f098; -$var-phone-square: \f098; -$var-unlock: \f09c; -$var-credit-card: \f09d; -$var-credit-card-alt: \f09d; -$var-rss: \f09e; -$var-feed: \f09e; -$var-hard-drive: \f0a0; -$var-hdd: \f0a0; -$var-bullhorn: \f0a1; -$var-certificate: \f0a3; -$var-hand-point-right: \f0a4; -$var-hand-point-left: \f0a5; -$var-hand-point-up: \f0a6; -$var-hand-point-down: \f0a7; -$var-circle-arrow-left: \f0a8; -$var-arrow-circle-left: \f0a8; -$var-circle-arrow-right: \f0a9; -$var-arrow-circle-right: \f0a9; -$var-circle-arrow-up: \f0aa; -$var-arrow-circle-up: \f0aa; -$var-circle-arrow-down: \f0ab; -$var-arrow-circle-down: \f0ab; -$var-globe: \f0ac; -$var-wrench: \f0ad; -$var-list-check: \f0ae; -$var-tasks: \f0ae; -$var-filter: \f0b0; -$var-briefcase: \f0b1; -$var-up-down-left-right: \f0b2; -$var-arrows-alt: \f0b2; -$var-users: \f0c0; -$var-link: \f0c1; -$var-chain: \f0c1; -$var-cloud: \f0c2; -$var-flask: \f0c3; -$var-scissors: \f0c4; -$var-cut: \f0c4; -$var-copy: \f0c5; -$var-paperclip: \f0c6; -$var-floppy-disk: \f0c7; -$var-save: \f0c7; -$var-square: \f0c8; -$var-bars: \f0c9; -$var-navicon: \f0c9; -$var-list-ul: \f0ca; -$var-list-dots: \f0ca; -$var-list-ol: \f0cb; -$var-list-1-2: \f0cb; -$var-list-numeric: \f0cb; -$var-strikethrough: \f0cc; -$var-underline: \f0cd; -$var-table: \f0ce; -$var-wand-magic: \f0d0; -$var-magic: \f0d0; -$var-truck: \f0d1; -$var-money-bill: \f0d6; -$var-caret-down: \f0d7; -$var-caret-up: \f0d8; -$var-caret-left: \f0d9; -$var-caret-right: \f0da; -$var-table-columns: \f0db; -$var-columns: \f0db; -$var-sort: \f0dc; -$var-unsorted: \f0dc; -$var-sort-down: \f0dd; -$var-sort-desc: \f0dd; -$var-sort-up: \f0de; -$var-sort-asc: \f0de; -$var-envelope: \f0e0; -$var-arrow-rotate-left: \f0e2; -$var-arrow-left-rotate: \f0e2; -$var-arrow-rotate-back: \f0e2; -$var-arrow-rotate-backward: \f0e2; -$var-undo: \f0e2; -$var-gavel: \f0e3; -$var-legal: \f0e3; -$var-bolt: \f0e7; -$var-zap: \f0e7; -$var-sitemap: \f0e8; -$var-umbrella: \f0e9; -$var-paste: \f0ea; -$var-file-clipboard: \f0ea; -$var-lightbulb: \f0eb; -$var-arrow-right-arrow-left: \f0ec; -$var-exchange: \f0ec; -$var-cloud-arrow-down: \f0ed; -$var-cloud-download: \f0ed; -$var-cloud-download-alt: \f0ed; -$var-cloud-arrow-up: \f0ee; -$var-cloud-upload: \f0ee; -$var-cloud-upload-alt: \f0ee; -$var-user-doctor: \f0f0; -$var-user-md: \f0f0; -$var-stethoscope: \f0f1; -$var-suitcase: \f0f2; -$var-bell: \f0f3; -$var-mug-saucer: \f0f4; -$var-coffee: \f0f4; -$var-hospital: \f0f8; -$var-hospital-alt: \f0f8; -$var-hospital-wide: \f0f8; -$var-truck-medical: \f0f9; -$var-ambulance: \f0f9; -$var-suitcase-medical: \f0fa; -$var-medkit: \f0fa; -$var-jet-fighter: \f0fb; -$var-fighter-jet: \f0fb; -$var-beer-mug-empty: \f0fc; -$var-beer: \f0fc; -$var-square-h: \f0fd; -$var-h-square: \f0fd; -$var-square-plus: \f0fe; -$var-plus-square: \f0fe; -$var-angles-left: \f100; -$var-angle-double-left: \f100; -$var-angles-right: \f101; -$var-angle-double-right: \f101; -$var-angles-up: \f102; -$var-angle-double-up: \f102; -$var-angles-down: \f103; -$var-angle-double-down: \f103; -$var-angle-left: \f104; -$var-angle-right: \f105; -$var-angle-up: \f106; -$var-angle-down: \f107; -$var-laptop: \f109; -$var-tablet-button: \f10a; -$var-mobile-button: \f10b; -$var-quote-left: \f10d; -$var-quote-left-alt: \f10d; -$var-quote-right: \f10e; -$var-quote-right-alt: \f10e; -$var-spinner: \f110; -$var-circle: \f111; -$var-face-smile: \f118; -$var-smile: \f118; -$var-face-frown: \f119; -$var-frown: \f119; -$var-face-meh: \f11a; -$var-meh: \f11a; -$var-gamepad: \f11b; -$var-keyboard: \f11c; -$var-flag-checkered: \f11e; -$var-terminal: \f120; -$var-code: \f121; -$var-reply-all: \f122; -$var-mail-reply-all: \f122; -$var-location-arrow: \f124; -$var-crop: \f125; -$var-code-branch: \f126; -$var-link-slash: \f127; -$var-chain-broken: \f127; -$var-chain-slash: \f127; -$var-unlink: \f127; -$var-info: \f129; -$var-superscript: \f12b; -$var-subscript: \f12c; -$var-eraser: \f12d; -$var-puzzle-piece: \f12e; -$var-microphone: \f130; -$var-microphone-slash: \f131; -$var-shield: \f132; -$var-shield-blank: \f132; -$var-calendar: \f133; -$var-fire-extinguisher: \f134; -$var-rocket: \f135; -$var-circle-chevron-left: \f137; -$var-chevron-circle-left: \f137; -$var-circle-chevron-right: \f138; -$var-chevron-circle-right: \f138; -$var-circle-chevron-up: \f139; -$var-chevron-circle-up: \f139; -$var-circle-chevron-down: \f13a; -$var-chevron-circle-down: \f13a; -$var-anchor: \f13d; -$var-unlock-keyhole: \f13e; -$var-unlock-alt: \f13e; -$var-bullseye: \f140; -$var-ellipsis: \f141; -$var-ellipsis-h: \f141; -$var-ellipsis-vertical: \f142; -$var-ellipsis-v: \f142; -$var-square-rss: \f143; -$var-rss-square: \f143; -$var-circle-play: \f144; -$var-play-circle: \f144; -$var-ticket: \f145; -$var-square-minus: \f146; -$var-minus-square: \f146; -$var-arrow-turn-up: \f148; -$var-level-up: \f148; -$var-arrow-turn-down: \f149; -$var-level-down: \f149; -$var-square-check: \f14a; -$var-check-square: \f14a; -$var-square-pen: \f14b; -$var-pen-square: \f14b; -$var-pencil-square: \f14b; -$var-square-arrow-up-right: \f14c; -$var-external-link-square: \f14c; -$var-share-from-square: \f14d; -$var-share-square: \f14d; -$var-compass: \f14e; -$var-square-caret-down: \f150; -$var-caret-square-down: \f150; -$var-square-caret-up: \f151; -$var-caret-square-up: \f151; -$var-square-caret-right: \f152; -$var-caret-square-right: \f152; -$var-euro-sign: \f153; -$var-eur: \f153; -$var-euro: \f153; -$var-sterling-sign: \f154; -$var-gbp: \f154; -$var-pound-sign: \f154; -$var-rupee-sign: \f156; -$var-rupee: \f156; -$var-yen-sign: \f157; -$var-cny: \f157; -$var-jpy: \f157; -$var-rmb: \f157; -$var-yen: \f157; -$var-ruble-sign: \f158; -$var-rouble: \f158; -$var-rub: \f158; -$var-ruble: \f158; -$var-won-sign: \f159; -$var-krw: \f159; -$var-won: \f159; -$var-file: \f15b; -$var-file-lines: \f15c; -$var-file-alt: \f15c; -$var-file-text: \f15c; -$var-arrow-down-a-z: \f15d; -$var-sort-alpha-asc: \f15d; -$var-sort-alpha-down: \f15d; -$var-arrow-up-a-z: \f15e; -$var-sort-alpha-up: \f15e; -$var-arrow-down-wide-short: \f160; -$var-sort-amount-asc: \f160; -$var-sort-amount-down: \f160; -$var-arrow-up-wide-short: \f161; -$var-sort-amount-up: \f161; -$var-arrow-down-1-9: \f162; -$var-sort-numeric-asc: \f162; -$var-sort-numeric-down: \f162; -$var-arrow-up-1-9: \f163; -$var-sort-numeric-up: \f163; -$var-thumbs-up: \f164; -$var-thumbs-down: \f165; -$var-arrow-down-long: \f175; -$var-long-arrow-down: \f175; -$var-arrow-up-long: \f176; -$var-long-arrow-up: \f176; -$var-arrow-left-long: \f177; -$var-long-arrow-left: \f177; -$var-arrow-right-long: \f178; -$var-long-arrow-right: \f178; -$var-person-dress: \f182; -$var-female: \f182; -$var-person: \f183; -$var-male: \f183; -$var-sun: \f185; -$var-moon: \f186; -$var-box-archive: \f187; -$var-archive: \f187; -$var-bug: \f188; -$var-square-caret-left: \f191; -$var-caret-square-left: \f191; -$var-circle-dot: \f192; -$var-dot-circle: \f192; -$var-wheelchair: \f193; -$var-lira-sign: \f195; -$var-shuttle-space: \f197; -$var-space-shuttle: \f197; -$var-square-envelope: \f199; -$var-envelope-square: \f199; -$var-building-columns: \f19c; -$var-bank: \f19c; -$var-institution: \f19c; -$var-museum: \f19c; -$var-university: \f19c; -$var-graduation-cap: \f19d; -$var-mortar-board: \f19d; -$var-language: \f1ab; -$var-fax: \f1ac; -$var-building: \f1ad; -$var-child: \f1ae; -$var-paw: \f1b0; -$var-cube: \f1b2; -$var-cubes: \f1b3; -$var-recycle: \f1b8; -$var-car: \f1b9; -$var-automobile: \f1b9; -$var-taxi: \f1ba; -$var-cab: \f1ba; -$var-tree: \f1bb; -$var-database: \f1c0; -$var-file-pdf: \f1c1; -$var-file-word: \f1c2; -$var-file-excel: \f1c3; -$var-file-powerpoint: \f1c4; -$var-file-image: \f1c5; -$var-file-zipper: \f1c6; -$var-file-archive: \f1c6; -$var-file-audio: \f1c7; -$var-file-video: \f1c8; -$var-file-code: \f1c9; -$var-life-ring: \f1cd; -$var-circle-notch: \f1ce; -$var-paper-plane: \f1d8; -$var-clock-rotate-left: \f1da; -$var-history: \f1da; -$var-heading: \f1dc; -$var-header: \f1dc; -$var-paragraph: \f1dd; -$var-sliders: \f1de; -$var-sliders-h: \f1de; -$var-share-nodes: \f1e0; -$var-share-alt: \f1e0; -$var-square-share-nodes: \f1e1; -$var-share-alt-square: \f1e1; -$var-bomb: \f1e2; -$var-futbol: \f1e3; -$var-futbol-ball: \f1e3; -$var-soccer-ball: \f1e3; -$var-tty: \f1e4; -$var-teletype: \f1e4; -$var-binoculars: \f1e5; -$var-plug: \f1e6; -$var-newspaper: \f1ea; -$var-wifi: \f1eb; -$var-wifi-3: \f1eb; -$var-wifi-strong: \f1eb; -$var-calculator: \f1ec; -$var-bell-slash: \f1f6; -$var-trash: \f1f8; -$var-copyright: \f1f9; -$var-eye-dropper: \f1fb; -$var-eye-dropper-empty: \f1fb; -$var-eyedropper: \f1fb; -$var-paintbrush: \f1fc; -$var-paint-brush: \f1fc; -$var-cake-candles: \f1fd; -$var-birthday-cake: \f1fd; -$var-cake: \f1fd; -$var-chart-area: \f1fe; -$var-area-chart: \f1fe; -$var-chart-pie: \f200; -$var-pie-chart: \f200; -$var-chart-line: \f201; -$var-line-chart: \f201; -$var-toggle-off: \f204; -$var-toggle-on: \f205; -$var-bicycle: \f206; -$var-bus: \f207; -$var-closed-captioning: \f20a; -$var-shekel-sign: \f20b; -$var-ils: \f20b; -$var-shekel: \f20b; -$var-sheqel: \f20b; -$var-sheqel-sign: \f20b; -$var-cart-plus: \f217; -$var-cart-arrow-down: \f218; -$var-diamond: \f219; -$var-ship: \f21a; -$var-user-secret: \f21b; -$var-motorcycle: \f21c; -$var-street-view: \f21d; -$var-heart-pulse: \f21e; -$var-heartbeat: \f21e; -$var-venus: \f221; -$var-mars: \f222; -$var-mercury: \f223; -$var-mars-and-venus: \f224; -$var-transgender: \f225; -$var-transgender-alt: \f225; -$var-venus-double: \f226; -$var-mars-double: \f227; -$var-venus-mars: \f228; -$var-mars-stroke: \f229; -$var-mars-stroke-up: \f22a; -$var-mars-stroke-v: \f22a; -$var-mars-stroke-right: \f22b; -$var-mars-stroke-h: \f22b; -$var-neuter: \f22c; -$var-genderless: \f22d; -$var-server: \f233; -$var-user-plus: \f234; -$var-user-xmark: \f235; -$var-user-times: \f235; -$var-bed: \f236; -$var-train: \f238; -$var-train-subway: \f239; -$var-subway: \f239; -$var-battery-full: \f240; -$var-battery: \f240; -$var-battery-5: \f240; -$var-battery-three-quarters: \f241; -$var-battery-4: \f241; -$var-battery-half: \f242; -$var-battery-3: \f242; -$var-battery-quarter: \f243; -$var-battery-2: \f243; -$var-battery-empty: \f244; -$var-battery-0: \f244; -$var-arrow-pointer: \f245; -$var-mouse-pointer: \f245; -$var-i-cursor: \f246; -$var-object-group: \f247; -$var-object-ungroup: \f248; -$var-note-sticky: \f249; -$var-sticky-note: \f249; -$var-clone: \f24d; -$var-scale-balanced: \f24e; -$var-balance-scale: \f24e; -$var-hourglass-start: \f251; -$var-hourglass-1: \f251; -$var-hourglass-half: \f252; -$var-hourglass-2: \f252; -$var-hourglass-end: \f253; -$var-hourglass-3: \f253; -$var-hourglass: \f254; -$var-hourglass-empty: \f254; -$var-hand-back-fist: \f255; -$var-hand-rock: \f255; -$var-hand: \f256; -$var-hand-paper: \f256; -$var-hand-scissors: \f257; -$var-hand-lizard: \f258; -$var-hand-spock: \f259; -$var-hand-pointer: \f25a; -$var-hand-peace: \f25b; -$var-trademark: \f25c; -$var-registered: \f25d; -$var-tv: \f26c; -$var-television: \f26c; -$var-tv-alt: \f26c; -$var-calendar-plus: \f271; -$var-calendar-minus: \f272; -$var-calendar-xmark: \f273; -$var-calendar-times: \f273; -$var-calendar-check: \f274; -$var-industry: \f275; -$var-map-pin: \f276; -$var-signs-post: \f277; -$var-map-signs: \f277; -$var-map: \f279; -$var-message: \f27a; -$var-comment-alt: \f27a; -$var-circle-pause: \f28b; -$var-pause-circle: \f28b; -$var-circle-stop: \f28d; -$var-stop-circle: \f28d; -$var-bag-shopping: \f290; -$var-shopping-bag: \f290; -$var-basket-shopping: \f291; -$var-shopping-basket: \f291; -$var-universal-access: \f29a; -$var-person-walking-with-cane: \f29d; -$var-blind: \f29d; -$var-audio-description: \f29e; -$var-phone-volume: \f2a0; -$var-volume-control-phone: \f2a0; -$var-braille: \f2a1; -$var-ear-listen: \f2a2; -$var-assistive-listening-systems: \f2a2; -$var-hands-asl-interpreting: \f2a3; -$var-american-sign-language-interpreting: \f2a3; -$var-asl-interpreting: \f2a3; -$var-hands-american-sign-language-interpreting: \f2a3; -$var-ear-deaf: \f2a4; -$var-deaf: \f2a4; -$var-deafness: \f2a4; -$var-hard-of-hearing: \f2a4; -$var-hands: \f2a7; -$var-sign-language: \f2a7; -$var-signing: \f2a7; -$var-eye-low-vision: \f2a8; -$var-low-vision: \f2a8; -$var-font-awesome: \f2b4; -$var-font-awesome-flag: \f2b4; -$var-font-awesome-logo-full: \f2b4; -$var-handshake: \f2b5; -$var-handshake-alt: \f2b5; -$var-handshake-simple: \f2b5; -$var-envelope-open: \f2b6; -$var-address-book: \f2b9; -$var-contact-book: \f2b9; -$var-address-card: \f2bb; -$var-contact-card: \f2bb; -$var-vcard: \f2bb; -$var-circle-user: \f2bd; -$var-user-circle: \f2bd; -$var-id-badge: \f2c1; -$var-id-card: \f2c2; -$var-drivers-license: \f2c2; -$var-temperature-full: \f2c7; -$var-temperature-4: \f2c7; -$var-thermometer-4: \f2c7; -$var-thermometer-full: \f2c7; -$var-temperature-three-quarters: \f2c8; -$var-temperature-3: \f2c8; -$var-thermometer-3: \f2c8; -$var-thermometer-three-quarters: \f2c8; -$var-temperature-half: \f2c9; -$var-temperature-2: \f2c9; -$var-thermometer-2: \f2c9; -$var-thermometer-half: \f2c9; -$var-temperature-quarter: \f2ca; -$var-temperature-1: \f2ca; -$var-thermometer-1: \f2ca; -$var-thermometer-quarter: \f2ca; -$var-temperature-empty: \f2cb; -$var-temperature-0: \f2cb; -$var-thermometer-0: \f2cb; -$var-thermometer-empty: \f2cb; -$var-shower: \f2cc; -$var-bath: \f2cd; -$var-bathtub: \f2cd; -$var-podcast: \f2ce; -$var-window-maximize: \f2d0; -$var-window-minimize: \f2d1; -$var-window-restore: \f2d2; -$var-square-xmark: \f2d3; -$var-times-square: \f2d3; -$var-xmark-square: \f2d3; -$var-microchip: \f2db; -$var-snowflake: \f2dc; -$var-spoon: \f2e5; -$var-utensil-spoon: \f2e5; -$var-utensils: \f2e7; -$var-cutlery: \f2e7; -$var-rotate-left: \f2ea; -$var-rotate-back: \f2ea; -$var-rotate-backward: \f2ea; -$var-undo-alt: \f2ea; -$var-trash-can: \f2ed; -$var-trash-alt: \f2ed; -$var-rotate: \f2f1; -$var-sync-alt: \f2f1; -$var-stopwatch: \f2f2; -$var-right-from-bracket: \f2f5; -$var-sign-out-alt: \f2f5; -$var-right-to-bracket: \f2f6; -$var-sign-in-alt: \f2f6; -$var-rotate-right: \f2f9; -$var-redo-alt: \f2f9; -$var-rotate-forward: \f2f9; -$var-poo: \f2fe; -$var-images: \f302; -$var-pencil: \f303; -$var-pencil-alt: \f303; -$var-pen: \f304; -$var-pen-clip: \f305; -$var-pen-alt: \f305; -$var-octagon: \f306; -$var-down-long: \f309; -$var-long-arrow-alt-down: \f309; -$var-left-long: \f30a; -$var-long-arrow-alt-left: \f30a; -$var-right-long: \f30b; -$var-long-arrow-alt-right: \f30b; -$var-up-long: \f30c; -$var-long-arrow-alt-up: \f30c; -$var-hexagon: \f312; -$var-file-pen: \f31c; -$var-file-edit: \f31c; -$var-maximize: \f31e; -$var-expand-arrows-alt: \f31e; -$var-clipboard: \f328; -$var-left-right: \f337; -$var-arrows-alt-h: \f337; -$var-up-down: \f338; -$var-arrows-alt-v: \f338; -$var-alarm-clock: \f34e; -$var-circle-down: \f358; -$var-arrow-alt-circle-down: \f358; -$var-circle-left: \f359; -$var-arrow-alt-circle-left: \f359; -$var-circle-right: \f35a; -$var-arrow-alt-circle-right: \f35a; -$var-circle-up: \f35b; -$var-arrow-alt-circle-up: \f35b; -$var-up-right-from-square: \f35d; -$var-external-link-alt: \f35d; -$var-square-up-right: \f360; -$var-external-link-square-alt: \f360; -$var-right-left: \f362; -$var-exchange-alt: \f362; -$var-repeat: \f363; -$var-code-commit: \f386; -$var-code-merge: \f387; -$var-desktop: \f390; -$var-desktop-alt: \f390; -$var-gem: \f3a5; -$var-turn-down: \f3be; -$var-level-down-alt: \f3be; -$var-turn-up: \f3bf; -$var-level-up-alt: \f3bf; -$var-lock-open: \f3c1; -$var-location-dot: \f3c5; -$var-map-marker-alt: \f3c5; -$var-microphone-lines: \f3c9; -$var-microphone-alt: \f3c9; -$var-mobile-screen-button: \f3cd; -$var-mobile-alt: \f3cd; -$var-mobile: \f3ce; -$var-mobile-android: \f3ce; -$var-mobile-phone: \f3ce; -$var-mobile-screen: \f3cf; -$var-mobile-android-alt: \f3cf; -$var-money-bill-1: \f3d1; -$var-money-bill-alt: \f3d1; -$var-phone-slash: \f3dd; -$var-image-portrait: \f3e0; -$var-portrait: \f3e0; -$var-reply: \f3e5; -$var-mail-reply: \f3e5; -$var-shield-halved: \f3ed; -$var-shield-alt: \f3ed; -$var-tablet-screen-button: \f3fa; -$var-tablet-alt: \f3fa; -$var-tablet: \f3fb; -$var-tablet-android: \f3fb; -$var-ticket-simple: \f3ff; -$var-ticket-alt: \f3ff; -$var-rectangle-xmark: \f410; -$var-rectangle-times: \f410; -$var-times-rectangle: \f410; -$var-window-close: \f410; -$var-down-left-and-up-right-to-center: \f422; -$var-compress-alt: \f422; -$var-up-right-and-down-left-from-center: \f424; -$var-expand-alt: \f424; -$var-baseball-bat-ball: \f432; -$var-baseball: \f433; -$var-baseball-ball: \f433; -$var-basketball: \f434; -$var-basketball-ball: \f434; -$var-bowling-ball: \f436; -$var-chess: \f439; -$var-chess-bishop: \f43a; -$var-chess-board: \f43c; -$var-chess-king: \f43f; -$var-chess-knight: \f441; -$var-chess-pawn: \f443; -$var-chess-queen: \f445; -$var-chess-rook: \f447; -$var-dumbbell: \f44b; -$var-football: \f44e; -$var-football-ball: \f44e; -$var-golf-ball-tee: \f450; -$var-golf-ball: \f450; -$var-hockey-puck: \f453; -$var-broom-ball: \f458; -$var-quidditch: \f458; -$var-quidditch-broom-ball: \f458; -$var-square-full: \f45c; -$var-table-tennis-paddle-ball: \f45d; -$var-ping-pong-paddle-ball: \f45d; -$var-table-tennis: \f45d; -$var-volleyball: \f45f; -$var-volleyball-ball: \f45f; -$var-hand-dots: \f461; -$var-allergies: \f461; -$var-bandage: \f462; -$var-band-aid: \f462; -$var-box: \f466; -$var-boxes-stacked: \f468; -$var-boxes: \f468; -$var-boxes-alt: \f468; -$var-briefcase-medical: \f469; -$var-fire-flame-simple: \f46a; -$var-burn: \f46a; -$var-capsules: \f46b; -$var-clipboard-check: \f46c; -$var-clipboard-list: \f46d; -$var-person-dots-from-line: \f470; -$var-diagnoses: \f470; -$var-dna: \f471; -$var-dolly: \f472; -$var-dolly-box: \f472; -$var-cart-flatbed: \f474; -$var-dolly-flatbed: \f474; -$var-file-medical: \f477; -$var-file-waveform: \f478; -$var-file-medical-alt: \f478; -$var-kit-medical: \f479; -$var-first-aid: \f479; -$var-circle-h: \f47e; -$var-hospital-symbol: \f47e; -$var-id-card-clip: \f47f; -$var-id-card-alt: \f47f; -$var-notes-medical: \f481; -$var-pallet: \f482; -$var-pills: \f484; -$var-prescription-bottle: \f485; -$var-prescription-bottle-medical: \f486; -$var-prescription-bottle-alt: \f486; -$var-bed-pulse: \f487; -$var-procedures: \f487; -$var-truck-fast: \f48b; -$var-shipping-fast: \f48b; -$var-smoking: \f48d; -$var-syringe: \f48e; -$var-tablets: \f490; -$var-thermometer: \f491; -$var-vial: \f492; -$var-vials: \f493; -$var-warehouse: \f494; -$var-weight-scale: \f496; -$var-weight: \f496; -$var-x-ray: \f497; -$var-box-open: \f49e; -$var-comment-dots: \f4ad; -$var-commenting: \f4ad; -$var-comment-slash: \f4b3; -$var-couch: \f4b8; -$var-circle-dollar-to-slot: \f4b9; -$var-donate: \f4b9; -$var-dove: \f4ba; -$var-hand-holding: \f4bd; -$var-hand-holding-heart: \f4be; -$var-hand-holding-dollar: \f4c0; -$var-hand-holding-usd: \f4c0; -$var-hand-holding-droplet: \f4c1; -$var-hand-holding-water: \f4c1; -$var-hands-holding: \f4c2; -$var-handshake-angle: \f4c4; -$var-hands-helping: \f4c4; -$var-parachute-box: \f4cd; -$var-people-carry-box: \f4ce; -$var-people-carry: \f4ce; -$var-piggy-bank: \f4d3; -$var-ribbon: \f4d6; -$var-route: \f4d7; -$var-seedling: \f4d8; -$var-sprout: \f4d8; -$var-sign-hanging: \f4d9; -$var-sign: \f4d9; -$var-face-smile-wink: \f4da; -$var-smile-wink: \f4da; -$var-tape: \f4db; -$var-truck-ramp-box: \f4de; -$var-truck-loading: \f4de; -$var-truck-moving: \f4df; -$var-video-slash: \f4e2; -$var-wine-glass: \f4e3; -$var-user-astronaut: \f4fb; -$var-user-check: \f4fc; -$var-user-clock: \f4fd; -$var-user-gear: \f4fe; -$var-user-cog: \f4fe; -$var-user-pen: \f4ff; -$var-user-edit: \f4ff; -$var-user-group: \f500; -$var-user-friends: \f500; -$var-user-graduate: \f501; -$var-user-lock: \f502; -$var-user-minus: \f503; -$var-user-ninja: \f504; -$var-user-shield: \f505; -$var-user-slash: \f506; -$var-user-alt-slash: \f506; -$var-user-large-slash: \f506; -$var-user-tag: \f507; -$var-user-tie: \f508; -$var-users-gear: \f509; -$var-users-cog: \f509; -$var-scale-unbalanced: \f515; -$var-balance-scale-left: \f515; -$var-scale-unbalanced-flip: \f516; -$var-balance-scale-right: \f516; -$var-blender: \f517; -$var-book-open: \f518; -$var-tower-broadcast: \f519; -$var-broadcast-tower: \f519; -$var-broom: \f51a; -$var-chalkboard: \f51b; -$var-blackboard: \f51b; -$var-chalkboard-user: \f51c; -$var-chalkboard-teacher: \f51c; -$var-church: \f51d; -$var-coins: \f51e; -$var-compact-disc: \f51f; -$var-crow: \f520; -$var-crown: \f521; -$var-dice: \f522; -$var-dice-five: \f523; -$var-dice-four: \f524; -$var-dice-one: \f525; -$var-dice-six: \f526; -$var-dice-three: \f527; -$var-dice-two: \f528; -$var-divide: \f529; -$var-door-closed: \f52a; -$var-door-open: \f52b; -$var-feather: \f52d; -$var-frog: \f52e; -$var-gas-pump: \f52f; -$var-glasses: \f530; -$var-greater-than-equal: \f532; -$var-helicopter: \f533; -$var-infinity: \f534; -$var-kiwi-bird: \f535; -$var-less-than-equal: \f537; -$var-memory: \f538; -$var-microphone-lines-slash: \f539; -$var-microphone-alt-slash: \f539; -$var-money-bill-wave: \f53a; -$var-money-bill-1-wave: \f53b; -$var-money-bill-wave-alt: \f53b; -$var-money-check: \f53c; -$var-money-check-dollar: \f53d; -$var-money-check-alt: \f53d; -$var-not-equal: \f53e; -$var-palette: \f53f; -$var-square-parking: \f540; -$var-parking: \f540; -$var-diagram-project: \f542; -$var-project-diagram: \f542; -$var-receipt: \f543; -$var-robot: \f544; -$var-ruler: \f545; -$var-ruler-combined: \f546; -$var-ruler-horizontal: \f547; -$var-ruler-vertical: \f548; -$var-school: \f549; -$var-screwdriver: \f54a; -$var-shoe-prints: \f54b; -$var-skull: \f54c; -$var-ban-smoking: \f54d; -$var-smoking-ban: \f54d; -$var-store: \f54e; -$var-shop: \f54f; -$var-store-alt: \f54f; -$var-bars-staggered: \f550; -$var-reorder: \f550; -$var-stream: \f550; -$var-stroopwafel: \f551; -$var-toolbox: \f552; -$var-shirt: \f553; -$var-t-shirt: \f553; -$var-tshirt: \f553; -$var-person-walking: \f554; -$var-walking: \f554; -$var-wallet: \f555; -$var-face-angry: \f556; -$var-angry: \f556; -$var-archway: \f557; -$var-book-atlas: \f558; -$var-atlas: \f558; -$var-award: \f559; -$var-delete-left: \f55a; -$var-backspace: \f55a; -$var-bezier-curve: \f55b; -$var-bong: \f55c; -$var-brush: \f55d; -$var-bus-simple: \f55e; -$var-bus-alt: \f55e; -$var-cannabis: \f55f; -$var-check-double: \f560; -$var-martini-glass-citrus: \f561; -$var-cocktail: \f561; -$var-bell-concierge: \f562; -$var-concierge-bell: \f562; -$var-cookie: \f563; -$var-cookie-bite: \f564; -$var-crop-simple: \f565; -$var-crop-alt: \f565; -$var-tachograph-digital: \f566; -$var-digital-tachograph: \f566; -$var-face-dizzy: \f567; -$var-dizzy: \f567; -$var-compass-drafting: \f568; -$var-drafting-compass: \f568; -$var-drum: \f569; -$var-drum-steelpan: \f56a; -$var-feather-pointed: \f56b; -$var-feather-alt: \f56b; -$var-file-contract: \f56c; -$var-file-arrow-down: \f56d; -$var-file-download: \f56d; -$var-file-export: \f56e; -$var-arrow-right-from-file: \f56e; -$var-file-import: \f56f; -$var-arrow-right-to-file: \f56f; -$var-file-invoice: \f570; -$var-file-invoice-dollar: \f571; -$var-file-prescription: \f572; -$var-file-signature: \f573; -$var-file-arrow-up: \f574; -$var-file-upload: \f574; -$var-fill: \f575; -$var-fill-drip: \f576; -$var-fingerprint: \f577; -$var-fish: \f578; -$var-face-flushed: \f579; -$var-flushed: \f579; -$var-face-frown-open: \f57a; -$var-frown-open: \f57a; -$var-martini-glass: \f57b; -$var-glass-martini-alt: \f57b; -$var-earth-africa: \f57c; -$var-globe-africa: \f57c; -$var-earth-americas: \f57d; -$var-earth: \f57d; -$var-earth-america: \f57d; -$var-globe-americas: \f57d; -$var-earth-asia: \f57e; -$var-globe-asia: \f57e; -$var-face-grimace: \f57f; -$var-grimace: \f57f; -$var-face-grin: \f580; -$var-grin: \f580; -$var-face-grin-wide: \f581; -$var-grin-alt: \f581; -$var-face-grin-beam: \f582; -$var-grin-beam: \f582; -$var-face-grin-beam-sweat: \f583; -$var-grin-beam-sweat: \f583; -$var-face-grin-hearts: \f584; -$var-grin-hearts: \f584; -$var-face-grin-squint: \f585; -$var-grin-squint: \f585; -$var-face-grin-squint-tears: \f586; -$var-grin-squint-tears: \f586; -$var-face-grin-stars: \f587; -$var-grin-stars: \f587; -$var-face-grin-tears: \f588; -$var-grin-tears: \f588; -$var-face-grin-tongue: \f589; -$var-grin-tongue: \f589; -$var-face-grin-tongue-squint: \f58a; -$var-grin-tongue-squint: \f58a; -$var-face-grin-tongue-wink: \f58b; -$var-grin-tongue-wink: \f58b; -$var-face-grin-wink: \f58c; -$var-grin-wink: \f58c; -$var-grip: \f58d; -$var-grid-horizontal: \f58d; -$var-grip-horizontal: \f58d; -$var-grip-vertical: \f58e; -$var-grid-vertical: \f58e; -$var-headset: \f590; -$var-highlighter: \f591; -$var-hot-tub-person: \f593; -$var-hot-tub: \f593; -$var-hotel: \f594; -$var-joint: \f595; -$var-face-kiss: \f596; -$var-kiss: \f596; -$var-face-kiss-beam: \f597; -$var-kiss-beam: \f597; -$var-face-kiss-wink-heart: \f598; -$var-kiss-wink-heart: \f598; -$var-face-laugh: \f599; -$var-laugh: \f599; -$var-face-laugh-beam: \f59a; -$var-laugh-beam: \f59a; -$var-face-laugh-squint: \f59b; -$var-laugh-squint: \f59b; -$var-face-laugh-wink: \f59c; -$var-laugh-wink: \f59c; -$var-cart-flatbed-suitcase: \f59d; -$var-luggage-cart: \f59d; -$var-map-location: \f59f; -$var-map-marked: \f59f; -$var-map-location-dot: \f5a0; -$var-map-marked-alt: \f5a0; -$var-marker: \f5a1; -$var-medal: \f5a2; -$var-face-meh-blank: \f5a4; -$var-meh-blank: \f5a4; -$var-face-rolling-eyes: \f5a5; -$var-meh-rolling-eyes: \f5a5; -$var-monument: \f5a6; -$var-mortar-pestle: \f5a7; -$var-paint-roller: \f5aa; -$var-passport: \f5ab; -$var-pen-fancy: \f5ac; -$var-pen-nib: \f5ad; -$var-pen-ruler: \f5ae; -$var-pencil-ruler: \f5ae; -$var-plane-arrival: \f5af; -$var-plane-departure: \f5b0; -$var-prescription: \f5b1; -$var-face-sad-cry: \f5b3; -$var-sad-cry: \f5b3; -$var-face-sad-tear: \f5b4; -$var-sad-tear: \f5b4; -$var-van-shuttle: \f5b6; -$var-shuttle-van: \f5b6; -$var-signature: \f5b7; -$var-face-smile-beam: \f5b8; -$var-smile-beam: \f5b8; -$var-solar-panel: \f5ba; -$var-spa: \f5bb; -$var-splotch: \f5bc; -$var-spray-can: \f5bd; -$var-stamp: \f5bf; -$var-star-half-stroke: \f5c0; -$var-star-half-alt: \f5c0; -$var-suitcase-rolling: \f5c1; -$var-face-surprise: \f5c2; -$var-surprise: \f5c2; -$var-swatchbook: \f5c3; -$var-person-swimming: \f5c4; -$var-swimmer: \f5c4; -$var-water-ladder: \f5c5; -$var-ladder-water: \f5c5; -$var-swimming-pool: \f5c5; -$var-droplet-slash: \f5c7; -$var-tint-slash: \f5c7; -$var-face-tired: \f5c8; -$var-tired: \f5c8; -$var-tooth: \f5c9; -$var-umbrella-beach: \f5ca; -$var-weight-hanging: \f5cd; -$var-wine-glass-empty: \f5ce; -$var-wine-glass-alt: \f5ce; -$var-spray-can-sparkles: \f5d0; -$var-air-freshener: \f5d0; -$var-apple-whole: \f5d1; -$var-apple-alt: \f5d1; -$var-atom: \f5d2; -$var-bone: \f5d7; -$var-book-open-reader: \f5da; -$var-book-reader: \f5da; -$var-brain: \f5dc; -$var-car-rear: \f5de; -$var-car-alt: \f5de; -$var-car-battery: \f5df; -$var-battery-car: \f5df; -$var-car-burst: \f5e1; -$var-car-crash: \f5e1; -$var-car-side: \f5e4; -$var-charging-station: \f5e7; -$var-diamond-turn-right: \f5eb; -$var-directions: \f5eb; -$var-draw-polygon: \f5ee; -$var-vector-polygon: \f5ee; -$var-laptop-code: \f5fc; -$var-layer-group: \f5fd; -$var-location-crosshairs: \f601; -$var-location: \f601; -$var-lungs: \f604; -$var-microscope: \f610; -$var-oil-can: \f613; -$var-poop: \f619; -$var-shapes: \f61f; -$var-triangle-circle-square: \f61f; -$var-star-of-life: \f621; -$var-gauge: \f624; -$var-dashboard: \f624; -$var-gauge-med: \f624; -$var-tachometer-alt-average: \f624; -$var-gauge-high: \f625; -$var-tachometer-alt: \f625; -$var-tachometer-alt-fast: \f625; -$var-gauge-simple: \f629; -$var-gauge-simple-med: \f629; -$var-tachometer-average: \f629; -$var-gauge-simple-high: \f62a; -$var-tachometer: \f62a; -$var-tachometer-fast: \f62a; -$var-teeth: \f62e; -$var-teeth-open: \f62f; -$var-masks-theater: \f630; -$var-theater-masks: \f630; -$var-traffic-light: \f637; -$var-truck-monster: \f63b; -$var-truck-pickup: \f63c; -$var-rectangle-ad: \f641; -$var-ad: \f641; -$var-ankh: \f644; -$var-book-bible: \f647; -$var-bible: \f647; -$var-business-time: \f64a; -$var-briefcase-clock: \f64a; -$var-city: \f64f; -$var-comment-dollar: \f651; -$var-comments-dollar: \f653; -$var-cross: \f654; -$var-dharmachakra: \f655; -$var-envelope-open-text: \f658; -$var-folder-minus: \f65d; -$var-folder-plus: \f65e; -$var-filter-circle-dollar: \f662; -$var-funnel-dollar: \f662; -$var-gopuram: \f664; -$var-hamsa: \f665; -$var-bahai: \f666; -$var-haykal: \f666; -$var-jedi: \f669; -$var-book-journal-whills: \f66a; -$var-journal-whills: \f66a; -$var-kaaba: \f66b; -$var-khanda: \f66d; -$var-landmark: \f66f; -$var-envelopes-bulk: \f674; -$var-mail-bulk: \f674; -$var-menorah: \f676; -$var-mosque: \f678; -$var-om: \f679; -$var-spaghetti-monster-flying: \f67b; -$var-pastafarianism: \f67b; -$var-peace: \f67c; -$var-place-of-worship: \f67f; -$var-square-poll-vertical: \f681; -$var-poll: \f681; -$var-square-poll-horizontal: \f682; -$var-poll-h: \f682; -$var-person-praying: \f683; -$var-pray: \f683; -$var-hands-praying: \f684; -$var-praying-hands: \f684; -$var-book-quran: \f687; -$var-quran: \f687; -$var-magnifying-glass-dollar: \f688; -$var-search-dollar: \f688; -$var-magnifying-glass-location: \f689; -$var-search-location: \f689; -$var-socks: \f696; -$var-square-root-variable: \f698; -$var-square-root-alt: \f698; -$var-star-and-crescent: \f699; -$var-star-of-david: \f69a; -$var-synagogue: \f69b; -$var-scroll-torah: \f6a0; -$var-torah: \f6a0; -$var-torii-gate: \f6a1; -$var-vihara: \f6a7; -$var-volume-xmark: \f6a9; -$var-volume-mute: \f6a9; -$var-volume-times: \f6a9; -$var-yin-yang: \f6ad; -$var-blender-phone: \f6b6; -$var-book-skull: \f6b7; -$var-book-dead: \f6b7; -$var-campground: \f6bb; -$var-cat: \f6be; -$var-chair: \f6c0; -$var-cloud-moon: \f6c3; -$var-cloud-sun: \f6c4; -$var-cow: \f6c8; -$var-dice-d20: \f6cf; -$var-dice-d6: \f6d1; -$var-dog: \f6d3; -$var-dragon: \f6d5; -$var-drumstick-bite: \f6d7; -$var-dungeon: \f6d9; -$var-file-csv: \f6dd; -$var-hand-fist: \f6de; -$var-fist-raised: \f6de; -$var-ghost: \f6e2; -$var-hammer: \f6e3; -$var-hanukiah: \f6e6; -$var-hat-wizard: \f6e8; -$var-person-hiking: \f6ec; -$var-hiking: \f6ec; -$var-hippo: \f6ed; -$var-horse: \f6f0; -$var-house-chimney-crack: \f6f1; -$var-house-damage: \f6f1; -$var-hryvnia-sign: \f6f2; -$var-hryvnia: \f6f2; -$var-mask: \f6fa; -$var-mountain: \f6fc; -$var-network-wired: \f6ff; -$var-otter: \f700; -$var-ring: \f70b; -$var-person-running: \f70c; -$var-running: \f70c; -$var-scroll: \f70e; -$var-skull-crossbones: \f714; -$var-slash: \f715; -$var-spider: \f717; -$var-toilet-paper: \f71e; -$var-toilet-paper-alt: \f71e; -$var-toilet-paper-blank: \f71e; -$var-tractor: \f722; -$var-user-injured: \f728; -$var-vr-cardboard: \f729; -$var-wand-sparkles: \f72b; -$var-wind: \f72e; -$var-wine-bottle: \f72f; -$var-cloud-meatball: \f73b; -$var-cloud-moon-rain: \f73c; -$var-cloud-rain: \f73d; -$var-cloud-showers-heavy: \f740; -$var-cloud-sun-rain: \f743; -$var-democrat: \f747; -$var-flag-usa: \f74d; -$var-hurricane: \f751; -$var-landmark-dome: \f752; -$var-landmark-alt: \f752; -$var-meteor: \f753; -$var-person-booth: \f756; -$var-poo-storm: \f75a; -$var-poo-bolt: \f75a; -$var-rainbow: \f75b; -$var-republican: \f75e; -$var-smog: \f75f; -$var-temperature-high: \f769; -$var-temperature-low: \f76b; -$var-cloud-bolt: \f76c; -$var-thunderstorm: \f76c; -$var-tornado: \f76f; -$var-volcano: \f770; -$var-check-to-slot: \f772; -$var-vote-yea: \f772; -$var-water: \f773; -$var-baby: \f77c; -$var-baby-carriage: \f77d; -$var-carriage-baby: \f77d; -$var-biohazard: \f780; -$var-blog: \f781; -$var-calendar-day: \f783; -$var-calendar-week: \f784; -$var-candy-cane: \f786; -$var-carrot: \f787; -$var-cash-register: \f788; -$var-minimize: \f78c; -$var-compress-arrows-alt: \f78c; -$var-dumpster: \f793; -$var-dumpster-fire: \f794; -$var-ethernet: \f796; -$var-gifts: \f79c; -$var-champagne-glasses: \f79f; -$var-glass-cheers: \f79f; -$var-whiskey-glass: \f7a0; -$var-glass-whiskey: \f7a0; -$var-earth-europe: \f7a2; -$var-globe-europe: \f7a2; -$var-grip-lines: \f7a4; -$var-grip-lines-vertical: \f7a5; -$var-guitar: \f7a6; -$var-heart-crack: \f7a9; -$var-heart-broken: \f7a9; -$var-holly-berry: \f7aa; -$var-horse-head: \f7ab; -$var-icicles: \f7ad; -$var-igloo: \f7ae; -$var-mitten: \f7b5; -$var-mug-hot: \f7b6; -$var-radiation: \f7b9; -$var-circle-radiation: \f7ba; -$var-radiation-alt: \f7ba; -$var-restroom: \f7bd; -$var-satellite: \f7bf; -$var-satellite-dish: \f7c0; -$var-sd-card: \f7c2; -$var-sim-card: \f7c4; -$var-person-skating: \f7c5; -$var-skating: \f7c5; -$var-person-skiing: \f7c9; -$var-skiing: \f7c9; -$var-person-skiing-nordic: \f7ca; -$var-skiing-nordic: \f7ca; -$var-sleigh: \f7cc; -$var-comment-sms: \f7cd; -$var-sms: \f7cd; -$var-person-snowboarding: \f7ce; -$var-snowboarding: \f7ce; -$var-snowman: \f7d0; -$var-snowplow: \f7d2; -$var-tenge-sign: \f7d7; -$var-tenge: \f7d7; -$var-toilet: \f7d8; -$var-screwdriver-wrench: \f7d9; -$var-tools: \f7d9; -$var-cable-car: \f7da; -$var-tram: \f7da; -$var-fire-flame-curved: \f7e4; -$var-fire-alt: \f7e4; -$var-bacon: \f7e5; -$var-book-medical: \f7e6; -$var-bread-slice: \f7ec; -$var-cheese: \f7ef; -$var-house-chimney-medical: \f7f2; -$var-clinic-medical: \f7f2; -$var-clipboard-user: \f7f3; -$var-comment-medical: \f7f5; -$var-crutch: \f7f7; -$var-disease: \f7fa; -$var-egg: \f7fb; -$var-folder-tree: \f802; -$var-burger: \f805; -$var-hamburger: \f805; -$var-hand-middle-finger: \f806; -$var-helmet-safety: \f807; -$var-hard-hat: \f807; -$var-hat-hard: \f807; -$var-hospital-user: \f80d; -$var-hotdog: \f80f; -$var-ice-cream: \f810; -$var-laptop-medical: \f812; -$var-pager: \f815; -$var-pepper-hot: \f816; -$var-pizza-slice: \f818; -$var-sack-dollar: \f81d; -$var-book-tanakh: \f827; -$var-tanakh: \f827; -$var-bars-progress: \f828; -$var-tasks-alt: \f828; -$var-trash-arrow-up: \f829; -$var-trash-restore: \f829; -$var-trash-can-arrow-up: \f82a; -$var-trash-restore-alt: \f82a; -$var-user-nurse: \f82f; -$var-wave-square: \f83e; -$var-person-biking: \f84a; -$var-biking: \f84a; -$var-border-all: \f84c; -$var-border-none: \f850; -$var-border-top-left: \f853; -$var-border-style: \f853; -$var-person-digging: \f85e; -$var-digging: \f85e; -$var-fan: \f863; -$var-icons: \f86d; -$var-heart-music-camera-bolt: \f86d; -$var-phone-flip: \f879; -$var-phone-alt: \f879; -$var-square-phone-flip: \f87b; -$var-phone-square-alt: \f87b; -$var-photo-film: \f87c; -$var-photo-video: \f87c; -$var-text-slash: \f87d; -$var-remove-format: \f87d; -$var-arrow-down-z-a: \f881; -$var-sort-alpha-desc: \f881; -$var-sort-alpha-down-alt: \f881; -$var-arrow-up-z-a: \f882; -$var-sort-alpha-up-alt: \f882; -$var-arrow-down-short-wide: \f884; -$var-sort-amount-desc: \f884; -$var-sort-amount-down-alt: \f884; -$var-arrow-up-short-wide: \f885; -$var-sort-amount-up-alt: \f885; -$var-arrow-down-9-1: \f886; -$var-sort-numeric-desc: \f886; -$var-sort-numeric-down-alt: \f886; -$var-arrow-up-9-1: \f887; -$var-sort-numeric-up-alt: \f887; -$var-spell-check: \f891; -$var-voicemail: \f897; -$var-hat-cowboy: \f8c0; -$var-hat-cowboy-side: \f8c1; -$var-computer-mouse: \f8cc; -$var-mouse: \f8cc; -$var-radio: \f8d7; -$var-record-vinyl: \f8d9; -$var-walkie-talkie: \f8ef; -$var-caravan: \f8ff; - -$var-firefox-browser: \e007; -$var-ideal: \e013; -$var-microblog: \e01a; -$var-square-pied-piper: \e01e; -$var-pied-piper-square: \e01e; -$var-unity: \e049; -$var-dailymotion: \e052; -$var-square-instagram: \e055; -$var-instagram-square: \e055; -$var-mixer: \e056; -$var-shopify: \e057; -$var-deezer: \e077; -$var-edge-legacy: \e078; -$var-google-pay: \e079; -$var-rust: \e07a; -$var-tiktok: \e07b; -$var-unsplash: \e07c; -$var-cloudflare: \e07d; -$var-guilded: \e07e; -$var-hive: \e07f; -$var-42-group: \e080; -$var-innosoft: \e080; -$var-instalod: \e081; -$var-octopus-deploy: \e082; -$var-perbyte: \e083; -$var-uncharted: \e084; -$var-watchman-monitoring: \e087; -$var-wodu: \e088; -$var-wirsindhandwerk: \e2d0; -$var-wsh: \e2d0; -$var-bots: \e340; -$var-cmplid: \e360; -$var-bilibili: \e3d9; -$var-golang: \e40f; -$var-pix: \e43a; -$var-sitrox: \e44a; -$var-hashnode: \e499; -$var-meta: \e49b; -$var-padlet: \e4a0; -$var-nfc-directional: \e530; -$var-nfc-symbol: \e531; -$var-screenpal: \e570; -$var-space-awesome: \e5ac; -$var-square-font-awesome: \e5ad; -$var-square-gitlab: \e5ae; -$var-gitlab-square: \e5ae; -$var-odysee: \e5c6; -$var-stubber: \e5c7; -$var-debian: \e60b; -$var-shoelace: \e60c; -$var-threads: \e618; -$var-square-threads: \e619; -$var-square-x-twitter: \e61a; -$var-x-twitter: \e61b; -$var-opensuse: \e62b; -$var-letterboxd: \e62d; -$var-square-letterboxd: \e62e; -$var-mintbit: \e62f; -$var-google-scholar: \e63b; -$var-brave: \e63c; -$var-brave-reverse: \e63d; -$var-pixiv: \e640; -$var-upwork: \e641; -$var-webflow: \e65c; -$var-signal-messenger: \e663; -$var-bluesky: \e671; -$var-jxl: \e67b; -$var-square-upwork: \e67c; -$var-web-awesome: \e682; -$var-square-web-awesome: \e683; -$var-square-web-awesome-stroke: \e684; -$var-dart-lang: \e693; -$var-flutter: \e694; -$var-files-pinwheel: \e69f; -$var-css: \e6a2; -$var-square-bluesky: \e6a3; -$var-openai: \e7cf; -$var-square-linkedin: \e7d0; -$var-cash-app: \e7d4; -$var-disqus: \e7d5; -$var-eleventy: \e7d6; -$var-11ty: \e7d6; -$var-kakao-talk: \e7d7; -$var-linktree: \e7d8; -$var-notion: \e7d9; -$var-pandora: \e7da; -$var-pixelfed: \e7db; -$var-tidal: \e7dc; -$var-vsco: \e7dd; -$var-w3c: \e7de; -$var-lumon: \e7e2; -$var-lumon-drop: \e7e3; -$var-square-figma: \e7e4; -$var-tex: \e7ff; -$var-duolingo: \e812; -$var-square-twitter: \f081; -$var-twitter-square: \f081; -$var-square-facebook: \f082; -$var-facebook-square: \f082; -$var-linkedin: \f08c; -$var-square-github: \f092; -$var-github-square: \f092; -$var-twitter: \f099; -$var-facebook: \f09a; -$var-github: \f09b; -$var-pinterest: \f0d2; -$var-square-pinterest: \f0d3; -$var-pinterest-square: \f0d3; -$var-square-google-plus: \f0d4; -$var-google-plus-square: \f0d4; -$var-google-plus-g: \f0d5; -$var-linkedin-in: \f0e1; -$var-github-alt: \f113; -$var-maxcdn: \f136; -$var-html5: \f13b; -$var-css3: \f13c; -$var-btc: \f15a; -$var-youtube: \f167; -$var-xing: \f168; -$var-square-xing: \f169; -$var-xing-square: \f169; -$var-dropbox: \f16b; -$var-stack-overflow: \f16c; -$var-instagram: \f16d; -$var-flickr: \f16e; -$var-adn: \f170; -$var-bitbucket: \f171; -$var-tumblr: \f173; -$var-square-tumblr: \f174; -$var-tumblr-square: \f174; -$var-apple: \f179; -$var-windows: \f17a; -$var-android: \f17b; -$var-linux: \f17c; -$var-dribbble: \f17d; -$var-skype: \f17e; -$var-foursquare: \f180; -$var-trello: \f181; -$var-gratipay: \f184; -$var-vk: \f189; -$var-weibo: \f18a; -$var-renren: \f18b; -$var-pagelines: \f18c; -$var-stack-exchange: \f18d; -$var-square-vimeo: \f194; -$var-vimeo-square: \f194; -$var-slack: \f198; -$var-slack-hash: \f198; -$var-wordpress: \f19a; -$var-openid: \f19b; -$var-yahoo: \f19e; -$var-google: \f1a0; -$var-reddit: \f1a1; -$var-square-reddit: \f1a2; -$var-reddit-square: \f1a2; -$var-stumbleupon-circle: \f1a3; -$var-stumbleupon: \f1a4; -$var-delicious: \f1a5; -$var-digg: \f1a6; -$var-pied-piper-pp: \f1a7; -$var-pied-piper-alt: \f1a8; -$var-drupal: \f1a9; -$var-joomla: \f1aa; -$var-behance: \f1b4; -$var-square-behance: \f1b5; -$var-behance-square: \f1b5; -$var-steam: \f1b6; -$var-square-steam: \f1b7; -$var-steam-square: \f1b7; -$var-spotify: \f1bc; -$var-deviantart: \f1bd; -$var-soundcloud: \f1be; -$var-vine: \f1ca; -$var-codepen: \f1cb; -$var-jsfiddle: \f1cc; -$var-rebel: \f1d0; -$var-empire: \f1d1; -$var-square-git: \f1d2; -$var-git-square: \f1d2; -$var-git: \f1d3; -$var-hacker-news: \f1d4; -$var-tencent-weibo: \f1d5; -$var-qq: \f1d6; -$var-weixin: \f1d7; -$var-slideshare: \f1e7; -$var-twitch: \f1e8; -$var-yelp: \f1e9; -$var-paypal: \f1ed; -$var-google-wallet: \f1ee; -$var-cc-visa: \f1f0; -$var-cc-mastercard: \f1f1; -$var-cc-discover: \f1f2; -$var-cc-amex: \f1f3; -$var-cc-paypal: \f1f4; -$var-cc-stripe: \f1f5; -$var-lastfm: \f202; -$var-square-lastfm: \f203; -$var-lastfm-square: \f203; -$var-ioxhost: \f208; -$var-angellist: \f209; -$var-buysellads: \f20d; -$var-connectdevelop: \f20e; -$var-dashcube: \f210; -$var-forumbee: \f211; -$var-leanpub: \f212; -$var-sellsy: \f213; -$var-shirtsinbulk: \f214; -$var-simplybuilt: \f215; -$var-skyatlas: \f216; -$var-pinterest-p: \f231; -$var-whatsapp: \f232; -$var-viacoin: \f237; -$var-medium: \f23a; -$var-medium-m: \f23a; -$var-y-combinator: \f23b; -$var-optin-monster: \f23c; -$var-opencart: \f23d; -$var-expeditedssl: \f23e; -$var-cc-jcb: \f24b; -$var-cc-diners-club: \f24c; -$var-creative-commons: \f25e; -$var-gg: \f260; -$var-gg-circle: \f261; -$var-odnoklassniki: \f263; -$var-square-odnoklassniki: \f264; -$var-odnoklassniki-square: \f264; -$var-get-pocket: \f265; -$var-wikipedia-w: \f266; -$var-safari: \f267; -$var-chrome: \f268; -$var-firefox: \f269; -$var-opera: \f26a; -$var-internet-explorer: \f26b; -$var-contao: \f26d; -$var-500px: \f26e; -$var-amazon: \f270; -$var-houzz: \f27c; -$var-vimeo-v: \f27d; -$var-black-tie: \f27e; -$var-fonticons: \f280; -$var-reddit-alien: \f281; -$var-edge: \f282; -$var-codiepie: \f284; -$var-modx: \f285; -$var-fort-awesome: \f286; -$var-usb: \f287; -$var-product-hunt: \f288; -$var-mixcloud: \f289; -$var-scribd: \f28a; -$var-bluetooth: \f293; -$var-bluetooth-b: \f294; -$var-gitlab: \f296; -$var-wpbeginner: \f297; -$var-wpforms: \f298; -$var-envira: \f299; -$var-glide: \f2a5; -$var-glide-g: \f2a6; -$var-viadeo: \f2a9; -$var-square-viadeo: \f2aa; -$var-viadeo-square: \f2aa; -$var-snapchat: \f2ab; -$var-snapchat-ghost: \f2ab; -$var-square-snapchat: \f2ad; -$var-snapchat-square: \f2ad; -$var-pied-piper: \f2ae; -$var-first-order: \f2b0; -$var-yoast: \f2b1; -$var-themeisle: \f2b2; -$var-google-plus: \f2b3; -$var-font-awesome: \f2b4; -$var-font-awesome-flag: \f2b4; -$var-font-awesome-logo-full: \f2b4; -$var-linode: \f2b8; -$var-quora: \f2c4; -$var-free-code-camp: \f2c5; -$var-telegram: \f2c6; -$var-telegram-plane: \f2c6; -$var-bandcamp: \f2d5; -$var-grav: \f2d6; -$var-etsy: \f2d7; -$var-imdb: \f2d8; -$var-ravelry: \f2d9; -$var-sellcast: \f2da; -$var-superpowers: \f2dd; -$var-wpexplorer: \f2de; -$var-meetup: \f2e0; -$var-square-font-awesome-stroke: \f35c; -$var-font-awesome-alt: \f35c; -$var-accessible-icon: \f368; -$var-accusoft: \f369; -$var-adversal: \f36a; -$var-affiliatetheme: \f36b; -$var-algolia: \f36c; -$var-amilia: \f36d; -$var-angrycreative: \f36e; -$var-app-store: \f36f; -$var-app-store-ios: \f370; -$var-apper: \f371; -$var-asymmetrik: \f372; -$var-audible: \f373; -$var-avianex: \f374; -$var-aws: \f375; -$var-bimobject: \f378; -$var-bitcoin: \f379; -$var-bity: \f37a; -$var-blackberry: \f37b; -$var-blogger: \f37c; -$var-blogger-b: \f37d; -$var-buromobelexperte: \f37f; -$var-centercode: \f380; -$var-cloudscale: \f383; -$var-cloudsmith: \f384; -$var-cloudversify: \f385; -$var-cpanel: \f388; -$var-css3-alt: \f38b; -$var-cuttlefish: \f38c; -$var-d-and-d: \f38d; -$var-deploydog: \f38e; -$var-deskpro: \f38f; -$var-digital-ocean: \f391; -$var-discord: \f392; -$var-discourse: \f393; -$var-dochub: \f394; -$var-docker: \f395; -$var-draft2digital: \f396; -$var-square-dribbble: \f397; -$var-dribbble-square: \f397; -$var-dyalog: \f399; -$var-earlybirds: \f39a; -$var-erlang: \f39d; -$var-facebook-f: \f39e; -$var-facebook-messenger: \f39f; -$var-firstdraft: \f3a1; -$var-fonticons-fi: \f3a2; -$var-fort-awesome-alt: \f3a3; -$var-freebsd: \f3a4; -$var-gitkraken: \f3a6; -$var-gofore: \f3a7; -$var-goodreads: \f3a8; -$var-goodreads-g: \f3a9; -$var-google-drive: \f3aa; -$var-google-play: \f3ab; -$var-gripfire: \f3ac; -$var-grunt: \f3ad; -$var-gulp: \f3ae; -$var-square-hacker-news: \f3af; -$var-hacker-news-square: \f3af; -$var-hire-a-helper: \f3b0; -$var-hotjar: \f3b1; -$var-hubspot: \f3b2; -$var-itunes: \f3b4; -$var-itunes-note: \f3b5; -$var-jenkins: \f3b6; -$var-joget: \f3b7; -$var-js: \f3b8; -$var-square-js: \f3b9; -$var-js-square: \f3b9; -$var-keycdn: \f3ba; -$var-kickstarter: \f3bb; -$var-square-kickstarter: \f3bb; -$var-kickstarter-k: \f3bc; -$var-laravel: \f3bd; -$var-line: \f3c0; -$var-lyft: \f3c3; -$var-magento: \f3c4; -$var-medapps: \f3c6; -$var-medrt: \f3c8; -$var-microsoft: \f3ca; -$var-mix: \f3cb; -$var-mizuni: \f3cc; -$var-monero: \f3d0; -$var-napster: \f3d2; -$var-node-js: \f3d3; -$var-npm: \f3d4; -$var-ns8: \f3d5; -$var-nutritionix: \f3d6; -$var-page4: \f3d7; -$var-palfed: \f3d8; -$var-patreon: \f3d9; -$var-periscope: \f3da; -$var-phabricator: \f3db; -$var-phoenix-framework: \f3dc; -$var-playstation: \f3df; -$var-pushed: \f3e1; -$var-python: \f3e2; -$var-red-river: \f3e3; -$var-wpressr: \f3e4; -$var-rendact: \f3e4; -$var-replyd: \f3e6; -$var-resolving: \f3e7; -$var-rocketchat: \f3e8; -$var-rockrms: \f3e9; -$var-schlix: \f3ea; -$var-searchengin: \f3eb; -$var-servicestack: \f3ec; -$var-sistrix: \f3ee; -$var-speakap: \f3f3; -$var-staylinked: \f3f5; -$var-steam-symbol: \f3f6; -$var-sticker-mule: \f3f7; -$var-studiovinari: \f3f8; -$var-supple: \f3f9; -$var-uber: \f402; -$var-uikit: \f403; -$var-uniregistry: \f404; -$var-untappd: \f405; -$var-ussunnah: \f407; -$var-vaadin: \f408; -$var-viber: \f409; -$var-vimeo: \f40a; -$var-vnv: \f40b; -$var-square-whatsapp: \f40c; -$var-whatsapp-square: \f40c; -$var-whmcs: \f40d; -$var-wordpress-simple: \f411; -$var-xbox: \f412; -$var-yandex: \f413; -$var-yandex-international: \f414; -$var-apple-pay: \f415; -$var-cc-apple-pay: \f416; -$var-fly: \f417; -$var-node: \f419; -$var-osi: \f41a; -$var-react: \f41b; -$var-autoprefixer: \f41c; -$var-less: \f41d; -$var-sass: \f41e; -$var-vuejs: \f41f; -$var-angular: \f420; -$var-aviato: \f421; -$var-ember: \f423; -$var-gitter: \f426; -$var-hooli: \f427; -$var-strava: \f428; -$var-stripe: \f429; -$var-stripe-s: \f42a; -$var-typo3: \f42b; -$var-amazon-pay: \f42c; -$var-cc-amazon-pay: \f42d; -$var-ethereum: \f42e; -$var-korvue: \f42f; -$var-elementor: \f430; -$var-square-youtube: \f431; -$var-youtube-square: \f431; -$var-flipboard: \f44d; -$var-hips: \f452; -$var-php: \f457; -$var-quinscape: \f459; -$var-readme: \f4d5; -$var-java: \f4e4; -$var-pied-piper-hat: \f4e5; -$var-creative-commons-by: \f4e7; -$var-creative-commons-nc: \f4e8; -$var-creative-commons-nc-eu: \f4e9; -$var-creative-commons-nc-jp: \f4ea; -$var-creative-commons-nd: \f4eb; -$var-creative-commons-pd: \f4ec; -$var-creative-commons-pd-alt: \f4ed; -$var-creative-commons-remix: \f4ee; -$var-creative-commons-sa: \f4ef; -$var-creative-commons-sampling: \f4f0; -$var-creative-commons-sampling-plus: \f4f1; -$var-creative-commons-share: \f4f2; -$var-creative-commons-zero: \f4f3; -$var-ebay: \f4f4; -$var-keybase: \f4f5; -$var-mastodon: \f4f6; -$var-r-project: \f4f7; -$var-researchgate: \f4f8; -$var-teamspeak: \f4f9; -$var-first-order-alt: \f50a; -$var-fulcrum: \f50b; -$var-galactic-republic: \f50c; -$var-galactic-senate: \f50d; -$var-jedi-order: \f50e; -$var-mandalorian: \f50f; -$var-old-republic: \f510; -$var-phoenix-squadron: \f511; -$var-sith: \f512; -$var-trade-federation: \f513; -$var-wolf-pack-battalion: \f514; -$var-hornbill: \f592; -$var-mailchimp: \f59e; -$var-megaport: \f5a3; -$var-nimblr: \f5a8; -$var-rev: \f5b2; -$var-shopware: \f5b5; -$var-squarespace: \f5be; -$var-themeco: \f5c6; -$var-weebly: \f5cc; -$var-wix: \f5cf; -$var-ello: \f5f1; -$var-hackerrank: \f5f7; -$var-kaggle: \f5fa; -$var-markdown: \f60f; -$var-neos: \f612; -$var-zhihu: \f63f; -$var-alipay: \f642; -$var-the-red-yeti: \f69d; -$var-critical-role: \f6c9; -$var-d-and-d-beyond: \f6ca; -$var-dev: \f6cc; -$var-fantasy-flight-games: \f6dc; -$var-wizards-of-the-coast: \f730; -$var-think-peaks: \f731; -$var-reacteurope: \f75d; -$var-artstation: \f77a; -$var-atlassian: \f77b; -$var-canadian-maple-leaf: \f785; -$var-centos: \f789; -$var-confluence: \f78d; -$var-dhl: \f790; -$var-diaspora: \f791; -$var-fedex: \f797; -$var-fedora: \f798; -$var-figma: \f799; -$var-intercom: \f7af; -$var-invision: \f7b0; -$var-jira: \f7b1; -$var-mendeley: \f7b3; -$var-raspberry-pi: \f7bb; -$var-redhat: \f7bc; -$var-sketch: \f7c6; -$var-sourcetree: \f7d3; -$var-suse: \f7d6; -$var-ubuntu: \f7df; -$var-ups: \f7e0; -$var-usps: \f7e1; -$var-yarn: \f7e3; -$var-airbnb: \f834; -$var-battle-net: \f835; -$var-bootstrap: \f836; -$var-buffer: \f837; -$var-chromecast: \f838; -$var-evernote: \f839; -$var-itch-io: \f83a; -$var-salesforce: \f83b; -$var-speaker-deck: \f83c; -$var-symfony: \f83d; -$var-waze: \f83f; -$var-yammer: \f840; -$var-git-alt: \f841; -$var-stackpath: \f842; -$var-cotton-bureau: \f89e; -$var-buy-n-large: \f8a6; -$var-mdb: \f8ca; -$var-orcid: \f8d2; -$var-swift: \f8e1; -$var-umbraco: \f8e8; - -$icons: ( - '0': $var-0, - '1': $var-1, - '2': $var-2, - '3': $var-3, - '4': $var-4, - '5': $var-5, - '6': $var-6, - '7': $var-7, - '8': $var-8, - '9': $var-9, - 'exclamation': $var-exclamation, - 'hashtag': $var-hashtag, - 'dollar-sign': $var-dollar-sign, - 'dollar': $var-dollar, - 'usd': $var-usd, - 'percent': $var-percent, - 'percentage': $var-percentage, - 'asterisk': $var-asterisk, - 'plus': $var-plus, - 'add': $var-add, - 'less-than': $var-less-than, - 'equals': $var-equals, - 'greater-than': $var-greater-than, - 'question': $var-question, - 'at': $var-at, - 'a': $var-a, - 'b': $var-b, - 'c': $var-c, - 'd': $var-d, - 'e': $var-e, - 'f': $var-f, - 'g': $var-g, - 'h': $var-h, - 'i': $var-i, - 'j': $var-j, - 'k': $var-k, - 'l': $var-l, - 'm': $var-m, - 'n': $var-n, - 'o': $var-o, - 'p': $var-p, - 'q': $var-q, - 'r': $var-r, - 's': $var-s, - 't': $var-t, - 'u': $var-u, - 'v': $var-v, - 'w': $var-w, - 'x': $var-x, - 'y': $var-y, - 'z': $var-z, - 'faucet': $var-faucet, - 'faucet-drip': $var-faucet-drip, - 'house-chimney-window': $var-house-chimney-window, - 'house-signal': $var-house-signal, - 'temperature-arrow-down': $var-temperature-arrow-down, - 'temperature-down': $var-temperature-down, - 'temperature-arrow-up': $var-temperature-arrow-up, - 'temperature-up': $var-temperature-up, - 'trailer': $var-trailer, - 'bacteria': $var-bacteria, - 'bacterium': $var-bacterium, - 'box-tissue': $var-box-tissue, - 'hand-holding-medical': $var-hand-holding-medical, - 'hand-sparkles': $var-hand-sparkles, - 'hands-bubbles': $var-hands-bubbles, - 'hands-wash': $var-hands-wash, - 'handshake-slash': $var-handshake-slash, - 'handshake-alt-slash': $var-handshake-alt-slash, - 'handshake-simple-slash': $var-handshake-simple-slash, - 'head-side-cough': $var-head-side-cough, - 'head-side-cough-slash': $var-head-side-cough-slash, - 'head-side-mask': $var-head-side-mask, - 'head-side-virus': $var-head-side-virus, - 'house-chimney-user': $var-house-chimney-user, - 'house-laptop': $var-house-laptop, - 'laptop-house': $var-laptop-house, - 'lungs-virus': $var-lungs-virus, - 'people-arrows': $var-people-arrows, - 'people-arrows-left-right': $var-people-arrows-left-right, - 'plane-slash': $var-plane-slash, - 'pump-medical': $var-pump-medical, - 'pump-soap': $var-pump-soap, - 'shield-virus': $var-shield-virus, - 'sink': $var-sink, - 'soap': $var-soap, - 'stopwatch-20': $var-stopwatch-20, - 'shop-slash': $var-shop-slash, - 'store-alt-slash': $var-store-alt-slash, - 'store-slash': $var-store-slash, - 'toilet-paper-slash': $var-toilet-paper-slash, - 'users-slash': $var-users-slash, - 'virus': $var-virus, - 'virus-slash': $var-virus-slash, - 'viruses': $var-viruses, - 'vest': $var-vest, - 'vest-patches': $var-vest-patches, - 'arrow-trend-down': $var-arrow-trend-down, - 'arrow-trend-up': $var-arrow-trend-up, - 'arrow-up-from-bracket': $var-arrow-up-from-bracket, - 'austral-sign': $var-austral-sign, - 'baht-sign': $var-baht-sign, - 'bitcoin-sign': $var-bitcoin-sign, - 'bolt-lightning': $var-bolt-lightning, - 'book-bookmark': $var-book-bookmark, - 'camera-rotate': $var-camera-rotate, - 'cedi-sign': $var-cedi-sign, - 'chart-column': $var-chart-column, - 'chart-gantt': $var-chart-gantt, - 'clapperboard': $var-clapperboard, - 'clover': $var-clover, - 'code-compare': $var-code-compare, - 'code-fork': $var-code-fork, - 'code-pull-request': $var-code-pull-request, - 'colon-sign': $var-colon-sign, - 'cruzeiro-sign': $var-cruzeiro-sign, - 'display': $var-display, - 'dong-sign': $var-dong-sign, - 'elevator': $var-elevator, - 'filter-circle-xmark': $var-filter-circle-xmark, - 'florin-sign': $var-florin-sign, - 'folder-closed': $var-folder-closed, - 'franc-sign': $var-franc-sign, - 'guarani-sign': $var-guarani-sign, - 'gun': $var-gun, - 'hands-clapping': $var-hands-clapping, - 'house-user': $var-house-user, - 'home-user': $var-home-user, - 'indian-rupee-sign': $var-indian-rupee-sign, - 'indian-rupee': $var-indian-rupee, - 'inr': $var-inr, - 'kip-sign': $var-kip-sign, - 'lari-sign': $var-lari-sign, - 'litecoin-sign': $var-litecoin-sign, - 'manat-sign': $var-manat-sign, - 'mask-face': $var-mask-face, - 'mill-sign': $var-mill-sign, - 'money-bills': $var-money-bills, - 'naira-sign': $var-naira-sign, - 'notdef': $var-notdef, - 'panorama': $var-panorama, - 'peseta-sign': $var-peseta-sign, - 'peso-sign': $var-peso-sign, - 'plane-up': $var-plane-up, - 'rupiah-sign': $var-rupiah-sign, - 'stairs': $var-stairs, - 'timeline': $var-timeline, - 'truck-front': $var-truck-front, - 'turkish-lira-sign': $var-turkish-lira-sign, - 'try': $var-try, - 'turkish-lira': $var-turkish-lira, - 'vault': $var-vault, - 'wand-magic-sparkles': $var-wand-magic-sparkles, - 'magic-wand-sparkles': $var-magic-wand-sparkles, - 'wheat-awn': $var-wheat-awn, - 'wheat-alt': $var-wheat-alt, - 'wheelchair-move': $var-wheelchair-move, - 'wheelchair-alt': $var-wheelchair-alt, - 'bangladeshi-taka-sign': $var-bangladeshi-taka-sign, - 'bowl-rice': $var-bowl-rice, - 'person-pregnant': $var-person-pregnant, - 'house-chimney': $var-house-chimney, - 'home-lg': $var-home-lg, - 'house-crack': $var-house-crack, - 'house-medical': $var-house-medical, - 'cent-sign': $var-cent-sign, - 'plus-minus': $var-plus-minus, - 'sailboat': $var-sailboat, - 'section': $var-section, - 'shrimp': $var-shrimp, - 'brazilian-real-sign': $var-brazilian-real-sign, - 'chart-simple': $var-chart-simple, - 'diagram-next': $var-diagram-next, - 'diagram-predecessor': $var-diagram-predecessor, - 'diagram-successor': $var-diagram-successor, - 'earth-oceania': $var-earth-oceania, - 'globe-oceania': $var-globe-oceania, - 'bug-slash': $var-bug-slash, - 'file-circle-plus': $var-file-circle-plus, - 'shop-lock': $var-shop-lock, - 'virus-covid': $var-virus-covid, - 'virus-covid-slash': $var-virus-covid-slash, - 'anchor-circle-check': $var-anchor-circle-check, - 'anchor-circle-exclamation': $var-anchor-circle-exclamation, - 'anchor-circle-xmark': $var-anchor-circle-xmark, - 'anchor-lock': $var-anchor-lock, - 'arrow-down-up-across-line': $var-arrow-down-up-across-line, - 'arrow-down-up-lock': $var-arrow-down-up-lock, - 'arrow-right-to-city': $var-arrow-right-to-city, - 'arrow-up-from-ground-water': $var-arrow-up-from-ground-water, - 'arrow-up-from-water-pump': $var-arrow-up-from-water-pump, - 'arrow-up-right-dots': $var-arrow-up-right-dots, - 'arrows-down-to-line': $var-arrows-down-to-line, - 'arrows-down-to-people': $var-arrows-down-to-people, - 'arrows-left-right-to-line': $var-arrows-left-right-to-line, - 'arrows-spin': $var-arrows-spin, - 'arrows-split-up-and-left': $var-arrows-split-up-and-left, - 'arrows-to-circle': $var-arrows-to-circle, - 'arrows-to-dot': $var-arrows-to-dot, - 'arrows-to-eye': $var-arrows-to-eye, - 'arrows-turn-right': $var-arrows-turn-right, - 'arrows-turn-to-dots': $var-arrows-turn-to-dots, - 'arrows-up-to-line': $var-arrows-up-to-line, - 'bore-hole': $var-bore-hole, - 'bottle-droplet': $var-bottle-droplet, - 'bottle-water': $var-bottle-water, - 'bowl-food': $var-bowl-food, - 'boxes-packing': $var-boxes-packing, - 'bridge': $var-bridge, - 'bridge-circle-check': $var-bridge-circle-check, - 'bridge-circle-exclamation': $var-bridge-circle-exclamation, - 'bridge-circle-xmark': $var-bridge-circle-xmark, - 'bridge-lock': $var-bridge-lock, - 'bridge-water': $var-bridge-water, - 'bucket': $var-bucket, - 'bugs': $var-bugs, - 'building-circle-arrow-right': $var-building-circle-arrow-right, - 'building-circle-check': $var-building-circle-check, - 'building-circle-exclamation': $var-building-circle-exclamation, - 'building-circle-xmark': $var-building-circle-xmark, - 'building-flag': $var-building-flag, - 'building-lock': $var-building-lock, - 'building-ngo': $var-building-ngo, - 'building-shield': $var-building-shield, - 'building-un': $var-building-un, - 'building-user': $var-building-user, - 'building-wheat': $var-building-wheat, - 'burst': $var-burst, - 'car-on': $var-car-on, - 'car-tunnel': $var-car-tunnel, - 'child-combatant': $var-child-combatant, - 'child-rifle': $var-child-rifle, - 'children': $var-children, - 'circle-nodes': $var-circle-nodes, - 'clipboard-question': $var-clipboard-question, - 'cloud-showers-water': $var-cloud-showers-water, - 'computer': $var-computer, - 'cubes-stacked': $var-cubes-stacked, - 'envelope-circle-check': $var-envelope-circle-check, - 'explosion': $var-explosion, - 'ferry': $var-ferry, - 'file-circle-exclamation': $var-file-circle-exclamation, - 'file-circle-minus': $var-file-circle-minus, - 'file-circle-question': $var-file-circle-question, - 'file-shield': $var-file-shield, - 'fire-burner': $var-fire-burner, - 'fish-fins': $var-fish-fins, - 'flask-vial': $var-flask-vial, - 'glass-water': $var-glass-water, - 'glass-water-droplet': $var-glass-water-droplet, - 'group-arrows-rotate': $var-group-arrows-rotate, - 'hand-holding-hand': $var-hand-holding-hand, - 'handcuffs': $var-handcuffs, - 'hands-bound': $var-hands-bound, - 'hands-holding-child': $var-hands-holding-child, - 'hands-holding-circle': $var-hands-holding-circle, - 'heart-circle-bolt': $var-heart-circle-bolt, - 'heart-circle-check': $var-heart-circle-check, - 'heart-circle-exclamation': $var-heart-circle-exclamation, - 'heart-circle-minus': $var-heart-circle-minus, - 'heart-circle-plus': $var-heart-circle-plus, - 'heart-circle-xmark': $var-heart-circle-xmark, - 'helicopter-symbol': $var-helicopter-symbol, - 'helmet-un': $var-helmet-un, - 'hill-avalanche': $var-hill-avalanche, - 'hill-rockslide': $var-hill-rockslide, - 'house-circle-check': $var-house-circle-check, - 'house-circle-exclamation': $var-house-circle-exclamation, - 'house-circle-xmark': $var-house-circle-xmark, - 'house-fire': $var-house-fire, - 'house-flag': $var-house-flag, - 'house-flood-water': $var-house-flood-water, - 'house-flood-water-circle-arrow-right': - $var-house-flood-water-circle-arrow-right, - 'house-lock': $var-house-lock, - 'house-medical-circle-check': $var-house-medical-circle-check, - 'house-medical-circle-exclamation': $var-house-medical-circle-exclamation, - 'house-medical-circle-xmark': $var-house-medical-circle-xmark, - 'house-medical-flag': $var-house-medical-flag, - 'house-tsunami': $var-house-tsunami, - 'jar': $var-jar, - 'jar-wheat': $var-jar-wheat, - 'jet-fighter-up': $var-jet-fighter-up, - 'jug-detergent': $var-jug-detergent, - 'kitchen-set': $var-kitchen-set, - 'land-mine-on': $var-land-mine-on, - 'landmark-flag': $var-landmark-flag, - 'laptop-file': $var-laptop-file, - 'lines-leaning': $var-lines-leaning, - 'location-pin-lock': $var-location-pin-lock, - 'locust': $var-locust, - 'magnifying-glass-arrow-right': $var-magnifying-glass-arrow-right, - 'magnifying-glass-chart': $var-magnifying-glass-chart, - 'mars-and-venus-burst': $var-mars-and-venus-burst, - 'mask-ventilator': $var-mask-ventilator, - 'mattress-pillow': $var-mattress-pillow, - 'mobile-retro': $var-mobile-retro, - 'money-bill-transfer': $var-money-bill-transfer, - 'money-bill-trend-up': $var-money-bill-trend-up, - 'money-bill-wheat': $var-money-bill-wheat, - 'mosquito': $var-mosquito, - 'mosquito-net': $var-mosquito-net, - 'mound': $var-mound, - 'mountain-city': $var-mountain-city, - 'mountain-sun': $var-mountain-sun, - 'oil-well': $var-oil-well, - 'people-group': $var-people-group, - 'people-line': $var-people-line, - 'people-pulling': $var-people-pulling, - 'people-robbery': $var-people-robbery, - 'people-roof': $var-people-roof, - 'person-arrow-down-to-line': $var-person-arrow-down-to-line, - 'person-arrow-up-from-line': $var-person-arrow-up-from-line, - 'person-breastfeeding': $var-person-breastfeeding, - 'person-burst': $var-person-burst, - 'person-cane': $var-person-cane, - 'person-chalkboard': $var-person-chalkboard, - 'person-circle-check': $var-person-circle-check, - 'person-circle-exclamation': $var-person-circle-exclamation, - 'person-circle-minus': $var-person-circle-minus, - 'person-circle-plus': $var-person-circle-plus, - 'person-circle-question': $var-person-circle-question, - 'person-circle-xmark': $var-person-circle-xmark, - 'person-dress-burst': $var-person-dress-burst, - 'person-drowning': $var-person-drowning, - 'person-falling': $var-person-falling, - 'person-falling-burst': $var-person-falling-burst, - 'person-half-dress': $var-person-half-dress, - 'person-harassing': $var-person-harassing, - 'person-military-pointing': $var-person-military-pointing, - 'person-military-rifle': $var-person-military-rifle, - 'person-military-to-person': $var-person-military-to-person, - 'person-rays': $var-person-rays, - 'person-rifle': $var-person-rifle, - 'person-shelter': $var-person-shelter, - 'person-walking-arrow-loop-left': $var-person-walking-arrow-loop-left, - 'person-walking-arrow-right': $var-person-walking-arrow-right, - 'person-walking-dashed-line-arrow-right': - $var-person-walking-dashed-line-arrow-right, - 'person-walking-luggage': $var-person-walking-luggage, - 'plane-circle-check': $var-plane-circle-check, - 'plane-circle-exclamation': $var-plane-circle-exclamation, - 'plane-circle-xmark': $var-plane-circle-xmark, - 'plane-lock': $var-plane-lock, - 'plate-wheat': $var-plate-wheat, - 'plug-circle-bolt': $var-plug-circle-bolt, - 'plug-circle-check': $var-plug-circle-check, - 'plug-circle-exclamation': $var-plug-circle-exclamation, - 'plug-circle-minus': $var-plug-circle-minus, - 'plug-circle-plus': $var-plug-circle-plus, - 'plug-circle-xmark': $var-plug-circle-xmark, - 'ranking-star': $var-ranking-star, - 'road-barrier': $var-road-barrier, - 'road-bridge': $var-road-bridge, - 'road-circle-check': $var-road-circle-check, - 'road-circle-exclamation': $var-road-circle-exclamation, - 'road-circle-xmark': $var-road-circle-xmark, - 'road-lock': $var-road-lock, - 'road-spikes': $var-road-spikes, - 'rug': $var-rug, - 'sack-xmark': $var-sack-xmark, - 'school-circle-check': $var-school-circle-check, - 'school-circle-exclamation': $var-school-circle-exclamation, - 'school-circle-xmark': $var-school-circle-xmark, - 'school-flag': $var-school-flag, - 'school-lock': $var-school-lock, - 'sheet-plastic': $var-sheet-plastic, - 'shield-cat': $var-shield-cat, - 'shield-dog': $var-shield-dog, - 'shield-heart': $var-shield-heart, - 'square-nfi': $var-square-nfi, - 'square-person-confined': $var-square-person-confined, - 'square-virus': $var-square-virus, - 'staff-snake': $var-staff-snake, - 'rod-asclepius': $var-rod-asclepius, - 'rod-snake': $var-rod-snake, - 'staff-aesculapius': $var-staff-aesculapius, - 'sun-plant-wilt': $var-sun-plant-wilt, - 'tarp': $var-tarp, - 'tarp-droplet': $var-tarp-droplet, - 'tent': $var-tent, - 'tent-arrow-down-to-line': $var-tent-arrow-down-to-line, - 'tent-arrow-left-right': $var-tent-arrow-left-right, - 'tent-arrow-turn-left': $var-tent-arrow-turn-left, - 'tent-arrows-down': $var-tent-arrows-down, - 'tents': $var-tents, - 'toilet-portable': $var-toilet-portable, - 'toilets-portable': $var-toilets-portable, - 'tower-cell': $var-tower-cell, - 'tower-observation': $var-tower-observation, - 'tree-city': $var-tree-city, - 'trowel': $var-trowel, - 'trowel-bricks': $var-trowel-bricks, - 'truck-arrow-right': $var-truck-arrow-right, - 'truck-droplet': $var-truck-droplet, - 'truck-field': $var-truck-field, - 'truck-field-un': $var-truck-field-un, - 'truck-plane': $var-truck-plane, - 'users-between-lines': $var-users-between-lines, - 'users-line': $var-users-line, - 'users-rays': $var-users-rays, - 'users-rectangle': $var-users-rectangle, - 'users-viewfinder': $var-users-viewfinder, - 'vial-circle-check': $var-vial-circle-check, - 'vial-virus': $var-vial-virus, - 'wheat-awn-circle-exclamation': $var-wheat-awn-circle-exclamation, - 'worm': $var-worm, - 'xmarks-lines': $var-xmarks-lines, - 'child-dress': $var-child-dress, - 'child-reaching': $var-child-reaching, - 'file-circle-check': $var-file-circle-check, - 'file-circle-xmark': $var-file-circle-xmark, - 'person-through-window': $var-person-through-window, - 'plant-wilt': $var-plant-wilt, - 'stapler': $var-stapler, - 'train-tram': $var-train-tram, - 'table-cells-column-lock': $var-table-cells-column-lock, - 'table-cells-row-lock': $var-table-cells-row-lock, - 'web-awesome': $var-web-awesome, - 'thumbtack-slash': $var-thumbtack-slash, - 'thumb-tack-slash': $var-thumb-tack-slash, - 'table-cells-row-unlock': $var-table-cells-row-unlock, - 'chart-diagram': $var-chart-diagram, - 'comment-nodes': $var-comment-nodes, - 'file-fragment': $var-file-fragment, - 'file-half-dashed': $var-file-half-dashed, - 'hexagon-nodes': $var-hexagon-nodes, - 'hexagon-nodes-bolt': $var-hexagon-nodes-bolt, - 'square-binary': $var-square-binary, - 'pentagon': $var-pentagon, - 'non-binary': $var-non-binary, - 'spiral': $var-spiral, - 'mobile-vibrate': $var-mobile-vibrate, - 'single-quote-left': $var-single-quote-left, - 'single-quote-right': $var-single-quote-right, - 'bus-side': $var-bus-side, - 'septagon': $var-septagon, - 'heptagon': $var-heptagon, - 'martini-glass-empty': $var-martini-glass-empty, - 'glass-martini': $var-glass-martini, - 'music': $var-music, - 'magnifying-glass': $var-magnifying-glass, - 'search': $var-search, - 'heart': $var-heart, - 'star': $var-star, - 'user': $var-user, - 'user-alt': $var-user-alt, - 'user-large': $var-user-large, - 'film': $var-film, - 'film-alt': $var-film-alt, - 'film-simple': $var-film-simple, - 'table-cells-large': $var-table-cells-large, - 'th-large': $var-th-large, - 'table-cells': $var-table-cells, - 'th': $var-th, - 'table-list': $var-table-list, - 'th-list': $var-th-list, - 'check': $var-check, - 'xmark': $var-xmark, - 'close': $var-close, - 'multiply': $var-multiply, - 'remove': $var-remove, - 'times': $var-times, - 'magnifying-glass-plus': $var-magnifying-glass-plus, - 'search-plus': $var-search-plus, - 'magnifying-glass-minus': $var-magnifying-glass-minus, - 'search-minus': $var-search-minus, - 'power-off': $var-power-off, - 'signal': $var-signal, - 'signal-5': $var-signal-5, - 'signal-perfect': $var-signal-perfect, - 'gear': $var-gear, - 'cog': $var-cog, - 'house': $var-house, - 'home': $var-home, - 'home-alt': $var-home-alt, - 'home-lg-alt': $var-home-lg-alt, - 'clock': $var-clock, - 'clock-four': $var-clock-four, - 'road': $var-road, - 'download': $var-download, - 'inbox': $var-inbox, - 'arrow-rotate-right': $var-arrow-rotate-right, - 'arrow-right-rotate': $var-arrow-right-rotate, - 'arrow-rotate-forward': $var-arrow-rotate-forward, - 'redo': $var-redo, - 'arrows-rotate': $var-arrows-rotate, - 'refresh': $var-refresh, - 'sync': $var-sync, - 'rectangle-list': $var-rectangle-list, - 'list-alt': $var-list-alt, - 'lock': $var-lock, - 'flag': $var-flag, - 'headphones': $var-headphones, - 'headphones-alt': $var-headphones-alt, - 'headphones-simple': $var-headphones-simple, - 'volume-off': $var-volume-off, - 'volume-low': $var-volume-low, - 'volume-down': $var-volume-down, - 'volume-high': $var-volume-high, - 'volume-up': $var-volume-up, - 'qrcode': $var-qrcode, - 'barcode': $var-barcode, - 'tag': $var-tag, - 'tags': $var-tags, - 'book': $var-book, - 'bookmark': $var-bookmark, - 'print': $var-print, - 'camera': $var-camera, - 'camera-alt': $var-camera-alt, - 'font': $var-font, - 'bold': $var-bold, - 'italic': $var-italic, - 'text-height': $var-text-height, - 'text-width': $var-text-width, - 'align-left': $var-align-left, - 'align-center': $var-align-center, - 'align-right': $var-align-right, - 'align-justify': $var-align-justify, - 'list': $var-list, - 'list-squares': $var-list-squares, - 'outdent': $var-outdent, - 'dedent': $var-dedent, - 'indent': $var-indent, - 'video': $var-video, - 'video-camera': $var-video-camera, - 'image': $var-image, - 'location-pin': $var-location-pin, - 'map-marker': $var-map-marker, - 'circle-half-stroke': $var-circle-half-stroke, - 'adjust': $var-adjust, - 'droplet': $var-droplet, - 'tint': $var-tint, - 'pen-to-square': $var-pen-to-square, - 'edit': $var-edit, - 'arrows-up-down-left-right': $var-arrows-up-down-left-right, - 'arrows': $var-arrows, - 'backward-step': $var-backward-step, - 'step-backward': $var-step-backward, - 'backward-fast': $var-backward-fast, - 'fast-backward': $var-fast-backward, - 'backward': $var-backward, - 'play': $var-play, - 'pause': $var-pause, - 'stop': $var-stop, - 'forward': $var-forward, - 'forward-fast': $var-forward-fast, - 'fast-forward': $var-fast-forward, - 'forward-step': $var-forward-step, - 'step-forward': $var-step-forward, - 'eject': $var-eject, - 'chevron-left': $var-chevron-left, - 'chevron-right': $var-chevron-right, - 'circle-plus': $var-circle-plus, - 'plus-circle': $var-plus-circle, - 'circle-minus': $var-circle-minus, - 'minus-circle': $var-minus-circle, - 'circle-xmark': $var-circle-xmark, - 'times-circle': $var-times-circle, - 'xmark-circle': $var-xmark-circle, - 'circle-check': $var-circle-check, - 'check-circle': $var-check-circle, - 'circle-question': $var-circle-question, - 'question-circle': $var-question-circle, - 'circle-info': $var-circle-info, - 'info-circle': $var-info-circle, - 'crosshairs': $var-crosshairs, - 'ban': $var-ban, - 'cancel': $var-cancel, - 'arrow-left': $var-arrow-left, - 'arrow-right': $var-arrow-right, - 'arrow-up': $var-arrow-up, - 'arrow-down': $var-arrow-down, - 'share': $var-share, - 'mail-forward': $var-mail-forward, - 'expand': $var-expand, - 'compress': $var-compress, - 'minus': $var-minus, - 'subtract': $var-subtract, - 'circle-exclamation': $var-circle-exclamation, - 'exclamation-circle': $var-exclamation-circle, - 'gift': $var-gift, - 'leaf': $var-leaf, - 'fire': $var-fire, - 'eye': $var-eye, - 'eye-slash': $var-eye-slash, - 'triangle-exclamation': $var-triangle-exclamation, - 'exclamation-triangle': $var-exclamation-triangle, - 'warning': $var-warning, - 'plane': $var-plane, - 'calendar-days': $var-calendar-days, - 'calendar-alt': $var-calendar-alt, - 'shuffle': $var-shuffle, - 'random': $var-random, - 'comment': $var-comment, - 'magnet': $var-magnet, - 'chevron-up': $var-chevron-up, - 'chevron-down': $var-chevron-down, - 'retweet': $var-retweet, - 'cart-shopping': $var-cart-shopping, - 'shopping-cart': $var-shopping-cart, - 'folder': $var-folder, - 'folder-blank': $var-folder-blank, - 'folder-open': $var-folder-open, - 'arrows-up-down': $var-arrows-up-down, - 'arrows-v': $var-arrows-v, - 'arrows-left-right': $var-arrows-left-right, - 'arrows-h': $var-arrows-h, - 'chart-bar': $var-chart-bar, - 'bar-chart': $var-bar-chart, - 'camera-retro': $var-camera-retro, - 'key': $var-key, - 'gears': $var-gears, - 'cogs': $var-cogs, - 'comments': $var-comments, - 'star-half': $var-star-half, - 'arrow-right-from-bracket': $var-arrow-right-from-bracket, - 'sign-out': $var-sign-out, - 'thumbtack': $var-thumbtack, - 'thumb-tack': $var-thumb-tack, - 'arrow-up-right-from-square': $var-arrow-up-right-from-square, - 'external-link': $var-external-link, - 'arrow-right-to-bracket': $var-arrow-right-to-bracket, - 'sign-in': $var-sign-in, - 'trophy': $var-trophy, - 'upload': $var-upload, - 'lemon': $var-lemon, - 'phone': $var-phone, - 'square-phone': $var-square-phone, - 'phone-square': $var-phone-square, - 'unlock': $var-unlock, - 'credit-card': $var-credit-card, - 'credit-card-alt': $var-credit-card-alt, - 'rss': $var-rss, - 'feed': $var-feed, - 'hard-drive': $var-hard-drive, - 'hdd': $var-hdd, - 'bullhorn': $var-bullhorn, - 'certificate': $var-certificate, - 'hand-point-right': $var-hand-point-right, - 'hand-point-left': $var-hand-point-left, - 'hand-point-up': $var-hand-point-up, - 'hand-point-down': $var-hand-point-down, - 'circle-arrow-left': $var-circle-arrow-left, - 'arrow-circle-left': $var-arrow-circle-left, - 'circle-arrow-right': $var-circle-arrow-right, - 'arrow-circle-right': $var-arrow-circle-right, - 'circle-arrow-up': $var-circle-arrow-up, - 'arrow-circle-up': $var-arrow-circle-up, - 'circle-arrow-down': $var-circle-arrow-down, - 'arrow-circle-down': $var-arrow-circle-down, - 'globe': $var-globe, - 'wrench': $var-wrench, - 'list-check': $var-list-check, - 'tasks': $var-tasks, - 'filter': $var-filter, - 'briefcase': $var-briefcase, - 'up-down-left-right': $var-up-down-left-right, - 'arrows-alt': $var-arrows-alt, - 'users': $var-users, - 'link': $var-link, - 'chain': $var-chain, - 'cloud': $var-cloud, - 'flask': $var-flask, - 'scissors': $var-scissors, - 'cut': $var-cut, - 'copy': $var-copy, - 'paperclip': $var-paperclip, - 'floppy-disk': $var-floppy-disk, - 'save': $var-save, - 'square': $var-square, - 'bars': $var-bars, - 'navicon': $var-navicon, - 'list-ul': $var-list-ul, - 'list-dots': $var-list-dots, - 'list-ol': $var-list-ol, - 'list-1-2': $var-list-1-2, - 'list-numeric': $var-list-numeric, - 'strikethrough': $var-strikethrough, - 'underline': $var-underline, - 'table': $var-table, - 'wand-magic': $var-wand-magic, - 'magic': $var-magic, - 'truck': $var-truck, - 'money-bill': $var-money-bill, - 'caret-down': $var-caret-down, - 'caret-up': $var-caret-up, - 'caret-left': $var-caret-left, - 'caret-right': $var-caret-right, - 'table-columns': $var-table-columns, - 'columns': $var-columns, - 'sort': $var-sort, - 'unsorted': $var-unsorted, - 'sort-down': $var-sort-down, - 'sort-desc': $var-sort-desc, - 'sort-up': $var-sort-up, - 'sort-asc': $var-sort-asc, - 'envelope': $var-envelope, - 'arrow-rotate-left': $var-arrow-rotate-left, - 'arrow-left-rotate': $var-arrow-left-rotate, - 'arrow-rotate-back': $var-arrow-rotate-back, - 'arrow-rotate-backward': $var-arrow-rotate-backward, - 'undo': $var-undo, - 'gavel': $var-gavel, - 'legal': $var-legal, - 'bolt': $var-bolt, - 'zap': $var-zap, - 'sitemap': $var-sitemap, - 'umbrella': $var-umbrella, - 'paste': $var-paste, - 'file-clipboard': $var-file-clipboard, - 'lightbulb': $var-lightbulb, - 'arrow-right-arrow-left': $var-arrow-right-arrow-left, - 'exchange': $var-exchange, - 'cloud-arrow-down': $var-cloud-arrow-down, - 'cloud-download': $var-cloud-download, - 'cloud-download-alt': $var-cloud-download-alt, - 'cloud-arrow-up': $var-cloud-arrow-up, - 'cloud-upload': $var-cloud-upload, - 'cloud-upload-alt': $var-cloud-upload-alt, - 'user-doctor': $var-user-doctor, - 'user-md': $var-user-md, - 'stethoscope': $var-stethoscope, - 'suitcase': $var-suitcase, - 'bell': $var-bell, - 'mug-saucer': $var-mug-saucer, - 'coffee': $var-coffee, - 'hospital': $var-hospital, - 'hospital-alt': $var-hospital-alt, - 'hospital-wide': $var-hospital-wide, - 'truck-medical': $var-truck-medical, - 'ambulance': $var-ambulance, - 'suitcase-medical': $var-suitcase-medical, - 'medkit': $var-medkit, - 'jet-fighter': $var-jet-fighter, - 'fighter-jet': $var-fighter-jet, - 'beer-mug-empty': $var-beer-mug-empty, - 'beer': $var-beer, - 'square-h': $var-square-h, - 'h-square': $var-h-square, - 'square-plus': $var-square-plus, - 'plus-square': $var-plus-square, - 'angles-left': $var-angles-left, - 'angle-double-left': $var-angle-double-left, - 'angles-right': $var-angles-right, - 'angle-double-right': $var-angle-double-right, - 'angles-up': $var-angles-up, - 'angle-double-up': $var-angle-double-up, - 'angles-down': $var-angles-down, - 'angle-double-down': $var-angle-double-down, - 'angle-left': $var-angle-left, - 'angle-right': $var-angle-right, - 'angle-up': $var-angle-up, - 'angle-down': $var-angle-down, - 'laptop': $var-laptop, - 'tablet-button': $var-tablet-button, - 'mobile-button': $var-mobile-button, - 'quote-left': $var-quote-left, - 'quote-left-alt': $var-quote-left-alt, - 'quote-right': $var-quote-right, - 'quote-right-alt': $var-quote-right-alt, - 'spinner': $var-spinner, - 'circle': $var-circle, - 'face-smile': $var-face-smile, - 'smile': $var-smile, - 'face-frown': $var-face-frown, - 'frown': $var-frown, - 'face-meh': $var-face-meh, - 'meh': $var-meh, - 'gamepad': $var-gamepad, - 'keyboard': $var-keyboard, - 'flag-checkered': $var-flag-checkered, - 'terminal': $var-terminal, - 'code': $var-code, - 'reply-all': $var-reply-all, - 'mail-reply-all': $var-mail-reply-all, - 'location-arrow': $var-location-arrow, - 'crop': $var-crop, - 'code-branch': $var-code-branch, - 'link-slash': $var-link-slash, - 'chain-broken': $var-chain-broken, - 'chain-slash': $var-chain-slash, - 'unlink': $var-unlink, - 'info': $var-info, - 'superscript': $var-superscript, - 'subscript': $var-subscript, - 'eraser': $var-eraser, - 'puzzle-piece': $var-puzzle-piece, - 'microphone': $var-microphone, - 'microphone-slash': $var-microphone-slash, - 'shield': $var-shield, - 'shield-blank': $var-shield-blank, - 'calendar': $var-calendar, - 'fire-extinguisher': $var-fire-extinguisher, - 'rocket': $var-rocket, - 'circle-chevron-left': $var-circle-chevron-left, - 'chevron-circle-left': $var-chevron-circle-left, - 'circle-chevron-right': $var-circle-chevron-right, - 'chevron-circle-right': $var-chevron-circle-right, - 'circle-chevron-up': $var-circle-chevron-up, - 'chevron-circle-up': $var-chevron-circle-up, - 'circle-chevron-down': $var-circle-chevron-down, - 'chevron-circle-down': $var-chevron-circle-down, - 'anchor': $var-anchor, - 'unlock-keyhole': $var-unlock-keyhole, - 'unlock-alt': $var-unlock-alt, - 'bullseye': $var-bullseye, - 'ellipsis': $var-ellipsis, - 'ellipsis-h': $var-ellipsis-h, - 'ellipsis-vertical': $var-ellipsis-vertical, - 'ellipsis-v': $var-ellipsis-v, - 'square-rss': $var-square-rss, - 'rss-square': $var-rss-square, - 'circle-play': $var-circle-play, - 'play-circle': $var-play-circle, - 'ticket': $var-ticket, - 'square-minus': $var-square-minus, - 'minus-square': $var-minus-square, - 'arrow-turn-up': $var-arrow-turn-up, - 'level-up': $var-level-up, - 'arrow-turn-down': $var-arrow-turn-down, - 'level-down': $var-level-down, - 'square-check': $var-square-check, - 'check-square': $var-check-square, - 'square-pen': $var-square-pen, - 'pen-square': $var-pen-square, - 'pencil-square': $var-pencil-square, - 'square-arrow-up-right': $var-square-arrow-up-right, - 'external-link-square': $var-external-link-square, - 'share-from-square': $var-share-from-square, - 'share-square': $var-share-square, - 'compass': $var-compass, - 'square-caret-down': $var-square-caret-down, - 'caret-square-down': $var-caret-square-down, - 'square-caret-up': $var-square-caret-up, - 'caret-square-up': $var-caret-square-up, - 'square-caret-right': $var-square-caret-right, - 'caret-square-right': $var-caret-square-right, - 'euro-sign': $var-euro-sign, - 'eur': $var-eur, - 'euro': $var-euro, - 'sterling-sign': $var-sterling-sign, - 'gbp': $var-gbp, - 'pound-sign': $var-pound-sign, - 'rupee-sign': $var-rupee-sign, - 'rupee': $var-rupee, - 'yen-sign': $var-yen-sign, - 'cny': $var-cny, - 'jpy': $var-jpy, - 'rmb': $var-rmb, - 'yen': $var-yen, - 'ruble-sign': $var-ruble-sign, - 'rouble': $var-rouble, - 'rub': $var-rub, - 'ruble': $var-ruble, - 'won-sign': $var-won-sign, - 'krw': $var-krw, - 'won': $var-won, - 'file': $var-file, - 'file-lines': $var-file-lines, - 'file-alt': $var-file-alt, - 'file-text': $var-file-text, - 'arrow-down-a-z': $var-arrow-down-a-z, - 'sort-alpha-asc': $var-sort-alpha-asc, - 'sort-alpha-down': $var-sort-alpha-down, - 'arrow-up-a-z': $var-arrow-up-a-z, - 'sort-alpha-up': $var-sort-alpha-up, - 'arrow-down-wide-short': $var-arrow-down-wide-short, - 'sort-amount-asc': $var-sort-amount-asc, - 'sort-amount-down': $var-sort-amount-down, - 'arrow-up-wide-short': $var-arrow-up-wide-short, - 'sort-amount-up': $var-sort-amount-up, - 'arrow-down-1-9': $var-arrow-down-1-9, - 'sort-numeric-asc': $var-sort-numeric-asc, - 'sort-numeric-down': $var-sort-numeric-down, - 'arrow-up-1-9': $var-arrow-up-1-9, - 'sort-numeric-up': $var-sort-numeric-up, - 'thumbs-up': $var-thumbs-up, - 'thumbs-down': $var-thumbs-down, - 'arrow-down-long': $var-arrow-down-long, - 'long-arrow-down': $var-long-arrow-down, - 'arrow-up-long': $var-arrow-up-long, - 'long-arrow-up': $var-long-arrow-up, - 'arrow-left-long': $var-arrow-left-long, - 'long-arrow-left': $var-long-arrow-left, - 'arrow-right-long': $var-arrow-right-long, - 'long-arrow-right': $var-long-arrow-right, - 'person-dress': $var-person-dress, - 'female': $var-female, - 'person': $var-person, - 'male': $var-male, - 'sun': $var-sun, - 'moon': $var-moon, - 'box-archive': $var-box-archive, - 'archive': $var-archive, - 'bug': $var-bug, - 'square-caret-left': $var-square-caret-left, - 'caret-square-left': $var-caret-square-left, - 'circle-dot': $var-circle-dot, - 'dot-circle': $var-dot-circle, - 'wheelchair': $var-wheelchair, - 'lira-sign': $var-lira-sign, - 'shuttle-space': $var-shuttle-space, - 'space-shuttle': $var-space-shuttle, - 'square-envelope': $var-square-envelope, - 'envelope-square': $var-envelope-square, - 'building-columns': $var-building-columns, - 'bank': $var-bank, - 'institution': $var-institution, - 'museum': $var-museum, - 'university': $var-university, - 'graduation-cap': $var-graduation-cap, - 'mortar-board': $var-mortar-board, - 'language': $var-language, - 'fax': $var-fax, - 'building': $var-building, - 'child': $var-child, - 'paw': $var-paw, - 'cube': $var-cube, - 'cubes': $var-cubes, - 'recycle': $var-recycle, - 'car': $var-car, - 'automobile': $var-automobile, - 'taxi': $var-taxi, - 'cab': $var-cab, - 'tree': $var-tree, - 'database': $var-database, - 'file-pdf': $var-file-pdf, - 'file-word': $var-file-word, - 'file-excel': $var-file-excel, - 'file-powerpoint': $var-file-powerpoint, - 'file-image': $var-file-image, - 'file-zipper': $var-file-zipper, - 'file-archive': $var-file-archive, - 'file-audio': $var-file-audio, - 'file-video': $var-file-video, - 'file-code': $var-file-code, - 'life-ring': $var-life-ring, - 'circle-notch': $var-circle-notch, - 'paper-plane': $var-paper-plane, - 'clock-rotate-left': $var-clock-rotate-left, - 'history': $var-history, - 'heading': $var-heading, - 'header': $var-header, - 'paragraph': $var-paragraph, - 'sliders': $var-sliders, - 'sliders-h': $var-sliders-h, - 'share-nodes': $var-share-nodes, - 'share-alt': $var-share-alt, - 'square-share-nodes': $var-square-share-nodes, - 'share-alt-square': $var-share-alt-square, - 'bomb': $var-bomb, - 'futbol': $var-futbol, - 'futbol-ball': $var-futbol-ball, - 'soccer-ball': $var-soccer-ball, - 'tty': $var-tty, - 'teletype': $var-teletype, - 'binoculars': $var-binoculars, - 'plug': $var-plug, - 'newspaper': $var-newspaper, - 'wifi': $var-wifi, - 'wifi-3': $var-wifi-3, - 'wifi-strong': $var-wifi-strong, - 'calculator': $var-calculator, - 'bell-slash': $var-bell-slash, - 'trash': $var-trash, - 'copyright': $var-copyright, - 'eye-dropper': $var-eye-dropper, - 'eye-dropper-empty': $var-eye-dropper-empty, - 'eyedropper': $var-eyedropper, - 'paintbrush': $var-paintbrush, - 'paint-brush': $var-paint-brush, - 'cake-candles': $var-cake-candles, - 'birthday-cake': $var-birthday-cake, - 'cake': $var-cake, - 'chart-area': $var-chart-area, - 'area-chart': $var-area-chart, - 'chart-pie': $var-chart-pie, - 'pie-chart': $var-pie-chart, - 'chart-line': $var-chart-line, - 'line-chart': $var-line-chart, - 'toggle-off': $var-toggle-off, - 'toggle-on': $var-toggle-on, - 'bicycle': $var-bicycle, - 'bus': $var-bus, - 'closed-captioning': $var-closed-captioning, - 'shekel-sign': $var-shekel-sign, - 'ils': $var-ils, - 'shekel': $var-shekel, - 'sheqel': $var-sheqel, - 'sheqel-sign': $var-sheqel-sign, - 'cart-plus': $var-cart-plus, - 'cart-arrow-down': $var-cart-arrow-down, - 'diamond': $var-diamond, - 'ship': $var-ship, - 'user-secret': $var-user-secret, - 'motorcycle': $var-motorcycle, - 'street-view': $var-street-view, - 'heart-pulse': $var-heart-pulse, - 'heartbeat': $var-heartbeat, - 'venus': $var-venus, - 'mars': $var-mars, - 'mercury': $var-mercury, - 'mars-and-venus': $var-mars-and-venus, - 'transgender': $var-transgender, - 'transgender-alt': $var-transgender-alt, - 'venus-double': $var-venus-double, - 'mars-double': $var-mars-double, - 'venus-mars': $var-venus-mars, - 'mars-stroke': $var-mars-stroke, - 'mars-stroke-up': $var-mars-stroke-up, - 'mars-stroke-v': $var-mars-stroke-v, - 'mars-stroke-right': $var-mars-stroke-right, - 'mars-stroke-h': $var-mars-stroke-h, - 'neuter': $var-neuter, - 'genderless': $var-genderless, - 'server': $var-server, - 'user-plus': $var-user-plus, - 'user-xmark': $var-user-xmark, - 'user-times': $var-user-times, - 'bed': $var-bed, - 'train': $var-train, - 'train-subway': $var-train-subway, - 'subway': $var-subway, - 'battery-full': $var-battery-full, - 'battery': $var-battery, - 'battery-5': $var-battery-5, - 'battery-three-quarters': $var-battery-three-quarters, - 'battery-4': $var-battery-4, - 'battery-half': $var-battery-half, - 'battery-3': $var-battery-3, - 'battery-quarter': $var-battery-quarter, - 'battery-2': $var-battery-2, - 'battery-empty': $var-battery-empty, - 'battery-0': $var-battery-0, - 'arrow-pointer': $var-arrow-pointer, - 'mouse-pointer': $var-mouse-pointer, - 'i-cursor': $var-i-cursor, - 'object-group': $var-object-group, - 'object-ungroup': $var-object-ungroup, - 'note-sticky': $var-note-sticky, - 'sticky-note': $var-sticky-note, - 'clone': $var-clone, - 'scale-balanced': $var-scale-balanced, - 'balance-scale': $var-balance-scale, - 'hourglass-start': $var-hourglass-start, - 'hourglass-1': $var-hourglass-1, - 'hourglass-half': $var-hourglass-half, - 'hourglass-2': $var-hourglass-2, - 'hourglass-end': $var-hourglass-end, - 'hourglass-3': $var-hourglass-3, - 'hourglass': $var-hourglass, - 'hourglass-empty': $var-hourglass-empty, - 'hand-back-fist': $var-hand-back-fist, - 'hand-rock': $var-hand-rock, - 'hand': $var-hand, - 'hand-paper': $var-hand-paper, - 'hand-scissors': $var-hand-scissors, - 'hand-lizard': $var-hand-lizard, - 'hand-spock': $var-hand-spock, - 'hand-pointer': $var-hand-pointer, - 'hand-peace': $var-hand-peace, - 'trademark': $var-trademark, - 'registered': $var-registered, - 'tv': $var-tv, - 'television': $var-television, - 'tv-alt': $var-tv-alt, - 'calendar-plus': $var-calendar-plus, - 'calendar-minus': $var-calendar-minus, - 'calendar-xmark': $var-calendar-xmark, - 'calendar-times': $var-calendar-times, - 'calendar-check': $var-calendar-check, - 'industry': $var-industry, - 'map-pin': $var-map-pin, - 'signs-post': $var-signs-post, - 'map-signs': $var-map-signs, - 'map': $var-map, - 'message': $var-message, - 'comment-alt': $var-comment-alt, - 'circle-pause': $var-circle-pause, - 'pause-circle': $var-pause-circle, - 'circle-stop': $var-circle-stop, - 'stop-circle': $var-stop-circle, - 'bag-shopping': $var-bag-shopping, - 'shopping-bag': $var-shopping-bag, - 'basket-shopping': $var-basket-shopping, - 'shopping-basket': $var-shopping-basket, - 'universal-access': $var-universal-access, - 'person-walking-with-cane': $var-person-walking-with-cane, - 'blind': $var-blind, - 'audio-description': $var-audio-description, - 'phone-volume': $var-phone-volume, - 'volume-control-phone': $var-volume-control-phone, - 'braille': $var-braille, - 'ear-listen': $var-ear-listen, - 'assistive-listening-systems': $var-assistive-listening-systems, - 'hands-asl-interpreting': $var-hands-asl-interpreting, - 'american-sign-language-interpreting': - $var-american-sign-language-interpreting, - 'asl-interpreting': $var-asl-interpreting, - 'hands-american-sign-language-interpreting': - $var-hands-american-sign-language-interpreting, - 'ear-deaf': $var-ear-deaf, - 'deaf': $var-deaf, - 'deafness': $var-deafness, - 'hard-of-hearing': $var-hard-of-hearing, - 'hands': $var-hands, - 'sign-language': $var-sign-language, - 'signing': $var-signing, - 'eye-low-vision': $var-eye-low-vision, - 'low-vision': $var-low-vision, - 'font-awesome': $var-font-awesome, - 'font-awesome-flag': $var-font-awesome-flag, - 'font-awesome-logo-full': $var-font-awesome-logo-full, - 'handshake': $var-handshake, - 'handshake-alt': $var-handshake-alt, - 'handshake-simple': $var-handshake-simple, - 'envelope-open': $var-envelope-open, - 'address-book': $var-address-book, - 'contact-book': $var-contact-book, - 'address-card': $var-address-card, - 'contact-card': $var-contact-card, - 'vcard': $var-vcard, - 'circle-user': $var-circle-user, - 'user-circle': $var-user-circle, - 'id-badge': $var-id-badge, - 'id-card': $var-id-card, - 'drivers-license': $var-drivers-license, - 'temperature-full': $var-temperature-full, - 'temperature-4': $var-temperature-4, - 'thermometer-4': $var-thermometer-4, - 'thermometer-full': $var-thermometer-full, - 'temperature-three-quarters': $var-temperature-three-quarters, - 'temperature-3': $var-temperature-3, - 'thermometer-3': $var-thermometer-3, - 'thermometer-three-quarters': $var-thermometer-three-quarters, - 'temperature-half': $var-temperature-half, - 'temperature-2': $var-temperature-2, - 'thermometer-2': $var-thermometer-2, - 'thermometer-half': $var-thermometer-half, - 'temperature-quarter': $var-temperature-quarter, - 'temperature-1': $var-temperature-1, - 'thermometer-1': $var-thermometer-1, - 'thermometer-quarter': $var-thermometer-quarter, - 'temperature-empty': $var-temperature-empty, - 'temperature-0': $var-temperature-0, - 'thermometer-0': $var-thermometer-0, - 'thermometer-empty': $var-thermometer-empty, - 'shower': $var-shower, - 'bath': $var-bath, - 'bathtub': $var-bathtub, - 'podcast': $var-podcast, - 'window-maximize': $var-window-maximize, - 'window-minimize': $var-window-minimize, - 'window-restore': $var-window-restore, - 'square-xmark': $var-square-xmark, - 'times-square': $var-times-square, - 'xmark-square': $var-xmark-square, - 'microchip': $var-microchip, - 'snowflake': $var-snowflake, - 'spoon': $var-spoon, - 'utensil-spoon': $var-utensil-spoon, - 'utensils': $var-utensils, - 'cutlery': $var-cutlery, - 'rotate-left': $var-rotate-left, - 'rotate-back': $var-rotate-back, - 'rotate-backward': $var-rotate-backward, - 'undo-alt': $var-undo-alt, - 'trash-can': $var-trash-can, - 'trash-alt': $var-trash-alt, - 'rotate': $var-rotate, - 'sync-alt': $var-sync-alt, - 'stopwatch': $var-stopwatch, - 'right-from-bracket': $var-right-from-bracket, - 'sign-out-alt': $var-sign-out-alt, - 'right-to-bracket': $var-right-to-bracket, - 'sign-in-alt': $var-sign-in-alt, - 'rotate-right': $var-rotate-right, - 'redo-alt': $var-redo-alt, - 'rotate-forward': $var-rotate-forward, - 'poo': $var-poo, - 'images': $var-images, - 'pencil': $var-pencil, - 'pencil-alt': $var-pencil-alt, - 'pen': $var-pen, - 'pen-clip': $var-pen-clip, - 'pen-alt': $var-pen-alt, - 'octagon': $var-octagon, - 'down-long': $var-down-long, - 'long-arrow-alt-down': $var-long-arrow-alt-down, - 'left-long': $var-left-long, - 'long-arrow-alt-left': $var-long-arrow-alt-left, - 'right-long': $var-right-long, - 'long-arrow-alt-right': $var-long-arrow-alt-right, - 'up-long': $var-up-long, - 'long-arrow-alt-up': $var-long-arrow-alt-up, - 'hexagon': $var-hexagon, - 'file-pen': $var-file-pen, - 'file-edit': $var-file-edit, - 'maximize': $var-maximize, - 'expand-arrows-alt': $var-expand-arrows-alt, - 'clipboard': $var-clipboard, - 'left-right': $var-left-right, - 'arrows-alt-h': $var-arrows-alt-h, - 'up-down': $var-up-down, - 'arrows-alt-v': $var-arrows-alt-v, - 'alarm-clock': $var-alarm-clock, - 'circle-down': $var-circle-down, - 'arrow-alt-circle-down': $var-arrow-alt-circle-down, - 'circle-left': $var-circle-left, - 'arrow-alt-circle-left': $var-arrow-alt-circle-left, - 'circle-right': $var-circle-right, - 'arrow-alt-circle-right': $var-arrow-alt-circle-right, - 'circle-up': $var-circle-up, - 'arrow-alt-circle-up': $var-arrow-alt-circle-up, - 'up-right-from-square': $var-up-right-from-square, - 'external-link-alt': $var-external-link-alt, - 'square-up-right': $var-square-up-right, - 'external-link-square-alt': $var-external-link-square-alt, - 'right-left': $var-right-left, - 'exchange-alt': $var-exchange-alt, - 'repeat': $var-repeat, - 'code-commit': $var-code-commit, - 'code-merge': $var-code-merge, - 'desktop': $var-desktop, - 'desktop-alt': $var-desktop-alt, - 'gem': $var-gem, - 'turn-down': $var-turn-down, - 'level-down-alt': $var-level-down-alt, - 'turn-up': $var-turn-up, - 'level-up-alt': $var-level-up-alt, - 'lock-open': $var-lock-open, - 'location-dot': $var-location-dot, - 'map-marker-alt': $var-map-marker-alt, - 'microphone-lines': $var-microphone-lines, - 'microphone-alt': $var-microphone-alt, - 'mobile-screen-button': $var-mobile-screen-button, - 'mobile-alt': $var-mobile-alt, - 'mobile': $var-mobile, - 'mobile-android': $var-mobile-android, - 'mobile-phone': $var-mobile-phone, - 'mobile-screen': $var-mobile-screen, - 'mobile-android-alt': $var-mobile-android-alt, - 'money-bill-1': $var-money-bill-1, - 'money-bill-alt': $var-money-bill-alt, - 'phone-slash': $var-phone-slash, - 'image-portrait': $var-image-portrait, - 'portrait': $var-portrait, - 'reply': $var-reply, - 'mail-reply': $var-mail-reply, - 'shield-halved': $var-shield-halved, - 'shield-alt': $var-shield-alt, - 'tablet-screen-button': $var-tablet-screen-button, - 'tablet-alt': $var-tablet-alt, - 'tablet': $var-tablet, - 'tablet-android': $var-tablet-android, - 'ticket-simple': $var-ticket-simple, - 'ticket-alt': $var-ticket-alt, - 'rectangle-xmark': $var-rectangle-xmark, - 'rectangle-times': $var-rectangle-times, - 'times-rectangle': $var-times-rectangle, - 'window-close': $var-window-close, - 'down-left-and-up-right-to-center': $var-down-left-and-up-right-to-center, - 'compress-alt': $var-compress-alt, - 'up-right-and-down-left-from-center': $var-up-right-and-down-left-from-center, - 'expand-alt': $var-expand-alt, - 'baseball-bat-ball': $var-baseball-bat-ball, - 'baseball': $var-baseball, - 'baseball-ball': $var-baseball-ball, - 'basketball': $var-basketball, - 'basketball-ball': $var-basketball-ball, - 'bowling-ball': $var-bowling-ball, - 'chess': $var-chess, - 'chess-bishop': $var-chess-bishop, - 'chess-board': $var-chess-board, - 'chess-king': $var-chess-king, - 'chess-knight': $var-chess-knight, - 'chess-pawn': $var-chess-pawn, - 'chess-queen': $var-chess-queen, - 'chess-rook': $var-chess-rook, - 'dumbbell': $var-dumbbell, - 'football': $var-football, - 'football-ball': $var-football-ball, - 'golf-ball-tee': $var-golf-ball-tee, - 'golf-ball': $var-golf-ball, - 'hockey-puck': $var-hockey-puck, - 'broom-ball': $var-broom-ball, - 'quidditch': $var-quidditch, - 'quidditch-broom-ball': $var-quidditch-broom-ball, - 'square-full': $var-square-full, - 'table-tennis-paddle-ball': $var-table-tennis-paddle-ball, - 'ping-pong-paddle-ball': $var-ping-pong-paddle-ball, - 'table-tennis': $var-table-tennis, - 'volleyball': $var-volleyball, - 'volleyball-ball': $var-volleyball-ball, - 'hand-dots': $var-hand-dots, - 'allergies': $var-allergies, - 'bandage': $var-bandage, - 'band-aid': $var-band-aid, - 'box': $var-box, - 'boxes-stacked': $var-boxes-stacked, - 'boxes': $var-boxes, - 'boxes-alt': $var-boxes-alt, - 'briefcase-medical': $var-briefcase-medical, - 'fire-flame-simple': $var-fire-flame-simple, - 'burn': $var-burn, - 'capsules': $var-capsules, - 'clipboard-check': $var-clipboard-check, - 'clipboard-list': $var-clipboard-list, - 'person-dots-from-line': $var-person-dots-from-line, - 'diagnoses': $var-diagnoses, - 'dna': $var-dna, - 'dolly': $var-dolly, - 'dolly-box': $var-dolly-box, - 'cart-flatbed': $var-cart-flatbed, - 'dolly-flatbed': $var-dolly-flatbed, - 'file-medical': $var-file-medical, - 'file-waveform': $var-file-waveform, - 'file-medical-alt': $var-file-medical-alt, - 'kit-medical': $var-kit-medical, - 'first-aid': $var-first-aid, - 'circle-h': $var-circle-h, - 'hospital-symbol': $var-hospital-symbol, - 'id-card-clip': $var-id-card-clip, - 'id-card-alt': $var-id-card-alt, - 'notes-medical': $var-notes-medical, - 'pallet': $var-pallet, - 'pills': $var-pills, - 'prescription-bottle': $var-prescription-bottle, - 'prescription-bottle-medical': $var-prescription-bottle-medical, - 'prescription-bottle-alt': $var-prescription-bottle-alt, - 'bed-pulse': $var-bed-pulse, - 'procedures': $var-procedures, - 'truck-fast': $var-truck-fast, - 'shipping-fast': $var-shipping-fast, - 'smoking': $var-smoking, - 'syringe': $var-syringe, - 'tablets': $var-tablets, - 'thermometer': $var-thermometer, - 'vial': $var-vial, - 'vials': $var-vials, - 'warehouse': $var-warehouse, - 'weight-scale': $var-weight-scale, - 'weight': $var-weight, - 'x-ray': $var-x-ray, - 'box-open': $var-box-open, - 'comment-dots': $var-comment-dots, - 'commenting': $var-commenting, - 'comment-slash': $var-comment-slash, - 'couch': $var-couch, - 'circle-dollar-to-slot': $var-circle-dollar-to-slot, - 'donate': $var-donate, - 'dove': $var-dove, - 'hand-holding': $var-hand-holding, - 'hand-holding-heart': $var-hand-holding-heart, - 'hand-holding-dollar': $var-hand-holding-dollar, - 'hand-holding-usd': $var-hand-holding-usd, - 'hand-holding-droplet': $var-hand-holding-droplet, - 'hand-holding-water': $var-hand-holding-water, - 'hands-holding': $var-hands-holding, - 'handshake-angle': $var-handshake-angle, - 'hands-helping': $var-hands-helping, - 'parachute-box': $var-parachute-box, - 'people-carry-box': $var-people-carry-box, - 'people-carry': $var-people-carry, - 'piggy-bank': $var-piggy-bank, - 'ribbon': $var-ribbon, - 'route': $var-route, - 'seedling': $var-seedling, - 'sprout': $var-sprout, - 'sign-hanging': $var-sign-hanging, - 'sign': $var-sign, - 'face-smile-wink': $var-face-smile-wink, - 'smile-wink': $var-smile-wink, - 'tape': $var-tape, - 'truck-ramp-box': $var-truck-ramp-box, - 'truck-loading': $var-truck-loading, - 'truck-moving': $var-truck-moving, - 'video-slash': $var-video-slash, - 'wine-glass': $var-wine-glass, - 'user-astronaut': $var-user-astronaut, - 'user-check': $var-user-check, - 'user-clock': $var-user-clock, - 'user-gear': $var-user-gear, - 'user-cog': $var-user-cog, - 'user-pen': $var-user-pen, - 'user-edit': $var-user-edit, - 'user-group': $var-user-group, - 'user-friends': $var-user-friends, - 'user-graduate': $var-user-graduate, - 'user-lock': $var-user-lock, - 'user-minus': $var-user-minus, - 'user-ninja': $var-user-ninja, - 'user-shield': $var-user-shield, - 'user-slash': $var-user-slash, - 'user-alt-slash': $var-user-alt-slash, - 'user-large-slash': $var-user-large-slash, - 'user-tag': $var-user-tag, - 'user-tie': $var-user-tie, - 'users-gear': $var-users-gear, - 'users-cog': $var-users-cog, - 'scale-unbalanced': $var-scale-unbalanced, - 'balance-scale-left': $var-balance-scale-left, - 'scale-unbalanced-flip': $var-scale-unbalanced-flip, - 'balance-scale-right': $var-balance-scale-right, - 'blender': $var-blender, - 'book-open': $var-book-open, - 'tower-broadcast': $var-tower-broadcast, - 'broadcast-tower': $var-broadcast-tower, - 'broom': $var-broom, - 'chalkboard': $var-chalkboard, - 'blackboard': $var-blackboard, - 'chalkboard-user': $var-chalkboard-user, - 'chalkboard-teacher': $var-chalkboard-teacher, - 'church': $var-church, - 'coins': $var-coins, - 'compact-disc': $var-compact-disc, - 'crow': $var-crow, - 'crown': $var-crown, - 'dice': $var-dice, - 'dice-five': $var-dice-five, - 'dice-four': $var-dice-four, - 'dice-one': $var-dice-one, - 'dice-six': $var-dice-six, - 'dice-three': $var-dice-three, - 'dice-two': $var-dice-two, - 'divide': $var-divide, - 'door-closed': $var-door-closed, - 'door-open': $var-door-open, - 'feather': $var-feather, - 'frog': $var-frog, - 'gas-pump': $var-gas-pump, - 'glasses': $var-glasses, - 'greater-than-equal': $var-greater-than-equal, - 'helicopter': $var-helicopter, - 'infinity': $var-infinity, - 'kiwi-bird': $var-kiwi-bird, - 'less-than-equal': $var-less-than-equal, - 'memory': $var-memory, - 'microphone-lines-slash': $var-microphone-lines-slash, - 'microphone-alt-slash': $var-microphone-alt-slash, - 'money-bill-wave': $var-money-bill-wave, - 'money-bill-1-wave': $var-money-bill-1-wave, - 'money-bill-wave-alt': $var-money-bill-wave-alt, - 'money-check': $var-money-check, - 'money-check-dollar': $var-money-check-dollar, - 'money-check-alt': $var-money-check-alt, - 'not-equal': $var-not-equal, - 'palette': $var-palette, - 'square-parking': $var-square-parking, - 'parking': $var-parking, - 'diagram-project': $var-diagram-project, - 'project-diagram': $var-project-diagram, - 'receipt': $var-receipt, - 'robot': $var-robot, - 'ruler': $var-ruler, - 'ruler-combined': $var-ruler-combined, - 'ruler-horizontal': $var-ruler-horizontal, - 'ruler-vertical': $var-ruler-vertical, - 'school': $var-school, - 'screwdriver': $var-screwdriver, - 'shoe-prints': $var-shoe-prints, - 'skull': $var-skull, - 'ban-smoking': $var-ban-smoking, - 'smoking-ban': $var-smoking-ban, - 'store': $var-store, - 'shop': $var-shop, - 'store-alt': $var-store-alt, - 'bars-staggered': $var-bars-staggered, - 'reorder': $var-reorder, - 'stream': $var-stream, - 'stroopwafel': $var-stroopwafel, - 'toolbox': $var-toolbox, - 'shirt': $var-shirt, - 't-shirt': $var-t-shirt, - 'tshirt': $var-tshirt, - 'person-walking': $var-person-walking, - 'walking': $var-walking, - 'wallet': $var-wallet, - 'face-angry': $var-face-angry, - 'angry': $var-angry, - 'archway': $var-archway, - 'book-atlas': $var-book-atlas, - 'atlas': $var-atlas, - 'award': $var-award, - 'delete-left': $var-delete-left, - 'backspace': $var-backspace, - 'bezier-curve': $var-bezier-curve, - 'bong': $var-bong, - 'brush': $var-brush, - 'bus-simple': $var-bus-simple, - 'bus-alt': $var-bus-alt, - 'cannabis': $var-cannabis, - 'check-double': $var-check-double, - 'martini-glass-citrus': $var-martini-glass-citrus, - 'cocktail': $var-cocktail, - 'bell-concierge': $var-bell-concierge, - 'concierge-bell': $var-concierge-bell, - 'cookie': $var-cookie, - 'cookie-bite': $var-cookie-bite, - 'crop-simple': $var-crop-simple, - 'crop-alt': $var-crop-alt, - 'tachograph-digital': $var-tachograph-digital, - 'digital-tachograph': $var-digital-tachograph, - 'face-dizzy': $var-face-dizzy, - 'dizzy': $var-dizzy, - 'compass-drafting': $var-compass-drafting, - 'drafting-compass': $var-drafting-compass, - 'drum': $var-drum, - 'drum-steelpan': $var-drum-steelpan, - 'feather-pointed': $var-feather-pointed, - 'feather-alt': $var-feather-alt, - 'file-contract': $var-file-contract, - 'file-arrow-down': $var-file-arrow-down, - 'file-download': $var-file-download, - 'file-export': $var-file-export, - 'arrow-right-from-file': $var-arrow-right-from-file, - 'file-import': $var-file-import, - 'arrow-right-to-file': $var-arrow-right-to-file, - 'file-invoice': $var-file-invoice, - 'file-invoice-dollar': $var-file-invoice-dollar, - 'file-prescription': $var-file-prescription, - 'file-signature': $var-file-signature, - 'file-arrow-up': $var-file-arrow-up, - 'file-upload': $var-file-upload, - 'fill': $var-fill, - 'fill-drip': $var-fill-drip, - 'fingerprint': $var-fingerprint, - 'fish': $var-fish, - 'face-flushed': $var-face-flushed, - 'flushed': $var-flushed, - 'face-frown-open': $var-face-frown-open, - 'frown-open': $var-frown-open, - 'martini-glass': $var-martini-glass, - 'glass-martini-alt': $var-glass-martini-alt, - 'earth-africa': $var-earth-africa, - 'globe-africa': $var-globe-africa, - 'earth-americas': $var-earth-americas, - 'earth': $var-earth, - 'earth-america': $var-earth-america, - 'globe-americas': $var-globe-americas, - 'earth-asia': $var-earth-asia, - 'globe-asia': $var-globe-asia, - 'face-grimace': $var-face-grimace, - 'grimace': $var-grimace, - 'face-grin': $var-face-grin, - 'grin': $var-grin, - 'face-grin-wide': $var-face-grin-wide, - 'grin-alt': $var-grin-alt, - 'face-grin-beam': $var-face-grin-beam, - 'grin-beam': $var-grin-beam, - 'face-grin-beam-sweat': $var-face-grin-beam-sweat, - 'grin-beam-sweat': $var-grin-beam-sweat, - 'face-grin-hearts': $var-face-grin-hearts, - 'grin-hearts': $var-grin-hearts, - 'face-grin-squint': $var-face-grin-squint, - 'grin-squint': $var-grin-squint, - 'face-grin-squint-tears': $var-face-grin-squint-tears, - 'grin-squint-tears': $var-grin-squint-tears, - 'face-grin-stars': $var-face-grin-stars, - 'grin-stars': $var-grin-stars, - 'face-grin-tears': $var-face-grin-tears, - 'grin-tears': $var-grin-tears, - 'face-grin-tongue': $var-face-grin-tongue, - 'grin-tongue': $var-grin-tongue, - 'face-grin-tongue-squint': $var-face-grin-tongue-squint, - 'grin-tongue-squint': $var-grin-tongue-squint, - 'face-grin-tongue-wink': $var-face-grin-tongue-wink, - 'grin-tongue-wink': $var-grin-tongue-wink, - 'face-grin-wink': $var-face-grin-wink, - 'grin-wink': $var-grin-wink, - 'grip': $var-grip, - 'grid-horizontal': $var-grid-horizontal, - 'grip-horizontal': $var-grip-horizontal, - 'grip-vertical': $var-grip-vertical, - 'grid-vertical': $var-grid-vertical, - 'headset': $var-headset, - 'highlighter': $var-highlighter, - 'hot-tub-person': $var-hot-tub-person, - 'hot-tub': $var-hot-tub, - 'hotel': $var-hotel, - 'joint': $var-joint, - 'face-kiss': $var-face-kiss, - 'kiss': $var-kiss, - 'face-kiss-beam': $var-face-kiss-beam, - 'kiss-beam': $var-kiss-beam, - 'face-kiss-wink-heart': $var-face-kiss-wink-heart, - 'kiss-wink-heart': $var-kiss-wink-heart, - 'face-laugh': $var-face-laugh, - 'laugh': $var-laugh, - 'face-laugh-beam': $var-face-laugh-beam, - 'laugh-beam': $var-laugh-beam, - 'face-laugh-squint': $var-face-laugh-squint, - 'laugh-squint': $var-laugh-squint, - 'face-laugh-wink': $var-face-laugh-wink, - 'laugh-wink': $var-laugh-wink, - 'cart-flatbed-suitcase': $var-cart-flatbed-suitcase, - 'luggage-cart': $var-luggage-cart, - 'map-location': $var-map-location, - 'map-marked': $var-map-marked, - 'map-location-dot': $var-map-location-dot, - 'map-marked-alt': $var-map-marked-alt, - 'marker': $var-marker, - 'medal': $var-medal, - 'face-meh-blank': $var-face-meh-blank, - 'meh-blank': $var-meh-blank, - 'face-rolling-eyes': $var-face-rolling-eyes, - 'meh-rolling-eyes': $var-meh-rolling-eyes, - 'monument': $var-monument, - 'mortar-pestle': $var-mortar-pestle, - 'paint-roller': $var-paint-roller, - 'passport': $var-passport, - 'pen-fancy': $var-pen-fancy, - 'pen-nib': $var-pen-nib, - 'pen-ruler': $var-pen-ruler, - 'pencil-ruler': $var-pencil-ruler, - 'plane-arrival': $var-plane-arrival, - 'plane-departure': $var-plane-departure, - 'prescription': $var-prescription, - 'face-sad-cry': $var-face-sad-cry, - 'sad-cry': $var-sad-cry, - 'face-sad-tear': $var-face-sad-tear, - 'sad-tear': $var-sad-tear, - 'van-shuttle': $var-van-shuttle, - 'shuttle-van': $var-shuttle-van, - 'signature': $var-signature, - 'face-smile-beam': $var-face-smile-beam, - 'smile-beam': $var-smile-beam, - 'solar-panel': $var-solar-panel, - 'spa': $var-spa, - 'splotch': $var-splotch, - 'spray-can': $var-spray-can, - 'stamp': $var-stamp, - 'star-half-stroke': $var-star-half-stroke, - 'star-half-alt': $var-star-half-alt, - 'suitcase-rolling': $var-suitcase-rolling, - 'face-surprise': $var-face-surprise, - 'surprise': $var-surprise, - 'swatchbook': $var-swatchbook, - 'person-swimming': $var-person-swimming, - 'swimmer': $var-swimmer, - 'water-ladder': $var-water-ladder, - 'ladder-water': $var-ladder-water, - 'swimming-pool': $var-swimming-pool, - 'droplet-slash': $var-droplet-slash, - 'tint-slash': $var-tint-slash, - 'face-tired': $var-face-tired, - 'tired': $var-tired, - 'tooth': $var-tooth, - 'umbrella-beach': $var-umbrella-beach, - 'weight-hanging': $var-weight-hanging, - 'wine-glass-empty': $var-wine-glass-empty, - 'wine-glass-alt': $var-wine-glass-alt, - 'spray-can-sparkles': $var-spray-can-sparkles, - 'air-freshener': $var-air-freshener, - 'apple-whole': $var-apple-whole, - 'apple-alt': $var-apple-alt, - 'atom': $var-atom, - 'bone': $var-bone, - 'book-open-reader': $var-book-open-reader, - 'book-reader': $var-book-reader, - 'brain': $var-brain, - 'car-rear': $var-car-rear, - 'car-alt': $var-car-alt, - 'car-battery': $var-car-battery, - 'battery-car': $var-battery-car, - 'car-burst': $var-car-burst, - 'car-crash': $var-car-crash, - 'car-side': $var-car-side, - 'charging-station': $var-charging-station, - 'diamond-turn-right': $var-diamond-turn-right, - 'directions': $var-directions, - 'draw-polygon': $var-draw-polygon, - 'vector-polygon': $var-vector-polygon, - 'laptop-code': $var-laptop-code, - 'layer-group': $var-layer-group, - 'location-crosshairs': $var-location-crosshairs, - 'location': $var-location, - 'lungs': $var-lungs, - 'microscope': $var-microscope, - 'oil-can': $var-oil-can, - 'poop': $var-poop, - 'shapes': $var-shapes, - 'triangle-circle-square': $var-triangle-circle-square, - 'star-of-life': $var-star-of-life, - 'gauge': $var-gauge, - 'dashboard': $var-dashboard, - 'gauge-med': $var-gauge-med, - 'tachometer-alt-average': $var-tachometer-alt-average, - 'gauge-high': $var-gauge-high, - 'tachometer-alt': $var-tachometer-alt, - 'tachometer-alt-fast': $var-tachometer-alt-fast, - 'gauge-simple': $var-gauge-simple, - 'gauge-simple-med': $var-gauge-simple-med, - 'tachometer-average': $var-tachometer-average, - 'gauge-simple-high': $var-gauge-simple-high, - 'tachometer': $var-tachometer, - 'tachometer-fast': $var-tachometer-fast, - 'teeth': $var-teeth, - 'teeth-open': $var-teeth-open, - 'masks-theater': $var-masks-theater, - 'theater-masks': $var-theater-masks, - 'traffic-light': $var-traffic-light, - 'truck-monster': $var-truck-monster, - 'truck-pickup': $var-truck-pickup, - 'rectangle-ad': $var-rectangle-ad, - 'ad': $var-ad, - 'ankh': $var-ankh, - 'book-bible': $var-book-bible, - 'bible': $var-bible, - 'business-time': $var-business-time, - 'briefcase-clock': $var-briefcase-clock, - 'city': $var-city, - 'comment-dollar': $var-comment-dollar, - 'comments-dollar': $var-comments-dollar, - 'cross': $var-cross, - 'dharmachakra': $var-dharmachakra, - 'envelope-open-text': $var-envelope-open-text, - 'folder-minus': $var-folder-minus, - 'folder-plus': $var-folder-plus, - 'filter-circle-dollar': $var-filter-circle-dollar, - 'funnel-dollar': $var-funnel-dollar, - 'gopuram': $var-gopuram, - 'hamsa': $var-hamsa, - 'bahai': $var-bahai, - 'haykal': $var-haykal, - 'jedi': $var-jedi, - 'book-journal-whills': $var-book-journal-whills, - 'journal-whills': $var-journal-whills, - 'kaaba': $var-kaaba, - 'khanda': $var-khanda, - 'landmark': $var-landmark, - 'envelopes-bulk': $var-envelopes-bulk, - 'mail-bulk': $var-mail-bulk, - 'menorah': $var-menorah, - 'mosque': $var-mosque, - 'om': $var-om, - 'spaghetti-monster-flying': $var-spaghetti-monster-flying, - 'pastafarianism': $var-pastafarianism, - 'peace': $var-peace, - 'place-of-worship': $var-place-of-worship, - 'square-poll-vertical': $var-square-poll-vertical, - 'poll': $var-poll, - 'square-poll-horizontal': $var-square-poll-horizontal, - 'poll-h': $var-poll-h, - 'person-praying': $var-person-praying, - 'pray': $var-pray, - 'hands-praying': $var-hands-praying, - 'praying-hands': $var-praying-hands, - 'book-quran': $var-book-quran, - 'quran': $var-quran, - 'magnifying-glass-dollar': $var-magnifying-glass-dollar, - 'search-dollar': $var-search-dollar, - 'magnifying-glass-location': $var-magnifying-glass-location, - 'search-location': $var-search-location, - 'socks': $var-socks, - 'square-root-variable': $var-square-root-variable, - 'square-root-alt': $var-square-root-alt, - 'star-and-crescent': $var-star-and-crescent, - 'star-of-david': $var-star-of-david, - 'synagogue': $var-synagogue, - 'scroll-torah': $var-scroll-torah, - 'torah': $var-torah, - 'torii-gate': $var-torii-gate, - 'vihara': $var-vihara, - 'volume-xmark': $var-volume-xmark, - 'volume-mute': $var-volume-mute, - 'volume-times': $var-volume-times, - 'yin-yang': $var-yin-yang, - 'blender-phone': $var-blender-phone, - 'book-skull': $var-book-skull, - 'book-dead': $var-book-dead, - 'campground': $var-campground, - 'cat': $var-cat, - 'chair': $var-chair, - 'cloud-moon': $var-cloud-moon, - 'cloud-sun': $var-cloud-sun, - 'cow': $var-cow, - 'dice-d20': $var-dice-d20, - 'dice-d6': $var-dice-d6, - 'dog': $var-dog, - 'dragon': $var-dragon, - 'drumstick-bite': $var-drumstick-bite, - 'dungeon': $var-dungeon, - 'file-csv': $var-file-csv, - 'hand-fist': $var-hand-fist, - 'fist-raised': $var-fist-raised, - 'ghost': $var-ghost, - 'hammer': $var-hammer, - 'hanukiah': $var-hanukiah, - 'hat-wizard': $var-hat-wizard, - 'person-hiking': $var-person-hiking, - 'hiking': $var-hiking, - 'hippo': $var-hippo, - 'horse': $var-horse, - 'house-chimney-crack': $var-house-chimney-crack, - 'house-damage': $var-house-damage, - 'hryvnia-sign': $var-hryvnia-sign, - 'hryvnia': $var-hryvnia, - 'mask': $var-mask, - 'mountain': $var-mountain, - 'network-wired': $var-network-wired, - 'otter': $var-otter, - 'ring': $var-ring, - 'person-running': $var-person-running, - 'running': $var-running, - 'scroll': $var-scroll, - 'skull-crossbones': $var-skull-crossbones, - 'slash': $var-slash, - 'spider': $var-spider, - 'toilet-paper': $var-toilet-paper, - 'toilet-paper-alt': $var-toilet-paper-alt, - 'toilet-paper-blank': $var-toilet-paper-blank, - 'tractor': $var-tractor, - 'user-injured': $var-user-injured, - 'vr-cardboard': $var-vr-cardboard, - 'wand-sparkles': $var-wand-sparkles, - 'wind': $var-wind, - 'wine-bottle': $var-wine-bottle, - 'cloud-meatball': $var-cloud-meatball, - 'cloud-moon-rain': $var-cloud-moon-rain, - 'cloud-rain': $var-cloud-rain, - 'cloud-showers-heavy': $var-cloud-showers-heavy, - 'cloud-sun-rain': $var-cloud-sun-rain, - 'democrat': $var-democrat, - 'flag-usa': $var-flag-usa, - 'hurricane': $var-hurricane, - 'landmark-dome': $var-landmark-dome, - 'landmark-alt': $var-landmark-alt, - 'meteor': $var-meteor, - 'person-booth': $var-person-booth, - 'poo-storm': $var-poo-storm, - 'poo-bolt': $var-poo-bolt, - 'rainbow': $var-rainbow, - 'republican': $var-republican, - 'smog': $var-smog, - 'temperature-high': $var-temperature-high, - 'temperature-low': $var-temperature-low, - 'cloud-bolt': $var-cloud-bolt, - 'thunderstorm': $var-thunderstorm, - 'tornado': $var-tornado, - 'volcano': $var-volcano, - 'check-to-slot': $var-check-to-slot, - 'vote-yea': $var-vote-yea, - 'water': $var-water, - 'baby': $var-baby, - 'baby-carriage': $var-baby-carriage, - 'carriage-baby': $var-carriage-baby, - 'biohazard': $var-biohazard, - 'blog': $var-blog, - 'calendar-day': $var-calendar-day, - 'calendar-week': $var-calendar-week, - 'candy-cane': $var-candy-cane, - 'carrot': $var-carrot, - 'cash-register': $var-cash-register, - 'minimize': $var-minimize, - 'compress-arrows-alt': $var-compress-arrows-alt, - 'dumpster': $var-dumpster, - 'dumpster-fire': $var-dumpster-fire, - 'ethernet': $var-ethernet, - 'gifts': $var-gifts, - 'champagne-glasses': $var-champagne-glasses, - 'glass-cheers': $var-glass-cheers, - 'whiskey-glass': $var-whiskey-glass, - 'glass-whiskey': $var-glass-whiskey, - 'earth-europe': $var-earth-europe, - 'globe-europe': $var-globe-europe, - 'grip-lines': $var-grip-lines, - 'grip-lines-vertical': $var-grip-lines-vertical, - 'guitar': $var-guitar, - 'heart-crack': $var-heart-crack, - 'heart-broken': $var-heart-broken, - 'holly-berry': $var-holly-berry, - 'horse-head': $var-horse-head, - 'icicles': $var-icicles, - 'igloo': $var-igloo, - 'mitten': $var-mitten, - 'mug-hot': $var-mug-hot, - 'radiation': $var-radiation, - 'circle-radiation': $var-circle-radiation, - 'radiation-alt': $var-radiation-alt, - 'restroom': $var-restroom, - 'satellite': $var-satellite, - 'satellite-dish': $var-satellite-dish, - 'sd-card': $var-sd-card, - 'sim-card': $var-sim-card, - 'person-skating': $var-person-skating, - 'skating': $var-skating, - 'person-skiing': $var-person-skiing, - 'skiing': $var-skiing, - 'person-skiing-nordic': $var-person-skiing-nordic, - 'skiing-nordic': $var-skiing-nordic, - 'sleigh': $var-sleigh, - 'comment-sms': $var-comment-sms, - 'sms': $var-sms, - 'person-snowboarding': $var-person-snowboarding, - 'snowboarding': $var-snowboarding, - 'snowman': $var-snowman, - 'snowplow': $var-snowplow, - 'tenge-sign': $var-tenge-sign, - 'tenge': $var-tenge, - 'toilet': $var-toilet, - 'screwdriver-wrench': $var-screwdriver-wrench, - 'tools': $var-tools, - 'cable-car': $var-cable-car, - 'tram': $var-tram, - 'fire-flame-curved': $var-fire-flame-curved, - 'fire-alt': $var-fire-alt, - 'bacon': $var-bacon, - 'book-medical': $var-book-medical, - 'bread-slice': $var-bread-slice, - 'cheese': $var-cheese, - 'house-chimney-medical': $var-house-chimney-medical, - 'clinic-medical': $var-clinic-medical, - 'clipboard-user': $var-clipboard-user, - 'comment-medical': $var-comment-medical, - 'crutch': $var-crutch, - 'disease': $var-disease, - 'egg': $var-egg, - 'folder-tree': $var-folder-tree, - 'burger': $var-burger, - 'hamburger': $var-hamburger, - 'hand-middle-finger': $var-hand-middle-finger, - 'helmet-safety': $var-helmet-safety, - 'hard-hat': $var-hard-hat, - 'hat-hard': $var-hat-hard, - 'hospital-user': $var-hospital-user, - 'hotdog': $var-hotdog, - 'ice-cream': $var-ice-cream, - 'laptop-medical': $var-laptop-medical, - 'pager': $var-pager, - 'pepper-hot': $var-pepper-hot, - 'pizza-slice': $var-pizza-slice, - 'sack-dollar': $var-sack-dollar, - 'book-tanakh': $var-book-tanakh, - 'tanakh': $var-tanakh, - 'bars-progress': $var-bars-progress, - 'tasks-alt': $var-tasks-alt, - 'trash-arrow-up': $var-trash-arrow-up, - 'trash-restore': $var-trash-restore, - 'trash-can-arrow-up': $var-trash-can-arrow-up, - 'trash-restore-alt': $var-trash-restore-alt, - 'user-nurse': $var-user-nurse, - 'wave-square': $var-wave-square, - 'person-biking': $var-person-biking, - 'biking': $var-biking, - 'border-all': $var-border-all, - 'border-none': $var-border-none, - 'border-top-left': $var-border-top-left, - 'border-style': $var-border-style, - 'person-digging': $var-person-digging, - 'digging': $var-digging, - 'fan': $var-fan, - 'icons': $var-icons, - 'heart-music-camera-bolt': $var-heart-music-camera-bolt, - 'phone-flip': $var-phone-flip, - 'phone-alt': $var-phone-alt, - 'square-phone-flip': $var-square-phone-flip, - 'phone-square-alt': $var-phone-square-alt, - 'photo-film': $var-photo-film, - 'photo-video': $var-photo-video, - 'text-slash': $var-text-slash, - 'remove-format': $var-remove-format, - 'arrow-down-z-a': $var-arrow-down-z-a, - 'sort-alpha-desc': $var-sort-alpha-desc, - 'sort-alpha-down-alt': $var-sort-alpha-down-alt, - 'arrow-up-z-a': $var-arrow-up-z-a, - 'sort-alpha-up-alt': $var-sort-alpha-up-alt, - 'arrow-down-short-wide': $var-arrow-down-short-wide, - 'sort-amount-desc': $var-sort-amount-desc, - 'sort-amount-down-alt': $var-sort-amount-down-alt, - 'arrow-up-short-wide': $var-arrow-up-short-wide, - 'sort-amount-up-alt': $var-sort-amount-up-alt, - 'arrow-down-9-1': $var-arrow-down-9-1, - 'sort-numeric-desc': $var-sort-numeric-desc, - 'sort-numeric-down-alt': $var-sort-numeric-down-alt, - 'arrow-up-9-1': $var-arrow-up-9-1, - 'sort-numeric-up-alt': $var-sort-numeric-up-alt, - 'spell-check': $var-spell-check, - 'voicemail': $var-voicemail, - 'hat-cowboy': $var-hat-cowboy, - 'hat-cowboy-side': $var-hat-cowboy-side, - 'computer-mouse': $var-computer-mouse, - 'mouse': $var-mouse, - 'radio': $var-radio, - 'record-vinyl': $var-record-vinyl, - 'walkie-talkie': $var-walkie-talkie, - 'caravan': $var-caravan, -); - -$brand-icons: ( - 'firefox-browser': $var-firefox-browser, - 'ideal': $var-ideal, - 'microblog': $var-microblog, - 'square-pied-piper': $var-square-pied-piper, - 'pied-piper-square': $var-pied-piper-square, - 'unity': $var-unity, - 'dailymotion': $var-dailymotion, - 'square-instagram': $var-square-instagram, - 'instagram-square': $var-instagram-square, - 'mixer': $var-mixer, - 'shopify': $var-shopify, - 'deezer': $var-deezer, - 'edge-legacy': $var-edge-legacy, - 'google-pay': $var-google-pay, - 'rust': $var-rust, - 'tiktok': $var-tiktok, - 'unsplash': $var-unsplash, - 'cloudflare': $var-cloudflare, - 'guilded': $var-guilded, - 'hive': $var-hive, - '42-group': $var-42-group, - 'innosoft': $var-innosoft, - 'instalod': $var-instalod, - 'octopus-deploy': $var-octopus-deploy, - 'perbyte': $var-perbyte, - 'uncharted': $var-uncharted, - 'watchman-monitoring': $var-watchman-monitoring, - 'wodu': $var-wodu, - 'wirsindhandwerk': $var-wirsindhandwerk, - 'wsh': $var-wsh, - 'bots': $var-bots, - 'cmplid': $var-cmplid, - 'bilibili': $var-bilibili, - 'golang': $var-golang, - 'pix': $var-pix, - 'sitrox': $var-sitrox, - 'hashnode': $var-hashnode, - 'meta': $var-meta, - 'padlet': $var-padlet, - 'nfc-directional': $var-nfc-directional, - 'nfc-symbol': $var-nfc-symbol, - 'screenpal': $var-screenpal, - 'space-awesome': $var-space-awesome, - 'square-font-awesome': $var-square-font-awesome, - 'square-gitlab': $var-square-gitlab, - 'gitlab-square': $var-gitlab-square, - 'odysee': $var-odysee, - 'stubber': $var-stubber, - 'debian': $var-debian, - 'shoelace': $var-shoelace, - 'threads': $var-threads, - 'square-threads': $var-square-threads, - 'square-x-twitter': $var-square-x-twitter, - 'x-twitter': $var-x-twitter, - 'opensuse': $var-opensuse, - 'letterboxd': $var-letterboxd, - 'square-letterboxd': $var-square-letterboxd, - 'mintbit': $var-mintbit, - 'google-scholar': $var-google-scholar, - 'brave': $var-brave, - 'brave-reverse': $var-brave-reverse, - 'pixiv': $var-pixiv, - 'upwork': $var-upwork, - 'webflow': $var-webflow, - 'signal-messenger': $var-signal-messenger, - 'bluesky': $var-bluesky, - 'jxl': $var-jxl, - 'square-upwork': $var-square-upwork, - 'web-awesome': $var-web-awesome, - 'square-web-awesome': $var-square-web-awesome, - 'square-web-awesome-stroke': $var-square-web-awesome-stroke, - 'dart-lang': $var-dart-lang, - 'flutter': $var-flutter, - 'files-pinwheel': $var-files-pinwheel, - 'css': $var-css, - 'square-bluesky': $var-square-bluesky, - 'openai': $var-openai, - 'square-linkedin': $var-square-linkedin, - 'cash-app': $var-cash-app, - 'disqus': $var-disqus, - 'eleventy': $var-eleventy, - '11ty': $var-11ty, - 'kakao-talk': $var-kakao-talk, - 'linktree': $var-linktree, - 'notion': $var-notion, - 'pandora': $var-pandora, - 'pixelfed': $var-pixelfed, - 'tidal': $var-tidal, - 'vsco': $var-vsco, - 'w3c': $var-w3c, - 'lumon': $var-lumon, - 'lumon-drop': $var-lumon-drop, - 'square-figma': $var-square-figma, - 'tex': $var-tex, - 'duolingo': $var-duolingo, - 'square-twitter': $var-square-twitter, - 'twitter-square': $var-twitter-square, - 'square-facebook': $var-square-facebook, - 'facebook-square': $var-facebook-square, - 'linkedin': $var-linkedin, - 'square-github': $var-square-github, - 'github-square': $var-github-square, - 'twitter': $var-twitter, - 'facebook': $var-facebook, - 'github': $var-github, - 'pinterest': $var-pinterest, - 'square-pinterest': $var-square-pinterest, - 'pinterest-square': $var-pinterest-square, - 'square-google-plus': $var-square-google-plus, - 'google-plus-square': $var-google-plus-square, - 'google-plus-g': $var-google-plus-g, - 'linkedin-in': $var-linkedin-in, - 'github-alt': $var-github-alt, - 'maxcdn': $var-maxcdn, - 'html5': $var-html5, - 'css3': $var-css3, - 'btc': $var-btc, - 'youtube': $var-youtube, - 'xing': $var-xing, - 'square-xing': $var-square-xing, - 'xing-square': $var-xing-square, - 'dropbox': $var-dropbox, - 'stack-overflow': $var-stack-overflow, - 'instagram': $var-instagram, - 'flickr': $var-flickr, - 'adn': $var-adn, - 'bitbucket': $var-bitbucket, - 'tumblr': $var-tumblr, - 'square-tumblr': $var-square-tumblr, - 'tumblr-square': $var-tumblr-square, - 'apple': $var-apple, - 'windows': $var-windows, - 'android': $var-android, - 'linux': $var-linux, - 'dribbble': $var-dribbble, - 'skype': $var-skype, - 'foursquare': $var-foursquare, - 'trello': $var-trello, - 'gratipay': $var-gratipay, - 'vk': $var-vk, - 'weibo': $var-weibo, - 'renren': $var-renren, - 'pagelines': $var-pagelines, - 'stack-exchange': $var-stack-exchange, - 'square-vimeo': $var-square-vimeo, - 'vimeo-square': $var-vimeo-square, - 'slack': $var-slack, - 'slack-hash': $var-slack-hash, - 'wordpress': $var-wordpress, - 'openid': $var-openid, - 'yahoo': $var-yahoo, - 'google': $var-google, - 'reddit': $var-reddit, - 'square-reddit': $var-square-reddit, - 'reddit-square': $var-reddit-square, - 'stumbleupon-circle': $var-stumbleupon-circle, - 'stumbleupon': $var-stumbleupon, - 'delicious': $var-delicious, - 'digg': $var-digg, - 'pied-piper-pp': $var-pied-piper-pp, - 'pied-piper-alt': $var-pied-piper-alt, - 'drupal': $var-drupal, - 'joomla': $var-joomla, - 'behance': $var-behance, - 'square-behance': $var-square-behance, - 'behance-square': $var-behance-square, - 'steam': $var-steam, - 'square-steam': $var-square-steam, - 'steam-square': $var-steam-square, - 'spotify': $var-spotify, - 'deviantart': $var-deviantart, - 'soundcloud': $var-soundcloud, - 'vine': $var-vine, - 'codepen': $var-codepen, - 'jsfiddle': $var-jsfiddle, - 'rebel': $var-rebel, - 'empire': $var-empire, - 'square-git': $var-square-git, - 'git-square': $var-git-square, - 'git': $var-git, - 'hacker-news': $var-hacker-news, - 'tencent-weibo': $var-tencent-weibo, - 'qq': $var-qq, - 'weixin': $var-weixin, - 'slideshare': $var-slideshare, - 'twitch': $var-twitch, - 'yelp': $var-yelp, - 'paypal': $var-paypal, - 'google-wallet': $var-google-wallet, - 'cc-visa': $var-cc-visa, - 'cc-mastercard': $var-cc-mastercard, - 'cc-discover': $var-cc-discover, - 'cc-amex': $var-cc-amex, - 'cc-paypal': $var-cc-paypal, - 'cc-stripe': $var-cc-stripe, - 'lastfm': $var-lastfm, - 'square-lastfm': $var-square-lastfm, - 'lastfm-square': $var-lastfm-square, - 'ioxhost': $var-ioxhost, - 'angellist': $var-angellist, - 'buysellads': $var-buysellads, - 'connectdevelop': $var-connectdevelop, - 'dashcube': $var-dashcube, - 'forumbee': $var-forumbee, - 'leanpub': $var-leanpub, - 'sellsy': $var-sellsy, - 'shirtsinbulk': $var-shirtsinbulk, - 'simplybuilt': $var-simplybuilt, - 'skyatlas': $var-skyatlas, - 'pinterest-p': $var-pinterest-p, - 'whatsapp': $var-whatsapp, - 'viacoin': $var-viacoin, - 'medium': $var-medium, - 'medium-m': $var-medium-m, - 'y-combinator': $var-y-combinator, - 'optin-monster': $var-optin-monster, - 'opencart': $var-opencart, - 'expeditedssl': $var-expeditedssl, - 'cc-jcb': $var-cc-jcb, - 'cc-diners-club': $var-cc-diners-club, - 'creative-commons': $var-creative-commons, - 'gg': $var-gg, - 'gg-circle': $var-gg-circle, - 'odnoklassniki': $var-odnoklassniki, - 'square-odnoklassniki': $var-square-odnoklassniki, - 'odnoklassniki-square': $var-odnoklassniki-square, - 'get-pocket': $var-get-pocket, - 'wikipedia-w': $var-wikipedia-w, - 'safari': $var-safari, - 'chrome': $var-chrome, - 'firefox': $var-firefox, - 'opera': $var-opera, - 'internet-explorer': $var-internet-explorer, - 'contao': $var-contao, - '500px': $var-500px, - 'amazon': $var-amazon, - 'houzz': $var-houzz, - 'vimeo-v': $var-vimeo-v, - 'black-tie': $var-black-tie, - 'fonticons': $var-fonticons, - 'reddit-alien': $var-reddit-alien, - 'edge': $var-edge, - 'codiepie': $var-codiepie, - 'modx': $var-modx, - 'fort-awesome': $var-fort-awesome, - 'usb': $var-usb, - 'product-hunt': $var-product-hunt, - 'mixcloud': $var-mixcloud, - 'scribd': $var-scribd, - 'bluetooth': $var-bluetooth, - 'bluetooth-b': $var-bluetooth-b, - 'gitlab': $var-gitlab, - 'wpbeginner': $var-wpbeginner, - 'wpforms': $var-wpforms, - 'envira': $var-envira, - 'glide': $var-glide, - 'glide-g': $var-glide-g, - 'viadeo': $var-viadeo, - 'square-viadeo': $var-square-viadeo, - 'viadeo-square': $var-viadeo-square, - 'snapchat': $var-snapchat, - 'snapchat-ghost': $var-snapchat-ghost, - 'square-snapchat': $var-square-snapchat, - 'snapchat-square': $var-snapchat-square, - 'pied-piper': $var-pied-piper, - 'first-order': $var-first-order, - 'yoast': $var-yoast, - 'themeisle': $var-themeisle, - 'google-plus': $var-google-plus, - 'font-awesome': $var-font-awesome, - 'font-awesome-flag': $var-font-awesome-flag, - 'font-awesome-logo-full': $var-font-awesome-logo-full, - 'linode': $var-linode, - 'quora': $var-quora, - 'free-code-camp': $var-free-code-camp, - 'telegram': $var-telegram, - 'telegram-plane': $var-telegram-plane, - 'bandcamp': $var-bandcamp, - 'grav': $var-grav, - 'etsy': $var-etsy, - 'imdb': $var-imdb, - 'ravelry': $var-ravelry, - 'sellcast': $var-sellcast, - 'superpowers': $var-superpowers, - 'wpexplorer': $var-wpexplorer, - 'meetup': $var-meetup, - 'square-font-awesome-stroke': $var-square-font-awesome-stroke, - 'font-awesome-alt': $var-font-awesome-alt, - 'accessible-icon': $var-accessible-icon, - 'accusoft': $var-accusoft, - 'adversal': $var-adversal, - 'affiliatetheme': $var-affiliatetheme, - 'algolia': $var-algolia, - 'amilia': $var-amilia, - 'angrycreative': $var-angrycreative, - 'app-store': $var-app-store, - 'app-store-ios': $var-app-store-ios, - 'apper': $var-apper, - 'asymmetrik': $var-asymmetrik, - 'audible': $var-audible, - 'avianex': $var-avianex, - 'aws': $var-aws, - 'bimobject': $var-bimobject, - 'bitcoin': $var-bitcoin, - 'bity': $var-bity, - 'blackberry': $var-blackberry, - 'blogger': $var-blogger, - 'blogger-b': $var-blogger-b, - 'buromobelexperte': $var-buromobelexperte, - 'centercode': $var-centercode, - 'cloudscale': $var-cloudscale, - 'cloudsmith': $var-cloudsmith, - 'cloudversify': $var-cloudversify, - 'cpanel': $var-cpanel, - 'css3-alt': $var-css3-alt, - 'cuttlefish': $var-cuttlefish, - 'd-and-d': $var-d-and-d, - 'deploydog': $var-deploydog, - 'deskpro': $var-deskpro, - 'digital-ocean': $var-digital-ocean, - 'discord': $var-discord, - 'discourse': $var-discourse, - 'dochub': $var-dochub, - 'docker': $var-docker, - 'draft2digital': $var-draft2digital, - 'square-dribbble': $var-square-dribbble, - 'dribbble-square': $var-dribbble-square, - 'dyalog': $var-dyalog, - 'earlybirds': $var-earlybirds, - 'erlang': $var-erlang, - 'facebook-f': $var-facebook-f, - 'facebook-messenger': $var-facebook-messenger, - 'firstdraft': $var-firstdraft, - 'fonticons-fi': $var-fonticons-fi, - 'fort-awesome-alt': $var-fort-awesome-alt, - 'freebsd': $var-freebsd, - 'gitkraken': $var-gitkraken, - 'gofore': $var-gofore, - 'goodreads': $var-goodreads, - 'goodreads-g': $var-goodreads-g, - 'google-drive': $var-google-drive, - 'google-play': $var-google-play, - 'gripfire': $var-gripfire, - 'grunt': $var-grunt, - 'gulp': $var-gulp, - 'square-hacker-news': $var-square-hacker-news, - 'hacker-news-square': $var-hacker-news-square, - 'hire-a-helper': $var-hire-a-helper, - 'hotjar': $var-hotjar, - 'hubspot': $var-hubspot, - 'itunes': $var-itunes, - 'itunes-note': $var-itunes-note, - 'jenkins': $var-jenkins, - 'joget': $var-joget, - 'js': $var-js, - 'square-js': $var-square-js, - 'js-square': $var-js-square, - 'keycdn': $var-keycdn, - 'kickstarter': $var-kickstarter, - 'square-kickstarter': $var-square-kickstarter, - 'kickstarter-k': $var-kickstarter-k, - 'laravel': $var-laravel, - 'line': $var-line, - 'lyft': $var-lyft, - 'magento': $var-magento, - 'medapps': $var-medapps, - 'medrt': $var-medrt, - 'microsoft': $var-microsoft, - 'mix': $var-mix, - 'mizuni': $var-mizuni, - 'monero': $var-monero, - 'napster': $var-napster, - 'node-js': $var-node-js, - 'npm': $var-npm, - 'ns8': $var-ns8, - 'nutritionix': $var-nutritionix, - 'page4': $var-page4, - 'palfed': $var-palfed, - 'patreon': $var-patreon, - 'periscope': $var-periscope, - 'phabricator': $var-phabricator, - 'phoenix-framework': $var-phoenix-framework, - 'playstation': $var-playstation, - 'pushed': $var-pushed, - 'python': $var-python, - 'red-river': $var-red-river, - 'wpressr': $var-wpressr, - 'rendact': $var-rendact, - 'replyd': $var-replyd, - 'resolving': $var-resolving, - 'rocketchat': $var-rocketchat, - 'rockrms': $var-rockrms, - 'schlix': $var-schlix, - 'searchengin': $var-searchengin, - 'servicestack': $var-servicestack, - 'sistrix': $var-sistrix, - 'speakap': $var-speakap, - 'staylinked': $var-staylinked, - 'steam-symbol': $var-steam-symbol, - 'sticker-mule': $var-sticker-mule, - 'studiovinari': $var-studiovinari, - 'supple': $var-supple, - 'uber': $var-uber, - 'uikit': $var-uikit, - 'uniregistry': $var-uniregistry, - 'untappd': $var-untappd, - 'ussunnah': $var-ussunnah, - 'vaadin': $var-vaadin, - 'viber': $var-viber, - 'vimeo': $var-vimeo, - 'vnv': $var-vnv, - 'square-whatsapp': $var-square-whatsapp, - 'whatsapp-square': $var-whatsapp-square, - 'whmcs': $var-whmcs, - 'wordpress-simple': $var-wordpress-simple, - 'xbox': $var-xbox, - 'yandex': $var-yandex, - 'yandex-international': $var-yandex-international, - 'apple-pay': $var-apple-pay, - 'cc-apple-pay': $var-cc-apple-pay, - 'fly': $var-fly, - 'node': $var-node, - 'osi': $var-osi, - 'react': $var-react, - 'autoprefixer': $var-autoprefixer, - 'less': $var-less, - 'sass': $var-sass, - 'vuejs': $var-vuejs, - 'angular': $var-angular, - 'aviato': $var-aviato, - 'ember': $var-ember, - 'gitter': $var-gitter, - 'hooli': $var-hooli, - 'strava': $var-strava, - 'stripe': $var-stripe, - 'stripe-s': $var-stripe-s, - 'typo3': $var-typo3, - 'amazon-pay': $var-amazon-pay, - 'cc-amazon-pay': $var-cc-amazon-pay, - 'ethereum': $var-ethereum, - 'korvue': $var-korvue, - 'elementor': $var-elementor, - 'square-youtube': $var-square-youtube, - 'youtube-square': $var-youtube-square, - 'flipboard': $var-flipboard, - 'hips': $var-hips, - 'php': $var-php, - 'quinscape': $var-quinscape, - 'readme': $var-readme, - 'java': $var-java, - 'pied-piper-hat': $var-pied-piper-hat, - 'creative-commons-by': $var-creative-commons-by, - 'creative-commons-nc': $var-creative-commons-nc, - 'creative-commons-nc-eu': $var-creative-commons-nc-eu, - 'creative-commons-nc-jp': $var-creative-commons-nc-jp, - 'creative-commons-nd': $var-creative-commons-nd, - 'creative-commons-pd': $var-creative-commons-pd, - 'creative-commons-pd-alt': $var-creative-commons-pd-alt, - 'creative-commons-remix': $var-creative-commons-remix, - 'creative-commons-sa': $var-creative-commons-sa, - 'creative-commons-sampling': $var-creative-commons-sampling, - 'creative-commons-sampling-plus': $var-creative-commons-sampling-plus, - 'creative-commons-share': $var-creative-commons-share, - 'creative-commons-zero': $var-creative-commons-zero, - 'ebay': $var-ebay, - 'keybase': $var-keybase, - 'mastodon': $var-mastodon, - 'r-project': $var-r-project, - 'researchgate': $var-researchgate, - 'teamspeak': $var-teamspeak, - 'first-order-alt': $var-first-order-alt, - 'fulcrum': $var-fulcrum, - 'galactic-republic': $var-galactic-republic, - 'galactic-senate': $var-galactic-senate, - 'jedi-order': $var-jedi-order, - 'mandalorian': $var-mandalorian, - 'old-republic': $var-old-republic, - 'phoenix-squadron': $var-phoenix-squadron, - 'sith': $var-sith, - 'trade-federation': $var-trade-federation, - 'wolf-pack-battalion': $var-wolf-pack-battalion, - 'hornbill': $var-hornbill, - 'mailchimp': $var-mailchimp, - 'megaport': $var-megaport, - 'nimblr': $var-nimblr, - 'rev': $var-rev, - 'shopware': $var-shopware, - 'squarespace': $var-squarespace, - 'themeco': $var-themeco, - 'weebly': $var-weebly, - 'wix': $var-wix, - 'ello': $var-ello, - 'hackerrank': $var-hackerrank, - 'kaggle': $var-kaggle, - 'markdown': $var-markdown, - 'neos': $var-neos, - 'zhihu': $var-zhihu, - 'alipay': $var-alipay, - 'the-red-yeti': $var-the-red-yeti, - 'critical-role': $var-critical-role, - 'd-and-d-beyond': $var-d-and-d-beyond, - 'dev': $var-dev, - 'fantasy-flight-games': $var-fantasy-flight-games, - 'wizards-of-the-coast': $var-wizards-of-the-coast, - 'think-peaks': $var-think-peaks, - 'reacteurope': $var-reacteurope, - 'artstation': $var-artstation, - 'atlassian': $var-atlassian, - 'canadian-maple-leaf': $var-canadian-maple-leaf, - 'centos': $var-centos, - 'confluence': $var-confluence, - 'dhl': $var-dhl, - 'diaspora': $var-diaspora, - 'fedex': $var-fedex, - 'fedora': $var-fedora, - 'figma': $var-figma, - 'intercom': $var-intercom, - 'invision': $var-invision, - 'jira': $var-jira, - 'mendeley': $var-mendeley, - 'raspberry-pi': $var-raspberry-pi, - 'redhat': $var-redhat, - 'sketch': $var-sketch, - 'sourcetree': $var-sourcetree, - 'suse': $var-suse, - 'ubuntu': $var-ubuntu, - 'ups': $var-ups, - 'usps': $var-usps, - 'yarn': $var-yarn, - 'airbnb': $var-airbnb, - 'battle-net': $var-battle-net, - 'bootstrap': $var-bootstrap, - 'buffer': $var-buffer, - 'chromecast': $var-chromecast, - 'evernote': $var-evernote, - 'itch-io': $var-itch-io, - 'salesforce': $var-salesforce, - 'speaker-deck': $var-speaker-deck, - 'symfony': $var-symfony, - 'waze': $var-waze, - 'yammer': $var-yammer, - 'git-alt': $var-git-alt, - 'stackpath': $var-stackpath, - 'cotton-bureau': $var-cotton-bureau, - 'buy-n-large': $var-buy-n-large, - 'mdb': $var-mdb, - 'orcid': $var-orcid, - 'swift': $var-swift, - 'umbraco': $var-umbraco, -); diff --git a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_widths.scss b/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_widths.scss deleted file mode 100644 index b2c6729..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/_widths.scss +++ /dev/null @@ -1,12 +0,0 @@ -// icon widths -// ------------------------- -@use 'variables' as v; - -.#{v.$css-prefix}-width-auto { - --#{v.$css-prefix}-width: auto; -} - -.#{v.$css-prefix}-fw, -.#{v.$css-prefix}-width-fixed { - --#{v.$css-prefix}-width: #{v.$fw-width}; -} diff --git a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/brands.scss b/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/brands.scss deleted file mode 100644 index fa1b181..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/brands.scss +++ /dev/null @@ -1,45 +0,0 @@ -/*! - * Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2025 Fonticons, Inc. - */ -@use "sass:string"; -@use 'variables' as v; -@use 'mixins' as m; - -:root, :host { - --#{v.$css-prefix}-family-brands: 'Font Awesome 7 Brands'; - --#{v.$css-prefix}-font-brands: normal 400 1em/1 var(--#{v.$css-prefix}-family-brands); -} - -@font-face { - font-family: 'Font Awesome 7 Brands'; - font-style: normal; - font-weight: 400; - font-display: v.$font-display; - src: url('#{v.$font-path}/fa-brands-400.woff2'); -} - -.fab, -.#{v.$css-prefix}-brands, -.#{v.$css-prefix}-classic.#{v.$css-prefix}-brands { - --#{v.$css-prefix}-family: var(--#{v.$css-prefix}-family-brands); - --#{v.$css-prefix}-style: 400; -} - -@each $name, $icon in v.$brand-icons { - .#{v.$css-prefix}-#{$name} { - #{v.$icon-property}: string.unquote("\"#{ $icon }\""); - } -} - -// convenience mixin for declaring pseudo-elements by CSS variable, -// including all style-specific font properties and ::before elements. -@mixin icon($var) { - @include m.fa-icon(Font Awesome 7 Brands); - @extend .#{v.$css-prefix}-brands; - - &::before { - content: string.unquote("\"#{ $var }\""); - } -} diff --git a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/fontawesome.scss b/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/fontawesome.scss deleted file mode 100644 index e37bad8..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/fontawesome.scss +++ /dev/null @@ -1,20 +0,0 @@ -/*! - * Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2025 Fonticons, Inc. - */ -// Font Awesome core compile (Web Fonts-based) -// ------------------------- - - - -@use 'core'; -@use 'sizing'; -@use 'widths'; -@use 'list'; -@use 'bordered'; -@use 'pulled'; -@use 'animated'; -@use 'rotated-flipped'; -@use 'stacked'; -@use 'icons'; diff --git a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/regular.scss b/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/regular.scss deleted file mode 100644 index 7acecc9..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/regular.scss +++ /dev/null @@ -1,51 +0,0 @@ -/*! - * Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2025 Fonticons, Inc. - */ -@use "sass:string"; -@use 'variables' as v; -@use 'mixins' as m; - -:root, :host { - --#{v.$css-prefix}-family-classic: '#{ v.$family }'; - --#{v.$css-prefix}-font-regular: normal 400 1em/1 var(--#{v.$css-prefix}-family-classic); - - /* deprecated: this older custom property will be removed next major release */ - --#{v.$css-prefix}-style-family-classic: var(--#{v.$css-prefix}-family-classic); -} - - -@font-face { - font-family: 'Font Awesome 7 Free'; - font-style: normal; - font-weight: 400; - font-display: v.$font-display; - src: url('#{v.$font-path}/fa-regular-400.woff2'); -} - - -.far { - --#{v.$css-prefix}-family: var(--#{v.$css-prefix}-family-classic); - --#{v.$css-prefix}-style: 400; -} - -.#{v.$css-prefix}-classic { - --#{v.$css-prefix}-family: var(--#{v.$css-prefix}-family-classic); -} - -.#{v.$css-prefix}-regular { - --#{v.$css-prefix}-style: 400; -} - -// convenience mixin for declaring pseudo-elements by CSS variable, -// including all style-specific font properties and ::before elements. -@mixin icon($var) { - @include m.fa-icon(Font Awesome 7 Free); - @extend .#{v.$css-prefix}-regular; - @extend .#{v.$css-prefix}-classic; - - &::before { - content: string.unquote("\"#{ $var }\""); - } -} diff --git a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/solid.scss b/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/solid.scss deleted file mode 100644 index deb9a1a..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/solid.scss +++ /dev/null @@ -1,51 +0,0 @@ -/*! - * Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2025 Fonticons, Inc. - */ -@use "sass:string"; -@use 'variables' as v; -@use 'mixins' as m; - -:root, :host { - --#{v.$css-prefix}-family-classic: '#{ v.$family }'; - --#{v.$css-prefix}-font-solid: normal 900 1em/1 var(--#{v.$css-prefix}-family-classic); - - /* deprecated: this older custom property will be removed next major release */ - --#{v.$css-prefix}-style-family-classic: var(--#{v.$css-prefix}-family-classic); -} - - -@font-face { - font-family: 'Font Awesome 7 Free'; - font-style: normal; - font-weight: 900; - font-display: v.$font-display; - src: url('#{v.$font-path}/fa-solid-900.woff2'); -} - - -.fas { - --#{v.$css-prefix}-family: var(--#{v.$css-prefix}-family-classic); - --#{v.$css-prefix}-style: 900; -} - -.#{v.$css-prefix}-classic { - --#{v.$css-prefix}-family: var(--#{v.$css-prefix}-family-classic); -} - -.#{v.$css-prefix}-solid { - --#{v.$css-prefix}-style: 900; -} - -// convenience mixin for declaring pseudo-elements by CSS variable, -// including all style-specific font properties and ::before elements. -@mixin icon($var) { - @include m.fa-icon(Font Awesome 7 Free); - @extend .#{v.$css-prefix}-solid; - @extend .#{v.$css-prefix}-classic; - - &::before { - content: string.unquote("\"#{ $var }\""); - } -} diff --git a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/v4-shims.scss b/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/v4-shims.scss deleted file mode 100644 index e32bb30..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/icons/fontawesome-7.1.0/v4-shims.scss +++ /dev/null @@ -1,11 +0,0 @@ -/*! - * Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2025 Fonticons, Inc. - */ -// V4 shims compile (Web Fonts-based) -// ------------------------- - -@use 'functions'; -@use 'variables' as v; -@use 'shims'; diff --git a/webseite-react-php-jwt/react-app/src/styles/libraries/_index.scss b/webseite-react-php-jwt/react-app/src/styles/libraries/_index.scss deleted file mode 100644 index cdc37e6..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/libraries/_index.scss +++ /dev/null @@ -1,2 +0,0 @@ -// @forward 'bootstrap-5.3.8/bootstrap-grid'; -@forward 'bootstrap-5.3.8/bootstrap'; diff --git a/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_accordion.scss b/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_accordion.scss deleted file mode 100644 index e9f267f..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_accordion.scss +++ /dev/null @@ -1,153 +0,0 @@ -// -// Base styles -// - -.accordion { - // scss-docs-start accordion-css-vars - --#{$prefix}accordion-color: #{$accordion-color}; - --#{$prefix}accordion-bg: #{$accordion-bg}; - --#{$prefix}accordion-transition: #{$accordion-transition}; - --#{$prefix}accordion-border-color: #{$accordion-border-color}; - --#{$prefix}accordion-border-width: #{$accordion-border-width}; - --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; - --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; - --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; - --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; - --#{$prefix}accordion-btn-color: #{$accordion-button-color}; - --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; - --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; - --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; - --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; - --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; - --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; - --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; - --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; - --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; - // scss-docs-end accordion-css-vars -} - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); - @include font-size($font-size-base); - color: var(--#{$prefix}accordion-btn-color); - text-align: left; // Reset button style - background-color: var(--#{$prefix}accordion-btn-bg); - border: 0; - @include border-radius(0); - overflow-anchor: none; - @include transition(var(--#{$prefix}accordion-transition)); - - &:not(.collapsed) { - color: var(--#{$prefix}accordion-active-color); - background-color: var(--#{$prefix}accordion-active-bg); - box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list - - &::after { - background-image: var(--#{$prefix}accordion-btn-active-icon); - transform: var(--#{$prefix}accordion-btn-icon-transform); - } - } - - // Accordion icon - &::after { - flex-shrink: 0; - width: var(--#{$prefix}accordion-btn-icon-width); - height: var(--#{$prefix}accordion-btn-icon-width); - margin-left: auto; - content: ""; - background-image: var(--#{$prefix}accordion-btn-icon); - background-repeat: no-repeat; - background-size: var(--#{$prefix}accordion-btn-icon-width); - @include transition(var(--#{$prefix}accordion-btn-icon-transition)); - } - - &:hover { - z-index: 2; - } - - &:focus { - z-index: 3; - outline: 0; - box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); - } -} - -.accordion-header { - margin-bottom: 0; -} - -.accordion-item { - color: var(--#{$prefix}accordion-color); - background-color: var(--#{$prefix}accordion-bg); - border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); - - &:first-of-type { - @include border-top-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - &:not(:first-of-type) { - border-top: 0; - } - - // Only set a border-radius on the last item if the accordion is collapsed - &:last-of-type { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - &.collapsed { - @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - > .accordion-collapse { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - } - } -} - -.accordion-body { - padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); -} - - -// Flush accordion items -// -// Remove borders and border-radius to keep accordion items edge-to-edge. - -.accordion-flush { - > .accordion-item { - border-right: 0; - border-left: 0; - @include border-radius(0); - - &:first-child { border-top: 0; } - &:last-child { border-bottom: 0; } - - // stylelint-disable selector-max-class - > .accordion-collapse, - > .accordion-header .accordion-button, - > .accordion-header .accordion-button.collapsed { - @include border-radius(0); - } - // stylelint-enable selector-max-class - } -} - -@if $enable-dark-mode { - @include color-mode(dark) { - .accordion-button::after { - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; - } - } -} diff --git a/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_alert.scss b/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_alert.scss deleted file mode 100644 index b8cff9b..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_alert.scss +++ /dev/null @@ -1,68 +0,0 @@ -// -// Base styles -// - -.alert { - // scss-docs-start alert-css-vars - --#{$prefix}alert-bg: transparent; - --#{$prefix}alert-padding-x: #{$alert-padding-x}; - --#{$prefix}alert-padding-y: #{$alert-padding-y}; - --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; - --#{$prefix}alert-color: inherit; - --#{$prefix}alert-border-color: transparent; - --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); - --#{$prefix}alert-border-radius: #{$alert-border-radius}; - --#{$prefix}alert-link-color: inherit; - // scss-docs-end alert-css-vars - - position: relative; - padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); - margin-bottom: var(--#{$prefix}alert-margin-bottom); - color: var(--#{$prefix}alert-color); - background-color: var(--#{$prefix}alert-bg); - border: var(--#{$prefix}alert-border); - @include border-radius(var(--#{$prefix}alert-border-radius)); -} - -// Headings for larger alerts -.alert-heading { - // Specified to prevent conflicts of changing $headings-color - color: inherit; -} - -// Provide class for links that match alerts -.alert-link { - font-weight: $alert-link-font-weight; - color: var(--#{$prefix}alert-link-color); -} - - -// Dismissible alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissible { - padding-right: $alert-dismissible-padding-r; - - // Adjust close link position - .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: $stretched-link-z-index + 1; - padding: $alert-padding-y * 1.25 $alert-padding-x; - } -} - - -// scss-docs-start alert-modifiers -// Generate contextual modifier classes for colorizing the alert -@each $state in map-keys($theme-colors) { - .alert-#{$state} { - --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); - --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); - --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); - --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); - } -} -// scss-docs-end alert-modifiers diff --git a/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_badge.scss b/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_badge.scss deleted file mode 100644 index cc3d269..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_badge.scss +++ /dev/null @@ -1,38 +0,0 @@ -// Base class -// -// Requires one of the contextual, color modifier classes for `color` and -// `background-color`. - -.badge { - // scss-docs-start badge-css-vars - --#{$prefix}badge-padding-x: #{$badge-padding-x}; - --#{$prefix}badge-padding-y: #{$badge-padding-y}; - @include rfs($badge-font-size, --#{$prefix}badge-font-size); - --#{$prefix}badge-font-weight: #{$badge-font-weight}; - --#{$prefix}badge-color: #{$badge-color}; - --#{$prefix}badge-border-radius: #{$badge-border-radius}; - // scss-docs-end badge-css-vars - - display: inline-block; - padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x); - @include font-size(var(--#{$prefix}badge-font-size)); - font-weight: var(--#{$prefix}badge-font-weight); - line-height: 1; - color: var(--#{$prefix}badge-color); - text-align: center; - white-space: nowrap; - vertical-align: baseline; - @include border-radius(var(--#{$prefix}badge-border-radius)); - @include gradient-bg(); - - // Empty badges collapse automatically - &:empty { - display: none; - } -} - -// Quick fix for badges in buttons -.btn .badge { - position: relative; - top: -1px; -} diff --git a/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_breadcrumb.scss b/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_breadcrumb.scss deleted file mode 100644 index b8252ff..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_breadcrumb.scss +++ /dev/null @@ -1,40 +0,0 @@ -.breadcrumb { - // scss-docs-start breadcrumb-css-vars - --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x}; - --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y}; - --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom}; - @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size); - --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg}; - --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius}; - --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color}; - --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x}; - --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color}; - // scss-docs-end breadcrumb-css-vars - - display: flex; - flex-wrap: wrap; - padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x); - margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom); - @include font-size(var(--#{$prefix}breadcrumb-font-size)); - list-style: none; - background-color: var(--#{$prefix}breadcrumb-bg); - @include border-radius(var(--#{$prefix}breadcrumb-border-radius)); -} - -.breadcrumb-item { - // The separator between breadcrumbs (by default, a forward-slash: "/") - + .breadcrumb-item { - padding-left: var(--#{$prefix}breadcrumb-item-padding-x); - - &::before { - float: left; // Suppress inline spacings and underlining of the separator - padding-right: var(--#{$prefix}breadcrumb-item-padding-x); - color: var(--#{$prefix}breadcrumb-divider-color); - content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; - } - } - - &.active { - color: var(--#{$prefix}breadcrumb-item-active-color); - } -} diff --git a/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_button-group.scss b/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_button-group.scss deleted file mode 100644 index 78e1252..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_button-group.scss +++ /dev/null @@ -1,147 +0,0 @@ -// Make the div behave like a button -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; // match .btn alignment given font-size hack above - - > .btn { - position: relative; - flex: 1 1 auto; - } - - // Bring the hover, focused, and "active" buttons to the front to overlay - // the borders properly - > .btn-check:checked + .btn, - > .btn-check:focus + .btn, - > .btn:hover, - > .btn:focus, - > .btn:active, - > .btn.active { - z-index: 1; - } -} - -// Optional: Group multiple button groups together for a toolbar -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; - - .input-group { - width: auto; - } -} - -.btn-group { - @include border-radius($btn-border-radius); - - // Prevent double borders when buttons are next to each other - > :not(.btn-check:first-child) + .btn, - > .btn-group:not(:first-child) { - margin-left: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn.dropdown-toggle-split:first-child, - > .btn-group:not(:last-child) > .btn { - @include border-end-radius(0); - } - - // The left radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-start-radius(0); - } -} - -// Sizing -// -// Remix the default button sizing classes into new ones for easier manipulation. - -.btn-group-sm > .btn { @extend .btn-sm; } -.btn-group-lg > .btn { @extend .btn-lg; } - - -// -// Split button dropdowns -// - -.dropdown-toggle-split { - padding-right: $btn-padding-x * .75; - padding-left: $btn-padding-x * .75; - - &::after, - .dropup &::after, - .dropend &::after { - margin-left: 0; - } - - .dropstart &::before { - margin-right: 0; - } -} - -.btn-sm + .dropdown-toggle-split { - padding-right: $btn-padding-x-sm * .75; - padding-left: $btn-padding-x-sm * .75; -} - -.btn-lg + .dropdown-toggle-split { - padding-right: $btn-padding-x-lg * .75; - padding-left: $btn-padding-x-lg * .75; -} - - -// The clickable button for toggling the menu -// Set the same inset shadow as the :active state -.btn-group.show .dropdown-toggle { - @include box-shadow($btn-active-box-shadow); - - // Show no shadow for `.btn-link` since it has no other button styles. - &.btn-link { - @include box-shadow(none); - } -} - - -// -// Vertical button groups -// - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; - - > .btn, - > .btn-group { - width: 100%; - } - - > .btn:not(:first-child), - > .btn-group:not(:first-child) { - margin-top: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn-group:not(:last-child) > .btn { - @include border-bottom-radius(0); - } - - // The top radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-top-radius(0); - } -} diff --git a/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_buttons.scss b/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_buttons.scss deleted file mode 100644 index caa4518..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_buttons.scss +++ /dev/null @@ -1,216 +0,0 @@ -// -// Base styles -// - -.btn { - // scss-docs-start btn-css-vars - --#{$prefix}btn-padding-x: #{$btn-padding-x}; - --#{$prefix}btn-padding-y: #{$btn-padding-y}; - --#{$prefix}btn-font-family: #{$btn-font-family}; - @include rfs($btn-font-size, --#{$prefix}btn-font-size); - --#{$prefix}btn-font-weight: #{$btn-font-weight}; - --#{$prefix}btn-line-height: #{$btn-line-height}; - --#{$prefix}btn-color: #{$btn-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-width: #{$btn-border-width}; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-border-radius: #{$btn-border-radius}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-box-shadow: #{$btn-box-shadow}; - --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity}; - --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5); - // scss-docs-end btn-css-vars - - display: inline-block; - padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x); - font-family: var(--#{$prefix}btn-font-family); - @include font-size(var(--#{$prefix}btn-font-size)); - font-weight: var(--#{$prefix}btn-font-weight); - line-height: var(--#{$prefix}btn-line-height); - color: var(--#{$prefix}btn-color); - text-align: center; - text-decoration: if($link-decoration == none, null, none); - white-space: $btn-white-space; - vertical-align: middle; - cursor: if($enable-button-pointers, pointer, null); - user-select: none; - border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color); - @include border-radius(var(--#{$prefix}btn-border-radius)); - @include gradient-bg(var(--#{$prefix}btn-bg)); - @include box-shadow(var(--#{$prefix}btn-box-shadow)); - @include transition($btn-transition); - - &:hover { - color: var(--#{$prefix}btn-hover-color); - text-decoration: if($link-hover-decoration == underline, none, null); - background-color: var(--#{$prefix}btn-hover-bg); - border-color: var(--#{$prefix}btn-hover-border-color); - } - - .btn-check + &:hover { - // override for the checkbox/radio buttons - color: var(--#{$prefix}btn-color); - background-color: var(--#{$prefix}btn-bg); - border-color: var(--#{$prefix}btn-border-color); - } - - &:focus-visible { - color: var(--#{$prefix}btn-hover-color); - @include gradient-bg(var(--#{$prefix}btn-hover-bg)); - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:focus-visible + & { - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:checked + &, - :not(.btn-check) + &:active, - &:first-child:active, - &.active, - &.show { - color: var(--#{$prefix}btn-active-color); - background-color: var(--#{$prefix}btn-active-bg); - // Remove CSS gradients if they're enabled - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-active-border-color); - @include box-shadow(var(--#{$prefix}btn-active-shadow)); - - &:focus-visible { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - } - - .btn-check:checked:focus-visible + & { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - &:disabled, - &.disabled, - fieldset:disabled & { - color: var(--#{$prefix}btn-disabled-color); - pointer-events: none; - background-color: var(--#{$prefix}btn-disabled-bg); - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-disabled-border-color); - opacity: var(--#{$prefix}btn-disabled-opacity); - @include box-shadow(none); - } -} - - -// -// Alternate buttons -// - -// scss-docs-start btn-variant-loops -@each $color, $value in $theme-colors { - .btn-#{$color} { - @if $color == "light" { - @include button-variant( - $value, - $value, - $hover-background: shade-color($value, $btn-hover-bg-shade-amount), - $hover-border: shade-color($value, $btn-hover-border-shade-amount), - $active-background: shade-color($value, $btn-active-bg-shade-amount), - $active-border: shade-color($value, $btn-active-border-shade-amount) - ); - } @else if $color == "dark" { - @include button-variant( - $value, - $value, - $hover-background: tint-color($value, $btn-hover-bg-tint-amount), - $hover-border: tint-color($value, $btn-hover-border-tint-amount), - $active-background: tint-color($value, $btn-active-bg-tint-amount), - $active-border: tint-color($value, $btn-active-border-tint-amount) - ); - } @else { - @include button-variant($value, $value); - } - } -} - -@each $color, $value in $theme-colors { - .btn-outline-#{$color} { - @include button-outline-variant($value); - } -} -// scss-docs-end btn-variant-loops - - -// -// Link buttons -// - -// Make a button look and behave like a link -.btn-link { - --#{$prefix}btn-font-weight: #{$font-weight-normal}; - --#{$prefix}btn-color: #{$btn-link-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-hover-color: #{$btn-link-hover-color}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-active-color: #{$btn-link-hover-color}; - --#{$prefix}btn-active-border-color: transparent; - --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color}; - --#{$prefix}btn-disabled-border-color: transparent; - --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows - --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb}; - - text-decoration: $link-decoration; - @if $enable-gradients { - background-image: none; - } - - &:hover, - &:focus-visible { - text-decoration: $link-hover-decoration; - } - - &:focus-visible { - color: var(--#{$prefix}btn-color); - } - - &:hover { - color: var(--#{$prefix}btn-hover-color); - } - - // No need for an active state here -} - - -// -// Button Sizes -// - -.btn-lg { - @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); -} - -.btn-sm { - @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); -} diff --git a/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_card.scss b/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_card.scss deleted file mode 100644 index dcebe6a..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_card.scss +++ /dev/null @@ -1,238 +0,0 @@ -// -// Base styles -// - -.card { - // scss-docs-start card-css-vars - --#{$prefix}card-spacer-y: #{$card-spacer-y}; - --#{$prefix}card-spacer-x: #{$card-spacer-x}; - --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y}; - --#{$prefix}card-title-color: #{$card-title-color}; - --#{$prefix}card-subtitle-color: #{$card-subtitle-color}; - --#{$prefix}card-border-width: #{$card-border-width}; - --#{$prefix}card-border-color: #{$card-border-color}; - --#{$prefix}card-border-radius: #{$card-border-radius}; - --#{$prefix}card-box-shadow: #{$card-box-shadow}; - --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius}; - --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y}; - --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x}; - --#{$prefix}card-cap-bg: #{$card-cap-bg}; - --#{$prefix}card-cap-color: #{$card-cap-color}; - --#{$prefix}card-height: #{$card-height}; - --#{$prefix}card-color: #{$card-color}; - --#{$prefix}card-bg: #{$card-bg}; - --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding}; - --#{$prefix}card-group-margin: #{$card-group-margin}; - // scss-docs-end card-css-vars - - position: relative; - display: flex; - flex-direction: column; - min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 - height: var(--#{$prefix}card-height); - color: var(--#{$prefix}body-color); - word-wrap: break-word; - background-color: var(--#{$prefix}card-bg); - background-clip: border-box; - border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - @include border-radius(var(--#{$prefix}card-border-radius)); - @include box-shadow(var(--#{$prefix}card-box-shadow)); - - > hr { - margin-right: 0; - margin-left: 0; - } - - > .list-group { - border-top: inherit; - border-bottom: inherit; - - &:first-child { - border-top-width: 0; - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); - } - - &:last-child { - border-bottom-width: 0; - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); - } - } - - // Due to specificity of the above selector (`.card > .list-group`), we must - // use a child selector here to prevent double borders. - > .card-header + .list-group, - > .list-group + .card-footer { - border-top: 0; - } -} - -.card-body { - // Enable `flex-grow: 1` for decks and groups so that card blocks take up - // as much space as possible, ensuring footers are aligned to the bottom. - flex: 1 1 auto; - padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x); - color: var(--#{$prefix}card-color); -} - -.card-title { - margin-bottom: var(--#{$prefix}card-title-spacer-y); - color: var(--#{$prefix}card-title-color); -} - -.card-subtitle { - margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list - margin-bottom: 0; - color: var(--#{$prefix}card-subtitle-color); -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link { - &:hover { - text-decoration: if($link-hover-decoration == underline, none, null); - } - - + .card-link { - margin-left: var(--#{$prefix}card-spacer-x); - } -} - -// -// Optional textual caps -// - -.card-header { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - margin-bottom: 0; // Removes the default margin-bottom of - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:first-child { - @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0); - } -} - -.card-footer { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:last-child { - @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius)); - } -} - - -// -// Header navs -// - -.card-header-tabs { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - border-bottom: 0; - - .nav-link.active { - background-color: var(--#{$prefix}card-bg); - border-bottom-color: var(--#{$prefix}card-bg); - } -} - -.card-header-pills { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list -} - -// Card image -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: var(--#{$prefix}card-img-overlay-padding); - @include border-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch -} - -.card-img, -.card-img-top { - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-bottom { - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); -} - - -// -// Card groups -// - -.card-group { - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - margin-bottom: var(--#{$prefix}card-group-margin); - } - - @include media-breakpoint-up(sm) { - display: flex; - flex-flow: row wrap; - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - flex: 1 0 0; - margin-bottom: 0; - - + .card { - margin-left: 0; - border-left: 0; - } - - // Handle rounded corners - @if $enable-rounded { - &:not(:last-child) { - @include border-end-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-right-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-right-radius: 0; - } - } - - &:not(:first-child) { - @include border-start-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-left-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-left-radius: 0; - } - } - } - } - } -} diff --git a/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_carousel.scss b/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_carousel.scss deleted file mode 100644 index 5ebf6b1..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_carousel.scss +++ /dev/null @@ -1,226 +0,0 @@ -// Notes on the classes: -// -// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) -// even when their scroll action started on a carousel, but for compatibility (with Firefox) -// we're preventing all actions instead -// 2. The .carousel-item-start and .carousel-item-end is used to indicate where -// the active slide is heading. -// 3. .active.carousel-item is the current slide. -// 4. .active.carousel-item-start and .active.carousel-item-end is the current -// slide in its in-transition state. Only one of these occurs at a time. -// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end -// is the upcoming slide in transition. - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; - @include clearfix(); -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - @include transition($carousel-transition); -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); -} - - -// -// Alternate transitions -// - -.carousel-fade { - .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; - } - - .carousel-item.active, - .carousel-item-next.carousel-item-start, - .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; - } - - .active.carousel-item-start, - .active.carousel-item-end { - z-index: 0; - opacity: 0; - @include transition(opacity 0s $carousel-transition-duration); - } -} - - -// -// Left/right controls for nav -// - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - // Use flex for alignment (1-3) - display: flex; // 1. allow flex styles - align-items: center; // 2. vertically center contents - justify-content: center; // 3. horizontally center contents - width: $carousel-control-width; - padding: 0; - color: $carousel-control-color; - text-align: center; - background: none; - filter: var(--#{$prefix}carousel-control-icon-filter); - border: 0; - opacity: $carousel-control-opacity; - @include transition($carousel-control-transition); - - // Hover/focus state - &:hover, - &:focus { - color: $carousel-control-color; - text-decoration: none; - outline: 0; - opacity: $carousel-control-hover-opacity; - } -} -.carousel-control-prev { - left: 0; - background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); -} -.carousel-control-next { - right: 0; - background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); -} - -// Icons for within -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: $carousel-control-icon-width; - height: $carousel-control-icon-width; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; -} - -.carousel-control-prev-icon { - background-image: escape-svg($carousel-control-prev-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-next-icon-bg) + "*/"}; -} -.carousel-control-next-icon { - background-image: escape-svg($carousel-control-next-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-prev-icon-bg) + "*/"}; -} - -// Optional indicator pips/controls -// -// Add a container (such as a list) with the following class and add an item (ideally a focusable control, -// like a button) with data-bs-target for each slide your carousel holds. - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - // Use the .carousel-control's width as margin so we don't overlay those - margin-right: $carousel-control-width; - margin-bottom: 1rem; - margin-left: $carousel-control-width; - - [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: $carousel-indicator-width; - height: $carousel-indicator-height; - padding: 0; - margin-right: $carousel-indicator-spacer; - margin-left: $carousel-indicator-spacer; - text-indent: -999px; - cursor: pointer; - background-color: var(--#{$prefix}carousel-indicator-active-bg); - background-clip: padding-box; - border: 0; - // Use transparent borders to increase the hit area by 10px on top and bottom. - border-top: $carousel-indicator-hit-area-height solid transparent; - border-bottom: $carousel-indicator-hit-area-height solid transparent; - opacity: $carousel-indicator-opacity; - @include transition($carousel-indicator-transition); - } - - .active { - opacity: $carousel-indicator-active-opacity; - } -} - - -// Optional captions -// -// - -.carousel-caption { - position: absolute; - right: (100% - $carousel-caption-width) * .5; - bottom: $carousel-caption-spacer; - left: (100% - $carousel-caption-width) * .5; - padding-top: $carousel-caption-padding-y; - padding-bottom: $carousel-caption-padding-y; - color: var(--#{$prefix}carousel-caption-color); - text-align: center; -} - -// Dark mode carousel - -@mixin carousel-dark() { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg-dark}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color-dark}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter-dark}; -} - -.carousel-dark { - @include carousel-dark(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include carousel-dark(); - } -} diff --git a/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_close.scss b/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_close.scss deleted file mode 100644 index d53c96f..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_close.scss +++ /dev/null @@ -1,66 +0,0 @@ -// Transparent background and border properties included for button version. -// iOS requires the button element instead of an anchor tag. -// If you want the anchor version, it requires `href="#"`. -// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile - -.btn-close { - // scss-docs-start close-css-vars - --#{$prefix}btn-close-color: #{$btn-close-color}; - --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) }; - --#{$prefix}btn-close-opacity: #{$btn-close-opacity}; - --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity}; - --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow}; - --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity}; - --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity}; - // scss-docs-end close-css-vars - - box-sizing: content-box; - width: $btn-close-width; - height: $btn-close-height; - padding: $btn-close-padding-y $btn-close-padding-x; - color: var(--#{$prefix}btn-close-color); - background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements - filter: var(--#{$prefix}btn-close-filter); - border: 0; // for button elements - @include border-radius(); - opacity: var(--#{$prefix}btn-close-opacity); - - // Override
      's hover style - &:hover { - color: var(--#{$prefix}btn-close-color); - text-decoration: none; - opacity: var(--#{$prefix}btn-close-hover-opacity); - } - - &:focus { - outline: 0; - box-shadow: var(--#{$prefix}btn-close-focus-shadow); - opacity: var(--#{$prefix}btn-close-focus-opacity); - } - - &:disabled, - &.disabled { - pointer-events: none; - user-select: none; - opacity: var(--#{$prefix}btn-close-disabled-opacity); - } -} - -@mixin btn-close-white() { - --#{$prefix}btn-close-filter: #{$btn-close-filter-dark}; -} - -.btn-close-white { - @include btn-close-white(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}btn-close-filter: #{$btn-close-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include btn-close-white(); - } -} diff --git a/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_containers.scss b/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_containers.scss deleted file mode 100644 index 83b3138..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_containers.scss +++ /dev/null @@ -1,41 +0,0 @@ -// Container widths -// -// Set the container width, and override it for fixed navbars in media queries. - -@if $enable-container-classes { - // Single container class with breakpoint max-widths - .container, - // 100% wide container at all breakpoints - .container-fluid { - @include make-container(); - } - - // Responsive containers that are 100% wide until a breakpoint - @each $breakpoint, $container-max-width in $container-max-widths { - .container-#{$breakpoint} { - @extend .container-fluid; - } - - @include media-breakpoint-up($breakpoint, $grid-breakpoints) { - %responsive-container-#{$breakpoint} { - max-width: $container-max-width; - } - - // Extend each breakpoint which is smaller or equal to the current breakpoint - $extend-breakpoint: true; - - @each $name, $width in $grid-breakpoints { - @if ($extend-breakpoint) { - .container#{breakpoint-infix($name, $grid-breakpoints)} { - @extend %responsive-container-#{$breakpoint}; - } - - // Once the current breakpoint is reached, stop extending - @if ($breakpoint == $name) { - $extend-breakpoint: false; - } - } - } - } - } -} diff --git a/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_dropdown.scss b/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_dropdown.scss deleted file mode 100644 index 587ebb4..0000000 --- a/webseite-react-php-jwt/react-app/src/styles/libraries/bootstrap-5.3.8/_dropdown.scss +++ /dev/null @@ -1,250 +0,0 @@ -// The dropdown wrapper (`
      `) -.dropup, -.dropend, -.dropdown, -.dropstart, -.dropup-center, -.dropdown-center { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; - - // Generate the caret automatically - @include caret(); -} - -// The dropdown menu -.dropdown-menu { - // scss-docs-start dropdown-css-vars - --#{$prefix}dropdown-zindex: #{$zindex-dropdown}; - --#{$prefix}dropdown-min-width: #{$dropdown-min-width}; - --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x}; - --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y}; - --#{$prefix}dropdown-spacer: #{$dropdown-spacer}; - @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size); - --#{$prefix}dropdown-color: #{$dropdown-color}; - --#{$prefix}dropdown-bg: #{$dropdown-bg}; - --#{$prefix}dropdown-border-color: #{$dropdown-border-color}; - --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius}; - --#{$prefix}dropdown-border-width: #{$dropdown-border-width}; - --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius}; - --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg}; - --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y}; - --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow}; - --#{$prefix}dropdown-link-color: #{$dropdown-link-color}; - --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color}; - --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg}; - --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color}; - --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg}; - --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color}; - --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x}; - --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y}; - --#{$prefix}dropdown-header-color: #{$dropdown-header-color}; - --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x}; - --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y}; - // scss-docs-end dropdown-css-vars - - position: absolute; - z-index: var(--#{$prefix}dropdown-zindex); - display: none; // none by default, but block on "open" of the menu - min-width: var(--#{$prefix}dropdown-min-width); - padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x); - margin: 0; // Override default margin of ul - @include font-size(var(--#{$prefix}dropdown-font-size)); - color: var(--#{$prefix}dropdown-color); - text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) - list-style: none; - background-color: var(--#{$prefix}dropdown-bg); - background-clip: padding-box; - border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color); - @include border-radius(var(--#{$prefix}dropdown-border-radius)); - @include box-shadow(var(--#{$prefix}dropdown-box-shadow)); - - &[data-bs-popper] { - top: 100%; - left: 0; - margin-top: var(--#{$prefix}dropdown-spacer); - } - - @if $dropdown-padding-y == 0 { - > .dropdown-item:first-child, - > li:first-child .dropdown-item { - @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - > .dropdown-item:last-child, - > li:last-child .dropdown-item { - @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - - } -} - -// scss-docs-start responsive-breakpoints -// We deliberately hardcode the `bs-` prefix because we check -// this custom property in JS to determine Popper's positioning - -@each $breakpoint in map-keys($grid-breakpoints) { - @include media-breakpoint-up($breakpoint) { - $infix: breakpoint-infix($breakpoint, $grid-breakpoints); - - .dropdown-menu#{$infix}-start { - --bs-position: start; - - &[data-bs-popper] { - right: auto; - left: 0; - } - } - - .dropdown-menu#{$infix}-end { - --bs-position: end; - - &[data-bs-popper] { - right: 0; - left: auto; - } - } - } -} -// scss-docs-end responsive-breakpoints - -// Allow for dropdowns to go bottom up (aka, dropup-menu) -// Just add .dropup after the standard .dropdown class and you're set. -.dropup { - .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(up); - } -} - -.dropend { - .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(end); - &::after { - vertical-align: 0; - } - } -} - -.dropstart { - .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(start); - &::before { - vertical-align: 0; - } - } -} - - -// Dividers (basically an `
      `) within the dropdown -.dropdown-divider { - height: 0; - margin: var(--#{$prefix}dropdown-divider-margin-y) 0; - overflow: hidden; - border-top: 1px solid var(--#{$prefix}dropdown-divider-bg); - opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
      element -} - -// Links, buttons, and more within the dropdown menu -// -// `
      - - - - - - - ); -}; -export default memo(RowProduct); diff --git a/webseite-react-php/react-app/src/main.jsx b/webseite-react-php/react-app/src/main.jsx deleted file mode 100644 index 6187b22..0000000 --- a/webseite-react-php/react-app/src/main.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import { StrictMode } from 'react'; -import { createRoot } from 'react-dom/client'; -import { BrowserRouter } from 'react-router-dom'; - -// eigene separate Gestaltung mit main.scss (beinhaltet boostrap) -import './styles/main.scss'; - -import 'bootstrap'; // bootstrap JS wird über esbuild aus node_modules ausgelesen und eingebunden (bundled) - -import App from './App.jsx'; - -createRoot(document.getElementById('root')).render( - - - - - , -); diff --git a/webseite-react-php/react-app/src/pages/About.jsx b/webseite-react-php/react-app/src/pages/About.jsx deleted file mode 100644 index 6be700c..0000000 --- a/webseite-react-php/react-app/src/pages/About.jsx +++ /dev/null @@ -1,13 +0,0 @@ -const About = (props) => { - // const { } = props; - - return ( -
      -
      -

      About

      -

      Welcome to the Single-Page-Application (SPA) with React. This is the About page.

      -
      -
      - ); -}; -export default About; diff --git a/webseite-react-php/react-app/src/pages/Contact.jsx b/webseite-react-php/react-app/src/pages/Contact.jsx deleted file mode 100644 index 68ff51a..0000000 --- a/webseite-react-php/react-app/src/pages/Contact.jsx +++ /dev/null @@ -1,16 +0,0 @@ -const Contact = (props) => { - // const { } = props; - - return ( -
      -
      -

      Contact

      -

      - Lorem ipsum dolor, sit amet consectetur adipisicing elit. Iste suscipit eos autem iure soluta laboriosam in - perferendis atque explicabo, possimus eius? Ea magnam sed atque exercitationem officiis ipsum, deserunt iste. -

      -
      -
      - ); -}; -export default Contact; diff --git a/webseite-react-php/react-app/src/pages/Home.jsx b/webseite-react-php/react-app/src/pages/Home.jsx deleted file mode 100644 index ee88d61..0000000 --- a/webseite-react-php/react-app/src/pages/Home.jsx +++ /dev/null @@ -1,13 +0,0 @@ -const Home = (props) => { - // const { } = props; - - return ( -
      -
      -

      Hello, Spa!

      -

      Welcome to the Single-Page-Application (SPA) with React. This is the Home page.

      -
      -
      - ); -}; -export default Home; diff --git a/webseite-react-php/react-app/src/pages/projects/Examples.jsx b/webseite-react-php/react-app/src/pages/projects/Examples.jsx deleted file mode 100644 index d9b08c9..0000000 --- a/webseite-react-php/react-app/src/pages/projects/Examples.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import ExampleUseContext from '../../components/examples/ExampleUseContext'; -import ThemeProvider from '../../components/examples/theme-switcher/ThemeProvider'; - -const Examples = () => { - return ( -
      -
      -

      Examples

      -
      -

      useContext

      - - - -
      -
      - ); -}; -export default Examples; diff --git a/webseite-react-php/react-app/src/pages/projects/Fibonacci.jsx b/webseite-react-php/react-app/src/pages/projects/Fibonacci.jsx deleted file mode 100644 index 0bfeda6..0000000 --- a/webseite-react-php/react-app/src/pages/projects/Fibonacci.jsx +++ /dev/null @@ -1,45 +0,0 @@ -import { useState, useMemo } from 'react'; -import { FaMinus, FaPlus } from 'react-icons/fa6'; - -const Fibonacci = () => { - const [num, setNum] = useState(5); - - const fibonacci = useMemo(() => { - console.log('Fibonacci number is being calculated...'); - function fib(n) { - // Define a recursive function within the callback - if (n <= 1) { - return n; - } - return fib(n - 1) + fib(n - 2); - } - return fib(num); // Call the inner function - }, [num]); - - return ( -
      -
      -
      - - {num} - -
      -

      - The {num}th Fibonacci number is: {fibonacci} -

      -
      -
      - ); -}; - -export default Fibonacci; diff --git a/webseite-react-php/react-app/src/pages/projects/TableProducts.jsx b/webseite-react-php/react-app/src/pages/projects/TableProducts.jsx deleted file mode 100644 index 37f60fb..0000000 --- a/webseite-react-php/react-app/src/pages/projects/TableProducts.jsx +++ /dev/null @@ -1,36 +0,0 @@ -import { useEffect, useState } from 'react'; -import axios from 'axios'; - -import Table from '../../components/tables/TableProducts'; - -const TableProducts = (props) => { - // const { } = props; - - const [items, setItems] = useState([]); - - useEffect(() => { - const getItems = async () => { - const { data } = await axios.get('/data/nerdshop-products.json'); - setItems(data); - }; - getItems(); - - // axios.get('/data/nerdshop-products.json').then((res) => { - // // console.log(res.data); - // setItems(res.data); - // }); - - return () => {}; - }, []); - - return ( -
      -
      -

      Table products

      -

      A inventory table of products

      -
      - {items.length > 0 &&
      ` alignment by inheriting `text-align`. -// 3. Fix alignment for Safari - -th { - font-weight: $table-th-font-weight; // 1 - text-align: inherit; // 2 - text-align: -webkit-match-parent; // 3 -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - - -// Forms -// -// 1. Allow labels to use `margin` for spacing. - -label { - display: inline-block; // 1 -} - -// Remove the default `border-radius` that macOS Chrome adds. -// See https://github.com/twbs/bootstrap/issues/24093 - -button { - // stylelint-disable-next-line property-disallowed-list - border-radius: 0; -} - -// Explicitly remove focus outline in Chromium when it shouldn't be -// visible (e.g. as result of mouse click or touch tap). It already -// should be doing this automatically, but seems to currently be -// confused and applies its very visible two-tone outline anyway. - -button:focus:not(:focus-visible) { - outline: 0; -} - -// 1. Remove the margin in Firefox and Safari - -input, -button, -select, -optgroup, -textarea { - margin: 0; // 1 - font-family: inherit; - @include font-size(inherit); - line-height: inherit; -} - -// Remove the inheritance of text transform in Firefox -button, -select { - text-transform: none; -} -// Set the cursor for non-` - )} - {currentStep < totalSteps && ( - - )} - {currentStep === totalSteps && ( - - )} - - ); -} - -export default NavigationButtons; diff --git a/06_js-debug/projects/debugging-multi-step-form-template/src/components/ProgressIndicator.jsx b/06_js-debug/projects/debugging-multi-step-form-template/src/components/ProgressIndicator.jsx deleted file mode 100644 index 8359817..0000000 --- a/06_js-debug/projects/debugging-multi-step-form-template/src/components/ProgressIndicator.jsx +++ /dev/null @@ -1,33 +0,0 @@ -import React from 'react'; - -function ProgressIndicator({ steps, currentStep }) { - return ( -
      - {steps.map((step, index) => ( -
      -
      -
      = step.id - ? 'bg-teal-600 text-white' - : 'bg-gray-300 text-gray-700' - }`} - aria-current={currentStep === step.id ? 'step' : undefined} - > - {step.id} -
      - {index !== steps.length - 1 && ( -
      step.id ? 'bg-teal-600' : 'bg-gray-300' - }`} - >
      - )} -
      -
      - ))} -
      - ); -} - -export default ProgressIndicator; diff --git a/06_js-debug/projects/debugging-multi-step-form-template/src/index.css b/06_js-debug/projects/debugging-multi-step-form-template/src/index.css deleted file mode 100644 index b5c61c9..0000000 --- a/06_js-debug/projects/debugging-multi-step-form-template/src/index.css +++ /dev/null @@ -1,3 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/06_js-debug/projects/debugging-multi-step-form-template/src/main.jsx b/06_js-debug/projects/debugging-multi-step-form-template/src/main.jsx deleted file mode 100644 index b9a1a6d..0000000 --- a/06_js-debug/projects/debugging-multi-step-form-template/src/main.jsx +++ /dev/null @@ -1,10 +0,0 @@ -import { StrictMode } from 'react' -import { createRoot } from 'react-dom/client' -import './index.css' -import App from './App.jsx' - -createRoot(document.getElementById('root')).render( - - - , -) diff --git a/06_js-debug/projects/debugging-multi-step-form-template/src/steps/AccountInfo.jsx b/06_js-debug/projects/debugging-multi-step-form-template/src/steps/AccountInfo.jsx deleted file mode 100644 index 5abdb13..0000000 --- a/06_js-debug/projects/debugging-multi-step-form-template/src/steps/AccountInfo.jsx +++ /dev/null @@ -1,60 +0,0 @@ -import FormInput from '../components/FormInput'; - -function AccountInfo({ formData, handleChange, errors }) { - return ( -
      -

      - Welcome to BrightPath Wellness! -

      -

      - Let’s create your account and begin your wellness journey. -

      - -
      - -
      - -
      - -
      - -
      - -
      -
      - ); -} - -export default AccountInfo; diff --git a/06_js-debug/projects/debugging-multi-step-form-template/src/steps/ActivityInfo.jsx b/06_js-debug/projects/debugging-multi-step-form-template/src/steps/ActivityInfo.jsx deleted file mode 100644 index 92c2736..0000000 --- a/06_js-debug/projects/debugging-multi-step-form-template/src/steps/ActivityInfo.jsx +++ /dev/null @@ -1,45 +0,0 @@ -import FormSelect from '../components/FormSelect'; - -function ActivityInfo({ handleChange, errors }) { - return ( -
      -

      Activity & Energy

      -

      - Tell us a little about your activity level and energy. -

      - -
      - -
      - -
      - -
      -
      - ); -} - -export default ActivityInfo; diff --git a/06_js-debug/projects/debugging-multi-step-form-template/src/steps/GoalSetting.jsx b/06_js-debug/projects/debugging-multi-step-form-template/src/steps/GoalSetting.jsx deleted file mode 100644 index 10889cf..0000000 --- a/06_js-debug/projects/debugging-multi-step-form-template/src/steps/GoalSetting.jsx +++ /dev/null @@ -1,65 +0,0 @@ -import FormSelect from '../components/FormSelect'; -import FormCheckboxes from '../components/FormCheckboxes'; - -function GoalSetting({ formData, handleChange, handleCheckboxChange, errors }) { - return ( -
      -

      Activity & Energy

      -

      - Tell us a little about your activity level and energy. -

      - -
      - handleCheckboxChange('goals', id)} - required={true} - error={errors.goals} - /> -
      - -
      - -
      -
      - ); -} - -export default GoalSetting; diff --git a/06_js-debug/projects/debugging-multi-step-form-template/src/utils/validation.js b/06_js-debug/projects/debugging-multi-step-form-template/src/utils/validation.js deleted file mode 100644 index 99c87f7..0000000 --- a/06_js-debug/projects/debugging-multi-step-form-template/src/utils/validation.js +++ /dev/null @@ -1,96 +0,0 @@ -const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; -const PASSWORD_MIN_LENGTH = 6; - -// Helper Functions -export const isEmpty = (value) => { - return !value || !value.trim(); -}; - -export const isValidEmail = (email) => { - return EMAIL_REGEX.test(email); -}; - -export const hasMinLength = (value, min) => { - return value.length >= min; -}; - -export const hasTwoWords = (fullName) => { - return fullName.trim().split(' ').length >= 2; -}; - -// Main Validation Function -export const validate = (formData, currentStep) => { - const errors = {}; - - const { - fullName, - email, - password, - activityLevel, - energyLevel, - goals, - timeCommitment, - } = formData; - - switch (currentStep) { - case 1: - // Full Name Validations - if (isEmpty(fullName)) { - errors.fullName = 'Full Name is required'; - } else if (!hasTwoWords(fullName)) { - errors.fullName = 'Full Name must contain at least two words'; - } - - // Email Validations - if (isEmpty(email)) { - errors.email = 'Email is required'; - } else if (!isValidEmail(email)) { - errors.email = 'Email address is invalid'; - } - - // Password Validations - if (isEmpty(password)) { - errors.password = 'Password is required'; - } else { - if (!hasMinLength(password, PASSWORD_MIN_LENGTH)) { - errors.password = `Password must be at least ${PASSWORD_MIN_LENGTH} characters`; - } - } - break; - - case 2: - // Activity Level Validation - if (isEmpty(activityLevel)) { - errors.activityLevel = 'Activity Level is required'; - } - - // Energy Level Validation - if (isEmpty(energyLevel)) { - errors.energyLevel = 'Energy Level is required'; - } - break; - - case 3: - // Goals Validation - if (!Array.isArray(goals) || goals.length === 0) { - errors.goals = 'At least one goal is required'; - } else { - goals.forEach((goal, index) => { - if (isEmpty(goal)) { - errors[`goals.${index}`] = 'Goal cannot be empty'; - } - }); - } - - // Time Commitment Validation - if (isEmpty(timeCommitment)) { - errors.timeCommitment = 'Time Commitment is required'; - } - break; - - default: - break; - } - - return errors; -}; diff --git a/06_js-debug/projects/debugging-multi-step-form-template/tailwind.config.js b/06_js-debug/projects/debugging-multi-step-form-template/tailwind.config.js deleted file mode 100644 index 2a7e626..0000000 --- a/06_js-debug/projects/debugging-multi-step-form-template/tailwind.config.js +++ /dev/null @@ -1,10 +0,0 @@ -import forms from '@tailwindcss/forms'; - -/** @type {import('tailwindcss').Config} */ -export default { - content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'], - theme: { - extend: {}, - }, - plugins: [forms], -}; diff --git a/06_js-debug/projects/debugging-multi-step-form-template/tests/validation/step1.test.jsx b/06_js-debug/projects/debugging-multi-step-form-template/tests/validation/step1.test.jsx deleted file mode 100644 index 0aed95e..0000000 --- a/06_js-debug/projects/debugging-multi-step-form-template/tests/validation/step1.test.jsx +++ /dev/null @@ -1,125 +0,0 @@ -import { it, expect, describe, afterEach } from 'vitest'; -import { render, screen, cleanup } from '@testing-library/react'; -import '@testing-library/jest-dom/vitest'; -import userEvent from '@testing-library/user-event'; - -import AccountInfo from '../../src/steps/AccountInfo'; -import { validate } from '../../src/utils/validation'; - -describe('AccountInfo Component', () => { - afterEach(cleanup); - - const step = 1; - - it('renders all form fields', () => { - render( - {}} - errors={{}} - /> - ); - - expect(screen.getByLabelText(/Full Name/i)).toBeInTheDocument(); - expect(screen.getByLabelText(/Email/i)).toBeInTheDocument(); - expect(screen.getByLabelText(/Password/i)).toBeInTheDocument(); - }); - - it('displays validation errors for invalid data', () => { - const formData = { fullName: '', email: '', password: '' }; - const errors = validate(formData, step); - - render( - {}} - errors={errors} - /> - ); - - expect(screen.getByText(/Full Name is required/i)).toBeInTheDocument(); - expect(screen.getByText(/Email is required/i)).toBeInTheDocument(); - expect(screen.getByText(/Password is required/i)).toBeInTheDocument(); - }); - - it('displays no validation errors for valid data', () => { - const formData = { - fullName: 'John Doe', - email: 'john.doe@example.com', - password: 'securepassword', - }; - const errors = validate(formData, step); - - render( - {}} - errors={errors} - /> - ); - - expect(screen.queryByText(/is required/i)).not.toBeInTheDocument(); - expect(screen.queryByText(/invalid/i)).not.toBeInTheDocument(); - expect( - screen.queryByText(/must be at least 6 characters/i) - ).not.toBeInTheDocument(); - }); - - it('calls handleChange and updates error messages dynamically', async () => { - let formData = { fullName: '', email: '', password: '' }; - let errors = validate(formData, step); - - const handleChangeTest = (field, value) => { - formData = { ...formData, [field]: value }; - errors = validate(formData, step); - }; - - const { rerender } = render( - - handleChangeTest(target.name, target.value) - } - errors={errors} - /> - ); - - const fullNameInput = screen.getByLabelText(/Full Name/i); - await userEvent.type(fullNameInput, 'John'); - - rerender( - - handleChangeTest(target.name, target.value) - } - errors={errors} - /> - ); - - expect( - screen.getByText(/Full Name must contain at least two words/i) - ).toBeInTheDocument(); - }); - - it('retains user input in form fields', () => { - const formData = { - fullName: 'Jane Doe', - email: 'jane.doe@example.com', - password: 'securepassword', - }; - const errors = validate(formData, step); - - render( - {}} - errors={errors} - /> - ); - - expect(screen.getByLabelText(/Full Name/i)).toHaveValue('Jane Doe'); - expect(screen.getByLabelText(/Email/i)).toHaveValue('jane.doe@example.com'); - expect(screen.getByLabelText(/Password/i)).toHaveValue('securepassword'); - }); -}); diff --git a/06_js-debug/projects/debugging-multi-step-form-template/tests/validation/step2.test.jsx b/06_js-debug/projects/debugging-multi-step-form-template/tests/validation/step2.test.jsx deleted file mode 100644 index 7505148..0000000 --- a/06_js-debug/projects/debugging-multi-step-form-template/tests/validation/step2.test.jsx +++ /dev/null @@ -1,114 +0,0 @@ -import { it, expect, describe, afterEach } from 'vitest'; -import { render, screen, cleanup } from '@testing-library/react'; -import '@testing-library/jest-dom/vitest'; -import userEvent from '@testing-library/user-event'; - -import ActivityInfo from '../../src/steps/ActivityInfo'; -import { validate } from '../../src/utils/validation'; - -describe('ActivityInfo Component', () => { - afterEach(cleanup); - - const step = 2; - - it('renders all form fields', () => { - render( {}} errors={{}} />); - - expect( - screen.getByLabelText(/How often do you exercise\?/i) - ).toBeInTheDocument(); - expect( - screen.getByLabelText( - /How would you describe your average energy level\?/i - ) - ).toBeInTheDocument(); - }); - - it('displays validation errors for invalid data', () => { - const formData = { - fullName: 'John Doe', - email: 'john@example.com', - password: 'password123', - activityLevel: '', - energyLevel: '', - goals: [], - timeCommitment: '15', - }; - const errors = validate(formData, step); - - render( {}} errors={errors} />); - - expect(screen.getByText(/Activity Level is required/i)).toBeInTheDocument(); - expect(screen.getByText(/Energy Level is required/i)).toBeInTheDocument(); - }); - - it('displays no validation errors for valid data', () => { - const formData = { - fullName: 'John Doe', - email: 'john@example.com', - password: 'password123', - activityLevel: 'moderate', - energyLevel: 'high', - goals: [], - timeCommitment: '15', - }; - const errors = validate(formData, step); - - render( {}} errors={errors} />); - - expect(screen.queryByText(/is required/i)).not.toBeInTheDocument(); - }); - - it('calls handleChange and updates error messages dynamically', async () => { - let formData = { - fullName: 'John Doe', - email: 'john@example.com', - password: 'password123', - activityLevel: '', - energyLevel: '', - goals: [], - timeCommitment: '15', - }; - let errors = validate(formData, step); - - const handleChangeTest = (field, value) => { - formData = { ...formData, [field]: value }; - errors = validate(formData, step); - }; - - const { rerender } = render( - - handleChangeTest(target.name, target.value) - } - errors={errors} - /> - ); - - const activitySelect = screen.getByLabelText( - /How often do you exercise\?/i - ); - const energySelect = screen.getByLabelText( - /How would you describe your average energy level\?/i - ); - - await userEvent.selectOptions(activitySelect, '3+ times a week'); - await userEvent.selectOptions(energySelect, 'medium'); - - rerender( - - handleChangeTest(target.name, target.value) - } - errors={errors} - /> - ); - - expect( - screen.queryByText(/Activity Level is required/i) - ).not.toBeInTheDocument(); - expect( - screen.queryByText(/Energy Level is required/i) - ).not.toBeInTheDocument(); - }); -}); diff --git a/06_js-debug/projects/debugging-multi-step-form-template/tests/validation/step3.test.jsx b/06_js-debug/projects/debugging-multi-step-form-template/tests/validation/step3.test.jsx deleted file mode 100644 index 9f18107..0000000 --- a/06_js-debug/projects/debugging-multi-step-form-template/tests/validation/step3.test.jsx +++ /dev/null @@ -1,139 +0,0 @@ -import { it, expect, describe, afterEach } from 'vitest'; -import { render, screen, cleanup } from '@testing-library/react'; -import '@testing-library/jest-dom/vitest'; -import userEvent from '@testing-library/user-event'; - -import GoalSetting from '../../src/steps/GoalSetting'; -import { validate } from '../../src/utils/validation'; - -describe('GoalSetting Component', () => { - afterEach(cleanup); - - const step = 3; - - it('renders all form fields', () => { - render( - {}} - handleCheckboxChange={() => {}} - errors={{}} - />, - ); - - // Use getByRole to target the fieldset for "What are your goals?" - expect(screen.getByRole('group', { name: /What are your goals\?/i })).toBeInTheDocument(); - - expect(screen.getByLabelText(/How much time can you commit each day\?/i)).toBeInTheDocument(); - }); - - it('displays validation errors for empty fields', () => { - const formData = { - goals: [], - timeCommitment: '', - }; - const errors = validate(formData, step); - - render( {}} handleCheckboxChange={() => {}} errors={errors} />); - - expect(screen.getByText(/At least one goal is required/i)).toBeInTheDocument(); - expect(screen.getByText(/Time Commitment is required/i)).toBeInTheDocument(); - }); - - it('displays no validation errors for valid data', () => { - const formData = { - goals: ['weightLoss', 'muscleGain'], - timeCommitment: '30', - }; - const errors = validate(formData, step); - - render( {}} handleCheckboxChange={() => {}} errors={errors} />); - - expect(screen.queryByText(/is required/i)).not.toBeInTheDocument(); - }); - - it('handles checkbox interactions and updates goals dynamically', async () => { - let formData = { goals: [], timeCommitment: '' }; - let errors = validate(formData, step); - - const handleCheckboxChangeTest = (field, id, isChecked) => { - const updatedGoals = isChecked ? [...formData[field], id] : formData[field].filter((goal) => goal !== id); - - formData = { ...formData, [field]: updatedGoals }; - errors = validate(formData, step); - }; - - const { rerender } = render( - {}} - handleCheckboxChange={handleCheckboxChangeTest} - errors={errors} - />, - ); - - const weightLossCheckbox = screen.getByLabelText(/Weight Loss/i); - const muscleGainCheckbox = screen.getByLabelText(/Muscle Gain/i); - - await userEvent.click(weightLossCheckbox); - rerender( - {}} - handleCheckboxChange={handleCheckboxChangeTest} - errors={errors} - />, - ); - - expect(weightLossCheckbox).toBeChecked(); - expect(screen.queryByText(/At least one goal is required/i)).not.toBeInTheDocument(); - - await userEvent.click(muscleGainCheckbox); - rerender( - {}} - handleCheckboxChange={handleCheckboxChangeTest} - errors={errors} - />, - ); - - expect(muscleGainCheckbox).toBeChecked(); - expect(formData.goals).toContain('weightLoss'); - expect(formData.goals).toContain('muscleGain'); - }); - - it('handles select interactions and updates time commitment dynamically', async () => { - let formData = { goals: ['weightLoss'], timeCommitment: '' }; - let errors = validate(formData, step); - - const handleChangeTest = (field, value) => { - formData = { ...formData, [field]: value }; - errors = validate(formData, step); - }; - - const { rerender } = render( - handleChangeTest(target.name, target.value)} - handleCheckboxChange={() => {}} - errors={errors} - />, - ); - - const timeCommitmentSelect = screen.getByLabelText(/How much time can you commit each day\?/i); - await userEvent.selectOptions(timeCommitmentSelect, '30'); - - rerender( - handleChangeTest(target.name, target.value)} - handleCheckboxChange={() => {}} - errors={errors} - />, - ); - - expect(timeCommitmentSelect).toHaveValue('30'); - expect(screen.queryByText(/Time Commitment is required/i)).not.toBeInTheDocument(); - }); -}); diff --git a/06_js-debug/projects/debugging-multi-step-form-template/tests/validation/utility.test.js b/06_js-debug/projects/debugging-multi-step-form-template/tests/validation/utility.test.js deleted file mode 100644 index 6c3b9cd..0000000 --- a/06_js-debug/projects/debugging-multi-step-form-template/tests/validation/utility.test.js +++ /dev/null @@ -1,58 +0,0 @@ -import { describe, it, expect } from 'vitest'; -import { - isEmpty, - isValidEmail, - hasMinLength, - hasTwoWords, -} from '../../src/utils/validation'; - -describe('Utility Functions', () => { - describe('isEmpty', () => { - it('should return true for empty strings', () => { - expect(isEmpty('')).toBe(true); - expect(isEmpty(' ')).toBe(true); - }); - - it('should return false for non-empty strings', () => { - expect(isEmpty('John')).toBe(false); - expect(isEmpty(' John Doe ')).toBe(false); - }); - }); - - describe('isValidEmail', () => { - it('should validate correct email formats', () => { - expect(isValidEmail('john@example.com')).toBe(true); - expect(isValidEmail('jane.doe@sub.domain.co')).toBe(true); - }); - - it('should invalidate incorrect email formats', () => { - expect(isValidEmail('johnexample.com')).toBe(false); - expect(isValidEmail('jane@.com')).toBe(false); - expect(isValidEmail('jane@com')).toBe(false); - }); - }); - - describe('hasMinLength', () => { - it('should return true if value meets minimum length', () => { - expect(hasMinLength('password', 6)).toBe(true); - expect(hasMinLength('123456', 6)).toBe(true); - }); - - it('should return false if value does not meet minimum length', () => { - expect(hasMinLength('pass', 6)).toBe(false); - expect(hasMinLength('123', 6)).toBe(false); - }); - }); - - describe('hasTwoWords', () => { - it('should return true if fullName has at least two words', () => { - expect(hasTwoWords('John Doe')).toBe(true); - expect(hasTwoWords('Jane Mary Doe')).toBe(true); - }); - - it('should return false if fullName has less than two words', () => { - expect(hasTwoWords('John')).toBe(false); - expect(hasTwoWords(' Jane ')).toBe(false); - }); - }); -}); diff --git a/06_js-debug/projects/debugging-multi-step-form-template/vite.config.js b/06_js-debug/projects/debugging-multi-step-form-template/vite.config.js deleted file mode 100644 index 7d0be13..0000000 --- a/06_js-debug/projects/debugging-multi-step-form-template/vite.config.js +++ /dev/null @@ -1,11 +0,0 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' - -// #region agent log -fetch('http://127.0.0.1:7399/ingest/04244453-f432-4f3b-ade1-92bbdb574a0e',{method:'POST',headers:{'Content-Type':'application/json','X-Debug-Session-Id':'a04de5'},body:JSON.stringify({sessionId:'a04de5',runId:'post-fix',hypothesisId:'H3',location:'vite.config.js',message:'vite config loaded',data:{hasReactPlugin:true},timestamp:Date.now()})}).catch(()=>{}); -// #endregion - -// https://vite.dev/config/ -export default defineConfig({ - plugins: [react()], -}) diff --git a/06_js-debug/projects/debugging-multi-step-form-template/vitest.config.js b/06_js-debug/projects/debugging-multi-step-form-template/vitest.config.js deleted file mode 100644 index 5853726..0000000 --- a/06_js-debug/projects/debugging-multi-step-form-template/vitest.config.js +++ /dev/null @@ -1,9 +0,0 @@ -import { defineConfig } from 'vitest/config'; -import react from '@vitejs/plugin-react'; - -export default defineConfig({ - test: { - environment: 'jsdom', - }, - plugins: [react()], -}); diff --git a/06_js-debug/uebungen/u01_bibverwaltung/index.html b/06_js-debug/uebungen/u01_bibverwaltung/index.html deleted file mode 100644 index 5ca7b90..0000000 --- a/06_js-debug/uebungen/u01_bibverwaltung/index.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - Exercise: Nested If-Statements - - -

      Exercise: Nested If-Statements

      - - - - diff --git a/06_js-debug/uebungen/u01_bibverwaltung/solution.html b/06_js-debug/uebungen/u01_bibverwaltung/solution.html deleted file mode 100644 index e9483db..0000000 --- a/06_js-debug/uebungen/u01_bibverwaltung/solution.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - Exercise: Nested If-Statements - - -

      Exercise: Nested If-Statements

      - - - - diff --git a/06_js-debug/uebungen/u02_extraction/index.html b/06_js-debug/uebungen/u02_extraction/index.html deleted file mode 100644 index 5ca7b90..0000000 --- a/06_js-debug/uebungen/u02_extraction/index.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - Exercise: Nested If-Statements - - -

      Exercise: Nested If-Statements

      - - - - diff --git a/06_js-debug/uebungen/u02_extraction/solution.html b/06_js-debug/uebungen/u02_extraction/solution.html deleted file mode 100644 index 9b18945..0000000 --- a/06_js-debug/uebungen/u02_extraction/solution.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - Exercise: Extracted Library Operations - - -

      Exercise: Extracted Library Operations

      - - - - diff --git a/06_js-debug/uebungen/u03_dry/index.html b/06_js-debug/uebungen/u03_dry/index.html deleted file mode 100644 index 8c49d10..0000000 --- a/06_js-debug/uebungen/u03_dry/index.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - Exercise: Don't Repeat Yourself (DRY) - - -

      Exercise: Don't Repeat Yourself (DRY)

      - - - - diff --git a/06_js-debug/uebungen/u03_dry/solution.html b/06_js-debug/uebungen/u03_dry/solution.html deleted file mode 100644 index da183ed..0000000 --- a/06_js-debug/uebungen/u03_dry/solution.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - Exercise: Don't Repeat Yourself (DRY) - - -

      Exercise: Don't Repeat Yourself (DRY)

      -

      - In dieser Übung überarbeitest du einen Teil des Codes nach dem DRY-Prinzip (Don't Repeat Yourself). Du arbeitest - mit einem Skript, das Wetterberichte für mehrere Städte protokolliert, einschließlich zusätzlicher Wetterdaten wie - der Windgeschwindigkeit. Deine Aufgabe ist es, Code-Wiederholungen zu vermeiden, indem du Arrays, Schleifen und - Funktionen verwendest. Erstelle eine zusätzliche formatWeatherReport(report) Funktion, die ein - Wetterberichtsobjekt als Parameter annimmt. Sie sollte einen formatierten Wetterberichtstring zurückgeben. -

      - - - - diff --git a/06_js-debug/uebungen/u04_dry-benutzerzugang/index.html b/06_js-debug/uebungen/u04_dry-benutzerzugang/index.html deleted file mode 100644 index 147d1a1..0000000 --- a/06_js-debug/uebungen/u04_dry-benutzerzugang/index.html +++ /dev/null @@ -1,246 +0,0 @@ - - - - - - Advanced If-Else Statements (Enhanced Nesting) - - -

      Advanced If-Else Statements (Enhanced Nesting)

      - - - - diff --git a/06_js-debug/uebungen/u04_dry-benutzerzugang/solution.html b/06_js-debug/uebungen/u04_dry-benutzerzugang/solution.html deleted file mode 100644 index 9f22c20..0000000 --- a/06_js-debug/uebungen/u04_dry-benutzerzugang/solution.html +++ /dev/null @@ -1,295 +0,0 @@ - - - - - - Advanced If-Else Statements (Enhanced Nesting) - - - -
      -
      -

      Advanced If-Else Statements (Enhanced Nesting)

      -
      -
      - - - diff --git a/06_js-debug/uebungen/u05_error-format-date/index.html b/06_js-debug/uebungen/u05_error-format-date/index.html deleted file mode 100644 index 6b5b78a..0000000 --- a/06_js-debug/uebungen/u05_error-format-date/index.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - Übung 05: FormatDate Fehler - - - -
      -
      -

      Übung 05: FormatDate Fehler

      -
      -
      - - - diff --git a/06_js-debug/uebungen/u05_error-format-date/solution.html b/06_js-debug/uebungen/u05_error-format-date/solution.html deleted file mode 100644 index b48e0f6..0000000 --- a/06_js-debug/uebungen/u05_error-format-date/solution.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - Übung 05: FormatDate Fehler - - - -
      -
      -

      Übung 05: FormatDate Fehler

      -
      -
      - - - diff --git a/06_js-debug/uebungen/u06_error-benutzer/index.html b/06_js-debug/uebungen/u06_error-benutzer/index.html deleted file mode 100644 index d579592..0000000 --- a/06_js-debug/uebungen/u06_error-benutzer/index.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - Übung 6: Benutzer erstellen - - - -
      -
      -

      Übung 6: Benutzer erstellen

      -
      -
      - - - diff --git a/06_js-debug/uebungen/u06_error-benutzer/solution.html b/06_js-debug/uebungen/u06_error-benutzer/solution.html deleted file mode 100644 index 086754f..0000000 --- a/06_js-debug/uebungen/u06_error-benutzer/solution.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - Übung 6: Benutzer erstellen - - - -
      -
      -

      Übung 6: Benutzer erstellen

      -
      -
      - - - diff --git a/06_js-debug/uebungen/u07_check-temperature/index.html b/06_js-debug/uebungen/u07_check-temperature/index.html deleted file mode 100644 index 6e37278..0000000 --- a/06_js-debug/uebungen/u07_check-temperature/index.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - Übung 7: checkTemperature Fehler - - - -
      -
      -

      Übung 7: checkTemperature Fehler

      -

      Versuche, den Code auszuführen, den Fehler zu identifizieren und ihn zu beheben.

      -
      -
      - - - diff --git a/06_js-debug/uebungen/u07_check-temperature/solution.html b/06_js-debug/uebungen/u07_check-temperature/solution.html deleted file mode 100644 index bdfb01d..0000000 --- a/06_js-debug/uebungen/u07_check-temperature/solution.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - Übung 7: checkTemperature Fehler - - - -
      -
      -

      Übung 7: checkTemperature Fehler

      -

      Versuche, den Code auszuführen, den Fehler zu identifizieren und ihn zu beheben.

      -
      -
      - - - diff --git a/06_js-debug/uebungen/u08_benutzer-anzeigen/index.html b/06_js-debug/uebungen/u08_benutzer-anzeigen/index.html deleted file mode 100644 index ab63182..0000000 --- a/06_js-debug/uebungen/u08_benutzer-anzeigen/index.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - Übung 8: Benutzer anzeigen - - - -
      -
      -

      Übung 8: Benutzer anzeigen

      -

      - Der folgende Code enthält mehrere Referenzfehler, die über verschiedene Teile des Codes verteilt sind. Deine - Aufgabe ist es, alle Referenzfehler zu identifizieren und zu beheben, um sicherzustellen, dass der Code - korrekt läuft. -

      -
      -
      - - - diff --git a/06_js-debug/uebungen/u08_benutzer-anzeigen/solution.html b/06_js-debug/uebungen/u08_benutzer-anzeigen/solution.html deleted file mode 100644 index d165475..0000000 --- a/06_js-debug/uebungen/u08_benutzer-anzeigen/solution.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - Übung 8: Benutzer anzeigen - - - -
      -
      -

      Übung 8: Benutzer anzeigen

      -

      - Der folgende Code enthält mehrere Referenzfehler, die über verschiedene Teile des Codes verteilt sind. Deine - Aufgabe ist es, alle Referenzfehler zu identifizieren und zu beheben, um sicherzustellen, dass der Code - korrekt läuft. -

      -
      -
      - - - diff --git a/06_js-debug/uebungen/u09_parse-user-data/index.html b/06_js-debug/uebungen/u09_parse-user-data/index.html deleted file mode 100644 index 0d4a6b4..0000000 --- a/06_js-debug/uebungen/u09_parse-user-data/index.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - Übung 9: parseUserData Fehler - - - -
      -
      -

      Übung 9: parseUserData Fehler

      -

      Die Kommentare zeigen das erwartete Ergebnis.

      -
      -
      - - - diff --git a/06_js-debug/uebungen/u09_parse-user-data/solution.html b/06_js-debug/uebungen/u09_parse-user-data/solution.html deleted file mode 100644 index 2752893..0000000 --- a/06_js-debug/uebungen/u09_parse-user-data/solution.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - Übung 9: parseUserData Fehler - - - -
      -
      -

      Übung 9: parseUserData Fehler

      -

      Die Kommentare zeigen das erwartete Ergebnis.

      -
      -
      - - - diff --git a/06_js-debug/uebungen/u10_einkaufspreis/index.js b/06_js-debug/uebungen/u10_einkaufspreis/index.js deleted file mode 100644 index d140439..0000000 --- a/06_js-debug/uebungen/u10_einkaufspreis/index.js +++ /dev/null @@ -1,40 +0,0 @@ -function calculateTotalPrice(items) { - let total = 0; - items.forEach((item) => { - total += item.price; - }); - return total.toFixed(2); -} - -const shoppingCart = [ - { name: 'Laptop', price: 999.99 }, - { name: 'Smartphone', price: '599.99' }, - { name: 'Headphones', cost: 199.99 }, -]; - -const totalPrice = calculateTotalPrice(shoppingCart); -console.log('Total Price:', totalPrice); - -function displayUserProfile(user) { - console.log(`Name: ${user.name}`); - console.log(`Age: ${user.age}`); - console.log(`Email: ${user.email.toLowerCase()}`); -} - -const userProfile = { - name: 'Sarah', - age: 'twenty-five', - email: 'SARAH@EXAMPLE.COM', -}; - -displayUserProfile(userProfile); - -function getFirstItemName(items) { - return items[0].name.toUpperCase(); -} - -console.log('First Item:', getFirstItemName(shoppingCart)); // => LAPTOP - -const numberList = '1,2,3,4,5'; -const sum = numberList.reduce((acc, num) => acc + Number(num), 0); -console.log('Sum:', sum); // => 15 diff --git a/06_js-debug/uebungen/u10_einkaufspreis/solution.js b/06_js-debug/uebungen/u10_einkaufspreis/solution.js deleted file mode 100644 index ea756e4..0000000 --- a/06_js-debug/uebungen/u10_einkaufspreis/solution.js +++ /dev/null @@ -1,40 +0,0 @@ -function calculateTotalPrice(items) { - let total = 0; - items.forEach((item) => { - total += Number(item.price); // Number parsen - }); - return Number(total.toFixed(2)); -} - -const shoppingCart = [ - { name: 'Laptop', price: 999.99 }, - { name: 'Smartphone', price: 599.99 }, // string zu zahl - { name: 'Headphones', price: 199.99 }, // cost -> price -]; - -const totalPrice = calculateTotalPrice(shoppingCart); -console.log('Total Price:', Number(totalPrice).toFixed(2)); - -function displayUserProfile(user) { - console.log(`Name: ${user.name}`); - console.log(`Age: ${user.age}`); - console.log(`Email: ${user.email.toLowerCase()}`); -} - -const userProfile = { - name: 'Sarah', - age: 'twenty-five', - email: 'SARAH@EXAMPLE.COM', -}; - -displayUserProfile(userProfile); - -function getFirstItemName(items) { - return items[0].name.toUpperCase(); -} - -console.log('First Item:', getFirstItemName(shoppingCart)); // => LAPTOP - -const numberList = '1,2,3,4,5'; -const sum = numberList.split(',').reduce((acc, num) => acc + Number(num), 0); //mit split zu einem arr -console.log('Sum:', sum); // => 15 diff --git a/06_js-debug/uebungen/u11_calculate-avg-error/index.js b/06_js-debug/uebungen/u11_calculate-avg-error/index.js deleted file mode 100644 index 5f360da..0000000 --- a/06_js-debug/uebungen/u11_calculate-avg-error/index.js +++ /dev/null @@ -1,8 +0,0 @@ -function calculateAverage(numbers) { - const total = numbers.reduce((sum, num) => sum + num, 10); - const average = total / numbers; - return average; -} - -console.log(calculateAverage([10, 20, 30])); // => 20 -console.log(calculateAverage([5, 15, 25, 35])); // => 20 diff --git a/06_js-debug/uebungen/u11_calculate-avg-error/solution.js b/06_js-debug/uebungen/u11_calculate-avg-error/solution.js deleted file mode 100644 index 1f3d6b1..0000000 --- a/06_js-debug/uebungen/u11_calculate-avg-error/solution.js +++ /dev/null @@ -1,8 +0,0 @@ -function calculateAverage(numbers) { - const total = numbers.reduce((sum, num) => sum + num, 0); - const average = total / numbers.length; - return average; -} - -console.log(calculateAverage([10, 20, 30])); // => 20 -console.log(calculateAverage([5, 15, 25, 35])); // => 20 diff --git a/06_js-debug/uebungen/u12_find-maximum-error/index.js b/06_js-debug/uebungen/u12_find-maximum-error/index.js deleted file mode 100644 index 16d8a6f..0000000 --- a/06_js-debug/uebungen/u12_find-maximum-error/index.js +++ /dev/null @@ -1,14 +0,0 @@ -// logical error -function findMaximum(a, b, c) { - if (a > b && a > c) { - return a; - } else if (b > a && b > c) { - return b; - } else { - return c; - } -} - -console.log(findMaximum(1, 2, 3)); // => 3 -console.log(findMaximum(102, 59, 18)); // => 102 -console.log(findMaximum(532, 532, 345)); // => 532 diff --git a/06_js-debug/uebungen/u12_find-maximum-error/solution.js b/06_js-debug/uebungen/u12_find-maximum-error/solution.js deleted file mode 100644 index e0fd795..0000000 --- a/06_js-debug/uebungen/u12_find-maximum-error/solution.js +++ /dev/null @@ -1,40 +0,0 @@ -// logical error - -function findMaximum(a, b, c) { - if (a >= b && a >= c) { - return a; - } else if (b >= a && b >= c) { - return b; - } else { - return c; - } -} - -const findMaximum2 = (...numbers) => { - return numbers.reduce((max, current) => { - if (current > max) return current; - else return max; - }); -}; - -const findMaximum3 = (...numbers) => { - return Math.max(...numbers); -}; - -console.time('if else'); -console.log(findMaximum(1, 2, 3)); // => 3 -console.log(findMaximum(102, 59, 18)); // => 102 -console.log(findMaximum(532, 532, 345)); // => 532 -console.timeEnd('if else'); - -console.time('reduce'); -console.log(findMaximum2(1, 2, 3)); // => 3 -console.log(findMaximum2(102, 59, 18)); // => 102 -console.log(findMaximum2(532, 532, 345)); // => 532 -console.timeEnd('reduce'); - -console.time('Math.max'); -console.log(findMaximum3(1, 2, 3)); // => 3 -console.log(findMaximum3(102, 59, 18)); // => 102 -console.log(findMaximum3(532, 532, 345)); // => 532 -console.timeEnd('Math.max'); diff --git a/06_js-debug/uebungen/u13_temp-converter/assets/js/main.js b/06_js-debug/uebungen/u13_temp-converter/assets/js/main.js deleted file mode 100644 index bc6de3e..0000000 --- a/06_js-debug/uebungen/u13_temp-converter/assets/js/main.js +++ /dev/null @@ -1,47 +0,0 @@ -'use strict'; - -(() => { - // ===== DOM ===== - const DOM = { - temperatureForm: document.querySelector('#temperatureForm'), - celsiusInput: document.querySelector('#celsius'), - result: document.querySelector('#result'), - }; - - // ===== INIT ===== - const init = () => { - DOM.temperatureForm.addEventListener('submit', handleFormSubmit); - }; - - // ===== EVENT HANDLERS ===== - function handleFormSubmit(e) { - e.preventDefault(); // Standardverhalten unterbinden - const celsius = Number(DOM.celsiusInput.value); - - // falsche Verneinung - if (isNaN(celsius)) { - alert('Please enter a valid number'); - return; - } - - const fahrenheit = convertToFahrenheit(celsius); - - displayResult(fahrenheit); - - DOM.temperatureForm.reset(); - } - - // ===== FUNCTIONS ===== - function convertToFahrenheit(celsius) { - if (typeof celsius !== 'number') return NaN; - - return (celsius * 9) / 5 + 32; - } - - function displayResult(result) { - DOM.result.textContent = result.toFixed(2); - } - - // ===== CALL INIT ===== - init(); -})(); diff --git a/06_js-debug/uebungen/u13_temp-converter/assets/js/preset.js b/06_js-debug/uebungen/u13_temp-converter/assets/js/preset.js deleted file mode 100644 index c5ee928..0000000 --- a/06_js-debug/uebungen/u13_temp-converter/assets/js/preset.js +++ /dev/null @@ -1,45 +0,0 @@ -'use strict'; - -(() => { - // ===== DOM ===== - const DOM = { - temperatureForm: document.querySelector('#temperatureForm'), - celsiusInput: document.querySelector('#celsius'), - result: document.querySelector('#result'), - }; - - // ===== INIT ===== - const init = () => { - DOM.temperatureForm.addEventListener('submit', handleFormSubmit); - }; - - // ===== EVENT HANDLERS ===== - function handleFormSubmit(e) { - const celsius = DOM.celsiusInput.value; - - if (!isNaN(celsius)) { - alert('Please enter a valid number'); - return; - } - - const fahrenheit = convertToFahrenheit(celsius); - - displayResult(fahrenheit); - - DOM.temperatureForm.reset(); - } - - // ===== FUNCTIONS ===== - function convertToFahrenheit(celsius) { - if (typeof celsius === 'string') return 0; - - return (celsius * 9) / 5 + 32; - } - - function displayResult(result) { - DOM.result.textContent = result.toFixed(2); - } - - // ===== CALL INIT ===== - init(); -})(); diff --git a/06_js-debug/uebungen/u13_temp-converter/index.html b/06_js-debug/uebungen/u13_temp-converter/index.html deleted file mode 100644 index dd8ec54..0000000 --- a/06_js-debug/uebungen/u13_temp-converter/index.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - Temperature Converter - - - - -
      -

      Temperature Converter

      - -
      -
      -
      - -
      - -
      -
      -
      - -
      - -
      -
      - -
      Result: °F
      -
      - - diff --git a/06_js-debug/uebungen/u14_counter-error/index.html b/06_js-debug/uebungen/u14_counter-error/index.html deleted file mode 100644 index 329ef8f..0000000 --- a/06_js-debug/uebungen/u14_counter-error/index.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - Counter Example - - - -
      -
      -

      Counter

      - -
      -
      -
      - Count: - -
      - -
      -
      -
      -
      - - - - diff --git a/06_js-debug/uebungen/u14_counter-error/solution.html b/06_js-debug/uebungen/u14_counter-error/solution.html deleted file mode 100644 index c46c690..0000000 --- a/06_js-debug/uebungen/u14_counter-error/solution.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - Counter Example - - - -
      -

      Counter

      - -
      -
      -
      - Count: - -
      - -
      -
      -
      - - - - diff --git a/06_js-debug/uebungen/u15_product-sales-table/.eslintrc.cjs b/06_js-debug/uebungen/u15_product-sales-table/.eslintrc.cjs deleted file mode 100644 index d6c9537..0000000 --- a/06_js-debug/uebungen/u15_product-sales-table/.eslintrc.cjs +++ /dev/null @@ -1,18 +0,0 @@ -module.exports = { - root: true, - env: { browser: true, es2020: true }, - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:react-hooks/recommended', - ], - ignorePatterns: ['dist', '.eslintrc.cjs'], - parser: '@typescript-eslint/parser', - plugins: ['react-refresh'], - rules: { - 'react-refresh/only-export-components': [ - 'warn', - { allowConstantExport: true }, - ], - }, -} diff --git a/06_js-debug/uebungen/u15_product-sales-table/README.md b/06_js-debug/uebungen/u15_product-sales-table/README.md deleted file mode 100644 index 6ddbf24..0000000 --- a/06_js-debug/uebungen/u15_product-sales-table/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Frontend Class: Debugging Product Sales Table Exercise - -Install the dependencies and devDependencies and start the server. - -```bash -npm install -npm run dev -``` - -This will start the server on http://localhost:5173 diff --git a/06_js-debug/uebungen/u15_product-sales-table/index.html b/06_js-debug/uebungen/u15_product-sales-table/index.html deleted file mode 100644 index d07d7e9..0000000 --- a/06_js-debug/uebungen/u15_product-sales-table/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - Product Sales Table - - -
      - - - diff --git a/06_js-debug/uebungen/u15_product-sales-table/package-lock.json b/06_js-debug/uebungen/u15_product-sales-table/package-lock.json deleted file mode 100644 index b20964a..0000000 --- a/06_js-debug/uebungen/u15_product-sales-table/package-lock.json +++ /dev/null @@ -1,2660 +0,0 @@ -{ - "name": "product-sales-table", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "product-sales-table", - "version": "0.0.0", - "dependencies": { - "react": "^19.2.8", - "react-dom": "^19.2.8" - }, - "devDependencies": { - "@types/react": "^19.2.18", - "@types/react-dom": "^19.2.4", - "@typescript-eslint/eslint-plugin": "^8.67.0", - "@typescript-eslint/parser": "^8.67.0", - "@vitejs/plugin-react": "^6.1.0", - "eslint": "^10.8.1", - "eslint-plugin-react-hooks": "^7.1.1", - "eslint-plugin-react-refresh": "^0.5.4", - "typescript": "^6.0.3", - "vite": "^8.2.2" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", - "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.29.7", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", - "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", - "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-compilation-targets": "^7.29.7", - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helpers": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", - "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.8", - "@babel/types": "^7.29.8", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", - "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", - "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", - "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", - "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", - "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", - "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", - "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.8" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/template": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", - "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", - "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.8", - "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.8", - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.8", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", - "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", - "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.23.5", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", - "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^3.0.5", - "debug": "^4.3.1", - "minimatch": "^10.2.4" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", - "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^1.2.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/core": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", - "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/object-schema": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", - "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", - "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^1.2.1", - "levn": "^0.4.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", - "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/types": "^0.15.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", - "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.2", - "@humanfs/types": "^0.15.0", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/types": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", - "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@oxc-project/types": { - "version": "0.146.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.146.0.tgz", - "integrity": "sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@rolldown/binding-android-arm-eabi": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.5.tgz", - "integrity": "sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.5.tgz", - "integrity": "sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.5.tgz", - "integrity": "sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.5.tgz", - "integrity": "sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.5.tgz", - "integrity": "sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.5.tgz", - "integrity": "sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.5.tgz", - "integrity": "sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.5.tgz", - "integrity": "sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.5.tgz", - "integrity": "sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.5.tgz", - "integrity": "sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.5.tgz", - "integrity": "sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.5.tgz", - "integrity": "sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.5.tgz", - "integrity": "sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.5.tgz", - "integrity": "sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.5.tgz", - "integrity": "sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/esrecurse": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", - "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.2.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", - "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.67.0.tgz", - "integrity": "sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.67.0", - "@typescript-eslint/type-utils": "8.67.0", - "@typescript-eslint/utils": "8.67.0", - "@typescript-eslint/visitor-keys": "8.67.0", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.67.0", - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.67.0.tgz", - "integrity": "sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.67.0", - "@typescript-eslint/types": "8.67.0", - "@typescript-eslint/typescript-estree": "8.67.0", - "@typescript-eslint/visitor-keys": "8.67.0", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.67.0.tgz", - "integrity": "sha512-cvE8c7ulYeXN9fYuszhCeCsbzyVEXuhrRCybnBre7TUmqb5nRmBfQAwCj0O3WJFDeyAZt4VYv51vMCC9LHSdYw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.67.0", - "@typescript-eslint/types": "^8.67.0", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.67.0.tgz", - "integrity": "sha512-EgvsleTwS4E+WzzSvem8fAUubLwatMNF1B5hHSLQxcvs7q2dtRhGyujHwLJSYlG41niJ7GP24Aha2+0mb1b2kg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.67.0", - "@typescript-eslint/visitor-keys": "8.67.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.67.0.tgz", - "integrity": "sha512-vV+LUSv5njUWsknE71fqKTlXUva+R76SaeORd6Zojcunk/6DvKFXONU3BrAs2H49mbygUXt6gbYunzwqNwlhdg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.67.0.tgz", - "integrity": "sha512-aVWDXbRmdXO9siTfX4ditQI1T9+zVcNazT48EJCD0v40/9RIFoUgZ05CmGEq9H2gixRpjUn/iplwvlcvutJW/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.67.0", - "@typescript-eslint/typescript-estree": "8.67.0", - "@typescript-eslint/utils": "8.67.0", - "debug": "^4.4.3", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.67.0.tgz", - "integrity": "sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.67.0.tgz", - "integrity": "sha512-EKQBCE9yNlRJYm7jdTW5AhDacDUmSwQb0FAJAmK2EKYrNXIsa2vxcSZx6PvJ/dEdI6lS+Y9W+EXckLj0iPFGcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.67.0", - "@typescript-eslint/tsconfig-utils": "8.67.0", - "@typescript-eslint/types": "8.67.0", - "@typescript-eslint/visitor-keys": "8.67.0", - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.67.0.tgz", - "integrity": "sha512-U9D1FdwEWBwok3hxxSdhclMb0twvt9QnjIQ0VfQ1AiX2epnpSgv2ubVDsayOFyY8K6FX+AQ7E0FKWVG3iKsj1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.67.0", - "@typescript-eslint/types": "8.67.0", - "@typescript-eslint/typescript-estree": "8.67.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.67.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.67.0.tgz", - "integrity": "sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.67.0", - "eslint-visitor-keys": "^5.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.1.0.tgz", - "integrity": "sha512-qd2BzUBehkov86WFhg0JkEFEYyCLG9uPCe6qWTY/kRlss9OvJrOF2UbIWT7p+8IzZHkEu0DNGHc4HSv+JdDLsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rolldown/pluginutils": "^1.0.1" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", - "babel-plugin-react-compiler": "^1.0.0", - "oxc-transform-react": "^0.145.0", - "vite": "^8.0.0" - }, - "peerDependenciesMeta": { - "@rolldown/plugin-babel": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true - }, - "oxc-transform-react": { - "optional": true - } - } - }, - "node_modules/acorn": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", - "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/baseline-browser-mapping": { - "version": "2.11.16", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.16.tgz", - "integrity": "sha512-H/bNPUFHewJHyCTdjn1n3Pit5+2GmWT6mmeHImPX+8MA9NA6b67jO4gYmi4jTbCJb2otq34KMZnovndDPqJwhQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/brace-expansion": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", - "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/browserslist": { - "version": "4.28.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", - "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.11.12", - "caniuse-lite": "^1.0.30001809", - "electron-to-chromium": "^1.5.402", - "node-releases": "^2.0.53", - "update-browserslist-db": "^1.3.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001809", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz", - "integrity": "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.412", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.412.tgz", - "integrity": "sha512-z4rMe3esBzlzovKHj4gxJnsCGZRK5l4baUvm+gCGJBPE+gsyUMKsuU9tnEUtI1dOebXz1ytAPGjvXhmQ7rIPwA==", - "dev": true, - "license": "ISC" - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "10.8.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.8.1.tgz", - "integrity": "sha512-wqA7W2jbsC/BnV9Iv1UZpKVFkO1AdNoSmYW8NWG4HNOBbkAMvIqDZ27pI2f07dqn583NcIC44ckjAcOXDL1QbQ==", - "dev": true, - "license": "MIT", - "workspaces": [ - "packages/*" - ], - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.2", - "@eslint/config-array": "^0.23.5", - "@eslint/config-helpers": "^0.7.0", - "@eslint/core": "^1.2.1", - "@eslint/plugin-kit": "^0.7.2", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.14.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^9.1.2", - "eslint-visitor-keys": "^5.0.1", - "espree": "^11.2.0", - "esquery": "^1.7.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "minimatch": "^10.2.5", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", - "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.24.4", - "@babel/parser": "^7.24.4", - "hermes-parser": "^0.25.1", - "zod": "^3.25.0 || ^4.0.0", - "zod-validation-error": "^3.5.0 || ^4.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" - } - }, - "node_modules/eslint-plugin-react-refresh": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.4.tgz", - "integrity": "sha512-7bqTKz7T0r+HKWFarNXByDE9/5+73wI2ru+M3zuqGbR7s/b/5/pQJXZoufWlrngqGqoZto73ZkGumCdLxk+4rw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "eslint": "^9 || ^10" - } - }, - "node_modules/eslint-scope": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", - "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@types/esrecurse": "^4.3.1", - "@types/estree": "^1.0.8", - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/espree": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", - "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.16.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^5.0.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", - "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/hermes-estree": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", - "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", - "dev": true, - "license": "MIT" - }, - "node_modules/hermes-parser": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", - "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "hermes-estree": "0.25.1" - } - }, - "node_modules/ignore": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", - "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lightningcss": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", - "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.33.0", - "lightningcss-darwin-arm64": "1.33.0", - "lightningcss-darwin-x64": "1.33.0", - "lightningcss-freebsd-x64": "1.33.0", - "lightningcss-linux-arm-gnueabihf": "1.33.0", - "lightningcss-linux-arm64-gnu": "1.33.0", - "lightningcss-linux-arm64-musl": "1.33.0", - "lightningcss-linux-x64-gnu": "1.33.0", - "lightningcss-linux-x64-musl": "1.33.0", - "lightningcss-win32-arm64-msvc": "1.33.0", - "lightningcss-win32-x64-msvc": "1.33.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", - "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", - "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", - "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", - "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", - "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", - "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", - "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", - "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", - "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", - "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", - "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/minimatch": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", - "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.8" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.18", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", - "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.53", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", - "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", - "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.17", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/react": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", - "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", - "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.8" - } - }, - "node_modules/rolldown": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.5.tgz", - "integrity": "sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "=0.146.0", - "@rolldown/pluginutils": "^1.0.0" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm-eabi": "1.2.5", - "@rolldown/binding-android-arm64": "1.2.5", - "@rolldown/binding-darwin-arm64": "1.2.5", - "@rolldown/binding-darwin-x64": "1.2.5", - "@rolldown/binding-freebsd-x64": "1.2.5", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.5", - "@rolldown/binding-linux-arm64-gnu": "1.2.5", - "@rolldown/binding-linux-arm64-musl": "1.2.5", - "@rolldown/binding-linux-ppc64-gnu": "1.2.5", - "@rolldown/binding-linux-s390x-gnu": "1.2.5", - "@rolldown/binding-linux-x64-gnu": "1.2.5", - "@rolldown/binding-linux-x64-musl": "1.2.5", - "@rolldown/binding-openharmony-arm64": "1.2.5", - "@rolldown/binding-win32-arm64-msvc": "1.2.5", - "@rolldown/binding-win32-x64-msvc": "1.2.5" - } - }, - "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/ts-api-utils": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", - "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/typescript": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", - "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz", - "integrity": "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/vite": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", - "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "lightningcss": "^1.33.0", - "picomatch": "^4.0.5", - "postcss": "^8.5.26", - "rolldown": "~1.2.4", - "tinyglobby": "^0.2.17" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.4.0 || ^0.5.0", - "esbuild": "^0.27.0 || ^0.28.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", - "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-validation-error": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", - "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "zod": "^3.25.0 || ^4.0.0" - } - } - } -} diff --git a/06_js-debug/uebungen/u15_product-sales-table/package.json b/06_js-debug/uebungen/u15_product-sales-table/package.json deleted file mode 100644 index 7e734cc..0000000 --- a/06_js-debug/uebungen/u15_product-sales-table/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "product-sales-table", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "tsc -b && vite build", - "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview" - }, - "dependencies": { - "react": "^19.2.8", - "react-dom": "^19.2.8" - }, - "devDependencies": { - "@types/react": "^19.2.18", - "@types/react-dom": "^19.2.4", - "@typescript-eslint/eslint-plugin": "^8.67.0", - "@typescript-eslint/parser": "^8.67.0", - "@vitejs/plugin-react": "^6.1.0", - "eslint": "^10.8.1", - "eslint-plugin-react-hooks": "^7.1.1", - "eslint-plugin-react-refresh": "^0.5.4", - "typescript": "^6.0.3", - "vite": "^8.2.2" - } -} diff --git a/06_js-debug/uebungen/u15_product-sales-table/public/vite.svg b/06_js-debug/uebungen/u15_product-sales-table/public/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/06_js-debug/uebungen/u15_product-sales-table/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/06_js-debug/uebungen/u15_product-sales-table/src/App.tsx b/06_js-debug/uebungen/u15_product-sales-table/src/App.tsx deleted file mode 100644 index acb21c0..0000000 --- a/06_js-debug/uebungen/u15_product-sales-table/src/App.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { useState, useEffect } from 'react'; - -import Table from './components/Table'; - -function App() { - const [salesData, setSalesData] = useState(null); - - const fetchSalesData = async () => { - const response = await fetch('./src/lib/db/sales.json'); - const data = await response.json(); - setSalesData(data); - }; - - useEffect(() => { - fetchSalesData(); - }, []); - - return ( -
      -
      -
      -
      -

      Product Sales

      -

      - A table of product sales data for the current month. -

      -
      -
      - -
      -
      -
      - {salesData && } - - - - - - ); -} - -export default App; diff --git a/06_js-debug/uebungen/u15_product-sales-table/src/components/Table.tsx b/06_js-debug/uebungen/u15_product-sales-table/src/components/Table.tsx deleted file mode 100644 index ce5e545..0000000 --- a/06_js-debug/uebungen/u15_product-sales-table/src/components/Table.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import TableRow from './TableRow'; -import { Product } from '../lib/datatypes'; - -const Table = ({ salesData }: { salesData: Product[] }) => { - return ( -
      - - - - - - - - - - - - - {salesData.length > 0 && - salesData.map( - (product) => - // Aro - // wenn product == null (böse json datei :) wird trotzdem versucht auf die id zuzugreifen - // ==> Fehler... - product && , - )} - -
      IDProductCodeQuantityPriceProfit
      - ); -}; - -export default Table; diff --git a/06_js-debug/uebungen/u15_product-sales-table/src/components/TableRow.tsx b/06_js-debug/uebungen/u15_product-sales-table/src/components/TableRow.tsx deleted file mode 100644 index 6d8cb32..0000000 --- a/06_js-debug/uebungen/u15_product-sales-table/src/components/TableRow.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { Product } from '../lib/datatypes'; - -const TableRow = ({ product }: { product: Product }) => { - const { - id, - product: productName, - productCode, - quantity, - price, - profit, - } = product; - - return ( -
      {id}{productName}{productCode}{quantity}${price.toFixed(2)}${profit.toFixed(2)}
      ` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-` - -
    • - -
    • - - - - - - - - - - - - - - - - - - - -
      #NamePrice in €Actions
      -
      -
      - -
      - -
      -
      - - -
      -
      - -
      - -
      -
      - -
      - - - - - - - - - - - - - - - - @@include('footer-main.html') - - diff --git a/webseite-gulp-ts/frontend/dev/scripts/main.ts b/webseite-gulp-ts/frontend/dev/scripts/main.ts deleted file mode 100644 index 481a3d3..0000000 --- a/webseite-gulp-ts/frontend/dev/scripts/main.ts +++ /dev/null @@ -1,49 +0,0 @@ -// import 'bootstrap'; // ohne Pfadangabe (Modul auslesen aus node_modules) funktioniert nur mit JS-Bundler (esbuild, rollup & co.) - -import ProductManager from './modules/ProductManager'; // Dateiendung kann weggelassen werden, wenn ein Bundler eingesetzt wird (esbuild, webpack, rollup, etc.) -import Splide from '@splidejs/splide'; - -(() => { - // === DOM & VARS ======= - const DOM = {}; - - // === INIT ============= - const init = () => { - console.log('init!!'); - router(); - }; - - // === EVENTHANDLER ===== - - // === XHR/FETCH ======== - - // === FUNCTIONS ======== - const router = () => { - const path = window.location.pathname; - - console.log(path); - - switch (path) { - case '/': - case '/index.html': - console.log('HOME'); - const splider = new Splide('.splide', { - type: 'loop', - fixedHeight: '100%', - height: '100%', - autoHeight: true, - }).mount(); - - // nur Skripte, die für Home relevant ausführen - break; - case '/projects/product-manager.html': - console.log('PRODUCT_MANAGER'); - const pm = ProductManager(); - break; - default: - console.warn('Page not found'); - } - }; - - init(); -})(); diff --git a/webseite-gulp-ts/frontend/dev/scripts/modules/ProductManager.ts b/webseite-gulp-ts/frontend/dev/scripts/modules/ProductManager.ts deleted file mode 100644 index a447d7e..0000000 --- a/webseite-gulp-ts/frontend/dev/scripts/modules/ProductManager.ts +++ /dev/null @@ -1,619 +0,0 @@ -import { Modal } from 'bootstrap'; // ohne Pfadangabe (Modul auslesen aus node_modules) funktioniert nur mit JS-Bundler (esbuild, rollup & co.) -import Toast from './Toast'; -import { querySelectorTyped, parents } from '../utils/helpers'; - -// import * as bootstrap from 'bootstrap'; -// import 'bootstrap'; - -// import 'https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js'; // würde auch ohne Bundler funktionieren -// import '../../../node_modules/bootstrap/dist/js/bootstrap.esm.js'; // würde auch ohne Bundler funktionieren - -interface DOM { - module: HTMLElement; - table: HTMLTableElement; - tBody: HTMLTableSectionElement; - inputName: HTMLInputElement; - inputPrice: HTMLInputElement; - btnAdd: HTMLButtonElement; - templateRow: HTMLTemplateElement; - btnSave: HTMLButtonElement; - btnReset: HTMLButtonElement; - modalEdit: HTMLDivElement; - formEdit: HTMLFormElement; - inputEditName: HTMLInputElement; - inputEditPrice: HTMLInputElement; - inputEditId: HTMLInputElement; - inputEditPosition: HTMLInputElement; - btnUpdate: HTMLButtonElement; - modalDelete: HTMLDivElement; - productName: HTMLDivElement; - btnConfirmDelete: HTMLButtonElement; -} - -interface Product { - _id?: string; - name: string; - price: number; - position?: number; -} - -// Factory Function -const ProductManager = (el?: HTMLElement) => { - // === DOM & VARS ======= - - const BASE_URL = 'http://127.0.0.1:8000'; - - const module = el || querySelectorTyped('.product-manager'); - - if (!module) return; - - const DOM: DOM = { - module, - table: querySelectorTyped('.table-products', module), - tBody: querySelectorTyped('tbody', module), - inputName: querySelectorTyped('.input-product-name', module), - inputPrice: querySelectorTyped('.input-product-price', module), - btnAdd: querySelectorTyped('.button-product-add', module), - templateRow: querySelectorTyped('.template-row', module), - - // Nav Actions - btnSave: querySelectorTyped('.button-products-save', module), - btnReset: querySelectorTyped('.button-products-reset', module), - - // Modal Edit - modalEdit: querySelectorTyped('.modal-edit', module), - formEdit: querySelectorTyped('.form-product-edit', module), - inputEditName: querySelectorTyped('.input-edit-name', module), - inputEditPrice: querySelectorTyped('.input-edit-price', module), - inputEditId: querySelectorTyped('.input-edit-id', module), - inputEditPosition: querySelectorTyped('.input-edit-position', module), - btnUpdate: querySelectorTyped('.button-product-update', module), - - // Modal Delete - modalDelete: querySelectorTyped('.modal-delete', module), - productName: querySelectorTyped('strong.product-name', module), - btnConfirmDelete: querySelectorTyped('.button-confirm-delete', module), - }; - - console.log(DOM); - const bsModalEdit = new Modal(DOM.modalEdit, { - backdrop: 'static', // true - keyboard: true, - }); - - const bsModalDelete = new Modal(DOM.modalDelete, { - backdrop: 'static', // true - keyboard: true, - }); - - // === INIT ============= - const init = () => { - console.log('init'); - // Funktionaufrufe zu beginn der Anwendung - initProducts(); - - // Event-Lauscher zu beginn der Anwendung - DOM.btnReset.addEventListener('click', onClickReset); - DOM.btnSave.addEventListener('click', onClickSave); - - DOM.btnAdd.addEventListener('click', onClickAdd); - DOM.btnAdd.disabled = true; - DOM.btnConfirmDelete.addEventListener('click', onClickConfirmDelete); - DOM.formEdit.addEventListener('submit', onSubmitEdit); - window.addEventListener('keyup', onKeyUp); - }; - - // === EVENTHANDLER ===== - const onKeyUp = () => { - // if (DOM.inputName.value === '' && DOM.inputPrice.value === '') { - // DOM.btnAdd.disabled = true; - // } else { - // DOM.btnAdd.disabled = false; - // } - DOM.btnAdd.disabled = (DOM.inputName.value === '' || DOM.inputPrice.value === ''); // prettier-ignore - }; - - const onClickReset = (e: PointerEvent) => { - const btnEl = e.currentTarget; - - // async process - resetProducts().then((data) => { - if (data.success) { - Toast(data.msg, 'success').show(); - loadProducts(); - } - }); - }; - - const onClickSave = (e: PointerEvent) => { - const btnEl = e.currentTarget as HTMLButtonElement; - const icon = btnEl.querySelector('i') as HTMLElement; - - icon.classList.add('fa-jello'); - - // async process - saveProducts().then((data) => { - if (data.success) { - setTimeout(() => { - icon.classList.remove('fa-jello'); - }, 500); - Toast(data.msg, 'success').show(); - } - }); - }; - - const onSubmitEdit = (e: SubmitEvent) => { - e.preventDefault(); // Standardverhalten unterbinden (Formular nicht an action versenden) - - // console.log(Object.entries(new FormData(DOM.formEdit))); - - const product = { - name: DOM.inputEditName.value, - price: Number(DOM.inputEditPrice.value), - _id: DOM.inputEditId.value, - position: DOM.inputEditPosition.value, - }; - - // update async process - querySelectorTyped('i', DOM.btnUpdate).classList.add('fa-spin'); - updateProduct(product).then((data) => { - console.log(data); - if (data.success) { - Toast(data.msg, 'success').show(); - querySelectorTyped('i', DOM.btnUpdate).classList.remove('fa-spin'); - loadProducts(); // All Produkte auslesen - resetFields(); - bsModalEdit.hide(); - } else { - Toast(data.msg, 'error').show(); - } - }); - }; - - const onClickAdd = () => { - console.log('click'); - - const product = { - name: DOM.inputName.value, - price: Number(DOM.inputPrice.value), - }; - - createProduct(product).then((data) => { - console.log(data); - if (data.success) { - console.log('add'); - Toast(data.msg, 'success').show(); - loadProducts(); - resetFields(); - } - }); - - // addProduct(product); - - disableNonFunctionalButtons(); - }; - - const onClickEdit = (e: PointerEvent) => { - const btnEl = e.currentTarget as HTMLButtonElement; - const currentRow = parents(btnEl, 'tr')[0]; - const id: string = String(currentRow.dataset.id); - - // async fetch - getProduct(id).then((data) => { - // console.log(data); - showModalEdit(data); - }); - }; - - const onClickRemove = (e: PointerEvent) => { - const btnEl = e.currentTarget as HTMLButtonElement; - const currentRow = parents(btnEl, 'tr')[0]; - const id = currentRow.dataset.id; - - const productName = querySelectorTyped('.td-name', currentRow).textContent.trim(); - - DOM.btnConfirmDelete.dataset.id = id; - DOM.productName.textContent = productName; - - // async fetch - // deleteProduct(id).then((data) => { - // if (data.success) { - // Toast(data.msg, 'success').show(); - // console.log('delete: success', data); - // loadProducts(); - // } else { - // Toast(data.msg, 'error').show(); - // console.error(data); - // } - // }); - }; - - const onClickConfirmDelete = (e: PointerEvent) => { - const btnEl = e.currentTarget as HTMLButtonElement; - const id: string = String(btnEl.dataset.id); - - // async fetch - deleteProduct(id).then((data) => { - if (data.success) { - Toast(data.msg, 'success').show(); - bsModalDelete.hide(); - loadProducts(); - } else { - Toast(data.msg, 'error').show(); - console.error(data); - } - }); - }; - - const onClickMoveUp = (e: PointerEvent) => { - const btnEl = e.currentTarget as HTMLButtonElement; - // const currentRowEl = btnEl.parentNode.parentNode; // aktuelle Zeile (tr) mit dem Button - const currentRowEl = parents(btnEl, 'tr')[0]; - - // ParentNode.insertBefore(referenceElement, targetElement) - // DOM.tBody.insertBefore(currentRowEl, currentRowEl.previousElementSibling); - - // targetElement.before(referenceElement) - currentRowEl.previousElementSibling!.before(currentRowEl); - - console.log('move up'); - disableNonFunctionalButtons(); - }; - - const onClickMoveDown = (e: PointerEvent) => { - const btnEl = e.currentTarget as HTMLButtonElement; - // const currentRowEl = btnEl.parentNode.parentNode; // aktuelle Zeile (tr) mit dem Button - const currentRowEl = parents(btnEl, 'tr')[0]; - - // ParentNode.insertBefore(referenceElement, targetElement) - // DOM.tBody.insertBefore(currentRowEl, currentRowEl.nextElementSibling.nextElementSibling); - - // targetElement.after(referenceElement) - currentRowEl.nextElementSibling!.after(currentRowEl); - - console.log('move down'); - disableNonFunctionalButtons(); - }; - - // Drag 'n Drop EventHandler - const onMouseDownDrag = (e: MouseEvent) => { - const btnEl = e.currentTarget as HTMLButtonElement; - const currentRowEl = parents(btnEl, 'tr')[0]; - currentRowEl.draggable = true; - }; - - const onMouseUpDrag = (e: MouseEvent) => { - const btnEl = e.currentTarget as HTMLButtonElement; - const currentRowEl = parents(btnEl, 'tr')[0]; - currentRowEl.draggable = false; - }; - - const onDragStart = (e: DragEvent) => { - console.log('DragEvent: ', e); - const currentRowEl = e.currentTarget as HTMLTableRowElement; // tr <- aktuelle Zeie, die bewegt wird - const idx: number = [...currentRowEl.parentNode!.children].indexOf(currentRowEl); - - e.dataTransfer?.setData('text/plain', String(idx)); - // e.dataTransfer.setData('application/json', JSON.stringify({idx, name: sourceElement})); - console.log('tr index:', idx); - }; - - const onDragOver = (e: DragEvent) => { - e.preventDefault(); // WICHTIG! Sonst funktioniert drop EventHandler nicht. - }; - - const onDrop = (e: DragEvent) => { - const currentRowEl = e.currentTarget as HTMLTableRowElement; // tr <- Zielzeile, auf die gedroppt wird. - const targetIdx = [...currentRowEl.parentNode!.children].indexOf(currentRowEl); - const sourceIdx: number = parseInt(e.dataTransfer?.getData('text/plain') || '0'); - // const { sourceIdx } = JSON.parse(e.dataTransfer.getData('application/json')); - - console.log({ targetIdx, sourceIdx }); - - // Guard wenn Element auf sich selbst losgelassen wurde, abbruch - if (sourceIdx === targetIdx) { - return; - } - - const draggedEl = DOM.tBody.querySelector(`tr:nth-child(${sourceIdx + 1})`) as HTMLTableRowElement; - // const draggedEl = DOM.tBody.children[sourceIdx] - - // Verschiebe das Element im DOM - if (sourceIdx > targetIdx) { - currentRowEl.before(draggedEl); - } else { - currentRowEl.after(draggedEl); - } - - disableNonFunctionalButtons(); - }; - - // === XHR/FETCH ======== - - // HTTP - Methode - PATCH - // reset products - const resetProducts = async () => { - try { - const response = await fetch(`${BASE_URL}/api/products/reset`, { - method: 'PATCH', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ reset: true }), - }); // HTTP Request URL - if (!response.ok) { - throw new Error('Fetch went wrong.'); - } - const data = await response.json(); // HTTP-Response - - return data; - } catch (error: unknown) { - if (error instanceof Error) { - Toast(error.message, 'error').show(); - } else { - Toast('An unknown error occurred.', 'error').show(); - } - - console.error(error); - return error; - } - }; - - // HTTP - Methode - PATCH - // save products - const saveProducts = async () => { - try { - const response = await fetch(`${BASE_URL}/api/products/save`, { - method: 'PATCH', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ save: true }), - }); // HTTP Request URL - if (!response.ok) { - throw new Error('Fetch went wrong.'); - } - const data = await response.json(); // HTTP-Response - - return data; - } catch (error: unknown) { - if (error instanceof Error) { - Toast(error.message, 'error').show(); - } else { - Toast('An unknown error occurred.', 'error').show(); - } - - console.error(error); - return error; - } - }; - - // HTTP - Methode - POST - // (C)RUD - create - // BRE(A)D - add - neues Produkt hinzufügen - const createProduct = async (product: Product) => { - try { - const response = await fetch(`${BASE_URL}/api/products`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(product), - }); // HTTP Request URL - if (!response.ok) { - throw new Error('Fetch went wrong.'); - } - const data = await response.json(); // HTTP-Response - - return data; - } catch (error: unknown) { - if (error instanceof Error) { - Toast(error.message, 'error').show(); - } else { - Toast('An unknown error occurred.', 'error').show(); - } - console.error(error); - return error; - } - }; - - // HTTP - Methode - GET - // C(R)UD - Read - // (B)READ - Browse - auslesen aller Produkte - const getProducts = async () => { - try { - const response = await fetch(`${BASE_URL}/api/products`); // HTTP Request URL - if (!response.ok) { - throw new Error('Fetch went wrong.'); - } - const data = await response.json(); // HTTP-Response - - return data; - } catch (error: unknown) { - if (error instanceof Error) { - console.error(error.message); - } else { - console.error('An unknown error occurred.'); - } - return error; - } - }; - - // HTTP - Methode - GET - // C(R)UD - Read - // B(R)EAD - Read - auslesen eines Produkts - const getProduct = async (id: string) => { - try { - const response = await fetch(`${BASE_URL}/api/products/${id}`); // HTTP Request URL - if (!response.ok) { - throw new Error('Fetch went wrong.'); - } - const data = await response.json(); // HTTP-Response - - return data; - } catch (error: unknown) { - if (error instanceof Error) { - console.error(error.message); - } else { - console.error('An unknown error occurred.'); - } - return error; - } - }; - - // HTTP - Methode - PUT - // CR(U)D - update - // BR(E)AD - edit - Produkt aktualisieren - const updateProduct = async (product: any) => { - // TODO: Typisierung verbessern - try { - const response = await fetch(`${BASE_URL}/api/products`, { - method: 'PUT', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(product), - }); // HTTP Request URL - if (!response.ok) { - throw new Error('Fetch went wrong.'); - } - const data = await response.json(); // HTTP-Response - - return data; - } catch (error: unknown) { - if (error instanceof Error) { - console.error(error.message); - } else { - console.error('An unknown error occurred.'); - } - return error; - } - }; - - // HTTP - Methode - DELETE - // CRU(D) - delete - // BREA(D) - delete - Produkt löschen - const deleteProduct = async (id: string) => { - try { - const response = await fetch(`${BASE_URL}/api/products/${id}`, { - method: 'DELETE', - headers: { - 'Content-Type': 'application/json', - }, - }); // HTTP Request URL - if (!response.ok) { - throw new Error('Fetch went wrong.'); - } - - const data = await response.json(); - return data; - } catch (error) { - console.error(error); - return error; - } - }; - - // === FUNCTIONS ======== - - const initProducts = () => { - getProducts().then((products: Product[]) => { - products.forEach((product: Product) => { - addProduct(product); - }); - Toast('Init products').show(); - disableNonFunctionalButtons(); - }); - - // PRODUCTS.forEach((product) => { - // addProduct(product); - // }); - //disableNonFunctionalButtons(); - // PRODUCTS.forEach(addProduct); - }; - - const loadProducts = () => { - DOM.tBody.innerHTML = ''; - getProducts().then((data: Product[]) => { - data.forEach((product: Product) => { - addProduct(product); - }); - disableNonFunctionalButtons(); - }); - }; - - const addProduct = (product: Product) => { - const { name, price, _id: id, position } = product; - - // https://developer.mozilla.org/de/docs/Web/API/HTMLTemplateElement/content - const trEl = DOM.templateRow.content.firstElementChild?.cloneNode(true) as HTMLTableRowElement; - - const tdNameEl = querySelectorTyped('.td-name', trEl); - const tdPriceEl = querySelectorTyped('.td-price', trEl); - const btnRemoveEl = querySelectorTyped('.button-product-remove', trEl); - const btnMoveUpEl = querySelectorTyped('.button-product-move-up', trEl); - const btnMoveDownEl = querySelectorTyped('.button-product-move-down', trEl); - - const btnDragEl = querySelectorTyped('.button-drag', trEl); - const btnEditEl = querySelectorTyped('.button-product-edit', trEl); - - tdNameEl.textContent = String(name); - tdPriceEl.textContent = String(price); - - btnEditEl.addEventListener('click', onClickEdit); - btnRemoveEl.addEventListener('click', onClickRemove); - btnMoveUpEl.addEventListener('click', onClickMoveUp); - btnMoveDownEl.addEventListener('click', onClickMoveDown); - - // Drag 'n Drop Events - btnDragEl.addEventListener('mousedown', onMouseDownDrag); - btnDragEl.addEventListener('mouseup', onMouseUpDrag); - - trEl.addEventListener('dragstart', onDragStart); - trEl.addEventListener('dragover', onDragOver); - trEl.addEventListener('drop', onDrop); - - trEl.dataset.id = id; //
      ` alignment by inheriting `text-align`. -// 3. Fix alignment for Safari - -th { - font-weight: $table-th-font-weight; // 1 - text-align: inherit; // 2 - text-align: -webkit-match-parent; // 3 -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - - -// Forms -// -// 1. Allow labels to use `margin` for spacing. - -label { - display: inline-block; // 1 -} - -// Remove the default `border-radius` that macOS Chrome adds. -// See https://github.com/twbs/bootstrap/issues/24093 - -button { - // stylelint-disable-next-line property-disallowed-list - border-radius: 0; -} - -// Explicitly remove focus outline in Chromium when it shouldn't be -// visible (e.g. as result of mouse click or touch tap). It already -// should be doing this automatically, but seems to currently be -// confused and applies its very visible two-tone outline anyway. - -button:focus:not(:focus-visible) { - outline: 0; -} - -// 1. Remove the margin in Firefox and Safari - -input, -button, -select, -optgroup, -textarea { - margin: 0; // 1 - font-family: inherit; - @include font-size(inherit); - line-height: inherit; -} - -// Remove the inheritance of text transform in Firefox -button, -select { - text-transform: none; -} -// Set the cursor for non-` - -
    • - -
    • - - - - - - - - - - - - - - - - - - - -
      #NamePrice in €Actions
      -
      -
      - -
      - -
      -
      - - -
      -
      - -
      - -
      -
      - -
      - - - - - - - - - - - - - - - - -
      -
      -
      -
      -

      Address

      -

      - Lorem ipsum dolor, sit amet consectetur adipisicing elit. Beatae omnis hic eligendi rem fugiat quo! Autem - totam maxime itaque earum -

      -
      -
      -

      Social Media

      -

      Lorem ipsum dolor sit, amet consectetur adipisicing elit. Nisi, earum.

      -
      -
      -

      Privacy Policy

      -

      Lorem ipsum dolor sit amet consectetur adipisicing elit. Eveniet, porro!

      -
      -
      -
      -
      - - - diff --git a/webseite-gulp-ts/frontend/tsconfig.json b/webseite-gulp-ts/frontend/tsconfig.json deleted file mode 100644 index e32598b..0000000 --- a/webseite-gulp-ts/frontend/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "compilerOptions": { - "target": "es2015", - "module": "esnext", - "moduleResolution": "bundler", - "strict": true, - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "sourceMap": true, - "noEmit": true - }, - "include": ["dev/scripts/**/*.ts"] -} diff --git a/webseite-react-php-jwt.zip b/webseite-react-php-jwt.zip deleted file mode 100644 index 886c83b..0000000 Binary files a/webseite-react-php-jwt.zip and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/.vscode/settings.json b/webseite-react-php-jwt/react-app/.vscode/settings.json deleted file mode 100644 index cb2ddd7..0000000 --- a/webseite-react-php-jwt/react-app/.vscode/settings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "workbench.colorCustomizations": { - "titleBar.activeForeground": "#333", - "titleBar.activeBackground": "#86cd8b", - "titleBar.inactiveForeground": "#ddd", - "titleBar.inactiveBackground": "#6fa973" - } -} diff --git a/webseite-react-php-jwt/react-app/README.md b/webseite-react-php-jwt/react-app/README.md deleted file mode 100644 index 232ba73..0000000 --- a/webseite-react-php-jwt/react-app/README.md +++ /dev/null @@ -1,377 +0,0 @@ -# Installation der Pakete - -## Dependencies - -```bash -npm install react-router-dom bootstrap uuid axios react-icons -``` - -## DevDependencies - -```bash -npm install sass -D -``` - -## Configuration von Vite - -```js -import { defineConfig } from 'vite'; -import react from '@vitejs/plugin-react'; - -// https://vite.dev/config/ -export default defineConfig({ - plugins: [react()], - css: { - preprocessorOptions: { - scss: { - quietDeps: true, // Unix - silenceDeprecations: [ - 'color-functions', - 'global-builtin', - 'import', - 'legacy-js-api', - ], - }, - }, - }, -}); -``` - -# React + Vite - -This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. - -Currently, two official plugins are available: - -- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh -- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh - -## React Compiler - -The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). - -## Expanding the ESLint configuration - -If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and [`typescript-eslint`](https://typescript-eslint.io) in your project. - -# Products Store mit useContext und useReducer - -`TableProducts` hält den Tabellen-State nicht mehr lokal in der Komponente. Stattdessen gibt es einen ausgelagerten Store aus **Context + Reducer**. So können Kind-Komponenten wie `RowProduct` den State lesen und Aktionen auslösen, ohne Callbacks per Props durchzureichen (kein Prop Drilling). - -## Dateistruktur - -``` -src/stores/products/ - initialState.js // Startzustand (Factory) - reducer.js // reine State-Übergänge - ProductsStore.jsx // Context, Provider, Custom Hooks - index.js // öffentliche Exports -``` - -## Step 1: `initialState` auslagern - -Datei: `src/stores/products/initialState.js` - -Der Startzustand wird als **Factory-Funktion** geschrieben, nicht als festes Objekt. So kann der Provider die geladenen Produkte (`items`) übergeben, und Validierung bleibt an einer Stelle. - -```js -export const createInitialState = (items) => { - return { items: items || [] }; -}; -``` - -Später wird sie so verwendet: - -```js -useReducer(productsReducer, items, createInitialState); -``` - -React ruft `createInitialState(items)` einmal beim ersten Render auf (lazy init). Das dritte Argument von `useReducer` ist genau dafür da. - -## Step 2: Reducer auslagern - -Datei: `src/stores/products/reducer.js` - -Der Reducer bleibt eine **reine Funktion**: `(state, action) => newState`. Keine Side Effects außer einem `console.warn` für unbekannte Actions. - -Action-Typen liegen in einem Objekt `PRODUCTS_ACTIONS`. Tippfehler fallen so früher auf als bei losen Strings wie `'UPDATE_AMMOUNT'`. - -```js -export const PRODUCTS_ACTIONS = { - UPDATE_AMOUNT: 'UPDATE_AMOUNT', - UPDATE_PRICE: 'UPDATE_PRICE', -}; -``` - -Jede Action folgt dem Muster `{ type, payload }`. Der Reducer kopiert den State (`...state`) und ersetzt nur das betroffene Item über `map`. Unveränderte Items behalten dieselbe Referenz – das ist wichtig für `memo(RowProduct)`. - -## Step 3: Context aufteilen (State und Dispatch) - -Datei: `src/stores/products/ProductsStore.jsx` - -Best Practice: **zwei Contexts**, nicht einen. - -| Context | Inhalt | Wann re-rendern Kind-Komponenten? | -| ------------------------- | ----------- | ------------------------------------- | -| `ProductsStateContext` | `{ items }` | bei jeder State-Änderung | -| `ProductsDispatchContext` | `dispatch` | praktisch nie (`dispatch` ist stabil) | - -`RowProduct` braucht nur Aktionen (also `dispatch`). Würde State und Dispatch in einem Value `{ state, dispatch }` stecken, bekäme jede Zeile bei jeder Eingabe ein neues Objekt und würde neu rendern – `memo` wäre wirkungslos. - -```js -const ProductsStateContext = createContext(null); -const ProductsDispatchContext = createContext(null); -``` - -`null` als Default ist Absicht: so erkennt der Custom Hook, wenn jemand den Store **außerhalb** des Providers nutzt. - -## Step 4: Provider mit `useReducer` bauen - -`ProductsProvider` ist die einzige Stelle, an der `useReducer` läuft. Er bekommt `items` (z. B. aus dem Fetch auf der Page) und reicht State sowie `dispatch` nach unten. - -```jsx -export const ProductsProvider = (props) => { - const { children, items = [] } = props; - const [state, dispatch] = useReducer( - productsReducer, - items, - createInitialState, - ); - - return ( - - - {children} - - - ); -}; -``` - -Wichtig: Die Komponente, die `useContext` aufruft, muss ein **Kind** des Providers sein – nicht dieselbe Komponente, die den Provider rendert. Deshalb gibt es `TableProducts` (Provider) und `TableProductsView` (Consumer). - -## Step 5: Custom Hooks statt nacktem `useContext` - -Drei Hooks kapseln den Zugriff und werfen einen Fehler, wenn der Provider fehlt: - -1. `useProductsState()` – liest `{ items }` -2. `useProductsDispatch()` – liefert `dispatch` -3. `useProductsActions()` – fertige Callbacks `updateAmount` / `updatePrice` - -Komponenten sollen nicht `dispatch({ type: '…' })` selbst zusammenbauen. Die Action-Objekte gehören in den Store, analog zu Redux Action Creators. - -```js -const updateAmount = useCallback( - (amount, id) => { - dispatch({ type: PRODUCTS_ACTIONS.UPDATE_AMOUNT, payload: { id, amount } }); - }, - [dispatch], -); -``` - -`useCallback` + stabiles `dispatch` hält die Funktionsreferenz gleich. Zusammen mit `memo(RowProduct)` rendern nur Zeilen neu, deren Item-Props sich geändert haben. - -## Step 6: Barrel-Export - -Datei: `src/stores/products/index.js` - -Andere Dateien importieren nur den Ordner, nicht interne Pfade: - -```js -import { - ProductsProvider, - useProductsState, - useProductsActions, -} from '../../stores/products'; -``` - -Reducer und `initialState` bleiben intern austauschbar, ohne dass `TableProducts` oder `RowProduct` ihre Imports ändern müssen. - -## Step 7: `TableProducts` an den Store anbinden - -`TableProducts` wrappt die Ansicht mit dem Provider und übergibt die Props als Initial-Items: - -```jsx -const TableProducts = (props) => { - return ( - - - - ); -}; -``` - -`TableProductsView` liest den State und berechnet den Gesamtpreis lokal mit `useMemo`. Der Gesamtpreis ist **abgeleiteter State** – er gehört nicht in den Reducer, sondern wird aus `items` berechnet. - -Die Handler `onHandleAmount` / `onHandlePrice` entfallen. `RowProduct` holt sie selbst aus dem Store. - -## Step 8: Prop Drilling in `RowProduct` entfernen - -Vorher: `TableProducts` → `RowProduct` → Inputs (Callbacks als Props). - -Nachher: `RowProduct` ruft `useProductsActions()` auf. Die Zeile bekommt nur noch die Produktdaten als Props (`_id`, `title`, `stock`, `price`, `sku`). Die `_id` bindet den Input-Wert an das richtige Item: - -```js -const { updateAmount, updatePrice } = useProductsActions(); - -const handleAmount = useCallback( - (value) => { - updateAmount(value, _id); - }, - [updateAmount, _id], -); -``` - -Die Produktdaten bleiben Props (nicht aus dem Context gelesen). Würde jede Zeile `items` aus dem State-Context lesen, würden **alle** Zeilen bei jeder Änderung neu rendern. - -## Datenfluss - -``` -TableProductsPage fetch JSON → items - │ - ▼ -TableProducts ProductsProvider(items) - │ - ├── TableProductsView useProductsState() → Tabelle + Total - │ - └── RowProduct useProductsActions() → UPDATE_AMOUNT / UPDATE_PRICE - │ - ▼ - productsReducer neuer items-Array → Context → UI -``` - -## Kurz: warum diese Aufteilung? - -- **`initialState.js`** – Startzustand und Validierung, unabhängig von React -- **`reducer.js`** – alle State-Übergänge testbar ohne Komponenten -- **`ProductsStore.jsx`** – React-Anbindung (Context, Provider, Hooks) -- **zwei Contexts** – Zeilen, die nur dispatchen, re-rendern nicht unnötig -- **Custom Hooks** – klare API, Fehler wenn der Provider fehlt -- **kein Prop Drilling** – neue Kind-Komponenten können den Store direkt nutzen - ---- - -# Architektur & Funktionsweise des ProductsProvider - -Dieser Store implementiert ein **Optimistic UI mit entkoppeltem, gepuffertem Backend-Sync (Debounce & Merge)**. - -``` -UI Input (z. B. Tippen im Input-Feld) - │ - ├──▶ 1. dispatch(...) ──▶ State aktualisiert sich SOFORT (UI reagiert flüssig) - │ - └──▶ 2. schedulePatch(...) ──▶ Änderungen sammeln & Timer starten (400 ms) - │ - (nach 400 ms Ruhe) - │ - ▼ - flushPatch(...) ──▶ HTTP PATCH an API - -``` - ---- - -## 1. Kernkonzept: `schedulePatch` vs. `flushPatch` - -Beim Bearbeiten von Feldern (wie Preis oder Menge) feuert die Eingabe bei jedem Tastendruck (`onChange`). Würde man jedes Mal sofort einen API-Request senden, würde das Backend mit HTTP-Aufrufen überflutet werden. - -### `schedulePatch(id, patch)` – Das Sammelbecken & der Timer - -**Zweck:** Nimmt Änderungen entgegen, führt sie pro Produkt zusammen (_mergen_) und setzt den Countdown zurück (_debouncen_). - -1. **Merge (`pendingPatches`):** - -- Tippt der Nutzer schnell hintereinander Menge `5` und Preis `19.99`, merkt sich die Map: `{ stock: 5, price: 19.99 }`. - -2. **Timer-Reset (`persistTimers`):** - -- Läuft bereits ein Timer für dieses Produkt, wird er mit `clearTimeout` gestoppt. -- Ein neuer 400ms-Timer startet. Erst wenn der Nutzer **400 ms lang nichts mehr tippt**, läuft der Timer ab. - ---- - -### `flushPatch(id)` – Der Ausführer - -**Zweck:** Holt die gesammelten Änderungen ab und sendet den eigentlichen API-Request. - -1. **Puffer leeren:** Holt das zusammengefasste Patch-Objekt aus `pendingPatches.current` und löscht es sofort aus der Map (verhindert doppelte Requests). -2. **Timer aufräumen:** Entfernt eventuell noch vorhandene Timer-Referenzen. -3. **API-Call (`patchProduct`):** Sendet den minimalen Patch an den Server. -4. **Erfolg:** Aktualisiert das Produkt im State mit den offiziellen Serverdaten (`SET_ITEM`). -5. **Fehlerfall (Rollback):** Schlägt der Request fehl, wird der Fehler gesetzt und via `loadProducts()` der alte/gültige Serverzustand nachgeladen (Rollback des optimistischen UI-Updates). - ---- - -## 2. Der Unmount-Cleanup (`useEffect`) - -Verlässt der Nutzer die Seite oder wird der Provider abgebaut, greift die Cleanup-Funktion: - -```javascript -useEffect(() => { - return () => { - // 1. Laufende Timer sofort stoppen - timers.forEach((timer) => clearTimeout(timer)); - timers.clear(); - - // 2. Ungespeicherte Änderungen sofort absenden ("Flush on Unmount") - patches.forEach((patch, id) => { - if (patch && Object.keys(patch).length > 0) { - patchProduct(id, patch).catch(() => {}); - } - }); - patches.clear(); - }; -}, []); -``` - -- Verhindert Datenverlust, wenn der Nutzer kurz nach einer Eingabe navigiert. - ---- - -## 3. Die 3-Context-Architektur - -Der Store teilt die Verantwortlichkeiten in **drei separate Contexte** auf, um unnötige Re-Renders im Komponentenbaum vollständig zu unterbinden: - -| Context | Hook | Inhalt | Re-Render Verhalten | -| ----------------------------- | ----------------------- | -------------------------------------------- | --------------------------------------------------------------------------------------------------- | -| **`ProductsStateContext`** | `useProductsState()` | `state` (Items, Loading, Error) | Rendert **nur** neu, wenn sich der State ändert (z. B. Listen-Komponenten). | -| **`ProductsDispatchContext`** | `useProductsDispatch()` | `dispatch` | **Rendert nie neu** (Referenz bleibt über gesamten App-Lebenszyklus stabil). | -| **`ProductsActionsContext`** | `useProductsActions()` | Methoden (`updatePrice`, `addProduct`, etc.) | **Rendert nie neu**, da alle Actions mit `useCallback` und stabilen Abhängigkeiten memoisiert sind. | - ---- - -## 4. Übersicht der Action-Methoden - -- **`updateAmount(amount, id)` & `updatePrice(price, id)`:** -- **Optimistisch & Debounced:** Ändern sofort den lokalen State via `dispatch` und reichen die Daten an `schedulePatch` weiter. - -- **`addProduct(product)`, `saveProduct(id, product)`, `removeProduct(id)`:** -- **Pessimistisch & Direkt:** Warten direkt auf die API-Antwort (`async/await`) und updaten erst nach erfolgreichem Server-Response den Reducer-State. - -- **`loadProducts()`:** -- Lädt die komplette Produktliste manuell neu (z. B. nach einem Rollback oder Pull-to-Refresh). - - ---- - -## useLayoutEffect vs. useEffect - -Der Hauptunterschied liegt im **Timing der Ausführung** relativ zum Browser-Rendering: - -| Eigenschaft | `useLayoutEffect` | `useEffect` | -| --- | --- | --- | -| **Ausführungsart** | **Synchron** (blockiert das Painting) | **Asynchron / Deferiert** (nach dem Painting) | -| **Zeitpunkt** | Direkt nach den DOM-Mutationen, *bevor* der Browser den Bildschirm aktualisiert | Nachdem der Browser die Pixel auf den Bildschirm gezeichnet hat | -| **Haupt-Use-Case** | DOM-Messungen (`getBoundingClientRect`), visuelle DOM-Mutationen zur Vermeidung von Layout Shifts / Flackern | Data Fetching, Subscriptions, Logging, Storage-Zugriffe | -| **Performance-Impact** | Kann UI-Ruckler verursachen, wenn Berechnungen zu lange dauern | Keine Blockierung der UI-Darstellung | - ---- - -**Analyse deines Codes:** - -* **`useLayoutEffect` für `setAuthToken(state.token)**`: -* *Zweck hier:* Der Token (z. B. in Axios-Headern oder API-Clients) wird **synchron** gesetzt, noch bevor Kindkomponenten in ihren eigenen `useEffect`-Hooks initiale API-Aufrufe ausführen. Dadurch wird ein Race Condition vermieden, bei dem ein Kind-Effekt einen Request ohne gültigen Header losschickt. - - -* **`useEffect` für `persistAuth(...)**`: -* *Zweck hier:* Das Schreiben in den `localStorage`/`IndexedDB` ist ein Side Effect, der die visuelle Darstellung nicht direkt beeinflusst und daher die UI nicht blockieren muss. \ No newline at end of file diff --git a/webseite-react-php-jwt/react-app/eslint.config.js b/webseite-react-php-jwt/react-app/eslint.config.js deleted file mode 100644 index 4fa125d..0000000 --- a/webseite-react-php-jwt/react-app/eslint.config.js +++ /dev/null @@ -1,29 +0,0 @@ -import js from '@eslint/js' -import globals from 'globals' -import reactHooks from 'eslint-plugin-react-hooks' -import reactRefresh from 'eslint-plugin-react-refresh' -import { defineConfig, globalIgnores } from 'eslint/config' - -export default defineConfig([ - globalIgnores(['dist']), - { - files: ['**/*.{js,jsx}'], - extends: [ - js.configs.recommended, - reactHooks.configs.flat.recommended, - reactRefresh.configs.vite, - ], - languageOptions: { - ecmaVersion: 2020, - globals: globals.browser, - parserOptions: { - ecmaVersion: 'latest', - ecmaFeatures: { jsx: true }, - sourceType: 'module', - }, - }, - rules: { - 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }], - }, - }, -]) diff --git a/webseite-react-php-jwt/react-app/index.html b/webseite-react-php-jwt/react-app/index.html deleted file mode 100644 index c0b3511..0000000 --- a/webseite-react-php-jwt/react-app/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - react-app - - -
      - - - diff --git a/webseite-react-php-jwt/react-app/package-lock.json b/webseite-react-php-jwt/react-app/package-lock.json deleted file mode 100644 index 2e0c67c..0000000 --- a/webseite-react-php-jwt/react-app/package-lock.json +++ /dev/null @@ -1,3196 +0,0 @@ -{ - "name": "react-app", - "version": "0.0.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "react-app", - "version": "0.0.1", - "dependencies": { - "@splidejs/react-splide": "^0.7.12", - "axios": "^1.20.0", - "bootstrap": "^5.3.8", - "react": "^19.2.8", - "react-dom": "^19.2.8", - "react-icons": "^5.7.0", - "react-router-dom": "^7.18.3", - "uuid": "^14.0.2" - }, - "devDependencies": { - "@eslint/js": "^10.0.1", - "@types/react": "^19.2.18", - "@types/react-dom": "^19.2.5", - "@vitejs/plugin-react": "^6.1.1", - "eslint": "^10.9.1", - "eslint-plugin-react-hooks": "^7.1.1", - "eslint-plugin-react-refresh": "^0.5.5", - "globals": "^17.12.0", - "sass": "^1.103.1", - "vite": "^8.2.2" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", - "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.29.7", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", - "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", - "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-compilation-targets": "^7.29.7", - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helpers": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", - "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.8", - "@babel/types": "^7.29.8", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", - "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", - "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", - "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", - "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", - "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", - "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", - "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.8" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/template": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", - "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", - "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.8", - "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.8", - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.8", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", - "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", - "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.23.5", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", - "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^3.0.5", - "debug": "^4.3.1", - "minimatch": "^10.2.4" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", - "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^1.2.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/core": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", - "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/js": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", - "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "eslint": "^10.0.0" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/@eslint/object-schema": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", - "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", - "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^1.2.1", - "levn": "^0.4.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", - "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/types": "^0.15.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", - "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.2", - "@humanfs/types": "^0.15.0", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/types": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", - "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@oxc-project/types": { - "version": "0.147.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.147.0.tgz", - "integrity": "sha512-IJ3s6ltHLp45S0bh7phkX+gJO7A1Wuz2EaqpAhb8WjqDwbzMiWKHhyyT42tskaWjEYXtHtVCPpnBJVT9+dcRLg==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz", - "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.3", - "is-glob": "^4.0.3", - "node-addon-api": "^7.0.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.6.0", - "@parcel/watcher-darwin-arm64": "2.6.0", - "@parcel/watcher-darwin-x64": "2.6.0", - "@parcel/watcher-freebsd-x64": "2.6.0", - "@parcel/watcher-linux-arm-glibc": "2.6.0", - "@parcel/watcher-linux-arm-musl": "2.6.0", - "@parcel/watcher-linux-arm64-glibc": "2.6.0", - "@parcel/watcher-linux-arm64-musl": "2.6.0", - "@parcel/watcher-linux-x64-glibc": "2.6.0", - "@parcel/watcher-linux-x64-musl": "2.6.0", - "@parcel/watcher-win32-arm64": "2.6.0", - "@parcel/watcher-win32-x64": "2.6.0" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz", - "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz", - "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz", - "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz", - "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz", - "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz", - "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz", - "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz", - "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz", - "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz", - "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz", - "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz", - "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "license": "MIT", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@rolldown/binding-android-arm-eabi": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.6.tgz", - "integrity": "sha512-b+jTcARdTiFLI6jB4a5XjTm0RWd6KcRfQj/I2356fxUZemiho9zQLxo0RtCuMDAyKcLo6cEltkgbQp6d1+sjjQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.6.tgz", - "integrity": "sha512-lkWU8ZJaRk9q3CIEY1Tc7vIFALp3Xw5NfGJo2hQg5oIqNgxWi1zI+IiDEK3r70BF5Dzol1tcXsnzsRc8NLhG+Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.6.tgz", - "integrity": "sha512-dgR56NYnvAszm7Ob1B2/Vn0e8bUQYZH2UjVaMMtMVOCKFSfjhfLmuA/9+O+F+ajUdG6B/bSssrKW6JJYASa8jA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.6.tgz", - "integrity": "sha512-vpVxFvUCFioJqug7OTvqptkc4yb8UX0AwfDmJpaR/0sWz+BUmqSVAf7c8JkUgnN8YLspb4a/N6NhTyMAmdyQ7Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.6.tgz", - "integrity": "sha512-h1wG6Y6K3JlRswxsI64qQJqBAy4vrLuHgRbc8CZMGSWTOFRY6ghMApM1NKzB2I0n5xV1fjkE18SuVl2QpLeNpA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.6.tgz", - "integrity": "sha512-tbCiqub0q2MVWJKgF5PoAlNWCtQydiOYSLIkd8sByqK/6MMYLJRcSXSYodqYtd0O+Fw7QaVmKKlS4oL94YRZ0w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.6.tgz", - "integrity": "sha512-oxK9+baEBPhZG5HB4URY+uU04zJWeZlH6Tb9rB5DK4DF9XR1uXNLXt5Q5ZsugTKayNCNLhkcwz/ye74hRI98dg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.6.tgz", - "integrity": "sha512-muWCk27FVBEZtv0MsK8gnfSmgczA8KQ0uRVJbTABKhkRfQc38aUrcb7fhi3BNiyseFmgcRsoMfQsSNJ+DbZdSw==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.6.tgz", - "integrity": "sha512-eWDoSfU7Co2qj3vgB3Dt4lj1mG6CoWbcJQkRMP3XJplyCMtuaq3LHvPFjS9QIPvMGWVadJC04Xiy0IdcVPtnwQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.6.tgz", - "integrity": "sha512-2bWNjRSIayvupRKxXUY2tWG9fYdoUlTqWywHRvE8Eq3GvuQ+f2HeIkve697fIt+IQs/PV8yFsdWuhp1aJ1PdnA==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.6.tgz", - "integrity": "sha512-KekI0gS0wLxe1UBSQSjenBVwou/JkcQPDzBPICGZjxUv9k3RteHDPBQaiOicZUFKRIH2wKEimGwVpnJsbPzu7w==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.6.tgz", - "integrity": "sha512-TvtPnfVr+HtyGiDmPK4VWmlNm7QhNNAcK5Q9A7aOXsI8545yCyaoMaicXrFZ72JzeYjaUVk7yT243zT0jzjFKQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.6.tgz", - "integrity": "sha512-iOo0VEay2XFhaCcH0sps5XIimkSuOnNaZrf6+ZkoSOQBJPKNU48RkmJv0/lSpipexu5P+ouFgafe5IGr/DiQfg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.6.tgz", - "integrity": "sha512-y5NTmmasMS455JlOCO4ZM9krIchv3Mvm1crL1iUPGOPgEzSkves9n0SdC5Sjz6+qWDFhd8/JpfWMH8NSWNHe+A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.6.tgz", - "integrity": "sha512-np8iZSLfXlAD4kWhiyq/u0Yt8oZDtRQ8lGhQaCXo2rl37KNjeU0GjJuwr4P3oeZ++ROfofsKNBqR5LTO8aXyWQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@splidejs/react-splide": { - "version": "0.7.12", - "resolved": "https://registry.npmjs.org/@splidejs/react-splide/-/react-splide-0.7.12.tgz", - "integrity": "sha512-UfXH+j47jsMc4x5HA/aOwuuHPqn6y9+ZTNYPWDRD8iLKvIVMZlzq2unjUEvyDAU+TTVPZOXkG2Ojeoz0P4AkZw==", - "license": "MIT", - "dependencies": { - "@splidejs/splide": "^4.1.3" - } - }, - "node_modules/@splidejs/splide": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@splidejs/splide/-/splide-4.1.4.tgz", - "integrity": "sha512-5I30evTJcAJQXt6vJ26g2xEkG+l1nXcpEw4xpKh0/FWQ8ozmAeTbtniVtVmz2sH1Es3vgfC4SS8B2X4o5JMptA==", - "license": "MIT" - }, - "node_modules/@types/esrecurse": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", - "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.2.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", - "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.2.5", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.5.tgz", - "integrity": "sha512-fMPwH9v7r/pp43yUd2/Mbiex5KouJwwR3dzHkhLREUC6764VyDsqxhAxv6OFEYR1RhjOyD1naqba8ECDBe7ZQg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.1.1.tgz", - "integrity": "sha512-yxLaQV9gkhS8ezJqCM6+ndU7mDY6gqAg75NQ+0IjwEI8IYOmQCgkRwHKVSfWXW076DsqMo0Dk+0FK1U+M5RgFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rolldown/pluginutils": "^1.0.1" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", - "babel-plugin-react-compiler": "^1.0.0", - "oxc-transform-react": "^0.145.0", - "vite": "^8.0.0" - }, - "peerDependenciesMeta": { - "@rolldown/plugin-babel": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true - }, - "oxc-transform-react": { - "optional": true - } - } - }, - "node_modules/acorn": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", - "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.20.0.tgz", - "integrity": "sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.16.0", - "form-data": "^4.0.6", - "https-proxy-agent": "^5.0.1", - "proxy-from-env": "^2.1.0" - } - }, - "node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/baseline-browser-mapping": { - "version": "2.11.19", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.19.tgz", - "integrity": "sha512-Grytf1xOxOEMTGRwx6rLGKkTabd4vMg3VrKdj/7joCmV0qgh4QwMMO6xh34YEXQqirAuUdgQGa5orJQQ+69RBw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/bootstrap": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz", - "integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/twbs" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - } - ], - "license": "MIT", - "peerDependencies": { - "@popperjs/core": "^2.11.8" - } - }, - "node_modules/brace-expansion": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", - "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/browserslist": { - "version": "4.28.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", - "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.11.12", - "caniuse-lite": "^1.0.30001809", - "electron-to-chromium": "^1.5.402", - "node-releases": "^2.0.53", - "update-browserslist-db": "^1.3.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001810", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", - "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", - "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.414", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.414.tgz", - "integrity": "sha512-aYlviXiaXBbzvKgyALpcMmqa3Np3sDr0XnZbEG62n2UpZFbEcjQ4EEMOLGzVPhwVnwTz0lvKY+GcARbunuHekw==", - "dev": true, - "license": "ISC" - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", - "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.9.1.tgz", - "integrity": "sha512-9VaAkDURekixUQJy0oJYl2DcN6oKMfxay7XzaGYAWQwsb6qfKf+x76R2k1L8kb1boc+FyCAaTA9GmiKaaiaF+A==", - "dev": true, - "license": "MIT", - "workspaces": [ - "packages/*" - ], - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.2", - "@eslint/config-array": "^0.23.5", - "@eslint/config-helpers": "^0.7.0", - "@eslint/core": "^1.2.1", - "@eslint/plugin-kit": "^0.7.2", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.14.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^9.1.2", - "eslint-visitor-keys": "^5.0.1", - "espree": "^11.2.0", - "esquery": "^1.7.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "minimatch": "^10.2.5", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", - "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.24.4", - "@babel/parser": "^7.24.4", - "hermes-parser": "^0.25.1", - "zod": "^3.25.0 || ^4.0.0", - "zod-validation-error": "^3.5.0 || ^4.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" - } - }, - "node_modules/eslint-plugin-react-refresh": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.5.tgz", - "integrity": "sha512-vG7yLURXNvCHy0FBdbZRwIu0BLPJMlUUJS2Ep7ud9w1YCLftFZtuEjyjhym0Qq9yuZ6LJUitNlu/hMk0gakXAw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "eslint": "^9 || ^10" - } - }, - "node_modules/eslint-scope": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", - "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@types/esrecurse": "^4.3.1", - "@types/estree": "^1.0.8", - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", - "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.16.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^5.0.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", - "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", - "dev": true, - "license": "ISC" - }, - "node_modules/follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", - "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.4", - "mime-types": "^2.1.35" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "17.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-17.12.0.tgz", - "integrity": "sha512-cezEd/DTyyht9cvSSURyygXPfy04GtWO/5e6ZPvH7fCtjKz9PYOmuawphw1Ctd1f6C+5JypXfGD7ahNMXvevBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", - "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hermes-estree": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", - "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", - "dev": true, - "license": "MIT" - }, - "node_modules/hermes-parser": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", - "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "hermes-estree": "0.25.1" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/immutable": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", - "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", - "dev": true, - "license": "MIT" - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lightningcss": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", - "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.33.0", - "lightningcss-darwin-arm64": "1.33.0", - "lightningcss-darwin-x64": "1.33.0", - "lightningcss-freebsd-x64": "1.33.0", - "lightningcss-linux-arm-gnueabihf": "1.33.0", - "lightningcss-linux-arm64-gnu": "1.33.0", - "lightningcss-linux-arm64-musl": "1.33.0", - "lightningcss-linux-x64-gnu": "1.33.0", - "lightningcss-linux-x64-musl": "1.33.0", - "lightningcss-win32-arm64-msvc": "1.33.0", - "lightningcss-win32-x64-msvc": "1.33.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", - "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", - "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", - "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", - "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", - "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", - "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", - "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", - "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", - "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", - "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", - "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", - "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.8" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.18", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", - "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/node-releases": { - "version": "2.0.53", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", - "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", - "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", - "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.17", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/proxy-from-env": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", - "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/react": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", - "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", - "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.8" - } - }, - "node_modules/react-icons": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.7.0.tgz", - "integrity": "sha512-LBLy340Rzqy6+/yVhZKT3B/QpP1BZaesGqasf09HPOBzRarcDIFH0WwXlXQfE7q7ipxK4MSiC5DIBWURCny6fw==", - "license": "MIT", - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-router": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.3.tgz", - "integrity": "sha512-gyXgtdr5uACJ5b1Q4udzjVV+tb/rlHIMJKuJ0e89R4Kzgz47z/rgP0dIKxktqIEUhDHluGTPJJH/wRha7CyqsA==", - "license": "MIT", - "dependencies": { - "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/react-router-dom": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.3.tgz", - "integrity": "sha512-ytVbyBBM7vMfRCam25r0WMhSVSom909A8p+8m0/f1w853dz/xfFu6etAT2SEbVoSnI+ZoPRDqIsQXVT89gp7kg==", - "license": "MIT", - "dependencies": { - "react-router": "7.18.3" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - } - }, - "node_modules/readdirp": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", - "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/rolldown": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.6.tgz", - "integrity": "sha512-vMM4q3aixf46GiF1Kok8jDPFsEpXgFWGjUHXNkNHNm+Y2adXAG2dbX91jkti3i0ZRsOlcmbuzAz1poObSHCmUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "=0.147.0", - "@rolldown/pluginutils": "^1.0.0" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm-eabi": "1.2.6", - "@rolldown/binding-android-arm64": "1.2.6", - "@rolldown/binding-darwin-arm64": "1.2.6", - "@rolldown/binding-darwin-x64": "1.2.6", - "@rolldown/binding-freebsd-x64": "1.2.6", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.6", - "@rolldown/binding-linux-arm64-gnu": "1.2.6", - "@rolldown/binding-linux-arm64-musl": "1.2.6", - "@rolldown/binding-linux-ppc64-gnu": "1.2.6", - "@rolldown/binding-linux-s390x-gnu": "1.2.6", - "@rolldown/binding-linux-x64-gnu": "1.2.6", - "@rolldown/binding-linux-x64-musl": "1.2.6", - "@rolldown/binding-openharmony-arm64": "1.2.6", - "@rolldown/binding-win32-arm64-msvc": "1.2.6", - "@rolldown/binding-win32-x64-msvc": "1.2.6" - } - }, - "node_modules/sass": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.103.1.tgz", - "integrity": "sha512-9icZURbP51S6S0QGoyaeqk9uB06GNWxsFYWfH5RgpFgqK5FA8tJcM3AdVxrZEVJ7dz+L87nG95gBKf4VuaMHGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^5.0.0", - "immutable": "^5.1.5", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=20.19.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" - } - }, - "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/set-cookie-parser": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", - "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", - "license": "MIT" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz", - "integrity": "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/uuid": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.2.tgz", - "integrity": "sha512-xZe/16rV4aa+HGSOCiY2YeLT1OybRLrrkL/Rqaq7p7GMVXjFh+6wN4oMYgjFmnSnhY8t6Xpdl2l9qmnHYuMHwQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist-node/bin/uuid" - } - }, - "node_modules/vite": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", - "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "lightningcss": "^1.33.0", - "picomatch": "^4.0.5", - "postcss": "^8.5.26", - "rolldown": "~1.2.4", - "tinyglobby": "^0.2.17" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.4.0 || ^0.5.0", - "esbuild": "^0.27.0 || ^0.28.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", - "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-validation-error": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", - "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "zod": "^3.25.0 || ^4.0.0" - } - } - } -} diff --git a/webseite-react-php-jwt/react-app/package.json b/webseite-react-php-jwt/react-app/package.json deleted file mode 100644 index 83050ad..0000000 --- a/webseite-react-php-jwt/react-app/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "react-app", - "private": true, - "version": "0.0.1", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "lint": "eslint .", - "preview": "vite preview" - }, - "dependencies": { - "@splidejs/react-splide": "^0.7.12", - "axios": "^1.20.0", - "bootstrap": "^5.3.8", - "react": "^19.2.8", - "react-dom": "^19.2.8", - "react-icons": "^5.7.0", - "react-router-dom": "^7.18.3", - "uuid": "^14.0.2" - }, - "devDependencies": { - "@eslint/js": "^10.0.1", - "@types/react": "^19.2.18", - "@types/react-dom": "^19.2.5", - "@vitejs/plugin-react": "^6.1.1", - "eslint": "^10.9.1", - "eslint-plugin-react-hooks": "^7.1.1", - "eslint-plugin-react-refresh": "^0.5.5", - "globals": "^17.12.0", - "sass": "^1.103.1", - "vite": "^8.2.2" - } -} diff --git a/webseite-react-php-jwt/react-app/public/data/nerdshop-products.json b/webseite-react-php-jwt/react-app/public/data/nerdshop-products.json deleted file mode 100644 index f8db02d..0000000 --- a/webseite-react-php-jwt/react-app/public/data/nerdshop-products.json +++ /dev/null @@ -1,119 +0,0 @@ -[ - { - "_id": "675bee96bb39023b77e6cd92", - "title": "Smart Coffee Mug with LCD Level Indicator", - "sku": "MUG0007", - "stock": 25, - "price": 49.99, - "description": "Know exactly how much coffee you have left with this LCD-equipped mug.", - "tagline": "Never face an empty mug again." - }, - { - "_id": "675bee96bb39023b77e6cd93", - "title": "Bluetooth Coffee Mug with Fortune Telling Scanner", - "sku": "MUG0013", - "stock": 15, - "price": 99.99, - "description": "Get your daily fortune with every sip using this Bluetooth-connected mug.", - "tagline": "Coffee reading, made smart." - }, - { - "_id": "675bee96bb39023b77e6cd94", - "title": "South Pole Tested Pre-Warmed Ink Pen", - "sku": "OFF3145", - "stock": 34, - "price": 29.95, - "description": "Write smoothly even in the coldest conditions with this pre-warmed ink pen.", - "tagline": "The pen that conquers the cold." - }, - { - "_id": "675bee96bb39023b77e6cd95", - "title": "Ambidextrous Computer Mouse", - "sku": "COM1001", - "stock": 50, - "price": 19.9, - "description": "Finally, a mouse designed for both left and right-handed users.", - "tagline": "End the left-right struggle." - }, - { - "_id": "675bee96bb39023b77e6cd96", - "title": "Easter Egg Themed Webcam", - "sku": "COM0404", - "stock": 8, - "price": 14.99, - "description": "Add some festive flair to your video calls with this Easter egg webcam.", - "tagline": "Happy Easter, every day." - }, - { - "_id": "675bee96bb39023b77e6cd97", - "title": "Vulcan Language vi Cheatsheet", - "sku": "COM0001", - "stock": 6, - "price": 9.9, - "description": "Master the Vulcan language and vi editor simultaneously with this handy cheatsheet.", - "tagline": "Learn vi and Vulcan, live long and prosper." - }, - { - "_id": "675bee96bb39023b77e6cd98", - "title": "Klingon Language emacs Cheatsheet", - "sku": "COM1536", - "stock": 33, - "price": 9.9, - "description": "Conquer the Klingon language and emacs with this comprehensive cheatsheet.", - "tagline": "Learn emacs and Klingon, qapla'!" - }, - { - "_id": "675bee96bb39023b77e6cda0", - "title": "Self-Folding Laundry Basket", - "sku": "HME0023", - "stock": 15, - "price": 79.99, - "description": "Say goodbye to laundry clutter with this self-folding basket.", - "tagline": "Laundry day just got easier." - }, - { - "_id": "675bee96bb39023b77e6cda1", - "title": "Noise-Cancelling Headphones for Cats", - "sku": "PET0112", - "stock": 39, - "price": 39.95, - "description": "Give your cat the gift of silence with these noise-canceling headphones.", - "tagline": "Purrfect tranquility for your feline friend." - }, - { - "_id": "675bee96bb39023b77e6cda2", - "title": "Glow-in-the-Dark Toilet Paper", - "sku": "HME0221", - "stock": 65, - "price": 12.5, - "description": "Navigate your midnight bathroom trips with ease using this glow-in-the-dark toilet paper.", - "tagline": "A guiding light in the darkness." - }, - { - "_id": "675bee96bb39023b77e6cda3", - "title": "Automatic Plant Waterer with Compliment Dispenser", - "sku": "GRD0334", - "stock": 17, - "price": 69.99, - "description": "Keep your plants happy and hydrated with automatic watering and daily compliments.", - "tagline": "Nurture your plants, boost their self-esteem." - }, - { - "_id": "675bee96bb39023b77e6cda4", - "title": "Self-Stirring Cereal Bowl", - "sku": "KIT0445", - "stock": 55, - "price": 24.95, - "description": "Enjoy perfectly crunchy cereal every time with this self-stirring bowl.", - "tagline": "No more soggy surprises." - }, - { - "_id": "675bee96bb39023b77e6cda5", - "title": "Polygon Planet Lamp", - "sku": "LMP0556", - "stock": 4, - "price": 39.9, - "description": "Transform your space with the enchanting glow of a planetarium-inspired lamp.", - "tagline": "Bring the cosmos into your home." - } -] diff --git a/webseite-react-php-jwt/react-app/public/fonts/amatic-sc-v28-latin/amatic-sc-v28-latin-700.woff2 b/webseite-react-php-jwt/react-app/public/fonts/amatic-sc-v28-latin/amatic-sc-v28-latin-700.woff2 deleted file mode 100644 index 05ba3cf..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/amatic-sc-v28-latin/amatic-sc-v28-latin-700.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/amatic-sc-v28-latin/amatic-sc-v28-latin-regular.woff2 b/webseite-react-php-jwt/react-app/public/fonts/amatic-sc-v28-latin/amatic-sc-v28-latin-regular.woff2 deleted file mode 100644 index 804b1aa..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/amatic-sc-v28-latin/amatic-sc-v28-latin-regular.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-300.woff2 b/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-300.woff2 deleted file mode 100644 index cafa2fd..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-300.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-300italic.woff2 b/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-300italic.woff2 deleted file mode 100644 index 5d870b3..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-300italic.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-500.woff2 b/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-500.woff2 deleted file mode 100644 index eff5a1c..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-500.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-500italic.woff2 b/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-500italic.woff2 deleted file mode 100644 index 277cfa8..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-500italic.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-600.woff2 b/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-600.woff2 deleted file mode 100644 index c366145..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-600.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-600italic.woff2 b/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-600italic.woff2 deleted file mode 100644 index 9e91423..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-600italic.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-700.woff2 b/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-700.woff2 deleted file mode 100644 index 1c1896b..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-700.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-700italic.woff2 b/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-700italic.woff2 deleted file mode 100644 index 6fe153e..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-700italic.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-800.woff2 b/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-800.woff2 deleted file mode 100644 index 275090e..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-800.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-800italic.woff2 b/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-800italic.woff2 deleted file mode 100644 index 6729bf3..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-800italic.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-900.woff2 b/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-900.woff2 deleted file mode 100644 index b3fdf21..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-900.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-900italic.woff2 b/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-900italic.woff2 deleted file mode 100644 index f4e2d9d..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-900italic.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-italic.woff2 b/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-italic.woff2 deleted file mode 100644 index fdb5252..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-italic.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-regular.woff2 b/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-regular.woff2 deleted file mode 100644 index 824753f..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/merriweather-v33-latin/merriweather-v33-latin-regular.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-300.woff2 b/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-300.woff2 deleted file mode 100644 index e000fcb..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-300.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-300italic.woff2 b/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-300italic.woff2 deleted file mode 100644 index 5167821..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-300italic.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-500.woff2 b/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-500.woff2 deleted file mode 100644 index a35be30..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-500.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-500italic.woff2 b/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-500italic.woff2 deleted file mode 100644 index 039e72f..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-500italic.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-600.woff2 b/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-600.woff2 deleted file mode 100644 index f67ef00..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-600.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-600italic.woff2 b/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-600italic.woff2 deleted file mode 100644 index bd6a4d1..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-600italic.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-700.woff2 b/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-700.woff2 deleted file mode 100644 index 7e3b8b0..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-700.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-700italic.woff2 b/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-700italic.woff2 deleted file mode 100644 index 2c96334..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-700italic.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-800.woff2 b/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-800.woff2 deleted file mode 100644 index cf65114..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-800.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-800italic.woff2 b/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-800italic.woff2 deleted file mode 100644 index 17bc073..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-800italic.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-italic.woff2 b/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-italic.woff2 deleted file mode 100644 index 84ee197..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-italic.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-regular.woff2 b/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-regular.woff2 deleted file mode 100644 index eaae942..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/open-sans-v40-latin/open-sans-v40-latin-regular.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-200.woff2 b/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-200.woff2 deleted file mode 100644 index c29a4c8..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-200.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-200italic.woff2 b/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-200italic.woff2 deleted file mode 100644 index 7840ccb..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-200italic.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-300.woff2 b/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-300.woff2 deleted file mode 100644 index 9ac7d7b..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-300.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-300italic.woff2 b/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-300italic.woff2 deleted file mode 100644 index 45158af..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-300italic.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-500.woff2 b/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-500.woff2 deleted file mode 100644 index 2f6e1f1..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-500.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-500italic.woff2 b/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-500italic.woff2 deleted file mode 100644 index 64d1b85..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-500italic.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-600.woff2 b/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-600.woff2 deleted file mode 100644 index aef4852..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-600.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-600italic.woff2 b/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-600italic.woff2 deleted file mode 100644 index 0bf6b85..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-600italic.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-700.woff2 b/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-700.woff2 deleted file mode 100644 index 9c33eed..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-700.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-700italic.woff2 b/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-700italic.woff2 deleted file mode 100644 index ef7994f..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-700italic.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-800.woff2 b/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-800.woff2 deleted file mode 100644 index 00041b2..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-800.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-800italic.woff2 b/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-800italic.woff2 deleted file mode 100644 index b1a1376..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-800italic.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-900.woff2 b/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-900.woff2 deleted file mode 100644 index bec6da8..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-900.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-900italic.woff2 b/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-900italic.woff2 deleted file mode 100644 index b1851d5..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-900italic.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-italic.woff2 b/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-italic.woff2 deleted file mode 100644 index 5c81ab3..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-italic.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-regular.woff2 b/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-regular.woff2 deleted file mode 100644 index d1f2d84..0000000 Binary files a/webseite-react-php-jwt/react-app/public/fonts/source-code-pro-v31-latin/source-code-pro-v31-latin-regular.woff2 and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/img/header-bg.jpg b/webseite-react-php-jwt/react-app/public/img/header-bg.jpg deleted file mode 100644 index 7113677..0000000 Binary files a/webseite-react-php-jwt/react-app/public/img/header-bg.jpg and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/img/jokes-bg.jpg b/webseite-react-php-jwt/react-app/public/img/jokes-bg.jpg deleted file mode 100644 index 594f316..0000000 Binary files a/webseite-react-php-jwt/react-app/public/img/jokes-bg.jpg and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/img/logo-react.min.svg b/webseite-react-php-jwt/react-app/public/img/logo-react.min.svg deleted file mode 100644 index 5fb5f94..0000000 --- a/webseite-react-php-jwt/react-app/public/img/logo-react.min.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/webseite-react-php-jwt/react-app/public/img/logo-react.svg b/webseite-react-php-jwt/react-app/public/img/logo-react.svg deleted file mode 100644 index 08c4248..0000000 --- a/webseite-react-php-jwt/react-app/public/img/logo-react.svg +++ /dev/null @@ -1,1923 +0,0 @@ - - \ No newline at end of file diff --git a/webseite-react-php-jwt/react-app/public/img/slides/slide-01.jpg b/webseite-react-php-jwt/react-app/public/img/slides/slide-01.jpg deleted file mode 100644 index d98bbcc..0000000 Binary files a/webseite-react-php-jwt/react-app/public/img/slides/slide-01.jpg and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/img/slides/slide-02.jpg b/webseite-react-php-jwt/react-app/public/img/slides/slide-02.jpg deleted file mode 100644 index 2b2d966..0000000 Binary files a/webseite-react-php-jwt/react-app/public/img/slides/slide-02.jpg and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/img/slides/slide-03.jpg b/webseite-react-php-jwt/react-app/public/img/slides/slide-03.jpg deleted file mode 100644 index 70509f3..0000000 Binary files a/webseite-react-php-jwt/react-app/public/img/slides/slide-03.jpg and /dev/null differ diff --git a/webseite-react-php-jwt/react-app/public/vite.svg b/webseite-react-php-jwt/react-app/public/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/webseite-react-php-jwt/react-app/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/webseite-react-php-jwt/react-app/src/App.jsx b/webseite-react-php-jwt/react-app/src/App.jsx deleted file mode 100644 index bf14ef0..0000000 --- a/webseite-react-php-jwt/react-app/src/App.jsx +++ /dev/null @@ -1,20 +0,0 @@ -import FooterMain from './components/footers/FooterMain'; -import HeaderMain from './components/headers/HeaderMain'; -import NavMain from './components/navs/NavMain'; -import Router from './routes/Router'; -import { AuthProvider } from './stores/auth'; - -function App() { - return ( - - - -
      - -
      - -
      - ); -} - -export default App; diff --git a/webseite-react-php-jwt/react-app/src/assets/img/logo-js.min.svg b/webseite-react-php-jwt/react-app/src/assets/img/logo-js.min.svg deleted file mode 100644 index 97339d6..0000000 --- a/webseite-react-php-jwt/react-app/src/assets/img/logo-js.min.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/webseite-react-php-jwt/react-app/src/assets/react.svg b/webseite-react-php-jwt/react-app/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/webseite-react-php-jwt/react-app/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/webseite-react-php-jwt/react-app/src/components/footers/FooterMain.jsx b/webseite-react-php-jwt/react-app/src/components/footers/FooterMain.jsx deleted file mode 100644 index da00d18..0000000 --- a/webseite-react-php-jwt/react-app/src/components/footers/FooterMain.jsx +++ /dev/null @@ -1,48 +0,0 @@ -import NavSocial from '../navs/NavSocial'; - -const FooterMain = (props) => { - // const { } = props; - - return ( -
      -
      -
      -
      -
      -

      Contact

      -
      - John Smith -
      - 1 Example Street -
      - Anytown, AB1 2CD -
      -
      -
      -
      -
      -

      More Information

      - -
      -
      -
      -
      -

      Social Media

      - -
      -
      -
      -
      -
      - ); -}; -export default FooterMain; diff --git a/webseite-react-php-jwt/react-app/src/components/headers/HeaderMain.jsx b/webseite-react-php-jwt/react-app/src/components/headers/HeaderMain.jsx deleted file mode 100644 index 2cfd418..0000000 --- a/webseite-react-php-jwt/react-app/src/components/headers/HeaderMain.jsx +++ /dev/null @@ -1,21 +0,0 @@ -import LogoMain from '../logos/LogoMain'; -import SliderSplide from '../sliders/SliderSplide'; - -const HeaderMain = () => { - const images = [ - '/img/slides/slide-01.jpg', // - '/img/slides/slide-02.jpg', - '/img/slides/slide-03.jpg', - ]; - - return ( -
      - -
      - -
      -
      - ); -}; - -export default HeaderMain; diff --git a/webseite-react-php-jwt/react-app/src/components/icons/Logo.jsx b/webseite-react-php-jwt/react-app/src/components/icons/Logo.jsx deleted file mode 100644 index df70261..0000000 --- a/webseite-react-php-jwt/react-app/src/components/icons/Logo.jsx +++ /dev/null @@ -1,62 +0,0 @@ -const Logo = (props) => { - // const { } = props; - - return ( - - - - - - - - - - - - - - - - - - - - - - - - - ); -}; -export default Logo; diff --git a/webseite-react-php-jwt/react-app/src/components/inputs/InputAmount.jsx b/webseite-react-php-jwt/react-app/src/components/inputs/InputAmount.jsx deleted file mode 100644 index b7dcb73..0000000 --- a/webseite-react-php-jwt/react-app/src/components/inputs/InputAmount.jsx +++ /dev/null @@ -1,57 +0,0 @@ -// import { useState } from 'react'; -import { FaMinus, FaPlus } from 'react-icons/fa6'; - -const InputAmount = (props) => { - const { min = 0, max = 100, amount = 0 } = props; - // const [amount, setAmount] = useState(props.amount || 0); - - const handleChange = (e) => { - const inputValue = e.target.value; - const numericRegExp = /^-?\d*$/; // regular expression for numbers (including optional minus sign) - - if (numericRegExp.test(inputValue)) { - // setAmount(inputValue); - props.onHandleAmount(inputValue); - } - }; - - const handleClickIncrement = () => { - if (amount < max) { - // setAmount((amount) => amount + 1); - props.onHandleAmount(amount + 1); - } - }; - - const handleClickDecrement = () => { - if (amount > min) { - // setAmount((amount) => amount - 1); - props.onHandleAmount(amount - 1); - } - }; - - return ( -
      -
      - - - - - - - -
      -
      - ); -}; - -export default InputAmount; diff --git a/webseite-react-php-jwt/react-app/src/components/inputs/InputPrice.jsx b/webseite-react-php-jwt/react-app/src/components/inputs/InputPrice.jsx deleted file mode 100644 index 765cd16..0000000 --- a/webseite-react-php-jwt/react-app/src/components/inputs/InputPrice.jsx +++ /dev/null @@ -1,57 +0,0 @@ -// import { useState } from 'react'; - -const isValidPrice = (value) => { - // regular expression for price (up to 2 decimal places) - const regex = new RegExp(/^\d+(\.\d{0,2})?$/); - return regex.test(value); -}; - -const InputPrice = (props) => { - const { currency = '$', price = 0 } = props; - - // const [price, setPrice] = useState(parseFloat(props.price) || 0); - - const handleChange = (e) => { - const inputValue = parseFloat(e.target.value); - - // setPrice(inputValue); - props.onHandlePrice(inputValue); - }; - const handleBlur = (e) => { - const inputValue = e.target.value; - - if (!isValidPrice(inputValue)) { - // setPrice(0); - props.onHandlePrice(0); - } - }; - - const renderCurrency = () => { - if (currency === '$') { - return
      {currency}
      ; - } else if (currency === '€' || currency === '¥') { - return
      {currency}
      ; - } else { - return null; // or throw an error - } - }; - - return ( -
      -
      - {currency === '$' && renderCurrency()} - - {(currency === '€' || currency === '¥') && renderCurrency()} -
      -
      - ); -}; - -export default InputPrice; diff --git a/webseite-react-php-jwt/react-app/src/components/logos/LogoMain.jsx b/webseite-react-php-jwt/react-app/src/components/logos/LogoMain.jsx deleted file mode 100644 index 4f4c602..0000000 --- a/webseite-react-php-jwt/react-app/src/components/logos/LogoMain.jsx +++ /dev/null @@ -1,14 +0,0 @@ -// import Logo from '../../assets/img/logo-js.min.svg'; -import Logo from '../icons/Logo'; - -const LogoMain = (props) => { - // const { } = props; - - return ( -
      - {/* React */} - -
      - ); -}; -export default LogoMain; diff --git a/webseite-react-php-jwt/react-app/src/components/navs/NavMain.jsx b/webseite-react-php-jwt/react-app/src/components/navs/NavMain.jsx deleted file mode 100644 index 16fcfbd..0000000 --- a/webseite-react-php-jwt/react-app/src/components/navs/NavMain.jsx +++ /dev/null @@ -1,135 +0,0 @@ -import { useState } from 'react'; -import { NavLink } from 'react-router-dom'; -import { useAuthActions, useAuthState } from '../../stores/auth'; - -const NavMain = () => { - const { user, loading, error } = useAuthState(); - const { login, logout } = useAuthActions(); - const [username, setUsername] = useState(''); - const [password, setPassword] = useState(''); - - const handleLogin = async (event) => { - event.preventDefault(); - - try { - await login(username, password); - setUsername(''); - setPassword(''); - } catch { - // Fehler kommt aus dem Auth-Store - } - }; - - return ( - - ); -}; - -export default NavMain; diff --git a/webseite-react-php-jwt/react-app/src/components/navs/NavSocial.jsx b/webseite-react-php-jwt/react-app/src/components/navs/NavSocial.jsx deleted file mode 100644 index 616cdaf..0000000 --- a/webseite-react-php-jwt/react-app/src/components/navs/NavSocial.jsx +++ /dev/null @@ -1,35 +0,0 @@ -import { FaYoutube, FaXTwitter, FaFacebookF, FaInstagram } from 'react-icons/fa6'; - -const NavSocial = () => { - return ( - - ); -}; -export default NavSocial; diff --git a/webseite-react-php-jwt/react-app/src/components/sliders/SliderSplide.jsx b/webseite-react-php-jwt/react-app/src/components/sliders/SliderSplide.jsx deleted file mode 100644 index ac3eaa1..0000000 --- a/webseite-react-php-jwt/react-app/src/components/sliders/SliderSplide.jsx +++ /dev/null @@ -1,32 +0,0 @@ -import { Splide, SplideSlide } from '@splidejs/react-splide'; - -const SliderSplide = (props) => { - const { - images = [], - label = 'JS Header Slides', - options = { - rewind: true, - height: '100%', - autoplay: true, - speed: 800, - type: 'fade', - }, - } = props; - - return ( - <> - {images && images.length > 0 && ( -
      - - {images.map((image, idx) => ( - - - - ))} - -
      - )} - - ); -}; -export default SliderSplide; diff --git a/webseite-react-php-jwt/react-app/src/components/tables/TableProducts.jsx b/webseite-react-php-jwt/react-app/src/components/tables/TableProducts.jsx deleted file mode 100644 index 08ccd3a..0000000 --- a/webseite-react-php-jwt/react-app/src/components/tables/TableProducts.jsx +++ /dev/null @@ -1,70 +0,0 @@ -import { useMemo } from 'react'; -import { ProductsProvider, useProductsActions, useProductsState } from '../../stores/products'; -import { useAuthState } from '../../stores/auth'; -import RowProduct from './content/RowProduct'; - -const TableProductsView = () => { - const { user } = useAuthState(); - const { items, loading, error } = useProductsState(); - const { loadProducts } = useProductsActions(); - - const totalPrice = useMemo(() => { - return items.reduce((sum, obj) => { - return sum + Number(obj.price) * Number(obj.stock); - }, 0); - }, [items]); - - if (loading && items.length === 0) { - return

      Produkte werden geladen …

      ; - } - - return ( -
      -
      - {error && ( -
      -

      {error}

      - -
      - )} - - - - - - - - - {user && } - - - - {items.length > 0 && - items.map((item) => ( - - ))} - - - - - - {user && - -
      SKUStockTitlePriceTotalAdmin
      Total:${totalPrice.toFixed(2)}} -
      -
      -
      - ); -}; - -const TableProducts = () => { - return ( - - - - ); -}; - -export default TableProducts; diff --git a/webseite-react-php-jwt/react-app/src/components/tables/TableUsers.jsx b/webseite-react-php-jwt/react-app/src/components/tables/TableUsers.jsx deleted file mode 100644 index fed13fa..0000000 --- a/webseite-react-php-jwt/react-app/src/components/tables/TableUsers.jsx +++ /dev/null @@ -1,59 +0,0 @@ -import { UsersProvider, useUsersActions, useUsersState } from '../../stores/users'; -import { useAuthState } from '../../stores/auth'; -import RowUser from './content/RowUser'; - -const TableUsersView = () => { - const { user } = useAuthState(); - const { items, loading, error } = useUsersState(); - const { loadUsers } = useUsersActions(); - - if (!user) { - return ( -
      - Bitte oben rechts einloggen, um die User-Tabelle zu sehen. -
      - ); - } - - if (loading && items.length === 0) { - return

      Benutzer werden geladen …

      ; - } - - return ( -
      - {error && ( -
      -

      {error}

      - -
      - )} - - - - - - - - - - - {items.map((item) => ( - - ))} - -
      IDUsernameE-MailAngelegt
      -
      - ); -}; - -const TableUsers = () => { - return ( - - - - ); -}; - -export default TableUsers; diff --git a/webseite-react-php-jwt/react-app/src/components/tables/content/RowProduct.jsx b/webseite-react-php-jwt/react-app/src/components/tables/content/RowProduct.jsx deleted file mode 100644 index 5757ba2..0000000 --- a/webseite-react-php-jwt/react-app/src/components/tables/content/RowProduct.jsx +++ /dev/null @@ -1,89 +0,0 @@ -import { memo, useCallback, useState } from 'react'; -import { FaPen, FaTrash } from 'react-icons/fa6'; -import InputAmount from '../../inputs/InputAmount'; -import InputPrice from '../../inputs/InputPrice'; -import { useProductsActions } from '../../../stores/products'; - -const RowProduct = (props) => { - const { - _id, - title, - stock: amount = 0, - price = 0, - sku = '', - canManage = false, - } = props; - - const [isEditing, setIsEditing] = useState(false); - const { updateAmount, updatePrice, removeProduct } = useProductsActions(); - - const handleAmount = useCallback( - (value) => { - updateAmount(value, _id); - }, - [updateAmount, _id] - ); - - const handlePrice = useCallback( - (value) => { - updatePrice(value, _id); - }, - [updatePrice, _id] - ); - - const handleToggleEdit = useCallback(() => { - setIsEditing((current) => !current); - }, []); - - const handleRemove = useCallback(async () => { - const confirmed = window.confirm(`Produkt „${title}“ wirklich entfernen?`); - if (!confirmed) { - return; - } - - await removeProduct(_id); - }, [removeProduct, _id, title]); - - return ( -
      {sku} - {canManage && isEditing ? ( - - ) : ( - amount - )} - {title} - {canManage && isEditing ? ( - - ) : ( - Number(price).toFixed(2) - )} - {(Number(amount) * Number(price)).toFixed(2)} - - -
      {id}{username}{email}{createdAt}
      ` alignment by inheriting `text-align`. -// 3. Fix alignment for Safari - -th { - font-weight: $table-th-font-weight; // 1 - text-align: inherit; // 2 - text-align: -webkit-match-parent; // 3 -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - - -// Forms -// -// 1. Allow labels to use `margin` for spacing. - -label { - display: inline-block; // 1 -} - -// Remove the default `border-radius` that macOS Chrome adds. -// See https://github.com/twbs/bootstrap/issues/24093 - -button { - // stylelint-disable-next-line property-disallowed-list - border-radius: 0; -} - -// Explicitly remove focus outline in Chromium when it shouldn't be -// visible (e.g. as result of mouse click or touch tap). It already -// should be doing this automatically, but seems to currently be -// confused and applies its very visible two-tone outline anyway. - -button:focus:not(:focus-visible) { - outline: 0; -} - -// 1. Remove the margin in Firefox and Safari - -input, -button, -select, -optgroup, -textarea { - margin: 0; // 1 - font-family: inherit; - @include font-size(inherit); - line-height: inherit; -} - -// Remove the inheritance of text transform in Firefox -button, -select { - text-transform: none; -} -// Set the cursor for non-` - - - - - ); -}; -export default ExampleUseReducer; diff --git a/webseite-react-php/react-app/src/components/examples/ExampleUseState.jsx b/webseite-react-php/react-app/src/components/examples/ExampleUseState.jsx deleted file mode 100644 index 8a9487b..0000000 --- a/webseite-react-php/react-app/src/components/examples/ExampleUseState.jsx +++ /dev/null @@ -1,41 +0,0 @@ -import { useState } from 'react'; - -import { FaPlus, FaMinus } from 'react-icons/fa6'; - -const ExampleUseState = (props) => { - // const { } = props; - - const [counter, setCounter] = useState(0); - - // let counter = 0; - - // EventHandler ======= - const handleClick = (e) => { - console.log('click'); - const btn = e.currentTarget; - const label = btn.ariaLabel; - - switch (label) { - case 'Increase': - // setCounter(counter + 1); // setter(value) - setCounter((prevState) => prevState + 1); // setter(fn(prevValue) => newValue ) - break; - case 'Decrease': - setCounter(counter - 1); - break; - } - }; - - return ( -
      - Counter: {counter} - - -
      - ); -}; -export default ExampleUseState; diff --git a/webseite-react-php/react-app/src/components/examples/theme-switcher/ThemeContext.jsx b/webseite-react-php/react-app/src/components/examples/theme-switcher/ThemeContext.jsx deleted file mode 100644 index ee75ac4..0000000 --- a/webseite-react-php/react-app/src/components/examples/theme-switcher/ThemeContext.jsx +++ /dev/null @@ -1,8 +0,0 @@ -import { createContext } from 'react'; - -export const THEME_DEFAULT_VALUE = 'light'; - -const ThemeContext = createContext(THEME_DEFAULT_VALUE); // standard theme is light; -// ThemeContext wird durch createContext() zu einem JSX-Element - -export default ThemeContext; diff --git a/webseite-react-php/react-app/src/components/examples/theme-switcher/ThemeProvider.jsx b/webseite-react-php/react-app/src/components/examples/theme-switcher/ThemeProvider.jsx deleted file mode 100644 index f21ff57..0000000 --- a/webseite-react-php/react-app/src/components/examples/theme-switcher/ThemeProvider.jsx +++ /dev/null @@ -1,26 +0,0 @@ -import { useState } from 'react'; -import ThemeContext, { THEME_DEFAULT_VALUE } from './ThemeContext'; - -const ThemeProvider = (props) => { - const { children } = props; - - console.log(ThemeContext._currentValue); // 'light' <- _currentValue beinhaltet initialWert. Soll aber in production Umgebung nicht verwendet werden, da kein offizieller Standard. - - const [theme, setTheme] = useState(THEME_DEFAULT_VALUE); - - // EventHandler ============== - const handleToggleTheme = () => { - console.log('click'); - setTheme((prevState) => (prevState === 'light' ? 'dark' : 'light')); - }; - - return ( - - - {children} - - ); -}; -export default ThemeProvider; diff --git a/webseite-react-php/react-app/src/components/footers/FooterMain.jsx b/webseite-react-php/react-app/src/components/footers/FooterMain.jsx deleted file mode 100644 index edb318a..0000000 --- a/webseite-react-php/react-app/src/components/footers/FooterMain.jsx +++ /dev/null @@ -1,48 +0,0 @@ -import NavSocial from '../navs/NavSocial'; - -const FooterMain = (props) => { - // const { } = props; - - return ( -
      -
      -
      -
      -
      -

      Contact

      -
      - John Smith -
      - 1 Example Street -
      - Anytown, AB1 2CD -
      -
      -
      -
      -
      -

      More Information

      - -
      -
      -
      -
      -

      Social Media

      - -
      -
      -
      -
      -
      - ); -}; -export default FooterMain; diff --git a/webseite-react-php/react-app/src/components/headers/HeaderMain.jsx b/webseite-react-php/react-app/src/components/headers/HeaderMain.jsx deleted file mode 100644 index f06dc74..0000000 --- a/webseite-react-php/react-app/src/components/headers/HeaderMain.jsx +++ /dev/null @@ -1,21 +0,0 @@ -import LogoMain from '../logos/LogoMain'; -import SliderSplide from '../sliders/SliderSplide'; - -const HeaderMain = () => { - const images = [ - { path: '/img/slides/slide-01.jpg', title: 'Classroom' }, - { path: '/img/slides/slide-02.jpg', title: 'Mountains' }, - { path: '/img/slides/slide-03.jpg', title: 'Canyons' }, - ]; - - return ( -
      - -
      - -
      -
      - ); -}; - -export default HeaderMain; diff --git a/webseite-react-php/react-app/src/components/inputs/InputAmount.jsx b/webseite-react-php/react-app/src/components/inputs/InputAmount.jsx deleted file mode 100644 index b657040..0000000 --- a/webseite-react-php/react-app/src/components/inputs/InputAmount.jsx +++ /dev/null @@ -1,67 +0,0 @@ -// import { useState } from 'react'; -import { FaMinus, FaPlus } from 'react-icons/fa6'; -// npm install react-icons | Auf der npm Seite mit --save, ist nicht mehr nötig -const InputAmount = (props) => { - const { amount = 0, max = 100, min = -100 } = props; - // const [amount, setAmount] = useState(props.amount || 0); - - // EventHandlers ================ - const handleChange = (e) => { - const inputValue = e.target.value; - const numericRegExp = new RegExp(/^-?\d*$/); // regular expression for numbers (including optional minus sign) - - if (!numericRegExp.test(inputValue)) return; - // setAmount(inputValue); - props.onHandleAmount(inputValue); - }; - const handleClickDec = (e) => { - // Guard - if (amount < min) return; - - props.onHandleAmount(amount - 1); - // setAmount((prevState) => prevState - 1); - }; - - const handleClickInc = (e) => { - // Guard - if (amount > max) return; - - // setAmount((prevState) => prevState + 1); - props.onHandleAmount(amount + 1); - }; - - return ( -
      -
      - - - - - - - -
      -
      - ); -}; -export default InputAmount; diff --git a/webseite-react-php/react-app/src/components/inputs/InputPrice.jsx b/webseite-react-php/react-app/src/components/inputs/InputPrice.jsx deleted file mode 100644 index 04cbc55..0000000 --- a/webseite-react-php/react-app/src/components/inputs/InputPrice.jsx +++ /dev/null @@ -1,49 +0,0 @@ -// import { useState } from 'react'; -import { FaDollarSign, FaEuroSign, FaYenSign } from 'react-icons/fa6'; - -const InputPrice = (props) => { - const { currency = '$', price = 0 } = props; - - // const [price, setPrice] = useState(0); - - //Evenhandler - const handleChange = (e) => { - console.log(`Preis: ${e.target.value}`); - - props.onHandlePrice(e.target.value); - //setPrice(e.target.value); - }; - - return ( -
      -
      - {currency === '$' && ( - - - - )} - - {currency === '€' && ( - - - - )} - {currency === '¥' && ( - - - - )} -
      -
      - ); -}; -export default InputPrice; diff --git a/webseite-react-php/react-app/src/components/logos/LogoMain.jsx b/webseite-react-php/react-app/src/components/logos/LogoMain.jsx deleted file mode 100644 index e33f1d3..0000000 --- a/webseite-react-php/react-app/src/components/logos/LogoMain.jsx +++ /dev/null @@ -1,12 +0,0 @@ -import Logo from '../../assets/img/logo-react.min.svg'; - -const LogoMain = (props) => { - // const { } = props; - - return ( -
      - React -
      - ); -}; -export default LogoMain; diff --git a/webseite-react-php/react-app/src/components/navs/NavMain.jsx b/webseite-react-php/react-app/src/components/navs/NavMain.jsx deleted file mode 100644 index 14e7c07..0000000 --- a/webseite-react-php/react-app/src/components/navs/NavMain.jsx +++ /dev/null @@ -1,73 +0,0 @@ -import { NavLink } from 'react-router-dom'; - -const NavMain = () => { - return ( - - ); -}; -export default NavMain; diff --git a/webseite-react-php/react-app/src/components/navs/NavSocial.jsx b/webseite-react-php/react-app/src/components/navs/NavSocial.jsx deleted file mode 100644 index 850c7ab..0000000 --- a/webseite-react-php/react-app/src/components/navs/NavSocial.jsx +++ /dev/null @@ -1,33 +0,0 @@ -import { FaInstagram, FaXTwitter, FaYoutube, FaMeta } from 'react-icons/fa6'; - -const NavSocial = (props) => { - // const { } = props; - - return ( - - ); -}; -export default NavSocial; diff --git a/webseite-react-php/react-app/src/components/sliders/SliderSplide.jsx b/webseite-react-php/react-app/src/components/sliders/SliderSplide.jsx deleted file mode 100644 index e245e1d..0000000 --- a/webseite-react-php/react-app/src/components/sliders/SliderSplide.jsx +++ /dev/null @@ -1,33 +0,0 @@ -import { Splide, SplideSlide } from '@splidejs/react-splide'; - -const SliderSplide = (props) => { - const { - images = [], - label = 'Slides', - options = { - rewind: true, - height: '100%', - autoplay: true, - speed: 800, - type: 'fade', - }, - } = props; - - return ( - <> - {images.length > 0 && ( -
      - - {images.map(({ path, title }, idx) => ( - // - - {title} - - ))} - -
      - )} - - ); -}; -export default SliderSplide; diff --git a/webseite-react-php/react-app/src/components/tables/TableProducts.jsx b/webseite-react-php/react-app/src/components/tables/TableProducts.jsx deleted file mode 100644 index 74f4547..0000000 --- a/webseite-react-php/react-app/src/components/tables/TableProducts.jsx +++ /dev/null @@ -1,99 +0,0 @@ -import { useCallback, useMemo } from 'react'; -import RowProduct from './content/RowProduct'; -import { ProductsProvider, useProductsActions, useProductsState } from '../../stores/products'; -import { FaSpinner } from 'react-icons/fa6'; - -// import { useContext } from 'react'; -// import { ProductsStateContext } from '../../stores/products/ProductsStore'; - -const TableProductsView = (props) => { - // const state = useContext(ProductsStateContext); - // const { items, loading, error } = state; - const { items, loading, error } = useProductsState(); // const {items} = useContext(ProductsStateContext); - - const { loadProducts } = useProductsActions(); - - // const dispatch = useProductsDispatch() // const dispatch = useContext(ProductsDispatchContext); - //const [{ items }, dispatch] = useReducer(reducer, initialState(props)); - - // EventHandler ============ - // const handleAmount = useCallback((amount, id) => { - // dispatch({ type: PRODUCTS_ACTIONS.UPDATE_AMOUNT, payload: { amount, id } }); - // }, []); - - // const handlePrice = useCallback((price, id) => { - // dispatch({ type: PRODUCTS_ACTIONS.UPDATE_PRICE, payload: { price, id } }); - // }, []); - - // Functions =============== - const totalPrice = useMemo(() => { - // [0, {stock: 2, price, 15.2}, {...}] - return items.reduce((sum, obj) => { - return sum + Number(obj.stock) * Number(obj.price); - }, 0); - }, [items]); - - if (loading && items.length === 0) { - return ( -

      - Produkte werden geladen.... - -

      - ); - } - - return ( -
      -
      - {error && ( -
      -

      {error}

      - -
      - )} - - - - - - - - - - - - {items.length > 0 && - items.map((product, idx) => ( - - ))} - - - - - - - -
      SKUStockTitlePriceTotal
      Total:{totalPrice.toFixed(2)}
      -
      -
      - ); -}; - -const TableProducts = (props) => { - // const { } = props; - - return ( - // - - - - ); -}; -export default TableProducts; diff --git a/webseite-react-php/react-app/src/components/tables/content/RowProduct.jsx b/webseite-react-php/react-app/src/components/tables/content/RowProduct.jsx deleted file mode 100644 index 6773b2e..0000000 --- a/webseite-react-php/react-app/src/components/tables/content/RowProduct.jsx +++ /dev/null @@ -1,59 +0,0 @@ -import { memo, useCallback } from 'react'; -import { useProductsActions } from '../../../stores/products'; // /index.js muss nicht angegeben werden (wg. Bundler) - -// import { useProductsDispatch } from '../../../stores/products'; -//import { PRODUCTS_ACTIONS } from '../../../stores/products'; - -import InputAmount from '../../inputs/InputAmount'; -import InputPrice from '../../inputs/InputPrice'; - -const RowProduct = (props) => { - const { _id, sku = '', stock: amount = 0, price = 0, title = '' } = props; - //const { sku = '', title = '' } = props; - - const { updateAmount, updatePrice } = useProductsActions(); - // const dispatch = useProductsDispatch(); // const dispatch = useContext(ProductsDispatchContext) - - // Eventhandler - // const handleAmount = useCallback((val) => { - // // setAmount(val); - // // props.onHandleAmount(val, _id); - // dispatch({ type: PRODUCTS_ACTIONS.UPDATE_AMOUNT, payload: { amount: val, id: _id } }); - // }, []); - - const handleAmount = useCallback( - (val) => { - updateAmount(val, _id); - // dispatch({type: PRODUCTS_ACTIONS.UPDATE_AMOUNT, payload: {amount: val, id: _id}}) - }, - [updateAmount, _id], - ); - - // const handlePrice = (val) => { - // // setPrice(val); - // // props.onHandlePrice(val, _id); - // dispatch({ type: PRODUCTS_ACTIONS.UPDATE_PRICE, payload: { price: val, id: _id } }); - // }; - - const handlePrice = useCallback( - (val) => { - updatePrice(val, _id); - }, - [updatePrice, _id], - ); - - return ( -
      {sku} - handleAmount(value)} /> - {title} - - {(amount * price).toFixed(2)}
      } - - ); -}; -export default TableProducts; diff --git a/webseite-react-php/react-app/src/routes/Router.jsx b/webseite-react-php/react-app/src/routes/Router.jsx deleted file mode 100644 index 6260501..0000000 --- a/webseite-react-php/react-app/src/routes/Router.jsx +++ /dev/null @@ -1,28 +0,0 @@ -import { Route, Routes } from 'react-router-dom'; -import Home from '../pages/Home'; -import About from '../pages/About'; -import Contact from '../pages/Contact'; - -// Projects -import Fibonacci from '../pages/projects/Fibonacci'; -import TableProducts from '../pages/projects/TableProducts'; -import Examples from '../pages/projects/Examples'; - -const Router = (props) => { - // const { } = props; - - return ( - - } /> - } /> - } /> - - - } /> - } /> - } /> - - - ); -}; -export default Router; diff --git a/webseite-react-php/react-app/src/stores/products/ProductsStore.jsx b/webseite-react-php/react-app/src/stores/products/ProductsStore.jsx deleted file mode 100644 index c8a6235..0000000 --- a/webseite-react-php/react-app/src/stores/products/ProductsStore.jsx +++ /dev/null @@ -1,302 +0,0 @@ -import { createContext, useCallback, useContext, useEffect, useMemo, useReducer, useRef } from 'react'; - -import { createInitialState } from './initialState'; -import { PRODUCTS_ACTIONS, productsReducer } from './reducer'; - -import { createProduct, deleteProduct, fetchProducts, getApiErrorMessage, patchProduct, updateProduct } from './api'; - -// Zeitverzögerung für das Debouncing (in ms), bevor Änderungen an den Server gesendet werden. -const PERSIST_DELAY_MS = 400; - -export const ProductsStateContext = createContext(null); -const ProductsDispatchContext = createContext(null); -const ProductsActionsContext = createContext(null); - -export const ProductsProvider = (props) => { - const { children, items = [], autoLoad = true } = props; - - const [state, dispatch] = useReducer( - productsReducer, - items, - createInitialState, // Lazy Initialization: Wird nur beim ersten Mounten ausgeführt. - ); - - /** - * WARUM `useRef(new Map())` FÜR PATCHES & TIMER? - * - * 1. Überleben von Rerendern: `useRef` behält Werte über Renders hinweg stabil, - * ohne bei einer Änderung ein neues Rerendern der Komponente auszulösen. - * 2. Granularität pro Produkt: Da wir `Map` nutzen (Key = Product-ID), verwalten wir - * ausstehende Patches und Timer isoliert pro Item. Ein Ändern von Produkt A bricht - * den Timer für Produkt B nicht ab. - * 3. Kein API-Spam (Debouncing + Merging): Schnelle Änderungen (z. B. Tippen im Input-Feld) - * werden lokal gepuffert und erst nach Ablauf der Inaktivitätszeit als gebündelter Request gesendet. - */ - const pendingPatches = useRef(new Map()); // Speichert: Map - const persistTimers = useRef(new Map()); // Speichert: Map - - useEffect(() => { - if (!autoLoad) { - return undefined; - } - - const controller = new AbortController(); - - const load = async () => { - dispatch({ type: PRODUCTS_ACTIONS.SET_LOADING, payload: true }); - - try { - const loadedItems = await fetchProducts({ signal: controller.signal }); - dispatch({ type: PRODUCTS_ACTIONS.SET_ITEMS, payload: loadedItems }); - } catch (error) { - if (controller.signal.aborted) { - return; - } - - dispatch({ - type: PRODUCTS_ACTIONS.SET_ERROR, - payload: getApiErrorMessage(error), - }); - } - }; - - load(); - - return () => { - controller.abort(); // Bricht laufende Requests ab, falls die Komponente unmountet. - }; - }, [autoLoad]); - - const loadProducts = useCallback(async () => { - dispatch({ type: PRODUCTS_ACTIONS.SET_LOADING, payload: true }); - - try { - const loadedItems = await fetchProducts(); - dispatch({ type: PRODUCTS_ACTIONS.SET_ITEMS, payload: loadedItems }); - } catch (error) { - dispatch({ - type: PRODUCTS_ACTIONS.SET_ERROR, - payload: getApiErrorMessage(error), - }); - } - }, []); - - /** - * `flushPatch(id)` - * - * Zweck: Führt das tatsächliche Senden der gepufferten Änderungen an das Backend aus. - * - * Ablauf: - * 1. Liest und entfernt den gepufferten Patch für die Produkt-ID aus `pendingPatches`. - * 2. Löscht ggf. den aktiven Timer für dieses Produkt aus `persistTimers`. - * 3. Sendet den `patchProduct`-Request an die API. - * 4. Bei Erfolg: Aktualisiert das Produkt im lokalen Reducer-State mit den Server-Daten. - * 5. Bei Fehler: Setzt eine Fehlermeldung und ruft `loadProducts()` auf, um inkonsistente - * optimistische UI-Zustände mit dem Serverzustand zu synchronisieren (Rollback). - */ - const flushPatch = useCallback( - async (id) => { - const patch = pendingPatches.current.get(id); - pendingPatches.current.delete(id); - - if (persistTimers.current.has(id)) { - clearTimeout(persistTimers.current.get(id)); - persistTimers.current.delete(id); - } - - if (!patch || Object.keys(patch).length === 0) { - return; - } - - try { - const updated = await patchProduct(id, patch); - dispatch({ type: PRODUCTS_ACTIONS.SET_ITEM, payload: updated }); - } catch (error) { - dispatch({ - type: PRODUCTS_ACTIONS.SET_ERROR, - payload: getApiErrorMessage(error), - }); - await loadProducts(); - } - }, - [loadProducts], - ); - - /** - * `schedulePatch(id, patch)` - * - * Zweck: Plant das verzögerte Speichern ein (Debounce) und aggregiert Teildaten. - * - * Ablauf: - * 1. Merged neue Teiländerungen mit bereits ausstehenden Änderungen für diese ID - * (z. B. `{ stock: 5 }` + `{ price: 10 }` => `{ stock: 5, price: 10 }`). - * 2. Setzt einen eventuell laufenden Timeout für dieses Produkt zurück (Reset Debounce-Timer). - * 3. Startet einen neuen Timer über `PERSIST_DELAY_MS` (400 ms), nach dessen Ablauf `flushPatch(id)` aufgerufen wird. - */ - const schedulePatch = useCallback( - (id, patch) => { - const merged = { ...(pendingPatches.current.get(id) || {}), ...patch }; - pendingPatches.current.set(id, merged); - - if (persistTimers.current.has(id)) { - clearTimeout(persistTimers.current.get(id)); - } - - persistTimers.current.set( - id, - setTimeout(() => { - flushPatch(id); - }, PERSIST_DELAY_MS), - ); - }, - [flushPatch], - ); - - /** - * Unmount-Cleanup: - * Wenn der Provider unmountet wird (z. B. Seitenwechsel), werden alle offenen Timer gecancelt - * und noch ausstehende Patches sofort "best-effort" an die API geschickt, damit keine Daten verloren gehen. - */ - useEffect(() => { - const timers = persistTimers.current; - const patches = pendingPatches.current; - - return () => { - timers.forEach((timer) => clearTimeout(timer)); - timers.clear(); - - patches.forEach((patch, id) => { - if (patch && Object.keys(patch).length > 0) { - patchProduct(id, patch).catch(() => {}); - } - }); - patches.clear(); - }; - }, []); - - /** - * `updateAmount` & `updatePrice`: - * Setzen auf Optimistic UI. - * 1. Der UI-State wird sofort synchron via `dispatch` aktualisiert (keine Eingabelatenz für den User). - * 2. Das Backend-Update wird verzögert via `schedulePatch` eingereiht. - */ - const updateAmount = useCallback( - (amount, id) => { - dispatch({ - type: PRODUCTS_ACTIONS.UPDATE_AMOUNT, - payload: { id, amount }, - }); - - const stock = Number(amount); - if (Number.isFinite(stock)) { - schedulePatch(id, { stock }); - } - }, - [schedulePatch], - ); - - const updatePrice = useCallback( - (price, id) => { - dispatch({ type: PRODUCTS_ACTIONS.UPDATE_PRICE, payload: { id, price } }); - - const numericPrice = Number(price); - if (Number.isFinite(numericPrice)) { - schedulePatch(id, { price: numericPrice }); - } - }, - [schedulePatch], - ); - - const addProduct = useCallback(async (product) => { - try { - const created = await createProduct(product); - dispatch({ type: PRODUCTS_ACTIONS.ADD_ITEM, payload: created }); - return created; - } catch (error) { - dispatch({ - type: PRODUCTS_ACTIONS.SET_ERROR, - payload: getApiErrorMessage(error), - }); - throw error; - } - }, []); - - const saveProduct = useCallback(async (id, product) => { - try { - const updated = await updateProduct(id, product); - dispatch({ type: PRODUCTS_ACTIONS.SET_ITEM, payload: updated }); - return updated; - } catch (error) { - dispatch({ - type: PRODUCTS_ACTIONS.SET_ERROR, - payload: getApiErrorMessage(error), - }); - throw error; - } - }, []); - - const removeProduct = useCallback(async (id) => { - try { - await deleteProduct(id); - dispatch({ type: PRODUCTS_ACTIONS.REMOVE_ITEM, payload: id }); - } catch (error) { - dispatch({ - type: PRODUCTS_ACTIONS.SET_ERROR, - payload: getApiErrorMessage(error), - }); - throw error; - } - }, []); - - // Memoisierung der Action-Funktionen, damit Konsumenten des Actions-Contexts - // nicht bei jeder State-Änderung unnötig neu rendern. - const actions = useMemo( - () => ({ - loadProducts, - updateAmount, - updatePrice, - addProduct, - saveProduct, - removeProduct, - }), - [loadProducts, updateAmount, updatePrice, addProduct, saveProduct, removeProduct], - ); - - return ( - - - {children} - - - ); -}; - -export const useProductsState = () => { - const state = useContext(ProductsStateContext); - - if (state == null) { - throw new Error('useProductsState muss innerhalb von ProductsProvider verwendet werden'); - } - - return state; -}; - -export const useProductsDispatch = () => { - const dispatch = useContext(ProductsDispatchContext); - - if (dispatch == null) { - throw new Error('useProductsDispatch muss innerhalb von ProductsProvider verwendet werden'); - } - - return dispatch; -}; - -export const useProductsActions = () => { - const actions = useContext(ProductsActionsContext); - - if (actions == null) { - throw new Error('useProductsActions muss innerhalb von ProductsProvider verwendet werden'); - } - - return actions; -}; diff --git a/webseite-react-php/react-app/src/stores/products/api.js b/webseite-react-php/react-app/src/stores/products/api.js deleted file mode 100644 index b8e0985..0000000 --- a/webseite-react-php/react-app/src/stores/products/api.js +++ /dev/null @@ -1,54 +0,0 @@ -import axios from 'axios'; - -const productsClient = axios.create({ - baseURL: import.meta.env.VITE_API_URL ?? '/api', - timeout: 8000, - headers: { 'Content-Type': 'application/json' }, -}); - -export const getApiErrorMessage = (error) => { - if (axios.isCancel(error) || error.code === 'ERR_CANCELED') { - return null; - } - - return error.response?.data?.error || error.message || 'Unbekannter API Fehler'; -}; - -export const fetchProducts = async (config = {}) => { - const { data } = await productsClient.get('/products', config); - - if (!Array.isArray(data)) { - throw new Error('Ungültige API-Antwort: Produktliste wird erwartet.'); - } - - return data; -}; - -export const fetchProduct = async (id, config = {}) => { - const { data } = await productsClient.get(`/products/${id}`, config); - - if (!Object.hasOwn(data, _id)) { - throw new Error('Ungültige API-Antwort: Produkt wird erwartet. (keine id)'); - } - - return data; -}; - -export const createProduct = async (product) => { - const { data } = await productsClient.post('/products', product); - return data; -}; - -export const updateProduct = async (id, product) => { - const { data } = await productsClient.put(`/products/${id}`, product); - return data; -}; - -export const patchProduct = async (id, patch) => { - const { data } = await productsClient.patch(`/products/${id}`, patch); - return data; -}; - -export const deleteProduct = async (id) => { - await productsClient.delete(`/products/${id}`); -}; diff --git a/webseite-react-php/react-app/src/stores/products/index.js b/webseite-react-php/react-app/src/stores/products/index.js deleted file mode 100644 index ec4f1c0..0000000 --- a/webseite-react-php/react-app/src/stores/products/index.js +++ /dev/null @@ -1,12 +0,0 @@ -export { createInitialState } from './initialState'; -export { PRODUCTS_ACTIONS, productsReducer } from './reducer'; -export { ProductsProvider, useProductsActions, useProductsDispatch, useProductsState } from './ProductsStore'; -export { - createProduct, - deleteProduct, - fetchProduct, - fetchProducts, - getApiErrorMessage, - patchProduct, - updateProduct, -} from './api'; diff --git a/webseite-react-php/react-app/src/stores/products/initialState.js b/webseite-react-php/react-app/src/stores/products/initialState.js deleted file mode 100644 index 4a51d89..0000000 --- a/webseite-react-php/react-app/src/stores/products/initialState.js +++ /dev/null @@ -1,11 +0,0 @@ -// import mit {} -export const createInitialState = (items) => { - // validation and sanitizing - return { - items: items || [], // - loading: true, - error: null, - }; -}; - -export default createInitialState; // import mit eigener Benennung möglich diff --git a/webseite-react-php/react-app/src/stores/products/reducer.js b/webseite-react-php/react-app/src/stores/products/reducer.js deleted file mode 100644 index 1f3cfb2..0000000 --- a/webseite-react-php/react-app/src/stores/products/reducer.js +++ /dev/null @@ -1,76 +0,0 @@ -// in ts enum -export const PRODUCTS_ACTIONS = { - SET_LOADING: 'SET_LOADING', - SET_ITEMS: 'SET_ITEMS', - SET_ITEM: 'SET_ITEM', - SET_ERROR: 'SET_ERROR', - ADD_ITEM: 'ADD_ITEM', - REMOVE_ITEM: 'REMOVE_ITEM', - UPDATE_AMOUNT: 'UPDATE_AMOUNT', - UPDATE_PRICE: 'UPDATE_PRICE', -}; - -export const productsReducer = (state, action) => { - const { type, payload } = action; - - switch (type) { - case PRODUCTS_ACTIONS.SET_LOADING: - return { - ...state, - loading: payload, - error: payload ? null : state.error, - }; - case PRODUCTS_ACTIONS.SET_ITEMS: - return { - ...state, - items: payload, - loading: false, - error: null, - }; - case PRODUCTS_ACTIONS.SET_ITEM: - return { - ...state, - items: state.items.map((item) => (item._id === payload._id ? payload : item)), - error: null, - }; - case PRODUCTS_ACTIONS.SET_ERROR: - return { - ...state, - loading: false, - error: payload, - }; - case PRODUCTS_ACTIONS.ADD_ITEM: - return { - ...state, - items: [...state.items, payload], - error: null, - }; - case PRODUCTS_ACTIONS.REMOVE_ITEM: - return { - ...state, - items: state.items.filter((item) => item._id !== payload), - error: null, - }; - case PRODUCTS_ACTIONS.UPDATE_AMOUNT: - return { - ...state, - items: state.items.map((item) => - item._id === payload.id - ? { ...item, stock: payload.amount } // - : item, - ), - }; - case PRODUCTS_ACTIONS.UPDATE_PRICE: - return { - ...state, - items: state.items.map((item) => - item._id === payload.id - ? { ...item, price: payload.price } // - : item, - ), - }; - default: - console.warn('no action found'); - return state; - } -}; diff --git a/webseite-react-php/react-app/src/styles/01_frameworks/_index.scss b/webseite-react-php/react-app/src/styles/01_frameworks/_index.scss deleted file mode 100644 index dcefbc9..0000000 --- a/webseite-react-php/react-app/src/styles/01_frameworks/_index.scss +++ /dev/null @@ -1,3 +0,0 @@ -// @import 'bootstrap-5.3.8/bootstrap-grid'; -@import 'bootstrap-5.3.8/bootstrap'; -// @import 'bulma-1.04/index' diff --git a/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss b/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss deleted file mode 100644 index e9f267f..0000000 --- a/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_accordion.scss +++ /dev/null @@ -1,153 +0,0 @@ -// -// Base styles -// - -.accordion { - // scss-docs-start accordion-css-vars - --#{$prefix}accordion-color: #{$accordion-color}; - --#{$prefix}accordion-bg: #{$accordion-bg}; - --#{$prefix}accordion-transition: #{$accordion-transition}; - --#{$prefix}accordion-border-color: #{$accordion-border-color}; - --#{$prefix}accordion-border-width: #{$accordion-border-width}; - --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; - --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; - --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; - --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; - --#{$prefix}accordion-btn-color: #{$accordion-button-color}; - --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; - --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; - --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; - --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; - --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; - --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; - --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; - --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; - --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; - // scss-docs-end accordion-css-vars -} - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); - @include font-size($font-size-base); - color: var(--#{$prefix}accordion-btn-color); - text-align: left; // Reset button style - background-color: var(--#{$prefix}accordion-btn-bg); - border: 0; - @include border-radius(0); - overflow-anchor: none; - @include transition(var(--#{$prefix}accordion-transition)); - - &:not(.collapsed) { - color: var(--#{$prefix}accordion-active-color); - background-color: var(--#{$prefix}accordion-active-bg); - box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list - - &::after { - background-image: var(--#{$prefix}accordion-btn-active-icon); - transform: var(--#{$prefix}accordion-btn-icon-transform); - } - } - - // Accordion icon - &::after { - flex-shrink: 0; - width: var(--#{$prefix}accordion-btn-icon-width); - height: var(--#{$prefix}accordion-btn-icon-width); - margin-left: auto; - content: ""; - background-image: var(--#{$prefix}accordion-btn-icon); - background-repeat: no-repeat; - background-size: var(--#{$prefix}accordion-btn-icon-width); - @include transition(var(--#{$prefix}accordion-btn-icon-transition)); - } - - &:hover { - z-index: 2; - } - - &:focus { - z-index: 3; - outline: 0; - box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); - } -} - -.accordion-header { - margin-bottom: 0; -} - -.accordion-item { - color: var(--#{$prefix}accordion-color); - background-color: var(--#{$prefix}accordion-bg); - border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); - - &:first-of-type { - @include border-top-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - &:not(:first-of-type) { - border-top: 0; - } - - // Only set a border-radius on the last item if the accordion is collapsed - &:last-of-type { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - - > .accordion-header .accordion-button { - &.collapsed { - @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); - } - } - - > .accordion-collapse { - @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); - } - } -} - -.accordion-body { - padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); -} - - -// Flush accordion items -// -// Remove borders and border-radius to keep accordion items edge-to-edge. - -.accordion-flush { - > .accordion-item { - border-right: 0; - border-left: 0; - @include border-radius(0); - - &:first-child { border-top: 0; } - &:last-child { border-bottom: 0; } - - // stylelint-disable selector-max-class - > .accordion-collapse, - > .accordion-header .accordion-button, - > .accordion-header .accordion-button.collapsed { - @include border-radius(0); - } - // stylelint-enable selector-max-class - } -} - -@if $enable-dark-mode { - @include color-mode(dark) { - .accordion-button::after { - --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; - --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; - } - } -} diff --git a/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss b/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss deleted file mode 100644 index b8cff9b..0000000 --- a/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_alert.scss +++ /dev/null @@ -1,68 +0,0 @@ -// -// Base styles -// - -.alert { - // scss-docs-start alert-css-vars - --#{$prefix}alert-bg: transparent; - --#{$prefix}alert-padding-x: #{$alert-padding-x}; - --#{$prefix}alert-padding-y: #{$alert-padding-y}; - --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; - --#{$prefix}alert-color: inherit; - --#{$prefix}alert-border-color: transparent; - --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); - --#{$prefix}alert-border-radius: #{$alert-border-radius}; - --#{$prefix}alert-link-color: inherit; - // scss-docs-end alert-css-vars - - position: relative; - padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); - margin-bottom: var(--#{$prefix}alert-margin-bottom); - color: var(--#{$prefix}alert-color); - background-color: var(--#{$prefix}alert-bg); - border: var(--#{$prefix}alert-border); - @include border-radius(var(--#{$prefix}alert-border-radius)); -} - -// Headings for larger alerts -.alert-heading { - // Specified to prevent conflicts of changing $headings-color - color: inherit; -} - -// Provide class for links that match alerts -.alert-link { - font-weight: $alert-link-font-weight; - color: var(--#{$prefix}alert-link-color); -} - - -// Dismissible alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissible { - padding-right: $alert-dismissible-padding-r; - - // Adjust close link position - .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: $stretched-link-z-index + 1; - padding: $alert-padding-y * 1.25 $alert-padding-x; - } -} - - -// scss-docs-start alert-modifiers -// Generate contextual modifier classes for colorizing the alert -@each $state in map-keys($theme-colors) { - .alert-#{$state} { - --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); - --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); - --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); - --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); - } -} -// scss-docs-end alert-modifiers diff --git a/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss b/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss deleted file mode 100644 index cc3d269..0000000 --- a/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_badge.scss +++ /dev/null @@ -1,38 +0,0 @@ -// Base class -// -// Requires one of the contextual, color modifier classes for `color` and -// `background-color`. - -.badge { - // scss-docs-start badge-css-vars - --#{$prefix}badge-padding-x: #{$badge-padding-x}; - --#{$prefix}badge-padding-y: #{$badge-padding-y}; - @include rfs($badge-font-size, --#{$prefix}badge-font-size); - --#{$prefix}badge-font-weight: #{$badge-font-weight}; - --#{$prefix}badge-color: #{$badge-color}; - --#{$prefix}badge-border-radius: #{$badge-border-radius}; - // scss-docs-end badge-css-vars - - display: inline-block; - padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x); - @include font-size(var(--#{$prefix}badge-font-size)); - font-weight: var(--#{$prefix}badge-font-weight); - line-height: 1; - color: var(--#{$prefix}badge-color); - text-align: center; - white-space: nowrap; - vertical-align: baseline; - @include border-radius(var(--#{$prefix}badge-border-radius)); - @include gradient-bg(); - - // Empty badges collapse automatically - &:empty { - display: none; - } -} - -// Quick fix for badges in buttons -.btn .badge { - position: relative; - top: -1px; -} diff --git a/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss b/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss deleted file mode 100644 index b8252ff..0000000 --- a/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_breadcrumb.scss +++ /dev/null @@ -1,40 +0,0 @@ -.breadcrumb { - // scss-docs-start breadcrumb-css-vars - --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x}; - --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y}; - --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom}; - @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size); - --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg}; - --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius}; - --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color}; - --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x}; - --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color}; - // scss-docs-end breadcrumb-css-vars - - display: flex; - flex-wrap: wrap; - padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x); - margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom); - @include font-size(var(--#{$prefix}breadcrumb-font-size)); - list-style: none; - background-color: var(--#{$prefix}breadcrumb-bg); - @include border-radius(var(--#{$prefix}breadcrumb-border-radius)); -} - -.breadcrumb-item { - // The separator between breadcrumbs (by default, a forward-slash: "/") - + .breadcrumb-item { - padding-left: var(--#{$prefix}breadcrumb-item-padding-x); - - &::before { - float: left; // Suppress inline spacings and underlining of the separator - padding-right: var(--#{$prefix}breadcrumb-item-padding-x); - color: var(--#{$prefix}breadcrumb-divider-color); - content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; - } - } - - &.active { - color: var(--#{$prefix}breadcrumb-item-active-color); - } -} diff --git a/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss b/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss deleted file mode 100644 index 78e1252..0000000 --- a/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_button-group.scss +++ /dev/null @@ -1,147 +0,0 @@ -// Make the div behave like a button -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; // match .btn alignment given font-size hack above - - > .btn { - position: relative; - flex: 1 1 auto; - } - - // Bring the hover, focused, and "active" buttons to the front to overlay - // the borders properly - > .btn-check:checked + .btn, - > .btn-check:focus + .btn, - > .btn:hover, - > .btn:focus, - > .btn:active, - > .btn.active { - z-index: 1; - } -} - -// Optional: Group multiple button groups together for a toolbar -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; - - .input-group { - width: auto; - } -} - -.btn-group { - @include border-radius($btn-border-radius); - - // Prevent double borders when buttons are next to each other - > :not(.btn-check:first-child) + .btn, - > .btn-group:not(:first-child) { - margin-left: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn.dropdown-toggle-split:first-child, - > .btn-group:not(:last-child) > .btn { - @include border-end-radius(0); - } - - // The left radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-start-radius(0); - } -} - -// Sizing -// -// Remix the default button sizing classes into new ones for easier manipulation. - -.btn-group-sm > .btn { @extend .btn-sm; } -.btn-group-lg > .btn { @extend .btn-lg; } - - -// -// Split button dropdowns -// - -.dropdown-toggle-split { - padding-right: $btn-padding-x * .75; - padding-left: $btn-padding-x * .75; - - &::after, - .dropup &::after, - .dropend &::after { - margin-left: 0; - } - - .dropstart &::before { - margin-right: 0; - } -} - -.btn-sm + .dropdown-toggle-split { - padding-right: $btn-padding-x-sm * .75; - padding-left: $btn-padding-x-sm * .75; -} - -.btn-lg + .dropdown-toggle-split { - padding-right: $btn-padding-x-lg * .75; - padding-left: $btn-padding-x-lg * .75; -} - - -// The clickable button for toggling the menu -// Set the same inset shadow as the :active state -.btn-group.show .dropdown-toggle { - @include box-shadow($btn-active-box-shadow); - - // Show no shadow for `.btn-link` since it has no other button styles. - &.btn-link { - @include box-shadow(none); - } -} - - -// -// Vertical button groups -// - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; - - > .btn, - > .btn-group { - width: 100%; - } - - > .btn:not(:first-child), - > .btn-group:not(:first-child) { - margin-top: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list - } - - // Reset rounded corners - > .btn:not(:last-child):not(.dropdown-toggle), - > .btn-group:not(:last-child) > .btn { - @include border-bottom-radius(0); - } - - // The top radius should be 0 if the button is: - // - the "third or more" child - // - the second child and the previous element isn't `.btn-check` (making it the first child visually) - // - part of a btn-group which isn't the first child - > .btn:nth-child(n + 3), - > :not(.btn-check) + .btn, - > .btn-group:not(:first-child) > .btn { - @include border-top-radius(0); - } -} diff --git a/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss b/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss deleted file mode 100644 index caa4518..0000000 --- a/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_buttons.scss +++ /dev/null @@ -1,216 +0,0 @@ -// -// Base styles -// - -.btn { - // scss-docs-start btn-css-vars - --#{$prefix}btn-padding-x: #{$btn-padding-x}; - --#{$prefix}btn-padding-y: #{$btn-padding-y}; - --#{$prefix}btn-font-family: #{$btn-font-family}; - @include rfs($btn-font-size, --#{$prefix}btn-font-size); - --#{$prefix}btn-font-weight: #{$btn-font-weight}; - --#{$prefix}btn-line-height: #{$btn-line-height}; - --#{$prefix}btn-color: #{$btn-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-width: #{$btn-border-width}; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-border-radius: #{$btn-border-radius}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-box-shadow: #{$btn-box-shadow}; - --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity}; - --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5); - // scss-docs-end btn-css-vars - - display: inline-block; - padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x); - font-family: var(--#{$prefix}btn-font-family); - @include font-size(var(--#{$prefix}btn-font-size)); - font-weight: var(--#{$prefix}btn-font-weight); - line-height: var(--#{$prefix}btn-line-height); - color: var(--#{$prefix}btn-color); - text-align: center; - text-decoration: if($link-decoration == none, null, none); - white-space: $btn-white-space; - vertical-align: middle; - cursor: if($enable-button-pointers, pointer, null); - user-select: none; - border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color); - @include border-radius(var(--#{$prefix}btn-border-radius)); - @include gradient-bg(var(--#{$prefix}btn-bg)); - @include box-shadow(var(--#{$prefix}btn-box-shadow)); - @include transition($btn-transition); - - &:hover { - color: var(--#{$prefix}btn-hover-color); - text-decoration: if($link-hover-decoration == underline, none, null); - background-color: var(--#{$prefix}btn-hover-bg); - border-color: var(--#{$prefix}btn-hover-border-color); - } - - .btn-check + &:hover { - // override for the checkbox/radio buttons - color: var(--#{$prefix}btn-color); - background-color: var(--#{$prefix}btn-bg); - border-color: var(--#{$prefix}btn-border-color); - } - - &:focus-visible { - color: var(--#{$prefix}btn-hover-color); - @include gradient-bg(var(--#{$prefix}btn-hover-bg)); - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:focus-visible + & { - border-color: var(--#{$prefix}btn-hover-border-color); - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - .btn-check:checked + &, - :not(.btn-check) + &:active, - &:first-child:active, - &.active, - &.show { - color: var(--#{$prefix}btn-active-color); - background-color: var(--#{$prefix}btn-active-bg); - // Remove CSS gradients if they're enabled - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-active-border-color); - @include box-shadow(var(--#{$prefix}btn-active-shadow)); - - &:focus-visible { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - } - - .btn-check:checked:focus-visible + & { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); - } @else { - box-shadow: var(--#{$prefix}btn-focus-box-shadow); - } - } - - &:disabled, - &.disabled, - fieldset:disabled & { - color: var(--#{$prefix}btn-disabled-color); - pointer-events: none; - background-color: var(--#{$prefix}btn-disabled-bg); - background-image: if($enable-gradients, none, null); - border-color: var(--#{$prefix}btn-disabled-border-color); - opacity: var(--#{$prefix}btn-disabled-opacity); - @include box-shadow(none); - } -} - - -// -// Alternate buttons -// - -// scss-docs-start btn-variant-loops -@each $color, $value in $theme-colors { - .btn-#{$color} { - @if $color == "light" { - @include button-variant( - $value, - $value, - $hover-background: shade-color($value, $btn-hover-bg-shade-amount), - $hover-border: shade-color($value, $btn-hover-border-shade-amount), - $active-background: shade-color($value, $btn-active-bg-shade-amount), - $active-border: shade-color($value, $btn-active-border-shade-amount) - ); - } @else if $color == "dark" { - @include button-variant( - $value, - $value, - $hover-background: tint-color($value, $btn-hover-bg-tint-amount), - $hover-border: tint-color($value, $btn-hover-border-tint-amount), - $active-background: tint-color($value, $btn-active-bg-tint-amount), - $active-border: tint-color($value, $btn-active-border-tint-amount) - ); - } @else { - @include button-variant($value, $value); - } - } -} - -@each $color, $value in $theme-colors { - .btn-outline-#{$color} { - @include button-outline-variant($value); - } -} -// scss-docs-end btn-variant-loops - - -// -// Link buttons -// - -// Make a button look and behave like a link -.btn-link { - --#{$prefix}btn-font-weight: #{$font-weight-normal}; - --#{$prefix}btn-color: #{$btn-link-color}; - --#{$prefix}btn-bg: transparent; - --#{$prefix}btn-border-color: transparent; - --#{$prefix}btn-hover-color: #{$btn-link-hover-color}; - --#{$prefix}btn-hover-border-color: transparent; - --#{$prefix}btn-active-color: #{$btn-link-hover-color}; - --#{$prefix}btn-active-border-color: transparent; - --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color}; - --#{$prefix}btn-disabled-border-color: transparent; - --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows - --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb}; - - text-decoration: $link-decoration; - @if $enable-gradients { - background-image: none; - } - - &:hover, - &:focus-visible { - text-decoration: $link-hover-decoration; - } - - &:focus-visible { - color: var(--#{$prefix}btn-color); - } - - &:hover { - color: var(--#{$prefix}btn-hover-color); - } - - // No need for an active state here -} - - -// -// Button Sizes -// - -.btn-lg { - @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); -} - -.btn-sm { - @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); -} diff --git a/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss b/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss deleted file mode 100644 index dcebe6a..0000000 --- a/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_card.scss +++ /dev/null @@ -1,238 +0,0 @@ -// -// Base styles -// - -.card { - // scss-docs-start card-css-vars - --#{$prefix}card-spacer-y: #{$card-spacer-y}; - --#{$prefix}card-spacer-x: #{$card-spacer-x}; - --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y}; - --#{$prefix}card-title-color: #{$card-title-color}; - --#{$prefix}card-subtitle-color: #{$card-subtitle-color}; - --#{$prefix}card-border-width: #{$card-border-width}; - --#{$prefix}card-border-color: #{$card-border-color}; - --#{$prefix}card-border-radius: #{$card-border-radius}; - --#{$prefix}card-box-shadow: #{$card-box-shadow}; - --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius}; - --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y}; - --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x}; - --#{$prefix}card-cap-bg: #{$card-cap-bg}; - --#{$prefix}card-cap-color: #{$card-cap-color}; - --#{$prefix}card-height: #{$card-height}; - --#{$prefix}card-color: #{$card-color}; - --#{$prefix}card-bg: #{$card-bg}; - --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding}; - --#{$prefix}card-group-margin: #{$card-group-margin}; - // scss-docs-end card-css-vars - - position: relative; - display: flex; - flex-direction: column; - min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 - height: var(--#{$prefix}card-height); - color: var(--#{$prefix}body-color); - word-wrap: break-word; - background-color: var(--#{$prefix}card-bg); - background-clip: border-box; - border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - @include border-radius(var(--#{$prefix}card-border-radius)); - @include box-shadow(var(--#{$prefix}card-box-shadow)); - - > hr { - margin-right: 0; - margin-left: 0; - } - - > .list-group { - border-top: inherit; - border-bottom: inherit; - - &:first-child { - border-top-width: 0; - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); - } - - &:last-child { - border-bottom-width: 0; - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); - } - } - - // Due to specificity of the above selector (`.card > .list-group`), we must - // use a child selector here to prevent double borders. - > .card-header + .list-group, - > .list-group + .card-footer { - border-top: 0; - } -} - -.card-body { - // Enable `flex-grow: 1` for decks and groups so that card blocks take up - // as much space as possible, ensuring footers are aligned to the bottom. - flex: 1 1 auto; - padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x); - color: var(--#{$prefix}card-color); -} - -.card-title { - margin-bottom: var(--#{$prefix}card-title-spacer-y); - color: var(--#{$prefix}card-title-color); -} - -.card-subtitle { - margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list - margin-bottom: 0; - color: var(--#{$prefix}card-subtitle-color); -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link { - &:hover { - text-decoration: if($link-hover-decoration == underline, none, null); - } - - + .card-link { - margin-left: var(--#{$prefix}card-spacer-x); - } -} - -// -// Optional textual caps -// - -.card-header { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - margin-bottom: 0; // Removes the default margin-bottom of - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:first-child { - @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0); - } -} - -.card-footer { - padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); - color: var(--#{$prefix}card-cap-color); - background-color: var(--#{$prefix}card-cap-bg); - border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); - - &:last-child { - @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius)); - } -} - - -// -// Header navs -// - -.card-header-tabs { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - border-bottom: 0; - - .nav-link.active { - background-color: var(--#{$prefix}card-bg); - border-bottom-color: var(--#{$prefix}card-bg); - } -} - -.card-header-pills { - margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list - margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list -} - -// Card image -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: var(--#{$prefix}card-img-overlay-padding); - @include border-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch -} - -.card-img, -.card-img-top { - @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); -} - -.card-img, -.card-img-bottom { - @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); -} - - -// -// Card groups -// - -.card-group { - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - margin-bottom: var(--#{$prefix}card-group-margin); - } - - @include media-breakpoint-up(sm) { - display: flex; - flex-flow: row wrap; - // The child selector allows nested `.card` within `.card-group` - // to display properly. - > .card { - flex: 1 0 0; - margin-bottom: 0; - - + .card { - margin-left: 0; - border-left: 0; - } - - // Handle rounded corners - @if $enable-rounded { - &:not(:last-child) { - @include border-end-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-right-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-right-radius: 0; - } - } - - &:not(:first-child) { - @include border-start-radius(0); - - > .card-img-top, - > .card-header { - // stylelint-disable-next-line property-disallowed-list - border-top-left-radius: 0; - } - > .card-img-bottom, - > .card-footer { - // stylelint-disable-next-line property-disallowed-list - border-bottom-left-radius: 0; - } - } - } - } - } -} diff --git a/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss b/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss deleted file mode 100644 index 5ebf6b1..0000000 --- a/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_carousel.scss +++ /dev/null @@ -1,226 +0,0 @@ -// Notes on the classes: -// -// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) -// even when their scroll action started on a carousel, but for compatibility (with Firefox) -// we're preventing all actions instead -// 2. The .carousel-item-start and .carousel-item-end is used to indicate where -// the active slide is heading. -// 3. .active.carousel-item is the current slide. -// 4. .active.carousel-item-start and .active.carousel-item-end is the current -// slide in its in-transition state. Only one of these occurs at a time. -// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end -// is the upcoming slide in transition. - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; - @include clearfix(); -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - backface-visibility: hidden; - @include transition($carousel-transition); -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); -} - - -// -// Alternate transitions -// - -.carousel-fade { - .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; - } - - .carousel-item.active, - .carousel-item-next.carousel-item-start, - .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; - } - - .active.carousel-item-start, - .active.carousel-item-end { - z-index: 0; - opacity: 0; - @include transition(opacity 0s $carousel-transition-duration); - } -} - - -// -// Left/right controls for nav -// - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - // Use flex for alignment (1-3) - display: flex; // 1. allow flex styles - align-items: center; // 2. vertically center contents - justify-content: center; // 3. horizontally center contents - width: $carousel-control-width; - padding: 0; - color: $carousel-control-color; - text-align: center; - background: none; - filter: var(--#{$prefix}carousel-control-icon-filter); - border: 0; - opacity: $carousel-control-opacity; - @include transition($carousel-control-transition); - - // Hover/focus state - &:hover, - &:focus { - color: $carousel-control-color; - text-decoration: none; - outline: 0; - opacity: $carousel-control-hover-opacity; - } -} -.carousel-control-prev { - left: 0; - background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); -} -.carousel-control-next { - right: 0; - background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); -} - -// Icons for within -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: $carousel-control-icon-width; - height: $carousel-control-icon-width; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; -} - -.carousel-control-prev-icon { - background-image: escape-svg($carousel-control-prev-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-next-icon-bg) + "*/"}; -} -.carousel-control-next-icon { - background-image: escape-svg($carousel-control-next-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-prev-icon-bg) + "*/"}; -} - -// Optional indicator pips/controls -// -// Add a container (such as a list) with the following class and add an item (ideally a focusable control, -// like a button) with data-bs-target for each slide your carousel holds. - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - // Use the .carousel-control's width as margin so we don't overlay those - margin-right: $carousel-control-width; - margin-bottom: 1rem; - margin-left: $carousel-control-width; - - [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: $carousel-indicator-width; - height: $carousel-indicator-height; - padding: 0; - margin-right: $carousel-indicator-spacer; - margin-left: $carousel-indicator-spacer; - text-indent: -999px; - cursor: pointer; - background-color: var(--#{$prefix}carousel-indicator-active-bg); - background-clip: padding-box; - border: 0; - // Use transparent borders to increase the hit area by 10px on top and bottom. - border-top: $carousel-indicator-hit-area-height solid transparent; - border-bottom: $carousel-indicator-hit-area-height solid transparent; - opacity: $carousel-indicator-opacity; - @include transition($carousel-indicator-transition); - } - - .active { - opacity: $carousel-indicator-active-opacity; - } -} - - -// Optional captions -// -// - -.carousel-caption { - position: absolute; - right: (100% - $carousel-caption-width) * .5; - bottom: $carousel-caption-spacer; - left: (100% - $carousel-caption-width) * .5; - padding-top: $carousel-caption-padding-y; - padding-bottom: $carousel-caption-padding-y; - color: var(--#{$prefix}carousel-caption-color); - text-align: center; -} - -// Dark mode carousel - -@mixin carousel-dark() { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg-dark}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color-dark}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter-dark}; -} - -.carousel-dark { - @include carousel-dark(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg}; - --#{$prefix}carousel-caption-color: #{$carousel-caption-color}; - --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include carousel-dark(); - } -} diff --git a/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss b/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss deleted file mode 100644 index d53c96f..0000000 --- a/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_close.scss +++ /dev/null @@ -1,66 +0,0 @@ -// Transparent background and border properties included for button version. -// iOS requires the button element instead of an anchor tag. -// If you want the anchor version, it requires `href="#"`. -// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile - -.btn-close { - // scss-docs-start close-css-vars - --#{$prefix}btn-close-color: #{$btn-close-color}; - --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) }; - --#{$prefix}btn-close-opacity: #{$btn-close-opacity}; - --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity}; - --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow}; - --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity}; - --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity}; - // scss-docs-end close-css-vars - - box-sizing: content-box; - width: $btn-close-width; - height: $btn-close-height; - padding: $btn-close-padding-y $btn-close-padding-x; - color: var(--#{$prefix}btn-close-color); - background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements - filter: var(--#{$prefix}btn-close-filter); - border: 0; // for button elements - @include border-radius(); - opacity: var(--#{$prefix}btn-close-opacity); - - // Override 's hover style - &:hover { - color: var(--#{$prefix}btn-close-color); - text-decoration: none; - opacity: var(--#{$prefix}btn-close-hover-opacity); - } - - &:focus { - outline: 0; - box-shadow: var(--#{$prefix}btn-close-focus-shadow); - opacity: var(--#{$prefix}btn-close-focus-opacity); - } - - &:disabled, - &.disabled { - pointer-events: none; - user-select: none; - opacity: var(--#{$prefix}btn-close-disabled-opacity); - } -} - -@mixin btn-close-white() { - --#{$prefix}btn-close-filter: #{$btn-close-filter-dark}; -} - -.btn-close-white { - @include btn-close-white(); -} - -:root, -[data-bs-theme="light"] { - --#{$prefix}btn-close-filter: #{$btn-close-filter}; -} - -@if $enable-dark-mode { - @include color-mode(dark, true) { - @include btn-close-white(); - } -} diff --git a/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss b/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss deleted file mode 100644 index 83b3138..0000000 --- a/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_containers.scss +++ /dev/null @@ -1,41 +0,0 @@ -// Container widths -// -// Set the container width, and override it for fixed navbars in media queries. - -@if $enable-container-classes { - // Single container class with breakpoint max-widths - .container, - // 100% wide container at all breakpoints - .container-fluid { - @include make-container(); - } - - // Responsive containers that are 100% wide until a breakpoint - @each $breakpoint, $container-max-width in $container-max-widths { - .container-#{$breakpoint} { - @extend .container-fluid; - } - - @include media-breakpoint-up($breakpoint, $grid-breakpoints) { - %responsive-container-#{$breakpoint} { - max-width: $container-max-width; - } - - // Extend each breakpoint which is smaller or equal to the current breakpoint - $extend-breakpoint: true; - - @each $name, $width in $grid-breakpoints { - @if ($extend-breakpoint) { - .container#{breakpoint-infix($name, $grid-breakpoints)} { - @extend %responsive-container-#{$breakpoint}; - } - - // Once the current breakpoint is reached, stop extending - @if ($breakpoint == $name) { - $extend-breakpoint: false; - } - } - } - } - } -} diff --git a/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss b/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss deleted file mode 100644 index 587ebb4..0000000 --- a/webseite-react-php/react-app/src/styles/01_frameworks/bootstrap-5.3.8/_dropdown.scss +++ /dev/null @@ -1,250 +0,0 @@ -// The dropdown wrapper (`
      `) -.dropup, -.dropend, -.dropdown, -.dropstart, -.dropup-center, -.dropdown-center { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; - - // Generate the caret automatically - @include caret(); -} - -// The dropdown menu -.dropdown-menu { - // scss-docs-start dropdown-css-vars - --#{$prefix}dropdown-zindex: #{$zindex-dropdown}; - --#{$prefix}dropdown-min-width: #{$dropdown-min-width}; - --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x}; - --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y}; - --#{$prefix}dropdown-spacer: #{$dropdown-spacer}; - @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size); - --#{$prefix}dropdown-color: #{$dropdown-color}; - --#{$prefix}dropdown-bg: #{$dropdown-bg}; - --#{$prefix}dropdown-border-color: #{$dropdown-border-color}; - --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius}; - --#{$prefix}dropdown-border-width: #{$dropdown-border-width}; - --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius}; - --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg}; - --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y}; - --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow}; - --#{$prefix}dropdown-link-color: #{$dropdown-link-color}; - --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color}; - --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg}; - --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color}; - --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg}; - --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color}; - --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x}; - --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y}; - --#{$prefix}dropdown-header-color: #{$dropdown-header-color}; - --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x}; - --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y}; - // scss-docs-end dropdown-css-vars - - position: absolute; - z-index: var(--#{$prefix}dropdown-zindex); - display: none; // none by default, but block on "open" of the menu - min-width: var(--#{$prefix}dropdown-min-width); - padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x); - margin: 0; // Override default margin of ul - @include font-size(var(--#{$prefix}dropdown-font-size)); - color: var(--#{$prefix}dropdown-color); - text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) - list-style: none; - background-color: var(--#{$prefix}dropdown-bg); - background-clip: padding-box; - border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color); - @include border-radius(var(--#{$prefix}dropdown-border-radius)); - @include box-shadow(var(--#{$prefix}dropdown-box-shadow)); - - &[data-bs-popper] { - top: 100%; - left: 0; - margin-top: var(--#{$prefix}dropdown-spacer); - } - - @if $dropdown-padding-y == 0 { - > .dropdown-item:first-child, - > li:first-child .dropdown-item { - @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - > .dropdown-item:last-child, - > li:last-child .dropdown-item { - @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius)); - } - - } -} - -// scss-docs-start responsive-breakpoints -// We deliberately hardcode the `bs-` prefix because we check -// this custom property in JS to determine Popper's positioning - -@each $breakpoint in map-keys($grid-breakpoints) { - @include media-breakpoint-up($breakpoint) { - $infix: breakpoint-infix($breakpoint, $grid-breakpoints); - - .dropdown-menu#{$infix}-start { - --bs-position: start; - - &[data-bs-popper] { - right: auto; - left: 0; - } - } - - .dropdown-menu#{$infix}-end { - --bs-position: end; - - &[data-bs-popper] { - right: 0; - left: auto; - } - } - } -} -// scss-docs-end responsive-breakpoints - -// Allow for dropdowns to go bottom up (aka, dropup-menu) -// Just add .dropup after the standard .dropdown class and you're set. -.dropup { - .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(up); - } -} - -.dropend { - .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(end); - &::after { - vertical-align: 0; - } - } -} - -.dropstart { - .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: var(--#{$prefix}dropdown-spacer); - } - - .dropdown-toggle { - @include caret(start); - &::before { - vertical-align: 0; - } - } -} - - -// Dividers (basically an `
      `) within the dropdown -.dropdown-divider { - height: 0; - margin: var(--#{$prefix}dropdown-divider-margin-y) 0; - overflow: hidden; - border-top: 1px solid var(--#{$prefix}dropdown-divider-bg); - opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
      element -} - -// Links, buttons, and more within the dropdown menu -// -// `
      ` alignment by inheriting `text-align`. -// 3. Fix alignment for Safari - -th { - font-weight: $table-th-font-weight; // 1 - text-align: inherit; // 2 - text-align: -webkit-match-parent; // 3 -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - - -// Forms -// -// 1. Allow labels to use `margin` for spacing. - -label { - display: inline-block; // 1 -} - -// Remove the default `border-radius` that macOS Chrome adds. -// See https://github.com/twbs/bootstrap/issues/24093 - -button { - // stylelint-disable-next-line property-disallowed-list - border-radius: 0; -} - -// Explicitly remove focus outline in Chromium when it shouldn't be -// visible (e.g. as result of mouse click or touch tap). It already -// should be doing this automatically, but seems to currently be -// confused and applies its very visible two-tone outline anyway. - -button:focus:not(:focus-visible) { - outline: 0; -} - -// 1. Remove the margin in Firefox and Safari - -input, -button, -select, -optgroup, -textarea { - margin: 0; // 1 - font-family: inherit; - @include font-size(inherit); - line-height: inherit; -} - -// Remove the inheritance of text transform in Firefox -button, -select { - text-transform: none; -} -// Set the cursor for non-`